From 86ddceb64690ea6549589c6cde12b46960557d89 Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Fri, 15 May 2026 14:38:39 +0300 Subject: [PATCH] feat: custom themes polishing --- .../src/lib/admin/stores/themesStore.js | 8 +- bot/app/web/themes/windows95/icons/README.md | 9 -- .../web/themes/windows95/icons/arrow-left.png | Bin 610 -> 1708 bytes .../themes/windows95/icons/arrow-right.png | Bin 423 -> 1920 bytes .../web/themes/windows95/icons/bitcoin.png | Bin 395 -> 1698 bytes .../web/themes/windows95/icons/dashboard.png | Bin 371 -> 1686 bytes bot/app/web/themes/windows95/style.css | 149 ++++++++++++------ bot/app/web/themes/windows95/theme.json | 2 +- tests/test_webapp_themes_config.py | 4 +- 9 files changed, 104 insertions(+), 68 deletions(-) delete mode 100644 bot/app/web/themes/windows95/icons/README.md diff --git a/bot/app/web/frontend/src/lib/admin/stores/themesStore.js b/bot/app/web/frontend/src/lib/admin/stores/themesStore.js index 41d4a6d..41c9f6a 100644 --- a/bot/app/web/frontend/src/lib/admin/stores/themesStore.js +++ b/bot/app/web/frontend/src/lib/admin/stores/themesStore.js @@ -119,8 +119,7 @@ export function createThemesStore({ api, onThemesSaved, flash, at }) { } } - async function setCurrentTheme(key) { - let changed = false; + function setCurrentTheme(key) { state.update((s) => ({ ...s, themesCatalog: { @@ -132,11 +131,6 @@ export function createThemesStore({ api, onThemesSaved, flash, at }) { })), }, })); - state.update((s) => { - changed = s.themesCatalog.default_theme === key; - return s; - }); - if (changed) await saveThemes({ silent: true }); } function togglePrimaryAccent(key, enabled) { diff --git a/bot/app/web/themes/windows95/icons/README.md b/bot/app/web/themes/windows95/icons/README.md deleted file mode 100644 index 83e5f70..0000000 --- a/bot/app/web/themes/windows95/icons/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Windows 95 theme button icons -============================= - -These PNG icons were sourced from the Windows 98 Icon Viewer: - -https://win98icons.alexmeub.com/ - -Original filenames were normalized for theme CSS usage. They are loaded by -`bot/app/web/themes/windows95/style.css` through `/webapp-theme-assets/...`. diff --git a/bot/app/web/themes/windows95/icons/arrow-left.png b/bot/app/web/themes/windows95/icons/arrow-left.png index d08f5e96bcebec55887b39f029fd915e9cefc652..38a3df67e0ec250a780d4bcabbe9978c27601333 100644 GIT binary patch literal 1708 zcmbVNOKjXk7&eGd64G$!0aW#1xgc7=_SjxKyVEXJ5^uU&)oGe8Nu->0Uhc5fWoJj8L_##+^!Vb|eoeap@4_xSe1LZPbqiSG z1ZjHJ<%k?uo~q;Jd0cXYUH9`l+mI3XBtd-JZv`=ImxT^5Wb5p)EbtvjGG7+PvVi=Y zHO)`Zi0}%KfQSJAysAsPB}WCMU>NuDDo}MI8SNOj^VzK@u~pl4HXrO=#Stm!ZyI zUlf3q*Rt{$>uT}+JVcyS7Fim-f~<><>q{Y#XGlyJB1|faOy<@sn-ES!1SK@8Q`+jA zHQkrYtD}<6Z=3Z3hoI8X`qi z#J1v!8Yy701h6KKYMN`fsxfMe=JEGM9y?vAb=^GKnaf%NR=t>+wbVNi2gswnRmufzy1Ojk%vRzEy~o}<6}Ywxy0mGNFw!g7-G#-}O;Qw*u?DNwRoh9vocI_mURnCJ znYXU=|F_@uNbi*uH&M_aY+TAhmW-SYm98oBrG9nZT`++9a5mMlWj<2bO+J)Kz^EfO za*urY`Fm_!zf?2F>f4?_Ix{%(1Q?F*K3{pG^F{gWF`zBPF?{$b#h_4Dr| zgGX+9q5bgc7h679d2G*%U%vh6L$`1Fclb$r^)#yfcJ`6R-d9$YJO3H@b;p}O-3H(J zYb8B&*WdcNvpbF*<8GvG{m1vesg6JQ%+r-O?)k2M=)?nav!9(=dG_V%yK9?|AKvr* k$k+JwDf9d|`SzDjHl$yz?I%MAN3#EuT4l;SHGXjQKQs{~{r~^~ literal 610 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp&sB9;tEpG&~V_ufrbVk z3&dgg4+0DfKm_Cic_607#P3W%4r57>UoeBivm0q3PLj8~3%gii$7>*my~NYkmHiQ$ z6oZcZ_+ptQE9i(`n!`O=Gf{aPFZ4isjrjCthFGj*~A@0N1@1qGbb;?7CDXI*o2 zhG|T?#**jTfvOAkkx!0BwrQ+lykzpp*oS9JliZfiYkW3dxnQ-r zEqfQsWfs@mTJfJ6od@T#1?FAd=dobYly{#6S%j2sZwuv|ewSZ%Mayj)n+C6nWPVny z1)J=fdmaQt+St5nHIC!{`tXLXN%FzD`VEVs-;49i?w<9?`|^s=TottzhRdHC{`%;* zDNVU+ULE|{|Kt5X3>GUo7ARZIeF_Xo)e_f;l9a@fRIB8oR3OD*WMF8aYhb2pWENsz vU}a)rWo)QxU}9xpAh=6G3PnS1eoAIqC2kD~&u1(HYGCkm^>bP0l+XkK{50WP diff --git a/bot/app/web/themes/windows95/icons/arrow-right.png b/bot/app/web/themes/windows95/icons/arrow-right.png index 422537f439b8901377a8b80064ef83dec04be08c..5c1cb205f1eeb2735269a5af10df64fe499b0ea6 100644 GIT binary patch literal 1920 zcmb_dUuYaf9Nwa&8dH>rAWCH2sx;{A&i=jKZLVp0m-HfD8q&i=1aWqD_HN1D&bqtF z-35KA6tSh$3JQw8DPoa6h`zLn526o3P%I+8NTC`^kyi9UD6}|xf7UdlX(=A;?df&;9AOjeGaK z2RUxw9lx@WER>(IF>Q#*r4A8WjgX-^Zfv|2BD_cv-XT>#$P1Uxd?oO{n-}KwGAxG$ zQu9kI5jnUrQ^6~X*m8yOJ^Wb9W&{nAAimY82eIAC3msmYjnmhXz;__YVqTa?1M&;y zS-wCc!pl&E07D3QMHlyrt^$c>7*FvERCGyJBxnK!+B&oqneY7s7BO-?d#*Uui^rbw zLM=%`Taud1rr1(&HLgN~}0d@BI zx&W-a<#HBdQ!R}~79vh2msuLUf^3S8EA5a-b0nrq5hjz%Oy?a`=#Si*h-Rf!Y^Re{gSXcuUmMl3K>r*>47%l32-Cn&&V zx|kPO&Z6(THpy9jHn$c%F5czDaq568(RF%sZp=YUxm;aW% z7+4UiAg8LH;VDMW$f>EDI|i{!e#~0e?yZl5Zhe;dF z*ZHec3jksn5`+0fYv<7E ztNNw(M@Q$LK62!-(zm~U`T;(0{<}+s2ew~XU43}wzTeN1)enXAjGUgFDW2N*;-P;5 D;hS2MYfG{~t&IMIrQ!X%R_4QO1%WzhDN3XE)M7oFs2|7ml`jQ>%a+_7YEDSN2D2 zQVcrslUq$RfkFkIE{-7_*OLNGi-_8v-#!^9D07`YKZlV!w8dHS>f5L3UI&Au zZ})pQNIYt~t-a*nw`tsMT~09padCVMHY=1Gmjs_W1+-hW#5JNMC9x#cD!C{XNHG{0 z7+UBWnCTjsg%}uEnV47^8|oUESQ!`y?oyCK(U6;;l9^VCTSLP08Owkg7(8A5T-G@y GGywp$b%qN7 diff --git a/bot/app/web/themes/windows95/icons/bitcoin.png b/bot/app/web/themes/windows95/icons/bitcoin.png index a9b721218f67a85d127c464eab5bd2ff11e98489..55de9d3a212fca6884f05e74a33cf5a7963296e4 100644 GIT binary patch literal 1698 zcmbVNe@q)y96xXw8xFzY;voJw4>G}dKig6`=r(8(x~xc`P-gsN*SpvDLhr}!uC!nr z1{?-;rpv@^%a#!~jl{*wY_7&BBU6m~L(M|6WC{Ts)5!ci{}E>NU1^(bnJ(^ zpZEFx{@!47Q$t>EaV~-&dG1D63!L-Kv1%oJS6>|33a8a-<8~cE?kzM&7IN^=dIVYV zo9OK@Iy~E0UXch+Q2c<1Nh(AmNX_P$%JH4RK>Z*n$`0(8GiNbW6dah(=Ak^Q6NJRZ z9u2hiGVrulsvd| zU?Ia$S(1!KqeRp~C|Z!DtE#F$0nSh~ zucCz0!D>#cj52n@hL-t6Sx};S`3)C)Zvm0tQ4Tp`uTxPlu z++_L~kYV%EV3(R-I6sCUSw6R`)?2n$+V@pcHeK*p?xaSz9vf~_Y`PF`p$znHkXV|drl@Rq3;4=+x2MXM`L#l!(@;rQspY3YZy z{1GnqLZJHGS!M0zHOJPmFHDUfks_nD?^#zkXi?-gI9 cwqYsf=h36H$6nfV+Wd>S>ziEf*6rx~2L(D#lK=n! literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFO`~`P`^#J8V&xy1i|n|jK>ZF$JyT%Xt# zdDZrJ8F&{LwpTU)ty3*=jVMV;EJ?LWE=mPb3`Pcq7PgTe~DWM4fdtQEo diff --git a/bot/app/web/themes/windows95/icons/dashboard.png b/bot/app/web/themes/windows95/icons/dashboard.png index 7bd6f7920406f45bc39267c917f62d44d3137015..18f939b6575df0963054fb457fb3059e244ed35c 100644 GIT binary patch literal 1686 zcmbVNeQXnD9KHnvI~ge8bRglpO(weDS9|SxTUo|#tPN|oY>k`5gkA66c9-=&xVzDA zD9C2Sv4of?CK5$KqXCme=jIj!beb%hkT^};W@coI#{R>UMJG5G;(J}&06~dda(D0D zJ@51TJ-@H(sSnoVtF;$0#p?8jy z7l8olR}7O^1mNeq7}ShQlE{YLe3*1ZO6?3qI-v$9u!r5HVSA|~>;xW{i+3}g%zjQ4 z+O5oH_KW{>f1NJD?&4#2&13bPRT8XEGGMYg(jCzV_M}%a2~AZ2%L`U@dojUED-f~t zYw4~dutXbg1(5VV(!B&T)QB19bx;|F(Yj+f5zu+U>cb@+#H|uj-)`vH3>*#uYnh!w z@F6?LfC7h?4yV+IUHd2m$=T`WDnq`W+1F;}FVXv7T*Eb8USH59o#7UKe)&@Dl}#;& zYWeo=r%s-koE)8hV2XOTV&UYv$wM7iON048?Mobeb=Z0K%Hqt4Q`PuzZI@%`o)&iX zqicJA-7>_#U$oLSS~Rl$iN=q|`v85}HhlW@R}Wt4+3ksr?8>_~lkA_KyD;(m%5yb! zC5f$DB6H}_!KTBbFMNcCJEuPA9;sZBhbZTgWrO(_F8)z$em`;Ix&Gqe5xMNFJay^y zpgxWJ7F(Vfdn8va)QY)f1(WFRdm`WbxXV2-fBu)j%}1`<9xLjtzdm!o)_3^3$PW!i z#kvE71LI)m&1rG@d*UZK$AiYHl9xgYt3wxO1Gc}*2I;qocN9OAOnyGryZ@cVf#Vyo z{_{20-yU0YY(v+#tA5*-9DR2Gz!wE|O{zIL S{h2dw{W<*AL9TCmOV>Z!2t$$p literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF span { + display: grid; + grid-template-columns: minmax(0, auto) minmax(0, 1fr); + align-items: center; + gap: 8px; +} + +.theme-key-windows95 .admin-language-trigger strong, +.theme-key-windows95 .admin-language-trigger small { + min-width: 0; + margin: 0; + white-space: nowrap; +} + +.theme-key-windows95 .admin-language-trigger small { + display: inline-flex; + align-items: center; + gap: 5px; + overflow: hidden; + text-overflow: ellipsis; +} + .theme-key-windows95 .admin-nav-item:hover, .theme-key-windows95 .admin-select-item[data-highlighted], .theme-key-windows95 .admin-select-item:hover, @@ -738,9 +788,10 @@ } .theme-key-windows95 .admin-nav-item.active, -.theme-key-windows95 .admin-btn-primary, .theme-key-windows95 .admin-tabs-trigger[data-state="active"], -.theme-key-windows95 .admin-revenue-period-btn.is-active { +.theme-key-windows95 .admin-revenue-period-btn.is-active, +.theme-key-windows95 .admin-btn:active:not(:disabled), +.theme-key-windows95 .admin-btn[aria-pressed="true"] { border-color: #404040 #ffffff #ffffff #404040; box-shadow: inset 1px 1px 0 #000000, diff --git a/bot/app/web/themes/windows95/theme.json b/bot/app/web/themes/windows95/theme.json index f390472..4631f6a 100644 --- a/bot/app/web/themes/windows95/theme.json +++ b/bot/app/web/themes/windows95/theme.json @@ -9,7 +9,7 @@ "use_primary_accent": false, "use_in_admin": true, "css_file": "style.css", - "assets_version": 1, + "assets_version": 5, "tokens": { "color_scheme": "light", "style_preset": "win95" diff --git a/tests/test_webapp_themes_config.py b/tests/test_webapp_themes_config.py index 1cb81fe..a643603 100644 --- a/tests/test_webapp_themes_config.py +++ b/tests/test_webapp_themes_config.py @@ -33,7 +33,7 @@ class WebappThemesConfigTests(unittest.TestCase): self.assertEqual(win95.tokens.style_preset, "win95") self.assertFalse(win95.use_primary_accent) self.assertTrue(win95.use_in_admin) - self.assertEqual(win95.assets_version, 3) + self.assertEqual(win95.assets_version, 5) ascii_theme = cfg.theme_by_key("ascii") self.assertIsNotNone(ascii_theme) self.assertEqual(ascii_theme.css_file, "style.css") @@ -380,7 +380,7 @@ class WebappThemesConfigTests(unittest.TestCase): descriptor["assets_version"], cfg.theme_by_key("windows95").assets_version, ) - self.assertEqual(descriptor["assets_version"], 3) + self.assertEqual(descriptor["assets_version"], 5) self.assertIn("lucide-house", css) self.assertIn("lucide-earth", css) self.assertIn("lucide-circle-check", css)