asjs-express 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,1084 +1,1128 @@
1
- /* ================================================================
2
- ASJS Theme — 2026 Edition
3
- Clean, geometric, Next.js-inspired light design
4
- ================================================================ */
5
-
6
- @import url('https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&display=swap');
7
-
8
- /* ── Tokens ── */
9
- :root {
10
- --bg: #ffffff;
11
- --bg-2: #fafafa;
12
- --bg-3: #f5f5f5;
13
- --surface: #ffffff;
14
- --border: rgba(0, 0, 0, 0.08);
15
- --border-2: rgba(0, 0, 0, 0.14);
16
- --text: #111111;
17
- --text-2: #444444;
18
- --text-3: #888888;
19
- --accent: #0070f3;
20
- --accent-hover: #0060df;
21
- --accent-soft: #f0f7ff;
22
- --success-bg: #f0fdf4;
23
- --success-border: rgba(22, 163, 74, 0.2);
24
- --error-bg: #fef2f2;
25
- --error-border: rgba(220, 38, 38, 0.2);
26
-
27
- --r-xl: 16px;
28
- --r-lg: 12px;
29
- --r-md: 8px;
30
- --r-sm: 6px;
31
-
32
- --shadow-sm: 0 1px 2px rgba(0,0,0,0.04), 0 2px 8px rgba(0,0,0,0.04);
33
- --shadow-md: 0 4px 20px rgba(0,0,0,0.08);
34
-
35
- --asjs-progress-gradient: linear-gradient(90deg, #0070f3, #60b0ff);
36
- --asjs-progress-shadow: 0 0 12px rgba(0, 112, 243, 0.5);
37
- }
38
-
39
- /* ── Base ── */
40
- *, *::before, *::after { box-sizing: border-box; }
41
-
42
- html {
43
- scroll-behavior: smooth;
44
- -webkit-font-smoothing: antialiased;
45
- }
46
-
47
- body.example-body {
48
- margin: 0;
49
- min-height: 100vh;
50
- color: var(--text);
51
- font-family: "Geist", "Inter", system-ui, -apple-system, sans-serif;
52
- font-size: 15px;
53
- line-height: 1.6;
54
- background: var(--bg);
55
- }
56
-
57
- body.example-body::after {
58
- content: "";
59
- position: fixed;
60
- inset: 0;
61
- background: rgba(255,255,255,0.7);
62
- backdrop-filter: blur(6px);
63
- opacity: 0;
64
- pointer-events: none;
65
- transition: opacity 180ms ease;
66
- z-index: 18;
67
- }
68
-
69
- html.asjs-loading body.example-body::after { opacity: 1; }
70
-
71
- a { color: inherit; text-decoration: none; }
72
-
73
- /* ── Shell ── */
74
- .page-shell {
75
- width: min(1120px, calc(100% - 40px));
76
- margin: 0 auto;
77
- padding-bottom: 64px;
78
- }
79
-
80
- /* ── Header — sticky frosted glass ── */
81
- .example-header {
82
- position: sticky;
83
- top: 0;
84
- z-index: 100;
85
- background: rgba(255, 255, 255, 0.82);
86
- backdrop-filter: blur(14px) saturate(180%);
87
- -webkit-backdrop-filter: blur(14px) saturate(180%);
88
- border-bottom: 1px solid var(--border);
89
- }
90
-
91
- .header-note { display: none; }
92
-
93
- .header-main {
94
- display: grid;
95
- grid-template-columns: auto 1fr auto;
96
- align-items: center;
97
- height: 56px;
98
- padding: 0 24px;
99
- }
100
-
101
- .brand-link {
102
- display: flex;
103
- align-items: center;
104
- gap: 10px;
105
- padding-right: 20px;
106
- border-right: 1px solid var(--border);
107
- flex-shrink: 0;
108
- }
109
-
110
- .brand-mark {
111
- width: 26px;
112
- height: 26px;
113
- display: grid;
114
- place-items: center;
115
- border-radius: 6px;
116
- background: var(--text);
117
- color: #fff;
118
- font-size: 0.62rem;
119
- font-weight: 700;
120
- letter-spacing: 0.04em;
121
- flex-shrink: 0;
122
- }
123
-
124
- .brand-copy {
125
- display: flex;
126
- align-items: center;
127
- gap: 8px;
128
- }
129
-
130
- .brand-copy strong {
131
- font-size: 0.9rem;
132
- font-weight: 600;
133
- letter-spacing: -0.02em;
134
- line-height: 1;
135
- }
136
-
137
- .brand-copy span,
138
- .brand-copy small {
139
- font-size: 0.76rem;
140
- color: var(--text-3);
141
- padding-left: 8px;
142
- border-left: 1px solid var(--border);
143
- line-height: 1;
144
- }
145
-
146
- /* ── Nav ── */
147
- .site-nav {
148
- display: flex;
149
- justify-content: center;
150
- align-items: center;
151
- gap: 2px;
152
- padding: 0 16px;
153
- }
154
-
155
- .site-link {
156
- display: flex;
157
- align-items: center;
158
- height: 32px;
159
- padding: 0 12px;
160
- border-radius: var(--r-md);
161
- font-size: 0.84rem;
162
- font-weight: 500;
163
- color: var(--text-2);
164
- transition: background 130ms ease, color 130ms ease;
165
- border: none;
166
- background: transparent;
167
- white-space: nowrap;
168
- }
169
-
170
- .site-link small { display: none; }
171
-
172
- .site-link:hover {
173
- background: var(--bg-3);
174
- color: var(--text);
175
- }
176
-
177
- .site-link.is-active {
178
- background: var(--bg-2);
179
- color: var(--text);
180
- font-weight: 600;
181
- }
182
-
183
- .site-link[data-asjs-prefetched="true"] { color: var(--accent); }
184
-
185
- .site-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
186
-
187
- .header-cta {
188
- padding-left: 20px;
189
- border-left: 1px solid var(--border);
190
- flex-shrink: 0;
191
- }
192
-
193
- /* ── Buttons ── */
194
- .button {
195
- display: inline-flex;
196
- align-items: center;
197
- justify-content: center;
198
- height: 36px;
199
- padding: 0 16px;
200
- border-radius: var(--r-md);
201
- border: 1px solid var(--border-2);
202
- font-family: inherit;
203
- font-size: 0.84rem;
204
- font-weight: 500;
205
- cursor: pointer;
206
- transition: background 130ms ease, border-color 130ms ease, box-shadow 130ms ease;
207
- white-space: nowrap;
208
- }
209
-
210
- .button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
211
- .brand-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
212
- .inline-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
213
-
214
- .button-primary {
215
- background: var(--text);
216
- color: #ffffff;
217
- border-color: var(--text);
218
- box-shadow: var(--shadow-sm);
219
- }
220
-
221
- .button-primary:hover {
222
- background: #333;
223
- border-color: #333;
224
- }
225
-
226
- .button-secondary {
227
- background: var(--surface);
228
- color: var(--text);
229
- border-color: var(--border-2);
230
- }
231
-
232
- .button-secondary:hover {
233
- background: var(--bg-2);
234
- }
235
-
236
- /* ── View frame ── */
237
- .view-frame {
238
- margin-top: 48px;
239
- background: none;
240
- border: none;
241
- box-shadow: none;
242
- padding: 0;
243
- }
244
-
245
- [data-asjs-view] { animation: reveal 200ms ease; }
246
-
247
- /* ── Route loader ── */
248
- .route-loader {
249
- position: fixed;
250
- inset: auto 20px 20px auto;
251
- width: min(340px, calc(100% - 32px));
252
- opacity: 0;
253
- transform: translateY(8px);
254
- pointer-events: none;
255
- transition: opacity 180ms ease, transform 180ms ease;
256
- z-index: 200;
257
- }
258
-
259
- html.asjs-loading .route-loader {
260
- opacity: 1;
261
- transform: translateY(0);
262
- }
263
-
264
- .route-loader-card {
265
- padding: 16px 18px;
266
- border-radius: var(--r-lg);
267
- border: 1px solid var(--border);
268
- background: rgba(255,255,255,0.96);
269
- backdrop-filter: blur(12px);
270
- box-shadow: var(--shadow-md);
271
- }
272
-
273
- .route-loader-label {
274
- display: inline-flex;
275
- padding: 3px 8px;
276
- border-radius: var(--r-sm);
277
- background: var(--bg-3);
278
- border: 1px solid var(--border);
279
- color: var(--text-3);
280
- font-size: 0.68rem;
281
- font-weight: 600;
282
- letter-spacing: 0.06em;
283
- text-transform: uppercase;
284
- }
285
-
286
- .route-loader-card strong {
287
- display: block;
288
- margin-top: 10px;
289
- font-size: 0.9rem;
290
- font-weight: 600;
291
- letter-spacing: -0.01em;
292
- }
293
-
294
- .route-loader-card p,
295
- .render-note,
296
- .render-stamp {
297
- color: var(--text-3);
298
- }
299
-
300
- .route-loader-card p {
301
- margin: 6px 0 0;
302
- font-size: 0.8rem;
303
- line-height: 1.5;
304
- }
305
-
306
- .route-loader-skeleton {
307
- display: grid;
308
- gap: 6px;
309
- margin-top: 12px;
310
- }
311
-
312
- .route-loader-skeleton span {
313
- display: block;
314
- height: 7px;
315
- border-radius: 999px;
316
- background: linear-gradient(90deg, var(--bg-3) 25%, var(--border-2) 50%, var(--bg-3) 75%);
317
- background-size: 200% 100%;
318
- animation: shimmer 1.4s ease-in-out infinite;
319
- }
320
-
321
- .route-loader-skeleton span:nth-child(2) { width: 76%; }
322
- .route-loader-skeleton span:nth-child(3) { width: 54%; }
323
-
324
- /* ── Page intro / hero heading ── */
325
- .page-intro {
326
- padding: 56px 0 32px;
327
- max-width: 680px;
328
- }
329
-
330
- .page-intro h1,
331
- .hero-copy h1,
332
- .not-found-panel h1 {
333
- margin: 0 0 14px;
334
- font-size: clamp(2rem, 4.5vw, 3.4rem);
335
- font-weight: 700;
336
- letter-spacing: -0.05em;
337
- line-height: 1.04;
338
- color: var(--text);
339
- }
340
-
341
- .page-intro p,
342
- .hero-copy p {
343
- margin: 0;
344
- font-size: 1.02rem;
345
- color: var(--text-2);
346
- line-height: 1.75;
347
- }
348
-
349
- .hero-actions {
350
- display: flex;
351
- align-items: center;
352
- gap: 10px;
353
- margin-top: 28px;
354
- flex-wrap: wrap;
355
- }
356
-
357
- /* ── Badge / label ── */
358
- .section-label,
359
- .hero-badge,
360
- .example-pill {
361
- display: inline-flex;
362
- align-items: center;
363
- padding: 3px 9px;
364
- border-radius: var(--r-sm);
365
- border: 1px solid var(--border);
366
- background: var(--bg-2);
367
- font-size: 0.7rem;
368
- font-weight: 600;
369
- color: var(--text-2);
370
- letter-spacing: 0.05em;
371
- text-transform: uppercase;
372
- margin-bottom: 14px;
373
- }
374
-
375
- /* ── Section card ── */
376
- .section-card {
377
- border: 1px solid var(--border);
378
- border-radius: var(--r-xl);
379
- background: var(--surface);
380
- padding: 32px;
381
- margin-top: 16px;
382
- position: relative;
383
- overflow: hidden;
384
- }
385
-
386
- .section-card h2,
387
- .section-header h2 {
388
- margin: 0 0 10px;
389
- font-size: clamp(1.2rem, 2vw, 1.65rem);
390
- font-weight: 700;
391
- letter-spacing: -0.04em;
392
- line-height: 1.2;
393
- }
394
-
395
- .section-card p {
396
- margin: 0 0 18px;
397
- color: var(--text-2);
398
- line-height: 1.75;
399
- }
400
-
401
- .section-card p:last-child { margin-bottom: 0; }
402
- .section-header { margin-bottom: 16px; }
403
-
404
- .section,
405
- .split-layout,
406
- .page-intro {
407
- position: relative;
408
- }
409
-
410
- .compact-section { margin-top: 10px; }
411
-
412
- /* ── Card grids — hairline separator style ── */
413
- .card-grid,
414
- .stats-grid,
415
- .catalog-grid,
416
- .metric-grid,
417
- .activity-list,
418
- .signal-list,
419
- .product-facts {
420
- display: grid;
421
- gap: 1px;
422
- background: var(--border);
423
- border: 1px solid var(--border);
424
- border-radius: var(--r-xl);
425
- overflow: hidden;
426
- }
427
-
428
- .card-grid,
429
- .stats-grid {
430
- grid-template-columns: repeat(3, minmax(0, 1fr));
431
- margin-top: 16px;
432
- }
433
-
434
- .info-card,
435
- .stat-card {
436
- background: var(--surface);
437
- padding: 28px;
438
- position: relative;
439
- overflow: hidden;
440
- }
441
-
442
- .info-card h3 {
443
- margin: 0 0 8px;
444
- font-size: 0.9rem;
445
- font-weight: 600;
446
- letter-spacing: -0.01em;
447
- }
448
-
449
- .info-card p {
450
- margin: 0;
451
- font-size: 0.86rem;
452
- color: var(--text-2);
453
- line-height: 1.65;
454
- }
455
-
456
- .stat-card strong,
457
- .contact-value {
458
- display: block;
459
- font-size: 1.9rem;
460
- font-weight: 700;
461
- letter-spacing: -0.05em;
462
- color: var(--text);
463
- margin-bottom: 6px;
464
- }
465
-
466
- .stat-card p {
467
- margin: 0;
468
- font-size: 0.84rem;
469
- color: var(--text-2);
470
- line-height: 1.6;
471
- }
472
-
473
- /* ── Render summary ── */
474
- .render-summary-grid {
475
- display: grid;
476
- grid-template-columns: repeat(2, minmax(0, 1fr));
477
- gap: 1px;
478
- background: var(--border);
479
- border: 1px solid var(--border);
480
- border-radius: var(--r-lg);
481
- overflow: hidden;
482
- margin-top: 20px;
483
- }
484
-
485
- .render-summary-grid--wide {
486
- grid-template-columns: repeat(4, minmax(0, 1fr));
487
- }
488
-
489
- .render-item {
490
- background: var(--surface);
491
- padding: 16px 20px;
492
- }
493
-
494
- .render-item span {
495
- display: block;
496
- font-size: 0.7rem;
497
- font-weight: 600;
498
- color: var(--text-3);
499
- letter-spacing: 0.06em;
500
- text-transform: uppercase;
501
- margin-bottom: 4px;
502
- }
503
-
504
- .render-item strong {
505
- display: block;
506
- font-size: 0.88rem;
507
- font-weight: 600;
508
- color: var(--text);
509
- }
510
-
511
- .render-note {
512
- margin-top: 14px;
513
- font-size: 0.84rem;
514
- color: var(--text-2);
515
- line-height: 1.7;
516
- }
517
-
518
- .render-stamp {
519
- display: inline-block;
520
- margin-top: 8px;
521
- font-size: 0.76rem;
522
- }
523
-
524
- .render-band {
525
- background: var(--bg-2);
526
- border: 1px solid var(--border);
527
- border-radius: var(--r-md);
528
- padding: 16px;
529
- margin-top: 12px;
530
- }
531
-
532
- /* ── Code ── */
533
- .code-block,
534
- .mono-list {
535
- font-family: "Geist Mono", "Cascadia Code", "Consolas", ui-monospace, monospace;
536
- }
537
-
538
- .code-block {
539
- margin: 16px 0 0;
540
- padding: 20px;
541
- border-radius: var(--r-md);
542
- background: #0a0a0a;
543
- color: #ededed;
544
- border: 1px solid #262626;
545
- white-space: pre-wrap;
546
- word-break: break-word;
547
- font-size: 0.82rem;
548
- line-height: 1.72;
549
- }
550
-
551
- .code-panel { background: var(--surface); }
552
-
553
- code {
554
- font-family: "Geist Mono", "Cascadia Code", "Consolas", ui-monospace, monospace;
555
- font-size: 0.85em;
556
- background: var(--bg-3);
557
- color: var(--text);
558
- padding: 2px 6px;
559
- border-radius: 4px;
560
- border: 1px solid var(--border);
561
- }
562
-
563
- /* ── Lists ── */
564
- .check-list,
565
- .flow-list {
566
- margin: 16px 0 0;
567
- padding-left: 20px;
568
- display: grid;
569
- gap: 10px;
570
- }
571
-
572
- .check-list li,
573
- .flow-list li {
574
- font-size: 0.9rem;
575
- color: var(--text-2);
576
- line-height: 1.65;
577
- }
578
-
579
- .check-list li::marker,
580
- .flow-list li::marker { color: var(--accent); }
581
-
582
- /* ── Layouts ── */
583
- .split-layout {
584
- display: grid;
585
- grid-template-columns: repeat(2, minmax(0, 1fr));
586
- gap: 16px;
587
- margin-top: 16px;
588
- }
589
-
590
- .hero {
591
- display: grid;
592
- grid-template-columns: 1.2fr 0.8fr;
593
- gap: 16px;
594
- align-items: stretch;
595
- margin-top: 16px;
596
- }
597
-
598
- .hero-copy {
599
- background: var(--surface);
600
- border: 1px solid var(--border);
601
- border-radius: var(--r-xl);
602
- padding: 36px;
603
- position: relative;
604
- overflow: hidden;
605
- }
606
-
607
- .hero-aside {
608
- background: var(--surface);
609
- border: 1px solid var(--border);
610
- border-radius: var(--r-xl);
611
- padding: 28px;
612
- display: flex;
613
- align-items: stretch;
614
- }
615
-
616
- .render-panel { width: 100%; }
617
-
618
- /* ── Dashboard ── */
619
- .dashboard-grid {
620
- display: grid;
621
- grid-template-columns: 1.12fr 0.88fr;
622
- gap: 16px;
623
- margin-top: 16px;
624
- }
625
-
626
- .metric-grid {
627
- grid-template-columns: repeat(2, minmax(0, 1fr));
628
- margin-top: 0;
629
- }
630
-
631
- .metric-panel {
632
- background: var(--surface);
633
- padding: 20px 24px;
634
- }
635
-
636
- .metric-panel span,
637
- .activity-time,
638
- .product-chip,
639
- .status-pill,
640
- .submitted-brief span,
641
- .field-group span,
642
- .status-summary span,
643
- .inline-response-meta strong {
644
- display: inline-flex;
645
- font-size: 0.68rem;
646
- font-weight: 600;
647
- letter-spacing: 0.06em;
648
- text-transform: uppercase;
649
- color: var(--text-3);
650
- }
651
-
652
- .metric-panel strong {
653
- display: block;
654
- margin-top: 8px;
655
- font-size: 1.85rem;
656
- font-weight: 700;
657
- letter-spacing: -0.05em;
658
- color: var(--text);
659
- }
660
-
661
- .metric-panel p,
662
- .activity-item p,
663
- .signal-item p,
664
- .product-note,
665
- .status-panel p,
666
- .submitted-brief p,
667
- .quick-check-panel p {
668
- margin: 6px 0 0;
669
- font-size: 0.82rem;
670
- color: var(--text-2);
671
- line-height: 1.6;
672
- }
673
-
674
- .activity-list {
675
- border-radius: var(--r-lg);
676
- margin-top: 16px;
677
- }
678
-
679
- .activity-item {
680
- display: grid;
681
- grid-template-columns: 76px 1fr;
682
- gap: 14px;
683
- padding: 16px 20px;
684
- background: var(--surface);
685
- position: relative;
686
- overflow: hidden;
687
- }
688
-
689
- .activity-time {
690
- align-self: start;
691
- padding: 3px 7px;
692
- border-radius: var(--r-sm);
693
- background: var(--bg-3);
694
- border: 1px solid var(--border);
695
- }
696
-
697
- .activity-item h3,
698
- .signal-item h3,
699
- .product-card h2,
700
- .status-panel h3,
701
- .quick-check-panel h3 {
702
- margin: 0;
703
- font-size: 0.9rem;
704
- font-weight: 600;
705
- letter-spacing: -0.01em;
706
- }
707
-
708
- .signal-list {
709
- border-radius: var(--r-lg);
710
- }
711
-
712
- .signal-item {
713
- padding: 18px 20px;
714
- background: var(--surface);
715
- }
716
-
717
- /* ── Products ── */
718
- .catalog-grid {
719
- grid-template-columns: repeat(3, minmax(0, 1fr));
720
- border-radius: var(--r-xl);
721
- margin-top: 16px;
722
- }
723
-
724
- .product-card {
725
- background: var(--surface);
726
- padding: 24px;
727
- position: relative;
728
- overflow: hidden;
729
- }
730
-
731
- .product-card-head {
732
- display: flex;
733
- align-items: center;
734
- justify-content: space-between;
735
- gap: 10px;
736
- }
737
-
738
- .product-chip,
739
- .status-pill {
740
- padding: 3px 8px;
741
- border-radius: var(--r-sm);
742
- background: var(--bg-3);
743
- border: 1px solid var(--border);
744
- }
745
-
746
- .product-card > p {
747
- margin-top: 12px;
748
- font-size: 0.86rem;
749
- color: var(--text-2);
750
- line-height: 1.65;
751
- }
752
-
753
- .product-facts {
754
- margin-top: 14px;
755
- border-radius: var(--r-sm);
756
- }
757
-
758
- .product-facts div,
759
- .status-summary div,
760
- .inline-response-meta span {
761
- padding: 10px 14px;
762
- background: var(--bg-2);
763
- }
764
-
765
- .product-facts dt {
766
- font-size: 0.68rem;
767
- font-weight: 600;
768
- color: var(--text-3);
769
- letter-spacing: 0.06em;
770
- text-transform: uppercase;
771
- }
772
-
773
- .product-facts dd,
774
- .status-summary strong {
775
- margin: 4px 0 0;
776
- font-size: 0.88rem;
777
- font-weight: 600;
778
- color: var(--text);
779
- }
780
-
781
- .product-note {
782
- padding-top: 12px;
783
- margin-top: 12px;
784
- border-top: 1px solid var(--border);
785
- font-size: 0.82rem;
786
- color: var(--text-2);
787
- }
788
-
789
- .api-grid {
790
- display: grid;
791
- grid-template-columns: repeat(2, minmax(0, 1fr));
792
- gap: 16px;
793
- margin-top: 16px;
794
- }
795
-
796
- /* ── Forms ── */
797
- .form-panel { background: var(--surface); }
798
-
799
- .webas-form,
800
- .quick-check-form {
801
- display: grid;
802
- gap: 16px;
803
- margin-top: 20px;
804
- }
805
-
806
- .field-grid {
807
- display: grid;
808
- grid-template-columns: repeat(2, minmax(0, 1fr));
809
- gap: 16px;
810
- }
811
-
812
- .field-group {
813
- display: grid;
814
- gap: 6px;
815
- }
816
-
817
- .field-group input,
818
- .field-group textarea {
819
- width: 100%;
820
- padding: 9px 12px;
821
- border-radius: var(--r-md);
822
- border: 1px solid var(--border-2);
823
- background: var(--surface);
824
- color: var(--text);
825
- font: inherit;
826
- font-size: 0.9rem;
827
- transition: border-color 130ms ease, box-shadow 130ms ease;
828
- }
829
-
830
- .field-group input::placeholder,
831
- .field-group textarea::placeholder { color: var(--text-3); }
832
-
833
- .field-group input:hover,
834
- .field-group textarea:hover { border-color: var(--text-3); }
835
-
836
- .field-group input:focus,
837
- .field-group textarea:focus {
838
- outline: none;
839
- border-color: var(--text);
840
- box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.07);
841
- }
842
-
843
- .field-group textarea {
844
- resize: vertical;
845
- min-height: 140px;
846
- }
847
-
848
- .field-error {
849
- font-size: 0.8rem;
850
- color: #dc2626;
851
- line-height: 1.4;
852
- }
853
-
854
- .form-actions {
855
- display: flex;
856
- align-items: center;
857
- justify-content: space-between;
858
- gap: 12px;
859
- flex-wrap: wrap;
860
- padding-top: 8px;
861
- }
862
-
863
- .form-actions span {
864
- font-size: 0.82rem;
865
- color: var(--text-3);
866
- }
867
-
868
- /* ── Status panels ── */
869
- .status-panel {
870
- padding: 24px;
871
- border-radius: var(--r-xl);
872
- border: 1px solid var(--border);
873
- background: var(--surface);
874
- position: relative;
875
- overflow: hidden;
876
- }
877
-
878
- .status-panel--success {
879
- background: var(--success-bg);
880
- border-color: var(--success-border);
881
- }
882
-
883
- .status-panel--error {
884
- background: var(--error-bg);
885
- border-color: var(--error-border);
886
- }
887
-
888
- .status-summary {
889
- display: grid;
890
- grid-template-columns: repeat(2, minmax(0, 1fr));
891
- gap: 1px;
892
- background: var(--border);
893
- border: 1px solid var(--border);
894
- border-radius: var(--r-md);
895
- overflow: hidden;
896
- margin-top: 16px;
897
- }
898
-
899
- .submitted-brief {
900
- margin-top: 16px;
901
- padding: 16px;
902
- border-radius: var(--r-md);
903
- border: 1px solid var(--border);
904
- background: var(--bg-2);
905
- }
906
-
907
- /* ── Inline response ── */
908
- .inline-response-shell { margin-top: 12px; }
909
-
910
- .asjs-inline-response {
911
- padding: 16px;
912
- border-radius: var(--r-md);
913
- border: 1px solid var(--border);
914
- background: var(--bg-2);
915
- }
916
-
917
- .asjs-inline-response strong {
918
- display: block;
919
- font-size: 0.9rem;
920
- font-weight: 600;
921
- }
922
-
923
- .asjs-inline-response p {
924
- margin: 6px 0 0;
925
- font-size: 0.84rem;
926
- color: var(--text-2);
927
- line-height: 1.6;
928
- }
929
-
930
- .asjs-inline-response.is-success {
931
- background: var(--success-bg);
932
- border-color: var(--success-border);
933
- }
934
-
935
- .asjs-inline-response.is-error {
936
- background: var(--error-bg);
937
- border-color: var(--error-border);
938
- }
939
-
940
- .asjs-inline-response.is-neutral { background: var(--bg-2); }
941
-
942
- .inline-response-meta {
943
- display: grid;
944
- grid-template-columns: repeat(3, minmax(0, 1fr));
945
- gap: 1px;
946
- background: var(--border);
947
- border: 1px solid var(--border);
948
- border-radius: var(--r-sm);
949
- overflow: hidden;
950
- margin-top: 12px;
951
- }
952
-
953
- .inline-response-meta span {
954
- display: grid;
955
- gap: 4px;
956
- margin: 0;
957
- padding: 10px 12px;
958
- background: var(--surface);
959
- }
960
-
961
- .inline-support {
962
- margin: 12px 0 0;
963
- font-size: 0.82rem;
964
- color: var(--text-3);
965
- }
966
-
967
- .inline-link {
968
- color: var(--accent);
969
- text-decoration: underline;
970
- text-underline-offset: 2px;
971
- }
972
-
973
- .quick-check-panel {
974
- margin-top: 20px;
975
- padding-top: 20px;
976
- border-top: 1px solid var(--border);
977
- }
978
-
979
- .quick-check-actions { margin-top: 4px; }
980
-
981
- /* ── Contact card ── */
982
- .contact-card {
983
- background: var(--surface);
984
- border: 1px solid var(--border);
985
- border-radius: var(--r-xl);
986
- padding: 24px;
987
- }
988
-
989
- /* ── Not found ── */
990
- .not-found-panel {
991
- padding: 64px 0;
992
- }
993
-
994
- /* ── Footer ── */
995
- .footer {
996
- display: flex;
997
- justify-content: space-between;
998
- align-items: center;
999
- gap: 12px;
1000
- flex-wrap: wrap;
1001
- margin-top: 48px;
1002
- padding: 20px 0;
1003
- border-top: 1px solid var(--border);
1004
- font-size: 0.8rem;
1005
- color: var(--text-3);
1006
- }
1007
-
1008
- .footer strong {
1009
- color: var(--text-2);
1010
- font-weight: 500;
1011
- }
1012
-
1013
- /* ── Form state ── */
1014
- .asjs-form-submitting {
1015
- opacity: 0.65;
1016
- pointer-events: none;
1017
- }
1018
-
1019
- /* ── Animations ── */
1020
- @keyframes reveal {
1021
- from { opacity: 0; transform: translateY(4px); }
1022
- to { opacity: 1; transform: translateY(0); }
1023
- }
1024
-
1025
- @keyframes shimmer {
1026
- 0% { background-position: 200% 0; }
1027
- 100% { background-position: -200% 0; }
1028
- }
1029
-
1030
- /* ── Tablet ── */
1031
- @media (max-width: 1024px) {
1032
- .header-main { grid-template-columns: auto 1fr; }
1033
- .header-cta { display: none; }
1034
- .hero, .split-layout, .dashboard-grid { grid-template-columns: 1fr; }
1035
- .catalog-grid, .card-grid, .stats-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1036
- .render-summary-grid--wide { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1037
- }
1038
-
1039
- /* ── Mobile ── */
1040
- @media (max-width: 640px) {
1041
- .page-shell {
1042
- width: min(100%, calc(100% - 24px));
1043
- padding-bottom: 40px;
1044
- }
1045
-
1046
- .header-main {
1047
- grid-template-columns: auto 1fr;
1048
- height: auto;
1049
- padding: 10px 16px;
1050
- gap: 10px;
1051
- }
1052
-
1053
- .brand-copy small,
1054
- .brand-copy span { display: none; }
1055
-
1056
- .site-nav { justify-content: flex-start; padding: 0; }
1057
-
1058
- .page-intro { padding: 36px 0 20px; }
1059
- .section-card { padding: 20px; }
1060
- .view-frame { margin-top: 24px; }
1061
-
1062
- .card-grid, .stats-grid, .catalog-grid,
1063
- .metric-grid, .api-grid, .field-grid,
1064
- .status-summary, .inline-response-meta {
1065
- grid-template-columns: 1fr;
1066
- }
1067
-
1068
- .render-summary-grid,
1069
- .render-summary-grid--wide { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1070
-
1071
- .hero-copy, .hero-aside { padding: 20px; }
1072
-
1073
- .route-loader {
1074
- inset: auto 8px 8px 8px;
1075
- width: auto;
1076
- }
1077
-
1078
- .activity-item { grid-template-columns: 1fr; }
1079
-
1080
- .footer {
1081
- flex-direction: column;
1082
- align-items: flex-start;
1083
- }
1084
- }
1
+ /* ================================================================
2
+ ASJS Theme — v1.7 — Dual Light/Dark · Violet + Sky · Inter
3
+ ================================================================ */
4
+
5
+ @import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,300;0,14..32,400;0,14..32,500;0,14..32,600;0,14..32,700;0,14..32,800;1,14..32,400&family=JetBrains+Mono:ital,wght@0,400;0,500;1,400&display=swap');
6
+
7
+ /* ─── LIGHT TOKENS ──────────────────────────────────────────── */
8
+ :root {
9
+ --bg: #ffffff;
10
+ --bg-2: #f6f7fb;
11
+ --bg-3: #eceef6;
12
+ --surface: #ffffff;
13
+
14
+ --border: rgba(13, 13, 50, 0.08);
15
+ --border-2: rgba(13, 13, 50, 0.15);
16
+
17
+ --text: #0d0d18;
18
+ --text-2: #52526e;
19
+ --text-3: #9696b4;
20
+
21
+ --accent: #7c3aed;
22
+ --accent-h: #6d28d9;
23
+ --accent-soft: #f4f2ff;
24
+ --accent-rgb: 124, 58, 237;
25
+
26
+ --sky: #0ea5e9;
27
+ --sky-soft: #f0f9ff;
28
+ --sky-rgb: 14, 165, 233;
29
+
30
+ --ok: #059669;
31
+ --ok-bg: #ecfdf5;
32
+ --ok-border: rgba(5, 150, 105, 0.18);
33
+ --err: #dc2626;
34
+ --err-bg: #fef2f2;
35
+ --err-border: rgba(220, 38, 38, 0.18);
36
+ --warn-bg: #fffbeb;
37
+ --warn-border:rgba(217, 119, 6, 0.18);
38
+
39
+ --r-2xl: 20px;
40
+ --r-xl: 16px;
41
+ --r-lg: 12px;
42
+ --r-md: 8px;
43
+ --r-sm: 6px;
44
+ --r-xs: 4px;
45
+
46
+ --sh-xs: 0 1px 2px rgba(0,0,0,0.05);
47
+ --sh-sm: 0 1px 3px rgba(0,0,0,0.06), 0 4px 12px rgba(0,0,0,0.04);
48
+ --sh-md: 0 4px 20px rgba(0,0,0,0.09), 0 1px 3px rgba(0,0,0,0.04);
49
+ --sh-accent: 0 6px 24px rgba(var(--accent-rgb), 0.28);
50
+
51
+ --asjs-progress-gradient: linear-gradient(90deg, var(--accent), #a78bfa);
52
+ --asjs-progress-shadow: 0 0 14px rgba(var(--accent-rgb), 0.55);
53
+
54
+ /* Bootstrap light bridge — binds BS components to our palette */
55
+ --bs-body-bg: #ffffff;
56
+ --bs-body-bg-rgb: 255,255,255;
57
+ --bs-body-color: #0d0d18;
58
+ --bs-body-color-rgb: 13,13,24;
59
+ --bs-secondary-color: #52526e;
60
+ --bs-border-color: rgba(13,13,50,0.14);
61
+ --bs-border-color-translucent: rgba(13,13,50,0.10);
62
+ --bs-card-bg: #ffffff;
63
+ --bs-card-border-color: rgba(13,13,50,0.10);
64
+ --bs-secondary-bg: #f6f7fb;
65
+ --bs-tertiary-bg: #eceef6;
66
+ --bs-primary: #7c3aed;
67
+ --bs-primary-rgb: 124,58,237;
68
+ --bs-btn-bg: #7c3aed;
69
+ --bs-link-color: #7c3aed;
70
+ --bs-link-color-rgb: 124,58,237;
71
+ --bs-link-hover-color: #6d28d9;
72
+ --bs-focus-ring-color: rgba(124,58,237,0.25);
73
+ }
74
+
75
+ /* ─── DARK TOKENS ───────────────────────────────────────────── */
76
+ [data-theme="dark"] {
77
+ --bg: #0d0d18;
78
+ --bg-2: #161625;
79
+ --bg-3: #1e1e30;
80
+ --surface: #131320;
81
+
82
+ --border: rgba(255, 255, 255, 0.10);
83
+ --border-2: rgba(255, 255, 255, 0.19);
84
+
85
+ --text: #ededf8;
86
+ --text-2: #8888ac;
87
+ --text-3: #52527a;
88
+
89
+ --accent: #a78bfa;
90
+ --accent-h: #c4b5fd;
91
+ --accent-soft: #1a1132;
92
+ --accent-rgb: 167, 139, 250;
93
+
94
+ --sky: #38bdf8;
95
+ --sky-soft: #0a1f30;
96
+ --sky-rgb: 56, 189, 248;
97
+
98
+ --ok: #34d399;
99
+ --ok-bg: #071a12;
100
+ --ok-border: rgba(52, 211, 153, 0.22);
101
+ --err: #f87171;
102
+ --err-bg: #1a0707;
103
+ --err-border: rgba(248, 113, 113, 0.22);
104
+ --warn-bg: #1a1300;
105
+ --warn-border:rgba(251, 191, 36, 0.22);
106
+
107
+ --sh-xs: 0 1px 3px rgba(0,0,0,0.65);
108
+ --sh-sm: 0 2px 10px rgba(0,0,0,0.75), 0 1px 3px rgba(0,0,0,0.5);
109
+ --sh-md: 0 8px 36px rgba(0,0,0,0.85), 0 2px 8px rgba(0,0,0,0.55);
110
+ --sh-accent: 0 6px 24px rgba(var(--accent-rgb), 0.22);
111
+
112
+ --asjs-progress-gradient: linear-gradient(90deg, var(--accent), #c4b5fd);
113
+ --asjs-progress-shadow: 0 0 14px rgba(var(--accent-rgb), 0.5);
114
+
115
+ /* Bootstrap dark bridge */
116
+ --bs-body-bg: #0d0d18;
117
+ --bs-body-bg-rgb: 13,13,24;
118
+ --bs-body-color: #ededf8;
119
+ --bs-body-color-rgb: 237,237,248;
120
+ --bs-secondary-color: #8888ac;
121
+ --bs-border-color: rgba(255,255,255,0.13);
122
+ --bs-border-color-translucent: rgba(255,255,255,0.09);
123
+ --bs-card-bg: #131320;
124
+ --bs-card-border-color: rgba(255,255,255,0.09);
125
+ --bs-secondary-bg: #1e1e30;
126
+ --bs-tertiary-bg: #26263c;
127
+ --bs-primary: #a78bfa;
128
+ --bs-primary-rgb: 167,139,250;
129
+ --bs-link-color: #a78bfa;
130
+ --bs-link-color-rgb: 167,139,250;
131
+ --bs-link-hover-color: #c4b5fd;
132
+ --bs-focus-ring-color: rgba(167,139,250,0.25);
133
+ }
134
+
135
+ /* ─── BASE ──────────────────────────────────────────────────── */
136
+ *, *::before, *::after { box-sizing: border-box; }
137
+
138
+ html {
139
+ scroll-behavior: smooth;
140
+ -webkit-font-smoothing: antialiased;
141
+ -moz-osx-font-smoothing: grayscale;
142
+ text-rendering: optimizeLegibility;
143
+ }
144
+
145
+ body.example-body {
146
+ margin: 0;
147
+ min-height: 100vh;
148
+ color: var(--text);
149
+ background: var(--bg);
150
+ font-family: "Inter", system-ui, -apple-system, sans-serif;
151
+ font-size: 15px;
152
+ font-feature-settings: "cv02","cv03","cv04","cv11";
153
+ line-height: 1.65;
154
+ transition: background-color 220ms ease, color 220ms ease;
155
+ }
156
+
157
+ body.example-body::after {
158
+ content: "";
159
+ position: fixed;
160
+ inset: 0;
161
+ background: rgba(255,255,255,0.6);
162
+ backdrop-filter: blur(6px);
163
+ opacity: 0;
164
+ pointer-events: none;
165
+ transition: opacity 180ms ease;
166
+ z-index: 18;
167
+ }
168
+
169
+ [data-theme="dark"] body.example-body::after {
170
+ background: rgba(11,11,20,0.75);
171
+ }
172
+
173
+ html.asjs-loading body.example-body::after { opacity: 1; }
174
+
175
+ a { color: inherit; text-decoration: none; }
176
+ a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-xs); }
177
+ button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
178
+
179
+ /* ─── PAGE SHELL ─────────────────────────────────────────────── */
180
+ .page-shell {
181
+ width: min(1120px, calc(100% - 40px));
182
+ margin: 0 auto;
183
+ padding-bottom: 72px;
184
+ }
185
+
186
+ /* ─── HEADER — frosted glass ─────────────────────────────────── */
187
+ .example-header {
188
+ position: sticky;
189
+ top: 0;
190
+ z-index: 100;
191
+ background: rgba(255, 255, 255, 0.82);
192
+ backdrop-filter: blur(16px) saturate(180%);
193
+ -webkit-backdrop-filter: blur(16px) saturate(180%);
194
+ border-bottom: 1px solid var(--border);
195
+ transition: background 220ms ease, border-color 220ms ease;
196
+ }
197
+
198
+ [data-theme="dark"] .example-header {
199
+ background: rgba(11, 11, 20, 0.84);
200
+ }
201
+
202
+ .header-note { display: none; }
203
+
204
+ .header-main {
205
+ display: grid;
206
+ grid-template-columns: auto 1fr auto;
207
+ align-items: center;
208
+ height: 58px;
209
+ padding: 0 24px;
210
+ gap: 8px;
211
+ }
212
+
213
+ .brand-link {
214
+ display: flex;
215
+ align-items: center;
216
+ gap: 10px;
217
+ padding-right: 20px;
218
+ border-right: 1px solid var(--border);
219
+ flex-shrink: 0;
220
+ border-radius: var(--r-sm);
221
+ }
222
+
223
+ .brand-mark {
224
+ width: 28px;
225
+ height: 28px;
226
+ display: grid;
227
+ place-items: center;
228
+ border-radius: var(--r-sm);
229
+ background: linear-gradient(135deg, var(--accent) 0%, #a78bfa 100%);
230
+ color: #fff;
231
+ font-size: 0.6rem;
232
+ font-weight: 700;
233
+ letter-spacing: 0.03em;
234
+ flex-shrink: 0;
235
+ box-shadow: var(--sh-accent);
236
+ }
237
+
238
+ .brand-copy {
239
+ display: flex;
240
+ align-items: center;
241
+ gap: 10px;
242
+ }
243
+
244
+ .brand-copy strong {
245
+ font-size: 0.9rem;
246
+ font-weight: 700;
247
+ letter-spacing: -0.02em;
248
+ color: var(--text);
249
+ }
250
+
251
+ .brand-copy span,
252
+ .brand-copy small {
253
+ font-size: 0.75rem;
254
+ color: var(--text-3);
255
+ padding-left: 10px;
256
+ border-left: 1px solid var(--border);
257
+ }
258
+
259
+ /* ─── NAV ────────────────────────────────────────────────────── */
260
+ .site-nav {
261
+ display: flex;
262
+ justify-content: center;
263
+ align-items: center;
264
+ gap: 2px;
265
+ padding: 0 12px;
266
+ }
267
+
268
+ .site-link {
269
+ display: flex;
270
+ align-items: center;
271
+ height: 34px;
272
+ padding: 0 12px;
273
+ border-radius: var(--r-md);
274
+ font-size: 0.84rem;
275
+ font-weight: 500;
276
+ color: var(--text-2);
277
+ transition: background 120ms ease, color 120ms ease;
278
+ white-space: nowrap;
279
+ position: relative;
280
+ }
281
+
282
+ .site-link small { display: none; }
283
+
284
+ .site-link:hover {
285
+ background: var(--bg-3);
286
+ color: var(--text);
287
+ }
288
+
289
+ .site-link.is-active {
290
+ background: var(--accent-soft);
291
+ color: var(--accent);
292
+ font-weight: 600;
293
+ }
294
+
295
+ .site-link[data-asjs-prefetched="true"]::after {
296
+ content: "";
297
+ position: absolute;
298
+ bottom: 4px;
299
+ left: 50%;
300
+ transform: translateX(-50%);
301
+ width: 4px;
302
+ height: 4px;
303
+ border-radius: 50%;
304
+ background: var(--accent);
305
+ opacity: 0.6;
306
+ }
307
+
308
+ .header-cta {
309
+ padding-left: 20px;
310
+ border-left: 1px solid var(--border);
311
+ flex-shrink: 0;
312
+ }
313
+
314
+ /* ─── BUTTONS ────────────────────────────────────────────────── */
315
+ .button {
316
+ display: inline-flex;
317
+ align-items: center;
318
+ justify-content: center;
319
+ gap: 6px;
320
+ height: 38px;
321
+ padding: 0 18px;
322
+ border-radius: var(--r-md);
323
+ border: 1px solid transparent;
324
+ font-family: inherit;
325
+ font-size: 0.84rem;
326
+ font-weight: 600;
327
+ letter-spacing: -0.01em;
328
+ cursor: pointer;
329
+ transition: background 120ms ease, box-shadow 120ms ease, border-color 120ms ease, color 120ms ease, transform 80ms ease;
330
+ white-space: nowrap;
331
+ text-decoration: none;
332
+ }
333
+
334
+ .button:active { transform: scale(0.97); }
335
+
336
+ .button-primary {
337
+ background: linear-gradient(135deg, var(--accent) 0%, #9b5cf5 100%);
338
+ color: #ffffff;
339
+ border-color: transparent;
340
+ box-shadow: var(--sh-accent), 0 1px 2px rgba(0,0,0,0.1);
341
+ }
342
+
343
+ .button-primary:hover {
344
+ background: linear-gradient(135deg, var(--accent-h) 0%, #8b4ee8 100%);
345
+ box-shadow: var(--sh-accent), 0 2px 8px rgba(0,0,0,0.15);
346
+ }
347
+
348
+ .button-secondary {
349
+ background: var(--surface);
350
+ color: var(--text);
351
+ border-color: var(--border-2);
352
+ box-shadow: var(--sh-xs);
353
+ }
354
+
355
+ .button-secondary:hover {
356
+ background: var(--bg-2);
357
+ border-color: var(--accent);
358
+ color: var(--accent);
359
+ }
360
+
361
+ /* ─── VIEW FRAME ─────────────────────────────────────────────── */
362
+ .view-frame {
363
+ margin-top: 52px;
364
+ background: none;
365
+ }
366
+
367
+ [data-asjs-view] { animation: reveal 200ms ease; }
368
+
369
+ /* ─── ROUTE LOADER ───────────────────────────────────────────── */
370
+ .route-loader {
371
+ position: fixed;
372
+ inset: auto 20px 20px auto;
373
+ width: min(340px, calc(100% - 32px));
374
+ opacity: 0;
375
+ transform: translateY(8px);
376
+ pointer-events: none;
377
+ transition: opacity 180ms ease, transform 180ms ease;
378
+ z-index: 200;
379
+ }
380
+
381
+ html.asjs-loading .route-loader {
382
+ opacity: 1;
383
+ transform: translateY(0);
384
+ }
385
+
386
+ .route-loader-card {
387
+ padding: 16px 18px;
388
+ border-radius: var(--r-lg);
389
+ border: 1px solid var(--border);
390
+ background: var(--surface);
391
+ backdrop-filter: blur(16px);
392
+ box-shadow: var(--sh-md);
393
+ }
394
+
395
+ .route-loader-label {
396
+ display: inline-flex;
397
+ padding: 3px 9px;
398
+ border-radius: var(--r-sm);
399
+ background: var(--accent-soft);
400
+ border: 1px solid rgba(var(--accent-rgb), 0.2);
401
+ color: var(--accent);
402
+ font-size: 0.68rem;
403
+ font-weight: 700;
404
+ letter-spacing: 0.06em;
405
+ text-transform: uppercase;
406
+ }
407
+
408
+ .route-loader-card strong {
409
+ display: block;
410
+ margin-top: 10px;
411
+ font-size: 0.9rem;
412
+ font-weight: 600;
413
+ letter-spacing: -0.02em;
414
+ color: var(--text);
415
+ }
416
+
417
+ .route-loader-card p {
418
+ margin: 6px 0 0;
419
+ font-size: 0.8rem;
420
+ color: var(--text-3);
421
+ line-height: 1.5;
422
+ }
423
+
424
+ .route-loader-skeleton {
425
+ display: grid;
426
+ gap: 6px;
427
+ margin-top: 12px;
428
+ }
429
+
430
+ .route-loader-skeleton span {
431
+ display: block;
432
+ height: 7px;
433
+ border-radius: 999px;
434
+ background: linear-gradient(90deg, var(--bg-3) 25%, var(--bg-2) 50%, var(--bg-3) 75%);
435
+ background-size: 200% 100%;
436
+ animation: shimmer 1.4s ease-in-out infinite;
437
+ }
438
+
439
+ .route-loader-skeleton span:nth-child(2) { width: 76%; }
440
+ .route-loader-skeleton span:nth-child(3) { width: 54%; }
441
+
442
+ /* ─── PAGE INTRO / HERO ──────────────────────────────────────── */
443
+ .page-intro {
444
+ padding: 64px 0 36px;
445
+ max-width: 720px;
446
+ }
447
+
448
+ .page-intro h1,
449
+ .hero-copy h1,
450
+ .not-found-panel h1 {
451
+ margin: 0 0 16px;
452
+ font-size: clamp(2.2rem, 5vw, 3.6rem);
453
+ font-weight: 800;
454
+ letter-spacing: -0.05em;
455
+ line-height: 1.04;
456
+ color: var(--text);
457
+ }
458
+
459
+ .page-intro p,
460
+ .hero-copy p {
461
+ margin: 0;
462
+ font-size: 1.05rem;
463
+ color: var(--text-2);
464
+ line-height: 1.78;
465
+ font-weight: 400;
466
+ }
467
+
468
+ .hero-actions {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 10px;
472
+ margin-top: 28px;
473
+ flex-wrap: wrap;
474
+ }
475
+
476
+ /* ─── LABELS / BADGES ────────────────────────────────────────── */
477
+ .section-label,
478
+ .hero-badge,
479
+ .example-pill {
480
+ display: inline-flex;
481
+ align-items: center;
482
+ padding: 4px 10px;
483
+ border-radius: var(--r-sm);
484
+ border: 1px solid rgba(var(--accent-rgb), 0.25);
485
+ background: var(--accent-soft);
486
+ font-size: 0.7rem;
487
+ font-weight: 700;
488
+ color: var(--accent);
489
+ letter-spacing: 0.06em;
490
+ text-transform: uppercase;
491
+ margin-bottom: 16px;
492
+ }
493
+
494
+ /* ─── SECTION CARD ───────────────────────────────────────────── */
495
+ .section-card {
496
+ border: 1px solid var(--border);
497
+ border-radius: var(--r-xl);
498
+ background: var(--surface);
499
+ padding: 36px;
500
+ margin-top: 16px;
501
+ box-shadow: var(--sh-sm);
502
+ transition: background 220ms ease, border-color 220ms ease;
503
+ }
504
+
505
+ .section-card h2,
506
+ .section-header h2 {
507
+ margin: 0 0 10px;
508
+ font-size: clamp(1.25rem, 2.2vw, 1.7rem);
509
+ font-weight: 700;
510
+ letter-spacing: -0.04em;
511
+ line-height: 1.15;
512
+ color: var(--text);
513
+ }
514
+
515
+ .section-card > p {
516
+ margin: 0 0 20px;
517
+ color: var(--text-2);
518
+ line-height: 1.75;
519
+ }
520
+
521
+ .section-card > p:last-child { margin-bottom: 0; }
522
+
523
+ /* ─── CARD GRIDS ─────────────────────────────────────────────── */
524
+ .card-grid {
525
+ display: grid;
526
+ grid-template-columns: repeat(3, minmax(0, 1fr));
527
+ gap: 1px;
528
+ background: var(--border);
529
+ border: 1px solid var(--border);
530
+ border-radius: var(--r-lg);
531
+ overflow: hidden;
532
+ margin-top: 20px;
533
+ }
534
+
535
+ .info-card {
536
+ background: var(--surface);
537
+ padding: 28px;
538
+ transition: background 140ms ease;
539
+ position: relative;
540
+ }
541
+
542
+ .info-card::before {
543
+ content: "";
544
+ position: absolute;
545
+ top: 0;
546
+ left: 0;
547
+ right: 0;
548
+ height: 2px;
549
+ background: linear-gradient(90deg, var(--accent), var(--sky));
550
+ opacity: 0;
551
+ transition: opacity 200ms ease;
552
+ }
553
+
554
+ .info-card:hover { background: var(--bg-2); }
555
+ .info-card:hover::before { opacity: 1; }
556
+
557
+ .info-card h3 {
558
+ margin: 0 0 8px;
559
+ font-size: 0.92rem;
560
+ font-weight: 600;
561
+ letter-spacing: -0.02em;
562
+ color: var(--text);
563
+ }
564
+
565
+ .info-card p {
566
+ margin: 0;
567
+ font-size: 0.86rem;
568
+ color: var(--text-2);
569
+ line-height: 1.68;
570
+ }
571
+
572
+ /* ─── RENDER SUMMARY GRID ────────────────────────────────────── */
573
+ .render-summary-grid {
574
+ display: grid;
575
+ grid-template-columns: repeat(2, minmax(0, 1fr));
576
+ gap: 1px;
577
+ background: var(--border);
578
+ border: 1px solid var(--border);
579
+ border-radius: var(--r-lg);
580
+ overflow: hidden;
581
+ margin-top: 20px;
582
+ box-shadow: var(--sh-xs);
583
+ }
584
+
585
+ .render-summary-grid--wide {
586
+ grid-template-columns: repeat(4, minmax(0, 1fr));
587
+ }
588
+
589
+ .render-item {
590
+ background: var(--surface);
591
+ padding: 18px 22px;
592
+ transition: background 140ms ease;
593
+ }
594
+
595
+ .render-item:hover { background: var(--bg-2); }
596
+
597
+ .render-item span {
598
+ display: block;
599
+ font-size: 0.68rem;
600
+ font-weight: 700;
601
+ color: var(--text-3);
602
+ letter-spacing: 0.08em;
603
+ text-transform: uppercase;
604
+ margin-bottom: 5px;
605
+ }
606
+
607
+ .render-item strong {
608
+ display: block;
609
+ font-size: 0.92rem;
610
+ font-weight: 600;
611
+ color: var(--text);
612
+ letter-spacing: -0.01em;
613
+ }
614
+
615
+ /* ─── CODE ───────────────────────────────────────────────────── */
616
+ .code-block,
617
+ .mono-list {
618
+ font-family: "JetBrains Mono", "Cascadia Code", "Consolas", ui-monospace, monospace;
619
+ }
620
+
621
+ .code-block {
622
+ margin: 18px 0 0;
623
+ padding: 22px 24px;
624
+ border-radius: var(--r-md);
625
+ background: #08080f;
626
+ color: #e8e8f5;
627
+ border: 1px solid #1e1e30;
628
+ white-space: pre-wrap;
629
+ word-break: break-word;
630
+ font-size: 0.83rem;
631
+ line-height: 1.75;
632
+ }
633
+
634
+ [data-theme="dark"] .code-block {
635
+ background: #06060e;
636
+ border-color: rgba(255,255,255,0.1);
637
+ }
638
+
639
+ code {
640
+ font-family: "JetBrains Mono", "Cascadia Code", ui-monospace, monospace;
641
+ font-size: 0.84em;
642
+ background: var(--bg-3);
643
+ color: var(--accent);
644
+ padding: 2px 7px;
645
+ border-radius: var(--r-xs);
646
+ border: 1px solid var(--border);
647
+ }
648
+
649
+ /* ─── LISTS ──────────────────────────────────────────────────── */
650
+ .check-list {
651
+ margin: 16px 0 0;
652
+ padding-left: 20px;
653
+ display: grid;
654
+ gap: 10px;
655
+ list-style: none;
656
+ padding: 0;
657
+ }
658
+
659
+ .check-list li {
660
+ display: flex;
661
+ align-items: flex-start;
662
+ gap: 10px;
663
+ font-size: 0.9rem;
664
+ color: var(--text-2);
665
+ line-height: 1.65;
666
+ padding: 10px 14px;
667
+ border-radius: var(--r-sm);
668
+ background: var(--bg-2);
669
+ border: 1px solid var(--border);
670
+ }
671
+
672
+ .check-list li::before {
673
+ content: "✓";
674
+ flex-shrink: 0;
675
+ width: 18px;
676
+ height: 18px;
677
+ border-radius: 50%;
678
+ background: linear-gradient(135deg, var(--accent), #a78bfa);
679
+ color: #fff;
680
+ font-size: 0.65rem;
681
+ font-weight: 700;
682
+ display: flex;
683
+ align-items: center;
684
+ justify-content: center;
685
+ margin-top: 2px;
686
+ }
687
+
688
+ /* ─── STATS / METRIC GRIDS ───────────────────────────────────── */
689
+ .stats-grid,
690
+ .metric-grid {
691
+ display: grid;
692
+ gap: 1px;
693
+ background: var(--border);
694
+ border: 1px solid var(--border);
695
+ border-radius: var(--r-xl);
696
+ overflow: hidden;
697
+ }
698
+
699
+ .stats-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); margin-top: 16px; }
700
+ .metric-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
701
+
702
+ .stat-card,
703
+ .metric-panel {
704
+ background: var(--surface);
705
+ padding: 28px;
706
+ position: relative;
707
+ overflow: hidden;
708
+ }
709
+
710
+ .stat-card strong,
711
+ .metric-panel strong {
712
+ display: block;
713
+ font-size: 2rem;
714
+ font-weight: 800;
715
+ letter-spacing: -0.06em;
716
+ color: var(--text);
717
+ margin-bottom: 6px;
718
+ }
719
+
720
+ .stat-card p,
721
+ .metric-panel p {
722
+ margin: 0;
723
+ font-size: 0.84rem;
724
+ color: var(--text-2);
725
+ line-height: 1.6;
726
+ }
727
+
728
+ .metric-panel span {
729
+ display: inline-flex;
730
+ font-size: 0.68rem;
731
+ font-weight: 700;
732
+ letter-spacing: 0.07em;
733
+ text-transform: uppercase;
734
+ color: var(--text-3);
735
+ margin-bottom: 8px;
736
+ }
737
+
738
+ /* ─── FORM ELEMENTS ──────────────────────────────────────────── */
739
+ .form-panel { background: var(--surface); }
740
+
741
+ .webas-form,
742
+ .asjs-form {
743
+ display: grid;
744
+ gap: 20px;
745
+ margin-top: 24px;
746
+ }
747
+
748
+ .field-grid {
749
+ display: grid;
750
+ grid-template-columns: repeat(2, minmax(0, 1fr));
751
+ gap: 20px;
752
+ }
753
+
754
+ .field-group {
755
+ display: grid;
756
+ gap: 7px;
757
+ }
758
+
759
+ .field-label,
760
+ .field-group > label,
761
+ .field-group > span {
762
+ font-size: 0.82rem;
763
+ font-weight: 600;
764
+ color: var(--text-2);
765
+ letter-spacing: -0.01em;
766
+ }
767
+
768
+ .field-group input,
769
+ .field-group textarea,
770
+ .field-group select,
771
+ .field-select {
772
+ width: 100%;
773
+ padding: 10px 14px;
774
+ border-radius: var(--r-md);
775
+ border: 1.5px solid var(--border-2);
776
+ background: var(--bg-2);
777
+ color: var(--text);
778
+ font: inherit;
779
+ font-size: 0.9rem;
780
+ line-height: 1.5;
781
+ transition: border-color 130ms ease, box-shadow 130ms ease, background 130ms ease;
782
+ -webkit-appearance: none;
783
+ appearance: none;
784
+ }
785
+
786
+ .field-group select,
787
+ .field-select {
788
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%239696b4' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
789
+ background-repeat: no-repeat;
790
+ background-position: right 12px center;
791
+ padding-right: 40px;
792
+ cursor: pointer;
793
+ }
794
+
795
+ .field-group input::placeholder,
796
+ .field-group textarea::placeholder { color: var(--text-3); }
797
+
798
+ .field-group input:hover,
799
+ .field-group textarea:hover,
800
+ .field-group select:hover { border-color: var(--accent); }
801
+
802
+ .field-group input:focus,
803
+ .field-group textarea:focus,
804
+ .field-group select:focus {
805
+ outline: none;
806
+ border-color: var(--accent);
807
+ background: var(--surface);
808
+ box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.14);
809
+ }
810
+
811
+ .field-group textarea {
812
+ resize: vertical;
813
+ min-height: 130px;
814
+ }
815
+
816
+ .field-error {
817
+ font-size: 0.8rem;
818
+ color: var(--err);
819
+ font-weight: 500;
820
+ }
821
+
822
+ .field-group.has-error input,
823
+ .field-group.has-error textarea,
824
+ .field-group.has-error select {
825
+ border-color: var(--err);
826
+ box-shadow: 0 0 0 3px var(--err-border);
827
+ }
828
+
829
+ .form-actions {
830
+ display: flex;
831
+ align-items: center;
832
+ justify-content: space-between;
833
+ gap: 14px;
834
+ flex-wrap: wrap;
835
+ padding-top: 6px;
836
+ }
837
+
838
+ .form-actions .form-hint {
839
+ font-size: 0.82rem;
840
+ color: var(--text-3);
841
+ line-height: 1.5;
842
+ }
843
+
844
+ /* ─── STATUS / RESPONSE PANELS ───────────────────────────────── */
845
+ .status-panel {
846
+ padding: 28px;
847
+ border-radius: var(--r-xl);
848
+ border: 1px solid var(--border);
849
+ background: var(--surface);
850
+ box-shadow: var(--sh-sm);
851
+ }
852
+
853
+ .status-panel h3 {
854
+ margin: 0 0 8px;
855
+ font-size: 1.2rem;
856
+ font-weight: 700;
857
+ letter-spacing: -0.03em;
858
+ color: var(--text);
859
+ }
860
+
861
+ .status-panel p {
862
+ margin: 0;
863
+ font-size: 0.9rem;
864
+ color: var(--text-2);
865
+ line-height: 1.7;
866
+ }
867
+
868
+ .status-panel--success {
869
+ background: var(--ok-bg);
870
+ border-color: var(--ok-border);
871
+ }
872
+
873
+ .status-panel--success h3 { color: var(--ok); }
874
+
875
+ .status-panel--error {
876
+ background: var(--err-bg);
877
+ border-color: var(--err-border);
878
+ }
879
+
880
+ .status-panel--error h3 { color: var(--err); }
881
+
882
+ /* ─── INLINE RESPONSE ────────────────────────────────────────── */
883
+ .asjs-inline-response {
884
+ padding: 16px;
885
+ border-radius: var(--r-md);
886
+ border: 1px solid var(--border);
887
+ background: var(--bg-2);
888
+ margin-top: 12px;
889
+ }
890
+
891
+ .asjs-inline-response strong {
892
+ display: block;
893
+ font-size: 0.9rem;
894
+ font-weight: 600;
895
+ color: var(--text);
896
+ }
897
+
898
+ .asjs-inline-response p {
899
+ margin: 6px 0 0;
900
+ font-size: 0.84rem;
901
+ color: var(--text-2);
902
+ line-height: 1.6;
903
+ }
904
+
905
+ .asjs-inline-response.is-success { background: var(--ok-bg); border-color: var(--ok-border); }
906
+ .asjs-inline-response.is-error { background: var(--err-bg); border-color: var(--err-border); }
907
+
908
+ /* ─── HERO LAYOUT ────────────────────────────────────────────── */
909
+ .hero {
910
+ display: grid;
911
+ grid-template-columns: 1.2fr 0.8fr;
912
+ gap: 16px;
913
+ align-items: stretch;
914
+ margin-top: 16px;
915
+ }
916
+
917
+ .hero-copy {
918
+ background: var(--surface);
919
+ border: 1px solid var(--border);
920
+ border-radius: var(--r-xl);
921
+ padding: 40px;
922
+ box-shadow: var(--sh-sm);
923
+ transition: background 220ms ease, border-color 220ms ease;
924
+ }
925
+
926
+ .hero-aside {
927
+ background: var(--surface);
928
+ border: 1px solid var(--border);
929
+ border-radius: var(--r-xl);
930
+ padding: 28px;
931
+ box-shadow: var(--sh-sm);
932
+ }
933
+
934
+ /* ─── SPLIT / DASHBOARD LAYOUTS ──────────────────────────────── */
935
+ .split-layout {
936
+ display: grid;
937
+ grid-template-columns: repeat(2, minmax(0, 1fr));
938
+ gap: 16px;
939
+ margin-top: 16px;
940
+ }
941
+
942
+ .dashboard-grid {
943
+ display: grid;
944
+ grid-template-columns: 1.1fr 0.9fr;
945
+ gap: 16px;
946
+ margin-top: 16px;
947
+ }
948
+
949
+ /* ─── THEME TOGGLE BUTTON ─────────────────────────────────────── */
950
+ .theme-toggle {
951
+ position: fixed;
952
+ bottom: 24px;
953
+ left: 24px;
954
+ z-index: 200;
955
+ display: flex;
956
+ align-items: center;
957
+ justify-content: center;
958
+ width: 42px;
959
+ height: 42px;
960
+ border-radius: 50%;
961
+ background: var(--surface);
962
+ border: 1.5px solid var(--border-2);
963
+ color: var(--text-2);
964
+ cursor: pointer;
965
+ box-shadow: var(--sh-md);
966
+ transition: background 140ms ease, border-color 140ms ease, transform 140ms ease, box-shadow 140ms ease;
967
+ }
968
+
969
+ .theme-toggle:hover {
970
+ background: var(--accent-soft);
971
+ border-color: var(--accent);
972
+ color: var(--accent);
973
+ transform: scale(1.08);
974
+ box-shadow: var(--sh-accent);
975
+ }
976
+
977
+ .theme-toggle:active { transform: scale(0.94); }
978
+
979
+ .toggle-icon {
980
+ display: flex;
981
+ align-items: center;
982
+ justify-content: center;
983
+ line-height: 1;
984
+ }
985
+
986
+ /* ─── NOT FOUND ───────────────────────────────────────────────── */
987
+ .not-found-panel { padding: 72px 0; }
988
+
989
+ /* ─── FOOTER ──────────────────────────────────────────────────── */
990
+ .footer {
991
+ display: flex;
992
+ justify-content: space-between;
993
+ align-items: center;
994
+ gap: 12px;
995
+ flex-wrap: wrap;
996
+ margin-top: 56px;
997
+ padding: 22px 0;
998
+ border-top: 1px solid var(--border);
999
+ font-size: 0.8rem;
1000
+ color: var(--text-3);
1001
+ line-height: 1.5;
1002
+ }
1003
+
1004
+ .footer strong { color: var(--text-2); font-weight: 600; }
1005
+
1006
+ /* ─── MISC / LEGACY HELPERS ───────────────────────────────────── */
1007
+ .render-note,
1008
+ .render-stamp {
1009
+ font-size: 0.82rem;
1010
+ color: var(--text-3);
1011
+ line-height: 1.6;
1012
+ margin-top: 10px;
1013
+ }
1014
+
1015
+ .section-header { margin-bottom: 16px; }
1016
+ .compact-section { margin-top: 10px; }
1017
+ .render-band {
1018
+ background: var(--bg-2);
1019
+ border: 1px solid var(--border);
1020
+ border-radius: var(--r-md);
1021
+ padding: 16px;
1022
+ margin-top: 12px;
1023
+ }
1024
+
1025
+ /* ─── FORM STATE ──────────────────────────────────────────────── */
1026
+ .asjs-form-submitting {
1027
+ opacity: 0.65;
1028
+ pointer-events: none;
1029
+ }
1030
+
1031
+ /* ─── ANIMATIONS ──────────────────────────────────────────────── */
1032
+ @keyframes reveal {
1033
+ from { opacity: 0; transform: translateY(6px); }
1034
+ to { opacity: 1; transform: translateY(0); }
1035
+ }
1036
+
1037
+ @keyframes shimmer {
1038
+ 0% { background-position: 200% 0; }
1039
+ 100% { background-position: -200% 0; }
1040
+ }
1041
+
1042
+ /* ─── DARK COMPONENT OVERRIDES ──────────────────────────────── */
1043
+ [data-theme="dark"] .brand-mark {
1044
+ background: linear-gradient(135deg, var(--accent) 0%, var(--sky) 100%);
1045
+ }
1046
+ [data-theme="dark"] .section-card,
1047
+ [data-theme="dark"] .hero-copy,
1048
+ [data-theme="dark"] .hero-aside {
1049
+ box-shadow: 0 0 0 1px rgba(255,255,255,0.05) inset,
1050
+ 0 4px 28px rgba(0,0,0,0.75);
1051
+ }
1052
+ [data-theme="dark"] .render-summary-grid,
1053
+ [data-theme="dark"] .card-grid,
1054
+ [data-theme="dark"] .stats-grid,
1055
+ [data-theme="dark"] .metric-grid {
1056
+ background: rgba(255,255,255,0.06);
1057
+ }
1058
+ [data-theme="dark"] .info-card,
1059
+ [data-theme="dark"] .stat-card,
1060
+ [data-theme="dark"] .metric-panel,
1061
+ [data-theme="dark"] .render-item {
1062
+ background: #161625;
1063
+ }
1064
+ [data-theme="dark"] .info-card:hover,
1065
+ [data-theme="dark"] .render-item:hover { background: #1e1e30; }
1066
+ [data-theme="dark"] .check-list li {
1067
+ background: #1e1e30;
1068
+ border-color: rgba(255,255,255,0.12);
1069
+ }
1070
+ [data-theme="dark"] .button-secondary {
1071
+ background: #1e1e30;
1072
+ border-color: rgba(255,255,255,0.16);
1073
+ }
1074
+ [data-theme="dark"] .button-secondary:hover {
1075
+ background: #26263c;
1076
+ border-color: var(--accent);
1077
+ color: var(--accent);
1078
+ }
1079
+ [data-theme="dark"] .route-loader-card { background: rgba(19,19,34,0.97); }
1080
+ [data-theme="dark"] .theme-toggle { background: #1e1e30; }
1081
+ [data-theme="dark"] .section-label,
1082
+ [data-theme="dark"] .hero-badge { background: #1a1132; }
1083
+ [data-theme="dark"] .render-band { background: #161625; }
1084
+
1085
+ /* ─── TABLET (≤ 1024px) ──────────────────────────────────────── */
1086
+ @media (max-width: 1024px) {
1087
+ .header-main { grid-template-columns: auto 1fr; }
1088
+ .header-cta { display: none; }
1089
+ .hero, .split-layout, .dashboard-grid { grid-template-columns: 1fr; }
1090
+ .card-grid, .stats-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1091
+ .render-summary-grid--wide { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1092
+ }
1093
+
1094
+ /* ─── MOBILE (≤ 640px) ───────────────────────────────────────── */
1095
+ @media (max-width: 640px) {
1096
+ .page-shell {
1097
+ width: calc(100% - 24px);
1098
+ padding-bottom: 56px;
1099
+ }
1100
+
1101
+ .header-main {
1102
+ grid-template-columns: auto 1fr;
1103
+ height: auto;
1104
+ padding: 10px 16px;
1105
+ }
1106
+
1107
+ .brand-copy small,
1108
+ .brand-copy span { display: none; }
1109
+
1110
+ .page-intro { padding: 40px 0 24px; }
1111
+ .section-card { padding: 22px 20px; }
1112
+ .view-frame { margin-top: 28px; }
1113
+
1114
+ .card-grid, .stats-grid, .metric-grid, .field-grid {
1115
+ grid-template-columns: 1fr;
1116
+ }
1117
+
1118
+ .render-summary-grid,
1119
+ .render-summary-grid--wide { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1120
+
1121
+ .hero-copy, .hero-aside { padding: 22px; }
1122
+
1123
+ .route-loader { inset: auto 8px 8px 8px; width: auto; }
1124
+
1125
+ .theme-toggle { bottom: 16px; left: 16px; width: 38px; height: 38px; }
1126
+
1127
+ .footer { flex-direction: column; align-items: flex-start; }
1128
+ }