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