From c19ff19de2ed9de364911eb20eef579ca994281a Mon Sep 17 00:00:00 2001 From: blindxfish Date: Sun, 9 Aug 2026 20:55:46 +0200 Subject: [PATCH 1/4] Align the platform look and feel with the devplace.net terminal design Retheme every token in variables.css to the terminal design language: near-black surfaces (#0a0a0f/#111118/#1a1a24), terminal green accent (#22c55e) with dark on-accent text, gray text ramp, #222233 borders, sharp 4-8px radii, neutral depth shadows, and JetBrains Mono as the primary UI font (vendored latin woff2, no CDN). Follow-through outside the token file: white-on-accent buttons/tabs now use the new --on-accent token for contrast, three var() fallback violations shipping the old palette are gone, the dead --bg-hover token is replaced with --bg-card-hover, avatar fallback SVG, statistics chart palette, chat light-theme overrides, offline page, PWA manifest, theme-color meta, OG image + app icons regenerated in the new palette, and the /docs/styles-colors style guide now documents the new values. Co-Authored-By: Claude Fable 5 --- devplacepy/avatar.py | 4 +- devplacepy/static/apple-touch-icon.png | Bin 2083 -> 1507 bytes devplacepy/static/css/admin.css | 14 ++-- devplacepy/static/css/auth.css | 2 +- devplacepy/static/css/base.css | 12 +-- devplacepy/static/css/chat.css | 4 +- devplacepy/static/css/containers.css | 2 +- devplacepy/static/css/deepsearch.css | 6 +- devplacepy/static/css/docs-chat.css | 2 +- devplacepy/static/css/docs.css | 4 +- devplacepy/static/css/feed.css | 6 +- devplacepy/static/css/issues.css | 4 +- devplacepy/static/css/landing.css | 14 ++-- devplacepy/static/css/news.css | 2 +- devplacepy/static/css/profile.css | 8 +- devplacepy/static/css/project_files.css | 4 +- devplacepy/static/css/projects.css | 2 +- devplacepy/static/css/sidebar.css | 2 +- devplacepy/static/css/variables.css | 65 ++++++++-------- devplacepy/static/icon-192.png | Bin 2440 -> 1610 bytes devplacepy/static/icon-512.png | Bin 7026 -> 4473 bytes devplacepy/static/icon-maskable-512.png | Bin 5515 -> 4473 bytes devplacepy/static/js/StatisticsCharts.js | 4 +- devplacepy/static/js/components/AppChat.js | 14 ++-- devplacepy/static/manifest.json | 4 +- devplacepy/static/offline.html | 18 ++--- devplacepy/static/og-default.png | Bin 30026 -> 45552 bytes devplacepy/static/og-default.svg | 13 ++-- .../jetbrains-mono-latin-400-italic.woff2 | Bin 0 -> 22228 bytes .../jetbrains-mono-latin-400-normal.woff2 | Bin 0 -> 21168 bytes .../jetbrains-mono-latin-500-normal.woff2 | Bin 0 -> 21832 bytes .../jetbrains-mono-latin-600-normal.woff2 | Bin 0 -> 21860 bytes .../jetbrains-mono-latin-700-normal.woff2 | Bin 0 -> 21908 bytes .../static/vendor/fonts/jetbrains-mono.css | 46 ++++++++++++ devplacepy/templates/base.html | 3 +- devplacepy/templates/docs/styles-colors.html | 70 +++++++++--------- 36 files changed, 189 insertions(+), 140 deletions(-) create mode 100644 devplacepy/static/vendor/fonts/jetbrains-mono-latin-400-italic.woff2 create mode 100644 devplacepy/static/vendor/fonts/jetbrains-mono-latin-400-normal.woff2 create mode 100644 devplacepy/static/vendor/fonts/jetbrains-mono-latin-500-normal.woff2 create mode 100644 devplacepy/static/vendor/fonts/jetbrains-mono-latin-600-normal.woff2 create mode 100644 devplacepy/static/vendor/fonts/jetbrains-mono-latin-700-normal.woff2 create mode 100644 devplacepy/static/vendor/fonts/jetbrains-mono.css diff --git a/devplacepy/avatar.py b/devplacepy/avatar.py index 2eccd679..ba0471fe 100644 --- a/devplacepy/avatar.py +++ b/devplacepy/avatar.py @@ -28,6 +28,6 @@ def generate_avatar_svg(seed: str) -> str: initial = seed[:1].upper() if seed else "?" return ( '' - f'' - f'{initial}' + f'' + f'{initial}' ) diff --git a/devplacepy/static/apple-touch-icon.png b/devplacepy/static/apple-touch-icon.png index 9868addb67695498958f3b5e9f23a1ccced3efde..8d4cc517fe383ed8c55e7dd7bedc4535baa98175 100644 GIT binary patch literal 1507 zcmchX{WsGK0LEADxR;BWd*w23=}-zuY{y%X?(C+K!|YgErJ73knwR9VvM|ObTA^8; zvMb4!*1Uu%o7T)rDyDh6CJdpejkt03AKY{9Ii2S`&vVZ6^K(AA!Dytuu9+?f1ky(Z z_=jxtlW+cU^F}`AUOT-}+9wYo{Xy&Bbf=}V7z6^Bp!|J9FEZzbrE%s5L1LhXBcl({ z-gx06)JA2P;NFlUHa7dc(AV|6iT4p7p->VSes$Tf5Mr&qT-b284SXa5l3Dla4{(v+ zS@~W^RFplZ7W&iIoRwQzDUb)QSQf@JloBQM7fWt(ZU9m=cbKLH6@L$E`!7^s9 ztw9ipv>G^2s^iLnmmG?71~*CHY1uYb`R*H}*C33M$o4r+h~v=*S>drYOf-8>V<&k~ zkG^1r2>raW1FCog=@))#&DxTIFEia~dE3EaXX;m=s^6;Tv8|%P8;(z1|1jivGn@lY z^Dc|EriJAV)>O+(MtstysO;n>8Ts9DQLSBn5l{5h z6=@iy9c&AsA$Znu+)ja+vAAaNdi4d>o)*}w7Ac9gf{8(Uj?CwF!H`EiBGEf9e9=3p`X1v@MWChGF zmiHZ##-0(K5dP3(xr>H->r!uuY1++lvN7;{9;`x9CHKPg3B#ox6k!p{iuH0Ch2#sP z1-%7hiC_S0?nLO25N<@*j&;8Eh4nXI`CQU|8p%IE5%GGgW8?uwNS&W)`Yli3@qn%!O)X*Q;C+soCdKs!uqjcI2@|iY z>DMcnE6XcEPTkp&C$hyIT$s~bQeFNpz{4!n8>GgtwE>Px_!P4US70q%eJ~!tqtEfZ zM6dkNJVeZI;|nlnFCKSUSvcn|!r@1~digGbRw8cx6?RRj8Dhm)1)8iY(6A9v@cc7* zN|GDkz|iC`u(db0GMA8x&(qnRoV&LdMhz3sEOttc(Kp=+T^BeOQobvH{uAh?ou>(| Vbmdt7r44F>PzTZe9KYk4{{nF0w2A-# literal 2083 zcmbVNdpHyN8yB5gIy71da|n^;lIAkGC2AyQF01Ugr05Kp715{;9c8(t)DTwK(iqCz zS*NvfPZl$|wM`c0Zehf4=lA@c^Zb6lKhGcU`+eTe`+eW<_j%s;^Lz*%?r;TpHF+5s z83h+-Cr{}~|H}ZfQva$VGgwAu`=pDLgLmxb>0xv@sDI1vysP6iRWXB&jPsSIf$|9; zd0eFLQ(|!vFc;`+j?smDUGT`cPh?bwmRh(SBA+7LnL()E9Mub{p>kA4oqBt^dsf+#2*wlmqTB6rrsju4s6 z9Rq7A0=Fm2v9|F43T6K7{|A)$PwKzHzwiGICZLJDQgVH+N%gd*=Kuqg3u?&n1o-Wy zWYz39a^p78qg0_6huC~dYK|}S0S4`wv_z+o!)XVomM5b8l;M$&Y>*31$k^imp8S5B z%uV_xidbk+XmW3&L-{0}Epk>X4ehF_a|Z*<^|w7AeuG)g&&;?@eMzszTy?x%{lcpE z95zYTw#GTYc3;411i38S?`HjhrDN!o5tKCslL}tR7U1u0%X5@-cP0*^r~NvL0)7R` zvz?i>dw#l7zTCeEwf0wUocgnMV&uTyT2@Z?=qPqJ-x?6VcX~7W97!k&^4E;I$+esi9{5@0Ga$6&*s+yz7UAXkd4F;1T@OXXfKA>YZF#Cubi=(_d|%vHtszW7pcO`(?k2 zL~%q#=_>mITz~z#$N@~UDGB8>P-}?gV#zfNJGxonBcn_~(W-ruy&KpEhu(hpPO3GTM9S7phfrMR$0oTQ=uZadAJ+zB zA|$ulv~k|G~{KKm=eX0sxUg%s~?NxO|^r=5Ryqlrt>SpH;g#jkUi#tFzq zFDjocth~iF-w;v=IsjB(Zg)fp^5z(iw3d)8pon~bxn5~oHYW!U8LEX}VJQJ$*Fj%g z6D}+ysqz8Il;n-x$?SHRU6c(UkZM~hz-(Mv&cZtL;HY$7% z0pSs3+3-eDDtOB)8_Wn+9jcVhdo27u?#- z`uw^sjRCUm8=v7o8ueqo_-4XngD;;NparQsSG7t!!E^gXgi53wpc$1Fx>0Hr0)$6iO!43JIjPu5#(ID482+5B;si*Z#!8o4?+Dq^)RvGY0i__w}O$ox|_**jvcE`nX&tu*1Bl%_T`? zO2tVWoeF+4_vYgK@+PVtQUBV=@W;zg7S79NKO;tT3OOOzKZ{-LP`8jyZC$d|`@|8V zNoRw48r2-7^G{b07Fa!7@nIs$l0!X#@Mvpu|JapEK9QcJu*$txa*LA*i(pAPV7XDg zAtq%Qrt~JoFR7cZxCK-cqI0dh5FS;Bn2YYxIUy zEv~eMhu0S3)2FOXU^@-`+8f@UTV`g(g%n2WK`XGudylV&Tu8GYg@MOl4RO%nW>u2O zSPVAhGIrh%Cf&#H46u{yy z1=Cj9kE58>L?Z-vvC$Gk$JdajrYE@~mgy}5J@>rsqPmxWN58~>5KGA|kPs%@c$ zy(AQgq-1M;5@u<3)~9xih5T@%29$AAPx8?EfvFctu&^6mU*?w6J?vA(7@>~%Xeo*x z>!xa!xr)MfbwC1?_#POy_Mxhy8-a0Wi4JEq_#Rq8ts2w3*(j$*HJTPp1vgZeZ7_>@ z`I-T1ihibH9z2J-4=YDB(`YW|{L(m-@sARE@K%YgHZFdF(&OZH7MrH7v7<-_W9X_z zqCusLg#K;k);Mu7Fc*}YB{k4vJ;w&X#F1i`!TY9;?@t>=v}GHF85#wLVbF*{-)361 zllV?$c^g{N?TBx*R@FVMZ`_pd|B`qN{Lgg~C$l+a|H#jth21vGl8V2K%L#X<^5cPt F{{o6C3vmDd diff --git a/devplacepy/static/css/admin.css b/devplacepy/static/css/admin.css index 48d6c8cd..112f8176 100644 --- a/devplacepy/static/css/admin.css +++ b/devplacepy/static/css/admin.css @@ -205,14 +205,14 @@ } .admin-btn-primary { - background: var(--accent, var(--info)); - color: var(--white); + background: var(--accent); + color: var(--on-accent); border-color: transparent; } .admin-btn-primary:hover { - background: var(--accent-hover, var(--accent)); - color: var(--white); + background: var(--accent-hover); + color: var(--on-accent); } .admin-btn-danger { @@ -399,7 +399,7 @@ .pagination-btn:hover { background: var(--accent); - color: var(--white); + color: var(--on-accent); border-color: var(--accent); text-decoration: none; } @@ -443,12 +443,12 @@ .pagination-page-active { background: var(--accent); - color: var(--white); + color: var(--on-accent); } .pagination-page-active:hover { background: var(--accent-hover); - color: var(--white); + color: var(--on-accent); } .pagination-ellipsis { diff --git a/devplacepy/static/css/auth.css b/devplacepy/static/css/auth.css index 4012f0e9..5d90532c 100644 --- a/devplacepy/static/css/auth.css +++ b/devplacepy/static/css/auth.css @@ -117,7 +117,7 @@ font-size: 1rem; font-weight: 700; background: var(--accent); - color: var(--white); + color: var(--on-accent); border-radius: var(--radius); } diff --git a/devplacepy/static/css/base.css b/devplacepy/static/css/base.css index 595adde5..acf2c1d4 100644 --- a/devplacepy/static/css/base.css +++ b/devplacepy/static/css/base.css @@ -445,8 +445,8 @@ img { .btn-primary { background: var(--accent-gradient); - color: var(--white); - box-shadow: 0 2px 12px rgba(255, 95, 70, 0.3); + color: var(--on-accent); + box-shadow: 0 0 0 1px rgba(var(--accent-rgb), 0.35); } .btn-primary:hover { @@ -554,7 +554,7 @@ img { justify-content: center; font-weight: 700; font-size: 1rem; - color: var(--white); + color: var(--on-accent); flex-shrink: 0; overflow: hidden; } @@ -589,7 +589,7 @@ img { pointer-events: none; } -.presence-dot.online { background: var(--success, #2f9e44); } +.presence-dot.online { background: var(--success); } .award-badge { position: absolute; @@ -650,7 +650,7 @@ img { .nav-bell { position: relative; display: inline-flex; align-items: center; justify-content: center; line-height: 1; } .nav-badge { position: absolute; top: -6px; right: -8px; z-index: 1; min-width: 16px; height: 16px; - padding: 0 0.25rem; border-radius: 8px; background: var(--accent); color: var(--white); + padding: 0 0.25rem; border-radius: 8px; background: var(--accent); color: var(--on-accent); font-size: 0.6875rem; font-weight: 700; display: flex; align-items: center; justify-content: center; } @@ -884,7 +884,7 @@ img { button.comment-form-submit { padding: 0.375rem 0.5rem; background: var(--accent); - color: var(--white); + color: var(--on-accent); font-weight: 600; font-size: 0.8125rem; line-height: 1.4; diff --git a/devplacepy/static/css/chat.css b/devplacepy/static/css/chat.css index 1e1d2f49..1e5f92a3 100644 --- a/devplacepy/static/css/chat.css +++ b/devplacepy/static/css/chat.css @@ -232,7 +232,7 @@ dp-chat[mode="embed"] { .message-bubble.mine { align-self: flex-end; background: var(--accent); - color: var(--white); + color: var(--on-accent); border-bottom-right-radius: 4px; } @@ -429,7 +429,7 @@ dp-chat[mode="embed"] { height: 36px; padding: 0; background: var(--accent); - color: var(--white); + color: var(--on-accent); border-radius: 50%; display: flex; align-items: center; diff --git a/devplacepy/static/css/containers.css b/devplacepy/static/css/containers.css index 24969e26..7c2b6402 100644 --- a/devplacepy/static/css/containers.css +++ b/devplacepy/static/css/containers.css @@ -209,7 +209,7 @@ .cm-suggest li:hover, .cm-suggest li.cm-suggest-active { - background: var(--bg-hover, var(--border)); + background: var(--bg-card-hover); } .cm-suggest li.cm-suggest-active { diff --git a/devplacepy/static/css/deepsearch.css b/devplacepy/static/css/deepsearch.css index 12c62d06..34471337 100644 --- a/devplacepy/static/css/deepsearch.css +++ b/devplacepy/static/css/deepsearch.css @@ -241,7 +241,7 @@ .ds-phase.is-done .ds-phase-dot { background: var(--accent); border-color: var(--accent); - color: var(--white); + color: var(--on-accent); } .ds-phase.is-done .ds-phase-name { @@ -546,7 +546,7 @@ dp-deepsearch-chat { .ds-chat-msg.user .ds-chat-bubble { background: var(--accent); - color: var(--white); + color: var(--on-accent); } .ds-chat-msg.agent .ds-chat-bubble { @@ -597,7 +597,7 @@ dp-deepsearch-chat { .ds-chat-send { background: var(--accent); - color: var(--white); + color: var(--on-accent); border: none; border-radius: var(--radius-input); padding: 0 var(--space-md); diff --git a/devplacepy/static/css/docs-chat.css b/devplacepy/static/css/docs-chat.css index a0a721df..c598bc7d 100644 --- a/devplacepy/static/css/docs-chat.css +++ b/devplacepy/static/css/docs-chat.css @@ -292,7 +292,7 @@ dp-docs-chat { .docs-chat-send { background: var(--accent); - color: var(--white); + color: var(--on-accent); border: none; border-radius: var(--radius); padding: 0.625rem 1.25rem; diff --git a/devplacepy/static/css/docs.css b/devplacepy/static/css/docs.css index 99474666..f28ca220 100644 --- a/devplacepy/static/css/docs.css +++ b/devplacepy/static/css/docs.css @@ -431,7 +431,7 @@ textarea.param-input { .format-option.active { background: var(--accent); - color: var(--white); + color: var(--on-accent); } .format-fixed { @@ -621,7 +621,7 @@ pre.code-pre > .code-gutter { .docs-search-snippet mark { background: var(--accent); - color: var(--white); + color: var(--on-accent); padding: 0 0.125rem; border-radius: 3px; } diff --git a/devplacepy/static/css/feed.css b/devplacepy/static/css/feed.css index 84f2951f..02066959 100644 --- a/devplacepy/static/css/feed.css +++ b/devplacepy/static/css/feed.css @@ -39,7 +39,7 @@ .feed-nav-btn.active { background: var(--accent-gradient); - color: var(--white); + color: var(--on-accent); box-shadow: var(--glow-accent); } @@ -285,7 +285,7 @@ min-width: 1.25rem; padding: 0 0.375rem; border-radius: 999px; - background: var(--success, #2f9e44); + background: var(--success); color: var(--white); font-size: 0.6875rem; text-align: center; @@ -369,7 +369,7 @@ height: 64px; border-radius: 50%; background: var(--accent-gradient); - color: var(--white); + color: var(--on-accent); font-size: 2rem; line-height: 1; display: flex; diff --git a/devplacepy/static/css/issues.css b/devplacepy/static/css/issues.css index e56e20de..86c4be57 100644 --- a/devplacepy/static/css/issues.css +++ b/devplacepy/static/css/issues.css @@ -35,11 +35,11 @@ text-decoration: none; } .issues-filter:hover { - background: var(--bg-hover); + background: var(--bg-card-hover); } .issues-filter.active { background: var(--accent); - color: var(--white); + color: var(--on-accent); border-color: var(--accent); } .issues-modal-hint { diff --git a/devplacepy/static/css/landing.css b/devplacepy/static/css/landing.css index 4dafab4e..9184a2e8 100644 --- a/devplacepy/static/css/landing.css +++ b/devplacepy/static/css/landing.css @@ -70,7 +70,7 @@ .dashboard-btn-primary { background: var(--accent); - color: var(--white); + color: var(--on-accent); border-color: var(--accent); font-weight: 700; padding: 0.55rem 1.5rem; @@ -123,7 +123,7 @@ .dashboard-xp-fill { height: 100%; - background: var(--accent-gradient, linear-gradient(90deg, var(--accent), #f0932b)); + background: var(--accent-gradient); border-radius: 3px; transition: width 0.4s ease; } @@ -466,7 +466,7 @@ font-size: 1.125rem; border-radius: var(--radius-lg); background: var(--accent); - color: var(--white); + color: var(--on-accent); font-weight: 700; } @@ -567,7 +567,7 @@ padding: 0.7rem 2rem; border-radius: var(--radius-lg); background: var(--accent); - color: var(--white); + color: var(--on-accent); font-size: 0.9375rem; font-weight: 700; } @@ -637,7 +637,7 @@ .landing-xp-fill { height: 100%; - background: var(--accent-gradient, linear-gradient(90deg, var(--accent), #f0932b)); + background: var(--accent-gradient); border-radius: 3px; transition: width 0.4s ease; } @@ -970,7 +970,7 @@ margin-top: auto; align-self: flex-start; background: var(--accent); - color: var(--white); + color: var(--on-accent); border: none; border-radius: var(--radius-lg); padding: 0.6rem 1.1rem; @@ -1105,7 +1105,7 @@ font-size: 1.05rem; border-radius: var(--radius-lg); background: var(--accent); - color: var(--white); + color: var(--on-accent); font-weight: 700; text-decoration: none; transition: filter 0.15s ease, transform 0.15s ease; diff --git a/devplacepy/static/css/news.css b/devplacepy/static/css/news.css index ddbd5e1c..276343af 100644 --- a/devplacepy/static/css/news.css +++ b/devplacepy/static/css/news.css @@ -257,7 +257,7 @@ font-size: 0.875rem; font-weight: 600; background: var(--accent); - color: var(--white); + color: var(--on-accent); border-radius: var(--radius); } diff --git a/devplacepy/static/css/profile.css b/devplacepy/static/css/profile.css index 31dd6b08..6a90d5f6 100644 --- a/devplacepy/static/css/profile.css +++ b/devplacepy/static/css/profile.css @@ -49,7 +49,7 @@ } .profile-presence.online { - color: var(--success, #2f9e44); + color: var(--success); } .profile-presence::before { @@ -64,7 +64,7 @@ } .profile-presence.online::before { - background: var(--success, #2f9e44); + background: var(--success); } .profile-stats { @@ -231,7 +231,7 @@ a.profile-stat-value:hover { .profile-tab.active { background: var(--accent); - color: var(--white); + color: var(--on-accent); } .profile-posts { @@ -464,7 +464,7 @@ a.profile-stat-value:hover { } .ai-correction-status[data-state="success"] { - color: var(--success, #2f9e44); + color: var(--success); } .ai-correction-status[data-state="error"] { diff --git a/devplacepy/static/css/project_files.css b/devplacepy/static/css/project_files.css index 621e7e5c..fc25df9e 100644 --- a/devplacepy/static/css/project_files.css +++ b/devplacepy/static/css/project_files.css @@ -100,7 +100,7 @@ .pf-node-row.active { background: var(--accent); - color: var(--white); + color: var(--on-accent); } .pf-node-row.pf-selected { @@ -110,7 +110,7 @@ .pf-node-row.pf-selected.active { background: var(--accent); - color: var(--white); + color: var(--on-accent); } .pf-node-row.pf-dragging { diff --git a/devplacepy/static/css/projects.css b/devplacepy/static/css/projects.css index ed9f64bd..c6f07624 100644 --- a/devplacepy/static/css/projects.css +++ b/devplacepy/static/css/projects.css @@ -28,7 +28,7 @@ .projects-tab.active { background: var(--accent-gradient); - color: var(--white); + color: var(--on-accent); box-shadow: var(--glow-accent); } diff --git a/devplacepy/static/css/sidebar.css b/devplacepy/static/css/sidebar.css index 99a48a63..3066c420 100644 --- a/devplacepy/static/css/sidebar.css +++ b/devplacepy/static/css/sidebar.css @@ -77,7 +77,7 @@ .sidebar-link.active, .sidebar-link.active:hover { background: var(--accent-gradient); - color: var(--white); + color: var(--on-accent); font-weight: 600; box-shadow: var(--glow-accent); } diff --git a/devplacepy/static/css/variables.css b/devplacepy/static/css/variables.css index 8c3184df..81530ce7 100644 --- a/devplacepy/static/css/variables.css +++ b/devplacepy/static/css/variables.css @@ -1,41 +1,42 @@ /* retoor */ :root { - --bg-primary: #080413; - --bg-secondary: #120821; - --bg-card: #1a1030; - --bg-card-hover: #241640; - --bg-input: #140b26; - --bg-modal: #1a1030; + --bg-primary: #0a0a0f; + --bg-secondary: #111118; + --bg-card: #111118; + --bg-card-hover: #1a1a24; + --bg-input: #0a0a0f; + --bg-modal: #111118; - --accent: #ff6b35; - --accent-rgb: 255, 107, 53; - --accent-hover: #ff7d4d; - --accent-light: rgba(255, 107, 53, 0.12); - --accent-2: #ff4f8b; - --accent-gradient: linear-gradient(135deg, #ff6b3d, #ff4f6d); + --accent: #22c55e; + --accent-rgb: 34, 197, 94; + --accent-hover: #16a34a; + --accent-light: rgba(34, 197, 94, 0.12); + --accent-2: #4ade80; + --accent-gradient: linear-gradient(135deg, #22c55e, #16a34a); + --on-accent: #052e16; - --text-primary: #f4eefb; - --text-secondary: #b8a8d0; - --text-muted: #7a6a90; + --text-primary: #c8c8d0; + --text-secondary: #8b8b9e; + --text-muted: #6b6b80; - --border: rgba(255, 255, 255, 0.08); - --border-light: rgba(255, 255, 255, 0.14); + --border: #222233; + --border-light: #2e2e40; - --success: #4caf50; - --warning: #ff9800; - --danger: #e53935; - --info: #42a5f5; + --success: #22c55e; + --warning: #eab308; + --danger: #ef4444; + --info: #60a5fa; - --radius: 12px; - --radius-input: 14px; - --radius-lg: 18px; - --radius-xl: 24px; + --radius: 4px; + --radius-input: 4px; + --radius-lg: 6px; + --radius-xl: 8px; - --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.25); - --shadow: 0 4px 20px rgba(0, 0, 0, 0.28); - --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.45); - --glow-accent: 0 6px 24px rgba(255, 95, 70, 0.45); + --shadow-sm: 0 0 0 1px rgba(34, 34, 51, 0.8); + --shadow: 0 4px 20px rgba(0, 0, 0, 0.5); + --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.6); + --glow-accent: 0 0 0 1px rgba(var(--accent-rgb), 0.35); --white: #fff; --overlay-dark: rgba(0, 0, 0, 0.7); @@ -48,8 +49,8 @@ --space-xl: 1.5rem; --space-2xl: 2rem; - --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; - --font-mono: "SF Mono", Monaco, "Cascadia Code", monospace; + --font-sans: "JetBrains Mono", "SF Mono", ui-monospace, Menlo, Consolas, monospace; + --font-mono: "JetBrains Mono", "SF Mono", Monaco, "Cascadia Code", monospace; --nav-height: 56px; --sidebar-width: 240px; @@ -76,5 +77,5 @@ --topic-fun: #ffab00; --topic-politics: #00bcd4; - --bg-gradient: linear-gradient(135deg, #080413 0%, #160a28 50%, #080413 100%); + --bg-gradient: linear-gradient(135deg, #0a0a0f 0%, #111118 50%, #0a0a0f 100%); } diff --git a/devplacepy/static/icon-192.png b/devplacepy/static/icon-192.png index 41d69119037c679486d62de92615c4b387bb6a89..1be46753fd3f6cb12420d7353f1abd381ae41f29 100644 GIT binary patch literal 1610 zcmc&#>r>JR6b04-EgxfBZIbz@tT9{NoW&>k!`y;=VVRFiEiEaPGOgIeL`_3c(~>eV zMQbG$h0uf*lh#MIEk=z7RtA(TijPpyLST%w|6phO(A+uqoKJV|hco9CVMF$ro7tFw zKp=ArI^e)E|Me9x$nus74A^B_nGm=y0A&0+b=~(WK%f;yOaLnU_uC((KB@5Ypr>;N zxo)EmSMhMao`UwLajE+Ynw49f*K+KCv3Kx}KsT;&S?$*D$Z^}{2qZB36DNBCW(1X7 zw}3iCet_{eL)2i`J|5?o5_h zl+Mjpy}y>_c{nK4B8j2zgH-Uww<78o?TEP6e&!8*t4_nK#U1GBPg5_}zT!=Qxupl)C&Xv<)D4r(;_5dnG%-hrl2cE z5J8c$KLs>&uxFHV8}sYc*z~fN&cUjMYn)sjU9J=L$YOI1Q=?P7VYQQP(h-a=vJ2Yn zy&xM}BD+7C+wtnpaQ=Pj`vNO4K9<2w8#_4%sJI=a*|klQ7@s=`$GR)|1-)=`ra_ui zFNRJH71dmZHHKZ8gQ5Waovl<6TzR`NgK$&OLqiE;L+!q`6p_L+kqys$u(u`O;p}OYv88 zjvsT%NQj?PN+(#wPv>FiW0c1O?sp3+h?x}WEzu*`$>NeZ!h&|%PPA#mv*{O5(h@myNsWb+rilSZw>YUczlD(XnGF?gR`x*#nW#{L)@+wafUz!L&6@B06lyCRi c|GMzZPftcU+X3>wm&*Z!`7I=X<$pBqKU_(`H~;_u literal 2440 zcmc&$`9Bkm8#i+mA|iJylcHQHWLTm}x%;@U+{e(zwJ=Okh)gx*YIB7qV$G4o%{#zB0i(%hc}=bh zp65M&{(}I|Q8AU%si^{BW1QIAWRP6?=uruFwG|u>)OpLYhlg`f1CQI=!melep8%8U z{wlN#>A_bzhqb7pXnWa)N15dJ!_rqiDn2U0gxLrM3@=C%5Rhs8*R70MR8eTaCOl{- zq4dj$q)PKRVg1l^enEPB!gFiF)7Iui4z88h(-7~AYkBMH?)caDgU&eAgWNt3z4RxoC9VEN}WV!*nw9!I}^kK#Bh zE9D5Ka1}3TbboGNlEV^}HS(t&PWfFc(2gqjTQg@mQk%gt>-(LAlR|sHvE64LUZqX+ zG>!n1G(gI}+kMq1y_thwbq&y+nxN%_Kdkim6VtwfxUU_?-#vB`ldi_Q*)JY~n`OZbMwTs!#~iye*{7Ce`-X%8dQ2Ls%vB zsRpL6P4BsZPPU#-F7=6@TCY}dZ?r|Td&aa3XXsB-XZ|je6IELu?j%xQJ2w>boG@*Y z8;r|JJ~M2weohtLRRv znQ4bdFMoNp+2#BgAh8fH!PqktU1i@snE7Gc>Ccjj*Qed5A@#aZN0-OO!lL;HL-FiS zE2^^_djq%2(!Ck{K;yAkA~vy+p_AV^rf^r???NH_S~jwogz9cA@7e2AUc1`WX$U=F z5dZYsQ4&_f9{`SwNDX249S0b(S?H2q7QR*+AJEsG(gA5F!h;_-m|VG>7Pzt)u=+K5 zoiHec_Ed0-_wqIwjhj?w__nompt|uIqu28l=?U^iquEK__aKi?edb^-CY*5KzlPuZ z>9gI};ZSyHnF?_7jUem^{sUm?w#6%|ZI{Rik&KyfD#7zVvB^BVsw*ee)#iJ=xl|cMKwhw%A0e4bo&PGExkj z#dk3~qCl01IjzN)Wd%~*sP&Ol3(Z?gUytnP#QH*a15wN8EX$>>rGo`AkGJt|#(tVjf06q27<)K!nYC8)4O~lAGQ#-d4%b9{fqHzTPd{Zu~r%OPbC0T z92uH2D`F%Xa-I+D?xEeXhvlx;2ua9Q$JTg3 z&j^!$Q4I`F`^am${na|G#QY7r3+1MJd_l5uD=IEpo`Q>1y$I)<2b31GhFG8ujeF?TKJ$Zz5(Jc?Te+|d?70$WpNtMiH7Gszp# z2W?SNRCNR{ZglbyKw@RoF_t}w$EltZ}oE0ufxaox8j%Arp@(miomq- za>1snHy6L|S8+~;ciL3hB;0k#A1}KmBx}^v()Y*%Y=54ARR1+q{$*r2i8l|(C>l79 zooZ;QuGBSD&8ZK{ivB~DK`QdVG(eA248CVK2QMPw`+g_Z8gF%pVGnm;ig^4`%Zgk# zN^ZpcSL{|bN$dQ{kfxX(1I7ZeY?3)qIFGYIIt&PEfSQ}MeG!NN1mb;aYiKKg&j(+R zUYmQgDnc=5yb1(xNH&%CkwEZ5Ags6a$WMAu>-QX<@4A1-%>V`oVgc;NqBrMe|~`iZwtTWGDrY;=D!tEBG>kkd!}wcB!%-~aosev KG^sZBeDFW!)oW}3 diff --git a/devplacepy/static/icon-512.png b/devplacepy/static/icon-512.png index 559fbf470c10544e3def16a944bc2bb5e96a4b94..92a6604cf6302f5ca1e9ccab80958e31af595151 100644 GIT binary patch literal 4473 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 literal 7026 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 diff --git a/devplacepy/static/js/StatisticsCharts.js b/devplacepy/static/js/StatisticsCharts.js index dffe5250..dedf006a 100644 --- a/devplacepy/static/js/StatisticsCharts.js +++ b/devplacepy/static/js/StatisticsCharts.js @@ -1,14 +1,14 @@ // retoor const CHART_COLORS = [ - "#ff6b35", + "#22c55e", "#7c4dff", "#00bfa5", "#448aff", "#ffab00", "#ff5252", "#42a5f5", - "#ff4f8b", + "#4ade80", ]; export class StatisticsCharts { diff --git a/devplacepy/static/js/components/AppChat.js b/devplacepy/static/js/components/AppChat.js index 0967cdd1..16d3bcf7 100644 --- a/devplacepy/static/js/components/AppChat.js +++ b/devplacepy/static/js/components/AppChat.js @@ -24,15 +24,15 @@ const SEARCH_DEBOUNCE_MS = 200; const AUTO_GROW_MAX_HEIGHT_PX = 160; const LIGHT_THEME_OVERRIDES = { - "--bg-primary": "#f5f3fa", + "--bg-primary": "#f1f5f9", "--bg-secondary": "#ffffff", "--bg-card": "#ffffff", - "--bg-card-hover": "#f0edf7", - "--text-primary": "#1a1030", - "--text-secondary": "#4a3f5c", - "--text-muted": "#8b7fa0", - "--border": "rgba(0, 0, 0, 0.1)", - "--border-light": "rgba(0, 0, 0, 0.16)", + "--bg-card-hover": "#e2e8f0", + "--text-primary": "#0f172a", + "--text-secondary": "#475569", + "--text-muted": "#64748b", + "--border": "#cbd5e1", + "--border-light": "#e2e8f0", }; export class AppChat extends Component { diff --git a/devplacepy/static/manifest.json b/devplacepy/static/manifest.json index 2ac1a21f..f6481efd 100644 --- a/devplacepy/static/manifest.json +++ b/devplacepy/static/manifest.json @@ -9,8 +9,8 @@ "orientation": "any", "lang": "en", "dir": "ltr", - "background_color": "#0f0a1a", - "theme_color": "#0f0a1a", + "background_color": "#0a0a0f", + "theme_color": "#0a0a0f", "icons": [ { "src": "/static/icon-192.png", diff --git a/devplacepy/static/offline.html b/devplacepy/static/offline.html index ea40835c..8d152fe8 100644 --- a/devplacepy/static/offline.html +++ b/devplacepy/static/offline.html @@ -7,11 +7,11 @@ Offline - DevPlace