From 7114d646bc14dc422d239c41f80d6a9f63ba6d3a Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Mon, 5 Dec 2022 20:31:58 +0000 Subject: [PATCH 1/7] Prime Lato: changed to a prime icon --- apps/primetimelato/ChangeLog | 1 + apps/primetimelato/icon.js | 2 +- apps/primetimelato/metadata.json | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/primetimelato/ChangeLog b/apps/primetimelato/ChangeLog index 1be18255b..7781e93a1 100644 --- a/apps/primetimelato/ChangeLog +++ b/apps/primetimelato/ChangeLog @@ -1,3 +1,4 @@ 0.01: first release 0.02: added option to buzz on prime, with settings 0.03: added option to debug settings and test fw 2.15.93 load speed ups +0.04: changed icon diff --git a/apps/primetimelato/icon.js b/apps/primetimelato/icon.js index 06f93e2ef..7c8d5380b 100644 --- a/apps/primetimelato/icon.js +++ b/apps/primetimelato/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwIdah/wAof//4ECgYFB4AFBg4FB8AFBj/wh/4AoM/wEB/gFBvwCEBAU/AQP4gfAj8AgPwAoMPwED8AFBg/AAYIBDA4ngg4TB4EBApkPKgJSBJQIFTMgIFCJIIFDKoIFEvgFBGoMAnw7DP4IFEh+BAoItBg+DNIQwBMIaeCKoKxCPoIzCEgKVHUIqtFXIrFFaIrdFdIwAV")) +require("heatshrink").decompress(atob("mEw4X/AAIHB8cYttrJf4AR1gKJgdYBZMCBZdcBZMNsALKuALJhNABZMFwALJmvAAwkOqvAmtAkwSF83+uEV4EMOIpZBznWII5NB7mXGo5BB7Z0HkpBB6x0HFYXVNA4rC6pcFAANXDQhSFqgaEBZGYaBLfIaAUBBZUJNQ4jCm+cHZPcBZFXgdwzELBg1W/PAy/rBY3VPAOVTY863kAnaPHAH4A/ADAA==")) diff --git a/apps/primetimelato/metadata.json b/apps/primetimelato/metadata.json index dd200e5d3..400220b10 100644 --- a/apps/primetimelato/metadata.json +++ b/apps/primetimelato/metadata.json @@ -1,6 +1,6 @@ { "id": "primetimelato", - "name": "Prime Time Lato", - "version": "0.03", + "name": "Prime Lato", + "version": "0.04", "type": "clock", "description": "A clock that tells you the primes of the time in the Lato font", "icon": "app.png", From 22b97ac96298d4d8680624f377f6029e88aef799 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Mon, 5 Dec 2022 20:41:42 +0000 Subject: [PATCH 2/7] Prime Lato: changed to a prime icon --- apps/primetimelato/README.md | 2 +- apps/primetimelato/app.png | Bin 710 -> 1455 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/primetimelato/README.md b/apps/primetimelato/README.md index 924a6fae6..0ffd5a3fa 100644 --- a/apps/primetimelato/README.md +++ b/apps/primetimelato/README.md @@ -1,4 +1,4 @@ -# Prime Time Lato (clock) +# Prime Lato (clock) A watchface that displays time and its prime factors in the Lato font. For example when the time is 21:05, the prime factors are 5,421. diff --git a/apps/primetimelato/app.png b/apps/primetimelato/app.png index 2a84c62a07e71744a3721a4a7f8e3caa3721d71c..e5762b97cbfbc9ecfb0bf3c51c5c83947529359f 100644 GIT binary patch literal 1455 zcmV;g1yK5lP)Px)X-PyuRA@u(SZPR&q@sG*rwZs8B@N2Nw22BC;h zKhgv-C6^zHC{z-emQ)BWC>bf`R%EUSfq|mt9%`Hm?=Yh?-#70xLkjc!aeU{#_nz}C z=Xvg!tgf!EViTK*k-$HWo-qRdH~`r25%}`u3!I#suw%y#wZ7WW1bTaW5f&B(Yin!7 z#>V2>wQJbEeY*;g4Nc(ErAsI;FUQKtiU9ul^=o)}d2J2?Gcz;r_4UQ4PoD%}e}8|} z)zx9wu3ejhz{igtar*RW{P^($rlzLI$;m-hR+jjzY#TC#m@-vWRY*%q!`$2)9336; z>eVZ_ySuL|xI z=L{|;@~}d_J}6Kv{-BO9sx3y4jnoq8q<|4 zR}|V_U0tmfw8n&2^M&jb8W|ZuL_`F-y1HOyW`^9{T->~QQ{$Pbsj0Ys|31vk%|%f% zo%pw-qeCU#94p6CE8bij$z!nQ{tAz2MHBJ3?0VWwHpodGiK=fq@Ed78VwYXlPQ3g@pxN zxNt#8BG-6(dyCH;&h%xn2;}GIt9Xx*P*=PXxbg9E#Kgql?c2BFR#j0^A*5HICW`=D zI+a6N;{FQ^WtIfS#>U{_-~i6}E-o(m#4qnsf9%*XusP9KxZl2g(+KAG@87t7{ko!Q zu{*O1>)W)B02S!Kfdd#E926Kh9=v$*VjUi-9ymfU=Otse<%pnf)0)8Y@-p`A+b49K zcIwnAG&VM>#WOoQi<2i$;{E&gLT*VaI5-$DU%u2ge(h6;AXuNwxOMB6;vD{FbMfLu@juD1OLI+BRFs&1copQ7N&>tRN&>(r zG9sLhxNhwbD2IqF0`2YX@bU2h6^5SQy?Zyp!^4HfvuL}!yM=7B!SOrFD7*E~pFhPK zf+pDd`g*WV%F4=c=FAz5*F|lJ$RfZ(=FHDYlqMA@KXaVmSj{V-t*x#2o&`?=)PH5$ zxpSwe2NwF@nk)i5jN?H`NeP}me~yWX3E|QG`}Yf3O-xK&hlfhV`z^b&ot+(cUF1kj zMf<IZDlYK6plC9#C2_7H34NN*1f&$wCm3D!(usgB2N~)e zBLPEsR@;4z5zy9ChFWKgfT29A?Y_ncXzM9MtusczP@dIx-#_QO0-mUQetiG{002ov JPDHLkV1k&)$d>>B literal 710 zcmV;%0y+JOP)Px%fJsC_R9Hvtm^+TbFc5|(bXUD~@YEpQpp&!1vedHBEsjPT^cG zM;ybcdbe!c0b3UI$(&QzDXb~rLc)cF3yHL2;5Q1RAQ}#bY@%AN((!nFiCZidxfVfv zq8@m6zu)su!T0{Zv>2;NWb5I8d`y=R4S}elv5oT zp@7cHvoaD^fhBfzqXILTObFX76JR{ETrNp=IeN$>g@uvANx-k1=n7-f;;h%}JSysL zCJB~1XHvi?g~U6+dIzBR{eF)eohZ9Tz)=(9)udA$MNK+2bW#IGKE=$J^n=tSX-$t| zbzi6hOL`P&gasz8WR#?^Fjg3b;uemmED^O32&9AUmcGzol?iP_O(r z;Iv2Ke=3Yr)#-G?>I~TgUpu8*)7!rp1#1eQPN#>@ut-yCZq?hLLR$ewZGe(d77XNN zwYb;YpTZi~5=joEw%u;GwApOJ599iWa%m^o%Pg&_OR|)WrYo3fC#-~osWThTIba(q sW){O~!&=J{S%8WU7sF|*{dEfe0H(cp6H7fzivR!s07*qoM6N<$f*j~OtpET3 From b29a2c4d0b9d10b4d66c41a402c051236ecc2f68 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Tue, 6 Dec 2022 23:12:14 +0000 Subject: [PATCH 3/7] Added simplestpp, basic clock with fast load and clock_info support --- apps/simplestpp/README.md | 54 ++++++++++++++++ apps/simplestpp/app.js | 108 ++++++++++++++++++++++++++++++++ apps/simplestpp/app.png | Bin 0 -> 994 bytes apps/simplestpp/icon.js | 1 + apps/simplestpp/metadata.json | 16 +++++ apps/simplestpp/screenshot1.png | Bin 0 -> 2411 bytes apps/simplestpp/screenshot2.png | Bin 0 -> 2444 bytes apps/simplestpp/screenshot3.png | Bin 0 -> 2622 bytes 8 files changed, 179 insertions(+) create mode 100644 apps/simplestpp/README.md create mode 100644 apps/simplestpp/app.js create mode 100644 apps/simplestpp/app.png create mode 100644 apps/simplestpp/icon.js create mode 100644 apps/simplestpp/metadata.json create mode 100644 apps/simplestpp/screenshot1.png create mode 100644 apps/simplestpp/screenshot2.png create mode 100644 apps/simplestpp/screenshot3.png diff --git a/apps/simplestpp/README.md b/apps/simplestpp/README.md new file mode 100644 index 000000000..4b459bda1 --- /dev/null +++ b/apps/simplestpp/README.md @@ -0,0 +1,54 @@ +# Simplest++ Clock + +The simplest working clock, with fast load and clock_info + +![](screenshot1.png) +![](screenshot2.png) +![](screenshot3.png) + + +Simplest++ has 1 clock info menu that is displayed as a single line at the bottom of the screen. + +This provides a working demo of how to use the clock_info modules. + + +## Usage + +* When the screen is unlocked, tap at the bottom of the csreen on the information text. + It should change color showing it is selected. + +* Swipe up or down to cycle through the info screens that can be displayed + when you have finished tap again towards the centre of the screen to unselect. + +* Swipe left or right to change the type of info screens displayed (by default + there is only one type of data so this will have no effect) + +* Settings are saved automatically and reloaded along with the clock. + +## About Clock Info's + +* The clock info modules enable all clocks to add the display of information to the clock face. + +* The default clock_info module provides a display of battery %, Steps, Heart Rate and Altitude. + +* Installing the [Sunrise ClockInfo](https://banglejs.com/apps/?id=clkinfosunrise) adds Sunrise and Sunset times into the list of info's. + + +## References + +* [What is Fast Load and how does it work](http://www.espruino.com/Bangle.js+Fast+Load) + +* [Clock Info Tutorial](http://www.espruino.com/Bangle.js+Clock+Info) + +* [How to load modules through the IDE](https://github.com/espruino/BangleApps/blob/master/modules/README.md) + + +## With Thanks + +* Gordon for support +* David Peer for his work on BW Clock + + +Written by: [Hugh Barney](https://github.com/hughbarney) For support +and discussion please post in the [Bangle JS +Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/simplestpp/app.js b/apps/simplestpp/app.js new file mode 100644 index 000000000..c07fdbcbb --- /dev/null +++ b/apps/simplestpp/app.js @@ -0,0 +1,108 @@ +/** + * + * Simplestpp Clock + * + * The entire clock code is contained within the block below this + * supports 'fast load' + * + * To add support for clock_info_supprt we add the code marked at [1] and [2] + * + */ + +{ + // must be inside our own scope here so that when we are unloaded everything disappears + // we also define functions using 'let fn = function() {..}' for the same reason. function decls are global + + let draw = function() { + var date = new Date(); + var timeStr = require("locale").time(date,1); + var h = g.getHeight(); + var w = g.getWidth(); + + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + + g.setFont('Vector', w/3); + g.setFontAlign(0, 0); + g.setColor(g.theme.fg); + g.drawString(timeStr, w/2, h/2); + clockInfoMenu.redraw(); // clock_info_support + + // schedule a draw for the next minute + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); + }; + + /** + * clock_info_support + * this is the callback function that get invoked by clockInfoMenu.redraw(); + * + * We will display the image and text on the same line and centre the combined + * length of the image+text + * + * + */ + let clockInfoDraw = (itm, info, options) => { + + g.reset().setFont('Vector',24).setBgColor(options.bg).setColor(options.fg); + + //use info.text.toString(), steps does not have length defined + var text_w = g.stringWidth(info.text.toString()); + // gap between image and text + var gap = 10; + // width of the image and text combined + var w = gap + (info.img ? 24 :0) + text_w; + // different fg color if we tapped on the menu + if (options.focus) g.setColor(options.hl); + + // clear the whole info line + g.clearRect(0, options.y -1, g.getWidth(), options.y+24); + + // draw the image if we have one + if (info.img) { + // image start + var x = (g.getWidth() / 2) - (w/2); + g.drawImage(info.img, x, options.y); + // draw the text to the side of the image (left/centre alignment) + g.setFontAlign(-1,0).drawString(info.text, x + 23 + gap, options.y+12); + } else { + // text only option, not tested yet + g.setFontAlign(0,0).drawString(info.text, g.getWidth() / 2, options.y+12); + } + + }; + + // clock_info_support + // retrieve all the clock_info modules that are installed + let clockInfoItems = require("clock_info").load(); + + // clock_info_support + // setup the way we wish to interact with the menu + // the hl property defines the color the of the info when the menu is selected after tapping on it + let clockInfoMenu = require("clock_info").addInteractive(clockInfoItems, { x:64, y:132, w:50, h:40, draw : clockInfoDraw, bg : g.theme.bg, fg : g.theme.fg, hl : "#0ff"} ); + + // timeout used to update every minute + var drawTimeout; + g.clear(); + + // Show launcher when middle button pressed, add updown button handlers + Bangle.setUI({ + mode : "clock", + remove : function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + // remove info menu + clockInfoMenu.remove(); + delete clockInfoMenu; + } + }); + + // Load widgets + Bangle.loadWidgets(); + draw(); + setTimeout(Bangle.drawWidgets,0); +} // end of clock diff --git a/apps/simplestpp/app.png b/apps/simplestpp/app.png new file mode 100644 index 0000000000000000000000000000000000000000..814306471485b135eb105e2d63304b06565e4d7e GIT binary patch literal 994 zcmV<810DQ{P)D(Dg!Z*3O znLFp6^F8m~bKkk=at|HxP-=a{P$oUwaS#Wv2an<5RWjFc2^a7U&S4>w{Y_yM)A$N2 zXjj@TwD3!6tu$7ZS-~8RC0zqU6UXs;h0FrZ;0PXHhtO#H?`V=;tjzxnub|Oq?k4e5 z#qbw6v`NEFynxw?zIjY!VY&)KcnizP(06z$qy8!UkaREM4f*0z6Yp1)pTKY~h)N-0h3jV;ZY}D#w zhj{C4yx#5PNwF4}3})G^hp7sW+PhOzxmBL%k-)pD^@6t(mmk%PhvUkvve(__@6>uh zLy&Ld<&A_#m0#E#`+N=uV87sW1tXmVr8O@1X_*`&&z8I`Ja3J+x50F&1m`nY$ z#X!}8J*l4`7@h8MKJ~lT`twimnsT0wa>f8`6U+PR>OY3@j|h^S$n5|@ennb6#cuO} z$oOv5Q1Fg8+|#cCi?!I`D1kpBosR?op%=Yi0{YGPh{!CUY$j17qt6 zowIe*=@$jJ*-k>o>Iij#oDLKZ_edw9QBi1ZV{Zndxg2;}aJp=RBPCHKZi`ywRyow4 zPn=$=J7GRenCa1Yj;D(sx5Wvsxahu? z##YPBiri*1ZxH#eGRH(|@)=Pe+a)RoRa_M(sf!|?pOgO#o*fUSb`R^}U&vwyOs<=L Q@Bjb+07*qoM6N<$f{4=I_5c6? literal 0 HcmV?d00001 diff --git a/apps/simplestpp/icon.js b/apps/simplestpp/icon.js new file mode 100644 index 000000000..bec6c9752 --- /dev/null +++ b/apps/simplestpp/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///E8MBqtVoALHBQIABBQ0FqgDBitQCwwEIFoISEgoxEiodFFAQEGCQoiFEgsBLQwHDgplHD4UUCYwIDBZY6DBYgsCBZQGEAgwLXLwhvFqALmirvDXIQLPI9ibja677MBZZgELwhnHA4sBHgY6DCYatCAAcVAhASGEgoiEAANVAhASCDwUVIIwTBAARlHgIKBMgwAV")) diff --git a/apps/simplestpp/metadata.json b/apps/simplestpp/metadata.json new file mode 100644 index 000000000..10f756e32 --- /dev/null +++ b/apps/simplestpp/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "simplestpp", + "name": "Simplest++ Clock", + "version": "0.01", + "description": "The simplest working clock, with fast load and clock_info, acts as a tutorial piece", + "readme": "README.md", + "icon": "app.png", + "screenshots": [{"url":"screenshot3.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"simplestpp.app.js","url":"app.js"}, + {"name":"simplestpp.img","url":"icon.js","evaluate":true} + ] +} diff --git a/apps/simplestpp/screenshot1.png b/apps/simplestpp/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..94cb35cd604fd3648c679f135feb4df9101ee5d2 GIT binary patch literal 2411 zcmdT`dpOe#8=ha2ZK*~~4q?r_yzHx&P`3Ichmd30u#u9F$k1wtZI$wx-}AeEl`*IRM2;Ldy@9p~v>VEW0g>Z}S~lFJ z^Ye?DE6cIlMH?cmlUjFp&7GLw*wVFB@36kpdcb9*PWw;a!7O;+(9*rW{dvr>P?rEeeu7F}(#J9cGSB$9LBuXJJ%Jh`Wi<>v5 zUfV2Fp_D#sKDHSGJr3(B}}?q(eMgr0%U*%GXKv!DBwpA$n|@J=xJ z4d@jGpM#T`f1l!utOfa=O&V)CpPlPor=iCU9)x2T)`63at!oEtX)=falzI8H z@AYEL4ug|wVVc7mE;-i2c5SwN9}A#GPv#>vke zdC82%Me98s*PyjvN;+e>Ec=7bx}I6hDc(e$P2JhL^1rS6-^^~;+ycH9oY`)T7)#pC z@KKRgs`=I@?ezr^_wf#m>I(3NFr`y9aP)qc)L0V$ac*E+%NeA8RQAqgG8{ehWY^Vp zRU4`4Z!;AL{VH!F;toC$@;%*8Rj~;yW1wEE@)dustK~VPM6` z;d`bE@E+Box5+So`u|1v%2nFcoJoAIH_Yt36VX-rHewf@m8;le`f=>J%5L#g4t6f` zgC8L(#R!)up7ND%lerjSsga|!UR+JpRf@j6gQ5*iyb3qa#YaWxT7lt`>Marugwyce zG(yNIdg?wMhL6I04FzjiG{qi%&@cQNsH2dBv)Pwn)+WaGk;2{-vieE5DQ~mC{2cdX zXiMmT$*qByybhX5XmENy%K=G>+a-?9g3pPJ>~kNVrL%M<*D7duFkD+L&4j(vNvGR? zNkq-hwXka|D~-07CgBmZxK2)6+GH|>AhnJ-(Nr#}eteg`v+{i=ap9&?HO9$rG4-4W z)0Ob~Wq=D$j~mjyjTGyN8VYg^*VO>2lFTX0K<`U)e`%=aOv)l6{|76Bv<>*?bED%J zFE1+Ifu#pnC4BG*AXZ>jc(klTZaaKH662dJC!_>AC@Dbf80hLTx0ep58C6gY7Eh35olfZ$l+$2A{e zD=iPcIZ9dh2;f`Shk;=Ek)9JR7Dvh!5AMCixHS+ad{VsLUlJo#p48m#KxZuyR${J> zT8}M`Mej0PP-dB@J;(~FgK7s0P$Uy~4R9PY^&b)a87?v?d9V5WQ30twB8qy0ny*Un z4HVdmrVhXL10vp|g=r_3LIv7=1b4WP>QICyowfUA%mZ=7GeSm7eIC^D!px$iwhpjn z5K0;>-DUgn$6dSKSe#{Sm96p0gUGw|$K0#YqdPf+`c<|_(BAob&7gpcFg2?jcM5M~ zSHBJ>PI+Q(Kqx#jFw?6kb=Ush@-RDDk2jJ3Yw_ODQc}zLy5_7|rf|Zz*R4euEiG zY5=0#qp($O@X?0rfhYwy*~l|UZvF`Bk-gVofC=YuwLBOaDzNu#VW7Hm|B$Lp;OHRw z7&cL^F66=s;+95cJYNIWT7ydM3su)x8C#@8f5PFkzER&%Sg!aqXfB&^6?A4UA}<+?^AV2tj8>@_`@5BnFACd&qoxrR=)>;`yt4-;i$qqUvz= z(%JUD<=&to5*{3=?#mqlyA66!n1jl^&d!dwi<`T36vKMkO7e_u`v+GG>AmI)DkJ0H zqo02%Ak#|Pac=|V=luPYs{tpLOumagc#gM38^A`XH#Wvda{$3hZSFxAh9EUqiT{W3 zhizVY6S3>wdc|}6qV)OiDK;|})Zs4K%1O#-oYJ9Yt=NqNst>=uEAifZF`m=>^__cW zd3KuFw}-iFisZL;e}$(08hF+!oK;n>If`4-{}Su^lLi(oMen)NRm*_^dtUUupdwdw z!8je9-&yk}q5^y_or4Tfy~KywtkhUa(6VHim9n9dzX=to&`j@4a( z0hJGXEW|1{Qo2!2sGjROlx{CXX52bU0e5?QH1x--uU~ Ytg!jVig__2`S%2KvUjuN+Xi0w7v-!_{Qv*} literal 0 HcmV?d00001 diff --git a/apps/simplestpp/screenshot2.png b/apps/simplestpp/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..d24d55b029b7bbb2ba5f918188ab2df741526690 GIT binary patch literal 2444 zcmeHJ{X5eOAD&qm4vkt)Wtf-K(>2ReEDIY7qe5P1V&o-^@-j@`I^R>|UD75?JVJ#H z#WuCku5{{>jl7H^YbW89jb-JfH;;3j>-iU+>-pjN;d9?V+@Jft?(6f@r|_f~K}T!1 z76=5=@o;zX-Q&=LVchh(O4j%P5<=A* z^9h%q$cG1ARkoo=f(C^%?zl$bB=6^urIWG7TAV~=qrj3@n7kv?c69HSTsekmer!RR zBVfl%{cC10?W#rr3`IQp*0&7akG z!|xZ{N}=?(TK(I>_({8=WXXp=#W5s+%}=t5Elt`bzUxnL*}qF9N<`Y^#pzeg4U6h? zOvgoVdih+065kaqLEc-dm{UE-F{|&N7+9FtQ>9Q8oH^KxJwBpGb=_Q^pfr2-jVvqA zkoZ-F(ceN@7BMKRDk0->m*!{CT}CkHYB(j>*6VZlPB^X`Ds z1;$b;n0PS+ZR{~3)fi;WL&c$J)f#*mM)YJ*)a?j#-5RY{inuh?E}^?%lpi0pbC<=n<7A6t|1bVwmhcKJKHnU<2} z3MRf-&}W3Sc^tI}lPsV2m7Qo~+T~9Ht^K}eW6#l32O7o!p|orRVN01AiY^a+cJl9L zOB`$pVpLOp_N@fFR7G)_uU|)~Ct72`gb8bXqNk$eO&;jecSiytyp*E2F1_pr3B13$ z7$Qx6-X%J1HrudI7rEQ=J1Pd&j~(Wi?*s*ebcSro!}O;OVLLnkXJlFfOTAFAXW{cOL%^% z8Un*s9*WP~?j%cUJaPShS#+U%H%(HkUi+M@Mh-8Wy?sO`WVk@(-`oBW9?WNI0qRo{ zR7bjl{qhCRqcSG|on-9y@ICB`F1oEgk9T<=P1f^D0$GvwGDCA_ zufK=13H(Tq-eR0~RvCT2tcA9BC=c5uoOi3)vlla>F0yyi_f>&tX@rWWi!;H=l11OZ z-aakXbegGoSq2A=R7zj-FFUq^h}6vaek0pFAt9Ey%?W2O-UBvP(aT(kbz!qTVzjs# zeT&wE+`=`2XVU&415MMk_}U%Ry)`QdJ?zK_{}lK}m+kQiZ!eK1>xr+t8-r#WG{A#0 zaTC<4BH6p@$bSG?7IMUr8mqzpz(s8!tZRfle3uoJIb>y^dDr0*p$|W1%wc!;!%EVO1!-bvkGDBW+tTEio9YuAyyk_$IemipeTBr!AOv@K9fpXUky? zS_yPwr*?d<{+;hSyzxwLvMAHyY{l#rF8$~y3IvwHDf14r0(+0YkUV#mN$l{X9;gH9 zC=sOr5Es^>KAS3|bVAvN5HfqFQc^6e#H4ak{(Gh$YE~wS69F$xIGgVk$ivmkrR_-g GZ~q31IDNPP literal 0 HcmV?d00001 diff --git a/apps/simplestpp/screenshot3.png b/apps/simplestpp/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..af7ae7249bcc816643c766973237ca6472143124 GIT binary patch literal 2622 zcmdUx=|9wu7RUK!)R%OR2P930RsQ^Sjw!rgv89LXUg4;zNWwkQIZbN+Q3h)-mpkI=9pRktL^r;IsDys7{kC|GPo(-@T#ur*A zgP*Qb8B;Gn^mfCH8ueCXVYhZ*rhYi14sg#4m6n%Zb88@J;!B-z3LeABaOM6m)wnR+ z#*l}R%}@(f3ldYN_cmyIcg}?ejvZ1U+Q*k7E`~AQRg_=Hc1@rmP%0!98$D5 z#`&_m7!N4HKi~_k-xTTh{lfkMT1*@271sU&MKRsGTKeRlAPS(^Jxqxvoz6MxIumDS zpiQtUENboR5!E!B^@|YNRtS7}vNRpsLGROqwy)m|44@f#>8nVK4aBx9qqS0-uL!3gyK^98w~pWdTIfC2exL832&aO!dxmut&Gp$h?hOZ+*9KrO0*+q%lK+QIn_*MBM`{ z-f}L58nc0~=I|Qu|26iQbPY3Z-uLg>Pc)|ONlHew1G+xC1>(Si)CjuWLu2+H3-ft7 z2(XgR0pa!0x)O|37ayXO(Zqop(;1Zu_7|t}nn>_1-gcuoTcB~#-g1_X^!*|S)u}B< zyr(gr%dCEACh=hsQCOUMQ3X&*80gAF6v(D(0mYgY>0t&oA`Mq$juZ}?MBEoCUDgY# z2;x0nKpcqu0L_q{rMf4+)PHx$r5BDv^Npw`9u%6U>9s5V ziHL4XuGbKGcyi=fnOVl_mp(d?uGbd%CxpBMC&J@b1e!iaf9ytUSfO^#*_9xVJ)@9~ zS?64F+;6^>vWlgc7c;~amDahwpJ-~lV~espp{Y-D%Nk)yMi{FrwceFsjOdJV`Of=< zrpRPvZ+owRS34Y|1%o2TaZzvQ^{J8j7*6dbf(T5ywx-pkZ2h^CN`KzM=yIn<=3tT& z{@alkK#IbPg)>XTCmBC74(`{21-A0e{1F9UWltIh+SM_lVI{OrxGL`Sbk4ZwTM0n^ z)VZN{8uLmvw#wr*_l~#MIBrh$Re@&m<#NzsR1s$jcO0)=_<*HGJ;Iv9@V>l8NPg=S z!aF4kT<%J_+It@6CeMKGg3VFq+b7}cMTKf}@?2)4%*~bdDVMPW#vQiGWo2`FQw1nM z$`6r$PuZV;`Cv|Xu3y<)C^Q}C^jSu+UK3UOd!W7l=A|iLqGGl5<;`yn9@wRlKgRE_ z@nNzBP_;H+1~&Y+RkSk2KFC@8(77~R-edq7%5sd*9_~A+uJ$#uQl)C$#qfZ$)Aonn zCn#*MD4x4Y+b~IiAAfp*?c$=SB6)r*@^(nJb(#P6slT~kxy)+Eq4ixtm%vZ5U&o|4 zzp{3bcBBWus$W}Op;NFSV$N;!XdBAJG^J5VI`bOu>A)LG%e+3s1Id~E;dNc9Z9;sF z^T9OzRq*i?qJYcjFa?}>yDvObq>+vYA5)r=>Q62+wARJ5?u6kyse1T^9&2k`Npvco z#7%GA9g@>*0>C00pi@R8y)p)t@LnFVVw!VDPNTL(>3@10#yzNwi^oUw?!&Z86z*cSZHZu$IIV-d-#`<5!dZ)B_P$9{~x!hiJ1^ZCuYPwt|B#4Wc#q@(+)Dx6H=iu1t;Od9{YK9awY342hsnqn7~>fKl7JTty?^Bk{`D{Dxjx z5ZdBp3FQz(pu8oX>oZ9=HJz^2dUp|nD;b$EXk0XU-L-Lkm+=9yGXZ-Tn^nmcXo*0N|&%mcNW z$rX5JFG+;);AuAnjJskbwdQ6LN=??qmcJw++0a+~$uR zT;xV?OCT=4w5~re6LaFDyO(g!`Qk9D*HUHC2$st?c)}B{>aEF2zwdw>%Sz@hR=+#D zYSUhM4=n`|&zmuyE zCgM{47L^_kiNzQ=%2R=A`mZEf08yO&p4RsYtR(#P*uc&vsfX0xR9N#Djl;Afwmf)U mt3+UJSgN=~_5XTppA$@wb>`Tlh_fF;4pSp5! Date: Tue, 6 Dec 2022 23:19:28 +0000 Subject: [PATCH 4/7] Added simplestpp, updated icon --- apps/simplestpp/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/simplestpp/icon.js b/apps/simplestpp/icon.js index bec6c9752..92e0fa271 100644 --- a/apps/simplestpp/icon.js +++ b/apps/simplestpp/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4UA///E8MBqtVoALHBQIABBQ0FqgDBitQCwwEIFoISEgoxEiodFFAQEGCQoiFEgsBLQwHDgplHD4UUCYwIDBZY6DBYgsCBZQGEAgwLXLwhvFqALmirvDXIQLPI9ibja677MBZZgELwhnHA4sBHgY6DCYatCAAcVAhASGEgoiEAANVAhASCDwUVIIwTBAARlHgIKBMgwAV")) +require("heatshrink").decompress(atob("mEwwIROj/4Aof//4ECgfgg/AAoMPAQPwAQMcAQM4AQNwAQMOAQPgAQMHgEBDQUDwEBwAFBAYMDGQfAgwJCgFgAosMAocwAosYAocYApcwAocMAqUHO4PgAo4jWJqJrLQZaVFUIqtFXIrFGaIrdFdIr1FgEf/AFDABIA=")) From c5086ad9351d7f30ecc0302a6c6a3e917221d4bd Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Tue, 6 Dec 2022 23:28:06 +0000 Subject: [PATCH 5/7] Added simplestpp, updated icon --- apps/simplestpp/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/simplestpp/icon.js b/apps/simplestpp/icon.js index 92e0fa271..f8186ffce 100644 --- a/apps/simplestpp/icon.js +++ b/apps/simplestpp/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwIROj/4Aof//4ECgfgg/AAoMPAQPwAQMcAQM4AQNwAQMOAQPgAQMHgEBDQUDwEBwAFBAYMDGQfAgwJCgFgAosMAocwAosYAocYApcwAocMAqUHO4PgAo4jWJqJrLQZaVFUIqtFXIrFGaIrdFdIr1FgEf/AFDABIA=")) +require("heatshrink").decompress(atob("mEwwMB/4AW/ggDn/4Aocf+IQDx/zAofPArP+v4F+NgUfAo5N/U7QFDaIrdFdIr/PAA4=")) From 8f535ff067a3515dd410233868a8ef7095275092 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Tue, 6 Dec 2022 23:43:07 +0000 Subject: [PATCH 6/7] Added simplestpp, updated icon --- apps/simplestpp/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/simplestpp/icon.js b/apps/simplestpp/icon.js index f8186ffce..e4e40c82c 100644 --- a/apps/simplestpp/icon.js +++ b/apps/simplestpp/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB/4AW/ggDn/4Aocf+IQDx/zAofPArP+v4F+NgUfAo5N/U7QFDaIrdFdIr/PAA4=")) +require("heatshrink").decompress(atob("mEw4X/AAIHBqOM997IGkq1AKIltVqt4BQ0DBQIAB4ALFktVv/9qtYBYvVA4Ulq4KEgNVwAEBgVVoALDgtcAoc1qAFDitgAocJqguEGoowDgVWBYuVGoUBFwgwCHgUNGgUNuBCCAYY6CBYcJCYUlDYYLCgJxCmozCBYcCG4UVG4QLDgBgCBZeXBY/WBYcC1WtvWqGoILEVAIACJoILQgf/+tf/7jBBYg7JL66DLTZazLZZbjLfZcA6oLFq4EDio8CHQReCGgQwEmpCCHgVVFIUCVAQAD6plCkouEA4VVv/9qoPCAAcDZYa/BAAstBQN4BQwABlWoBRAAr")) From 55ca187d5dc91ee52d57aa42f5d6a07c5bb20b0a Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Thu, 8 Dec 2022 20:12:47 +0000 Subject: [PATCH 7/7] Lato version of Simplepp Clock --- apps/lato/README.md | 54 +++++++++++++++ apps/lato/app.js | 138 +++++++++++++++++++++++++++++++++++++ apps/lato/app.png | Bin 0 -> 1139 bytes apps/lato/icon.js | 1 + apps/lato/metadata.json | 16 +++++ apps/lato/screenshot1..png | Bin 0 -> 2666 bytes apps/lato/screenshot2.png | Bin 0 -> 2741 bytes apps/lato/screenshot3.png | Bin 0 -> 2723 bytes 8 files changed, 209 insertions(+) create mode 100644 apps/lato/README.md create mode 100644 apps/lato/app.js create mode 100644 apps/lato/app.png create mode 100644 apps/lato/icon.js create mode 100644 apps/lato/metadata.json create mode 100644 apps/lato/screenshot1..png create mode 100644 apps/lato/screenshot2.png create mode 100644 apps/lato/screenshot3.png diff --git a/apps/lato/README.md b/apps/lato/README.md new file mode 100644 index 000000000..556ee6fbc --- /dev/null +++ b/apps/lato/README.md @@ -0,0 +1,54 @@ +# Lato + +A simple clock with the Lato font, with fast load and clock_info + +![](screenshot1.png) +![](screenshot2.png) +![](screenshot3.png) + +This clock is a Lato version of Simplest++. Simplest++ provided the +smallest example of a clock that supports 'fast load' and 'clock +info'. Lato takes this one step further and adds the lovely Lato +font. The clock is derived from Simplest++ and inspired by the +Pastel Clock. + +## Usage + +* When the screen is unlocked, tap at the bottom of the csreen on the information text. + It should change color showing it is selected. + +* Swipe up or down to cycle through the info screens that can be displayed + when you have finished tap again towards the centre of the screen to unselect. + +* Swipe left or right to change the type of info screens displayed (by default + there is only one type of data so this will have no effect) + +* Settings are saved automatically and reloaded along with the clock. + +## About Clock Info's + +* The clock info modules enable all clocks to add the display of information to the clock face. + +* The default clock_info module provides a display of battery %, Steps, Heart Rate and Altitude. + +* Installing the [Sunrise ClockInfo](https://banglejs.com/apps/?id=clkinfosunrise) adds Sunrise and Sunset times into the list of info's. + + +## References + +* [What is Fast Load and how does it work](http://www.espruino.com/Bangle.js+Fast+Load) + +* [Clock Info Tutorial](http://www.espruino.com/Bangle.js+Clock+Info) + +* [How to load modules through the IDE](https://github.com/espruino/BangleApps/blob/master/modules/README.md) + + +## With Thanks + +* Gordon for support +* David Peer for his work on BW Clock + + +Written by: [Hugh Barney](https://github.com/hughbarney) For support +and discussion please post in the [Bangle JS +Forum](http://forum.espruino.com/microcosms/1424/) diff --git a/apps/lato/app.js b/apps/lato/app.js new file mode 100644 index 000000000..6045d7f17 --- /dev/null +++ b/apps/lato/app.js @@ -0,0 +1,138 @@ +/** + * + * Lato Clock + * + * The entire clock code is contained within the block below this + * supports 'fast load' + * + * To add support for clock_info_supprt we add the code marked at [1] and [2] + * + */ + +Graphics.prototype.setFontLato = function(scale) { + // Actual height 50 (54 - 5) + this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('ADkD8AHFg/wA4sP/AHVD44HHgPALD0OA40+F43+H4wHGn/8A4v/L4sH/5PFj//CxkD/6eFCw9/GooWHh//wAWLgP/TgoWHn5rFCw41BMYqCHaRDKGgzLYKAJgFv//LIhQBAAI7DWgIABU4adBAAJTDn4HCVAaOCQQhvDAYQuBDYaxBgJEDh4HBgYzDPgUDIYYECA5DUDgIHBg4HEEgIHfF44/EA45HDL4xvHP46PHT5CvHX47PDGYcDb4zvHf5AA/AA9wA4yoDZYq/DXAgHDXYQHEXYQHEj4HHXYQHDn6UCA4d/e4sAXYYHCd4gHCXwbADA86DFA/4HGAGA3Db40HA4UDe40Hc4YHCh7nDA4UfA4X/A4U/A4b/Cv7vGX4UB/A+CZ4YaCgf9A4sH+IHCHwfjA4JWDj/DA4s/wYHFv4kCA4f+A4pKBA4sD/AHCG4R9BA4YCBj/gA4s/4AECN4R5BA4f/gf/Mgn///+A4wZBA4d//6JBA4c/VATHEVASUEEwIHEAAbnDAGbyCAAg+DgKwDA4S4DLQSlCSYQHCn4HDFAV/bAX/4ADFCYgbCh4zHZ4SlBR4iSEA46XCe4QHCDgJWCngHOnwHGvwHRG4iFBI4ppBA4f4OIRnCN4MD9+AO4f///v8CHCDoP/54CBS4f/44CBU4f/wYHBX4f/EQLHDh6gB/6jDZQaTDAEUcA40/A4xODYoYHGgYHGh4HGNIIuG74uGz4uGj4uF/gHFh/4A4sf+AHFn/AA4q0BA4kBVgIHEFwIHFFwIHFj7jBA4guBA4rjCA4YuCA4guCA4r0BAATgBA75SEa4wHvAEEBA40DUYIAEg4HDgZ0Bh67BXAQHCZYJMBA4UHA4KPCA4SXEAgQHL4IEBgIHC/AMCgP4CQUDFgIHoIQY3DA4wCEDggHFO4YHB/iHDCQX+gE/S4IHCOIP/U4IHCv6CBA4k/A4K1CEQKpBEIIHDh//HILSDTQK+CAAd/f64Amn4GFgLxCAAZfBSIIADN4heDP4YeDR4Z5CEwN/U4IABg4NBj6ADEwLHDIoQtBVgQuCHoIHDFwIHBe4QLB/14A4kH/i1BeQQuB/AHFn/wA4pLBA4guBwAHELoMAA4o9BA4Q3BgYFBJ4gCCA4pqBvxvDf4T2Bh4HCIIc/R4MCKISfBS4aQCU4gHDX4ioBY4paBNwQAD/6uDAAUOf4wAjO4QHNdQYHYmAHGW4gUEA4kPA4z7BA4v/A4qYBY4QHCh63CA4c/V4QHDV4Y6DV4YHCDwYHDDwYHDv7ODA4MBZwgHBcwL1DA4MfdogHBDwgHB+LtFgf3DwhMCDwgHCDwhcFA4geEA4IeFA4IeFd5AArj77EsCgB/gGCg5QBOQkf/6oB/77D//DA4JrCv//44HB4DkC//n/E/MgIcCRIMPA4X8RIUHegQCBFoL8DA4cBA4QaBv4HGvwHBTgMHHQM+HgIHhF44HFJ5RfGN45/Bz6NBP4SPHT4XnT4ivHX47PHgCQCb4bvIAHxdBMgRfD/58CKgf/WgIADP4JlFR4J1ET4QHCiACBQwQEBuC/CDIIHBX4QtBn+Aa4sfZ4bvCh+Ah4HGUAUHA4d/AgIHEa4QHDwJyCA4eDKIQHDx5pCA4bPDG4c/RIRPCjwuCA4aJBUwZnCRAcBP4SgE/+D/7+ET4ImDA4jIEX4KvFh7HGgbXGgF+f6oAggZeBSgShEb4RYCagQHGh5iDA5QXEE443HADoA=='))), + 46, + atob("DhglJSUlJSUlJSUlEA=="), + 64+(scale<<8)+(1<<16) + ); + return this; +} + + +Graphics.prototype.setFontLatoSmall = function(scale) { + // Actual height 25 (24 - 0) + this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 32, + atob("BQkKDw8UEgYICAoPBQkFCQ8PDw8PDw8PDw8GBg8PDwoVERAREw8OEhMICxENFxMUDxQQDQ8SERkQEBAICQgPCggNDgwODQgNDgYGDQYVDg4ODgoLCQ4NEw0NDAgICA8AAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAADAAFCQ8PDw8IDQgUCQwPABQICg8ICAgOEQcICAoMEhISChERERERERcRDw8PDwgICAgUExQUFBQUDxQSEhISEA8PDQ0NDQ0NFAwNDQ0NBgYGBg4ODg4ODg4PDg4ODg4NDg0="), + 25+(scale<<8)+(1<<16) + ); + return this; +} + + + +{ + // must be inside our own scope here so that when we are unloaded everything disappears + // we also define functions using 'let fn = function() {..}' for the same reason. function decls are global + + let draw = function() { + var date = new Date(); + var timeStr = require("locale").time(date,1); + var h = g.getHeight(); + var w = g.getWidth(); + + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + + //g.setFont('Vector', w/3); + g.setFontLato(); + g.setFontAlign(0, 0); + g.setColor(g.theme.fg); + g.drawString(timeStr, w/2, h/2); + clockInfoMenu.redraw(); // clock_info_support + + // schedule a draw for the next minute + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); + }; + + /** + * clock_info_support + * this is the callback function that get invoked by clockInfoMenu.redraw(); + * + * We will display the image and text on the same line and centre the combined + * length of the image+text + * + * + */ + let clockInfoDraw = (itm, info, options) => { + //g.reset().setFont('Vector',24).setBgColor(options.bg).setColor(options.fg); + g.reset().setFontLatoSmall(); + g.setBgColor(options.bg).setColor(options.fg); + + //use info.text.toString(), steps does not have length defined + var text_w = g.stringWidth(info.text.toString()); + // gap between image and text + var gap = 10; + // width of the image and text combined + var w = gap + (info.img ? 24 :0) + text_w; + // different fg color if we tapped on the menu + if (options.focus) g.setColor(options.hl); + + // clear the whole info line, allow additional 2 pixels in case LatoFont overflows area + g.clearRect(0, options.y -2, g.getWidth(), options.y+ 23 + 2); + + // draw the image if we have one + if (info.img) { + // image start + var x = (g.getWidth() / 2) - (w/2); + g.drawImage(info.img, x, options.y); + // draw the text to the side of the image (left/centre alignment) + g.setFontAlign(-1,0).drawString(info.text, x + 23 + gap, options.y+12); + } else { + // text only option, not tested yet + g.setFontAlign(0,0).drawString(info.text, g.getWidth() / 2, options.y+12); + } + + }; + + // clock_info_support + // retrieve all the clock_info modules that are installed + let clockInfoItems = require("clock_info").load(); + + // clock_info_support + // setup the way we wish to interact with the menu + // the hl property defines the color the of the info when the menu is selected after tapping on it + let clockInfoMenu = require("clock_info").addInteractive(clockInfoItems, { x:64, y:132, w:50, h:40, draw : clockInfoDraw, bg : g.theme.bg, fg : g.theme.fg, hl : "#0ff"} ); + + // timeout used to update every minute + var drawTimeout; + g.clear(); + + // Show launcher when middle button pressed, add updown button handlers + Bangle.setUI({ + mode : "clock", + remove : function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + // remove info menu + clockInfoMenu.remove(); + delete clockInfoMenu; + // delete the custom fonts + delete Graphics.prototype.setFontLato; + delete Graphics.prototype.setFontLatoSmall; + } + }); + + // Load widgets + Bangle.loadWidgets(); + draw(); + setTimeout(Bangle.drawWidgets,0); +} // end of clock diff --git a/apps/lato/app.png b/apps/lato/app.png new file mode 100644 index 0000000000000000000000000000000000000000..02a4031a3555201deaa5c5cc5a37aba65189d090 GIT binary patch literal 1139 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 A&j0`b literal 0 HcmV?d00001 diff --git a/apps/lato/screenshot2.png b/apps/lato/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..f40495c79a26a8cfb53c699f536072adaf38e8eb GIT binary patch literal 2741 zcmdUx`BxHX7sr)B1#QN}T~SNG4FwY|cdcAdTb*1Ga!gH|+ymTA@XfK*G&c&@3TrI) z&_PX;92XLo%t^BpcP+&baVxD}-ap{|^*!gk=REhG=id9A`^$Yk=X>ki8P}g>HDo0u zBz|_oI(dp?!+#D)TI}mt3;yCDN%V9*AyGF3{UjkF8|CJ7{6f6{TG>c!rR4#q(H}oX z=%ZF1G`)bL%6x@$2@!Z&J*w+9{ne`2_B-qdZgYpWAuM&b= z2RdZ7f&cg_Sn39(INUiL8as0;dQe$%!Jzm7oQl~rXCWlN6+EO}KJRHD3C_-c(?SEn zqq)xv3=1hh7q{OD9so$oWn7_>yCZ;6X5DOdr5%HXdK60&n8dr8LP%OS&ixC z$f`&_&+#hLG4hMmVUW#|f)|Q#orHj}e@!e@cdzL+_9%25-0pP_V-FY>pM1jRNMmjd z-(h8OK-`<%=f5j|aUvR8ow%==t!IblRUp4@xsZqC`$tPI2A{>El42O58oTpSF8MVp zSI6FC8`X{&&+vw8OWTEJs*ED8diL)Cd`VDw=XT%`9Tj?`Zd&bf={M;=ja0{87yw)s z21#kPO3Gc05VfA(nVW2dQH`D_`X@o&X!m^#xf$J*;MKS%3c%m}`0T2yRSAkT5RFApX*G@(G%sImPIaWiYuCIPD-e0tW7BDKS=dj}lV^ltwU zJA<8NI_K0_g`IJ^H!%4Tr?J)z*>&iOqm3upHv~U{#FOk<*Zj8ORGA+kXc5V_nwdCu zi%?m#VWw@WgN`OsZPUDRi`d7z6rx`~njE!WUgBjRIs9y#1C8R*Ewrbo75}6#mIt#5 zRUGjZ*|6~Kw|b7?7(*U+vm2uJph-hyp1_zoh8g}90_NYpoYMG`Z=BQApW%YIH6#i* zVD`@E99(%(aTTW;Zc!h;?+PwWU;JcL)*E6?uwaJo_kl{KlohVwMpv#SHDZY4Lbbh+ zZnd=-0j6*Q1}sncJV^;t3sV^M=AzUB)0-%|`}efxeP`uIP(lamL4`h~ubhH=2KW)Zqnn6p)WfY$2Az_z(b5W|gFr@xM+sB6WOw*MMhq_=(; zdd^#=z0%HLH0QMz1ZNu)(bN%q{EdIiLJck7Tw(>O5p%ciwOZE5q5rOq|GWj%E|Y}y zYym>BzK0#&JaCPx%5qOmrA|Z{!y9(;(ORidRAhNeb>v%bnI;sJJo82_T@$LTsI@#e zlvqIFJ>40*4Mn?b_*ERPNcwULnp*!$^5*LW1u1IkU+fRe7h8IlHd`%JXJh8>g~=vw z9y*rT+>{PYS^T3vprc>I?Ivk9&z$q#Rm32i$=_`Q;MqnzRs8aW1!&^t<8C5ym~Vm^ z54_&BJg&N11@l&tRfsp48_|-qf+blW-k`+6eL_BiyS}&P`G2if!qs!$$;W6(xe(tM zm|$4cc86maFuw}ux86}lqlb})M;a>w>wdy*y$+LW-!Tof<0M25;=kU!;TmK{oS0I4 z_2|8==YEo0yJMhAxDq!JQAB@^YH1$A<_r+>NduI(o~J|0J*v!FGtw2yhPb2RS47f8HWv`HUg9ZKz(%H-lkGC|lG-3D2k40ei? ze`nyYJ7qzm;Oa^Ij3VXgt5zU=!S`j4-K7A_x%lclu_iD(mtNxG2pC?heajJR0`;n{LGcbRZ;V|H20-o|xG=jU zmI%azFbgwD@G0r1(M0iYXl-xSpi_W)KY6wMx3TN;_pL(lHqu7PVjU{s=6uGf?nFS^ FzX7Jd162S3 literal 0 HcmV?d00001 diff --git a/apps/lato/screenshot3.png b/apps/lato/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf135a60bdeb64bea4957f56bbd923fd9ebe87c GIT binary patch literal 2723 zcmdT``#%#38=sxk*`kw8ZYOuWyj@ENG{1H z%VI8*r9(ALDnn&w$FL9^ayz*k@1OAg^nTtSp6B~{et16LU!L#x`DXd~p!V+haSs3h z*z4u#=D&mN{}g!lPH*5&gzbP5*&pQ!cr4VJ1_1Wpz1&U&CWXzFe!N;`ud?gi_V%C+ zlj9>(-Tg+i_dqSL`CxCgt5&ipB{em5bA9}Kpe9`5D!GlxecA~zIBXPJ0sw}$T{GGC zmN?&NroU(yP8sQR7B9%bA>@^DR8PQLB6JO!16w`-?ts#cFik@a(W1#WKoU zp<*&M1y+G3ZL+K4yAEcp{Lz>ZqL1Q9$*+p>UIh7tVw}`$DvD%?_{({0m2*bEreZK9 zf(8lBCrB%~zP;Hd)Q;Pfm+}r+h-pdcyEE9`M(z+5Xv<^$>QXEBXVu@g_!Dro$(AP=!c

