From 751bf928cccfc8716adf9ae5f372a069c4126e29 Mon Sep 17 00:00:00 2001 From: JSArcus <125735344+sossinayDev@users.noreply.github.com> Date: Wed, 6 Aug 2025 00:03:32 +0200 Subject: [PATCH 1/9] Add Flux watchface app Initial commit of the Flux watchface app, including main application logic, icon, screenshots, metadata, and settings menu. The app features a customizable clock face inspired by Apple's Flux, with color themes and random number alignment. --- apps/flux/README.md | 30 ++++ apps/flux/app-icon.js | 1 + apps/flux/app.js | 329 +++++++++++++++++++++++++++++++++++++ apps/flux/app.png | Bin 0 -> 2509 bytes apps/flux/metadata.json | 37 +++++ apps/flux/screenshot_1.png | Bin 0 -> 3317 bytes apps/flux/screenshot_2.png | Bin 0 -> 2239 bytes apps/flux/settings.js | 76 +++++++++ 8 files changed, 473 insertions(+) create mode 100644 apps/flux/README.md create mode 100644 apps/flux/app-icon.js create mode 100644 apps/flux/app.js create mode 100644 apps/flux/app.png create mode 100644 apps/flux/metadata.json create mode 100644 apps/flux/screenshot_1.png create mode 100644 apps/flux/screenshot_2.png create mode 100644 apps/flux/settings.js diff --git a/apps/flux/README.md b/apps/flux/README.md new file mode 100644 index 0000000000..db10f31108 --- /dev/null +++ b/apps/flux/README.md @@ -0,0 +1,30 @@ +# Flux Watchface + +This app slightly resembles Apples "Flux" watchface. + +## Usage + +Install it and set it as your default clock. +It has no widgets. +You can change the colors in the settings. + +## Features + +- Customizeable themes (4 color inputs) +- Random number alignment (every minute or on reload) +- 24h clock (12h not yet supported) +- Color filling effect in 4 directions +- 12 different colors + +## Controls + +BTN to go to launcher. No other functions. + +## Requests + +If you have a feature request or a bug, please message me at [sossinaydev@gmail.com](mailto:sossinaydev@gmail.com "Click to send an email"). + +## Creator + +Yanis Ocaña, sossinay +[pixelnet.ocaña.ch](https://pixelnet.ocaña.ch) \ No newline at end of file diff --git a/apps/flux/app-icon.js b/apps/flux/app-icon.js new file mode 100644 index 0000000000..61305a20a0 --- /dev/null +++ b/apps/flux/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("2GwwcBps06YC+tOmzQC+Qf6D/Qf6DvsEAACMaQdlAIKUTQf6D/Qf6DrFQdNmA/SAAaDkFAdp0BBWkyD/Qf6D/Qf6D0gYaOQeMCDRyD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D2AQiD8AQiD/Qf6D/Qf6D/Qf6D/QdVMBIYAcQb9oIMBoBQf6D/Qf6DiH8AADQbhBkQf6D/Qf6D/QdBcOARqDkLhwCNQf6D/Qf6D/Qf6D/Qf6D/QdwFDAH0B/4ACEEMPAgX4DJwYDwBB/IP5B/IP5B0ACZB/IP5B/IP5B/IOYABj4/S4AgLIP5B/IP5B/INAg/EH4g/EH4gHj4HDAB3AIP5B/IP5B/IOUPH6QADwBB/IP5B/IP5B/IO34DJxB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IJoATIP5B/IP5B/IP5BzAAMfIP5B/IP5B/IP4gaIP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IM4AgIP5B/IP5B/IP5BlAAMDH8AmEADRB/IP5B/IP4A/AH4A/AH4A/ABw")) \ No newline at end of file diff --git a/apps/flux/app.js b/apps/flux/app.js new file mode 100644 index 0000000000..848d994f21 --- /dev/null +++ b/apps/flux/app.js @@ -0,0 +1,329 @@ +const font = { + "0": [ + [[0,0],[1,0]], + [[1,0],[1,1]], + [[1,1],[0,1]], + [[0,1],[0,0]] + ], + + "1": [ + [[1,0],[1,1]] + ], + + "2": [ + [[0,0],[1,0]], + [[1,0],[1,0.5]], + [[1,0.5],[0,0.5]], + [[0,0.5],[0,1]], + [[0,1],[1,1]] + ], + + "3": [ + [[0,0],[1,0]], + [[1,0],[1,1]], + [[0,0.5],[1,0.5]], + [[0,1],[1,1]] + ], + + "4": [ + [[0,0],[0,0.5]], + [[1,0],[1,1]], + [[0,0.5],[1,0.5]] + ], + + "5": [ + [[1,0],[0,0]], + [[0,0],[0,0.5]], + [[0,0.5],[1,0.5]], + [[1,0.5],[1,1]], + [[1,1],[0,1]] + ], + + "6": [ + [[1,0],[0,0]], + [[0,0],[0,1]], + [[0,1],[1,1]], + [[1,1],[1,0.5]], + [[1,0.5],[0,0.5]] + ], + + "7": [ + [[0,0],[1,0]], + [[1,0],[1,1]] + ], + + "8": [ + [[0,0],[1,0]], + [[1,0],[1,1]], + [[1,1],[0,1]], + [[0,1],[0,0]], + [[0,0.5],[1,0.5]] + ], + + "9": [ + [[0,0],[1,0]], + [[0,0],[0,0.5]], + [[0,0.5],[1,0.5]], + [[1,0],[1,1]] + ], + + "NaN": [ + [[],[]] + ] +}; + +const corner_base_positions = [ + [[10, 10], [78, 78]], // top-left (unchanged) + [[93, 10], [165, 78]], // top-right (x + 5) + [[10, 93], [78, 165]], // bottom-left (y + 5) + [[93, 93], [165, 165]] // bottom-right (x + 5, y + 5) +]; + +let corner_positions = []; +let previous_corner_positions = []; + +const padding = 10; +const width = 175; +const height = 175; + +const colors = { + "Black": [0,0,0], + "White": [1,1,1], + "Red": [1,0,0], + "Blue": [0,0,1], + "Green": [0,1,0], + "Yellow": [1,1,0], + "Orange": [1,0.6,0], + "Purple": [0.7,0,1], + "Lime": [0,1,0.5], + "Cyan": [0, 1, 1], + "Light Blue": [0,0.5,1], + "Pink": [1,0.5,1] +}; + + +const color_schemes = { + "Lime": [[0,0,0],[1,1,1],[0,1,0.5],[0,1,0.5]], + "Red": [[0,0,0],[1,1,1],[0,1,0.5],[0,1,0.5]] +}; + +let bg_color = [0,0,0]; +let fg_color = [1,1,1]; +let bg_color_topo = [1,0,0.5]; +let fg_color_topo = [0,1,0.5]; + +function load_color_scheme(color_scheme) { + bg_color = color_scheme[0]; + fg_color = color_scheme[1]; + bg_color_topo = color_scheme[2]; + fg_color_topo = color_scheme[3]; +} + +function randomize_numbers(){ + previous_corner_positions = JSON.parse(JSON.stringify(corner_positions)); + corner_positions = JSON.parse(JSON.stringify(corner_base_positions)); + + if (!previous_corner_positions || previous_corner_positions.length === 0) { + previous_corner_positions = JSON.parse(JSON.stringify(corner_positions)); + } + + // Your offsets and modifications follow here as before + let x_offset = Math.floor(Math.random() * 61) - 30; + let left_y_offset = Math.floor(Math.random() * 61) - 30; + let right_y_offset = Math.floor(Math.random() * 61) - 30; + + [0,1,2,3].forEach(function(i) { + let min_x = corner_positions[i][0][0]; + let min_y = corner_positions[i][0][1]; + let max_x = corner_positions[i][1][0]; + let max_y = corner_positions[i][1][1]; + + if (min_x !== padding) { + min_x += x_offset; + } + if (max_x !== width - padding) { + max_x += x_offset; + } + + let yoff = (i % 2) > 0 ? right_y_offset : left_y_offset; + + if (min_y !== padding) { + min_y += yoff; + } + if (max_y !== height - padding) { + max_y += yoff; + } + + // Update corner_positions with new offsets + corner_positions[i][0][0] = min_x; + corner_positions[i][0][1] = max_x; + corner_positions[i][1][0] = min_y; + corner_positions[i][1][1] = max_y; + }); +} + +function drawThickLine(x1, y1, x2, y2, width, topoY) { + let half = Math.floor(width / 2); + + // Expand to thickness by offsetting both ends + if (x1 === x2) { + // Vertical line + x1 -= half; + x2 += half; + } else if (y1 === y2) { + // Horizontal line + y1 -= half; + y2 += half; + } else { + // Diagonal fallback + for (let i = -half; i <= half; i++) { + g.drawLine(x1 + i, y1, x2 + i, y2); + } + return; + } + + // Order the coordinates for fillRect + let left = Math.min(x1, x2); + let right = Math.max(x1, x2); + let top = Math.min(y1, y2); + let bottom = Math.max(y1, y2); + + // Split based on topoY (topographic height) + if (top < topoY && bottom > topoY) { + // Split into two regions + g.setColor(fg_color_topo[0], fg_color_topo[1], fg_color_topo[2]); + g.fillRect(left, top, right, topoY); + + g.setColor(fg_color[0], fg_color[1], fg_color[2]); + g.fillRect(left, topoY + 1, right, bottom); + } else if (bottom <= topoY) { + // Entire line is above topo + g.setColor(fg_color_topo[0], fg_color_topo[1], fg_color_topo[2]); + g.fillRect(left, top, right, bottom); + } else { + // Entire line is below topo + g.setColor(fg_color[0], fg_color[1], fg_color[2]); + g.fillRect(left, top, right, bottom); + } +} + + + + +function draw_numbers(transition_value, topo_position){ + //console.log(previous_corner_positions); + topo_position *= height; + let d = new Date(); + + let hour = d.getHours(); + let padded = ("0" + hour).slice(-2); + + let tl = padded[0]; + let tr = padded[1]; + + let min = d.getMinutes(); + padded = ("0" + min).slice(-2); + + + let bl = padded[0]; + let br = padded[1]; + + g.clear(); + g.setColor(bg_color_topo[0],bg_color_topo[1],bg_color_topo[2]); + g.fillRect(0,0,width,topo_position); + g.setColor(bg_color[0],bg_color[1],bg_color[2]); + g.fillRect(0,topo_position,width,height); + + [tl,tr,bl,br].forEach(function(corner, i) { + let path = font[corner]; + path.forEach(function(line){ + let pcp = previous_corner_positions[i].slice(); + let ccp = corner_positions[i].slice(); + + let x1 = (ccp[0][0] - pcp[0][0]) * transition_value + pcp[0][0]; + let x2 = (ccp[0][1] - pcp[0][1]) * transition_value + pcp[0][1]; + let y1 = (ccp[1][0] - pcp[1][0]) * transition_value + pcp[1][0]; + let y2 = (ccp[1][1] - pcp[1][1]) * transition_value + pcp[1][1]; + + + + let point_1 = [line[0][0]*(x2-x1) + x1, line[0][1]*(y2-y1) + y1]; + let point_2 = [line[1][0]*(x2-x1) + x1, line[1][1]*(y2-y1) + y1]; + + drawThickLine(point_1[0], point_1[1], point_2[0], point_2[1], 10, topo_position); + }); + }); +} + +let powersaver = false; +let update_timeout = null; + +let prev_min = -1; +function update_clock() { + let d = new Date(); + let min = d.getMinutes(); + + if (min != prev_min) { + randomize_numbers(); + prev_min = min; + } + + if (powersaver) { + if (direction == 1) { + draw_numbers(1, 2); + } + else if (direction == 0) { + draw_numbers(1, 0); + } + update_timeout = setTimeout(update_clock, 5000); + } + else { + let seconds = d.getSeconds() + d.getMilliseconds() / 1000; + if (direction == 1) { + draw_numbers(Math.min(seconds, 1) / 1, 1.00-(seconds/60)); + } + else if (direction == 0) { + draw_numbers(Math.min(seconds, 1) / 1, seconds / 60); + } + if (seconds < 1.5) { + update_timeout = setTimeout(update_clock, 50); + } else { + update_timeout = setTimeout(update_clock, 1000); + } + } +} + +let settings = require("Storage").readJSON("flux.settings.json", 1) || {}; +console.log(settings); +let direction = settings.direction || 0; +bg_color = colors[settings.bg || "Black"]; +fg_color = colors[settings.fg || "White"]; +bg_color_topo = colors[settings.bg2 || "Green"]; +fg_color_topo = colors[settings.fg2 || "Black"]; +if (direction == 1) { + let temp = bg_color; + bg_color = bg_color_topo; + bg_color_topo = temp; + + temp = fg_color; + fg_color = fg_color_topo; + fg_color_topo = temp; +} + + +update_clock(); + +Bangle.on('backlight', function(isOn) { + if (isOn) { + powersaver = false; + clearTimeout(update_timeout); + update_clock(); + } else { + powersaver = true; + let d = new Date(); + let seconds = d.getSeconds() + d.getMilliseconds() / 1000; + draw_numbers(Math.min(seconds, 1) / 1, 0); + } +}); + +Bangle.setUI("clock"); diff --git a/apps/flux/app.png b/apps/flux/app.png new file mode 100644 index 0000000000000000000000000000000000000000..6821f409d6e9610d8d9e1009792547f9a5e8b6ed GIT binary patch literal 2509 zcmbtWc~p|=8V7>J^=gPl<(8AXl@jhoS!o*Lu0@7g3SlKWW|5^rQ&(+La!U=hoJ@1H zFm;rs($BO^Gs$qFRmv?=lw1l|=CheI=iJUc_uPB#AK&+$=Y4jROOtJH1>2pU~E6i0b=v%u&aZW zbeI=xL4fB2MXZs~PdBYua;oCG1-rT#jrI1#x4O0{Ss}_!7BklCmcotC8t9fRL8}@w z?l`kjXq)el!km?qg>1#6u;hlBfV#FeiVcg?+0wElZ?93b+rhXqLhqNxtV=+Wt4k(KA(gDBi>Du2Oxl5Vz4!3?0xt z@kUY)>@OS^n2vp$J`x9JV3h3(;hYCICWMuS31N7n=;U&cE;+I^y$`hhT{ZaBwGxw% zuUR~T$)#sw#xaSj`ih=N(?4K%1L@ldKcx5Ohut#%N7+qEj4r}kx{}jB5U~$#u_?402+1$pDY&j`G(70jD zXm-)3Kyl13Mex=Ydr}L5AzB`IaRoIPt_ zwr#NE%4Y*>G9o+Q6FQ%YSLhtewx6%O@B`&>@)HI|Xcn3bc7XcICZpwC>Wn-=t>C38 z_3Q_aBdLEP==lI9<2L*Wx^GUYSaBUgDMLei!8@4tjN5vFz{>-Iew_2{i-h6RoEhxs z1t^BCXEcps4e`K)L%fPz6d}{Avk+~H(v3s(P!L*H~=yxW^@n-Rb_}FAD>t~eR zr1ZfDR6))5{C!@-&i@4G>FW4vs*!ZcJR=<2KW@7O#_W_6F;;0n(ql)1v1I&tsY-#| zQGIz{hVyEaPk^d_6J`dUH!8PxIDvApGyGyETozcsXo$TUC|)wn^*B}?9Ez?P$$d4j zFB4lvkJK!0fbuTc^qss%cC_;q!j^6VXtW(%_IdWO#g|zA*frrLdJ?)Tx4Xz^?<+RM zmghk*{7vr8%3e>JL5s5dnIp&dlXpS3k_eRhL(eo-S1(>T>t%33MRr7} z60Ko~9l+H(;vz~W*enFYgB+L*-FPsZ;#4=8(38=CU|iMfr?f+~t*o(Rzo%lFVS;ir zsTYU9h}OGO9`6@yUo-(xym!gX7;9ix+R?}x2_!zCs)dv~bRigpm)~c=?JRnvE>K;M z+9ep2TviU@3ap)8L^81h=e1v+37a0<1gN@3Fn?a1kKq=-EjKkxnAbe$K_dTEN5h=6 z;m$cNku!NAZ^Me> z2{aJRfmm0hv>@tf1)M?jg%$~poyvjm-OYg5-z~YTME33o2C;r90On*|4&jUI?ni0^ zU2Z;4*Ai5A*GjEOE+2DpSAi{S*9}bDHUIgZdPTwRi#x!crf!J3m;J>McwHG!-1&d@ zc#H472GrK|5;x{u1+hj7t;FWRb5#VWkawY(ZYlk{v_vZ*;_Q|!zI*x(_;`U|AoF0% zMfd+DX+!FiXYdM2oL^>lTX%2Vb8L0L!g$wWYb6G`cx$li49o&B_6d!`{HYq$e_{$Q zy8bBq@&0!mkD&<0bzzcc4s_!r=TZJ=;`*j;YdFKBZe|xo1Q)g*9#uSNs3a|58vQH% zJ(0}ZP0<5Pf91xGnyyN2`AwSYo{gN$NCP0EcVX*h+^w*-2tQv-IIm+3G<~-@ppip7 zp^B4)ORf!hTM|NlkOy1gjz#sx2Ks=Qrl3etbLP|15)v{xA6LXOe4!M*^G4Qz9iEQ+ z91q+3E2CDo;e!aC9L`KZfWI;{N}6+}w`#E3v|I}oOi81PQfguAe8k~>-U4E;8cD6^ zA>4J6kMRiicc#n_J%?? hYW5Y6es9VY7ONNG^B3>Y!2dId`!3?n+b*GJ{{Rnww%q^# literal 0 HcmV?d00001 diff --git a/apps/flux/metadata.json b/apps/flux/metadata.json new file mode 100644 index 0000000000..f3cccc396a --- /dev/null +++ b/apps/flux/metadata.json @@ -0,0 +1,37 @@ +{ + "id": "flux", + "name": "Flux Watchface", + "shortName": "Flux", + "version": "0.01", + "description": "A really simple imitation of Apples \"Flux\" Watchface, with different colors.", + "icon": "app.png", + "tags": "clock", + "type": "clock", + "supports": [ + "BANGLEJS2" + ], + "screenshots": [ + { + "url": "screenshot_1.png" + }, + { + "url": "screenshot_2.png" + } + ], + "readme": "README.md", + "storage": [ + { + "name": "flux.app.js", + "url": "app.js" + }, + { + "name": "settings.js", + "url": "flux.settings.js" + }, + { + "name": "flux.img", + "url": "app-icon.js", + "evaluate": true + } + ] +} \ No newline at end of file diff --git a/apps/flux/screenshot_1.png b/apps/flux/screenshot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c58d27b1145e9c7803165dd5336b26d50be1e9af GIT binary patch literal 3317 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 literal 0 HcmV?d00001 diff --git a/apps/flux/settings.js b/apps/flux/settings.js new file mode 100644 index 0000000000..180f520a8f --- /dev/null +++ b/apps/flux/settings.js @@ -0,0 +1,76 @@ +(function(back) { + const FILE = "flex.settings.json"; + + // Load existing settings with defaults + let settings = Object.assign({ + "24hour": false, + bg: "Black", + fg: "White", + bg2: "Lime", + fg2: "Black" + }, require("Storage").readJSON(FILE, true) || {}); + + function writeSettings() { + require("Storage").writeJSON(FILE, settings); + } + + E.showMenu({ + "": { title: "Flex Watchface" }, + "< Back": back, + "24 Hour Time": { + value: !!settings["24hour"], + onchange: v => { + settings["24hour"] = v; + writeSettings(); + } + }, + "BG Color": { + value: colorIndex(settings.bg), + min: 0, max: COLORS.length - 1, + format: i => COLORS[i], + onchange: i => { + settings.bg = COLORS[i]; + writeSettings(); + } + }, + "FG Color": { + value: colorIndex(settings.fg), + min: 0, max: COLORS.length - 1, + format: i => COLORS[i], + onchange: i => { + settings.fg = COLORS[i]; + writeSettings(); + } + }, + "BG Highlight": { + value: colorIndex(settings.bg2), + min: 0, max: COLORS.length - 1, + format: i => COLORS[i], + onchange: i => { + settings.bg2 = COLORS[i]; + writeSettings(); + } + }, + "FG Highlight": { + value: colorIndex(settings.fg2), + min: 0, max: COLORS.length - 1, + format: i => COLORS[i], + onchange: i => { + settings.fg2 = COLORS[i]; + writeSettings(); + } + }, + }); + + // Color list shared across fields + const COLORS = [ + "White", "Black", "Red", "Blue", "Green", + "Yellow", "Orange", "Purple", "Lime", + "Cyan", "Pink", "Light Blue" + ]; + + function colorIndex(name) { + let i = COLORS.indexOf(name); + return i >= 0 ? i : 0; + } +}); From 5d1c95e1f6190eaa401587028161ee9f3d18f1ed Mon Sep 17 00:00:00 2001 From: JSArcus <125735344+sossinayDev@users.noreply.github.com> Date: Wed, 6 Aug 2025 00:06:12 +0200 Subject: [PATCH 2/9] Fix swapped names and URLs in metadata.json Corrected the 'name' and 'url' fields for settings.js and flux.settings.js in apps/flux/metadata.json to ensure proper mapping. --- apps/flux/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/flux/metadata.json b/apps/flux/metadata.json index f3cccc396a..bb97945f47 100644 --- a/apps/flux/metadata.json +++ b/apps/flux/metadata.json @@ -25,8 +25,8 @@ "url": "app.js" }, { - "name": "settings.js", - "url": "flux.settings.js" + "name": "flux.settings.js", + "url": "settings.js" }, { "name": "flux.img", From bb2de1a41489de0ca9944fc47d7e13a7ee23a653 Mon Sep 17 00:00:00 2001 From: JSArcus <125735344+sossinayDev@users.noreply.github.com> Date: Wed, 6 Aug 2025 00:12:30 +0200 Subject: [PATCH 3/9] Update Flux app icon Replaces the existing app.png icon for the Flux application with a properly sized 48x48 pixel image. --- apps/flux/app.png | Bin 2509 -> 1309 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/flux/app.png b/apps/flux/app.png index 6821f409d6e9610d8d9e1009792547f9a5e8b6ed..0c71b10ca4435ae2a3969b440a7345a10bf8212f 100644 GIT binary patch literal 1309 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 From ed9fbd51e85555367c57f024ffc308132b6da7a5 Mon Sep 17 00:00:00 2001 From: JSArcus <125735344+sossinayDev@users.noreply.github.com> Date: Wed, 6 Aug 2025 00:17:40 +0200 Subject: [PATCH 4/9] Update Flux app icon Replaces the existing app-icon.js for the Flux application with a properly sized 48x48 pixel image. --- apps/flux/app-icon.js | 2 +- apps/flux/app.png | Bin 1309 -> 2509 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/flux/app-icon.js b/apps/flux/app-icon.js index 61305a20a0..c52f0f9be6 100644 --- a/apps/flux/app-icon.js +++ b/apps/flux/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("2GwwcBps06YC+tOmzQC+Qf6D/Qf6DvsEAACMaQdlAIKUTQf6D/Qf6DrFQdNmA/SAAaDkFAdp0BBWkyD/Qf6D/Qf6D0gYaOQeMCDRyD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D2AQiD8AQiD/Qf6D/Qf6D/Qf6D/QdVMBIYAcQb9oIMBoBQf6D/Qf6DiH8AADQbhBkQf6D/Qf6D/QdBcOARqDkLhwCNQf6D/Qf6D/Qf6D/Qf6D/QdwFDAH0B/4ACEEMPAgX4DJwYDwBB/IP5B/IP5B0ACZB/IP5B/IP5B/IOYABj4/S4AgLIP5B/IP5B/INAg/EH4g/EH4gHj4HDAB3AIP5B/IP5B/IOUPH6QADwBB/IP5B/IP5B/IO34DJxB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IJoATIP5B/IP5B/IP5BzAAMfIP5B/IP5B/IP4gaIP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IM4AgIP5B/IP5B/IP5BlAAMDH8AmEADRB/IP5B/IP4A/AH4A/AH4A/ABw")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwcBpMkyQCHzdt23bAQPTBYc0CIdN23QEwmaEA+TtMkyAREGRGSsEEJQsDpOkCJMJBAQRCEZRKBLIOgCJGTCIYICCJIjECK5ZFkwjcBwanDLMALCEbrjBCIdoCJE2XIO26dpX4W2CIRiBGpSSBEY1Nf4IAGCI9oCJBHHsARRghHGoARJMoQCDR4YICCINAgAjJhIICgECj/wIwwIBn4GDh/4CJPx/4AECJQjBCKEHCAf+BAQRIBCIjRCKBrR+O/8AGCv6PMUKIRjI6LFVCLwGELJYRabQIRPOYoACCI6SBCI+AFgwRSACA")) \ No newline at end of file diff --git a/apps/flux/app.png b/apps/flux/app.png index 0c71b10ca4435ae2a3969b440a7345a10bf8212f..6821f409d6e9610d8d9e1009792547f9a5e8b6ed 100644 GIT binary patch literal 2509 zcmbtWc~p|=8V7>J^=gPl<(8AXl@jhoS!o*Lu0@7g3SlKWW|5^rQ&(+La!U=hoJ@1H zFm;rs($BO^Gs$qFRmv?=lw1l|=CheI=iJUc_uPB#AK&+$=Y4jROOtJH1>2pU~E6i0b=v%u&aZW zbeI=xL4fB2MXZs~PdBYua;oCG1-rT#jrI1#x4O0{Ss}_!7BklCmcotC8t9fRL8}@w z?l`kjXq)el!km?qg>1#6u;hlBfV#FeiVcg?+0wElZ?93b+rhXqLhqNxtV=+Wt4k(KA(gDBi>Du2Oxl5Vz4!3?0xt z@kUY)>@OS^n2vp$J`x9JV3h3(;hYCICWMuS31N7n=;U&cE;+I^y$`hhT{ZaBwGxw% zuUR~T$)#sw#xaSj`ih=N(?4K%1L@ldKcx5Ohut#%N7+qEj4r}kx{}jB5U~$#u_?402+1$pDY&j`G(70jD zXm-)3Kyl13Mex=Ydr}L5AzB`IaRoIPt_ zwr#NE%4Y*>G9o+Q6FQ%YSLhtewx6%O@B`&>@)HI|Xcn3bc7XcICZpwC>Wn-=t>C38 z_3Q_aBdLEP==lI9<2L*Wx^GUYSaBUgDMLei!8@4tjN5vFz{>-Iew_2{i-h6RoEhxs z1t^BCXEcps4e`K)L%fPz6d}{Avk+~H(v3s(P!L*H~=yxW^@n-Rb_}FAD>t~eR zr1ZfDR6))5{C!@-&i@4G>FW4vs*!ZcJR=<2KW@7O#_W_6F;;0n(ql)1v1I&tsY-#| zQGIz{hVyEaPk^d_6J`dUH!8PxIDvApGyGyETozcsXo$TUC|)wn^*B}?9Ez?P$$d4j zFB4lvkJK!0fbuTc^qss%cC_;q!j^6VXtW(%_IdWO#g|zA*frrLdJ?)Tx4Xz^?<+RM zmghk*{7vr8%3e>JL5s5dnIp&dlXpS3k_eRhL(eo-S1(>T>t%33MRr7} z60Ko~9l+H(;vz~W*enFYgB+L*-FPsZ;#4=8(38=CU|iMfr?f+~t*o(Rzo%lFVS;ir zsTYU9h}OGO9`6@yUo-(xym!gX7;9ix+R?}x2_!zCs)dv~bRigpm)~c=?JRnvE>K;M z+9ep2TviU@3ap)8L^81h=e1v+37a0<1gN@3Fn?a1kKq=-EjKkxnAbe$K_dTEN5h=6 z;m$cNku!NAZ^Me> z2{aJRfmm0hv>@tf1)M?jg%$~poyvjm-OYg5-z~YTME33o2C;r90On*|4&jUI?ni0^ zU2Z;4*Ai5A*GjEOE+2DpSAi{S*9}bDHUIgZdPTwRi#x!crf!J3m;J>McwHG!-1&d@ zc#H472GrK|5;x{u1+hj7t;FWRb5#VWkawY(ZYlk{v_vZ*;_Q|!zI*x(_;`U|AoF0% zMfd+DX+!FiXYdM2oL^>lTX%2Vb8L0L!g$wWYb6G`cx$li49o&B_6d!`{HYq$e_{$Q zy8bBq@&0!mkD&<0bzzcc4s_!r=TZJ=;`*j;YdFKBZe|xo1Q)g*9#uSNs3a|58vQH% zJ(0}ZP0<5Pf91xGnyyN2`AwSYo{gN$NCP0EcVX*h+^w*-2tQv-IIm+3G<~-@ppip7 zp^B4)ORf!hTM|NlkOy1gjz#sx2Ks=Qrl3etbLP|15)v{xA6LXOe4!M*^G4Qz9iEQ+ z91q+3E2CDo;e!aC9L`KZfWI;{N}6+}w`#E3v|I}oOi81PQfguAe8k~>-U4E;8cD6^ zA>4J6kMRiicc#n_J%?? hYW5Y6es9VY7ONNG^B3>Y!2dId`!3?n+b*GJ{{Rnww%q^# literal 1309 zcmV+&1>*XNP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1hPp)K~!i%?V4R^ z990y6znM%nnPnG4TWQThl?aI_o0KlaLLPzK_;|HNvsr|erum)%-h~wg(VKswm(QA_KF37qacn+ zw_u}-s7K!lsdF&Mjn19laxtu3r89SOZFSWijnzM;x6A z7f})fK%VlA(x4uFwbbHAc_e1w;bsd|A%|N0Jg!2`rvX)H4Pwv2;TJ7= zejAk5yw_2MpY?F7kYk`qB0H)_FCYOUYq*4y9Q5&;JdeBTL|9$3^LzZeIL96=>dE1gC|`S=~#o= zA0hRL)lBw6E{+NseDpmW{}L8g;ZD(i`ELbo&cj>h;mS>4Z;}csd~+S<{;)KmcGwYw z?LNtlAhfl@Y6&h}g==>}^RM_Ri1$U=3rBVc#`<8{nbJDZTVecDIQOg7_P)@#DP-6K z}?#+y$%mIbWcK zw)`!^GnWBa8GM?h!+QY`*=$x63I$Op6hu58m!BTKi0pr8Xhkj_&CvM6it)UtP;~S z>F(}!{e(gxw@>79IpL5@CMzPZS7iSO4;~a#Q&Yk)3|F^V48w3|z`uG{CAzM2`t)fI z95~?Zs+!T!Q6?rPz}Ye7aygR8Bmk*YirLv&&yf09&wocp2ZMuyUeo)csw#7HbKJgt z+iH6a8bvS|q_3}U)3RsJ9>U>pnXiVffzi=X5e|n%DwT3|n`L5RLUeX^3YxJ7mY0`F zr_-E0d)C`kH8V3aoH}(1q!08>Gd6>Ffs zzrU)oRxO5M(ACxDRr^X=jy`DoUIPH4r>938J$kh4M1C_rKQ9uAgxIxfSH*=@E1jL4 zA{L8@SS%(Yk%$0<^9`FwB*OIcG^XkNV(uTRs Date: Wed, 6 Aug 2025 00:22:18 +0200 Subject: [PATCH 5/9] Update README with widget info and known issues Clarified widget support status, updated feature list, and added a 'Known issues' section to document current limitations and bugs. --- apps/flux/README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/flux/README.md b/apps/flux/README.md index db10f31108..97b3e4e6bd 100644 --- a/apps/flux/README.md +++ b/apps/flux/README.md @@ -5,7 +5,7 @@ This app slightly resembles Apples "Flux" watchface. ## Usage Install it and set it as your default clock. -It has no widgets. +It currently has no widget support. In the future, widgets will be a toggle in the settings. You can change the colors in the settings. ## Features @@ -13,12 +13,13 @@ You can change the colors in the settings. - Customizeable themes (4 color inputs) - Random number alignment (every minute or on reload) - 24h clock (12h not yet supported) -- Color filling effect in 4 directions +- Power-saving mode +- Color filling effect in 2 directions (`Left > Right` and `Right > Left` are currently unsupported.) - 12 different colors ## Controls -BTN to go to launcher. No other functions. +BTN to go to launcher. No other mappings. ## Requests @@ -27,4 +28,8 @@ If you have a feature request or a bug, please message me at [sossinaydev@gmail. ## Creator Yanis Ocaña, sossinay -[pixelnet.ocaña.ch](https://pixelnet.ocaña.ch) \ No newline at end of file +[pixelnet.ocaña.ch](https://pixelnet.ocaña.ch) + +## Known issues +- When loading the app in the first 2 seconds of a minute, the numbers fly in from a seemingly random position +- `Left > Right` and `Right > Left` are currently unsupported \ No newline at end of file From 5c2e29c2a5f2a975e74d4892574b1389d926dadb Mon Sep 17 00:00:00 2001 From: JSArcus <125735344+sossinayDev@users.noreply.github.com> Date: Wed, 6 Aug 2025 00:29:28 +0200 Subject: [PATCH 6/9] Add ChangeLog and update metadata for Flux app Added a ChangeLog file for the Flux app and updated metadata.json to include flux.settings.json. --- apps/flux/ChangeLog | 1 + apps/flux/metadata.json | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 apps/flux/ChangeLog diff --git a/apps/flux/ChangeLog b/apps/flux/ChangeLog new file mode 100644 index 0000000000..2286a7f70e --- /dev/null +++ b/apps/flux/ChangeLog @@ -0,0 +1 @@ +0.01: New App! \ No newline at end of file diff --git a/apps/flux/metadata.json b/apps/flux/metadata.json index bb97945f47..57925d20d8 100644 --- a/apps/flux/metadata.json +++ b/apps/flux/metadata.json @@ -33,5 +33,10 @@ "url": "app-icon.js", "evaluate": true } + ], + "data": [ + { + "name": "flux.settings.json" + } ] } \ No newline at end of file From 342e5a8b102ecd16bd98946cab9c998668719f58 Mon Sep 17 00:00:00 2001 From: sossinayDev <125735344+sossinayDev@users.noreply.github.com> Date: Wed, 6 Aug 2025 13:05:18 +0200 Subject: [PATCH 7/9] Fixed bugs in settings.js Moved list definitions and functions, added direction selector. --- apps/flux/settings.js | 45 +++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/apps/flux/settings.js b/apps/flux/settings.js index 180f520a8f..f99fed4d02 100644 --- a/apps/flux/settings.js +++ b/apps/flux/settings.js @@ -1,9 +1,26 @@ (function(back) { - const FILE = "flex.settings.json"; + const FILE = "flux.settings.json"; + + // Color list shared across fields + const COLORS = [ + "White", "Black", "Red", "Blue", "Green", + "Yellow", "Orange", "Purple", "Lime", + "Cyan", "Pink", "Light Blue" + ]; + + const directions = [ + "Up > Down", + "Down > Up" + ]; + + function colorIndex(name) { + let i = COLORS.indexOf(name); + return i >= 0 ? i : 0; + } // Load existing settings with defaults let settings = Object.assign({ - "24hour": false, + direction: 0, bg: "Black", fg: "White", bg2: "Lime", @@ -15,12 +32,14 @@ } E.showMenu({ - "": { title: "Flex Watchface" }, + "": { title: "Flux Watchface" }, "< Back": back, - "24 Hour Time": { - value: !!settings["24hour"], - onchange: v => { - settings["24hour"] = v; + "Direction": { + value: settings.direction, + min: 0, max: 1, + format: i => directions[i], + onchange: i => { + settings.direction = i; writeSettings(); } }, @@ -61,16 +80,4 @@ } }, }); - - // Color list shared across fields - const COLORS = [ - "White", "Black", "Red", "Blue", "Green", - "Yellow", "Orange", "Purple", "Lime", - "Cyan", "Pink", "Light Blue" - ]; - - function colorIndex(name) { - let i = COLORS.indexOf(name); - return i >= 0 ? i : 0; - } }); From 94696ad4d31864f6a378b0e9df56cc26ae8e7297 Mon Sep 17 00:00:00 2001 From: sossinayDev <125735344+sossinayDev@users.noreply.github.com> Date: Sun, 10 Aug 2025 14:02:32 +0200 Subject: [PATCH 8/9] Removed Semicolon Removed the Semicolon on the last line (for the sanitychecker). --- apps/flux/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/flux/settings.js b/apps/flux/settings.js index f99fed4d02..ec3cfd59ba 100644 --- a/apps/flux/settings.js +++ b/apps/flux/settings.js @@ -80,4 +80,4 @@ } }, }); -}); +}) From 346dcd12fbc80103c7056e94bfce1ed419b5f4e0 Mon Sep 17 00:00:00 2001 From: sossinayDev <125735344+sossinayDev@users.noreply.github.com> Date: Sun, 10 Aug 2025 14:16:15 +0200 Subject: [PATCH 9/9] Removed unused functions and variables Removed: - const color_schemes - function load_color_scheme() --- apps/flux/app.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/apps/flux/app.js b/apps/flux/app.js index 848d994f21..f0ee77dd4d 100644 --- a/apps/flux/app.js +++ b/apps/flux/app.js @@ -101,24 +101,11 @@ const colors = { "Pink": [1,0.5,1] }; - -const color_schemes = { - "Lime": [[0,0,0],[1,1,1],[0,1,0.5],[0,1,0.5]], - "Red": [[0,0,0],[1,1,1],[0,1,0.5],[0,1,0.5]] -}; - let bg_color = [0,0,0]; let fg_color = [1,1,1]; let bg_color_topo = [1,0,0.5]; let fg_color_topo = [0,1,0.5]; -function load_color_scheme(color_scheme) { - bg_color = color_scheme[0]; - fg_color = color_scheme[1]; - bg_color_topo = color_scheme[2]; - fg_color_topo = color_scheme[3]; -} - function randomize_numbers(){ previous_corner_positions = JSON.parse(JSON.stringify(corner_positions)); corner_positions = JSON.parse(JSON.stringify(corner_base_positions));