Diff -- /var/www/vhosts/webstls.com/httpdocs/assets/css/site.css
Diff

/var/www/vhosts/webstls.com/httpdocs/assets/css/site.css

added on WebSTLs (webstls.com) at 2026-07-09 23:25:42

Added
+2372
lines
Removed
-0
lines
Context
0
unchanged
Blobs
from
to 38886796eec4
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 Creator Platform — site.css
3 Dark, modern, "operations-grade" theme for the unified 3D creator
4 platform. Inspired by the WebSTLs blue palette but pushed harder
5 on gradients, glow, and dashboard density.
6===================================================================== */
7
8/* ---------------------------------------------------------------------
9 1. Design tokens
10--------------------------------------------------------------------- */
11:root {
12 /* Background scale — deepest at the page, ladders up for cards */
13 --col-bg: #050813;
14 --col-bg-2: #080c1a;
15 --col-surface-1: #0c1224;
16 --col-surface-2: #111a31;
17 --col-surface-3: #18243f;
18 --col-surface-4: #1f2e4f;
19 --col-border: #1c2a48;
20 --col-border-2: #283c66;
21
22 /* Brand */
23 --col-accent: #3b82f6;
24 --col-accent-deep: #1d4ed8;
25 --col-accent-bright:#60a5fa;
26 --col-accent-glow: rgba(59,130,246,0.35);
27
28 --col-violet: #7c3aed;
29 --col-violet-bright:#a78bfa;
30 --col-cyan: #06b6d4;
31 --col-cyan-bright: #22d3ee;
32 --col-pink: #ec4899;
33
34 /* Status colors */
35 --col-success: #22c55e;
36 --col-warning: #f59e0b;
37 --col-danger: #ef4444;
38 --col-info: #38bdf8;
39
40 /* Text */
41 --col-text: #e6ecf6;
42 --col-text-2: #a8b6d1;
43 --col-text-3: #6f7e9c;
44 --col-text-dim: #4a5878;
45 --col-white: #ffffff;
46
47 /* Gradients */
48 --grad-brand: linear-gradient(130deg, #3b82f6 0%, #7c3aed 100%);
49 --grad-brand-soft: linear-gradient(130deg, rgba(59,130,246,0.18) 0%, rgba(124,58,237,0.18) 100%);
50 --grad-cyan: linear-gradient(130deg, #06b6d4 0%, #3b82f6 100%);
51 --grad-success: linear-gradient(130deg, #16a34a 0%, #22c55e 100%);
52 --grad-card: linear-gradient(160deg, rgba(255,255,255,0.04) 0%, rgba(255,255,255,0.01) 100%);
53 --grad-border: linear-gradient(130deg, rgba(59,130,246,0.45), rgba(124,58,237,0.45));
54
55 /* Typography */
56 --font-display: 'Space Grotesk', 'Bebas Neue', system-ui, sans-serif;
57 --font-ui: 'Inter', 'Rajdhani', system-ui, sans-serif;
58 --font-mono: 'JetBrains Mono', 'Source Code Pro', monospace;
59
60 /* Spacing */
61 --space-2xs: 4px;
62 --space-xs: 6px;
63 --space-sm: 10px;
64 --space-md: 16px;
65 --space-lg: 24px;
66 --space-xl: 40px;
67 --space-2xl: 64px;
68 --space-3xl: 96px;
69
70 /* Radii */
71 --radius-xs: 4px;
72 --radius-sm: 6px;
73 --radius-md: 10px;
74 --radius-lg: 16px;
75 --radius-xl: 22px;
76 --radius-2xl: 28px;
77
78 /* Shadow */
79 --shadow-sm: 0 2px 8px rgba(0,0,0,0.35);
80 --shadow-md: 0 8px 24px rgba(0,0,0,0.45);
81 --shadow-lg: 0 18px 48px rgba(0,0,0,0.55), 0 0 0 1px rgba(255,255,255,0.02);
82 --shadow-glow: 0 0 32px rgba(59,130,246,0.3);
83
84 /* Transitions */
85 --t-fast: 0.14s ease;
86 --t-med: 0.26s cubic-bezier(.4,0,.2,1);
87 --t-slow: 0.5s cubic-bezier(.4,0,.2,1);
88
89 /* Layout */
90 --sidebar-w: 240px;
91 --topbar-h: 64px;
92 --content-max: 1480px;
93}
94
95
96/* ---------------------------------------------------------------------
97 2. Reset
98--------------------------------------------------------------------- */
99*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
100html { font-size: 16px; scroll-behavior: smooth; }
101body {
102 background: var(--col-bg);
103 color: var(--col-text);
104 font-family: var(--font-ui);
105 font-weight: 400;
106 line-height: 1.55;
107 min-height: 100vh;
108 overflow-x: hidden;
109 -webkit-font-smoothing: antialiased;
110}
111a { color: inherit; text-decoration: none; }
112button { font-family: var(--font-ui); cursor: pointer; border: none; background: none; color: inherit; }
113img { max-width: 100%; display: block; }
114ul, ol { list-style: none; }
115input, textarea, select { font-family: var(--font-ui); }
116
117/* Background atmosphere — every page gets a subtle radial-gradient
118 wash so pure black never shows through. */
119body::before {
120 content: '';
121 position: fixed; inset: 0;
122 background:
123 radial-gradient(ellipse 1200px 700px at 8% -5%, rgba(59,130,246,0.10), transparent 60%),
124 radial-gradient(ellipse 900px 600px at 100% 30%, rgba(124,58,237,0.10), transparent 60%),
125 radial-gradient(ellipse 700px 400px at 50% 110%, rgba(6,182,212,0.08), transparent 60%);
126 pointer-events: none;
127 z-index: 0;
128}
129body > * { position: relative; z-index: 1; }
130
131
132/* ---------------------------------------------------------------------
133 3. Layout shell — sidebar + topbar + main
134--------------------------------------------------------------------- */
135.app {
136 display: grid;
137 grid-template-columns: var(--sidebar-w) 1fr;
138 min-height: 100vh;
139}
140
141.app-main {
142 display: flex;
143 flex-direction: column;
144 min-width: 0;
145}
146
147.app-content {
148 flex: 1;
149 padding: 24px 40px;
150 width: 100%;
151 /* No max-width cap -- main content fills the freed viewport space.
152 Pages with deliberately narrower content (sign-in, settings forms)
153 set their own max-width on their inner wrappers. */
154}
155
156
157/* ---------------------------------------------------------------------
158 4. Sidebar
159--------------------------------------------------------------------- */
160.sidebar {
161 background: linear-gradient(180deg, var(--col-surface-1) 0%, var(--col-bg-2) 100%);
162 border-right: 1px solid var(--col-border);
163 display: flex;
164 flex-direction: column;
165 position: sticky;
166 top: 0;
167 height: 100vh;
168}
169
170/* Diagonal shimmer (sidebar-glisten) -- ambient brand-tinted band sweeps
171 top-left -> bottom-right of the menu BG. Full recipe + bug list:
172 [[feedback-sidebar-glisten-recipe]] in user auto-memory. */
173.sidebar::before {
174 content: '';
175 position: absolute;
176 inset: 0;
177 pointer-events: none;
178 background: linear-gradient(
179 135deg,
180 transparent 30%,
181 rgba(150,200,255,0.07) 48%,
182 rgba(200,225,255,0.11) 52%,
183 transparent 70%
184 );
185 background-size: 250% 250%;
186 background-repeat: no-repeat;
187 background-position: 150% 150%;
188 animation: sidebar-glisten 14s linear infinite;
189 z-index: 0;
190}
191.sidebar > * { position: relative; z-index: 1; }
192@keyframes sidebar-glisten {
193 0% { background-position: 150% 150%; }
194 55% { background-position: -150% -150%; }
195 100% { background-position: -150% -150%; }
196}
197@media (prefers-reduced-motion: reduce) {
198 .sidebar::before { animation: none; opacity: 0; }
199}
200
201.sidebar-brand {
202 padding: var(--space-lg) var(--space-lg) var(--space-md);
203 border-bottom: 1px solid var(--col-border);
204 display: flex;
205 align-items: center;
206 gap: 12px;
207}
208.brand-mark {
209 width: 38px; height: 38px;
210 background: #1e1b4b;
211 border: 1px solid #fff;
212 border-radius: var(--radius-md);
213 display: inline-flex !important;
214 flex-direction: row !important;
215 flex-wrap: nowrap !important;
216 align-items: center;
217 justify-content: center;
218 gap: 1px;
219 letter-spacing: -0.5px;
220 line-height: 1;
221 white-space: nowrap;
222 color: #fff;
223 font-family: var(--font-display);
224 font-weight: 700;
225 font-size: 18px;
226 box-shadow: 0 6px 18px rgba(30, 58, 138, 0.55);
227 position: relative;
228}
229.brand-mark::after {
230 content: '';
231 position: absolute; inset: -2px;
232 border-radius: inherit;
233 background: #1e3a8a;
234 filter: blur(12px);
235 opacity: 0.45;
236 z-index: -1;
237}
238.brand-text {
239 display: flex; flex-direction: column; line-height: 1;
240}
241.brand-name {
242 font-family: var(--font-display);
243 font-weight: 700;
244 font-size: 18px;
245 letter-spacing: 0.4px;
246 color: #fff;
247}
248.brand-sub {
249 font-size: 10px;
250 letter-spacing: 2px;
251 text-transform: uppercase;
252 color: var(--col-text-3);
253 margin-top: 4px;
254}
255
256.sidebar-nav {
257 flex: 1;
258 overflow-y: auto;
259 padding: var(--space-md) var(--space-sm);
260}
261.sidebar-section-label {
262 font-size: 13px;
263 font-weight: 800;
264 letter-spacing: 2px;
265 text-transform: uppercase;
266 color: var(--col-accent-bright);
267 padding: var(--space-md) var(--space-md) var(--space-xs);
268}
269.sidebar-link {
270 display: flex;
271 align-items: center;
272 gap: 12px;
273 padding: 9px 14px;
274 margin-bottom: 2px;
275 border-radius: var(--radius-md);
276 color: var(--col-text-2);
277 font-size: 14px;
278 font-weight: 500;
279 transition: background var(--t-fast), color var(--t-fast);
280 position: relative;
281}
282.sidebar-link svg { width: 18px; height: 18px; flex-shrink: 0; }
283.sidebar-link:hover {
284 background: var(--col-surface-2);
285 color: var(--col-text);
286}
287.sidebar-link.active {
288 background: linear-gradient(90deg, rgba(59,130,246,0.18), rgba(124,58,237,0.10));
289 color: #fff;
290 box-shadow: inset 0 0 0 1px rgba(59,130,246,0.25);
291}
292.sidebar-link.active::before {
293 content: '';
294 position: absolute;
295 left: -10px; top: 8px; bottom: 8px;
296 width: 3px;
297 border-radius: 0 4px 4px 0;
298 background: var(--grad-brand);
299 box-shadow: 0 0 12px var(--col-accent-glow);
300}
301.sidebar-link .badge {
302 margin-left: auto;
303 background: var(--col-accent);
304 color: #fff;
305 font-size: 10px;
306 font-weight: 700;
307 padding: 2px 7px;
308 border-radius: 999px;
309}
310
311.sidebar-foot {
312 padding: var(--space-md);
313 border-top: 1px solid var(--col-border);
314 display: flex;
315 align-items: center;
316 gap: 10px;
317}
318.user-chip {
319 display: flex; align-items: center; gap: 10px;
320 flex: 1; min-width: 0;
321}
322.user-avatar {
323 width: 34px; height: 34px;
324 border-radius: 50%;
325 background: var(--grad-brand);
326 display: grid; place-items: center;
327 font-weight: 700; font-size: 13px; color: #fff;
328 flex-shrink: 0;
329}
330.user-meta { min-width: 0; }
331.user-name { font-size: 13px; font-weight: 600; color: var(--col-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
332.user-tier { font-size: 10px; letter-spacing: 1.5px; text-transform: uppercase; color: var(--col-cyan-bright); }
333
334
335/* ---------------------------------------------------------------------
336 5. Topbar
337--------------------------------------------------------------------- */
338.topbar {
339 height: var(--topbar-h);
340 border-bottom: 1px solid var(--col-border);
341 background: rgba(8, 12, 26, 0.7);
342 backdrop-filter: blur(12px);
343 -webkit-backdrop-filter: blur(12px);
344 display: flex;
345 align-items: center;
346 justify-content: space-between;
347 padding: 0 var(--space-xl);
348 position: sticky;
349 top: 0;
350 z-index: 150;
351}
352.topbar-title {
353 font-family: var(--font-display);
354 font-size: 18px;
355 font-weight: 600;
356 color: #fff;
357 letter-spacing: 0.3px;
358}
359.topbar-tools { display: flex; align-items: center; gap: 12px; }
360.search-box {
361 display: flex; align-items: center; gap: 8px;
362 background: var(--col-surface-2);
363 border: 1px solid var(--col-border);
364 border-radius: var(--radius-md);
365 padding: 7px 12px;
366 width: 375px;
367 color: var(--col-text-2);
368 transition: border-color var(--t-fast), background var(--t-fast);
369}
370.search-box:focus-within {
371 border-color: var(--col-accent);
372 background: var(--col-surface-1);
373}
374.search-box svg { width: 16px; height: 16px; opacity: 0.7; }
375.search-box input {
376 background: none; border: none; outline: none;
377 color: var(--col-text); font-size: 13px; flex: 1;
378}
379.search-box input::placeholder { color: var(--col-text-3); }
380.search-box .kbd {
381 font-family: var(--font-mono);
382 font-size: 11px;
383 background: var(--col-surface-3);
384 padding: 2px 6px;
385 border-radius: 4px;
386 color: var(--col-text-3);
387 border: 1px solid var(--col-border);
388 white-space: nowrap;
389 flex-shrink: 0;
390}
391
392.icon-btn {
393 width: 36px; height: 36px;
394 border-radius: var(--radius-md);
395 background: var(--col-surface-2);
396 border: 1px solid var(--col-border);
397 display: grid; place-items: center;
398 color: var(--col-text-2);
399 position: relative;
400 transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast);
401}
402.icon-btn:hover { background: var(--col-surface-3); color: var(--col-text); border-color: var(--col-border-2); }
403.icon-btn svg { width: 16px; height: 16px; }
404.icon-btn .dot {
405 position: absolute;
406 top: 7px; right: 7px;
407 width: 8px; height: 8px;
408 border-radius: 50%;
409 background: var(--col-danger);
410 box-shadow: 0 0 0 2px var(--col-surface-2);
411}
412
413
414/* ---------------------------------------------------------------------
415 6. Buttons
416--------------------------------------------------------------------- */
417.btn {
418 display: inline-flex; align-items: center; justify-content: center; gap: 8px;
419 padding: 10px 18px;
420 font-family: var(--font-ui);
421 font-size: 13px; font-weight: 600;
422 letter-spacing: 0.3px;
423 border-radius: var(--radius-md);
424 border: 1px solid transparent;
425 transition: transform var(--t-fast), background var(--t-fast), color var(--t-fast),
426 border-color var(--t-fast), box-shadow var(--t-fast);
427 cursor: pointer;
428 white-space: nowrap;
429}
430.btn svg { width: 15px; height: 15px; }
431.btn:active { transform: translateY(1px); }
432
433.btn-primary {
434 background: var(--grad-brand);
435 color: #fff;
436 box-shadow: 0 6px 16px rgba(59,130,246,0.35);
437}
438.btn-primary:hover { box-shadow: 0 8px 22px rgba(59,130,246,0.5); filter: brightness(1.08); }
439
440.btn-secondary {
441 background: var(--col-surface-2);
442 color: var(--col-text);
443 border-color: var(--col-border);
444}
445.btn-secondary:hover { background: var(--col-surface-3); border-color: var(--col-border-2); }
446
447.btn-ghost {
448 background: transparent;
449 color: var(--col-text-2);
450}
451.btn-ghost:hover { color: var(--col-text); background: var(--col-surface-2); }
452
453.btn-danger {
454 background: rgba(239,68,68,0.15);
455 color: var(--col-danger);
456 border-color: rgba(239,68,68,0.3);
457}
458.btn-danger:hover { background: rgba(239,68,68,0.25); }
459
460.btn-success {
461 background: rgba(34,197,94,0.16);
462 color: var(--col-success);
463 border-color: rgba(34,197,94,0.3);
464}
465
466.btn-sm { padding: 7px 12px; font-size: 12px; }
467.btn-lg { padding: 14px 28px; font-size: 14px; }
468.btn-block { width: 100%; }
469
470
471/* ---------------------------------------------------------------------
472 7. Cards
473--------------------------------------------------------------------- */
474.card {
475 background: var(--col-surface-1);
476 border: 1px solid var(--col-border);
477 border-radius: var(--radius-lg);
478 padding: var(--space-lg);
479 position: relative;
480}
481.card-elevated {
482 background: linear-gradient(160deg, var(--col-surface-1) 0%, var(--col-surface-2) 100%);
483 box-shadow: var(--shadow-md);
484}
485.card-glow {
486 position: relative;
487 overflow: hidden;
488}
489.card-glow::before {
490 content: '';
491 position: absolute;
492 inset: -1px;
493 border-radius: inherit;
494 background: var(--grad-border);
495 z-index: -1;
496 opacity: 0.55;
497}
498.card-glow::after {
499 content: '';
500 position: absolute;
501 inset: 0;
502 background: var(--col-surface-1);
503 border-radius: inherit;
504 z-index: -1;
505}
506
507.card-head {
508 display: flex; align-items: center; justify-content: space-between;
509 margin-bottom: var(--space-md);
510 gap: 12px;
511}
512.card-title {
513 font-family: var(--font-display);
514 font-size: 16px;
515 font-weight: 600;
516 color: var(--col-text);
517 display: flex; align-items: center; gap: 10px;
518}
519.card-title svg { width: 18px; height: 18px; color: var(--col-accent-bright); }
520.card-actions { display: flex; gap: 8px; }
521
522
523/* ---------------------------------------------------------------------
524 8. Page header
525--------------------------------------------------------------------- */
526.page-head {
527 display: flex; align-items: flex-end; justify-content: space-between;
528 gap: var(--space-md);
529 margin-bottom: var(--space-xl);
530 flex-wrap: wrap;
531}
532.page-eyebrow {
533 display: inline-flex; align-items: center; gap: 8px;
534 font-size: 11px;
535 font-weight: 700;
536 letter-spacing: 2.4px;
537 text-transform: uppercase;
538 color: var(--col-accent-bright);
539 margin-bottom: var(--space-sm);
540}
541.page-eyebrow .dot {
542 width: 6px; height: 6px; border-radius: 50%;
543 background: var(--col-accent-bright);
544 box-shadow: 0 0 8px var(--col-accent-bright);
545 animation: pulse 1.8s ease-in-out infinite;
546}
547@keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.35; } }
548.page-title {
549 font-family: var(--font-display);
550 font-size: 32px;
551 font-weight: 700;
552 color: #fff;
553 letter-spacing: -0.5px;
554 line-height: 1.1;
555}
556.page-subtitle {
557 color: var(--col-text-2);
558 font-size: 14px;
559 margin-top: var(--space-xs);
560 max-width: 640px;
561}
562.page-actions { display: flex; gap: 10px; }
563
564
565/* ---------------------------------------------------------------------
566 9. Stat tiles
567--------------------------------------------------------------------- */
568.stat-row {
569 display: grid;
570 grid-template-columns: repeat(4, 1fr);
571 gap: var(--space-md);
572 margin-bottom: var(--space-xl);
573}
574.stat {
575 background: linear-gradient(160deg, var(--col-surface-1) 0%, var(--col-surface-2) 100%);
576 border: 1px solid var(--col-border);
577 border-radius: var(--radius-lg);
578 padding: var(--space-lg);
579 position: relative;
580 overflow: hidden;
581}
582.stat::before {
583 content: '';
584 position: absolute;
585 top: 0; right: 0;
586 width: 160px; height: 160px;
587 background: radial-gradient(circle, var(--col-accent-glow) 0%, transparent 70%);
588 filter: blur(40px);
589 opacity: 0.35;
590 pointer-events: none;
591}
592.stat-label {
593 font-size: 11px;
594 letter-spacing: 1.5px;
595 text-transform: uppercase;
596 color: var(--col-text-3);
597 font-weight: 600;
598 display: flex; align-items: center; gap: 8px;
599}
600.stat-label svg { width: 14px; height: 14px; color: var(--col-accent-bright); }
601.stat-value {
602 font-family: var(--font-display);
603 font-size: 32px;
604 font-weight: 700;
605 color: #fff;
606 margin-top: var(--space-xs);
607 letter-spacing: -0.5px;
608}
609.stat-meta { display: flex; align-items: center; gap: 6px; margin-top: var(--space-xs); font-size: 12px; }
610.stat-delta {
611 font-weight: 600;
612 display: inline-flex; align-items: center; gap: 3px;
613 padding: 2px 8px;
614 border-radius: 999px;
615 font-size: 11px;
616}
617.stat-delta.up { color: var(--col-success); background: rgba(34,197,94,0.12); }
618.stat-delta.down { color: var(--col-danger); background: rgba(239,68,68,0.12); }
619.stat-meta-label { color: var(--col-text-3); }
620
621
622/* ---------------------------------------------------------------------
623 10. Module / dashboard grid
624--------------------------------------------------------------------- */
625.dash-grid {
626 display: grid;
627 grid-template-columns: 2fr 1fr;
628 gap: var(--space-md);
629}
630.dash-grid-3 {
631 display: grid;
632 grid-template-columns: repeat(3, 1fr);
633 gap: var(--space-md);
634}
635.dash-grid-2 {
636 display: grid;
637 grid-template-columns: 1fr 1fr;
638 gap: var(--space-md);
639}
640
641
642/* ---------------------------------------------------------------------
643 11. Tables
644--------------------------------------------------------------------- */
645.table-wrap {
646 overflow-x: auto;
647 border-radius: var(--radius-md);
648 border: 1px solid var(--col-border);
649}
650.table {
651 width: 100%;
652 border-collapse: collapse;
653 font-size: 13px;
654}
655.table th {
656 text-align: left;
657 font-weight: 600;
658 font-size: 11px;
659 letter-spacing: 1.4px;
660 text-transform: uppercase;
661 color: var(--col-text-3);
662 padding: 12px 16px;
663 background: var(--col-surface-2);
664 border-bottom: 1px solid var(--col-border);
665 white-space: nowrap;
666}
667.table td {
668 padding: 14px 16px;
669 border-bottom: 1px solid var(--col-border);
670 color: var(--col-text);
671}
672.table tr:last-child td { border-bottom: none; }
673.table tr:hover td { background: rgba(255,255,255,0.02); }
674.table .num { font-variant-numeric: tabular-nums; text-align: right; }
675
676
677/* ---------------------------------------------------------------------
678 12. Pills, chips, status indicators
679--------------------------------------------------------------------- */
680.pill {
681 display: inline-flex; align-items: center; gap: 6px;
682 padding: 4px 10px;
683 font-size: 11px;
684 font-weight: 700;
685 letter-spacing: 0.6px;
686 /* Less-rounded corners + brighter text so pills read clearly on
687 deeply-tinted theme backgrounds (purple, neon, etc.) where the
688 prior pill-shape + soft text washed out against the page. */
689 border-radius: 6px;
690 background: rgba(0,0,0,0.30);
691 color: #fff;
692 border: 1px solid var(--col-border);
693}
694.pill svg { width: 11px; height: 11px; }
695.pill.success { color: var(--col-success); background: rgba(34,197,94,0.12); border-color: rgba(34,197,94,0.25); }
696.pill.warning { color: var(--col-warning); background: rgba(245,158,11,0.12); border-color: rgba(245,158,11,0.25); }
697.pill.danger { color: var(--col-danger); background: rgba(239,68,68,0.12); border-color: rgba(239,68,68,0.25); }
698.pill.info { color: var(--col-info); background: rgba(56,189,248,0.12); border-color: rgba(56,189,248,0.25); }
699.pill.brand { color: var(--col-accent-bright); background: rgba(59,130,246,0.15); border-color: rgba(59,130,246,0.3); }
700.pill.violet { color: var(--col-violet-bright); background: rgba(124,58,237,0.15); border-color: rgba(124,58,237,0.3); }
701
702.dot-status {
703 width: 8px; height: 8px;
704 border-radius: 50%;
705 display: inline-block;
706}
707.dot-status.green { background: var(--col-success); box-shadow: 0 0 8px var(--col-success); }
708.dot-status.yellow { background: var(--col-warning); box-shadow: 0 0 8px var(--col-warning); }
709.dot-status.red { background: var(--col-danger); box-shadow: 0 0 8px var(--col-danger); }
710.dot-status.gray { background: var(--col-text-dim); }
711
712
713/* ---------------------------------------------------------------------
714 13. Forms
715--------------------------------------------------------------------- */
716.form-group { margin-bottom: var(--space-md); }
717.form-label {
718 display: block;
719 font-size: 12px;
720 font-weight: 600;
721 letter-spacing: 0.5px;
722 color: var(--col-text-2);
723 margin-bottom: 6px;
724}
725.form-label .req { color: var(--col-danger); margin-left: 4px; }
726.form-help { font-size: 11px; color: var(--col-text-3); margin-top: 4px; }
727
728.input, .textarea, .select {
729 width: 100%;
730 padding: 10px 14px;
731 background: var(--col-surface-2);
732 border: 1px solid var(--col-border);
733 border-radius: var(--radius-md);
734 color: var(--col-text);
735 font-size: 13px;
736 outline: none;
737 transition: border-color var(--t-fast), box-shadow var(--t-fast), background var(--t-fast);
738}
739.input:focus, .textarea:focus, .select:focus {
740 border-color: var(--col-accent);
741 box-shadow: 0 0 0 3px rgba(59,130,246,0.15);
742 background: var(--col-surface-1);
743}
744.input::placeholder, .textarea::placeholder { color: var(--col-text-dim); }
745.textarea { min-height: 90px; resize: vertical; font-family: inherit; }
746.select {
747 appearance: none;
748 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%2364748b'/%3E%3C/svg%3E");
749 background-repeat: no-repeat;
750 background-position: right 14px center;
751 padding-right: 32px;
752}
753
754.checkbox, .radio {
755 display: flex; align-items: center; gap: 10px;
756 cursor: pointer;
757 font-size: 13px;
758 color: var(--col-text);
759}
760.checkbox input, .radio input { width: 16px; height: 16px; accent-color: var(--col-accent); }
761
762.toggle {
763 display: inline-block;
764 position: relative;
765 width: 40px; height: 22px;
766 background: var(--col-surface-3);
767 border-radius: 999px;
768 cursor: pointer;
769 transition: background var(--t-fast);
770 flex-shrink: 0;
771 border: 1px solid var(--col-border);
772 vertical-align: middle;
773}
774.toggle::after {
775 content: '';
776 position: absolute;
777 top: 2px; left: 2px;
778 width: 16px; height: 16px;
779 border-radius: 50%;
780 background: #fff;
781 transition: transform var(--t-fast);
782}
783.toggle.on { background: var(--col-accent); border-color: var(--col-accent-deep); }
784.toggle.on::after { transform: translateX(18px); }
785
786
787/* ---------------------------------------------------------------------
788 14. Module cards (dashboard sections)
789--------------------------------------------------------------------- */
790.module {
791 background: var(--col-surface-1);
792 border: 1px solid var(--col-border);
793 border-radius: var(--radius-lg);
794 overflow: hidden;
795 position: relative;
796}
797
798/* ---------------------------------------------------------------- */
799/* Tutorial mode chrome. */
800/* Banner = always-on header strip across the top of a tutorial page. */
801/* Intro = longer preamble paragraphs beneath the banner. */
802/* Explainer = per-module "How this works" caption inside the body. */
803/* */
804/* All three share an indigo-blue palette plus a left accent stripe */
805/* so the talking blocks read as distinct from the rest of the page */
806/* chrome the moment they enter view. */
807/* ---------------------------------------------------------------- */
808.tutorial-banner {
809 position: relative;
810 display: flex;
811 align-items: flex-start;
812 gap: 16px;
813 padding: 18px 22px 18px 26px;
814 margin-bottom: var(--space-lg);
815 background:
816 linear-gradient(135deg,
817 rgba(30,58,138,0.45) 0%,
818 rgba(30,64,175,0.38) 45%,
819 rgba(37,99,235,0.28) 100%);
820 border: 1px solid rgba(59,130,246,0.55);
821 border-radius: var(--radius-lg);
822 box-shadow:
823 0 0 0 1px rgba(59,130,246,0.18) inset,
824 0 10px 30px rgba(30,58,138,0.32);
825 overflow: hidden;
826}
827.tutorial-banner::before {
828 content: '';
829 position: absolute;
830 top: 0; bottom: 0; left: 0;
831 width: 5px;
832 background: linear-gradient(180deg, #1d4ed8 0%, #2563eb 100%);
833}
834.tutorial-banner-icon {
835 width: 38px; height: 38px;
836 border-radius: 50%;
837 display: grid; place-items: center;
838 background: linear-gradient(135deg, #1d4ed8 0%, #2563eb 100%);
839 color: #fff;
840 flex-shrink: 0;
841 box-shadow: 0 0 16px rgba(37,99,235,0.55);
842}
843.tutorial-banner-icon svg { width: 20px; height: 20px; }
844.tutorial-banner-body { flex: 1; min-width: 0; }
845.tutorial-banner-title {
846 font-size: 15px;
847 font-weight: 800;
848 color: #3b82f6;
849 letter-spacing: 0.3px;
850 margin-bottom: 5px;
851 text-shadow: 0 0 10px rgba(37,99,235,0.45);
852}
853.tutorial-banner-text {
854 font-size: 13px;
855 line-height: 1.6;
856 color: #cbd5e1;
857}
858.tutorial-banner-text strong { color: #e2e8f0; font-weight: 700; }
859.tutorial-banner .btn { flex-shrink: 0; align-self: center; }
860
861/* Per-module explainer caption ("How this works..."). Smaller than
862 the banner but uses the same accent-stripe + blue glow so it
863 reads as part of the same family of talking blocks. */
864.tutorial-explainer {
865 position: relative;
866 background:
867 linear-gradient(135deg,
868 rgba(30,58,138,0.28) 0%,
869 rgba(30,64,175,0.22) 60%,
870 rgba(37,99,235,0.16) 100%);
871 border: 1px solid rgba(59,130,246,0.45);
872 border-radius: 10px;
873 padding: 12px 14px 12px 18px;
874 font-size: 12.5px;
875 line-height: 1.6;
876 color: #cbd5e1;
877 box-shadow: 0 4px 14px rgba(30,58,138,0.22);
878 overflow: hidden;
879}
880.tutorial-explainer::before {
881 content: '';
882 position: absolute;
883 top: 0; bottom: 0; left: 0;
884 width: 4px;
885 background: linear-gradient(180deg, #1d4ed8 0%, #2563eb 100%);
886}
887.tutorial-explainer strong {
888 color: #e2e8f0;
889 font-weight: 700;
890 letter-spacing: 0.3px;
891}
892.tutorial-explainer code {
893 font-size: 11px;
894 background: rgba(0,0,0,0.38);
895 padding: 1px 6px;
896 border-radius: 4px;
897 color: #93c5fd;
898 font-weight: 600;
899}
900.tutorial-explainer a { color: #93c5fd; font-weight: 700; }
901
902/* Longer-form preamble shown beneath the banner. Brighter background
903 than before with the same left accent stripe so it visually links
904 to the banner above. */
905.tutorial-intro {
906 position: relative;
907 background:
908 linear-gradient(180deg,
909 rgba(30,58,138,0.20) 0%,
910 rgba(30,64,175,0.12) 55%,
911 rgba(37,99,235,0.06) 100%);
912 border: 1px solid rgba(59,130,246,0.28);
913 border-radius: var(--radius-lg);
914 padding: 26px 30px 26px 34px;
915 margin-bottom: var(--space-lg);
916 box-shadow: 0 4px 16px rgba(30,58,138,0.14);
917 overflow: hidden;
918}
919.tutorial-intro::before {
920 content: '';
921 position: absolute;
922 top: 0; bottom: 0; left: 0;
923 width: 4px;
924 background: linear-gradient(180deg, #1d4ed8 0%, #2563eb 100%);
925 opacity: 0.55;
926}
927.tutorial-intro-eyebrow {
928 display: inline-block;
929 font-size: 12px;
930 font-weight: 800;
931 letter-spacing: 2.5px;
932 text-transform: uppercase;
933 color: #93c5fd;
934 background: rgba(59,130,246,0.15);
935 border: 1px solid rgba(59,130,246,0.40);
936 border-radius: 7px;
937 padding: 7px 14px;
938 margin-bottom: 16px;
939}
940.tutorial-intro-title {
941 font-size: 24px;
942 font-weight: 800;
943 margin: 0 0 16px 0;
944 line-height: 1.25;
945 letter-spacing: -0.2px;
946 background: linear-gradient(135deg, #60a5fa 0%, #3b82f6 50%, #6366f1 100%);
947 -webkit-background-clip: text;
948 background-clip: text;
949 -webkit-text-fill-color: transparent;
950 color: transparent;
951 text-shadow: 0 0 28px rgba(37,99,235,0.30);
952}
953.tutorial-intro-text {
954 font-size: 14px;
955 line-height: 1.7;
956 color: #cbd5e1;
957 margin: 0 0 14px 0;
958}
959.tutorial-intro-text:last-child { margin-bottom: 0; }
960.tutorial-intro-text strong { color: #e2e8f0; font-weight: 700; }
961.tutorial-intro-text em { color: #93c5fd; font-style: italic; }
962.tutorial-intro-text a { color: #93c5fd; font-weight: 700; }
963.tutorial-intro-text code {
964 font-size: 12.5px;
965 background: rgba(0,0,0,0.40);
966 padding: 2px 7px;
967 border-radius: 4px;
968 color: #93c5fd;
969 font-weight: 600;
970}
971.tutorial-intro-foot {
972 margin-top: 18px;
973 padding-top: 16px;
974 border-top: 1px dashed rgba(37,99,235,0.45);
975 font-size: 13.5px;
976}
977
978/* Search-results thumbnail. Square tile next to each model row so the
979 user can identify a product visually instead of by title alone.
980 Empty state shows a colored gradient with the first letter of the
981 title so rows without an uploaded image still have a visual anchor. */
982.search-thumb {
983 width: 120px; height: 120px;
984 border-radius: 12px;
985 object-fit: cover;
986 display: block;
987 background: var(--col-surface-2);
988 border: 1px solid var(--col-border);
989}
990.search-thumb.search-thumb-empty {
991 display: grid; place-items: center;
992 background: linear-gradient(135deg, rgba(59,130,246,0.30) 0%, rgba(124,58,237,0.25) 100%);
993 color: rgba(255,255,255,0.65);
994 font-size: 42px; font-weight: 800;
995 letter-spacing: 0.5px;
996 text-transform: uppercase;
997}
998
999/* Search-page Edit pill. Matches the topbar Help chip so the action
1000 reads as a real button instead of a tucked-away link. */
1001.search-edit-btn {
1002 display: inline-flex;
1003 align-items: center;
1004 gap: 7px;
1005 height: 36px;
1006 padding: 0 14px;
1007 border-radius: 10px;
1008 background: linear-gradient(135deg, rgba(59,130,246,0.22) 0%, rgba(37,99,235,0.18) 100%);
1009 border: 1px solid rgba(59,130,246,0.55);
1010 color: #93c5fd;
1011 font-size: 13px;
1012 font-weight: 700;
1013 letter-spacing: 0.3px;
1014 text-decoration: none;
1015 box-shadow: 0 0 14px rgba(37,99,235,0.32);
1016 transition: background 0.15s, color 0.15s, transform 0.12s, box-shadow 0.15s;
1017}
1018.search-edit-btn svg { width: 16px; height: 16px; flex-shrink: 0; }
1019.search-edit-btn:hover {
1020 background: linear-gradient(135deg, rgba(59,130,246,0.32) 0%, rgba(37,99,235,0.28) 100%);
1021 color: #fff;
1022 transform: translateY(-1px);
1023 box-shadow: 0 0 18px rgba(37,99,235,0.55);
1024}
1025
1026/* Live red unread dot used next to nav entries (Messages right now,
1027 but reusable). Only rendered server-side when there are real unread
1028 items so the indicator never lies. */
1029.menu-dot {
1030 display: inline-block;
1031 width: 8px; height: 8px;
1032 border-radius: 50%;
1033 background: #ef4444;
1034 margin-left: 6px;
1035 vertical-align: middle;
1036 box-shadow: 0 0 8px rgba(239,68,68,0.6);
1037}
1038
1039/* ---------------------------------------------------------------- */
1040/* Promotions (.pr-*) -- shared between seller (/promotions.cgi) and */
1041/* admin (/admin_promotions.cgi) templates. */
1042/* ---------------------------------------------------------------- */
1043.pr-kpis { display:grid; grid-template-columns: repeat(auto-fit,minmax(160px,1fr)); gap:12px; margin-bottom:22px; }
1044.pr-kpi { background: var(--col-surface-1); border:1px solid var(--col-border); border-radius:12px; padding:14px 16px; }
1045.pr-kpi .lbl { font-size:10px; letter-spacing:1.5px; text-transform:uppercase; color:var(--col-text-3); font-weight:700; }
1046.pr-kpi .val { font-size:24px; font-weight:700; color:#fff; font-family: var(--font-mono, monospace); margin-top:4px; }
1047.pr-kpi.is-active { border-color: rgba(34,197,94,0.40); }
1048.pr-kpi.is-active .val { color: #4ade80; }
1049.pr-kpi.is-scheduled .val { color: #60a5fa; }
1050.pr-kpi.is-paused .val { color: #fbbf24; }
1051.pr-kpi.is-expired .val { color: #94a3b8; }
1052
1053.pr-table {
1054 width:100%; border-collapse:separate; border-spacing:0;
1055 background: var(--col-surface-1); border:1px solid var(--col-border);
1056 border-radius:12px; overflow:hidden;
1057}
1058.pr-table thead th {
1059 background: var(--col-surface-2); padding:11px 14px; text-align:left;
1060 font-size:10px; letter-spacing:1.5px; text-transform:uppercase;
1061 color: var(--col-text-3); font-weight:700; border-bottom:1px solid var(--col-border);
1062}
1063.pr-table tbody td { padding:12px 14px; border-bottom:1px solid var(--col-border); font-size:13px; color:var(--col-text-2); vertical-align:middle; }
1064.pr-table tbody tr:last-child td { border-bottom: none; }
1065.pr-table tbody tr:hover td { background: rgba(59,130,246,0.06); }
1066.pr-table .num { text-align:right; font-family: var(--font-mono, monospace); }
1067.pr-table .name { color: var(--col-text); font-weight:600; }
1068.pr-table .meta { font-size:11px; color: var(--col-text-3); margin-top:2px; }
1069.pr-table code { background: rgba(0,0,0,0.30); padding:1px 6px; border-radius:4px; font-size:11px; color: #93c5fd; }
1070.pr-table .pill { font-size:9px; font-weight:700; padding:3px 8px; border-radius:6px; letter-spacing:1px; text-transform:uppercase; }
1071.pr-table .pill.active { background: rgba(34,197,94,0.18); color: #4ade80; }
1072.pr-table .pill.paused { background: rgba(245,158,11,0.18); color: #fbbf24; }
1073.pr-table .pill.scheduled { background: rgba(59,130,246,0.18); color: #60a5fa; }
1074.pr-table .pill.expired { background: rgba(100,116,139,0.20); color: #94a3b8; }
1075.pr-table .pill.draft { background: rgba(168,85,247,0.18); color: #c084fc; }
1076.pr-table .pill.kind { background: rgba(59,130,246,0.18); color: #93c5fd; }
1077.pr-table .pill.kind.bundle { background: rgba(34,197,94,0.18); color: #86efac; }
1078.pr-table .pill.kind.sale { background: rgba(245,158,11,0.18); color: #fcd34d; }
1079.pr-table .pill.kind.flash { background: rgba(236,72,153,0.18); color: #f9a8d4; }
1080.pr-table .actions a, .pr-table .actions button {
1081 color: #93c5fd; font-size: 12px; font-weight:700; text-decoration:none;
1082 background:none; border:none; cursor:pointer; padding:0; font-family:inherit;
1083}
1084.pr-table .actions a:hover, .pr-table .actions button:hover { text-decoration: underline; }
1085.pr-table .actions form { display:inline; margin:0; }
1086.pr-table .actions .sep { color: var(--col-text-3); margin:0 6px; }
1087
1088.pr-form { background: var(--col-surface-1); border:1px solid var(--col-border); border-radius:14px; padding: 22px 26px; }
1089.pr-form-grid { display:grid; grid-template-columns: 1fr 1fr; gap:16px 24px; }
1090@media (max-width: 800px) { .pr-form-grid { grid-template-columns: 1fr; } }
1091.pr-field { display:flex; flex-direction:column; gap:6px; }
1092.pr-field.full { grid-column: 1 / -1; }
1093.pr-field label { font-size:11px; letter-spacing:1.5px; text-transform:uppercase; color:var(--col-text-3); font-weight:700; }
1094.pr-field input[type="text"],
1095.pr-field input[type="number"],
1096.pr-field input[type="datetime-local"],
1097.pr-field textarea,
1098.pr-field select {
1099 background: var(--col-surface-2); border:1px solid var(--col-border);
1100 color: var(--col-text); padding:9px 12px; border-radius:8px;
1101 font-size:14px; font-family:inherit;
1102}
1103.pr-field textarea { min-height: 70px; resize: vertical; }
1104.pr-field .hint { font-size: 11px; color: var(--col-text-3); }
1105.pr-radio-row { display:flex; gap:10px; flex-wrap:wrap; }
1106.pr-radio { display:flex; align-items:center; gap:6px; padding:8px 12px; border-radius:8px; border:1px solid var(--col-border); background: var(--col-surface-2); cursor:pointer; font-size:13px; }
1107.pr-radio input { accent-color: #3b82f6; }
1108.pr-radio.is-on { border-color: #3b82f6; background: rgba(59,130,246,0.10); }
1109.pr-actions { margin-top: 24px; display:flex; gap:10px; justify-content:flex-end; flex-wrap:wrap; }
1110
1111.pr-models-box { background: var(--col-surface-2); border:1px solid var(--col-border); border-radius:10px; padding:12px; max-height: 240px; overflow-y: auto; }
1112.pr-model-row { display:flex; align-items:center; gap:10px; padding:6px 4px; border-radius:6px; }
1113.pr-model-row:hover { background: rgba(59,130,246,0.06); }
1114.pr-model-row input { accent-color: #3b82f6; }
1115
1116.pr-flash { padding:12px 16px; border-radius:10px; margin-bottom:18px; font-size:13px; }
1117.pr-flash.ok { background: rgba(34,197,94,0.12); border:1px solid rgba(34,197,94,0.35); color: #86efac; }
1118.pr-flash.err { background: rgba(239,68,68,0.12); border:1px solid rgba(239,68,68,0.35); color: #fca5a5; }
1119
1120/* ---------------------------------------------------------------- */
1121/* SEO editor pages (storefront_seo.cgi + admin_seo.cgi). */
1122/* Two-column layout: form on the left, live SERP preview on right. */
1123/* ---------------------------------------------------------------- */
1124.seo-grid {
1125 display: grid;
1126 grid-template-columns: 1.5fr 1fr;
1127 gap: 18px;
1128 align-items: start;
1129}
1130@media (max-width: 1000px) { .seo-grid { grid-template-columns: 1fr; } }
1131
1132.seo-preview {
1133 background: var(--col-surface-1);
1134 border: 1px solid var(--col-border);
1135 border-radius: 14px;
1136 padding: 18px 22px;
1137 position: sticky;
1138 top: 80px;
1139}
1140.seo-preview-head {
1141 font-size: 11px;
1142 letter-spacing: 1.5px;
1143 text-transform: uppercase;
1144 color: var(--col-text-3);
1145 font-weight: 700;
1146 margin-bottom: 12px;
1147}
1148.seo-preview-card {
1149 /* Dark surface matching the rest of the dashboard. Still reads as a
1150 search result preview but no longer glares against the page. */
1151 background: var(--col-surface-2);
1152 color: var(--col-text);
1153 padding: 14px 16px;
1154 border-radius: 8px;
1155 font-family: arial, sans-serif;
1156 border: 1px solid var(--col-border);
1157}
1158.seo-preview-card .seo-preview-url {
1159 font-size: 12px;
1160 color: #94a3b8;
1161 margin-bottom: 4px;
1162 word-break: break-all;
1163}
1164.seo-preview-card .seo-preview-title {
1165 font-size: 18px;
1166 color: #60a5fa;
1167 line-height: 1.3;
1168 margin-bottom: 4px;
1169 font-weight: 600;
1170}
1171.seo-preview-card .seo-preview-desc {
1172 font-size: 13px;
1173 color: #cbd5e1;
1174 line-height: 1.45;
1175}
1176.seo-preview-note {
1177 margin-top: 14px;
1178 font-size: 11.5px;
1179 line-height: 1.6;
1180 color: var(--col-text-3);
1181}
1182.module-head {
1183 display: flex; align-items: center; justify-content: space-between;
1184 padding: var(--space-md) var(--space-lg);
1185 border-bottom: 1px solid var(--col-border);
1186 background: linear-gradient(180deg, rgba(255,255,255,0.02), transparent);
1187 gap: 12px;
1188}
1189.module-head .left { display: flex; align-items: center; gap: 10px; min-width: 0; }
1190.module-icon {
1191 width: 32px; height: 32px;
1192 border-radius: var(--radius-sm);
1193 display: grid; place-items: center;
1194 background: var(--grad-brand-soft);
1195 color: var(--col-accent-bright);
1196 flex-shrink: 0;
1197}
1198.module-icon svg { width: 16px; height: 16px; }
1199.module-title {
1200 font-family: var(--font-display);
1201 font-size: 15px;
1202 font-weight: 600;
1203 color: #fff;
1204}
1205.module-sub {
1206 font-size: 11px;
1207 color: var(--col-text-3);
1208 letter-spacing: 0.5px;
1209 margin-top: 1px;
1210}
1211.module-body { padding: var(--space-lg); }
1212
1213
1214/* ---------------------------------------------------------------------
1215 15. Marketing / landing page
1216--------------------------------------------------------------------- */
1217.landing-nav {
1218 position: sticky;
1219 top: 0; z-index: 100;
1220 background: rgba(5, 8, 19, 0.7);
1221 backdrop-filter: blur(16px);
1222 border-bottom: 1px solid var(--col-border);
1223}
1224.landing-nav-inner {
1225 max-width: var(--content-max);
1226 margin: 0;
1227 padding: 16px var(--space-xl);
1228 display: flex;
1229 align-items: center;
1230 justify-content: space-between;
1231}
1232.landing-nav .links { display: flex; gap: 28px; }
1233.landing-nav .links a {
1234 font-size: 13px;
1235 color: var(--col-text-2);
1236 font-weight: 500;
1237 transition: color var(--t-fast);
1238}
1239.landing-nav .links a:hover { color: var(--col-text); }
1240.landing-nav .auth-actions { display: flex; gap: 10px; align-items: center; }
1241
1242.hero {
1243 padding: 100px var(--space-xl) 80px;
1244 position: relative;
1245 overflow: hidden;
1246}
1247.hero-glow-1, .hero-glow-2, .hero-glow-3 {
1248 position: absolute; pointer-events: none; border-radius: 50%;
1249 filter: blur(80px);
1250}
1251.hero-glow-1 { width: 720px; height: 720px; top: -260px; right: -120px; background: radial-gradient(circle, rgba(59,130,246,0.20), transparent 65%); }
1252.hero-glow-2 { width: 560px; height: 560px; bottom: -160px; left: 6%; background: radial-gradient(circle, rgba(124,58,237,0.18), transparent 65%); }
1253.hero-glow-3 { width: 480px; height: 480px; top: 20%; left: 40%; background: radial-gradient(circle, rgba(6,182,212,0.10), transparent 65%); }
1254
1255.hero-grid-bg {
1256 position: absolute; inset: 0; pointer-events: none;
1257 background-image: radial-gradient(rgba(255,255,255,0.06) 1px, transparent 1px);
1258 background-size: 38px 38px;
1259 mask-image: radial-gradient(ellipse 800px 600px at 50% 50%, black 30%, transparent 80%);
1260 -webkit-mask-image: radial-gradient(ellipse 800px 600px at 50% 50%, black 30%, transparent 80%);
1261}
1262
1263.hero-inner {
1264 max-width: var(--content-max);
1265 margin: 0;
1266 position: relative;
1267 z-index: 2;
1268 display: grid;
1269 grid-template-columns: 1.1fr 1fr;
1270 gap: var(--space-2xl);
1271 align-items: center;
1272}
1273.hero-pill {
1274 display: inline-flex; align-items: center; gap: 8px;
1275 padding: 6px 14px;
1276 border-radius: 999px;
1277 background: rgba(59,130,246,0.10);
1278 border: 1px solid rgba(59,130,246,0.30);
1279 color: var(--col-accent-bright);
1280 font-size: 11px;
1281 font-weight: 700;
1282 letter-spacing: 1.8px;
1283 text-transform: uppercase;
1284 margin-bottom: var(--space-lg);
1285}
1286.hero-pill .dot {
1287 width: 6px; height: 6px;
1288 border-radius: 50%;
1289 background: var(--col-accent-bright);
1290 box-shadow: 0 0 8px var(--col-accent-bright);
1291 animation: pulse 1.8s infinite;
1292}
1293.hero-title {
1294 font-family: var(--font-display);
1295 font-size: clamp(40px, 5.6vw, 76px);
1296 line-height: 0.98;
1297 font-weight: 700;
1298 letter-spacing: -1.5px;
1299 color: #fff;
1300 margin-bottom: var(--space-md);
1301}
1302.hero-title .grad {
1303 background: var(--grad-brand);
1304 -webkit-background-clip: text;
1305 background-clip: text;
1306 -webkit-text-fill-color: transparent;
1307}
1308.hero-sub {
1309 font-size: 17px;
1310 color: var(--col-text-2);
1311 max-width: 520px;
1312 margin-bottom: var(--space-xl);
1313 line-height: 1.65;
1314}
1315.hero-cta { display: flex; gap: 12px; flex-wrap: wrap; }
1316.hero-trust {
1317 display: flex; gap: 24px;
1318 margin-top: var(--space-xl);
1319 padding-top: var(--space-md);
1320 border-top: 1px solid var(--col-border);
1321 flex-wrap: wrap;
1322}
1323.hero-trust-item { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--col-text-3); }
1324.hero-trust-item svg { width: 16px; height: 16px; color: var(--col-success); }
1325
1326/* Hero visual: stacked floating cards mock */
1327.hero-visual {
1328 position: relative;
1329 height: 540px;
1330}
1331.float-card {
1332 position: absolute;
1333 background: linear-gradient(160deg, var(--col-surface-2) 0%, var(--col-surface-1) 100%);
1334 border: 1px solid var(--col-border-2);
1335 border-radius: var(--radius-lg);
1336 box-shadow: var(--shadow-lg);
1337 padding: var(--space-md);
1338 backdrop-filter: blur(8px);
1339}
1340.fc-1 {
1341 top: 20px; left: 0; width: 280px;
1342 animation: floaty 6s ease-in-out infinite;
1343}
1344.fc-2 {
1345 top: 100px; right: 0; width: 300px;
1346 animation: floaty 6s ease-in-out -2s infinite;
1347}
1348.fc-3 {
1349 bottom: 40px; left: 60px; width: 320px;
1350 animation: floaty 6s ease-in-out -4s infinite;
1351}
1352@keyframes floaty {
1353 0%,100% { transform: translateY(0); }
1354 50% { transform: translateY(-10px); }
1355}
1356
1357/* Section pattern */
1358.section {
1359 padding: var(--space-3xl) var(--space-xl);
1360 max-width: var(--content-max);
1361 margin: 0 auto;
1362 position: relative;
1363}
1364.section-eyebrow {
1365 display: inline-block;
1366 color: var(--col-accent-bright);
1367 font-size: 12px;
1368 font-weight: 700;
1369 letter-spacing: 2.5px;
1370 text-transform: uppercase;
1371 margin-bottom: var(--space-sm);
1372}
1373.section-title {
1374 font-family: var(--font-display);
1375 font-size: clamp(28px, 3vw, 44px);
1376 font-weight: 700;
1377 letter-spacing: -0.6px;
1378 line-height: 1.15;
1379 color: #fff;
1380 margin-bottom: var(--space-md);
1381 max-width: 760px;
1382}
1383.section-title .grad {
1384 background: var(--grad-brand);
1385 -webkit-background-clip: text;
1386 background-clip: text;
1387 -webkit-text-fill-color: transparent;
1388}
1389.section-sub {
1390 font-size: 16px;
1391 color: var(--col-text-2);
1392 max-width: 720px;
1393 line-height: 1.65;
1394 margin-bottom: var(--space-2xl);
1395}
1396
1397.feature-grid {
1398 display: grid;
1399 grid-template-columns: repeat(3, 1fr);
1400 gap: var(--space-md);
1401}
1402.feature {
1403 background: var(--col-surface-1);
1404 border: 1px solid var(--col-border);
1405 border-radius: var(--radius-lg);
1406 padding: var(--space-lg);
1407 transition: transform var(--t-med), border-color var(--t-med), box-shadow var(--t-med);
1408 position: relative;
1409 overflow: hidden;
1410}
1411.feature:hover {
1412 transform: translateY(-4px);
1413 border-color: var(--col-border-2);
1414 box-shadow: var(--shadow-md);
1415}
1416.feature-icon {
1417 width: 44px; height: 44px;
1418 border-radius: var(--radius-md);
1419 display: grid; place-items: center;
1420 background: var(--grad-brand-soft);
1421 color: var(--col-accent-bright);
1422 margin-bottom: var(--space-md);
1423 border: 1px solid rgba(59,130,246,0.25);
1424}
1425.feature-icon svg { width: 22px; height: 22px; }
1426.feature-title {
1427 font-family: var(--font-display);
1428 font-size: 18px;
1429 font-weight: 600;
1430 color: #fff;
1431 margin-bottom: var(--space-xs);
1432}
1433.feature-desc { font-size: 13px; color: var(--col-text-2); line-height: 1.65; }
1434.feature-tag {
1435 position: absolute;
1436 top: var(--space-md);
1437 right: var(--space-md);
1438 font-size: 9px;
1439 font-weight: 700;
1440 letter-spacing: 1.5px;
1441 text-transform: uppercase;
1442 padding: 3px 8px;
1443 border-radius: 999px;
1444 background: rgba(124,58,237,0.18);
1445 color: var(--col-violet-bright);
1446 border: 1px solid rgba(124,58,237,0.3);
1447}
1448
1449/* Pricing */
1450.pricing-grid {
1451 display: grid;
1452 grid-template-columns: repeat(4, 1fr);
1453 gap: var(--space-md);
1454}
1455.price-card {
1456 background: var(--col-surface-1);
1457 border: 1px solid var(--col-border);
1458 border-radius: var(--radius-lg);
1459 padding: var(--space-lg);
1460 display: flex;
1461 flex-direction: column;
1462 position: relative;
1463}
1464.price-card.featured {
1465 border-color: rgba(59,130,246,0.5);
1466 background: linear-gradient(160deg, var(--col-surface-2) 0%, var(--col-surface-1) 100%);
1467 box-shadow: 0 0 40px rgba(59,130,246,0.18);
1468}
1469.price-card.featured::before {
1470 content: 'MOST POPULAR';
1471 position: absolute;
1472 top: -10px; left: 50%; transform: translateX(-50%);
1473 background: var(--grad-brand);
1474 color: #fff;
1475 font-size: 10px;
1476 font-weight: 700;
1477 letter-spacing: 1.6px;
1478 padding: 4px 12px;
1479 border-radius: 999px;
1480}
1481.price-tier {
1482 font-family: var(--font-display);
1483 font-size: 18px;
1484 font-weight: 600;
1485 color: #fff;
1486 margin-bottom: var(--space-xs);
1487}
1488.price-amt {
1489 font-family: var(--font-display);
1490 font-size: 38px;
1491 font-weight: 700;
1492 color: #fff;
1493 letter-spacing: -1px;
1494}
1495.price-amt .per { font-size: 13px; color: var(--col-text-3); font-weight: 500; }
1496.price-desc { color: var(--col-text-2); font-size: 13px; margin: var(--space-sm) 0 var(--space-md); }
1497.price-list {
1498 margin: var(--space-md) 0 var(--space-lg);
1499 display: flex; flex-direction: column; gap: 8px;
1500}
1501.price-list li {
1502 font-size: 13px;
1503 color: var(--col-text-2);
1504 display: flex; align-items: flex-start; gap: 8px;
1505}
1506.price-list svg { width: 14px; height: 14px; color: var(--col-success); flex-shrink: 0; margin-top: 3px; }
1507
1508
1509/* ---------------------------------------------------------------------
1510 16. Auth pages (login, signup)
1511--------------------------------------------------------------------- */
1512.auth-shell {
1513 min-height: 100vh;
1514 display: grid;
1515 grid-template-columns: 1fr 1fr;
1516}
1517.auth-side {
1518 position: relative;
1519 background: linear-gradient(140deg, #0a0f24 0%, #1a1142 50%, #0a0f24 100%);
1520 display: flex;
1521 flex-direction: column;
1522 justify-content: space-between;
1523 padding: var(--space-2xl);
1524 overflow: hidden;
1525}
1526.auth-side::before {
1527 content: '';
1528 position: absolute;
1529 inset: 0;
1530 background-image: radial-gradient(rgba(255,255,255,0.05) 1px, transparent 1px);
1531 background-size: 40px 40px;
1532 pointer-events: none;
1533}
1534.auth-side-glow {
1535 position: absolute;
1536 width: 700px; height: 700px;
1537 top: -160px; right: -200px;
1538 background: radial-gradient(circle, rgba(59,130,246,0.30), transparent 60%);
1539 filter: blur(60px);
1540}
1541.auth-side-content { position: relative; z-index: 2; max-width: 460px; }
1542.auth-quote {
1543 font-family: var(--font-display);
1544 font-size: 26px;
1545 line-height: 1.35;
1546 color: #fff;
1547 font-weight: 500;
1548 letter-spacing: -0.3px;
1549 margin-bottom: var(--space-md);
1550}
1551.auth-quote-attr { font-size: 13px; color: var(--col-text-2); }
1552
1553.auth-main {
1554 display: flex; flex-direction: column;
1555 padding: var(--space-2xl);
1556 background: var(--col-bg);
1557 position: relative;
1558}
1559.auth-form-wrap {
1560 width: 100%; max-width: 420px;
1561 margin: auto;
1562}
1563.auth-title {
1564 font-family: var(--font-display);
1565 font-size: 30px;
1566 font-weight: 700;
1567 color: #fff;
1568 letter-spacing: -0.5px;
1569 margin-bottom: var(--space-xs);
1570}
1571.auth-sub { color: var(--col-text-2); font-size: 14px; margin-bottom: var(--space-xl); }
1572.auth-divider {
1573 display: flex; align-items: center; gap: 10px;
1574 color: var(--col-text-3);
1575 font-size: 11px;
1576 letter-spacing: 1.5px;
1577 text-transform: uppercase;
1578 margin: var(--space-md) 0;
1579}
1580.auth-divider::before, .auth-divider::after {
1581 content: '';
1582 flex: 1;
1583 height: 1px;
1584 background: var(--col-border);
1585}
1586.auth-foot {
1587 text-align: center;
1588 font-size: 13px;
1589 color: var(--col-text-2);
1590 margin-top: var(--space-lg);
1591}
1592.auth-foot a { color: var(--col-accent-bright); font-weight: 600; }
1593
1594
1595/* ---------------------------------------------------------------------
1596 17. Charts (lightweight CSS-only sparklines / bars)
1597--------------------------------------------------------------------- */
1598.chart {
1599 width: 100%;
1600 height: 220px;
1601 position: relative;
1602}
1603.bars {
1604 display: flex; align-items: flex-end; gap: 8px;
1605 height: 100%;
1606 padding: var(--space-md) 0;
1607}
1608.bar {
1609 flex: 1;
1610 background: var(--grad-brand);
1611 border-radius: 6px 6px 0 0;
1612 min-height: 8px;
1613 position: relative;
1614 transition: filter var(--t-fast);
1615}
1616.bar:hover { filter: brightness(1.2); }
1617.bar::after {
1618 content: attr(data-label);
1619 position: absolute;
1620 bottom: -22px; left: 50%; transform: translateX(-50%);
1621 font-size: 10px;
1622 color: var(--col-text-3);
1623 letter-spacing: 0.5px;
1624}
1625
1626.spark {
1627 width: 100%;
1628 height: 80px;
1629 display: block;
1630}
1631.spark path { fill: none; stroke: var(--col-accent-bright); stroke-width: 2; }
1632.spark .area { fill: rgba(59,130,246,0.18); stroke: none; }
1633
1634
1635/* ---------------------------------------------------------------------
1636 18. Upload zone
1637--------------------------------------------------------------------- */
1638.dropzone {
1639 border: 2px dashed var(--col-border-2);
1640 background: var(--col-surface-1);
1641 border-radius: var(--radius-lg);
1642 padding: var(--space-2xl);
1643 text-align: center;
1644 transition: border-color var(--t-fast), background var(--t-fast);
1645 cursor: pointer;
1646}
1647.dropzone:hover, .dropzone.drag {
1648 border-color: var(--col-accent);
1649 background: rgba(59,130,246,0.05);
1650}
1651.dropzone-icon {
1652 width: 64px; height: 64px;
1653 border-radius: 50%;
1654 background: var(--grad-brand-soft);
1655 display: grid; place-items: center;
1656 margin: 0 auto var(--space-md);
1657 color: var(--col-accent-bright);
1658}
1659.dropzone-icon svg { width: 28px; height: 28px; }
1660.dropzone-title { font-family: var(--font-display); font-size: 18px; font-weight: 600; color: #fff; margin-bottom: 6px; }
1661.dropzone-sub { color: var(--col-text-3); font-size: 13px; }
1662
1663
1664/* ---------------------------------------------------------------------
1665 19. Model cards
1666--------------------------------------------------------------------- */
1667.model-grid {
1668 display: grid;
1669 grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1670 gap: var(--space-md);
1671}
1672.model-card {
1673 background: var(--col-surface-1);
1674 border: 1px solid var(--col-border);
1675 border-radius: var(--radius-lg);
1676 overflow: hidden;
1677 transition: transform var(--t-med), border-color var(--t-med), box-shadow var(--t-med);
1678 position: relative;
1679}
1680.model-card:hover {
1681 transform: translateY(-3px);
1682 border-color: var(--col-border-2);
1683 box-shadow: var(--shadow-md);
1684}
1685.model-thumb {
1686 aspect-ratio: 4 / 3;
1687 background: var(--col-surface-2);
1688 position: relative;
1689 overflow: hidden;
1690}
1691.model-thumb img { width: 100%; height: 100%; object-fit: cover; transition: transform var(--t-slow); }
1692.model-card:hover .model-thumb img { transform: scale(1.05); }
1693.model-thumb-overlay {
1694 position: absolute;
1695 inset: 0;
1696 background: linear-gradient(180deg, transparent 50%, rgba(5,8,19,0.85) 100%);
1697 display: flex;
1698 flex-direction: column;
1699 justify-content: flex-end;
1700 padding: var(--space-md);
1701}
1702.model-badges { position: absolute; top: 10px; left: 10px; display: flex; gap: 6px; }
1703.model-info { padding: var(--space-md); }
1704.model-name {
1705 font-family: var(--font-display);
1706 font-size: 15px;
1707 font-weight: 600;
1708 color: #fff;
1709 margin-bottom: 4px;
1710 white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
1711}
1712.model-row {
1713 display: flex; align-items: center; justify-content: space-between;
1714 font-size: 12px;
1715 color: var(--col-text-3);
1716}
1717.model-price {
1718 font-family: var(--font-display);
1719 font-size: 16px;
1720 font-weight: 700;
1721 color: var(--col-accent-bright);
1722}
1723
1724
1725/* ---------------------------------------------------------------------
1726 20. Tabs
1727--------------------------------------------------------------------- */
1728.tabs {
1729 display: flex;
1730 gap: 4px;
1731 padding: 4px;
1732 background: var(--col-surface-2);
1733 border: 1px solid var(--col-border);
1734 border-radius: var(--radius-md);
1735 margin-bottom: var(--space-lg);
1736 width: fit-content;
1737}
1738.tab {
1739 padding: 8px 16px;
1740 font-size: 13px;
1741 font-weight: 600;
1742 color: var(--col-text-2);
1743 border-radius: var(--radius-sm);
1744 cursor: pointer;
1745 transition: background var(--t-fast), color var(--t-fast);
1746 white-space: nowrap;
1747}
1748.tab:hover { color: var(--col-text); }
1749.tab.active {
1750 background: var(--col-surface-3);
1751 color: #fff;
1752 box-shadow: inset 0 0 0 1px var(--col-border-2);
1753}
1754
1755
1756/* ---------------------------------------------------------------------
1757 21. Progress bar
1758--------------------------------------------------------------------- */
1759.progress {
1760 width: 100%;
1761 height: 6px;
1762 background: var(--col-surface-3);
1763 border-radius: 999px;
1764 overflow: hidden;
1765}
1766.progress-fill {
1767 height: 100%;
1768 background: var(--grad-brand);
1769 border-radius: inherit;
1770 transition: width var(--t-slow);
1771}
1772
1773
1774/* ---------------------------------------------------------------------
1775 22. Banners / alerts
1776--------------------------------------------------------------------- */
1777.banner {
1778 display: flex; align-items: center; gap: 12px;
1779 padding: 12px 16px;
1780 border-radius: var(--radius-md);
1781 font-size: 13px;
1782 border: 1px solid;
1783}
1784.banner svg { width: 18px; height: 18px; flex-shrink: 0; }
1785.banner.info { background: rgba(56,189,248,0.10); color: #bae6fd; border-color: rgba(56,189,248,0.25); }
1786.banner.success { background: rgba(34,197,94,0.10); color: #bbf7d0; border-color: rgba(34,197,94,0.25); }
1787.banner.warning { background: rgba(245,158,11,0.10); color: #fde68a; border-color: rgba(245,158,11,0.25); }
1788.banner.danger { background: rgba(239,68,68,0.10); color: #fecaca; border-color: rgba(239,68,68,0.25); }
1789.banner-action { margin-left: auto; }
1790
1791
1792/* ---------------------------------------------------------------------
1793 23. Footer (landing)
1794--------------------------------------------------------------------- */
1795.site-foot {
1796 border-top: 1px solid var(--col-border);
1797 background: var(--col-bg-2);
1798 padding: var(--space-2xl) var(--space-xl);
1799 margin-top: var(--space-3xl);
1800}
1801.foot-grid {
1802 max-width: var(--content-max);
1803 margin: 0 auto;
1804 display: grid;
1805 grid-template-columns: 2fr repeat(4, 1fr);
1806 gap: var(--space-2xl);
1807}
1808.foot-col h5 {
1809 font-size: 11px;
1810 font-weight: 700;
1811 letter-spacing: 2px;
1812 text-transform: uppercase;
1813 color: var(--col-text-3);
1814 margin-bottom: var(--space-md);
1815}
1816.foot-col ul { display: flex; flex-direction: column; gap: 8px; }
1817.foot-col a { color: var(--col-text-2); font-size: 13px; transition: color var(--t-fast); }
1818.foot-col a:hover { color: var(--col-text); }
1819.foot-bottom {
1820 max-width: var(--content-max);
1821 margin: var(--space-xl) auto 0;
1822 padding-top: var(--space-md);
1823 border-top: 1px solid var(--col-border);
1824 display: flex;
1825 justify-content: space-between;
1826 font-size: 12px;
1827 color: var(--col-text-3);
1828}
1829
1830
1831/* ---------------------------------------------------------------------
1832 24. Utilities
1833--------------------------------------------------------------------- */
1834.flex { display: flex; }
1835.flex-col { display: flex; flex-direction: column; }
1836.items-center { align-items: center; }
1837.items-end { align-items: flex-end; }
1838.justify-between { justify-content: space-between; }
1839.justify-center { justify-content: center; }
1840.gap-2 { gap: 8px; } .gap-3 { gap: 12px; } .gap-4 { gap: 16px; } .gap-6 { gap: 24px; }
1841.mt-1 { margin-top: 8px; } .mt-2 { margin-top: 16px; } .mt-3 { margin-top: 24px; } .mt-4 { margin-top: 32px; }
1842.mb-1 { margin-bottom: 8px; } .mb-2 { margin-bottom: 16px; } .mb-3 { margin-bottom: 24px; } .mb-4 { margin-bottom: 32px; }
1843.text-center { text-align: center; }
1844.text-dim { color: var(--col-text-3); }
1845.text-secondary { color: var(--col-text-2); }
1846.text-success { color: var(--col-success); }
1847.text-danger { color: var(--col-danger); }
1848.text-warning { color: var(--col-warning); }
1849.text-brand { color: var(--col-accent-bright); }
1850.font-mono { font-family: var(--font-mono); }
1851.text-xs { font-size: 11px; } .text-sm { font-size: 13px; } .text-md { font-size: 15px; }
1852.text-lg { font-size: 18px; } .text-xl { font-size: 24px; }
1853.fw-600 { font-weight: 600; } .fw-700 { font-weight: 700; }
1854.tabular { font-variant-numeric: tabular-nums; }
1855.divider { height: 1px; background: var(--col-border); margin: var(--space-md) 0; }
1856.hide { display: none !important; }
1857
1858
1859/* ---------------------------------------------------------------------
1860 25. Scrollbar
1861--------------------------------------------------------------------- */
1862::-webkit-scrollbar { width: 10px; height: 10px; }
1863::-webkit-scrollbar-track { background: var(--col-bg-2); }
1864::-webkit-scrollbar-thumb { background: var(--col-surface-3); border-radius: 999px; border: 2px solid var(--col-bg-2); }
1865::-webkit-scrollbar-thumb:hover { background: var(--col-surface-4); }
1866
1867
1868/* ---------------------------------------------------------------------
1869 26. Responsive
1870--------------------------------------------------------------------- */
1871@media (max-width: 1100px) {
1872 .stat-row { grid-template-columns: repeat(2, 1fr); }
1873 .feature-grid { grid-template-columns: repeat(2, 1fr); }
1874 .pricing-grid { grid-template-columns: repeat(2, 1fr); }
1875 .foot-grid { grid-template-columns: 1fr 1fr; }
1876 .dash-grid, .dash-grid-3, .dash-grid-2 { grid-template-columns: 1fr; }
1877 .auth-shell { grid-template-columns: 1fr; }
1878 .auth-side { display: none; }
1879 .hero-inner { grid-template-columns: 1fr; }
1880 .hero-visual { display: none; }
1881}
1882@media (max-width: 760px) {
1883 /* Landing / marketing pages (not the dashboard wrapper). The dashboard
1884 sidebar overlay logic lives in the <=1200px block below; do NOT
1885 re-introduce `.sidebar { display: none; }` here -- it broke the
1886 slide-in toggle because display:none beats the overlay's
1887 position:fixed regardless of source order. */
1888 .search-box { display: none; }
1889 .section { padding: var(--space-2xl) var(--space-md); }
1890 .hero { padding: 60px var(--space-md); }
1891}
1892
1893/* ---------------------------------------------------------------------
1894 Tablet / foldable / landscape-phone (<= 1200px).
1895 --------------------------------------------------------------------- */
1896@media (max-width: 1200px) {
1897
1898 /* Layout: no sidebar column on mobile -- it becomes a slide-in
1899 overlay (rules below). Main content gets the full width by
1900 default; tapping the hamburger in the topbar slides the sidebar
1901 in on top of it. CRITICAL: must be a SINGLE column. Sidebar
1902 below is `position: fixed`, which removes it from grid flow --
1903 if the template still declares two columns, .app-main lands in
1904 column 1 (width 0) and the entire content collapses. */
1905 .app { grid-template-columns: 1fr; }
1906 .topbar-brand { display: inline-flex; }
1907
1908 /* Sidebar -> overlay panel. Pulled out of the grid via position:fixed,
1909 translated off-screen by default, slid in when html.mobile-nav-open
1910 is on the root element. Box-shadow gives it depth over the content. */
1911 /* Stacking order at narrow widths (topbar is z:150 so we sit above it
1912 so the dim also covers the topbar -- otherwise the topbar pokes
1913 through the backdrop and reads as "weird, not darkened"):
1914 backdrop = 160, sidebar = 170, toggle (open) = 180. */
1915 .sidebar {
1916 position: fixed !important;
1917 top: 0; left: 0; bottom: 0;
1918 width: 260px;
1919 height: 100vh;
1920 transform: translateX(-100%);
1921 opacity: 1 !important;
1922 visibility: visible !important;
1923 transition: transform 0.25s ease;
1924 z-index: 170;
1925 box-shadow: 4px 0 20px rgba(0,0,0,0.5);
1926 }
1927 html.mobile-nav-open .sidebar {
1928 transform: translateX(0);
1929 }
1930
1931 /* Backdrop catches taps outside the sidebar so the nav closes when
1932 you tap the page. Transparent on purpose -- the user disliked the
1933 dim effect; the sliding panel + box-shadow already reads as a
1934 foreground element without needing a darkened layer behind it. */
1935 html.mobile-nav-open body::before {
1936 content: "";
1937 position: fixed;
1938 top: 0; left: 0; right: 0; bottom: 0;
1939 background: transparent;
1940 z-index: 160;
1941 }
1942
1943 /* Toggle stays in the topbar even at the mobile breakpoint -- a tap
1944 opens the slide-in overlay, another tap closes it. No fixed-
1945 position juggling needed now that the button lives inside the
1946 topbar's flex row. */
1947
1948 /* All multi-column form layouts collapse to a single column so labels
1949 stack above inputs and inputs reach the full content width. */
1950 .pr-form-grid,
1951 .dash-grid,
1952 .dash-grid-3,
1953 .dash-grid-2,
1954 .seo-grid,
1955 .auth-shell,
1956 .hero-inner,
1957 .foot-grid,
1958 .feature-grid,
1959 .pricing-grid,
1960 .stat-row {
1961 grid-template-columns: 1fr !important;
1962 }
1963 .auth-side,
1964 .hero-visual { display: none; }
1965
1966 /* Form modules tighten in -- the 22/26 desktop padding feels cavernous
1967 on a phone-width container. */
1968 .pr-form { padding: 18px 16px; }
1969 .module { padding: 16px; }
1970
1971 /* Inputs go thumb-friendly. 16px is the magic number that suppresses
1972 iOS Safari's auto-zoom on focus; 44px min-height matches the Apple
1973 HIG / Material touch target guideline. */
1974 .input, .textarea, .select,
1975 .pr-field input[type="text"],
1976 .pr-field input[type="number"],
1977 .pr-field input[type="datetime-local"],
1978 .pr-field input[type="email"],
1979 .pr-field input[type="password"],
1980 .pr-field textarea,
1981 .pr-field select {
1982 font-size: 16px;
1983 padding: 12px 14px;
1984 min-height: 44px;
1985 width: 100%;
1986 box-sizing: border-box;
1987 }
1988 .pr-field textarea,
1989 .textarea { min-height: 96px; }
1990
1991 /* Labels stay uppercase + tracked even on the smallest device --
1992 reinforces the existing rule in case a UA stylesheet leaks in. */
1993 .pr-field label,
1994 .form-label {
1995 text-transform: uppercase;
1996 letter-spacing: 1.5px;
1997 font-size: 11px;
1998 font-weight: 700;
1999 }
2000
2001 /* Touch-friendly buttons. The base .btn loses its lat-padding on
2002 small screens; bumping min-height keeps it hittable. */
2003 .btn { min-height: 44px; padding: 10px 16px; font-size: 14px; }
2004 .btn-sm { min-height: 38px; padding: 8px 12px; font-size: 13px; }
2005
2006 /* Headings scale down a step. .page-title is 36-40px on desktop. */
2007 .page-head .page-title { font-size: 28px; line-height: 1.2; }
2008 .page-subtitle { font-size: 14px; }
2009
2010 /* Section + content padding tightens. */
2011 .app-content { padding: 20px 32px; }
2012
2013 /* Tables that don't fit the viewport get horizontal scroll instead of
2014 overflowing the layout. Wrap any .table in a .table-wrap div for
2015 this to work; most pages already do. */
2016 .table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
2017 .table { min-width: 560px; }
2018
2019 /* Tab strips (Settings, Admin, etc.) -- base style uses
2020 `width: fit-content` + `white-space: nowrap`, which overflows the
2021 viewport when there are 4+ tabs on a phone. Let the strip take the
2022 full width and scroll its contents horizontally so every tab stays
2023 reachable without the page itself scrolling sideways. */
2024 .tabs {
2025 width: 100%;
2026 max-width: 100%;
2027 overflow-x: auto;
2028 -webkit-overflow-scrolling: touch;
2029 scrollbar-width: thin;
2030 }
2031
2032 /* Topbar tools row -- chat-pill, msg-pill, help-btn. Tighter padding
2033 at narrow widths so all three fit alongside the brand + title, but
2034 the text labels ("Chat", "Messages", "Help") stay visible at every
2035 viewport size per product preference -- the buttons never collapse
2036 to bare dots/icons. */
2037 .topbar-tools { gap: 6px; }
2038 .chat-pill,
2039 .msg-pill { padding: 0 10px; height: 32px; gap: 6px; }
2040 .help-btn { padding: 0 10px; height: 32px; gap: 6px; }
2041}
2042
2043/* Small phone -- Samsung phone external panel, iPhone SE in portrait, etc. */
2044@media (max-width: 700px) {
2045 .page-head .page-title { font-size: 22px; }
2046 .page-subtitle { font-size: 13px; }
2047 .topbar { padding-right: 8px; }
2048 .pill { padding: 6px 10px; font-size: 12px; }
2049 .module { padding: 12px; border-radius: 10px; }
2050 .pr-form { padding: 14px 12px; }
2051 .pr-actions .btn { flex: 1; } /* full-width submit on phones */
2052}
2053
2054
2055/* =====================================================================
2056 27. Brand-warmth recipe (per AB feedback_brand_warmth_recipe.md)
2057 --------------------------------------------------------------------
2058 Ports the AB sunset recipe to WebSTLs' blue (#3b82f6) -> violet
2059 (#7c3aed) palette. The base CSS above stays intact -- this section
2060 only layers warm radial overlays, brand-tinted borders, and brand
2061 glow on top of every dashboard chrome surface so the brand "bleeds
2062 through" the dark interior the way it does on the landing page.
2063
2064 Brand triples used throughout this section:
2065 BRAND = 59, 130, 246 (#3b82f6 -- primary blue)
2066 BRAND-2 = 124, 58, 237 (#7c3aed -- violet)
2067 VIOLET-BR = 167, 139, 250 (#a78bfa -- light violet, used like peach)
2068
2069 Scoped to the dashboard wrapper (.app > .sidebar / .topbar / .app-
2070 content); marketing/landing styles are deliberately untouched.
2071===================================================================== */
2072
2073/* ---- Body atmosphere: stronger overlapping radials ----------------- */
2074body::before {
2075 background:
2076 radial-gradient(ellipse 1200px 700px at 8% -5%, rgba(59,130,246,0.18), transparent 60%),
2077 radial-gradient(ellipse 900px 600px at 100% 30%, rgba(124,58,237,0.14), transparent 60%),
2078 radial-gradient(ellipse 700px 400px at 50% 110%, rgba(6,182,212,0.10), transparent 60%);
2079}
2080
2081/* ---- Sidebar: layered glow + brand border-right + outward shadow --- */
2082.sidebar {
2083 background:
2084 radial-gradient(ellipse 150% 50% at 0% 0%, rgba(59,130,246,0.22), transparent 65%),
2085 radial-gradient(ellipse 130% 45% at 100% 30%, rgba(124,58,237,0.12), transparent 60%),
2086 radial-gradient(ellipse 120% 45% at 20% 100%, rgba(59,130,246,0.14), transparent 65%),
2087 linear-gradient(180deg, #101a2e 0%, #0c1224 55%, #080c1a 100%);
2088 border-right: 1px solid rgba(59,130,246,0.25);
2089 box-shadow: 1px 0 26px rgba(59,130,246,0.10);
2090}
2091
2092/* Sidebar section labels: light-violet, slightly muted -- gives the
2093 group bands a second-brand color instead of cold gray. */
2094.sidebar-section-label {
2095 color: #a78bfa;
2096 opacity: 0.85;
2097}
2098
2099/* Active nav item already gradients; reinforce the inner brand ring
2100 and ensure the left accent bar reads as a brand light source. */
2101.sidebar-link.active {
2102 background: linear-gradient(90deg,
2103 rgba(59,130,246,0.28),
2104 rgba(124,58,237,0.10) 70%,
2105 transparent);
2106 box-shadow: inset 0 0 0 1px rgba(59,130,246,0.30);
2107}
2108
2109/* Sidebar foot divider picks up brand alpha so the user-chip strip
2110 feels like a continuation of the brand surface above it. */
2111.sidebar-foot { border-top-color: rgba(59,130,246,0.22); }
2112.sidebar-brand { border-bottom-color: rgba(59,130,246,0.22); }
2113
2114/* ---- Topbar: brand-tinted horizontal fade --------------------------- */
2115.topbar {
2116 background:
2117 linear-gradient(90deg,
2118 rgba(59,130,246,0.12) 0%,
2119 rgba(124,58,237,0.06) 40%,
2120 rgba(8,12,26,0.72) 100%),
2121 rgba(8,12,26,0.72);
2122 border-bottom: 1px solid rgba(59,130,246,0.22);
2123 box-shadow: 0 8px 24px rgba(59,130,246,0.05);
2124}
2125
2126/* Topbar page title gets a subtle gradient so the heading reads as
2127 part of the brand chrome instead of plain white. */
2128.topbar-title {
2129 background: linear-gradient(135deg, #fff 0%, #fff 50%, #a78bfa 110%);
2130 -webkit-background-clip: text;
2131 background-clip: text;
2132 -webkit-text-fill-color: transparent;
2133 color: transparent;
2134}
2135
2136/* ---- Cards: brand-tinted border + soft top wash + inset highlight -- */
2137.card,
2138.module,
2139.pr-form,
2140.pr-kpi,
2141.pr-table,
2142.seo-preview,
2143.feature {
2144 background:
2145 linear-gradient(180deg, rgba(59,130,246,0.05) 0%, transparent 40%),
2146 var(--col-surface-1);
2147 border-color: rgba(59,130,246,0.16);
2148 box-shadow: 0 1px 0 rgba(124,58,237,0.06) inset;
2149}
2150.card:hover,
2151.module:hover,
2152.feature:hover,
2153.pr-kpi:hover { border-color: rgba(59,130,246,0.32); }
2154
2155/* Card title gets a glowing brand accent bar in front of the text. */
2156.card-title { display: inline-flex; align-items: center; gap: 10px; }
2157.card-title::before {
2158 content: '';
2159 width: 3px; height: 14px;
2160 border-radius: 3px;
2161 background: linear-gradient(180deg, #3b82f6 0%, #7c3aed 100%);
2162 box-shadow: 0 0 8px rgba(59,130,246,0.55);
2163 flex-shrink: 0;
2164}
2165
2166/* Module-head (dashboard sections w/ icon + title) gets the same
2167 brand bleed at the top so the chrome reads as one family. */
2168.module-head {
2169 background:
2170 linear-gradient(180deg, rgba(59,130,246,0.06), transparent),
2171 linear-gradient(180deg, rgba(255,255,255,0.02), transparent);
2172 border-bottom-color: rgba(59,130,246,0.18);
2173}
2174
2175/* ---- Stat tiles / KPI cards: brand-edge + left accent bar ---------- */
2176.stat {
2177 border-color: rgba(59,130,246,0.22);
2178 box-shadow: 0 8px 24px rgba(59,130,246,0.05);
2179 transition: transform var(--t-fast), border-color var(--t-fast), box-shadow var(--t-fast);
2180}
2181.stat:hover {
2182 transform: translateY(-1px);
2183 border-color: rgba(59,130,246,0.45);
2184 box-shadow: 0 10px 30px rgba(59,130,246,0.14);
2185}
2186.stat::after {
2187 content: '';
2188 position: absolute;
2189 left: 0; top: 0; bottom: 0;
2190 width: 3px;
2191 background: linear-gradient(180deg, #3b82f6 0%, #7c3aed 100%);
2192}
2193.stat-value {
2194 background: linear-gradient(135deg, #fff 0%, #a78bfa 130%);
2195 -webkit-background-clip: text;
2196 background-clip: text;
2197 -webkit-text-fill-color: transparent;
2198}
2199.stat-label { color: #a78bfa; opacity: 0.85; }
2200
2201/* pr-kpi (promotions KPI tiles) share the same treatment. */
2202.pr-kpi {
2203 position: relative;
2204 overflow: hidden;
2205}
2206.pr-kpi::after {
2207 content: '';
2208 position: absolute;
2209 left: 0; top: 0; bottom: 0;
2210 width: 3px;
2211 background: linear-gradient(180deg, #3b82f6 0%, #7c3aed 100%);
2212}
2213.pr-kpi .lbl { color: #a78bfa; opacity: 0.85; }
2214
2215/* ---- Tables: violet-light headers + brand-tinted hover ------------- */
2216.table th,
2217.pr-table thead th {
2218 color: #a78bfa;
2219 border-bottom-color: rgba(59,130,246,0.22);
2220 background: rgba(59,130,246,0.05);
2221}
2222.table tr:hover td { background: rgba(59,130,246,0.06); }
2223
2224/* ---- Forms: violet-light labels + stronger brand focus ring -------- */
2225.form-label,
2226.pr-field label {
2227 color: #a78bfa;
2228 opacity: 0.95;
2229}
2230.input:focus,
2231.textarea:focus,
2232.select:focus,
2233.pr-field input[type="text"]:focus,
2234.pr-field input[type="number"]:focus,
2235.pr-field input[type="datetime-local"]:focus,
2236.pr-field textarea:focus,
2237.pr-field select:focus {
2238 border-color: #3b82f6;
2239 box-shadow: 0 0 0 3px rgba(59,130,246,0.20);
2240 background: var(--col-surface-1);
2241}
2242
2243/* ---- Page header: gradient title text ----------------------------- */
2244.page-head .page-title {
2245 background: linear-gradient(135deg, #fff 0%, #fff 40%, #a78bfa 100%);
2246 -webkit-background-clip: text;
2247 background-clip: text;
2248 -webkit-text-fill-color: transparent;
2249 color: transparent;
2250 text-shadow: 0 0 28px rgba(59,130,246,0.25);
2251}
2252.page-eyebrow { color: #a78bfa; }
2253
2254/* ---- Dropzone: subtle brand glow + warmer hover ------------------- */
2255.dropzone {
2256 background:
2257 linear-gradient(180deg, rgba(59,130,246,0.05) 0%, transparent 50%),
2258 var(--col-surface-1);
2259 border-color: rgba(59,130,246,0.30);
2260}
2261.dropzone:hover,
2262.dropzone.drag {
2263 border-color: #3b82f6;
2264 background:
2265 linear-gradient(180deg, rgba(59,130,246,0.12) 0%, transparent 60%),
2266 var(--col-surface-1);
2267 box-shadow: 0 0 0 3px rgba(59,130,246,0.15);
2268}
2269
2270/* ---- Tabs: brand-tinted active state ------------------------------ */
2271.tabs {
2272 background:
2273 linear-gradient(180deg, rgba(59,130,246,0.05), transparent),
2274 var(--col-surface-2);
2275 border-color: rgba(59,130,246,0.18);
2276}
2277.tab.active {
2278 background: linear-gradient(135deg, rgba(59,130,246,0.18), rgba(124,58,237,0.10));
2279 box-shadow: inset 0 0 0 1px rgba(59,130,246,0.35);
2280}
2281
2282/* ---- Auth box: warm wash + brand glow ----------------------------- */
2283.auth-main {
2284 background:
2285 radial-gradient(ellipse 700px 500px at 100% 0%, rgba(59,130,246,0.12), transparent 60%),
2286 radial-gradient(ellipse 600px 400px at 0% 100%, rgba(124,58,237,0.08), transparent 60%),
2287 var(--col-bg);
2288}
2289.auth-form-wrap {
2290 background:
2291 linear-gradient(160deg, rgba(59,130,246,0.08) 0%, transparent 45%),
2292 var(--col-surface-1);
2293 border: 1px solid rgba(59,130,246,0.22);
2294 border-radius: var(--radius-lg);
2295 padding: var(--space-xl);
2296 box-shadow: 0 24px 60px rgba(59,130,246,0.10);
2297}
2298
2299/* ---- Banners: keep semantic colors but lift info-banner accent ---- */
2300.banner.info {
2301 background: rgba(59,130,246,0.10);
2302 border-color: rgba(59,130,246,0.30);
2303 color: #bfdbfe;
2304}
2305
2306/* ---- Pill .brand variant: slightly heavier glow ------------------- */
2307.pill.brand {
2308 box-shadow: 0 0 12px rgba(59,130,246,0.20);
2309}
2310
2311/* ---- Progress fill: keep brand gradient but add subtle glow ------- */
2312.progress-fill {
2313 box-shadow: 0 0 12px rgba(59,130,246,0.45);
2314}
2315
2316/* ---- Brand-mark blur halo: dark-blue base to match the brand mark -- */
2317.brand-mark::after {
2318 background: #1e3a8a;
2319 opacity: 0.55;
2320}
2321
2322/* ---- Scrollbar thumb: brand-tinted hover -------------------------- */
2323::-webkit-scrollbar-thumb:hover { background: rgba(59,130,246,0.45); }
2324
2325/* ---- Sidebar scrollbar: violet thumb so it reads as brand chrome --- */
2326.sidebar-nav { scrollbar-width: thin; scrollbar-color: rgba(124,58,237,0.55) transparent; }
2327.sidebar-nav::-webkit-scrollbar { width: 8px; }
2328.sidebar-nav::-webkit-scrollbar-track { background: transparent; }
2329.sidebar-nav::-webkit-scrollbar-thumb {
2330 background: linear-gradient(180deg, rgba(124,58,237,0.65), rgba(167,139,250,0.55));
2331 border: 2px solid transparent;
2332 background-clip: padding-box;
2333 border-radius: 999px;
2334}
2335.sidebar-nav::-webkit-scrollbar-thumb:hover {
2336 background: linear-gradient(180deg, rgba(124,58,237,0.85), rgba(167,139,250,0.75));
2337 background-clip: padding-box;
2338}
2339
2340/* =====================================================================
2341 END brand-warmth recipe
2342===================================================================== */
2343
2344/* WIDTH-STANDARDIZATION: neutralize legacy inline max-width caps and extra horizontal padding on the page wrapper so all sites match PTMatrix. */
2345.app-content > div { max-width: none !important; }
2346.app-content > div:not(.card):not(.card-elevated):not(.module):not(.myc-shell):not(.mte-shell):not(.gov-shell):not([class*="-wrap"]):not([class*="-card"]):not(.afnl-hero):not(.fnl-hero):not([class*=hero]) { padding-left: 0 !important; padding-right: 0 !important; }
2347
2348
2349/* Chip range picker: Custom datetime-local inputs -- brand-themed to
2350 match the site (2026-07-09). Scoped to #customWrap so it only styles
2351 the chip-picker's Custom inputs, never other forms on the page. */
2352#customWrap input[type="datetime-local"] {
2353 background: var(--col-surface, #0f1a26);
2354 color: var(--col-text, #e5e7eb);
2355 border: 1px solid var(--col-border, rgba(255,255,255,.12));
2356 border-radius: 8px;
2357 padding: 5px 10px;
2358 font-size: 12px;
2359 font-family: inherit;
2360 color-scheme: dark;
2361 outline: none;
2362 transition: border-color .15s ease;
2363}
2364#customWrap input[type="datetime-local"]:hover,
2365#customWrap input[type="datetime-local"]:focus {
2366 border-color: var(--col-brand, var(--col-primary, var(--col-accent, #5aa9ff)));
2367}
2368#customWrap input[type="datetime-local"]::-webkit-calendar-picker-indicator {
2369 filter: invert(1) brightness(1.4);
2370 cursor: pointer;
2371 opacity: 0.75;
2372}
Keyboard: j next diff k previous diff g top G bottom r restore c compile-check ? help