From 38d652d914888568be6d29a1dd4082df5c19b25c Mon Sep 17 00:00:00 2001 From: adriankarlen Date: Thu, 19 Sep 2024 15:23:16 +0200 Subject: [PATCH 1/5] feat!: adapt to zebar v2 --- .gitignore | 21 +++ .npmrc | 1 + .prettierignore | 4 + README.md | 198 +++----------------------- a.out | Bin 0 -> 288 bytes bar.zebar.json | 23 +++ bun.lockb | Bin 0 -> 116663 bytes eslint.config.js | 33 +++++ package.json | 40 ++++++ postcss.config.js | 6 + src/app.css | 54 +++++++ src/app.d.ts | 13 ++ src/app.html | 11 ++ src/components/Button.svelte | 9 ++ src/components/Group.svelte | 9 ++ src/components/LeftGroup.svelte | 39 +++++ src/components/Meter.svelte | 0 src/components/RightGroup.svelte | 74 ++++++++++ src/components/Workspaces.svelte | 105 ++++++++++++++ src/lib/index.ts | 1 + src/routes/+layout.ts | 2 + src/routes/+page.svelte | 19 +++ {styles => src}/themes/catppuccin.css | 0 src/themes/rose-pine.css | 56 ++++++++ src/types/providers.d.ts | 124 ++++++++++++++++ styles/themes/rose-pine.css | 1 - svelte.config.js | 17 +++ tailwind.config.js | 94 ++++++++++++ tsconfig.json | 19 +++ vite.config.ts | 6 + 30 files changed, 801 insertions(+), 178 deletions(-) create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 a.out create mode 100644 bar.zebar.json create mode 100644 bun.lockb create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/app.css create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/components/Button.svelte create mode 100644 src/components/Group.svelte create mode 100644 src/components/LeftGroup.svelte create mode 100644 src/components/Meter.svelte create mode 100644 src/components/RightGroup.svelte create mode 100644 src/components/Workspaces.svelte create mode 100644 src/lib/index.ts create mode 100644 src/routes/+layout.ts create mode 100644 src/routes/+page.svelte rename {styles => src}/themes/catppuccin.css (100%) create mode 100644 src/themes/rose-pine.css create mode 100644 src/types/providers.d.ts delete mode 100644 styles/themes/rose-pine.css create mode 100644 svelte.config.js create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..79518f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +node_modules + +# Output +.output +.vercel +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ab78a95 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/README.md b/README.md index cc2b8ac..5ce6766 100644 --- a/README.md +++ b/README.md @@ -1,194 +1,38 @@ -# 🟦 Neobrutal [Zebar](https://github.com/glzr-io/zebar) +# create-svelte -## ✨ Features +Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). -- Process icons for current workspace, with current focus indicator. -- System information meters, with dynamic coloring and animations. -- Spotify, currently playing song. -- Configuration using CSS-variables. +## Creating a project -> [!IMPORTANT] -> -> This configuration is it's early development. Contributions are -> welcome, especially to the process icon map, as I only mapped the ones I use -> that could not be automapped. +If you're seeing this, you've probably already done this step. Congrats! -## 🖼️ Showcase +```bash +# create a new project in the current directory +npm create svelte@latest -### Fullscreen - -![image](https://github.com/adriankarlen/neobrutal-zebar/blob/main/misc/fullscreen.png) -### Workspaces - -https://github.com/user-attachments/assets/38e4a09f-1583-4e2a-84e5-6da7156402b2 - -### System info - -https://github.com/user-attachments/assets/185f238c-03b8-4f63-87a2-2d36d6b31039 - -## 🚀 Getting started - -### Getting the config in place - -Download the `neobrutal-zebar.zip` from the latest release. Unzip the contents -inside your zebar config directory. - -### Replacing values - -In order for imports to work you will need to update some paths in the files - -#### 1. config.yaml - -In order for zebar to able to import the css file, you need to url encode all -special character, this can be done via services like https://www.urldecoder.org/. - -For instance if you zebar config is stored at -_C:/Users/MyCoolUsername/.glzr/zebar_. Your import link would look like this: -`http://asset.localhost/C:/Users/MyCoolUsername/.glzr/zebar/styles/global.css`. -Everything following `localhost/` needs to be url encoded for the import to work -inside the yaml. This would mean that you would take _C:/Users/MyCoolUsername/.glzr/zebar/styles/global.css_ -and paste it to https://www.urldecoder.org/ and replace the import with that string. -The resulting string will then look like this: _"http://asset.localhost/C%3A%2FUsers%2FMyCoolUsername%2F.glzr%2Fzebar%2Fstyles%2Fglobal.css"_ - -```yaml -# Change the following line to match your path -@import "http://asset.localhost/>> PATH TO YOUR YOUR GLZR CONFIG FOLDER<<.glzr%2Fzebar%2Fstyles%2Fglobal.css"; -``` - -#### 2. styles/global.css - -```css -/* Change the following imports, you don't need to url encode these like in config.yaml */ -@import "http://asset.localhost/>> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER< -Example config - -##### config.css -```css -/* colors */ ---text: var(--rp-text); ---bg: var(--rp-overlay); ---border: var(--rp-highlight-low); ---shadow: var(--rp-highlight-low); ---icon: var(--rp-love); ---memory: var(--rp-iris); ---cpu: var(--rp-rose); ---cpu-high-usage: var(--rp-love); ---battery-good: var(--rp-pine); ---battery-mid: var(--rp-gold); ---battery-low: var(--rp-love); ---focused-process: var(--rp-text); ---process: var(--rp-muted); ---displayed: var(--rp-text); ---ws-1: var(--rp-gold); ---ws-2: var(--rp-love); ---ws-3: var(--rp-pine); ---ws-4: var(--rp-foam); ---ws-5: var(--rp-iris); ---tiling-direction: var(--rp-rose); ---not-playing: var(--rp-love); ---now-playing: var(--rp-pine); ---network: var(--rp-text); ---weather: var(--rp-text); +# or start the server and open the app in a new browser tab +npm run dev -- --open ``` - - -### 😸 Catppuccin - - -Utilizes [Catppuccin Palette](https://github.com/catppuccin/palette/blob/main/docs/css.md), configure css variables accoriding to your liking. - -
-Config show in picture above +## Building -##### config.css -```css -/* border */ ---border-size: 2px; ---radius: 9999px; +To create a production version of your app: -/* shadow */ ---shadow-size-bar: 0px; ---shadow-size-button: 0px; - -/* colors */ ---text: var(--ctp-mocha-text); ---bg: var(--ctp-mocha-surface0); ---border: var(--ctp-mocha-crust); ---border-button: var(--ctp-mocha-crust); ---shadow: var(--ctp-mocha-mantle); ---icon: var(--ctp-mocha-red); ---memory: var(--ctp-mocha-mauve); ---cpu: var(--ctp-mocha-pink); ---cpu-high-usage: var(--ctp-mocha-red); ---battery-good: var(--ctp-mocha-green); ---battery-mid: var(--ctp-mocha-peach); ---battery-low: var(--ctp-mocha-red); ---focused-process: var(--ctp-mocha-text); ---process: var(--ctp-mocha-surface2); ---displayed: var(--ctp-mocha-text); ---ws-1: var(--ctp-mocha-peach); ---ws-2: var(--ctp-mocha-red); ---ws-3: var(--ctp-mocha-green); ---ws-4: var(--ctp-mocha-blue); ---ws-5: var(--ctp-mocha-mauve); ---tiling-direction: var(--ctp-mocha-lavender); ---not-playing: var(--ctp-mocha-red); ---now-playing: var(--ctp-mocha-green); ---network: var(--ctp-mocha-text); ---weather: var(--ctp-mocha-text); -``` - -##### config.yaml -```html - - - - +```bash +npm run build ``` -
- -## 🍳 Recipies - -
-Soft Brutal - -```css ---radius: 9999px; -``` - - -
-
-Round bars without shadow - -```css ---border-size: 1px; ---radius: 9999px; ---shadow-size-bar: 0px; ---shadow-size-button: 0px; -``` - - -
-## 📜 License +You can preview the production build with `npm run preview`. -This project is licensed under the MIT License - see the -[LICENSE](https://github.com/adriankarlen/neobrutal-zebar/blob/main/LICENSE) file +> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. diff --git a/a.out b/a.out new file mode 100644 index 0000000000000000000000000000000000000000..2f9eafc7f95f7869351532b3ecf5292a32df9bce GIT binary patch literal 288 zcmYdkV`cz>9w6obvsfAQN>VFIz--)v0z*K8UP@v~B5oyM83%@d1A0lt#RQZwG=S8l xW#*(p75@9rz>vssqx_qx|s@$rcH`}&C4xp;_S zJ&tX)^Y_>QE>Sm6dsjynH>{|mr;od>pXf314a67>=DgI$ky)ae{az2yFCvS#cXdR0#+Ez4xGYJu9Yx<=x}`bn;_m`txSc%ga>2oY<)l}*wbOH z&dop2(*t~RaaS0`TBUe zx%qoxFx$y77%tGh5ok`Jr^#^TPM{&K0_ZJ3Cjre5v@g(Gfi}k1O9IUY%Je|<0zF5H z!EgiJf!FtdhWHeGIS6Rz#|mf;p!I>K0ou#c*U#S97n4biD<=ZI0n~fgdU(1xU@%x; zJAW592aFZy6bqoUB~#_Mx<9fa3dyw=C- z{XlO5coDp2#cMLWUI4)}g7zW2Zo}(GcwK!fSm&f8s<+EXqaCt7&i|;45kef zV1FC%TAv+Peuyv6f-*g5cf%g@092Sy`1V(L-48UJCk|Mwm#B*`W*YE=RD_oRJgk2Q zk`Bu%V6dT|-9Upbgy({Gkm~RVpap>T1sc}7_=-BYdD>xC!QerAXHdTp);oE4`d~2_ zOMKbU#lt}qOe6`=DcHUZuf5?fY}f1V7ypge?J#DUoigO{#c(Nj1`z{5Qp{k^1*^QM1UO}pB_*T`)OrqQ4eDXPV5eaHMo@q zpSFI^q99m%XInQ{(Eb$E!#p|L`ig>>ogRWRhv+oBQ#%X(Wt$P?pAq)l#QMdun zFb;no7ty021}}e)AbU>->@2uxVO|_w8G+YOUfd(ew!@wT; z83%oXas7E-Zjr?KBa*_ks{sxD+xghqV?my(@%5zAxV)PH4cpzZK2BJGMdqU~*8LdP z2ZJ#Hez$`5%|OHTZ5QwlHcgR@^t z8jKy(!+d@N_0WDAuYIt-o^Hpm82){@ezOA&`$-Knex7&+cwjJAa=84~%HrC+;2;Aj z1Z9}tcX+-|pkaK^fQCHV_v3Jn@ns|~duLBq7YAD({sTBa$AE_Gj1Sh6m-Y^3VZu#(WpkX}*X!x8s z>f+}Dx`lCYI|dcJKi2ds@Ds-6dkpIapP-W3xVW|f4eK`p4g0?VU&i|S*m?mB*4JGW zY#1=#v~cmw1HA#*4Fe7BTY-jteQh1!a)WXAS#ytZ1cL_4cfbXvYB*Ts{QO+NB*))} znV=rdlb8B99bkZq16dD|b?*^qhw~Si$H@G>g~wgQx5wiBz-d4Y?4yiv>q{WeF#m2q z!+Jx!t}(&I1#S{sHxPRXDAR!UD?r1z+yM_P%N)k7L%_}2^B(R$9Q`pES2wIb?4Xbt zZhT0921{)?nAU5!jTX3i*k2!PAO;J{FmJvtKF5Fw#?RBw*3HG&&)vt}#T{gh`v|Um z)f_iJM}UU?cEBF9b@Rt!>^;H#0qov_dKed2lh)P&FgMonD|f1(Bys~&n`9HuHLo8g zyF_=tpHNdd@tCb?xl-3Qqj|fQzQ?H9sjI42`}41{JX{{to7Oh>q4W*9=&iD`miS_G zR$aOnx&5dhsSCXt)oNhng-Di|>9_$sw_bI+8;S{WJ{jBl;||f#4Yy0|`1b4@SFkS8 z$B@qO0~Gp>K5@+sMguk3CqGB9Cq{6Zg&q4MxM%zAy^>#Fs(w-wp!}k&@?_cSQkYa` z%g;0M-!m)t7{>R`9@nL%KiOU?Kx!#I8ncPqufxIZ#R9Q@`t-CyR{M{#pOf<&*jof1 zGHqtGjK37Q--@{E^$g|U5!)9nlUkG!BAq!t?XD$9d{3$WxOam;#9Eh|pSP~-3_YK` zasb6bMSC_q*Au}pT{oL+Kf4m{D;B7_So$2;o=L-^GIpitSfj!Imm-{83^%WEh(CBW zW^dlK7|tDX-8d;}-z4ABbLnw*o4--faWgFnGYak^I`cleH_A~};^N!Kb(m?jZDYg= ztgEXM1}(d>O%!^ms-y08lnnbtDv6Sx$B`B~TQkT8Ub_``bedA2LtH7{x`LdJc(>N` z^6bQW!H+*Ct0{(0bMM{KYuC zp4Cpro&zPuqI*ByHwr&qOrN)G+%qJ?$gLU7#XH1TOT~NNoG7zbb?K_t)?*rXe3&$9 z1Mh#?LneEuU>Bu;_8~2c(|a$9CiB!YHkUS^NK|qv6sV;gxusU>FxSJ^DiEzcslZHs z_hE3nM;bTru$BJww3k`UG+E}rlwk9@5Ly=E&OlTB*V>lz%|jk5GRxXW4LD5L)!Vt} zN}HL^yd5@v-f$xz+VRs)U4Q8fmxta)Q@r0LMn`GKolrVHZt%4E4L0}amDq>MdEaSs zX+OEpvX|-ms)cOIwzC?#X`=s3$CmzHV>h21MNH7i*e{lPXTSTl2#ej^U;8P>E>zO3 zbfKlq*{M;;Iy_*=k?zMR@8=~y=1cBETkP_a?R49-245GIbLX=)B~bOp+$jhYe#a3~ z`^2Mb*OyV6QbDY%d~%%ktG>oumV-w(SH($=6a^)i4tp=9B`Z96U3r+bXDQy{LDq-4 zj7$90+DSJ*+t%?ksHL%eIiFo({5`bI_GgY0I?KA_)%C*Ms`~Dh7Cv`B zzm%gpubQ{R^sOP|c((%cV47?VW$1=6Q?3J9XIDFXYkqVZ$WgVuj}X_|eB{l+dVBlU z?F&9hea;VP4)?a`h}B(VYpG|l^X8XV*hsgx{c!%vL!YmH{GyvotI(&R7=7S1hsMh$ zwVt?bKlWS1QEjIQe|kjZbga;RyHk5;$t-JjWW3#H%&Kv0SmTwr&N)ju{)0vbQg$3^ zrPh9JUN$3il0xW;c23F7ecb9+!HF80XB?96R=sT={QQ=WIs4Z81F{mDM(h!Tg}z#@ z#x}~4F`LQExOBLpnz3PH0X}9!H+65f2TXOdNuTdIL${JsNK8yO-Dy%c@N}TOfX?3F zM%LuAUBC4vN~r>#!`D`0e)3OHZ)MvUDImGCx^kzIq+rJY4;$kKd0Jx4z6d^fij_k{ zalL+bby_HWtBebZi0S5#ak$0R-_%)haFMt#HYDxTE{}xXLqsL*HYZ;&t1Djre021x zK==-k7_8l&=cUAf>jEKB4D1u`PcjaV=sz>Inf$qW!FI8h=?(dV`VnsVh1$C<^wQ3x zhb4_#$@3e8#nitoTQJRk&SlIbPISD0%tz)!A5CZy`QLkNS*YoJ!!MIiQD5)ED-lPb zb3DLHXjXSm)aQ5OT{5`Lj1XPWv2vWT`Rsl;hTk!J?5ej80vtQCF2+#$B2% zA5NXSC5pu5RD0Tzib0Qsji|ehcz|?_j1!ew-*g^G(9)XZl-fEpStVEPvuT2HbzD_BR;y<)dnv0#6MnL zh@n5?<`zwqIr}8kE3^CgD_`;pq4sIAfwk-c=~v z#)FYr^H2tJ#W;IRmFo%v*7b)}>!qN%vNyd4s={mz*>B`MW&C#NM{ALw6iwQx%q~+> z6YAQUNQcsbbWKz02HtM{RDE7y8!o;>-H+!dE)F@#p1a8U@O)6u>U0Uq#d6IY$~{k( zterSRM*^-CH;*q4&Y#VGok*S$&H8fMv+8?x0|mBZh;uo70d*9z_f3G!;eXHlXz#`daC2mk6 za{nB1A6g$}-{JE33DvcQYq>kdzpvIlJQY9iX3sWcJw(>M>wzL_Vn+RR$UH{oFP~*C zNzBG=kzrCrR2}w_4Oi_ZCv8>RF^i&i!u3A&2ZT!QgxqajIsxHqsqxA}oXJc-Zll3h<; zVs3{dJT|AO-Fo?UwyWtgx-4dx^y>Nt3BxI}iT$-#w};)I zOxDP$zh*L+FhC+0^`OBxnFwy$ena4?8WcuABm?$uNEug)!PsH_Ypo zk$OZU_ICgtywZk~fQHTBB1H`TK_mD7REt{ApX_B2k0M` z$-xDA2oVGy1U?wz@o3yy{=hr!gJ+RWRR%>j(QWWEf`1M^DE%E?LK;(%7%d-__&N3O z@U)=A;1%Mp#}91&Ic%zqG(;l?ivv6vXomTNnh-(ood6HIx#l0{9$th9 zg69NIr2!uLW(L=K@hV`@z^lx^#$N?^@T&B$@yoyI-;e?~fBtR%a{=D+H{vIu1ZNJv zfp-IV+uy*q0{rj9FAQEd!HGinzs+9)z=PM=e~n)Rcc4@H`AvN5Z{nF5e=mN^-^AbeP5jhv z;-$f%>hFwSD8Q@!#`xF&CY}l$PXCU7-QUEg0KCd?^uOmf@myfh{2l+czlp!`oA@z+ zhwBe~{t>$N!)FEZ{D=lGea63m&tSn|)P4gm!isx;0NXJ5eFnjT#NWe)d;UToQb!00 zV#~~q!-Lm=H6ipFj^HiucqI4h#i!!&&^gQj+`|weh=2IYB5?gd%1A%{i371$2Y7LS zhxX9-dgBiSc)0&T@K6&Xi2r+dJoF3e*6V*3;AMe-1doivKgEFf7v{vBKR|oPvEKaK z06bhj*Mo(=5dXOV595dXKco+^{htKE&j38U{~#7#U^`BbAb1_F|BN35LJmR%!Jh_r z6}*3lL+byD1F?Gn@CpDA^A6`OQcozJ7W|Th56b^~;|~XT7(a4ufoMYgKLL1neud1N z_2Nmv7q4;v5BrUb;XnC??MR*!03Q4bL^!O2cq9&3{*@s3Fo2f=czEBy*pd2QVPP9$ zSAzGCtUE|Oq4-&VhxsG)zD0NuKXO}f{U@~Ff5r#n@ksng`#)*Ke(Uc4Y5E`HeW^~_%;1%$A=nJWbpMNEY9hCqse%ODKUjhEqhTxR}Uhg;Zmjv*V zcs%sK-t(shfZqY|FdjJmg!Tc6e-7Z`^9%92Ui{&0|M~t0rU>DMpMNEY-RVE!e}zG} zA^0kQSH<@q-TqIX5j@>?-1#G+{YH2ZygtCg=MTig{1bW)BKT7PkBmRWBK3%$ztf1_ zYk*h5j~`O^cNla%V#_LsiyzMa^$3F319&)p{_Xvf0q{xykMONGe@O<0mwB$dBOr03NO%unxvfC*qg??cU2oc1;A;2F5{$Ux$ zKt>1{*dX|O0Iz`RKY{Q+@FZaIhU*uSKSI|b#Q!0Hhxtd!>y1AS;1vNL#!aYiXp8u3 z26%XW1>=W;Xk6*yf?*5M!1fL4<3ILC+-~Wf< z-&7#@MSzFZX#1neo z!5E<+@tXm>62K#IBN}J*_dgN*b$~~o-~2t|zgrOe0KmiV?`Z$K`5#LNo*BG69Rhd= z0AFPgEC}8g;57gqmSNus%_D+;g!d0|gq}UYAQ3#d1o%5Cz(2$j>Kl#s1$Z5RhjRzw z37tcT|HlAt3Gnc_LFn3r_P-r$o(z8j9}Mtt{r|WAYXDvW;NjR2+IMvP8^Oa5dH;iZ z4IU z|Iq(>1d0C=z{CDSzi%SG?;r<`S53vX@`1ngf>{!9!5A+Y?hx32E`PTw?V}Sp+ z_ir}9>;49Q7T|wp{g4I^A2@zU{(qS?R3nnVAb^MaKbSW-euO>)5WEW5JeUAH%>BO^ zzdV44^B0*n2rnwszx;^UEdo6H{`*Vgzos`N<_kq9rkH`OwtG}#9{NDn2TY&`wz?O z$pL~F2F~I9Maqc&%b-z}h@C6IE8+Y9Z|2`^fJgTq<>Hqg5&vTVjLcs`*Ir1B;MwH= zbN-3c{n9bM5wUdvcsPI8;~VY&Ho(K@&%eb_06feeTsxr@RH!+1IO>*`acQq$otQF z#t`w}4)DJdKb69N@GyUb#(?;D26(vsK^z~r2o(hXK>>r&2Y85s{%PO`0tCTJEB@#F z0Ky0zLj>;%@Zbn%ZTtvbJE0#0{{Y~@6k1#V3H6P}lPcljhxvmS%mE>S_?HEE#6QFn zDhNIh;K848c>hD+>-GNtfZ_awILL{tBjDpN1=>PkQpRAwEAZO)cMuEr0fY#GKLPMY zc>jdp5E}&l3gFcN9_9{SgbIS+rh>~qlE3xh9RMEgUt#{>-gUkCe+uy65&lR12<-zB zKM{EN!}SBsePj#?=>vk70eHCnLccHv>-B#D;FSO#`XqGk4s8+t9eDr9z6+^`Hop?Y z?yM><{`K7ZkQc!}1$YGzKkPfKTW|jb)o|}0gyMjUH9`D`0X)3_k^Up?|D+Lo6~M#s zgLp#c9^^*wivSOw-xU86F9~iwh=*(Ezwz$@@CpD=hQ}juf#NR(v8w`ja0`V)W2Ekv zKz!pLw&3s+<{zFv!MZ={|A7Rt+mFY?{=+&#bAaGO03MDXoPQ9zUVJ&g!}S|L*XAzF zBO!wLKLo(={1o~n6btzgdjAJa~mzyZ_ME9@s#?osv?!hhEM2o&VU}g>HkN5xl(ifA%l`X8eu= zyb|yaIk$joBm6*sApRc#JXiw43C%k~jo`_^;lBb3kJKY}f2R?hAa^^76nzY5^t`#t>QU_@MQ4m{pJ)D2IZv310 zH2@y&e<2ofu6Oli z{}MXx2q}V(!Qi-Uh)FXDJVDcj4$BQ%)pb@+= zz=I_y975n4wBG#R26*siZTtwuLSKk~2Jq#J62Qa0!`v~!Mgj!ECjz`GK7QyQssASm z#O@8i!~G}p4aX49BSHkhZw6m}fGzym_(9ya=4OJ@fZ#0wUJ>t~1>o1aeslsn%s+HW zkYgAm5X8Tv>3`NQqz-5C>z|12QGizl{*f}{uVH_*BKEfd9?oAFJDh(o2ZRWM{{isu z{r%srADV}8^9LDsxDFE{i2nqDw*>zGeBZC_-}YcI>630dHh$26gSN;R{tAb*A^0JHhx;d_{O5Uu*#B80_CiPgbN@mcLSsPiwg4}M^8aT)e^*BE zDF6@OU;gYD_x>V{$yeOf_aVox_0K#Az60RFE9_eTk$dpZwtrPd@SNc0gU>IRw?D`5 zS2&~&!5;;9IR0?%tw#`i7Qn;&LF{_=5D5M?!0-DFJe?J;|H%Ef-uYt*@G$=n4`U(} z5Bm$>*Wm^G%>gbbXbt(e)@pGYjt_jtgaS1zbAyW-Tq59t0yTVw$io7V|1W5m8wD5) z5QVj$|E=LO3p|F_uK^7OYS^9w zE{MB>NFTj_fhWxj|1?!8z1qEtYE`|jlP(z*)aKZXg za6y3@mhZs=5VVH8<=}$t72tvbH7r-+^?jhBKn?HpN3Z|{t)YGOS}jgP-db?M`p4jc z0yV6!2N$e=0xl@O($KD9%?hXCv-$kmMafolw05H|rXC{RPYNxYuI>uI2&pf$9c zS*yiq$TJ5nnEx-}g8ZxCf&%qsaM1%0w1fXXAQZHQxXt+bztRxL3fiF^C(tlI+<1Gm zhE-d^52$(Y?NGyyy!i63H1xxdxBDv%^9}z;5NINbw}Tpf+zEa_yg1PCxxWWi{z=2Q zWkEe`+K1P2c)P#Sa6MAOw?hs2Rq$n~VObSlMr&BFj<1Ir^5_5!{p;hk5xyO*VY?}) zhfVPRC4mApthd0If2E5nMOo)bga{~78%+C*xgBpJH$CsgoACG|_kUtP# z|5q9|1>x@B07e{^|$a5Byxf&4~XOegZxs42~B~O?t{Gw6_aeW*{J} z#7Fy3Z{oy3k&kMb1DVgaeL1|`>k{j@S0L@(=@gj|o*N?8$;Iwfej_I)DI$e$`kH7I zzj1O!@xnQb2x**H74NydDcwg_u}76(vQ2*2Em^jKbuf>II=^cvH*!EW9&<-@`RL55 zS0-DlrGJlSgP~E$oty0>N!$g`7&oV*c;Oxe5z-g2uZqjB2ilI*R7A)GFoZWo9w;tq zKEv5Ybwy=cQFX>!Vhfu+{JlF){4mbO$g5o>J5a{{-m&d0@z1;|<=wsT9SO+;oI8k+ znqDMRm6TWSeW3O3W0p)$rQ-6%XFi@I{(H35W{2MymzO`>Q&-o|UN(H(a3JdB!3!ZF zhvctU78nl%KOT_LcZKhw2rqnRMufCNT{DblLr8;QK0~#kId4GejB9K!_1v3~Bs+>b zcDzy!@#a1oXDasudI+qhja^q8GkVZ&&1l{L~kxQM~Zo1rgFh~*)b{Hail>PJZT>PiwRD;w8(cbdICi)lK z+%Csupm^b0f(R*hpKM%ouG)J~?wIMOZHn*3Te~%_zc9Fui+$(!=5t|H$e~bhzM6L` zxMo1@@|j&q$-biQQZn%x!Zd~-9Kex79Kk%hQb(|duu{BhI5)@7^%(dr+TYMY++ zB@Ym>3&lI!vCV$97tagl!UiN*ph-vANkUIt6{~nlB=a^B8-L@jdmVTCOj)jYOFpN= zgAbxJRa~rFD#@0)4qv*w{N6$<{?h7z_U>+MYgXp2i!6i6;ATMP!$vgkbW6g$O->9I zME4pKj9;Xv)@h|D?ibMZ{bDp@QM(-B!>VxPvvb9cP5JFff;^5&gN$Ts5f(2v?#NIb z`DyH-x^*pH3?)6_glE%;kZP(5f2Ef;Qd}J$J-eGV=dKNV=+eA@f9l8TuYq?5Rh^#Q zWxD0Db@M5P&QS@Ww%qeNQInC|k88!dvJI3{m=AfNc;UM;BBTjPz19ml`?*pL%`WT`E``ES^EjIGKt@PdFqid`8aCf*xYJ?el zX9RyJ!vP^JLJBl#$i(#I?1i(G%Rx3zDi5%8@|%9bF?KEWsXS*_vH-s^WaXiB>&dXA(bG91Grm1{d!dFZ^x- z5z=PwRgr5~^RRE91Wy%z6nr-9vfEgI?|g*Nk-SXjbh>Jhqf1UKFO8(cicLSnRdNT% zD3fcjYM2%W6k6-iEIfc`9z@_2A{-EILP&uo&8*`R4(K@{^Tnijzv}zq)N?PScbjIB zyf$RzG}JV`b~HCqKau0te`n>#TP!%S3 zX6|OoxNBZ`oAmR6<}D`k_qrMGZ!65WJ5}dMH>ms;&kH9TJo`k1RMIXnG%J+tM5&ck z^um7rtnr@>Iu)1(Y~Wq?i8Ei-RLH(xa+ZAI=_T*Bg+%rpwp-J5hjYeljuFd>Jv#&A zAMae_C0)w{JVQW)RPuO-oPCvGN|U&Y9?i)aThXR#kG0>H6xJ}g$W7hod6v6!dEhCJ zgczC8vaN*Jz^$uwbjwa^b8=r_g8z_fY6tF&6vxYokOED5d7HI&hQei%c1J9~J~dl` zeU4&N!g#x&K(6uT`Nk4?YL@FfQcY5!w7Gf{yi^*71x$0V79K=|GXFTnIr-q-0ermS zfQt>yyC_1_I=u8=xQO!Gm7=))TWilfxgKJ9DmFk7PKTh(o*R`75a?aLKBFU&7Hn)k)Skf6t(C+GIu*}^9`y7lopd;aH5uM_S+ zITyv-z;S`@p~%qncoEqktKr3@E19pO_(KO|Yu=02w7n>B48V+k!t=uQ0r}n!(vu!I zD6w_CMT)^t@y4qsL(6I$(PVmA^t47=ox%3|7rqdU=v^5QJ>eQSazZ+acJO1*J}1r` zYe!2tWr+~Gis%zTYrMF96el{~AF2#bY@S(2yr6hcUH3X!N#C`s(a5{S`q{@Hi+n`a zeX0~nh8o={<XP%*WxzM~L`EwhJo_-H_{O%A- zLHpLL36c4uo2w-3U1neCFmj1=PCWp--?RJ`zeQbb6#>5ipsy4Yd)EU>Xe)GD`4?1OoY zK*HeA&7h>HDprxI=Gb=z<+f)@-HH6)^=K}cH5%+pxUovE?cdt$)SE6%g5uqZkOEB_ z#P5>3hmNN}e`{@-;f?L#KUtWcf0H1KRqXYb5Z9aR3Qzx1AGYA_@g-%Dt7LS$ihfh1 zMr|VvxkXHD#2k?z?moulfd|c-PV+*pAuuN7PF*_5)2WyKMc$Oxc~@tX9E%x0Uwx9R zuJ|UT#j1!=%0y-Gy~dKy;f6M5iS4&m4U^Ty+KqA}3f7+UxMu|~nwKZFq+U1)I!wt z@liAWdAznh@S%C%1ej7chO#zoVlVB=%xrr@+;L6uz{_d17-_M?vGx5Y?ZtJe>OMzi zwnto+8WOZ6S~9$JQnq>c8s$^n4sy3B>b3mh;^jy4Rt9__w`qpRW~JwDjNkCQaDCX0=B3+^dMmRi z=>o5r(~|!Du!>|5{hq+3y|VlII8&~C(0jIM#^CzSC&%jQN=2Pnw-JZp7siPt2FmO^ zb{yJ7@p1`x-f+Mvh~{-tr_~-SoY`6Et?F4 zHkB9-lqGIdqBDK;;dHzZ{|4@diaO0sn#UDp*LX3MTLGsKnwPUwyMEBS;easH>^dcJtFKw_CUO@8j4T<*D*Lqj`7Gj+>=9 zINr7Wjxd_{#e_^L=Q!zwrJxY6>RtZLR1CovXrdV8FOpn*du=4WhWEmgu~_wYR#R$f z+8XZ+Z05Nf=oM=7_OK~+O{jVWzFy=XzEQnt(ttz@wSAAHKHgIyI z*X?^LP0_5?A1GIf-xJmB+!9GUOI1m?gksI7hZr?BVSxR_krmBBon1g13JOrKha#o7BhVc1??<}Hd-t7YpQmkKIs6Mx9@8tHhAg{d8Lc)?CqbEa-S&lAz z_5DWwffI@QcjwUL=H4t&;Z)uhbX`w8UGYGFNN1Pzq8SyQ7tY_EXkNPV_=5*&xahsO zIp-inDFuJTj+Hxc`JCBB+=;D{?Ti0IM-?H7DnW{3k)$OMvwkxIFCY~(K zdE0el9|d{E(7aWAGp&MSa^AdMO_z>Y)LyKgv$E=P`)EW;FZkFsYq&(svzWHAuIQ*< zSl3CKNBgbM|G1NTa5ZN+`o^7!6UDoH*5bwO`^3?_hp-JSdS`l=wIy!2Ez>KdZnVaV z)JJyw{N_2Cf#LiVqw!sN`i<+Od$9@OW@$_Y1?e;$O_UvlhpgN8p6dF^ZG+?ia7v(g z&Ev`?Lb}g3Z1k=Zm-Oj7vrTQ-D^4=y0&(l!&)Hif7c!+Volnm(kw(*n3f-mfx+pZ_ z6iGX2ma17*vFpZ^C~hA`xwcM9qIvC>yJ@er=gofX>22S;ds{l^a^X^n(3!Ctb7?|+ zssY;^NVNUl=WANw6msXg2;P@?+g&!0@Tys?^l0Rs@Oz8SMY)>Fr+bIyr4EK2 zA!lOZY)H2E#Pfy&M)12?e+X$A#fi?5=7+oL#_z<`YCbD#s(I3WMElbAOULDBO-Mp) z_tySYN;VFi4>?^dsbRFh<0td}d8MTxAIrP1^qA#YK0L1iV3huY6+Aa5M)}grt)D5V z877bA_Ut^_R#YE!vuJt8%IkPVKiZmr>mH~3>q1@`sV?XHh$%j0DahNE#6OaK)zZN; zYM8u07|#puH}Jb?e+X$;IhRgm@vFcRFUv4;&WToHCBKPq*{*yp=~E5@#iu2s-VB&N zRGBgoJMh)?t@%y5#jQ$*$8yryDV9#EE!cR=ukqsE1NQvE3gUHJT)`Z3cYm*XmN&(z zlRVE&aQ5KNp}O&j$MPR&1B8z#$g?FkpIM~K_Pehn`!TSPb@)s4rj<*wqn9fMzp6HP zt?`DheLt}m&D**49e1vQyo^nhs1ILpl!toh0_PZK0yDAx2~4Xy=ltY}rce;ikBdBd%~2KIiomQUVB*XogSszW0@Bg{zhSf8_7wb<$r zbiDFt-aRu+r)ycLUF779+unKYGUj%2UrE^>@@5CwHLcUa8#7i;H{Fb_Dfsm1{KE7^ z-zM(Lj-4TAFjFipCghnLofzSF@<_b<(Y*F2nB{r;@)cb-BseMeP9F-&e=xCXNwl;+nlL!1Puhrk(^kj&2u&(JiO*xt0c3-8mOwH&6iuVATH-A{q%BVxn zZgIy61N~q*(~YddE$mlV1xHH_GG36rzH?;LvpxH?gpTq1Hgo%azj#Q}aC1%A_})+7 zZ**WK6gM!VcoopRqo?(z?UEZ<*rZBm-MM($?t9g5_8APizr@2G%vNl^ytZOa`X&mJVE!%<{Z+ZFW`j^bBE1`;A-xidPBEyK--_ zGK}=Y-RNoVk^YH3&9C&yDRtLR2e)|A9=>8_TKr&gpK$8@TbKRg{Pd!4s|K@+R}>f` zPSOuInrcmC?LbrpeiD9<|uh<_A$+n9Q(+HAl!O}<5flTW<@O|HYY{JKQ9tYx3RCjcCcQzYU=8@J&YNi zKSvpPUU3Q6Id@DGhejRb|5iQ3d$v+Iw%$!5lP+1MX-~z|8h2EF)zG{$_R4dk6(+Bg z7PoXxXk0zvmy&&VVrd{!mr~+>rKDnnP?V?N$qqk{$!N+~hmNz6Wn|DE-5bPV8GJBY z+V`oJCW==b&Aa_U@Bot?v7EG&gm}I2!!uz&D0oF=?C)EWVp=bE%G7<9>&vK1{bah} zHzJ|XMk=qrBicLccE579$i;jzk~sAGa0tyCClb#oVN>Y;mD}|R-w*Gb^7~qO9=}o< zd$1w<(i!8l`UfM{+ctdA%KAi>(oU4BF1_&ZYR(?>Eo7&?BP=G&W8+ZqYM^<)3(pMo ziZ_!ehQ+DgJm5SQyTl>iaa&=WG|W|JR8_4!yWHfBu)lY`V;$2I?76Ic4Bl@ouZrIZ zaQ3t4O=Qf?NAYT+c?Y7e=uK^suzDEXuW+esQsivC@1=rc4WETrk_5;KMJUmn}F*3Mw7~Fi&Li4`Nx4-3QTwN}?q2Ws@=?P28 zdyk4zlvJok>zyZ8FV5WYIZNqGL@&p%+V*;2zpz2hT=YGx!tH|x-WZJf*zC)}og3kJ zwb8s}U8B#&j^Cqs!R8SY&!c9pyt4D1PrT8GL7(?6x7iza^d}Ae6c8+b7|_;9nj2tn zuC6F$Z!UTA#;QrdLKERtbi6ufUgm+Vn9V<$ABU&q@0@$jeNW_;hVV)X=g||fQ9qXa zyyWwJBc8n~&7qn&DOtmi6P_n=Gg468@0&t|jB$=GnHX;WfQwfb&D$_$;L6iDm}|4C z+$8q!!yE3)(Os>n^*J?(Dd|ee!}OMP$8G2Kd{|s$zf-#ZlK*)}28W1Lkc^wfq^?6_ z2DtZF9Iqal_fSa&riW%iyYo!k6UQI&q8|@QhDma4(lEYy%>6uEt;e?;J<#lEo8 zFosiOL?qWgsc%-8x>9sVjjcE}a55V;AN0|@+py1_3U^k?oQd<^mfCmyMb3j%B8%+r zd)YbdR8 zK}(L`yqnAB+_hJ^2QDk9+-WD_&+9rSxbe}b`UtuD(uaHnZ+zP{ zyXhuJzE(+ISE~&5li1+ocx$eZ{F37Y7A|_VYt`enfH*~H zvfSpNh?dpBR zp3nDPi+udJ+pO|gGBXi(lKwNH*ygHCejuY1yGACH+>iI%~St6e{o!QlV zw^DcNhkZ(3>Ye@X%hGwrwETEgNn0o@?utci!5EuI_U_waZ`On2g};Y}2&tvt>spcF zyG70}^{OgA4MKVklfI-r^Fg}6juDRvN%b|1XB|h>Tv$~@pP%8v-xr8 zeX8XjtRUW@vLLe0$I@@U)Vfq{nxQM-{lhUMJMPS@N=#5xGv{sJOE;u`DpNBbwDEZy z>inYm2IKpFw-7JqOOBsCa`{}j525mFh32(x6c#TTK3-BNt?RBs~*mD7e8X}*OYka$UDMk)=I;(3pqIj**yeEP$EJjN% z%7;g@)NpqyEgjjImZe0c`;L07MT(sK6NmV|JDS4s@?0;}Z2G=?+3o+z=0eT8l_u}D zN$VaWsSw;b3~t}3TCK}jKb#jSuRJ^umUhiU;`tH#*(+&IQG_B}0^oso) z=dOA1oPWfq?IB}t|8U=f;uV`|qJ4W<@1;jK^o1_o4R)s3uEy}mTd}XLfW8F9Ylr3) zZ&XnIsG_|0oc6Ht>|W}8XD>BN#e;Nxq(5)%?BY5kGuT&0J2z()7p3AJx{7^;4b}Zh z(!CU+wf8gEsM51pQWUQ}ns=9>?1r@Hv8B<|#I$BnkMwqZ(`pc3)X3Pt`8NQou zLw)gvcT>YsoQ_9X8@cby$Y|6Lw!XYESRNm@Fz0#%#p{6PmF-}t`5xQC6P&XYB2vmK znA=_Wk!WjCVwe)cu2?_+bF<5p7dpOGuw41ne&vhD?)hMWm^hyhj|Vr?bWTnzKY57a z#iDtOirtozY)>c=$L>?MX2Wi;+}joF@KMOL{PIR_>hO<^Idx$(!gjZYlP1pOk_LWV zl-Id`XXBQLvMFAnPtw&ip1hw= z-9|e-*YoKojtE!l(+i!d!Do7-M(4eR2V*U3=@>+0-#^%f;&npvj_OFH-jZW`}yXLhheSFkKZ3YNqRWYwg0EyX=~Rluf7*f z(T(t$5uH$m{$Fy=~`XVx$PjfO1znBQ99;HdCs?QkH&=ZjYuM@yo}AW zEISNCD=7D~v?QMhUC!I$B6_Cy)ln3$3z}Ew?GdTV-6V1W?8Q6GIGbHea#UM)n$qvK zq2ls9{Hf;@U0cM1U@|h2t$VI!Owq?$g{;V!6){{jz ztQY-nb2)I-&aF}jiRf1bfiDW5Z}ZZ&)wVIQ)%tilSG@b%rJK1sY0iJO>+Rj6=7{@# z2*>M%=AD_jyqV)jW9Z7jJM)6tdbKEzCoH!q#2;cwvM)(dW_ojt-7Bzs6a7rQm_w)M zeGIGLy=*hB)QY47Eu7zi)i`k92jF-T2XiO*Ro3l0~t3hE?|G@Yc#@L-B94ErdX`{qD!)Ex-mF`_(MJ+^ zf{pG^ev8|*tx2`=a^>>Y50Vd94%CY|*w=I!Es1ZPF(xUh+CRf^Vfx2Qk5%=1I>&d& zZ%CG!I9!>A;`K%I=3fYZ#1>l8dw$E(>5{O<%XRwIKm59`v3nK1OrH56Mtx*yO1PJJ zz9xLIdQj@yu93It=gI3VX@$2QaR^_gPpb6JPPW_WHiWa`tB;#6 zm-mt>?1-~+NM>Y2#d{3Rdys*6f792~GjpEl8*HDEaS6LH^-RY9I3{D%E>ykiK>BuT zvV()tj+bOlwqZ5n^96yc0rYj@9Qh4!)a_G`XU9LhY*Nv*_&8G6fOdQ(f}1q~unZ9SW#; z1JS(k0i8QHzRJ1$@MuU{Q&OyUqy@*s$YpY|O^5EMyKr_&R$rwT%2hZc9{Jhj3YUkm z((Z`FShngUiM?2@>*P^eao+sc&d04!ro1^V$#>Ma zFXL2vryt@AscJ8fY~rI$R)P5(9hNeG>0Wcn?KI`NbRj#+M0yuoPRhVnY@R3%#- z!`TYbSdQ#TpO9JqX^Y@OzGG6)KOGcWRN-ndiSs|Oo%6$lr()65j34&ATpR6{Na()4 zkWpExFhTJiNApgXBtH{fQa+No)S~xVeA~`GmTujHQu#TdmrR;tfUfX4!-p zve}q5(I-+1&N`8DP~>Jyxc3>*e#w37#+J@O)|AC~Y1v`EBk9Y+#Q}EOXBP!eNb_`< zVrxsyoL&TTqTlDk(7bnJ?QIUmd=9j|7WcQx1Z8tfu92`8?tXOTH{ewDmY z`CD6=f5oG$LIdk<92GW;iVvplpD0PMcW&)Q#d`wHYuMAc@U$YdZQufrf2!{50|tU6 zB60EjL(}x0mWC8|WJf|=rxpgfBS#nYhU){*D{{Cz{4pu%TxK}7IJJ>J|p3YlKVM9;iYD;*>f*ubRKVtp&v=S93}GB|G~BPWr^t`&sG^(DM61$8~=U5 z=^Bpm&s%bLinFYufBzu@&HKrUxj8vxwERS}oSF8PoV*$glXl|E2u<q!KYOjeZ((*!uX5$4bJE!?iI?boY9yL>_os7*imoPKUlF*TrYz~4 zq(jvz`Gt};ot`Had# z6q;96U3dTG(xR+d1-iwvZ=7Cq(-B*&4h7iqUU@rnK9D3`jPH&|607KB!`J(Ln1>H}2e?p1-(v8O0lo<_)lk#d76MeSUD)<~X(IlIws4>vc)aT4JY*7w5CD zCtepah&3J+Wtm*sml~@rafw@sW!c!?>a(`JYU5`PE7?sb-WW8mC&z$kOi0Z|j^O|@ zZTSg#K{nEHrNliguXYL=8y~7Y6J^AtMHAfC?5DZZ#``fpG^1;zNs-TN<-WOsW7*O( z_;(zU?=ND}yhkS#EamSF?6AEx`snFkenM2SeRJ>*B6WZHWXra8x$b1+)dUtjN%I*?46f61uvo4kS(n>3e_avG(?BkRN-wK=E_SqvpM32%+nEu?(R_&74 zW2bI6DiWO$eYeF{YvtqS*3w6}{C_;#kH);rlLG`Y2)l?xx|fi z`7$h5^3o*P&OR3VMDH^;Wtx4le?0Y;%4t-*r_sE1nP#Q0oEt8lV&GNfNuH-xP0O_; z6WY3;iQ9bJjw@+-T6J1_QMZSNR76!0OWs+mg5o`c=3SUE zx%H`+Mb`B5hcL6E^Sxb#ym4Dpp7*i8q?CTE#TgPFWy$^OVj{Dig_lO`iG}WZeLkYA z`Mrxz$Z6`U$6NYQyl2t8k3O-+kXO?g5sApm#3;^rHokpoK5G!-7AVd^d_`tbTYSfx zyq?lT;lMYvoA_4Z!V7MD7e3Bb(zUZRlVRCQzYE2C4$XU`=D8hq@*b7sT?X&@v~zqG zs!XpbnP_G%Xg@88*hyk~aGYrD=fpe50%F#Sw`#;_`spfj?s`=h#0xa{Ol_7#KR3^# zdD&>9&Dix!+eVkEVvB48@yq_})0-ada6#qa0-85FPqq3zxsu`R50NGt z)=rJG@KC$Q!J7BWlb-Y}#P1Zl$hFjD_AvYH%bb(^JX)KcpGc5DD?#zjFjqT{^>N9a zG8AtDnm1I=^RlR$%Cm~)wC>u3d-2Pa2M>4*UkkfJ?1PlJzvGSDmn5Qj$s4Y5ABka??$&fGzWqb9Wt?$qY+E6A zb9RmYbbN$X!KLYImJKJ^`R{p`nszLP6->`D7Twk{$X%U#N#kWat%!;@3C+u~aNu6t z+1uh03=YpVGi1~I`6kjPNSIRF-oEj?hJNq9h~}+Q zEI;&9cXrdum42ay?vVhRIi6#A8Zveqx=+sQypF{9ILxP}UAohUy?@R!i}N*&E5@jK zF*{o@lG$9Wo#W~hDi5h>-sWB7lE-Qtl6-oC%Pn;=$6j4r>`*WMNbgz1euUe)k1KHL zsrTn}5fh?A-svj7okW#e3j!qL=p0lr&8%Mg%=V#p)6l&6GJ-`eFEumC7SlS;$Tvf1frT%`5Fm)N)cu{pB6(D9_pc(dCqtz51VJ_sZVAX-}WK zH}+G||HIy!fK&ChZR6XJF=Hf^2#I8#%M_9+vrJKjZJshuNrO_NdD383C>hg0=0Y+R zQISYyAr%e$uY2$9vEJX0=X;;`e|+EjyzgNh$7yZrT=#ij>$+Vr@*%GR@`bqnq2u&RH0 zEiPHin%aQ<7~9r+*m?I&tZvf5tcPTV<#P?$Dgs|3+WT%FV4x`2iVOQAs+YigQ?IGB z=hoqTUiQ2>ZMCvhp3<4)NzJLnG+c#v!?t_X9}2PYa0{!e6wXbxTC{~(O@)afVTZDX z?7Gq0KLU7LE$$SpcmLgeV&_N2s6-LTd={G~H;KweEv3iiR3vEC*R9FXilWJs#g6+D zu)3Rej|Tg{jI)z9-5AyIS&=2Yf?+S^9j^F^Uo@pu=L>>WEzWH)>vUef=diTu)_eM!ANhF8>T;8*U4L56VV_&P0JuEhGf z;K?h#o!!MMf+Ce?{ZBu896z&Kkp6xRS{0#lV>kbrSbd#{U_T?F20VlTJ=d>3U zv5=SDEYjt<{`b+CH3`>%ggpwz>6e%BL zFQ~)lCS!GnFZ_y8zS6%@xV3)$ktqq!Jn>O&xyX@6{wF-0PgR!m3>`1hR_W>a9UfZ5 zTOh4D+rB^VX7_1F)vLYgR5spZ8kroWme&ON#$vTF>>xu_!O3 z(}TX<*|YM-kEtvvJ_U^_;jO)^haF{djyb3||ZbIZe~J}*3k|43Kt zr#!UfRQMZJO>faR6lPI^Yxm_S21SYTn$h%qk&o76Jl@cubj<0cf$0Fo-rHE+SIPS7 zuX)ZKoGfOM7<#KV(a-e#%(j*%Ebm(6{rOOvnAk{^aw=vB#xz4@&2(GJ8p7oT6#RTwFhu|B(#}rmEpEj!;kUf}EULDV#T1K7 zd}_O=Q@5Azl8aTzb4wmQPCAIee%NPlmnFqtIl~!P5YA>o^fG3^26n& zO0VqZT8^1s+VyeG?FV#>f0gCb?G4YP7vE^1-94UKn`Vr$_bygfz3y!I^tBm@hPgm@ z_|2Hld7X&MdtWFuK`T-9NH(n`-Lb*f`5FMC;M)5!7CXTK2ydm zJN_t$J6iZMKCbF5hkGTzdUMn`LOU_szKa zZ*3uGxeC{`CbKJLz8+%IpLwq+$f{uS2wRVHvAP}wjIn8RICn?w)q11U(@qNVPTiEVP3D+Ld9(*Joy)OTx*#7EQM@@v2L!NhXGAYE- z>RI0z(>;{mx1CN5qnnS_<)RvWSCM^DRCTk&(*xHXzU$UecUG`%)_oc+V`2Q^wMy>Q z7maHTJs#+ouw1F@?`HVUQJYkMn2paqi~r%oL^U{T=OQ7KSUH2j8=( ziG4hh(794x&m=L_SNQWJ+toH%+8gW>^@(+i^-==vx*LkK;y5egGBf7Rc#a#=WAAG# z#Ofxd-BR4@mev(@@yRoDGt*Za-kqIEr+K^SxqSVhqk9`7`*&2VzDpM2^UE^f>f?k@ z`$#_0N`W;`1_DKlIjjU7il!0IMTZ?vQ!=7to{D&J zM(T%;G)t$XO{oxW{c)=^pZbn-+0$9P`*SR3m_H|eXw2lqv*Ik%!Ed1wj}z&_-PSd1 z#Qo04=sv{iHtLSrY!yAA=81c~`ck`f;gc{b->K3yQKwI+Z>73d!Q5UXa^1D-?$3uQ zOsV!CW3CE(eo=o!*Lbtq2?N{K_9`=s?jx*j3#;ijo-2Z!t_wMhyddJLc$E1?OuD-YlCLGylQMZl)8@9eZ#_En9cv%%O zwC}y3l^Ju7T}-RKEccRRKBZ|g8#sl@Bk1<$^!I~xycP#7H?k@t3U=kU8MK|Ue! ztH@Jq#UAFn_jpbVpET-ESE{`qslRqrs`!N}p$zQ0Mln|RQTtZ1GYR@(U&hq7yWX|V zS`q85N*&F$h4PD%()lyzk9}S@Ic_4xm8qi{6KSTa^vvzf zvB8lsZ~cIFxYaj6+;GE@fg{(|G-Z_o=dLQRwvVpZMJ>J+V{a)|cc;)Fj{8if5ADkA z@XQq&+Am^m8+B`H%~=0vVJCOEPxHOPJ4#vaBNY@oz3T37%zi8Dwddftk-2 z*4{&b(JjO3`b$<%o@0E|X~+Kpzuu(Tz1|~6;;q!n(;{CT4TDSzjo7=|SKW^1`&DK|VC5#S}OF0w&`VD;2{7s3^K~n{a)+yb&kg zer*%cpsd8MgI8j8AGgL8O`K@xlem$WOMTn%tEr2^5JPbAx_iOdYxN~-Y~3!cpN)>% z^W@gCj-SWZTfJ%2U@&GapR29QoZ2;lO`F`n${% z%B*6WuiWqMHdMWOvS3YbjO6DMY4L&IG8xThCFn}tD`#7#u1!~@=TEkkPZZ{Dw=}=Vdb)ep^!9t562?MTWvx3j4C>lzIQ3=nzIbUJ z9Mlalr`tLyMRtK`vacJU8> z-n1!Ee$zLv4hlV(wG;Yen*T|cQ;R}VNysq!qSmJdCc%B_0tXb{O2z$9?^oI^XI%1b z_e$wVjP47pZf^1jci}C&qdiPsx{N)|JJ0m|N_wkw>gPI>ix)fpB)|Wpt*8U{*nDG~ z&^=Ul;pWyhhLieaK9;zqx@&6vQzx7-y7gGy#+RDXWBoUeQXbDunkveRKP*3UYRW1? z&&QWjJbUj!T-tQgn^!N$omQ;>F?)JLaLGpZC{a(#_x=^Oqxs*yhGOr-dx_Q6cyGx4 zGy3bVpa<-=Ow?No)gQhbx-)#{;)}Vv@U)5NQT^?GvkD0=Dg!5PG`po6xw|`=n)Mvf zzIVsWrN|)W683xa2CVMRJ;obtwbt2CUkJLL{Ptt1(yDKRkNq~5i|&})Pvy1cc6byg zUDW1^H7A(b)7CVpPuzT8Ce0apd2gEvRqD(`TV0GF8nL>gx}SwI_Gotc9FhE{nVXx$ zyJt>=lkG%e+Q<8j-i~nzV)xcP>hpi@O*@ojmtpJeB~m1Mg0qM>?T`G1m3S`ec8qQl zR`>4JRcaw@Hx7DmFi9Gu8JmPxc2%c8$>KZ~v%#U-eA?0L{cO~T^;7<)0h^gktb1N; z5_);Q@WSGu?Z!^Ok0;?iV57OT(P%Ut8a`e`Hn&GMXM3y!0z_%gOua!W1)y z{5rpk{%)yr51_h1X;NEe6sDM^_$707@3Cw{C&tr76Q8i($F^W~N7nt;u;CwGGcekP z`~BNOq>%jJ(;G8ZHt%K*zvEZGG_rluQ#+R6BTVhr!^g(c4S0K=-xp4-P7t#j(Of5W zXk-J%53jJg{*+&6KkuHaXU_4+2~%>a4>P&==K*)+vGAX*;`#2qKaRT(q!c`w8)(?q z+@@%l;!f{SVz_CW_7qYH z@2#5R3cWREH~p($n3WB_x~Y!;^|Yuo-n;PrAm5fW*F3i98Ka`=rx@Kwbn0+ zm9Gk;TdcSErIj2Twixg0O)2#7r0DeBT>8cH?9Yk2ANY(kdR7~LI&XjZ$U(h<%{3G@ zEf3w|+*|J4$LO|Ub#1a4Ds8KEn}k%24?ec<*(54>*X8r*jdA1Rwb#neKJ?FL61MyH zn2zD@4ZEiIj@vW$Q@*J@Ty0C0X(=aS{p;I$jP4t(E`O60zIvFhOV-qW%t1*id}U=g zeXXTe3em_=P`M16e&~+|!k+Eaipt=6#S?RR5 zxY3T#uw32Y1m}IPAGl+5JFvR)u9j*yzQfWs#gt9!8SCpJQRR`-{gV{FruDr;j>bJnI^ znQpniP07VnyKB5@4%%Lr(G|RV=z*XbJ+0u^oynOoYSvH9m`2TnH%e?sOZ>Wd!r-Pd zM)w_7cYDqI*z`AU=5gzqnqGCY*f{OjJ=6HnK{ac8GJkg8l{nmWmQ$sZfl|jB&#Y_$hx5NZ%KGh~1{@m(7NmSkq72Yy_yfSBTVosE*0`hP{ue6RTTx_v}tO zht0Y)x9=UhCt$O-rhb$A+S~CgvVyygj~ySmq(9eQL!BlWIyqYy7MJ;`ds5|nRcc!; zUc7{V_>_R(EXEIASlvdU^#0+eIl`>gJb&)A-HNrTTs^HORI3xXwcX{C=z1nOjfd~X z{Ik~v+0Y!g-@>UZ6jv@z>tWgR&}d*Ai|rLPjP3`lu7qIw%j#Hph7Dz8gN^DEX@|Wl z81v4E>|Ph{8G0&zIF6m}OtUiW@SBO_MFTgwcuih1Q9kkSl(J=Yr)@R1JBD4C>&EKl zi8fipwpy%dh-na%lcOawiDY=7W=>D(^<3vF#3yAlpcTr$c} z&F4H{sfv3`uXwa%H!a5Ak67JP*|*G$xApil?_Ry7Jxk-LbKoQW7pxX0o9U@Pp044# zzVVp_XME%M#s>C8=~WlKYf6lTDU%8YwshROxux`>;{l9r4_0@?|H?{{n;MwvGHu>R*k^69W3f4E-pX0IBH&e@luVvu!8LPK;o%87vot(dlg%^*c$6N zV%MvCvAP?48)&({#6DB>9AXfC!{?mP|LkCVgahS}g*#)>^<Z1QtK3fb}>j%a-p+w|b_ z$LOe!$9Co$4t(BTt9aebKZ7CA>Z@q0;he=)xi#+nd08jcj`0pzV08Pix?=k%T&{Cy zYs>zM%_yyn$-i1_;NrG=henT5VcB4!r_Nnx7u_!o9!C1VKQkHG(#hp(?mlc8+#!GB zcA)3BxmN7@`e&@JN7tW8vVA)a-H%~t{<7tn<=WeKJMU=j;5U}<>%QRJZ9w&Wb#H-Z zwO209#@N2E)9&SZG{FMiF~>v|q^8AnS|4NV?Z@g$_oRPa<5*Agm4ln??W{h|fA&ed z(T)wf;9=XdNDChOmo6Mpo$ zyT8XXAMyO&Fp$1ebbEWMKzJih)sZZoL%rilDciC0p&_hpamO|nJxLFDt8&-8-@nIi z>~ApQ`Y%69dXp#S1j^0jEUmd+SJqp4QAS8lBObw#26gKwu_$Y_`i zyyh{HNtii)wnS~_l;v9?VT|qwR(Dqo{Z3iix|?!!9*uL!Jy-q|7dRhZC4ZppUh0?K zb)1f>d}cPqlN|nDQ>IsBQz^vXH*Mojo;l9q)mCBNRNMa>qdSV#eaGJ&;@DPSow{M{ zLN&&Hvz?+`GOJ@e;;wb@E(?=>si)?Em5W?U3utu9g^zLv*`B zFDiV%=#F7^r$c;;1p5>-YSvYcX?U-Gy5HdIIz^Qd-x=Ohy6NUthj~Q%&pc}yFw{CR z>dF=TEld6Uj#T~lB&!7cq^X+Ln=*{<7p$&Q^dwtPo%;JnBiEY-$pdtZ7=r#=%zUJ3!F}mYe-Aa#4A8(DV zR~~4by-hwIR;r$OHdwc_{%hkevlN!7@Ugrehb)d%Y8rX-Q*u`ts<(?6A1ik(+VR2j zWi~BU_XM`xnZW9@a|{i7hF$&Gqy0eX=HSoST5|IoYSk+{eh8eO5|@8|@{|pCGmis2 z%kO|m@JF>uUeQzOhDL8THJr;Bbr}dq!>%h&Vs-CQ4KX_vCr|qJ+&El)VSCFO`BeQx zMyj*TLI!0?=*$J=QzMuY)+}7&JEdq+A%{%Un9cGGHrA*@&a!liSI9>+sbSvqNp6$QK zDIms6L9_OP;d<=-4^voOZO@>JhVt0kCx>n|4e&jAROP7EcHk7 zk(6N*cdfp+zopUlnqAm+t{+%k+SyCztIyMj^;E4&*OXUSr)B8O+CITanLquk z@%-%TGK(ftjOeH+=t}O?CZ!fUzZTxYn`=~AKVhv9h5cT78moIJdTQN!PLJ|fQOVCo zOsE8KX3|o#8KNYQo9%0<$VhGZM~kG=tz(; z=!@lFtN2lo5IFGdp_O#j##LPy-Je+9XU~;v|43XiAHVIkJ(uY?ErY?~M_j&_ZW?SG z-?yr$N@^9wR(9P`4%2?d4WArvGpyZn*1tBZ+-VNzk1Hr082pIQ{e{*2pmnW)qPwx@ z)y7jBPW`-^(hziLcgl)mH$Q*8z4qD)b9K3@;e#$+KSCez?5DkE5-(KQYj-QQT<>Wm=TOW$m*R4zmcm2GtAG9-_AQ-0@G>rao3R4)?dj2VS;d|!Q7 z5ypMleb!L&^Z2W`#?HTrSo4W;15=}NO9y`$-8wGU-sMWoZbH_{a$Zs z+}R)0a$B_zyU}<}%c^ z4vrag>pu`~{!+ZAc+-h+_k;OIzqT5$^ibZ`^&`>X0{xxV$;k&R3}y^WbrSwOvTH@62gu93I6W#@G#Mlc9`2W}_W8BrH85lpEs^9)J z?9$K99cORA>Mw)ksJV9OuhSc&<=R{&6U5tDMpsTrQy*`fX})7C&_8=bOt!Ii#(qO* z;3|wR8CF-v@l;J-9eY96&|}ZyIo_AWx%^LQ#OUItuF7_*O6MqOULFfKPf&j|SJO4K zw<*~*%G`9Xv6siw{e`9k*_E`JyL4Q$(&-RV#YIDfo6z zX_(-PrVn37@0f3$D-eCn9LIa3V`S{)?6aHa-!T~lrI_t{Dcp(ueiOA7^Bd)>+D^W^ zua2y*nGimSv+|b6QHe@vS$lAzai42kQQ;4Pm6eq~bCk60KRYPTyqFYxrcdu^!Ot9> zH#u|D^I&3*G{#=kR?KgdU zYo2TqGEoKRwj{siOWu7e>}JAlYyI;>BZq!>?w!KuuE6RhKe^^&$(LL($Z;^0fmdPf zsaXu!Ehn1WYdjvv9zB25U&$+c)2;oVyM6o5+pw$(nY|_cX4mdtuCWo%6FBE2Y|1gZ zXsu^{qx2sRd_C5uSEDY~_vh*cs(sxZ_pYlMUU)G_yI23N@BIy0#iKO#E%bqJn>gtr zCL@enRGt&2N<>1^FqOz{wnXChbNx4l1XC82b1Z z_OF1Bt71*Gie%YG+svIumxXzHSEf6TyZC+B)k&X?X#FN!Btca>h&ci6jT@@^K!US#|HMrjlK=*11=(%+QH zcPncH>Q_ash|tt(`cu@H6HdMwbz*>-m=dPgosKY`^ifO*d`Nyj|}p{tg9XmpYyrLXH;zv znR#8Zcq}H;i7D?w#N{zH(f9JFr*yFOmepA~8Ot*I)YF&L7)=aLL}B|k^jod@jgsZHs>{mMj%vy`6bbDL zlqVG36zHqB9n)re{a9w?)-OcS>=1=;T@k_6E&*5PJ{Bg9SJ9} z_bH&hV}7Hw)cT&e*Glcx!=oufeJ@Km)tdK%*gHmq(?tF4VP>*fcx+mfyfZqSh0{h;FfY>2}^ zVxDrJ&YlF93WGg&ay2NUD89cr9n|S6{@mA4a#G-Di=b)0i@)i^7K|=>hSK~-d3B9G zL%+T)qgdaHoGYH{ryH!U%YWwEJ3gg8tayLMdPBwJ_Mpzkma;idwz0fk7kWUm?L~S? zTSx1w>FEHS=gp27-PKrK_VB>eJ2XMx^6X<%_AwTn*Pok_-Tov;Dq8ITKWz(#L|=wD zYv;-LgTmeWDGpsY)2Mc>f6vH(WS=uN@2R(${%#mu4y;o_~weY#J**(K_PWscvc%3R^cTI{)UTJ2eXPZTA~;KMS>4}QW_*mdPK zSlycH&E%QcNq6s4Dvn;TYBQ$xe7gOYU3qu%*+}XqtFOF1d;A02+#|Pg1#J^e6S7#P zR3oFX^mlH%!tA5-YGP`!^9!_QFuzg0nvN_foRspnSDXyK!ZTf&!gu7&bf|RQpwt(= z<|6KcXT<0)G=1neeZI$bU^|P1iio>OaJZ7?x?hhDjq;>RZo&8g%{}Kg%9LLHU)5Qf z{FJNC{7RtIKGwO*>XMTHeD8dAm&vLZ4{nkf9?QSD7O$|H^_tu!I$v+Kd-t|{898Dz zvFFdexp49@npL|$im^`x#4 zx~qo5&ZXtO+p9DzO?nN;7w!YufYm)Z8h#A2?}qI*PmSYB$|+@U)npM(;;KMrf| zuCQj^_p;WMdc^4B=!Yw<1H%3JT-bgSjj`u9${&$7CxXb^C$qdLd`=J>^u#6qq8zgW#< zXXMUl8oy_A*)hb7#*p*(@9<%DLq~uAMnFTtoFupr_q_bi(R6|7V)pu{Q%lQfYUTZQ6W{LFoxbmmjNpCjX}<-H&*8n{(aI zc8^m2Ntd+Pd8x3$mpyD3Ez8Ke#@_U%D$DPe6dFuMpY>&lmxa!)-N-Mc^3~N} z&L}bs7d`rNd^8S65$I&>6BO)gewD3TI&Apk1-~m1k?!CZA)sPJpIe-d*}Q!^G0nuD5_;$a*q}nU&y(Lu@|+) z^Bbj_7ZuLu_Rer_3-3eZ9Zh3yDRt5#VV1%7kepZK27GCDbt$u}|E+Lfq(Vnf{H zUnNJ*@LlgYu&c|eD>hCHdmji|vz^~4-Lr8*$3N`WX)WI^k+=8D>nlH`p7l1J-k9EY zC4LRfd6|(^_K!?DTvJ!03(4Le7aZJLev?^l4VCp!tq`R<{m*L{t$EG=343UUae=P> zcx0;s1>t?hk?8YZH*}t_w}(f754<~*lJIVe$iJSm{QrNi2T&P#*?D=pI>NKV83^w+ ziA2Zne)a*b9*#IyI7W}dMgI3%xt#mIiwB6Y;o<7#5AT*=LwG0da%}v&6wb08|6@FW z>XDs;x33rMkMZMhwEvB5EV4yefbh<+NG;ei|2Nw5Kc)be4gC)uKr!UzClX@k>4DP_ zC5|Kh!wJj({8JCW@R+d8@Bit^{|iVIFMfE>K)f%EFJ=Glj3baQ=kc$)4B6-4=ZE)m zz~M&ZiEZP5Rs*FaR0P=DyLyRwy7~QQlP-E5((}dpd3yxnadq34$K#7S>HpzD6jL;S z|4DTf#gMayw>@$brTTIokNmK_5j}un!_C#-75#Tk_g`yYP+Ihxij^>C6w+IcE9Ap} zWkde+@x}Z5yW)MH8UFA0AG+S-fYlH$DW=4J6&(u&pco=E`~U9)q-O#;NYBB;RTOo< z=ve6q zbPhb45Qm3Jv$YhvjSj8I)-EZ z;~rfHD_}S2m=x)}Rd5Ww0}ACud`3AA#|EF#`wWnV4Cy>}_>A6#h%{tL#{@|a%A`b@ z!bYbUASI~`MY~iX!#U_oWD6=2R8FW|P&pvKBOf83AV0$M2+?o53D<;dL)VS26WN4p zKz1WL(Q~v*08as>fHFV@pb}68s0N^C^gajF0CE7ifIL7UARB<*nV1Mj0we=c0I7g9 z0E#ycfF}UOnK!@(Z~y?0wZXy9&T;UVJX`=E5D*Lq0ifTyhXKL?2LTa)Lx4!YVZaf< zQNS@k6af8R{sbTza1w9|5Cb?3hy*(h1C9cs0LK9*0MP&x=Spyn3cwjYy8+w*9so~( zH^2vQ0N@AM4?y+69`F;=pm(jH_o5Kq2?EDZeV_nP0#*R10ki-*06kzOfB|3*X)FMi z0B*oW054!20L2RY_8-Rq-~_A%py$*#0Ga^xfR})5IDQBA8GuYc3;bUPcma3`r~*6% zlmZ?Bo&bsg1%N`peLxN%7mx+G3%CPF2HXVP0$c}N1)Kq#1)Kw%2V4Zi0nqbVnE~h- z_h$hi09yb*0M-A^03iT+b~bv>HENqseM0R4sza#GpgMx;#3#_}2Mhst;eSrRH~5U+ z7lhgh)HYZH_5$_;Q~^5xY5;YB24E*Z6R-=Q1<(fQ0CWL*fZYInfC0b|U<5D*m;g)x zW&n5u0!{=V3J?Q`10(>F04abpKn5TSkORmA6ad=*+X0GzEU>*1_Dz5WKn0)-Py#3d zJOJba@&GA-R6qjY8Xz8E4e5trzZLeVtyTn}XCtcsQ~^5xasYXN0$?Mc8P2Z+JOrcx z5&hxC^iopbppuNCIvYfZ9lHfG$7}fZ8}qfEB<5fZFp`IIjk98a~GY;sAnx z&v1+t_NxG>oqh-Ze*pB5fZA2mJ{kke0j2=dHlnr={f~e+adG$qTO_(D*#22tC=91; z0ibwV16U0}bqe`?CG1fhBm;0EA=uBsZUQh4Kyi-zi^>bNm6QND+x z052c|fMOWMvN0eNfMOEWC&XOpbOAa5Ljcm>126-a11tcR0Be9PU@yQ1U=MHt z-~q^X^w|Y~jw84O4gkCXo&Ya^4G2k-|30)hZx0Cc^ffDk}9AQBJ(I0QHfI1D%f zPy-+zBHuXx&H|8cP6JK>kUvfWVgPY~Sil*;c>qd-_)7p(Ug-aH0J`Rzfa?HM{_|yv z&O@K$0XG21PskQjj%k2Yz%4)`AOVmBNCu<;kmkG&$_MG9m_o6Fj-yyXF*P4MU*Pi? zU=)DTasdhfwSX!Bvab?Q0YG_j1Ihp>HcA0c0R@13Kpx;e;4UB=a1W3R$N|h(Uc{k1 zN&rs)C@=K?LqHMW0pJnfF`yVw4nTY&0NGaqcn&~*s0N_?=>X3F$QS5;v>yQU16lyh zfO^0SKpmhF&;)o1XdwOH4*L!ODvLJ2Yrrdj2cQ*z_&0!efVY5NKqufMKpD^tcn=5w zpyTKm!UsSX;4=WFLFf07_ITfp#kRQ?5YCbI=eEto`Ho+c^1JD=?o0bRuM`H*yCPU|8Qi$d_|<7%^uG-S3?qT-_BL{F>%=AuqY zW%8a6=SYk+vA<#fW?lWJj63uj&H^JzOk)IU;F-uv$tfIm#S|xL$TZ*xI@go5p9wxX z(YxsuC!|pjl|}i40<#j%_%4zYY52J_2p9=*QE5?0al9Y#x!aFSBg5`9-_B(E=kWDupsaPXn~`@WY8deJH9XDcFMY zks+AvzB&3lh`VG}ydSG;> zYduzcNiij;NsCHI5b6ybFbSI?w+ct$?SUa0O{jG&z*P7pK76C1_X-$!qT2ks3Ir)# znRn6t3?`+Kf}YsJE)*Z+iQBAas$r<) z(1?!-_92%KXwa9DUnVC*V@t%KITR=CYZEKt#i$$x$jMO9p)0%!dlWkZhGV;}d};j1 z$g@=BVf-W8JG@KdP&r~G zB@yKh5rS&DWDkvUYkRM6`?Fgmz!H02*FWAVo5DySWu!~>M(pNhF zb^vBRCG{ZcuSMi!w&J3a5@7dVV+R;Q>`49NO%R42@3ffGcANtS1vNyXlOH}1@8$3J z@az$esIllSO0o!uQRIYN3Su0b6SImHC{$8lBfAAhR)OC<@DQM|#VfW9)G<(uFI-PC zoPj(W@i4%zM!r>&4dNQvCXVy7Bc?I#S3AXW&LwyuO%0?$CCG7kYe?t4KSK+QpMQu) z0OX`{%T9_>IjRi91UTFIg5aZ<4zEjB)MPI({&-(M^jzDCBUW>_`N(#F1u{@{P#cXX ziTNnok{7@JLi2$fN?Tl12CicXA3*)Fg*5BHwkK?>S#8c-J3>hYZbPodg#d$Em%_P` zNxHRln--W$z(C6!X%s&;rkdD1yTB9xvjG??{}xA&hOgucObaPZ{w7Kr@qwsS3(N$G zksl8;U}QegyudK8AdIXdW6u1!QN+hGw7^IL!w30H+g^*1zEL-~z?cDpEcm=*6U{eu zjj9F44;UU`NZ$(=S#5KgOs2q$zAq-Jl<#$qRwjhl^92jUTQ5@U=2F06jYl?5Pd){6G zBZ(?%793^;rmL&;W|m}$0wo!tVnK+MkQmoTig%=`JU=fmjU=Z3vj1d~%J(M=%tsPa z-goZKDvn)07MQOjMpm!>LDKnx&;@1%Be8~wtHtjtqGEywnYUmKiAm0ga2uo9)Uv<` zlbC4AyDs}!wgoRR$|Qz{MOpYE*~R(=#t0bHGu2QVUeO%ztXN?1BxcRepAyD(viJoi zgv3GI6tgUtnrU z%!TbEd~UJv(F;r`iK+P>$sL|*c42{;0EQi|=hiy$$FBw*tQHt5XkJm@Xsp~Myq=5Y z_5!n>#4vDZ4BpBPe7?X)l9((_R~uiI%{LYpEfV9gKY6b0+@l=}j4d!6kWX_GGgp=1 zpuqwo1=*wihgv@@$VX^Qjhswg6uM1lcXWY4wZy4ICC^MmzHfnX1P0Z{n)-&JwT8B$ z3k+JD_r=2)*7#X%J3ieFqE`kY9-_Ac(!dBRvdU8Y2i@rhX9#gkX!&}8L9KEFyVj1> zDL3dFp)SD43T8pTfZ>ts%(+iO&v;#3NVBxne;^IA`eXDv|6Kh#8b|}91JswS1_z*e zdakIl(v?>tdckTbU{IS#{{DFQ)ss?Q3yd)^=t{jdd@XHl=T}%@{yO4fCi8`J(J14u zeq$y(3JmhGBi=s189W2n>0u?q}G2_x0Jz@YZcPtVbW5i|ei4+YStA)QLh0 zjXDh@Jc{4v<|7N_zyj!lmnc(U=phZVEiNg~?9ahQvjsJ7U{J(gzsCP`_l4V2z@YIc zq!9)NjbZw;L(ZA^9Qd)22JZ*Y0*0EE&au;Nb#b&LFyJ=iQoP@R0K9Jqu1)IO07JeY z9x=o!jQ0!hclGeY1#jtI7hYBcaZQ+gKt9Tl52{(5HRotMqjIuRXI zYA_!BXYI}tNQ0u6Cr~HHmrbV((uj*HAPcHV3>WW5zA{?gN5CK-K#Vq$7_*L#!mQl7 zp@cL9AIv{l`{a!_bILs{F(XK$wZwd^$ZovT{E>icLvtBWdqraMYY&}QbH2L?7_b>J zj(EI}h^rs2gYV_0V_GAsgnS5P+6igUm6kE~XY9&%M0Fdbfsw;!lA8Qwk&7EES&`q+ zgc9nU2R_gX)eHEGmhfG-01ago5|Xb1cuOtXaIxCr#3d6k%PQ7m>fnZ z1h?USLIZ*rx|<*09;5DsSsPeQn4c~YZ&0QJJjA%(WAsAbj=A7Dq(Nm0-jN_NyTVr` z+1nD@H&TrHh`_hkcK-M`e2UajAt#PQ8qzEj7*|hMf7~}4!_$BK>b3xbq8H*#U?VXf zvD?aJpQG##0)y%TuW6jgxr zR(uGdftwxRo%-R=evOa@W*IOmK z>WgC3u3}^LuB)8i2v!qX@Y2m@i1DV%{^9DjQW{hWD6XLtf?Ql3&?;HIXWWkzgGo&i19idG4<8JT zGVab+^S36fLvI$+kZ&fA6*23Hwxd5r%0S2}HC#Z#P?M}(NO;D3SwPXqy)Vgfv*0K#fucJ#~ z2tHW4u=FTk@qQZ>&|g>CkOjoby>zenMud1hT@SLD9E{TvAq~_xR0{KNSc>b2 zVVX&~i^gK4s9L(8>jkw{-~)qu%|WAYI8jfF>H?_Q`8xZ+5(b`}X{>cmMb|T6NKu8p zVuJ}{WY$KD0*#W~BT6FrO0jj5Z-3LX0lqQLt_4>se&7e;|z~-q#rq z`>Ax+8|3Gm&VoltvqLiQ9kP1Zv+BAr})Z6Bt+|SR&#f3Kv~ZBt+s1lG?hALm#sH3vr-^Y6(Q*B6W^5Yiorx zXoPag*R8}xXArgir1rWS7*rR+scfz*olZkDN)j_hV#K{0ubtyKi24%v&In!5ZxUmf z#W%zd6<7=mX=X$RvvFonTQ9{bzp07;CNMIDW(T(xm{q_S%v2T@Q`*M^L$X=~7!F{n zvV+uE$uz>|)g=D$PBs&*j!DW088q%C*%l9Jkk!djZTbmmGjhP7J_|fL|1LJ^pDRnu zFXh?-gW3aV3l=FKlG9;ptS$q9z>9$%FZjq)6U<)WjbKy znA!08LKrKfkr1Tu#oIYLy88O?a$n)(;x&#TFc80s)t?AbpT)02^r!|?&TaqLCYU=% zkm~l|>kq*;P+R(2o&{jD*Q4%yXG2)$;4DzRo= zXD=FB8&&KM`9PnEeDDAm)K;}IDtNK7>!MK_DG~__HBfR+=CNaIE%kQ-1FKTtI`L9S zgRBmH$IV>tAQFNY@F=Vjc!oj(*jkKVM@?7+r~@M@3ae>Qrmns)bN0g>8XFE#)LETC z$_GljNtIX^hKwA-3}XZ%fPpp)jpMKEAhuO$--8`Z7@si^@*%`^GB9YQYJ9RSdxM1z z-GbVEQkoS%96t^9o)lk5>UT5Nwk`O@$>e z%)oH6vU-^EF})_Kf!|z#Sq)6)%C^}#^;R_UM)ee!CDtv0S*JnF=c%!4CHd?tG_E4m zg}+}<3Y?2(cqOn$aWGzW(C5aR`d26)s92DZ-%g^hZ)KhzUd`ST1q^9LGZGkN^_`Ge zZ>hv}@SOxIIn*z#)FgWLj|W+f53j~sNJFYWV!)s@(?7#pDl9Ihk&~@~BdFD1WR(rA z!$O3Z!WpQIceJdmxW$yXf}BhRj-a`PJ?xRyX0Jy0L%o?T3AP~vaEE|F5h6i1F}y{S zjgp+q9geWUkwxd|#MTndK=FXFnl#T^#5U4u(Gm<;O|^?y3L}nIW}S*<8YI7gZ7jf` zE57S3QQ$G=a0?hx|Fei~uzroMXHkz5yt9Y}B)=`P(n#u^mrk>Y)d~;>5b@bs#8R+) zCTl#TGcy8K69a^BTOlfqkFzhc1*I9T0t4+UDmiu?;x{%S6NT;XREmjp8`>RdoG378 zjyA)Bcb}DhiF$N&3xtF?ZU`9Uo&DMl^t>m{Q0$g(~sJ! zm%HS9bDDegARkyeM)@o~;_|bDApmSQy;|SwuKbxxuv!j{DgJuD3o}`W9`QPc;Cwo` z9_$Q^xNP_m&Om;{IX$f!J$v9isG$+cQdbIz7Q2^#&>p}z@vrM|phj5Dlfd;rKFpAh zQ+jw&Q*j>}aS?nig_{Hh*`}4|mEF!wg?eYwcY42pL3M8ZbR>O2>D|M?km>^7&r<~N z6^JYTlT=NO&%>eBf%&Q(Zr{rfJNZkPjht=ynrpR_)OD50j^pi0vDp-(C$2 zvTdL9`h)#Jx9&q4Qe6-rrMdh-H-$#73XRsG`#}wiBrvEQeG(Va@pCMXgOCrQM_)8T zmhjsaRFJSOng*^_W|8|g2)>56{;RLitXdwvED*;n(bGctEL|5oeO(EbWJ|~@lx%!o zM7ka*?Z5Wua8HR8Pk1i(j(5$^q3WYz|SgPMv(W^HJ_3ToD0 z)&4WHwnZa^@J-6!OIulq7;uX*sH+wK$9qS;uQoD8MC)B4l#e93AP+NQ$w{4e2ra*v zc#xcI9~@zTvJ8ejYQ=Vy*?km3{raG!D0jsw3baxJ%^vE5m*| zIM)07-E{LUxq=1pE`ypu>AL|rT`)qKXDBS;n>esq`&{9>uI8ho;fV1<$+4jgcQW!T6fAPpMFFL6CG#NU;m`v&Ll zN@gYtup;{4zhc2#NQ>fNSh*}=bHpR!Xb`Fi{9eNwR?J|Obm3L%Ckc~L7_CF}5*SB( zpq)nm9v5@6t3_E~ekYUVEhF4`-256V8Oj4ck>r!%II5CbbBpIceUu{9{c;jExUnuUz=AvhmDX)HuvGIb9!@>@ALVzL!;Eo`O}fhh z{%3~&s}=T{s040%6HM|0_w#vwpx-b^EcO!yumpa8h4;4i4S=#zB}S8*pO~Gaoe%g+ z#4f;i*=P{hY0z}eMHgeb1+AL4`e6C?JD zNFK(dPOiatSg1t5SP*gW_HuG{7MUNZl8*idiFxin3KLreq6HGfyhI#a@DA?t#Q{H4 zAmr`f>+0jb@JWQ21u+0c?D76~q6#kl{yu)&#Ke5@&Je%8A);PBo^F1k-oDOagq!`v zM2LG4Le!EHiTXQ-V*ZzqQT4Y&U##2t_<%!wTrr#+mLgr7qpO{Vw=?D>`9)6hbHRIf z{4?vk9g%I`jv_E$hCA4hP5 z(h&CGG_*YN&n;W(+CgMK7LY5j1t9+~NJ4Rd68yyqz}FN1vQflR`~R9d`{lNA9Du*d zzJStfo6SvcZg=t|H>21}qSm&&vfU(|efawU;0L5Aq@DhAGo6~G2oNMe5ClOaQ)PLN z^-fhW{kwj>Bei+85AR1&~;xv8M)tBdzfx9*TFN zUZ};b7_zZx$L;OS>{Gj2k3+v+{07XI&-SI+9)7H5poossOZfb_I~BfePlwIyvun5M z+WUU?IpJ==EZ?6V-mM|n7poZkeM=|aC4cM>s~@*F(#&E5`{B78_p95RP4{k{!+$ zxrL>#zt{|{ZGva1mGtpLjm+g^ZejlAL+I0BhzvrMWc2edzl?rCEa*lg;_XAoja3YX z$n{M7{L6>XyYaof$+#!QA42SR;f&Xpo{2VU^Rm-}s6$)sI&?xzY!ziHSeO6`sm2}- z3)sG24Xa@@@Mdy2jjOKNwtE~@3p>H29ylj?=#lGo5En4yHie`_0I<>csHx;|+6{-s zml&J+lDzpOFhecMODfuR$NR&20oA0IW7Gs0%Y2&;FwGoY>W`z}%9i@AyIpEy*mt`* zKDQuKJ!L;>8x zcAB*xs7lD=g*eid2q7tb zAr2b`qa&q1gu^(+a9qwONhzQ&DSaLtZ|tFR+%JtdExbR_O z+AVE5Z`+!HLg^%*seHt<r)bU?eR3W8w|}`NbA@h8E&yVZ?~sie|#0A zZ}+m_FHkIm7?OpLKl(#|97cIcc3Aj)SRt>`V|VRiH{!qW2Y0~gl%f8>>Ktczwe~gb zX8+V)U0*gVHq?xVCGtQl(4&L;Ub&jcF^r2cFKVxiQQ3HDb@F7`EAF7Q&W1RQxv@+D z42J)99NX70DWTnQ74zQ?F%^u!+&tVpofy^UCk_m2E*7@K`hzte;oUJn&wP1BTPXzJ1=wr8Cn+$1$lk#tDH~oxqUxb1m=F8hvWp{e5aT5~dhW zCz@$iE%y)N5Zef&?T-ESH1ZFJ=qDVH_1z%>j{9}@?J#gXa%}GbwWe`7ZJzt%({MU+ z?is`dbu+91ywc|{;*qKD$;1BG4{$UmB}m>kE%=Vy!8D4jz&*K=Ec65+!opT~0X8=U zY|b>|@1UnFp~42QfF)M~OU^VRVQOc!+-+cU2I{}s4F*?4o71{$Hize7TsO}M0$sd% zA*3_LqrPs(iL&c=1tRBFX>MMmw*Fh;^8y}uLI|wfyx<$RRLUREB77P zoH^?doJI@Klvc>vaXvgY2QH+bRj!80{hSG7pl2ntEj~+SENM9apVAz=<=79TzW!>E z>B410X}V`MK{qQ=YXHv5f)($S-Ktw7(|IR=^x~1X*eMD#lPiHaXBeqE%TJpV$|mhY zm@M7$IC&8Q2A{>;BYv!9__O2`h|j906xY_lR8E3=TEHC3{t2h>pQYbzl z`lPHdYq^r42oS7$F%4DP&LUrcbMCCwVb6XAP^0J|8oAZ2wCMI509{VSa}7F#^Z+uX zR2=L2vnU3-ZRyt4y>L@lGRe7G;Bz^6O*pMA@`&(*C8Z> zfk|)%l_J{O>##Zw4Utt&T>*is1rnFj39peoR~|qyFG8scgC_wWOvfnDlPd|X1ff$< zV_u0H0hIhuUoNDXGF{vEr-z4bEHvwCfx+c;#nu`YItgVFC?*AzNb@qs%oH(!o~mX# zmo;e-9F&0$Dc#@eP#SVap)`eb6LkoRMT>6n7CMyJCRb7v5kgmdjcLp^SmD_1F}}-Y zqCo0!j{f*kn5hMgR#B$P0vSb*fEJsH0dynjw)5sLYm2M+!yq_M~yv5UZ~y2=rGe(7T1g zxNQ$q-yU?ssxh)V3jySEjZBzAR~Dwb-(O(T&3q`%C1 zP;K?xBymRxaeCUzk@vv7aB)`Z#H6D1Vp70F*N=cP{0z`Bc^30JdI5DgWn>*ZC7(|0 zkeSCqHzxIDWTe{>PN!DK)QWfQwj_RYrG!WzRNJo|VTb`EUHSF{#e^_OdJ;4Rn8W6_ zZK5pK&B#8?PWpvTz7Is3?|-EGVGAhWULq2#OT{QJ^)ssl5dwoHn9({+3aoB*=4V@Q;Ey%c-o02i9d){ygu~Rgf<7IgQKfV_1I?HBjJzj;d^0VW;MY$D^aAi zePz;X`VzWKN|$QQy0B!%lfH>L59X}z!ZQRjD(PCrJGr8+l=9-0EuEA@bEg?6YTW zgp)QwFv(};;|bJ8EV`xHN_9Y!(wPkkoe=8)Vf}#%sm9`s)g+klnpm*JRbMUk(zeSA z>x+IZVmQf~w%Y~hken6JK529g}2fLSjv zz~-~M?`hAMPCFJErgX0paQUNGZo!u_#dXj7b8dJ*ueU+|)+gT`sg@!9QJS*}yc`{I zV$auMG~lxt_hl%xkx1-WNc_E@0J>{H)>v5nBD&&}o&rI+i;)ByuRqQ(oF=0*pec>0 zuY1YO?9af@O3o64X%2x;X%&Ea>{2yA&De$h=StcM6bFS+X{Y*@_{`Oiq&nb8X}VC? z__W(1sw@HV;W&zcY}1S!NJ|QSt|TLnAUNv;8!o0jJH*v6O)G+JTA)@&-IXvK?@m0% zC@Gz(4tP>pPujH&(W2l1W(l~tu53GFFn}%x(ebK;wGbZ66&Rcq!-~uA&-1i>e~&}rr+3}yYAPo!)e>KyXZ=brf1u&Ts9Mdf6GJ6pS;8))@`g} zx=_q<^NpSL4s~N#q2Twc@6BdB#jl&8UCYs$?LHPAx((YoCvG$sozyxh zkT%Plj5&Afm^CGWa-ofBMNm%*RH0H)C&Hdl#3)z5W);9<36(Xq1sVI|hRXHOm8!t3 zS-aBIf+MA&BaBOdc2TJTQqB4^M*EtEJfCu4)AS=3>ZYLBapNG@XDeVb&&Odr>2L&v z-2w-Se2J~;oAAJU5|Pa=LS%M>Dqa|(P=jWo+Rm^BqXANQHHXoA0cRlXYp~c zgsLUVN_~Bs#lms4Bb)-7p_IJ-3&xZoP zP|Sj_uYjqH2Gg|QED_{HJ_uayEa*tO8X|H=#gz(?6&BIWih!pLVzI#RlX?&`$tz#f zWK!PG0M8jFlDJS6Eh9-wKvP;+*iNG*xr% zNSCAiy191JVc;iuhO_Q@^M)(H@}^8Bikgx1**gJcWLaGi>!C0na&Q8fo}ajD56|?! zwX5%keb;{1&G*24^7#6ICh<59Ct=N}ezV?F2lrp~=u`t^Bh40?S_Yu;1u(^<#eX1Td8O(HelMbl%qQwbab<@;2!EOAk6zYyAW_n zsXD==I^a)f@sp_A&%|0Iv0Q8gY^>=T8_M!O;jBhwC$nCUuto3kAMBO2JkFL?QZlI&pdf382f-h7zryr-j1vOEH_2;9KiiGE>uEgu zbxguu!b368}xblv#?MqNCHHWY!8X2+3aO@8*$2eTU{hTJY z?PI?R&vSnE+@X&TW7(_7)q-M|)A6tIi*FBbpB0YQ&AvR}^B#a@UUb$r0AOlEjUXV&72|diA`7o^((45mk9=piMu8<9{u3( zQaeB{@-WyEKc98fm*A8D$q&uSzF%e+0!mYz|8Ub{@vL)cyVI@1~CH2ldHrthzo>ZR%1vT+9cdZ*K8J z?N6A{H#l{nKj_T}YF@VX*ZdD=HKAcv!l2c!N?g-ma5+Ee! zF8VRwhGj7gUOp5)mU)S-^yC^aoN^0Sc=G8T&I6L-6{{mz^# zf_IyCNabLXpy9jo7%x!wwlWwUs9JLBAy{ow!Cdw>v@rPI7U~`mP8NC*YB8vT7V*zN zmMujr<}v}puJ}60%Vzbr@v(-#-sY{e(0!roL4s0RLf46^!A8K+#$3RrVa!3MzjQH# z2P;4%+JQ=GUF|i!@Vv2E9{eE9|!A-sd{*cJ?L2EhoT)K#wH=mUdSGq932^1<)8evQT zcM)TzJHGxbUPVbI;;(}tq|OrN8Fc_`H`0#6*2IoPqX$ZURLH3IpgUHWtj{-h`(g9F zZt7(z)%YMD5sM}aUp1uzA-?&g@Ommv_R*+ritdY W8-Ycga=0X`o2O#ZSoQyh|NRfl + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/components/Button.svelte b/src/components/Button.svelte new file mode 100644 index 0000000..01919b9 --- /dev/null +++ b/src/components/Button.svelte @@ -0,0 +1,9 @@ + + + diff --git a/src/components/Group.svelte b/src/components/Group.svelte new file mode 100644 index 0000000..77499c4 --- /dev/null +++ b/src/components/Group.svelte @@ -0,0 +1,9 @@ + + +
+ +
diff --git a/src/components/LeftGroup.svelte b/src/components/LeftGroup.svelte new file mode 100644 index 0000000..b1f9073 --- /dev/null +++ b/src/components/LeftGroup.svelte @@ -0,0 +1,39 @@ + + +
+
diff --git a/src/components/Meter.svelte b/src/components/Meter.svelte new file mode 100644 index 0000000..e69de29 diff --git a/src/components/RightGroup.svelte b/src/components/RightGroup.svelte new file mode 100644 index 0000000..4c99672 --- /dev/null +++ b/src/components/RightGroup.svelte @@ -0,0 +1,74 @@ + + +
+
+ {#if networkOutput?.defaultInterface?.type === "ethernet"} + + {:else if networkOutput?.defaultInterface!.type === "wifi"} + {#if networkOutput.defaultGateway!.signalStrength! >= 75} + + {:else if networkOutput.defaultGateway!.signalStrength! >= 50} + + {:else if networkOutput.defaultGateway!.signalStrength! >= 25} + + {:else} + + {/if} + {networkOutput.defaultGateway?.ssid} + {:else} + + {/if} +
+
+ {#if weatherOutput?.status === "clear_day"} + + {:else if weatherOutput?.status === "clear_night"} + + {:else if weatherOutput?.status === "cloudy_day"} + + {:else if weatherOutput?.status === "cloudy_night"} + + {:else if weatherOutput?.status === "light_rain_day"} + + {:else if weatherOutput?.status === "light_rain_night"} + + {:else if weatherOutput?.status === "heavy_rain_day"} + + {:else if weatherOutput?.status === "heavy_rain_night"} + + {:else if weatherOutput?.status === "snow_day"} + + {:else if weatherOutput?.status === "snow_night"} + + {:else if weatherOutput?.status === "thunder_day"} + + {:else if weatherOutput?.status === "thunder_night"} + + {/if} + {weatherOutput?.celsiusTemp}° +
+ + {dateOutput.formatted} +
diff --git a/src/components/Workspaces.svelte b/src/components/Workspaces.svelte new file mode 100644 index 0000000..95af6db --- /dev/null +++ b/src/components/Workspaces.svelte @@ -0,0 +1,105 @@ + + +
+ {#each glazewmOutput!.currentWorkspaces as workspace, i} +
diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..6d63253 --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1,2 @@ +// This can be false if you're using a fallback (i.e. SPA mode) +export const prerender = true; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..0d75a38 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,19 @@ + + +
+ + + + + + + + + +
diff --git a/styles/themes/catppuccin.css b/src/themes/catppuccin.css similarity index 100% rename from styles/themes/catppuccin.css rename to src/themes/catppuccin.css diff --git a/src/themes/rose-pine.css b/src/themes/rose-pine.css new file mode 100644 index 0000000..637c531 --- /dev/null +++ b/src/themes/rose-pine.css @@ -0,0 +1,56 @@ +:root { + /* Rosé Pine Dawn */ + --rp-base: 32 57 95; + --rp-surface: 35 100 98; + --rp-overlay: 33 43 91; + --rp-muted: 257 9 61; + --rp-subtle: 248 12 52; + --rp-text: 248 19 40; + --rp-love: 343 35 55; + --rp-gold: 35 81 56; + --rp-rose: 3 53 67; + --rp-pine: 197 53 34; + --rp-foam: 189 30 48; + --rp-iris: 268 21 57; + --rp-highlight-low: 25 35 93; + --rp-highlight-med: 10 9 86; + --rp-highlight-high: 315 4 80; +} + +@media (prefers-color-scheme: dark) { + :root { + /* Rosé Pine */ + /* --rp-base: 249 22 12; */ + /* --rp-surface: 247 23 15; */ + /* --rp-overlay: 248 25 18; */ + /* --rp-muted: 249 12 47; */ + /* --rp-subtle: 248 15 61; */ + /* --rp-text: 245 50 91; */ + /* --rp-love: 343 76 68; */ + /* --rp-gold: 35 88 72; */ + /* --rp-rose: 2 55 83; */ + /* --rp-pine: 197 49 38; */ + /* --rp-foam: 189 43 73; */ + /* --rp-iris: 267 57 78; */ + /* --rp-highlight-low: 244 18 15; */ + /* --rp-highlight-med: 249 15 28; */ + /* --rp-highlight-high: 248 13 36; */ + + /* Rosé Pine Moon */ + --rp-base: 246 24 17; + --rp-surface: 248 24 20; + --rp-overlay: 248 21 26; + --rp-muted: 249 12 47; + --rp-subtle: 248 15 61; + --rp-text: 245 50 91; + --rp-love: 343 76 68; + --rp-gold: 35 88 72; + --rp-rose: 2 66 75; + --rp-pine: 197 48 47; + --rp-foam: 189 43 73; + --rp-iris: 267 57 78; + --rp-highlight-low: 245 22 20; + --rp-highlight-med: 247 16 30; + --rp-highlight-high: 249 15 38; + } +} diff --git a/src/types/providers.d.ts b/src/types/providers.d.ts new file mode 100644 index 0000000..0de813e --- /dev/null +++ b/src/types/providers.d.ts @@ -0,0 +1,124 @@ +import { Workspace, Monitor as Monitor$1, Container, TilingDirection, BindingModeConfig, RunCommandResponse } from 'glazewm'; + +export interface BatteryOutput { + chargePercent: number; + cycleCount: number; + healthPercent: number; + powerConsumption: number; + state: 'discharging' | 'charging' | 'full' | 'empty' | 'unknown'; + isCharging: boolean; + timeTillEmpty: number | null; + timeTillFull: number | null; + voltage: number | null; +} + +export interface CpuOutput { + frequency: number; + usage: number; + logicalCoreCount: number; + physicalCoreCount: number; + vendor: string; +} + +export interface DateOutput { + formatted: string; + new: Date; + now: number; + iso: string; +} + +export interface GlazeWmOutput { + displayedWorkspace: Workspace; + focusedWorkspace: Workspace; + currentWorkspaces: Workspace[]; + allWorkspaces: Workspace[]; + allMonitors: Monitor$1[]; + focusedMonitor: Monitor$1; + currentMonitor: Monitor$1; + focusedContainer: Container; + tilingDirection: TilingDirection; + bindingModes: BindingModeConfig[]; + runCommand(command: string, subjectContainerId?: string): Promise; +} + +export interface MemoryOutput { + usage: number; + freeMemory: number; + usedMemory: number; + totalMemory: number; + freeSwap: number; + usedSwap: number; + totalSwap: number; +} + +export interface NetworkOutput { + defaultInterface: NetworkInterface | null; + defaultGateway: NetworkGateway | null; + interfaces: NetworkInterface[]; + traffic: NetworkTraffic | null; +} +interface NetworkInterface { + name: string; + friendlyName: string | null; + description: string | null; + type: InterfaceType; + ipv4Addresses: string[]; + ipv6Addresses: string[]; + macAddress: string | null; + transmitSeed: number | null; + receiveSpeed: number | null; + dnsServers: string[]; + isDefault: boolean; +} +interface NetworkGateway { + macAddress: string; + ipv4Addresses: string[]; + ipv6Addresses: string[]; + ssid: string | null; + signalStrength: number | null; +} +declare enum InterfaceType { + UNKNOWN = "unknown", + ETHERNET = "ethernet", + TOKEN_RING = "token_ring", + FDDI = "fddi", + PPP = "ppp", + LOOPBACK = "loopback", + SLIP = "slip", + ATM = "atm", + GENERIC_MODEM = "generic_modem", + ISDN = "isdn", + WIFI = "wifi", + DSL = "dsl", + TUNNEL = "tunnel", + HIGH_PERFORMANCE_SERIAL_BUS = "high_performance_serial_bus", + MOBILE_BROADBAND = "mobile_broadband", + BRIDGE = "bridge" +} +interface NetworkTraffic { + received: number | null; + transmitted: number | null; +} + +declare enum WeatherStatus { + CLEAR_DAY = "clear_day", + CLEAR_NIGHT = "clear_night", + CLOUDY_DAY = "cloudy_day", + CLOUDY_NIGHT = "cloudy_night", + LIGHT_RAIN_DAY = "light_rain_day", + LIGHT_RAIN_NIGHT = "light_rain_night", + HEAVY_RAIN_DAY = "heavy_rain_day", + HEAVY_RAIN_NIGHT = "heavy_rain_night", + SNOW_DAY = "snow_day", + SNOW_NIGHT = "snow_night", + THUNDER_DAY = "thunder_day", + THUNDER_NIGHT = "thunder_night" +} + +interface WeatherOutput { + isDaytime: boolean; + status: WeatherStatus; + celsiusTemp: number; + fahrenheitTemp: number; + windSpeed: number; +} diff --git a/styles/themes/rose-pine.css b/styles/themes/rose-pine.css deleted file mode 100644 index b6d266c..0000000 --- a/styles/themes/rose-pine.css +++ /dev/null @@ -1 +0,0 @@ -@import url('https://unpkg.com/@rose-pine/palette@4.0.1/dist/css/rose-pine.css'); diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..530516c --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,17 @@ +import adapter from '@sveltejs/adapter-static'; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter({ + pages: "build", + assets: "build", + fallback: undefined, + precompress: false, + strict: true + }) + } +}; + +export default config; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..f359120 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,94 @@ +// eslint-disable-next-line @typescript-eslint/no-require-imports +const defaultTheme = require("tailwindcss/defaultTheme"); +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./src/**/*.{html,js,svelte,ts}"], + theme: { + extend: { + colors: { + zb: { + text: "hsl( var(--text) / )", + base: "hsl( var(--bg) / )", + border: "hsl(var(--border) / )", + shadow: "hsl(var(--shadow) / )", + icon: "hsl(var(--icon) / )", + memory: "hsl(var(--memory) / )", + cpu: "hsl(var(--cpu) / )", + "cpu-high-usage": "hsl(var(--cpu-high-usage) / )", + battery: { + good: "hsl(var(--battery-good) / )", + mid: "hsl(var(--battery-mid) / )", + low: "hsl(var(--battery-low) / )" + }, + "focused-process": "hsl(var(--focused-process) / )", + process: "hsl(var(--process) / )", + displayed: "hsl(var(--displayed) / )", + ws: { + 0: "hsl(var(--ws-1) / )", + 1: "hsl(var(--ws-2) / )", + 2: "hsl(var(--ws-3) / )", + 3: "hsl(var(--ws-4) / )", + 4: "hsl(var(--ws-5) / )" + }, + "tiling-direction": "hsl(var(--tiling-direction) / )", + spotify: { + playing: "hsl(var(--now-playing) / )", + paused: "hsl(var(--not-playing) / )" + }, + network: "hsl(var(--network) / )", + weather: "hsl(var(--weather) / )" + }, + blend: generateBlends() + }, + borderRadius: { + DEFUALT: "var(--radius)" + }, + borderWidth: { + DEFAULT: "var(--border-size)" + }, + boxShadow: { + button: + "var(--shadow-size-button) var(--shadow-size-button) 0 hsl(var(--shadow))", + bar: "var(--shadow-size-bar) var(--shadow-size-bar) 0 hsl(var(--shadow))" + }, + translate: { + boxShadowX: "var(--shadow-size-button)", + boxShadowY: "var(--shadow-size-button)", + reverseBoxShadowX: "-var(--shadow-size-button)", + reverseBoxShadowY: "-var(--shadow-size-button)" + }, + fontFamily: { + sans: ["SF Pro Display", ...defaultTheme.fontFamily.sans] + }, + fontWeight: { + base: "var(--font-weight)" + }, + height: { + bar: "var(--height)" + }, + margin: { + zbx: "var(--bar-margin-x)", + zby: "var(--bar-margin-y)" + } + } + }, + safelist: [ + "text-zb-ws-0", + "text-zb-ws-1", + "text-zb-ws-2", + "text-zb-ws-3", + "text-zb-ws-4", + "justify-self-start", + "justify-self-center", + "justify-self-end" + ], + plugins: [] +}; + +function generateBlends() { + const blends = {}; + for (let i = 5; i <= 100; i += 5) { + blends[i] = `color-mix(in srgb, currentColor ${i}%, transparent)`; + } + return blends; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..fc93cbd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias + // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..bbf8c7d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +}); From 68e42dd37528720214e7c8c6ca82aa97da07874f Mon Sep 17 00:00:00 2001 From: adriankarlen Date: Fri, 20 Sep 2024 14:39:59 +0200 Subject: [PATCH 2/5] feat!: add last missing providers --- a.out | Bin 288 -> 0 bytes bar.zebar.json | 3 +- bun.lockb | Bin 116663 -> 116663 bytes config.yaml | 185 -------------------------- scripts/glazewm.js | 84 ------------ scripts/menu.js | 19 --- src/app.css | 20 ++- src/components/Button.svelte | 4 +- src/components/Group.svelte | 11 +- src/components/LeftGroup.svelte | 40 ++++-- src/components/Meter.svelte | 24 ++++ src/components/NowPlaying.svelte | 32 +++++ src/components/RightGroup.svelte | 74 ++++++----- src/components/Workspaces.svelte | 64 +++++---- src/routes/+page.svelte | 4 +- styles/animations.css | 82 ------------ styles/bar.css | 15 --- styles/config.css | 45 ------- styles/global.css | 8 -- styles/group-center.css | 93 ------------- styles/group-left.css | 222 ------------------------------- styles/group-right.css | 61 --------- tailwind.config.js | 5 +- 23 files changed, 184 insertions(+), 911 deletions(-) delete mode 100644 a.out delete mode 100644 config.yaml delete mode 100644 scripts/glazewm.js delete mode 100644 scripts/menu.js create mode 100644 src/components/NowPlaying.svelte delete mode 100644 styles/animations.css delete mode 100644 styles/bar.css delete mode 100644 styles/config.css delete mode 100644 styles/global.css delete mode 100644 styles/group-center.css delete mode 100644 styles/group-left.css delete mode 100644 styles/group-right.css diff --git a/a.out b/a.out deleted file mode 100644 index 2f9eafc7f95f7869351532b3ecf5292a32df9bce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmYdkV`cz>9w6obvsfAQN>VFIz--)v0z*K8UP@v~B5oyM83%@d1A0lt#RQZwG=S8l xW#*(p75@9rz>v%`$EEyU50CzYDNB{r; delta 25 dcmdnq&%V8%y> PATH TO YOUR YOUR GLZR CONFIG FOLDER<<.glzr%5Czebar%5Cstyles%5Cglobal.css"; - - group/left: - template/menu: - events: - - type: "click" - fn_path: "scripts/menu.js#toggleDropdown" - selector: ".dropdown-button" - template: | - - - template/dropdown: - events: - - type: "click" - fn_path: "scripts/menu.js#powerDown" - selector: "#powerdown" - - type: "click" - fn_path: "scripts/menu.js#sleep" - selector: "#sleep" - - type: "click" - fn_path: "scripts/menu.js#logout" - selector: "#logout" - template: - - - - - - - - - - - template/memory: - providers: ["memory"] - template: | - - - {{ Math.round(memory.usage) }}% - - - - - - template/cpu: - providers: ["cpu"] - template: | -
85 ? "high-usage" : ""}}> - - - {{ Math.round(cpu.usage) }}% - - - - -
- - template/battery: - providers: ["battery"] - template: | -
- - - {{ Math.round(battery.chargePercent) }}% - - - - -
- - group/center: - template/glazewm_workspaces: - providers: ["glazewm"] - events: - - type: "click" - fn_path: "scripts/glazewm.js#focusWorkspace" - selector: ".workspace" - template: | - @for (workspace of glazewm.currentWorkspaces) { - - } - -
- @for (child of glazewm.focusedWorkspace.children) { - @if (child.state != null && child.state.type != "minimized") { - - - - } - } -
- - group/right: - template/now-playing: - providers: ["glazewm"] - template: | - @for (workspace of glazewm.allWorkspaces) { - @for (child of workspace.children) { - @if (child?.processName === "Spotify") { - @if (child.title === "Spotify Premium") { - - nothing is playing - } @else { - - 62 ? "move" : ""}}> - {{ child.title }} - - } - } - } - } - - template/network: - providers: ["network"] - template: | - @if (network.defaultInterface?.type === 'ethernet') { - - } @else if (network.defaultInterface?.type === 'wifi') { - @if (network.defaultGateway?.signalStrength >= 75) {} - @else if (network.defaultGateway?.signalStrength >= 50) {} - @else if (network.defaultGateway?.signalStrength >= 25) {} - @else {} - {{ network.defaultGateway?.ssid }} - } @else { - - } - - template/weather: - providers: ["weather"] - template: | - @switch (weather.status) { - @case ('clear_day') {} - @case ('clear_night') {} - @case ('cloudy_day') {} - @case ('cloudy_night') {} - @case ('light_rain_day') {} - @case ('light_rain_night') {} - @case ('heavy_rain_day') {} - @case ('heavy_rain_night') {} - @case ('snow_day') {} - @case ('snow_night') {} - @case ('thunder_day') {} - @case ('thunder_night') {} - } - {{ weather.celsiusTemp }}° - - template/separator: - template: | - - - template/clock: - providers: ["date"] - template: | - {{ date.toFormat(date.now, 't') }} diff --git a/scripts/glazewm.js b/scripts/glazewm.js deleted file mode 100644 index 59654fb..0000000 --- a/scripts/glazewm.js +++ /dev/null @@ -1,84 +0,0 @@ -const iconMap = { - // Terminals - "wezterm-gui": { icon: "ti-terminal-2" }, - alacritty: { icon: "ti-terminal-2" }, - windowsterminal: { icon: "ti-terminal-2" }, - - // Editors - code: { icon: "ti-brand-vscode" }, // VS Code - devenv: { icon: "ti-brand-visual-studio" }, // Visual Studio - - // Communication - "ms-teams": { icon: "ti-brand-teams" }, - olk: { icon: "ti-mail" }, // Outlook - - // VPN - "azure vpn client": { icon: "ti-spy" }, // Azure VPN Client - - // Browsers - zen: { icon: "ti-circle-letter-z" }, - msedge: { icon: "ti-brand-edge" }, - - // Utils - snippingtool: { icon: "ti-screenshot" }, - "control panel": { icon: "ti-settings" }, - explorer: { icon: "ti-folder" }, - photos: { icon: "ti-photo" }, - sound: { icon: "ti-headphones" }, - excel: { icon: "ti-file-spreadsheet" }, - onenote: { icon: "ti-note" }, - powerpnt: { icon: "ti-presentation" }, - winword: { icon: "ti-file-word" }, - mspaint: { icon: "ti-palette" }, - - // Ignore - msedgewebview2: { ignore: true }, -}; - -export const focusWorkspace = (event, context) => { - const id = event.target.id; - context.providers.glazewm.focusWorkspace(id); -}; - -const addProcessIconCallback = (mutationsList) => { - for (const mutation of mutationsList) { - if (mutation.type === "childList") { - const node = document.querySelector("#process-container"); - if (node) { - const iconNodes = node.querySelectorAll(".ti"); - - iconNodes.forEach((iconNode) => { - const processName = iconNode.getAttribute("data-process-name"); - const title = iconNode.getAttribute("data-title"); - - if (!processName && !title) return; - const process = iconMap[processName] || iconMap[title]; - const unmapped = process == null; - if (!unmapped && process.ignore) { - iconNode.remove(); - return; - } - - /** INFO: Edge case, all Windows apps has this process name, - * to avoid some manual mapping, use title without brand */ - if (unmapped && processName == "applicationframehost") { - iconNode.classList.add(`ti-${title}`); - } - - iconNode.classList.add( - unmapped ? `ti-brand-${processName}` : process.icon, - ); - }); - } - } - } -}; - -const observer = new MutationObserver(addProcessIconCallback); -const config = { childList: true, subtree: false }; -const parentNode = document.querySelector("#glazewm-workspaces"); -if (parentNode) { - observer.observe(parentNode, config); -} else { - console.error("Parent node #glazewm-workspaces not found."); -} diff --git a/scripts/menu.js b/scripts/menu.js deleted file mode 100644 index 4e2ecb4..0000000 --- a/scripts/menu.js +++ /dev/null @@ -1,19 +0,0 @@ -export function toggleDropdown() { - const menu = document.querySelector("#dropdown"); - menu.style.display = menu.style.display === "flex" ? "none" : "flex"; -} - -export function powerDown() { - const menu = document.querySelector("#dropdown"); - menu.style.display = "none"; -} - -export function sleep() { - const menu = document.querySelector("#dropdown"); - menu.style.display = "none"; -} - -export function logout() { - const menu = document.querySelector("#dropdown"); - menu.style.display = "none"; -} diff --git a/src/app.css b/src/app.css index 293055a..26a630a 100644 --- a/src/app.css +++ b/src/app.css @@ -9,9 +9,9 @@ :root { /* sizes */ - --height: 40px; - --bar-margin-y: 10px; - --bar-margin-x: 20px; + --height: 2.5rem; + --bar-margin-y: 0.625rem; + --bar-margin-x: 1.25rem; /* fonts */ --font-family: "SF Pro Display", Roboto, Helvetica, Arial, sans-serif; @@ -19,12 +19,12 @@ --font-weight: 500; /* border */ - --border-size: 2px; - --radius: 0px; + --border-size: 0.125rem; + --radius: 0.25rem; /* shadow */ - --shadow-size-bar: 4px; - --shadow-size-button: 2px; + --shadow-size-bar: 0.25rem; + --shadow-size-button: 0.125rem; /* colors */ --text: var(--rp-text); @@ -52,3 +52,9 @@ --network: var(--rp-text); --weather: var(--rp-text); } + +@layer base { + body { + font-size: var(--font-size); + } +} diff --git a/src/components/Button.svelte b/src/components/Button.svelte index 01919b9..6d5986e 100644 --- a/src/components/Button.svelte +++ b/src/components/Button.svelte @@ -1,9 +1,9 @@ diff --git a/src/components/Group.svelte b/src/components/Group.svelte index 77499c4..e1c77af 100644 --- a/src/components/Group.svelte +++ b/src/components/Group.svelte @@ -1,9 +1,14 @@
- + {@render children()}
diff --git a/src/components/LeftGroup.svelte b/src/components/LeftGroup.svelte index b1f9073..7620e2a 100644 --- a/src/components/LeftGroup.svelte +++ b/src/components/LeftGroup.svelte @@ -2,10 +2,16 @@ import { onMount } from "svelte"; import { init } from "zebar"; import Button from "./Button.svelte"; + import Meter from "./Meter.svelte"; + import type { + CpuOutput, + BatteryOutput, + MemoryOutput + } from "../types/providers"; - let cpuOutput = $state({ usage: 0 }); - let batteryOutput = $state({ chargePercent: 0 }); - let memoryOutput = $state({ usage: 0 }); + let cpuOutput = $state(); + let batteryOutput = $state(); + let memoryOutput = $state(); onMount(async () => { const zebarCtx = await init(); @@ -22,18 +28,24 @@ }); -
-
- +{/if} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0d75a38..225c1ca 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -6,7 +6,9 @@ import Workspaces from "../components/Workspaces.svelte"; -
+
diff --git a/styles/animations.css b/styles/animations.css deleted file mode 100644 index 3166559..0000000 --- a/styles/animations.css +++ /dev/null @@ -1,82 +0,0 @@ -@keyframes flash { - from { - opacity: 1; - } - 50% { - opacity: 0.5; - } - to { - opacity: 1; - } -} - -@keyframes pulse { - 0% { - transform: scale(1); - } - 50% { - transform: scale(1.1); - } - 100% { - transform: scale(1); - } -} - -@keyframes wiggle { - 0% { - transform: rotate(0deg); - } - 2% { - transform: rotate(10deg); - } - 4% { - transform: rotate(-10deg); - } - 6% { - transform: rotate(10deg); - } - 8% { - transform: rotate(-10deg); - } - 10% { - transform: rotate(10deg); - } - 12% { - transform: rotate(-10deg); - } - 14% { - transform: rotate(10deg); - } - 16% { - transform: rotate(-10deg); - } - 18% { - transform: rotate(10deg); - } - 20% { - transform: rotate(0deg); - } -} - -@keyframes press { - from { - transform: translateY(0px) translateX(0px); - } - to { - box-shadow: none; - transform: translateY(2px) translateX(2px); - } -} - -@keyframes move { - 0%, - 25% { - transform: translateX(0%); - left: 0%; - } - 75%, - 100% { - transform: translateX(-100%); - left: 100%; - } -} diff --git a/styles/bar.css b/styles/bar.css deleted file mode 100644 index 1f59dfb..0000000 --- a/styles/bar.css +++ /dev/null @@ -1,15 +0,0 @@ -#bar { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - align-items: center; - height: var(--height); - margin: var(--bar-margin-y) var(--bar-margin-x); - color: var(--text); - font-family: var(--font-family); - font-size: var(--font-size); - font-weight: var(--font-weight); - - i { - pointer-events: none; - } -} diff --git a/styles/config.css b/styles/config.css deleted file mode 100644 index 0e8c807..0000000 --- a/styles/config.css +++ /dev/null @@ -1,45 +0,0 @@ -:root { - /* sizes */ - --height: 40px; - --bar-margin-y: 10px; - --bar-margin-x: 20px; - - /* fonts */ - --font-family: "SF Pro Display", Roboto, Helvetica, Arial, sans-serif; - --font-size: 16px; - --font-weight: 500; - - /* border */ - --border-size: 2px; - --radius: 0px; - - /* shadow */ - --shadow-size-bar: 4px; - --shadow-size-button: 2px; - - /* colors */ - --text: var(--rp-text); - --bg: var(--rp-overlay); - --border: var(--rp-highlight-low); - --shadow: var(--rp-highlight-low); - --icon: var(--rp-love); - --memory: var(--rp-iris); - --cpu: var(--rp-rose); - --cpu-high-usage: var(--rp-love); - --battery-good: var(--rp-pine); - --battery-mid: var(--rp-gold); - --battery-low: var(--rp-love); - --focused-process: var(--rp-text); - --process: var(--rp-muted); - --displayed: var(--rp-text); - --ws-1: var(--rp-gold); - --ws-2: var(--rp-love); - --ws-3: var(--rp-pine); - --ws-4: var(--rp-foam); - --ws-5: var(--rp-iris); - --tiling-direction: var(--rp-rose); - --not-playing: var(--rp-love); - --now-playing: var(--rp-pine); - --network: var(--rp-text); - --weather: var(--rp-text); -} diff --git a/styles/global.css b/styles/global.css deleted file mode 100644 index c6c9629..0000000 --- a/styles/global.css +++ /dev/null @@ -1,8 +0,0 @@ -@import "http://asset.localhost/>> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER<> PATH TO YOUR YOUR GLZR CONFIG FOLDER< div { - display: flex; - align-items: center; - } - - i { - font-size: 19px; - margin-right: 7px; - } - } - - .meter { - display: inline-block; - height: 1rem; - width: 3rem; - border: var(--border-size) solid var(--border); - border-radius: var(--radius); - overflow: hidden; - opacity: 1; - transform: translateY(0%); - transition: - transform 0.3s ease, - opacity 0.3s ease; - - span { - display: block; - height: 100%; - width: 0; - border-right: var(--border-size) solid var(--border); - } - } - - .label { - position: absolute; - display: flex; - left: 30px; - flex-direction: column; - opacity: 0; - transform: translateY(-100%); - transition: - transform 0.3s ease, - opacity 0.3s ease; - user-select: none; - display: flex; - } - - #menu { - background: color-mix(in srgb, currentColor 30%, transparent); - border: var(--border-size) solid var(--border); - border-radius: var(--radius); - box-shadow: var(--shadow-size-button) var(--shadow-size-button) 0 var(--shadow); - transition: - box-shadow 0.2s, - transform 0.3s; - color: var(--icon); - padding: 3px; - cursor: pointer; - - > div { - display: flex; - align-items: center; - justify-content: center; - } - - &:hover { - box-shadow: none; - transform: translateY(var(--shadow-size-button)) translateX(var(--shadow-size-button)); - } - - i { - font-size: 1rem; - } - } - - #memory .meter span { - background: var(--memory); - } - - #cpu { - .meter span { - background: var(--cpu); - } - - .high-usage { - & .meter span { - background: var(--cpu-high-usage); - } - & i { - animation: flash 0.5s infinite; - } - } - } - - #battery { - .critical { - i { - animation: flash 1s infinite; - } - .meter span { - background: var(--battery-low); - } - } - - .low { - .meter span { - background: var(--battery-low); - } - } - - .mid { - .meter span { - background: var(--battery-mid); - } - } - - .good { - .meter span { - background: var(--battery-good); - } - } - - .full { - .meter span { - background: var(--battery-good); - border-right: none; - } - } - - .charging { - animation: pulse 2s infinite; - } - } - - #dropdown { - display: none; - flex-direction: column; - top: calc(var(--height) + (2 * var(--bar-margin-y))); - left: var(--bar-margin-x); - position: absolute; - background: var(--bg); - border: var(--border-size) solid var(--border); - border-radius: var(--radius); - box-shadow: var(--shadow-size-bar) var(--shadow-size-bar) 0 var(--shadow); - color: var(--text); - background-color: var(--bg); - width: fit-content; - - a { - color: var(--text); - text-decoration: none; - display: flex; - align-items: center; - justify-content: center; - width: fit-content; - padding: 8px; - border-bottom: 2px solid var(--border); - } - - a:last-child { - border-bottom: none; - } - - #powerdown { - color: var(--rp-moon-love); - &:hover { - background: color-mix(in srgb, currentColor 30%, transparent); - } - } - #sleep { - color: var(--rp-moon-rose); - &:hover { - background: color-mix(in srgb, currentColor 30%, transparent); - } - } - #logout { - color: var(--rp-moon-gold); - &:hover { - background: color-mix(in srgb, currentColor 30%, transparent); - } - } - - i { - font-size: 19px; - } - } -} diff --git a/styles/group-right.css b/styles/group-right.css deleted file mode 100644 index d0ae765..0000000 --- a/styles/group-right.css +++ /dev/null @@ -1,61 +0,0 @@ -#right { - height: 100%; - justify-self: end; - display: flex; - align-items: center; - background: var(--bg); - border: 2px solid var(--border); - border-radius: var(--radius); - box-shadow: var(--shadow-size-bar) var(--shadow-size-bar) 0 var(--shadow); - margin-right: 4px; - overflow: hidden; - white-space: nowrap; - - .template { - margin: 4px; - display: flex; - align-items: center; - } - - #now-playing, - #network, - #weather { - padding: 6px; - overflow: hidden; - white-space: nowrap; - max-width: 25vw; - - i { - margin-right: 7px; - } - } - - #now-playing { - & > i { - color: var(--not-playing); - &.playing { - color: var(--now-playing); - animation: wiggle 10s infinite; - } - } - - .move { - display: inline-block; - position: relative; - } - } - - #network i { - font-size: 1.2rem; - color: var(--network); - } - - #weather i { - font-size: 1.2rem; - color: var(--weather); - } - - #clock { - padding-right: 6px; - } -} diff --git a/tailwind.config.js b/tailwind.config.js index f359120..dd5e0ea 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -41,7 +41,7 @@ export default { blend: generateBlends() }, borderRadius: { - DEFUALT: "var(--radius)" + base: "var(--radius)" }, borderWidth: { DEFAULT: "var(--border-size)" @@ -63,6 +63,9 @@ export default { fontWeight: { base: "var(--font-weight)" }, + fontSize: { + "zb-size": "var(--font-size)" + }, height: { bar: "var(--height)" }, From 1208e7b8fefd3d0856df6c3e0568fde0b45de0bb Mon Sep 17 00:00:00 2001 From: adriankarlen Date: Fri, 20 Sep 2024 14:42:23 +0200 Subject: [PATCH 3/5] fix: use 0 radius as default --- src/app.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.css b/src/app.css index 26a630a..715af59 100644 --- a/src/app.css +++ b/src/app.css @@ -20,7 +20,7 @@ /* border */ --border-size: 0.125rem; - --radius: 0.25rem; + --radius: 0; /* shadow */ --shadow-size-bar: 0.25rem; From 5396b4b0838f04db5ed97d798a1a23a7a4320171 Mon Sep 17 00:00:00 2001 From: adriankarlen Date: Fri, 20 Sep 2024 15:13:53 +0200 Subject: [PATCH 4/5] docs: update for v2 --- README.md | 164 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 143 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 5ce6766..61d90a2 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,160 @@ -# create-svelte +# 🟦 Neobrutal [Zebar](https://github.com/glzr-io/zebar) -Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). +An Zebar configuration for Zebar V2 build in Svelte with Tailwind. -## Creating a project +## ✨ Features -If you're seeing this, you've probably already done this step. Congrats! +- Process icons for current workspace, with current focus indicator. +- System information meters, with dynamic coloring and animations. +- Spotify, currently playing song. +- Configuration using CSS-variables. -```bash -# create a new project in the current directory -npm create svelte@latest +> [!IMPORTANT] +> +> This configuration is it's early development. Contributions are +> welcome, especially to the process icon map, as I only mapped the ones I use +> that could not be automapped. -# create a new project in my-app -npm create svelte@latest my-app +## 🖼️ Showcase + +### Fullscreen + +![image](https://github.com/adriankarlen/neobrutal-zebar/blob/main/misc/fullscreen.png) +### Workspaces + +https://github.com/user-attachments/assets/38e4a09f-1583-4e2a-84e5-6da7156402b2 + +### System info + +https://github.com/user-attachments/assets/185f238c-03b8-4f63-87a2-2d36d6b31039 + +## 🚀 Getting started + +### Getting the config in place + +Download the `neobrutal-zebar.zip` from the latest release. Unzip the contents +inside your zebar config directory. + +### Configuring CSS-variables + +In `src/app.css` there exists a lot of configuration available to tweak. + +## 🎨 Themes + +### 🌷Rosé Pine (default) +
+Example config + +##### src/app.css +```css +/* colors */ +--text: var(--rp-text); +--bg: var(--rp-overlay); +--border: var(--rp-highlight-low); +--shadow: var(--rp-highlight-low); +--icon: var(--rp-love); +--memory: var(--rp-iris); +--cpu: var(--rp-rose); +--cpu-high-usage: var(--rp-love); +--battery-good: var(--rp-pine); +--battery-mid: var(--rp-gold); +--battery-low: var(--rp-love); +--focused-process: var(--rp-text); +--process: var(--rp-muted); +--displayed: var(--rp-text); +--ws-1: var(--rp-gold); +--ws-2: var(--rp-love); +--ws-3: var(--rp-pine); +--ws-4: var(--rp-foam); +--ws-5: var(--rp-iris); +--tiling-direction: var(--rp-rose); +--not-playing: var(--rp-love); +--now-playing: var(--rp-pine); +--network: var(--rp-text); +--weather: var(--rp-text); ``` -## Developing +
+ +### 😸 Catppuccin + -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: +Utilizes [Catppuccin Palette](https://github.com/catppuccin/palette/blob/main/docs/css.md), configure css variables accoriding to your liking. -```bash -npm run dev +
+Config show in picture above -# or start the server and open the app in a new browser tab -npm run dev -- --open +##### src/app.css +```css +/* border */ +--radius: 9999px; + +/* shadow */ +--shadow-size-bar: 0; +--shadow-size-button: 0; + +/* colors */ +--text: var(--ctp-mocha-text); +--bg: var(--ctp-mocha-surface0); +--border: var(--ctp-mocha-crust); +--border-button: var(--ctp-mocha-crust); +--shadow: var(--ctp-mocha-mantle); +--icon: var(--ctp-mocha-red); +--memory: var(--ctp-mocha-mauve); +--cpu: var(--ctp-mocha-pink); +--cpu-high-usage: var(--ctp-mocha-red); +--battery-good: var(--ctp-mocha-green); +--battery-mid: var(--ctp-mocha-peach); +--battery-low: var(--ctp-mocha-red); +--focused-process: var(--ctp-mocha-text); +--process: var(--ctp-mocha-surface2); +--displayed: var(--ctp-mocha-text); +--ws-1: var(--ctp-mocha-peach); +--ws-2: var(--ctp-mocha-red); +--ws-3: var(--ctp-mocha-green); +--ws-4: var(--ctp-mocha-blue); +--ws-5: var(--ctp-mocha-mauve); +--tiling-direction: var(--ctp-mocha-lavender); +--not-playing: var(--ctp-mocha-red); +--now-playing: var(--ctp-mocha-green); +--network: var(--ctp-mocha-text); +--weather: var(--ctp-mocha-text); ``` -## Building +##### src/components/RightGroup.svelte +```svelte + +
-To create a production version of your app: +## 🍳 Recipies -```bash -npm run build +
+Soft Brutal + +```css +--radius: 9999px; ``` -You can preview the production build with `npm run preview`. + +
+
+Round bars without shadow + +```css +--border-size: 1px; +--radius: 9999px; +--shadow-size-bar: 0px; +--shadow-size-button: 0px; +``` + + +
+ +## 📜 License -> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. +This project is licensed under the MIT License - see the +[LICENSE](https://github.com/adriankarlen/neobrutal-zebar/blob/main/LICENSE) file From 3be10d551c226d4cbbefcc9e9128d35fb15fb4ab Mon Sep 17 00:00:00 2001 From: adriankarlen Date: Fri, 20 Sep 2024 15:17:44 +0200 Subject: [PATCH 5/5] docs: redirect to V1 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 61d90a2..716e04d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # 🟦 Neobrutal [Zebar](https://github.com/glzr-io/zebar) -An Zebar configuration for Zebar V2 build in Svelte with Tailwind. +An Zebar configuration for Zebar V2 build in Svelte with Tailwind. If you are +still using V1 of Zebar the old config is available in the [V1 branch](https://github.com/adriankarlen/neobrutal-zebar/tree/v1). ## ✨ Features