Diff -- /var/www/vhosts/3dshawn.com/abforge.3dshawn.com/assets/css/site.css
Diff

/var/www/vhosts/3dshawn.com/abforge.3dshawn.com/assets/css/site.css

added on local at 2026-07-09 23:25:38

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