Diff -- /var/www/vhosts/3dshawn.com/site1/assets/styles/drift_sense.css
Diff

/var/www/vhosts/3dshawn.com/site1/assets/styles/drift_sense.css

added on local at 2026-07-13 16:46:20

Added
+765
lines
Removed
-0
lines
Context
0
unchanged
Blobs
from
to cfbf33ae6a4c
Restore this content →
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.
1/* =========================================================================
2 * DriftSense -- design system + component styles
3 * -------------------------------------------------------------------------
4 * Palette: midnight navy background + steel-teal primary + amber warnings.
5 * Distinct from every portfolio site (cyan/indigo/violet/emerald/burgundy/amber)
6 * -- reads as "watchtower / observatory / cool precision instrument."
7 * ========================================================================= */
8
9:root {
10 /* Backgrounds -- deep, cool, with subtle blue tint */
11 --bg-0: #030710;
12 --bg-1: #0a1220;
13 --bg-2: #131e30;
14 --bg-3: #1a2740;
15 --bg-panel: linear-gradient(180deg, #131e30 0%, #0a1220 100%);
16
17 /* Borders */
18 --border: #223050;
19 --border-hi: #2d3d5f;
20 --border-focus: #14b8a6;
21
22 /* Text */
23 --text: #e5edf5;
24 --text-dim: #96a3b8;
25 --text-muted: #6a7a94;
26
27 /* Accents */
28 --accent: #14b8a6; /* Teal -- primary, "sense" color */
29 --accent-hi: #2dd4bf;
30 --accent-deep: #0f766e;
31 --accent-glow: rgba(20, 184, 166, 0.35);
32
33 --accent-warn: #f59e0b; /* Amber -- drift alert */
34 --accent-warn-hi: #fbbf24;
35
36 --accent-danger: #f43f5e; /* Rose -- critical */
37 --accent-danger-hi: #fb7185;
38
39 --accent-ok: #34d399; /* Emerald -- clean baseline */
40 --accent-ok-hi: #6ee7b7;
41
42 --accent-info: #38bdf8; /* Sky-blue -- info notices */
43
44 /* Typography */
45 --mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
46 --sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
47
48 /* Sizing */
49 --radius: 12px;
50 --radius-sm: 8px;
51 --radius-pill: 999px;
52 --sidebar-w: 240px;
53}
54
55* { box-sizing: border-box; }
56html, body { margin: 0; padding: 0; }
57body {
58 font-family: var(--sans);
59 color: var(--text);
60 background: var(--bg-0);
61 background-image:
62 radial-gradient(ellipse 1000px 600px at 15% 0%, rgba(20, 184, 166, 0.10), transparent 65%),
63 radial-gradient(ellipse 900px 500px at 90% 100%, rgba(56, 189, 248, 0.08), transparent 65%);
64 background-attachment: fixed;
65 line-height: 1.6;
66 -webkit-font-smoothing: antialiased;
67 min-height: 100vh;
68}
69
70/* =========================================================================
71 * APP SHELL -- sidebar + main
72 * ========================================================================= */
73.app {
74 display: grid;
75 grid-template-columns: var(--sidebar-w) 1fr;
76 min-height: 100vh;
77}
78@media (max-width: 780px) {
79 .app { grid-template-columns: 1fr; }
80 .sidebar { display: none; }
81}
82
83/* Sidebar */
84.sidebar {
85 background: linear-gradient(180deg, #0a1220 0%, #050810 100%);
86 border-right: 1px solid var(--border);
87 padding: 20px 0;
88 position: sticky; top: 0;
89 height: 100vh;
90 overflow-y: auto;
91}
92.sidebar-brand {
93 padding: 8px 20px 20px;
94 display: flex;
95 align-items: center;
96 gap: 12px;
97 text-decoration: none;
98 color: var(--text);
99 border-bottom: 1px solid var(--border);
100 margin-bottom: 12px;
101}
102.sidebar-brand .logo {
103 flex: 0 0 auto;
104 width: 38px; height: 38px;
105 min-width: 38px;
106 border-radius: 10px;
107 background: #0a1220;
108 border: 1px solid #fff;
109 display: grid; place-items: center;
110 color: #fff;
111 font-family: var(--sans);
112 font-weight: 700;
113 font-size: 15px;
114 letter-spacing: .02em;
115 position: relative;
116 box-shadow: 0 6px 20px rgba(15, 118, 110, 0.40);
117 z-index: 1;
118}
119.sidebar-brand .logo::after {
120 content: '';
121 position: absolute; inset: -2px;
122 border-radius: inherit;
123 background: linear-gradient(135deg, var(--accent-deep) 0%, var(--accent-hi) 100%);
124 filter: blur(12px);
125 opacity: 0.32;
126 z-index: -1;
127}
128.sidebar-brand .name {
129 font-weight: 700;
130 font-size: 15px;
131 letter-spacing: -0.01em;
132}
133.sidebar-brand .name .accent { color: var(--accent-hi); }
134.sidebar-brand .role {
135 font-size: 10px;
136 letter-spacing: 1.6px;
137 text-transform: uppercase;
138 color: var(--text-muted);
139 font-weight: 700;
140 margin-top: 2px;
141}
142.sidebar-section-label {
143 font-size: 10.5px;
144 letter-spacing: 1.6px;
145 text-transform: uppercase;
146 color: var(--text-muted);
147 font-weight: 700;
148 padding: 12px 20px 6px;
149}
150.sidebar-link {
151 display: flex;
152 align-items: center;
153 gap: 11px;
154 padding: 9px 20px;
155 color: var(--text-dim);
156 text-decoration: none;
157 font-size: 13.5px;
158 border-left: 2px solid transparent;
159 transition: color .12s ease, background .12s ease, border-left-color .12s ease;
160}
161.sidebar-link svg { width: 15px; height: 15px; flex: 0 0 auto; opacity: 0.85; }
162.sidebar-link:hover { color: var(--text); background: rgba(255,255,255,.02); }
163.sidebar-link.active {
164 color: var(--accent-hi);
165 background: linear-gradient(90deg, rgba(20, 184, 166, .12), transparent 90%);
166 border-left-color: var(--accent);
167}
168.sidebar-link.active svg { opacity: 1; }
169
170/* Trend arrows on KPI tiles (Wave 5) */
171.ds-trend {
172 display: inline-flex;
173 align-items: center;
174 gap: 3px;
175 padding: 2px 8px;
176 border-radius: 999px;
177 font-size: 10.5px;
178 font-weight: 700;
179 letter-spacing: 0.3px;
180 vertical-align: 3px;
181 margin-left: 8px;
182}
183.ds-trend.ds-trend-up {
184 background: rgba(52, 211, 153, .14);
185 color: #86efac;
186 border: 1px solid rgba(52, 211, 153, .35);
187}
188.ds-trend.ds-trend-down {
189 background: rgba(244, 63, 94, .14);
190 color: #fda4af;
191 border: 1px solid rgba(244, 63, 94, .35);
192}
193.ds-trend.ds-trend-flat {
194 background: rgba(148, 163, 184, .14);
195 color: var(--text-dim);
196 border: 1px solid rgba(148, 163, 184, .30);
197}
198.ds-trend svg {
199 width: 10px; height: 10px;
200}
201
202/* Site links in sidebar (Wave 5) */
203.ds-site-link {
204 font-size: 12.5px;
205 padding: 6px 20px 6px 20px;
206}
207.ds-site-badge {
208 display: inline-grid;
209 place-items: center;
210 width: 22px; height: 22px;
211 border-radius: 6px;
212 background: linear-gradient(135deg, rgba(20, 184, 166, .18), rgba(6, 78, 74, .12));
213 border: 1px solid rgba(20, 184, 166, .25);
214 color: var(--accent-hi);
215 font-size: 9.5px;
216 font-weight: 800;
217 letter-spacing: 0;
218 flex: 0 0 auto;
219}
220.ds-site-label { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
221.ds-site-dot {
222 width: 8px; height: 8px; border-radius: 50%;
223 flex: 0 0 auto;
224 background: #334155;
225}
226.ds-site-dot.ds-dot-live { background: #34d399; box-shadow: 0 0 6px rgba(52,211,153,.6); }
227.ds-site-dot.ds-dot-warm { background: #f59e0b; box-shadow: 0 0 6px rgba(245,158,11,.5); }
228.ds-site-dot.ds-dot-hot { background: #f43f5e; box-shadow: 0 0 8px rgba(244,63,94,.7); }
229.ds-site-dot.ds-dot-quiet { background: #334155; }
230
231/* Stable release links in sidebar (Wave 5) */
232.ds-stable-link {
233 font-size: 12.5px;
234 padding: 6px 20px;
235}
236.ds-stable-tag {
237 display: inline-grid;
238 place-items: center;
239 width: 20px; height: 20px;
240 border-radius: 5px;
241 background: linear-gradient(135deg, #34d399, #0f766e);
242 color: #052e2b;
243 font-size: 10.5px;
244 font-weight: 900;
245 flex: 0 0 auto;
246 box-shadow: 0 0 0 1px rgba(52,211,153,.35);
247}
248.ds-stable-link:hover .ds-stable-tag { box-shadow: 0 0 12px rgba(52,211,153,.7); }
249
250/* Main content area */
251.app-main { min-width: 0; }
252.topbar {
253 padding: 16px 32px;
254 border-bottom: 1px solid var(--border);
255 display: flex;
256 align-items: center;
257 gap: 16px;
258 background: rgba(10, 18, 32, 0.5);
259 backdrop-filter: blur(8px);
260 position: sticky; top: 0; z-index: 10;
261}
262.topbar h1 { margin: 0; font-size: 15px; font-weight: 600; letter-spacing: .3px; }
263.topbar-spacer { flex: 1; }
264.topbar-user {
265 display: flex;
266 align-items: center;
267 gap: 10px;
268 padding: 5px 12px 5px 5px;
269 background: var(--bg-2);
270 border: 1px solid var(--border);
271 border-radius: var(--radius-pill);
272 font-size: 12.5px;
273}
274.topbar-user .initials {
275 width: 26px; height: 26px;
276 border-radius: 50%;
277 background: linear-gradient(135deg, var(--accent) 0%, var(--accent-deep) 100%);
278 color: #030710;
279 display: grid; place-items: center;
280 font-size: 11px; font-weight: 700;
281 font-family: var(--mono);
282}
283
284.app-content {
285 padding: 32px 40px 96px;
286 max-width: 1400px;
287}
288
289/* =========================================================================
290 * PAGE HEAD
291 * ========================================================================= */
292.page-head { margin-bottom: 32px; }
293.page-eyebrow {
294 display: inline-flex;
295 align-items: center;
296 gap: 8px;
297 font-size: 10.5px;
298 letter-spacing: 1.8px;
299 text-transform: uppercase;
300 color: var(--accent-hi);
301 font-weight: 700;
302 padding: 5px 12px;
303 background: rgba(20, 184, 166, .10);
304 border: 1px solid rgba(20, 184, 166, .30);
305 border-radius: var(--radius-pill);
306 margin-bottom: 14px;
307 text-decoration: none;
308}
309.page-eyebrow .dot {
310 width: 6px; height: 6px; border-radius: 50%;
311 background: var(--accent-hi);
312 box-shadow: 0 0 10px var(--accent-hi);
313}
314.page-title {
315 margin: 0 0 8px;
316 font-size: 32px;
317 font-weight: 800;
318 letter-spacing: -0.02em;
319 background: linear-gradient(135deg, #fff 0%, #cbd5e1 60%, var(--accent-hi) 100%);
320 -webkit-background-clip: text;
321 background-clip: text;
322 color: transparent;
323}
324.page-subtitle {
325 color: var(--text-dim);
326 font-size: 14.5px;
327 max-width: 780px;
328 margin: 0;
329}
330
331/* =========================================================================
332 * MODULES / CARDS
333 * ========================================================================= */
334.dash-grid {
335 display: grid;
336 grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
337 gap: 16px;
338 margin-bottom: 20px;
339}
340.module {
341 background: var(--bg-panel);
342 border: 1px solid var(--border);
343 border-radius: var(--radius);
344 overflow: hidden;
345 transition: border-color .15s ease, box-shadow .15s ease;
346}
347.module:hover { border-color: var(--border-hi); }
348.module-head {
349 padding: 12px 16px;
350 border-bottom: 1px solid var(--border);
351 display: flex;
352 align-items: center;
353 justify-content: space-between;
354 gap: 12px;
355 background: rgba(20, 184, 166, .03);
356}
357.module-head .left { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
358.module-icon {
359 width: 26px; height: 26px;
360 border-radius: 7px;
361 display: grid; place-items: center;
362 color: var(--accent-hi);
363 background: rgba(20, 184, 166, .10);
364 border: 1px solid rgba(20, 184, 166, .30);
365}
366.module-title { font-size: 13px; font-weight: 700; letter-spacing: .3px; }
367.module-subtitle {
368 font-size: 11.5px;
369 font-weight: 400;
370 color: #b8c5d6;
371 margin-left: 8px;
372 padding-left: 10px;
373 border-left: 1px solid var(--border);
374 line-height: 1.35;
375}
376.module-body { padding: 16px; }
377.module-body.tight { padding: 0; }
378
379/* Module glow variants */
380.module.glow-teal { box-shadow: 0 0 0 1px rgba(20, 184, 166, .20), 0 0 26px rgba(20, 184, 166, .10); }
381.module.glow-amber { box-shadow: 0 0 0 1px rgba(245, 158, 11, .20), 0 0 26px rgba(245, 158, 11, .10); }
382.module.glow-rose { box-shadow: 0 0 0 1px rgba(244, 63, 94, .20), 0 0 26px rgba(244, 63, 94, .10); }
383.module.glow-emerald{ box-shadow: 0 0 0 1px rgba(52, 211, 153, .20), 0 0 26px rgba(52, 211, 153, .10); }
384.module.glow-sky { box-shadow: 0 0 0 1px rgba(56, 189, 248, .20), 0 0 26px rgba(56, 189, 248, .10); }
385
386/* =========================================================================
387 * KPI TILES
388 * ========================================================================= */
389.kpi { padding: 20px 22px; }
390.kpi .num {
391 font-size: 34px;
392 font-weight: 800;
393 letter-spacing: -0.02em;
394 line-height: 1.1;
395 font-variant-numeric: tabular-nums;
396}
397.kpi .lbl {
398 font-size: 11px;
399 letter-spacing: 1.6px;
400 text-transform: uppercase;
401 color: var(--text-muted);
402 font-weight: 700;
403 margin-top: 6px;
404}
405.kpi .sub { font-size: 12px; color: var(--text-dim); margin-top: 10px; }
406.kpi-teal .num { color: var(--accent-hi); text-shadow: 0 0 24px rgba(20, 184, 166, .35); }
407.kpi-amber .num { color: var(--accent-warn-hi); text-shadow: 0 0 24px rgba(245, 158, 11, .30); }
408.kpi-rose .num { color: var(--accent-danger-hi); text-shadow: 0 0 24px rgba(244, 63, 94, .30); }
409.kpi-emerald .num { color: var(--accent-ok-hi); text-shadow: 0 0 24px rgba(52, 211, 153, .30); }
410.kpi-sky .num { color: var(--accent-info); text-shadow: 0 0 24px rgba(56, 189, 248, .30); }
411
412/* =========================================================================
413 * PILLS + STATUS BADGES
414 * ========================================================================= */
415.pill {
416 display: inline-flex;
417 align-items: center;
418 padding: 3px 9px;
419 border-radius: var(--radius-pill);
420 font-size: 10.5px;
421 letter-spacing: .6px;
422 text-transform: uppercase;
423 font-weight: 700;
424 border: 1px solid var(--border);
425}
426.pill-ok { background: rgba(52, 211, 153, .10); color: #a7f3d0; border-color: rgba(52, 211, 153, .35); }
427.pill-warn { background: rgba(245, 158, 11, .10); color: var(--accent-warn-hi); border-color: rgba(245, 158, 11, .35); }
428.pill-bad { background: rgba(244, 63, 94, .10); color: var(--accent-danger-hi); border-color: rgba(244, 63, 94, .35); }
429.pill-info { background: rgba(56, 189, 248, .10); color: var(--accent-info); border-color: rgba(56, 189, 248, .35); }
430.pill-mute { background: rgba(255,255,255,.03); color: var(--text-dim); }
431
432/* =========================================================================
433 * TABLES
434 * ========================================================================= */
435.tbl { width: 100%; border-collapse: collapse; font-size: 13px; }
436.tbl th {
437 text-align: left;
438 padding: 10px 14px;
439 font-size: 10.5px;
440 letter-spacing: 1.4px;
441 text-transform: uppercase;
442 color: var(--text-muted);
443 font-weight: 700;
444 border-bottom: 1px solid var(--border);
445 background: rgba(255,255,255,.02);
446}
447.tbl td {
448 padding: 12px 14px;
449 border-bottom: 1px solid rgba(255,255,255,.03);
450 vertical-align: middle;
451}
452.tbl tr:hover td { background: rgba(255,255,255,.02); }
453.tbl .mono { font-family: var(--mono); font-size: 12.5px; }
454.tbl .dim { color: var(--text-dim); }
455
456/* =========================================================================
457 * CHIP RANGE PICKER (portfolio-canonical .tr-chip pattern)
458 * ========================================================================= */
459.tr-chip {
460 display: inline-flex;
461 align-items: center;
462 padding: 5px 12px;
463 border-radius: var(--radius-pill);
464 font-size: 12px;
465 font-weight: 600;
466 color: var(--text-muted);
467 text-decoration: none;
468 background: transparent;
469 border: 1px solid var(--border);
470 cursor: pointer;
471 transition: all .15s ease;
472 font-family: inherit;
473}
474.tr-chip:hover { color: var(--text); border-color: var(--accent); }
475.tr-chip.is-active {
476 background: var(--accent);
477 color: #0a1220;
478 border-color: var(--accent);
479}
480.range-bar {
481 display: flex;
482 flex-wrap: wrap;
483 align-items: center;
484 gap: 8px;
485 padding: 10px 14px;
486 background: var(--bg-2);
487 border: 1px solid var(--border);
488 border-radius: var(--radius);
489 margin-bottom: 16px;
490}
491.range-bar .rb-label {
492 font-size: 11px;
493 letter-spacing: 1.4px;
494 text-transform: uppercase;
495 color: var(--text-muted);
496 font-weight: 700;
497}
498.range-bar input[type="text"],
499.range-bar input[type="datetime-local"] {
500 background: var(--bg-1);
501 color: var(--text);
502 border: 1px solid var(--border);
503 border-radius: var(--radius-sm);
504 padding: 5px 10px;
505 font-size: 12.5px;
506 font-family: inherit;
507}
508.range-bar input[type="text"]:focus,
509.range-bar input[type="datetime-local"]:focus {
510 outline: none;
511 border-color: var(--accent);
512}
513
514/* =========================================================================
515 * CHART TOOLTIP (activity timeline etc.)
516 * ========================================================================= */
517.chart-tooltip {
518 position: fixed;
519 z-index: 9999;
520 pointer-events: none;
521 background: var(--bg-3);
522 border: 1px solid var(--accent);
523 border-radius: var(--radius-sm);
524 padding: 8px 12px;
525 font-size: 12px;
526 color: var(--text);
527 box-shadow: 0 8px 24px rgba(0,0,0,0.5);
528 min-width: 160px;
529 transform: translate(-50%, calc(-100% - 10px));
530 opacity: 0;
531 transition: opacity .1s ease;
532}
533.chart-tooltip.on { opacity: 1; }
534.chart-tooltip .ct-date {
535 font-family: var(--mono);
536 font-size: 11px;
537 color: var(--text-muted);
538 letter-spacing: 0.5px;
539 margin-bottom: 4px;
540}
541.chart-tooltip .ct-row {
542 display: flex;
543 align-items: center;
544 gap: 6px;
545 line-height: 1.5;
546}
547.chart-tooltip .ct-swatch {
548 width: 9px; height: 9px; border-radius: 2px; display: inline-block;
549}
550.chart-tooltip .ct-hint {
551 margin-top: 4px;
552 font-size: 10.5px;
553 color: var(--text-muted);
554 font-style: italic;
555}
556
557/* =========================================================================
558 * BUTTONS
559 * ========================================================================= */
560.btn {
561 display: inline-flex;
562 align-items: center;
563 gap: 6px;
564 padding: 8px 16px;
565 background: var(--accent);
566 color: #030710;
567 border: none;
568 border-radius: var(--radius-pill);
569 font-family: inherit;
570 font-size: 12.5px;
571 font-weight: 700;
572 cursor: pointer;
573 text-decoration: none;
574 transition: transform .1s ease, box-shadow .1s ease, background .12s ease;
575}
576.btn:hover { background: var(--accent-hi); box-shadow: 0 4px 14px var(--accent-glow); transform: translateY(-1px); }
577.btn-secondary {
578 background: transparent;
579 color: var(--text);
580 border: 1px solid var(--border);
581}
582.btn-secondary:hover { background: var(--bg-2); border-color: var(--accent); color: var(--accent-hi); }
583.btn-danger { background: var(--accent-danger); }
584.btn-danger:hover { background: var(--accent-danger-hi); box-shadow: 0 4px 14px rgba(244, 63, 94, .35); }
585
586/* =========================================================================
587 * FORMS
588 * ========================================================================= */
589input[type=text], input[type=email], input[type=password], input[type=number],
590input[type=date], input[type=datetime-local], textarea, select {
591 background: var(--bg-2);
592 color: var(--text);
593 border: 1px solid var(--border);
594 border-radius: var(--radius-sm);
595 padding: 8px 12px;
596 font-family: inherit;
597 font-size: 13px;
598 outline: none;
599 transition: border-color .12s ease;
600 color-scheme: dark;
601}
602input:focus, textarea:focus, select:focus { border-color: var(--accent); }
603
604/* =========================================================================
605 * MISC UTILITIES
606 * ========================================================================= */
607code {
608 background: rgba(20, 184, 166, .10);
609 color: var(--accent-hi);
610 padding: 1px 6px;
611 border-radius: 4px;
612 font-family: var(--mono);
613 font-size: 0.88em;
614 border: 1px solid rgba(20, 184, 166, .20);
615}
616.mono { font-family: var(--mono); }
617.dim { color: var(--text-dim); }
618.muted { color: var(--text-muted); }
619
620/* Banner */
621.banner {
622 padding: 10px 14px;
623 border-radius: var(--radius-sm);
624 font-size: 13px;
625 margin: 10px 0;
626 border-left: 3px solid;
627}
628.banner-ok { background: rgba(52, 211, 153, .08); border-left-color: var(--accent-ok); color: #a7f3d0; }
629.banner-warn { background: rgba(245, 158, 11, .08); border-left-color: var(--accent-warn); color: var(--accent-warn-hi); }
630.banner-err { background: rgba(244, 63, 94, .08); border-left-color: var(--accent-danger); color: var(--accent-danger-hi); }
631.banner-info { background: rgba(56, 189, 248, .08); border-left-color: var(--accent-info); color: var(--accent-info); }
632
633/* Scrollbar (webkit) */
634::-webkit-scrollbar { width: 10px; height: 10px; }
635::-webkit-scrollbar-track { background: var(--bg-0); }
636::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: 5px; border: 2px solid var(--bg-0); }
637::-webkit-scrollbar-thumb:hover { background: var(--border-hi); }
638
639
640/* =========================================================================
641 * META-ADMIN UI PARITY — 2026-07-12
642 * app-shell alias for .app, brand-text tokens, topbar-title/actions/iconbtn/
643 * search/pill, profile dropdown, avatar, sidebar-link-logout.
644 * Palette re-uses the existing DriftSense teal/rose/emerald tokens.
645 * ========================================================================= */
646.app-shell { display: grid; grid-template-columns: var(--sidebar-w) 1fr; min-height: 100vh; }
647
648/* Sidebar brand extra text nodes (kept .name/.role as legacy) */
649.sidebar-brand .brand-text { display: flex; flex-direction: column; min-width: 0; line-height: 1.05; }
650.sidebar-brand .brand-name { font-family: var(--sans); font-weight: 700; letter-spacing: -.02em; font-size: 17px; color: var(--text); line-height: 1.1; }
651.sidebar-brand .brand-name .accent { color: var(--accent-hi); }
652.sidebar-brand .brand-sub { font-family: var(--sans); font-weight: 600; font-size: 9.5px; letter-spacing: .18em; text-transform: uppercase; color: var(--text-muted); margin-top: 4px; }
653
654/* Sign-out link at the bottom of the sidebar */
655.sidebar-link-logout { color: var(--text-muted); }
656.sidebar-link-logout:hover { color: var(--accent-danger-hi); background: rgba(244,63,94,.06); }
657.sidebar-link-logout svg { opacity: .8; }
658
659/* Topbar polish + new elements */
660.topbar-title { font-size: 15px; font-weight: 600; letter-spacing: .3px; color: var(--text); margin: 0; }
661.topbar-actions { display: flex; align-items: center; gap: 8px; margin-left: 4px; }
662.topbar-iconbtn {
663 width: 34px; height: 34px; display: grid; place-items: center;
664 border-radius: var(--radius-sm); color: var(--text-muted);
665 background: transparent; border: 1px solid transparent; cursor: pointer;
666 text-decoration: none;
667 transition: color .15s, border-color .15s, box-shadow .15s;
668}
669.topbar-iconbtn:hover { color: var(--text); border-color: var(--accent); box-shadow: 0 0 8px var(--accent-glow); }
670.topbar-iconbtn svg { width: 18px; height: 18px; }
671.topbar-search {
672 display: flex; align-items: center; gap: 8px;
673 background: var(--bg-2); border: 1px solid var(--border);
674 padding: 6px 12px; border-radius: var(--radius-sm);
675 width: 260px; max-width: 100%;
676 transition: border-color .15s, box-shadow .15s;
677}
678.topbar-search:focus-within { border-color: var(--border-focus); box-shadow: 0 0 0 3px var(--accent-glow); }
679.topbar-search input { flex: 1; background: transparent; border: 0; outline: none; color: var(--text); font-size: 13px; font-family: var(--mono); }
680.topbar-search input::placeholder { color: var(--text-muted); }
681.topbar-search svg { width: 14px; height: 14px; color: var(--text-dim); }
682
683/* Avatar */
684.avatar {
685 width: 32px; height: 32px;
686 border-radius: 8px;
687 background: #0a1220;
688 border: 1px solid #fff;
689 color: #fff;
690 display: grid; place-items: center;
691 font-size: 12px; font-weight: 700;
692 font-family: var(--sans);
693 letter-spacing: .02em;
694 flex: 0 0 auto;
695 position: relative;
696 box-shadow: 0 4px 14px rgba(15, 118, 110, 0.40);
697 z-index: 1;
698}
699.avatar::after {
700 content: '';
701 position: absolute; inset: -2px;
702 border-radius: inherit;
703 background: linear-gradient(135deg, var(--accent-deep) 0%, var(--accent-hi) 100%);
704 filter: blur(10px);
705 opacity: 0.32;
706 z-index: -1;
707}
708
709/* Profile dropdown */
710.profile-dropdown { position: relative; }
711.profile-btn {
712 display: flex; align-items: center; gap: 8px;
713 background: transparent; border: 1px solid transparent;
714 padding: 4px 10px 4px 4px; border-radius: var(--radius-sm);
715 cursor: pointer; color: var(--text);
716 transition: border-color .15s, box-shadow .15s;
717}
718.profile-btn:hover { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
719.profile-dropdown-menu {
720 display: none;
721 position: absolute; right: 0; top: calc(100% + 8px);
722 min-width: 280px;
723 background: linear-gradient(180deg, var(--bg-2) 0%, var(--bg-1) 100%);
724 border: 1px solid var(--border);
725 border-radius: var(--radius-sm);
726 box-shadow: 0 10px 40px rgba(0,0,0,.6), 0 0 0 1px rgba(20,184,166,.15);
727 padding: 6px;
728 z-index: 100;
729}
730.profile-dropdown-menu.open { display: block; }
731.profile-dropdown-menu::before {
732 content: ''; position: absolute; top: -6px; right: 20px;
733 width: 10px; height: 10px;
734 background: var(--bg-2);
735 border-left: 1px solid var(--border);
736 border-top: 1px solid var(--border);
737 transform: rotate(45deg);
738}
739.profile-dropdown-menu a {
740 display: flex; align-items: center; gap: 10px;
741 padding: 7px 12px;
742 color: var(--text-dim);
743 text-decoration: none;
744 font-size: 12.5px;
745 border-radius: 6px;
746 transition: color .1s, background .1s;
747}
748.profile-dropdown-menu a:hover { color: var(--text); background: rgba(20,184,166,.06); }
749.profile-dropdown-menu a .dropdown-icon { color: var(--text-muted); display: inline-flex; }
750.profile-dropdown-menu a:hover .dropdown-icon { color: var(--accent-hi); }
751.profile-dropdown-section {
752 padding: 10px 12px 4px;
753 font-size: 10px; letter-spacing: .12em; text-transform: uppercase;
754 color: var(--text-muted); font-weight: 700;
755}
756.profile-dropdown-divider { height: 1px; background: var(--border); margin: 6px 4px; }
757
758/* Sidebar-collapsed mode (desktop) */
759html.sidebar-collapsed .app-shell { grid-template-columns: 64px 1fr; }
760html.sidebar-collapsed .sidebar-brand .brand-text,
761html.sidebar-collapsed .sidebar-link span,
762html.sidebar-collapsed .sidebar-section-label,
763html.sidebar-collapsed .ds-stable-tag { display: none; }
764html.sidebar-collapsed .sidebar-link { justify-content: center; padding: 10px 0; }
765html.sidebar-collapsed .sidebar-brand { justify-content: center; padding: 8px 0 16px; }
Keyboard: j next diff k previous diff g top G bottom r restore c compile-check ? help