cQOwCI~PFrxa zEfk{q(c}a7uPr>;oxv{<^r=Vx$|pWEbP=~^FoiV%k}=YFv$#XALtLlT!29m2APlcE zz7DC~rzm^%Hih8p(&I{?r!8-~+`KnRwRv8wtTbs>Qjx*ePVOsZ0Jf_y2paF?p8`

>P) zP5S>JRUD(PZZWDBACl0uzWUtmmfLc3Aic2Xo6NVJfa+eElH(pmG~{hqh*ISoyri-p zeJP@W0A=?Ejjca=5V;!n)aN{1of0V`X^wm#99>7o5q}#QuMGo-NFN-j?K3Yq$>a-m z+hmm+$`MAE2xAy(J#j**(V3@aYEIIxA-jU((e)NAuR0?i?X!CD4M+ zIETe@L>L+x`T{t=`AP8lz#+0#aBDUp)Rf)SDp(rEumrcd1wqi~g=CM;=hK4fi{Wq} zYN9_ry=lL07g}jvHE241G@)G^JA^pMhRY9J<*Mi|FabpO4}!C%RGZeo_Xpu@BYAt8 zdRDUjCu@Rpbi!0UEr+q}d;uqP2&566idvM$7R;?>QXkv1$1iuglM=2EL<>$ksW&M@ct}=L z7R{|a_5{YNvb8~m%MOe(ieouil%wq8ZOhqwLCtY}fbdt{IX=3(Y!VEeB-r^shfw#K zq4dId`&#mj-){2g9*r->X1G^IEEg0#YEJT6PPUFI;izLx#j2YolcG;Vwk_{mZJt1iF*1DiOnCc5(Z9s1m;`riNTME z9ntY)0?vB9y#jU`^i_L%%_(`|oUC-25QSI8;92WjIe&IbCJUBBfsTop&LUN*Bs7KIM*vis##-y$-tN zLpaA-H{@F%ilyFR{X>@%sSfE0ba#otU*Hyr|9q5!l^|i)Vthey&w2Y$TTaZzOYps2>d-|_&Cq0X1aS%} zMSp2G>KWAIIt3Ivx=J_$9mToaRY{e`)8Me#kBzIcp;k(SQpbOI5io>bnW-~M z!Z8RTzT}lO?>MRDGY@V$y)ZLwojmiv}45eNf7b>Wbxk_MV(ZS^_*ja;kMNqe< zMutymYwPF2T4uQ?p55l{h>a92EJR@L2_5lxapD#iI+B81)*u~Zz{@NYgU2FsI#Ll! zj`k}_bhohBG3g<5#oxcPf5OTxVe`D_%2J-#>u-r;gj@J$y4K-7l8%t|U<|ssjVAF??h7CHYK}KBBVEehMEff#2zHo_jx(IiQ+E;f?$j<2zodyk?dd8Ln&OaW?D} zL4Kx!qimUp8OBCX+P;*nm1}`@IznMff!ZQ(HyQ4c#oI^GmQRGR5yqe6S5{<2pZRrQ zff_}f;BJ3}1lItPu=CbH;y~l9ttKu{eLCN&H#hOC-%Y-zdeB@%;T?2bKKb0T)~v7* ze*LRqu5m^rL%M{VZXEmc?npf{CRHzQnDHi^$SUb%09K6|NWTtD@ zC#rko+qM3w&kZj^ZrF*BV_i~aR6!bXOwD|FpXiF92$~WVOs>DC8nj0_yj#*_?W|D=MicYU6orSoDzTyE^D6x<`|^$jcYmQwUt1~lV10sJHHx~AVL_Y z@gvP3|4Ih{>Gy>tkvsRO0;hVYx=5h!ahz-bu&Bc14R|LYq}xXqLR}=*`Jf+90H`QG zV!t&I9D0-CVhlD=fM-}Z4*<2-4|V~h1kyWEdZhQiBHaRV-;9MsKM^0;Nu2;McOSRM Iu7vb|09r^G=>Px# literal 0 HcmV?d00001