Skip to main content

euv_ui/style/class/
fn.rs

1use super::*;
2
3class! {
4    // ═══════════════════════════════════════════════════════════════════════════
5    // Layout Shell
6    // ═══════════════════════════════════════════════════════════════════════════
7
8    pub c_app_root {
9        display: "flex";
10        height: "100%";
11        padding-bottom: var!(safe-area-inset-bottom);
12        font-family: "system-ui, -apple-system, sans-serif";
13        background: var!(background);
14        color: var!(foreground);
15        user-select: "none";
16        -webkit-user-select: "none";
17        -webkit-font-smoothing: "antialiased";
18        -moz-osx-font-smoothing: "grayscale";
19        text-rendering: "optimizeLegibility";
20        scrollbar-color: format!("{} {}", var!(scrollbar-thumb), var!(scrollbar-track));
21        ::-webkit-scrollbar-thumb {
22            background: var!(scrollbar-thumb);
23            border: "none";
24            border-radius: "0px";
25        }
26        ::-webkit-scrollbar-thumb:hover {
27            background: var!(scrollbar-thumb-hover);
28        }
29        ::-webkit-scrollbar-thumb:active {
30            background: var!(scrollbar-thumb-active);
31        }
32
33        // ═══════════════════════════════════════════════════════════════════════════
34        // CSS Reset — Cross-browser normalization
35        // ═══════════════════════════════════════════════════════════════════════════
36
37        *, *::before, *::after {
38            box-sizing: "border-box";
39        }
40        h1, h2, h3, h4, h5, h6, p, ul, ol, dl, dd, figure, blockquote, pre, hr {
41            margin: "0px";
42            padding: "0px";
43        }
44        ul, ol {
45            list-style: "none";
46            padding: "0px";
47            margin: "0px";
48        }
49        a {
50            color: "inherit";
51            text-decoration: "none";
52        }
53        button {
54            appearance: "none";
55            -webkit-appearance: "none";
56            -moz-appearance: "none";
57            background: "transparent";
58            border: "none";
59            padding: "0px";
60            margin: "0px";
61            font: "inherit";
62            color: "inherit";
63            cursor: "pointer";
64            outline: "none";
65            font-family: "inherit";
66            ::-moz-focus-inner {
67                border: "0px";
68                padding: "0px";
69            }
70        }
71        input, textarea, select, button {
72            font: "inherit";
73            font-family: "inherit";
74            font-size: "inherit";
75            line-height: "normal";
76            margin: "0px";
77            padding: "0px";
78            border: "none";
79            outline: "none";
80            background: "transparent";
81            color: "inherit";
82            appearance: "none";
83            -webkit-appearance: "none";
84            -moz-appearance: "none";
85        }
86        input[type="text"], input[type="number"], input[type="email"], input[type="password"], input[type="search"], input[type="tel"], input[type="url"] {
87            appearance: "none";
88            -webkit-appearance: "none";
89            -moz-appearance: "none";
90            border-radius: "0px";
91        }
92        input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration {
93            -webkit-appearance: "none";
94            appearance: "none";
95        }
96        input[type="number"] {
97            -moz-appearance: "textfield";
98        }
99        input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button {
100            -webkit-appearance: "none";
101            appearance: "none";
102            margin: "0px";
103        }
104        textarea {
105            appearance: "none";
106            -webkit-appearance: "none";
107            -moz-appearance: "none";
108            resize: "vertical";
109            font-family: "inherit";
110        }
111        select {
112            appearance: "none";
113            -webkit-appearance: "none";
114            -moz-appearance: "none";
115            background-image: "none";
116            border-radius: "0px";
117        }
118        img, svg, video, canvas, audio, iframe, embed, object {
119            display: "block";
120            max-width: "100%";
121        }
122        table {
123            border-collapse: "collapse";
124            border-spacing: "0px";
125        }
126        hr {
127            border: "none";
128            margin: "0px";
129        }
130        :focus-visible {
131            outline: "none";
132        }
133        : focus:not(: focus-visible) {
134            outline: "none";
135        }
136        h1, h2, h3, h4, h5, h6 {
137            font-weight: "inherit";
138            font-size: "inherit";
139        }
140        strong, b {
141            font-weight: "700";
142        }
143        em, i {
144            font-style: "italic";
145        }
146        code, pre, kbd, samp {
147            font-family: "ui-monospace, monospace";
148        }
149        @media ((max-width: 767px)) {
150            input, select, textarea {
151                font-size: "16px";
152            }
153        }
154    }
155
156    pub c_mobile_app_root {
157        display: "flex";
158        flex-direction: "column";
159        width: "100%";
160        height: "100%";
161        font-family: "system-ui, -apple-system, sans-serif";
162        background: var!(background);
163        color: var!(foreground);
164        padding: format!("0px {} {} {}", var!(safe-area-inset-right), var!(padding-shell-bottom), var!(safe-area-inset-left));
165        scrollbar-color: format!("{} {}", var!(scrollbar-thumb), var!(scrollbar-track));
166        ::-webkit-scrollbar-thumb {
167            background: var!(scrollbar-thumb);
168            border: "none";
169            border-radius: "0px";
170        }
171        ::-webkit-scrollbar-thumb:hover {
172            background: var!(scrollbar-thumb-hover);
173        }
174        ::-webkit-scrollbar-thumb:active {
175            background: var!(scrollbar-thumb-active);
176        }
177    }
178
179    // ═══════════════════════════════════════════════════════════════════════════
180    // Navigation - Desktop Sidebar
181    // ═══════════════════════════════════════════════════════════════════════════
182
183    pub c_app_nav {
184        // Adaptive sidebar width — `clamp()` keeps the column ≥ the historic
185        // 248px floor (no regression on dense sidebar trees) and ≤ 320px on
186        // roomy viewports, so longer English titles like "Internationalization"
187        // stop wrapping at the historic fixed 248px.
188        width: var!(nav-width);
189        background: var!(background);
190        border-left: format!("2px solid {}", var!(border));
191        display: "flex";
192        flex-direction: "column";
193        // Pin the sidebar to the viewport while the main column scrolls.
194        // Without this the whole row flex container scrolls as a single
195        // block and the nav appears to slide off-screen with the content.
196        // `align-self: stretch` (the row flex default) is overridden by
197        // `flex-start` so the sticky height is the natural 100vh and not
198        // stretched to match the (much taller) main column.
199        position: "sticky";
200        top: "0px";
201        align-self: "flex-start";
202        height: "100vh";
203        flex-shrink: "0";
204        padding-top: var!(safe-area-inset-top);
205        @media ((max-width: 767px)) {
206            display: "none";
207        }
208    }
209
210    pub c_nav_header {
211        padding: format!("{} {}", var!(space-xl), var!(space-xl));
212        width: "100%";
213        box-sizing: "border-box";
214        font-size: var!(font-xl);
215        font-weight: "700";
216        color: var!(foreground);
217        letter-spacing: "-0.02em";
218        display: "flex";
219        align-items: "center";
220        gap: format!("{}", var!(space-md));
221        flex-shrink: "0";
222        text-decoration: "none";
223        cursor: "pointer";
224        position: "relative";
225        ::after {
226            content: "''";
227            position: "absolute";
228            bottom: "0px";
229            left: var!(space-lg);
230            right: var!(space-lg);
231            height: "1px";
232            background: format!("linear-gradient(90deg, transparent, {}, transparent)", var!(border));
233        }
234    }
235
236    pub c_nav_brand_title {
237        font-size: var!(font-xl);
238        font-weight: "700";
239        color: var!(foreground);
240        letter-spacing: "-0.02em";
241    }
242
243    pub c_euv_logo {
244        display: "flex";
245        background: var!(accent);
246        align-items: "center";
247        justify-content: "center";
248        color: var!(text-on-accent);
249        font-weight: "700";
250        border: "none";
251        cursor: "pointer";
252        padding: "0px";
253        flex-shrink: "0";
254        position: "relative";
255    }
256
257    pub c_euv_logo_nav {
258        width: "32px";
259        height: "32px";
260        font-size: var!(font-lg);
261    }
262
263    pub c_euv_logo_fab {
264        width: "36px";
265        height: "36px";
266        font-size: var!(font-xl);
267        @media ((max-width: 767px)) {
268            width: "44px";
269            height: "44px";
270        }
271    }
272
273    pub c_nav_section_label {
274        padding: format!("{} {} {} {}", var!(space-md), var!(space-xl), var!(space-xs), var!(space-xl));
275        margin: "0px";
276        font-size: var!(font-xs);
277        font-weight: "700";
278        color: var!(foreground);
279        text-transform: "uppercase";
280        letter-spacing: "0.10em";
281        flex-shrink: "0";
282    }
283
284    pub c_nav_items_scroll {
285        flex: "1";
286        overflow-y: "auto";
287        contain: "content";
288        scrollbar-color: format!("{} {}", var!(scrollbar-thumb), var!(scrollbar-track));
289        ::-webkit-scrollbar-thumb {
290            background: var!(scrollbar-thumb);
291            border: "none";
292            border-radius: "0px";
293        }
294        ::-webkit-scrollbar-thumb:hover {
295            background: var!(scrollbar-thumb-hover);
296        }
297        ::-webkit-scrollbar-thumb:active {
298            background: var!(scrollbar-thumb-active);
299        }
300    }
301
302    pub c_nav_theme_toggle {
303        padding: format!("{} {}", var!(space-md), var!(space-xl));
304        flex-shrink: "0";
305        margin-top: "auto";
306        @media ((max-width: 767px)) {
307            display: "none";
308        }
309    }
310
311    // Optional row in the nav column / drawer for locale switchers or similar
312    // widgets, placed between the brand header and the section label.
313    pub c_nav_locale_row {
314        padding: format!("{} {}", var!(space-md), var!(space-xl));
315        flex-shrink: "0";
316    }
317
318    pub c_nav_theme_button {
319        width: "100%";
320        height: "36px";
321        padding: "0px";
322        cursor: "pointer";
323        outline: "none";
324        border: format!("1px dashed {}", var!(border));
325        display: "flex";
326        align-items: "center";
327        justify-content: "center";
328        :focus-visible {
329            outline: "none";
330        }
331        :active {
332            background: "transparent";
333            border-color: var!(border);
334        }
335    }
336
337    pub c_theme_icon_sun {
338        width: "20px";
339        height: "20px";
340        background-repeat: "no-repeat";
341        background-position: "center";
342        background-size: "20px 20px";
343        background-image: "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='%23ffffff' stroke='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='5'/%3E%3Cline x1='12' y1='1' x2='12' y2='4'/%3E%3Cline x1='12' y1='20' x2='12' y2='23'/%3E%3Cline x1='4.22' y1='4.22' x2='6.34' y2='6.34'/%3E%3Cline x1='17.66' y1='17.66' x2='19.78' y2='19.78'/%3E%3Cline x1='1' y1='12' x2='4' y2='12'/%3E%3Cline x1='20' y1='12' x2='23' y2='12'/%3E%3Cline x1='4.22' y1='19.78' x2='6.34' y2='17.66'/%3E%3Cline x1='17.66' y1='6.34' x2='19.78' y2='4.22'/%3E%3C/svg%3E\")";
344        transition: format!("transform {} {}", var!(duration-normal), var!(ease-out));
345    }
346
347    pub c_theme_icon_moon {
348        width: "20px";
349        height: "20px";
350        background-repeat: "no-repeat";
351        background-position: "center";
352        background-size: "20px 20px";
353        background-image: "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='%23000000' stroke='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 13A9 9 0 1 1 11 3a7 7 0 0 0 10 10z'/%3E%3C/svg%3E\")";
354        transition: format!("transform {} {}", var!(duration-normal), var!(ease-out));
355    }
356
357    pub c_nav_footer {
358        padding: format!("{} {}", var!(space-lg), var!(space-xl));
359        position: "relative";
360        font-size: var!(font-xs);
361        color: var!(muted-foreground);
362        flex-shrink: "0";
363        text-decoration: "none";
364        display: "flex";
365        align-items: "center";
366        // Center the "Built with X" attribution line inside the sidebar so
367        // it visually balances with the centered brand header above and the
368        // centered theme toggle divider. `justify-content: center` works
369        // here because the link itself is a single row of inline text —
370        // when it wraps to multiple lines on narrow sidebars the lines stay
371        // grouped because `flex-direction` is the default `row`.
372        justify-content: "center";
373        gap: var!(space-xs);
374        cursor: "pointer";
375        text-align: "center";
376        transition: format!("opacity {} {}", var!(duration-fast), var!(ease-out));
377        opacity: "1";
378        :hover {
379            opacity: "1";
380        }
381    }
382
383    pub c_nav_footer_divider {
384        position: "absolute";
385        top: "0";
386        left: var!(space-lg);
387        right: var!(space-lg);
388        height: "1px";
389        background: format!("linear-gradient(90deg, transparent, {}, transparent)", var!(border));
390    }
391
392    pub c_nav_footer_text {
393        font-weight: "400";
394        letter-spacing: "0.02em";
395    }
396
397    pub c_nav_footer_brand {
398        font-weight: "700";
399        color: var!(accent);
400    }
401
402    pub c_nav_item_active {
403        display: "flex";
404        align-items: "center";
405        gap: var!(space-sm);
406        padding: format!("{} {}", var!(space-md), var!(space-xl));
407        text-decoration: "none";
408        font-size: var!(font-base);
409        color: var!(text-on-accent);
410        font-weight: "600";
411        background: var!(accent);
412    }
413
414    pub c_nav_item_inactive {
415        display: "flex";
416        align-items: "center";
417        gap: var!(space-sm);
418        padding: format!("{} {}", var!(space-md), var!(space-xl));
419        text-decoration: "none";
420        font-size: var!(font-base);
421        color: var!(foreground);
422        font-weight: "400";
423        :hover {
424            background: var!(accent-muted);
425            color: var!(accent);
426            box-shadow: format!("inset 4px 0 0 0 {}", var!(foreground));
427        }
428    }
429
430    pub c_nav_item_icon {
431        flex-shrink: "0";
432        width: "20px";
433        text-align: "center";
434    }
435
436    pub c_nav_item_label {
437        flex: "1";
438        overflow: "hidden";
439        text-overflow: "ellipsis";
440        white-space: "nowrap";
441        color: "inherit";
442    }
443
444    // ═══════════════════════════════════════════════════════════════════════════
445    // Main Content Area
446    // ═══════════════════════════════════════════════════════════════════════════
447
448    pub c_app_main {
449        flex: "1";
450        height: "100%";
451        overflow: "auto";
452        padding: format!("{} {} {} {}", var!(padding-main-top), var!(padding-main-horizontal), var!(padding-main-bottom), var!(padding-main-horizontal));
453        scrollbar-color: format!("{} {}", var!(scrollbar-thumb), var!(scrollbar-track));
454        ::-webkit-scrollbar {
455            width: "6px";
456        }
457        ::-webkit-scrollbar-thumb {
458            background: var!(scrollbar-thumb);
459            border: "none";
460            border-radius: "0px";
461        }
462        ::-webkit-scrollbar-thumb:hover {
463            background: var!(scrollbar-thumb-hover);
464        }
465        ::-webkit-scrollbar-thumb:active {
466            background: var!(scrollbar-thumb-active);
467        }
468        @media ((max-width: 767px)) {
469            padding: format!("{} {} {} {}", var!(padding-main-top-mobile), var!(padding-main-horizontal-mobile), var!(padding-main-bottom), var!(padding-main-horizontal-mobile));
470            scrollbar-width: "none";
471            ::-webkit-scrollbar {
472                width: "0px";
473            }
474        }
475    }
476
477    pub c_page_router {
478        flex: "1";
479        display: "flex";
480        flex-direction: "column";
481    }
482
483    pub c_page_container {
484        width: "100%";
485        margin: "0px auto";
486        max-width: var!(content-max-width);
487    }
488
489    // ═══════════════════════════════════════════════════════════════════════════
490    // Page Banner (unified header with emoji icon)
491    // ═══════════════════════════════════════════════════════════════════════════
492
493    pub c_page {
494        position: "relative";
495        text-align: "center";
496        box-sizing: "border-box";
497    }
498
499    pub c_page_glow {
500        position: "absolute";
501        top: "-50%";
502        left: "50%";
503        transform: "translateX(-50%)";
504        width: "400px";
505        max-width: "100%";
506        height: "400px";
507        pointer-events: "none";
508    }
509
510    pub c_page_content {
511        position: "relative";
512        z-index: "1";
513    }
514
515    pub c_page_icon {
516        font-size: "36px";
517        padding-bottom: var!(space-md);
518        @media ((max-width: 767px)) {
519            font-size: "40px";
520        }
521    }
522
523    pub c_page_title {
524        font-size: var!(font-4xl);
525        font-weight: "800";
526        letter-spacing: "-0.03em";
527        margin: "0px";
528        color: var!(foreground);
529        margin-bottom: var!(space-sm);
530        @media ((max-width: 767px)) {
531            font-size: var!(font-3xl);
532        }
533    }
534
535    pub c_page_subtitle {
536        font-size: var!(font-lg);
537        color: var!(muted-foreground);
538        margin: "0px auto";
539        margin-bottom: var!(space-sm);
540        max-width: "560px";
541        opacity: "1";
542        @media ((max-width: 767px)) {
543            font-size: var!(font-base);
544        }
545    }
546
547    // ═══════════════════════════════════════════════════════════════════════════
548    // Card Component
549    // ═══════════════════════════════════════════════════════════════════════════
550
551    pub c_card {
552        color: var!(foreground);
553        box-sizing: "border-box";
554    }
555
556    pub c_card_title {
557        margin: format!("{} 0px", var!(gap-component));
558        color: var!(foreground);
559        font-size: var!(font-lg);
560        font-weight: "600";
561        padding-bottom: var!(gap-component);
562        border-bottom: format!("1px dashed {}", var!(border));
563        letter-spacing: "-0.01em";
564        @media ((max-width: 767px)) {
565            font-size: var!(font-md);
566        }
567    }
568
569    // ═══════════════════════════════════════════════════════════════════════════
570    // Buttons
571    // ═══════════════════════════════════════════════════════════════════════════
572
573    pub c_primary_button {
574        display: "flex";
575        justify-content: "center";
576        align-items: "center";
577        gap: var!(space-sm);
578        width: "100%";
579        height: "42px";
580        background: var!(accent);
581        color: var!(text-on-accent);
582        border: "1px solid transparent";
583        padding: format!("0px {}", var!(space-2xl));
584        cursor: "pointer";
585        font-size: var!(font-base);
586        font-weight: "500";
587        letter-spacing: "0.02em";
588        text-align: "center";
589        outline: "none";
590        box-sizing: "border-box";
591        white-space: "nowrap";
592        overflow: "hidden";
593        text-overflow: "ellipsis";
594        user-select: "none";
595        -webkit-user-select: "none";
596        :focus-visible {
597            outline: "none";
598        }
599        :disabled {
600            background: var!(muted-foreground);
601            cursor: "not-allowed";
602            opacity: "1";
603        }
604        :hover {
605            background: var!(accent);
606        }
607        :active {
608            background: var!(accent);
609            color: var!(text-on-accent);
610            border-color: "transparent";
611        }
612        @media ((max-width: 767px)) {
613            max-width: "100%";
614            padding: format!("{} {}", var!(space-lg), var!(space-xl));
615            font-size: var!(font-md);
616        }
617    }
618
619    pub c_modal_close_button {
620        display: "flex";
621        justify-content: "center";
622        align-items: "center";
623        color: "inherit";
624        border: "none";
625        padding: format!("{} {}", var!(space-sm), var!(space-md));
626        cursor: "pointer";
627        font-size: "20px";
628        font-weight: "400";
629        vertical-align: "middle";
630        outline: "none";
631        opacity: "1";
632        flex-shrink: "0";
633        transition: format!("opacity {} {}", var!(duration-fast), var!(ease-out));
634        :hover {
635            opacity: "1";
636        }
637        :active {
638            opacity: "1";
639        }
640        :focus {
641            outline: "none";
642        }
643    }
644
645    // ═══════════════════════════════════════════════════════════════════════════
646    // Button Controls Container
647    // ═══════════════════════════════════════════════════════════════════════════
648
649    pub c_button_controls {
650        display: "flex";
651        flex-wrap: "wrap";
652        gap: var!(gap-element);
653        margin-top: var!(gap-component);
654        margin-bottom: var!(gap-component);
655    }
656
657    // ═══════════════════════════════════════════════════════════════════════════
658    // Euv Button Variants
659    // ═══════════════════════════════════════════════════════════════════════════
660
661    pub c_euv_button_primary_md {
662        display: "flex";
663        justify-content: "center";
664        align-items: "center";
665        gap: var!(space-sm);
666        flex: "1 1 120px";
667        height: "42px";
668        padding: format!("0px {}", var!(space-xl));
669        background: var!(accent);
670        color: var!(text-on-accent);
671        cursor: "pointer";
672        font-size: var!(font-base);
673        font-weight: "500";
674        outline: "none";
675        white-space: "nowrap";
676        user-select: "none";
677        -webkit-user-select: "none";
678        box-sizing: "border-box";
679        :disabled {
680            background: var!(muted-foreground);
681            cursor: "not-allowed";
682            opacity: "1";
683        }
684    }
685
686    pub c_euv_button_outline_md {
687        display: "flex";
688        justify-content: "center";
689        align-items: "center";
690        gap: var!(space-sm);
691        flex: "1 1 120px";
692        height: "42px";
693        padding: format!("0px {}", var!(space-xl));
694        color: var!(foreground);
695        border: format!("1px solid {}", var!(border));
696        cursor: "pointer";
697        font-size: var!(font-base);
698        font-weight: "500";
699        outline: "none";
700        white-space: "nowrap";
701        user-select: "none";
702        -webkit-user-select: "none";
703        box-sizing: "border-box";
704        :focus-visible {
705            outline: "none";
706        }
707        :disabled {
708            background: var!(muted-foreground);
709            cursor: "not-allowed";
710            opacity: "1";
711        }
712    }
713
714    // ═══════════════════════════════════════════════════════════════════════════
715    // Badges
716    // ═══════════════════════════════════════════════════════════════════════════
717
718    pub c_badge {
719        display: "inline-flex";
720        justify-content: "center";
721        align-items: "center";
722        color: var!(text-on-accent);
723        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
724        border: format!("1px solid {}", var!(accent));
725        font-size: var!(font-xs);
726        font-weight: "600";
727        cursor: "pointer";
728        text-align: "center";
729        background: var!(accent);
730        :focus-visible {
731            outline: "none";
732        }
733        @media ((max-width: 767px)) {
734            padding: format!("{} {}", var!(space-2xs), var!(space-xs));
735            font-size: var!(font-xs);
736        }
737    }
738
739    pub c_badge_outline {
740        display: "inline-flex";
741        justify-content: "center";
742        align-items: "center";
743        color: var!(foreground);
744        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
745        font-size: var!(font-xs);
746        font-weight: "600";
747        cursor: "pointer";
748        text-align: "center";
749        border: format!("1.5px solid {}", var!(border));
750        @media ((max-width: 767px)) {
751            padding: format!("{} {}", var!(space-2xs), var!(space-xs));
752            font-size: var!(font-xs);
753        }
754    }
755
756    pub c_euv_tag_solid_black {
757        display: "inline-block";
758        vertical-align: "middle";
759        text-align: "center";
760        line-height: "1";
761        color: var!(text-on-accent);
762        padding: format!("{} {}", var!(space-xs), var!(space-md));
763        font-size: var!(font-sm);
764        font-weight: "600";
765        cursor: "pointer";
766        background: var!(accent);
767        border: format!("1px solid {}", var!(accent));
768        box-sizing: "border-box";
769    }
770
771    pub c_euv_tag_solid_white {
772        display: "inline-block";
773        vertical-align: "middle";
774        text-align: "center";
775        line-height: "1";
776        color: var!(foreground);
777        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
778        font-size: var!(font-xs);
779        font-weight: "600";
780        cursor: "pointer";
781        border: format!("1.5px solid {}", var!(accent));
782        box-sizing: "border-box";
783    }
784
785    // ═══════════════════════════════════════════════════════════════════════════
786    // Euv Tag Variants (semantic colour tags)
787    // ═══════════════════════════════════════════════════════════════════════════
788
789    pub c_euv_tag_outline_black {
790        display: "inline-block";
791        vertical-align: "middle";
792        text-align: "center";
793        line-height: "1";
794        color: var!(accent);
795        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
796        font-size: var!(font-xs);
797        font-weight: "600";
798        cursor: "pointer";
799        border: format!("1.5px solid {}", var!(accent));
800        box-sizing: "border-box";
801    }
802
803    pub c_euv_tag_outline_white {
804        display: "inline-block";
805        vertical-align: "middle";
806        text-align: "center";
807        line-height: "1";
808        color: var!(foreground);
809        padding: format!("{} {}", var!(space-xs), var!(space-md));
810        font-size: var!(font-sm);
811        font-weight: "600";
812        cursor: "pointer";
813        border: format!("1.5px solid {}", var!(border));
814        box-sizing: "border-box";
815    }
816
817    // ═══════════════════════════════════════════════════════════════════════════
818    // Form Elements
819    // ═══════════════════════════════════════════════════════════════════════════
820
821    pub c_euv_input_wrapper {
822        width: "100%";
823        margin: format!("{} 0px", var!(gap-element));
824    }
825
826    pub c_form_label {
827        display: "block";
828        margin-bottom: var!(space-sm);
829        color: "inherit";
830        font-weight: "500";
831        font-size: var!(font-base);
832    }
833
834    pub c_inline_input_row {
835        display: "flex";
836        align-items: "center";
837        gap: var!(gap-component);
838    }
839
840    pub c_euv_input {
841        width: "100%";
842        min-height: var!(min-height-base);
843        padding: format!("0px {}", var!(space-lg));
844        border: format!("1px solid {}", var!(border));
845        font-size: var!(font-base);
846        line-height: "normal";
847        box-sizing: "border-box";
848        outline: "none";
849        color: var!(foreground);
850        appearance: "none";
851        -webkit-appearance: "none";
852        -moz-appearance: "none";
853        vertical-align: "middle";
854        :hover {
855            border-color: var!(accent);
856            background: var!(accent-muted);
857        }
858        :focus {
859            outline: "none";
860            border-color: var!(accent);
861            background: var!(accent-muted);
862        }
863    }
864
865    pub c_euv_input_no_transition {
866        width: "100%";
867        min-height: var!(min-height-base);
868        padding: format!("0px {}", var!(space-lg));
869        border: format!("1px solid {}", var!(border));
870        font-size: var!(font-base);
871        line-height: "normal";
872        box-sizing: "border-box";
873        outline: "none";
874        color: var!(foreground);
875        appearance: "none";
876        -webkit-appearance: "none";
877        -moz-appearance: "none";
878        vertical-align: "middle";
879    }
880
881    pub c_euv_input_error {
882        width: "100%";
883        min-height: var!(min-height-base);
884        padding: format!("0px {}", var!(space-lg));
885        border: format!("1px solid {}", var!(foreground));
886        font-size: var!(font-base);
887        line-height: "normal";
888        box-sizing: "border-box";
889        outline: "none";
890        color: var!(foreground);
891        appearance: "none";
892        -webkit-appearance: "none";
893        -moz-appearance: "none";
894        vertical-align: "middle";
895        :focus {
896            outline: "none";
897            border-color: var!(foreground);
898        }
899    }
900
901    pub c_form_checkbox {
902        cursor: "pointer";
903        width: var!(space-lg);
904        height: var!(space-lg);
905    }
906
907    pub c_form_checkbox_label {
908        font-size: var!(font-base);
909        color: "inherit";
910        cursor: "pointer";
911    }
912
913    pub c_form_checkbox_row {
914        margin: format!("{} 0px", var!(gap-component));
915        display: "flex";
916        align-items: "center";
917        gap: var!(gap-element);
918    }
919
920    pub c_select_input {
921        width: "100%";
922        min-height: var!(min-height-base);
923        padding: format!("0px {}", var!(space-lg));
924        border: format!("1px solid {}", var!(border));
925        font-size: var!(font-base);
926        line-height: "normal";
927        box-sizing: "border-box";
928        outline: "none";
929        cursor: "pointer";
930        appearance: "none";
931        -webkit-appearance: "none";
932        -moz-appearance: "none";
933        color: var!(foreground);
934        vertical-align: "middle";
935        background-image: "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='currentColor' d='M6 8L1 3h10z'/%3E%3C/svg%3E\")";
936        background-repeat: "no-repeat";
937        background-position: "right 14px center";
938        :focus {
939            outline: "none";
940            border-color: var!(accent);
941            background: var!(accent-muted);
942        }
943    }
944
945    pub c_textarea_input {
946        width: "100%";
947        max-width: "100%";
948        padding: format!("{} {}", var!(space-md), var!(space-lg));
949        border: format!("1px solid {}", var!(border));
950        font-size: var!(font-base);
951        line-height: "normal";
952        box-sizing: "border-box";
953        outline: "none";
954        resize: "vertical";
955        overflow-x: "hidden";
956        word-wrap: "break-word";
957        font-family: "inherit";
958        color: var!(foreground);
959        appearance: "none";
960        -webkit-appearance: "none";
961        -moz-appearance: "none";
962        :hover {
963            border-color: var!(accent);
964            background: var!(accent-muted);
965        }
966        :focus {
967            outline: "none";
968            border-color: var!(accent);
969            background: var!(accent-muted);
970        }
971    }
972
973    pub c_textarea_input_error {
974        width: "100%";
975        max-width: "100%";
976        padding: format!("{} {}", var!(space-md), var!(space-lg));
977        border: format!("1px solid {}", var!(foreground));
978        font-size: var!(font-base);
979        line-height: "normal";
980        box-sizing: "border-box";
981        outline: "none";
982        resize: "vertical";
983        overflow-x: "hidden";
984        word-wrap: "break-word";
985        font-family: "inherit";
986        color: var!(foreground);
987        appearance: "none";
988        -webkit-appearance: "none";
989        -moz-appearance: "none";
990        :focus {
991            outline: "none";
992            border-color: var!(foreground);
993        }
994    }
995
996    pub c_textarea_counter {
997        text-align: "right";
998        margin-top: var!(space-xs);
999        margin-bottom: var!(gap-component);
1000    }
1001
1002    pub c_textarea_counter_text {
1003        font-size: var!(font-sm);
1004        color: "inherit";
1005        opacity: "1";
1006    }
1007
1008    pub c_field_error_text {
1009        color: var!(foreground);
1010        font-size: var!(font-base);
1011        margin-top: var!(space-xs);
1012        margin-bottom: var!(space-sm);
1013    }
1014
1015    // ═══════════════════════════════════════════════════════════════════════════
1016    // Status Boxes
1017    // ═══════════════════════════════════════════════════════════════════════════
1018
1019    pub c_error_box {
1020        margin: format!("{} 0px", var!(gap-component));
1021        background: var!(accent-muted);
1022        color: var!(foreground);
1023        font-size: var!(font-base);
1024        box-sizing: "border-box";
1025    }
1026
1027    pub c_success_box {
1028        margin: format!("{} 0px", var!(gap-component));
1029        background: var!(accent-muted);
1030        color: var!(foreground);
1031        font-size: var!(font-base);
1032        box-sizing: "border-box";
1033    }
1034
1035    // ═══════════════════════════════════════════════════════════════════════════
1036    // Counter / Signals Demo
1037    // ═══════════════════════════════════════════════════════════════════════════
1038
1039    pub c_counter_row {
1040        display: "grid";
1041        grid-template-columns: "1fr 1fr";
1042        align-items: "center";
1043        gap: var!(gap-component);
1044        @media ((max-width: 767px)) {
1045            grid-template-columns: "1fr";
1046        }
1047    }
1048
1049    pub c_counter_text {
1050        font-size: var!(font-base);
1051        color: "inherit";
1052        margin-bottom: var!(gap-component);
1053    }
1054
1055    pub c_counter_value {
1056        font-weight: "700";
1057        color: var!(accent);
1058        font-size: var!(font-base);
1059    }
1060
1061    pub c_counter_value_row {
1062        margin-top: var!(space-sm);
1063        word-break: "break-all";
1064        overflow-wrap: "anywhere";
1065        font-size: var!(font-base);
1066        color: "inherit";
1067        font-weight: "400";
1068    }
1069
1070    pub c_badge_row {
1071        display: "flex";
1072        gap: var!(gap-inline);
1073        flex-wrap: "wrap";
1074        align-items: "center";
1075    }
1076
1077    pub c_badge_hint {
1078        margin-bottom: var!(gap-component);
1079        color: "inherit";
1080        opacity: "1";
1081        font-size: var!(font-base);
1082    }
1083
1084    // ═══════════════════════════════════════════════════════════════════════════
1085    // Home Page
1086    // ═══════════════════════════════════════════════════════════════════════════
1087
1088    pub c_text_ellipsis {
1089        overflow: "hidden";
1090        text-overflow: "ellipsis";
1091        white-space: "nowrap";
1092    }
1093
1094    pub c_info_row {
1095        display: "flex";
1096        align-items: "center";
1097        gap: var!(space-md);
1098        padding: format!("{} 0", var!(space-sm));
1099        overflow: "hidden";
1100    }
1101
1102    pub c_info_label {
1103        font-size: var!(font-sm);
1104        font-weight: "500";
1105        color: var!(muted-foreground);
1106        min-width: "72px";
1107        flex-shrink: "0";
1108        letter-spacing: "0.02em";
1109    }
1110
1111    pub c_info_value {
1112        c_text_ellipsis();
1113        font-size: var!(font-base);
1114        font-weight: "600";
1115        color: var!(foreground);
1116        font-family: "ui-monospace, monospace";
1117        flex: "1";
1118    }
1119
1120    pub c_info_link {
1121        c_text_ellipsis();
1122        font-size: var!(font-base);
1123        font-weight: "600";
1124        color: var!(accent);
1125        font-family: "ui-monospace, monospace";
1126        flex: "1";
1127        text-decoration: "none";
1128        transition: format!("opacity {} {}", var!(duration-fast), var!(ease-out));
1129        :hover {
1130            opacity: "1";
1131        }
1132    }
1133
1134    // ═══════════════════════════════════════════════════════════════════════════
1135    // Camera Page
1136    // ═══════════════════════════════════════════════════════════════════════════
1137
1138    pub c_camera_video_container {
1139        margin: format!("{} 0", var!(space-lg));
1140    }
1141
1142    pub c_camera_video_active {
1143        width: "100%";
1144        background: "#000";
1145        aspect-ratio: "16 / 9";
1146        object-fit: "cover";
1147        border: format!("2px solid {}", var!(accent));
1148        box-sizing: "border-box";
1149    }
1150
1151    pub c_camera_video_hidden {
1152        width: "100%";
1153        aspect-ratio: "16 / 9";
1154        display: "none";
1155    }
1156
1157    pub c_camera_video_placeholder {
1158        width: "100%";
1159        aspect-ratio: "16 / 9";
1160        border: format!("2px dashed {}", var!(border));
1161        display: "flex";
1162        align-items: "center";
1163        justify-content: "center";
1164        box-sizing: "border-box";
1165    }
1166
1167    pub c_camera_placeholder_content {
1168        display: "flex";
1169        flex-direction: "column";
1170        align-items: "center";
1171        gap: var!(space-md);
1172    }
1173
1174    pub c_camera_placeholder_icon {
1175        font-size: var!(font-4xl);
1176        opacity: "1";
1177    }
1178
1179    pub c_camera_placeholder_text {
1180        font-size: var!(font-base);
1181        color: "inherit";
1182        opacity: "1";
1183    }
1184
1185    pub c_camera_error_box {
1186        margin: format!("{} 0px", var!(gap-component));
1187        color: var!(foreground);
1188        font-size: var!(font-base);
1189        word-break: "break-all";
1190        overflow-wrap: "break-word";
1191        box-sizing: "border-box";
1192    }
1193
1194    pub c_camera_scan_result_box {
1195        margin-top: var!(gap-component);
1196        box-sizing: "border-box";
1197    }
1198
1199    pub c_camera_scan_result_label {
1200        font-size: var!(font-sm);
1201        font-weight: "600";
1202        color: var!(foreground);
1203        margin-bottom: var!(space-xs);
1204    }
1205
1206    pub c_camera_scan_result_value {
1207        font-size: var!(font-base);
1208        color: "inherit";
1209        word-break: "break-all";
1210        overflow-wrap: "break-word";
1211    }
1212
1213    // ═══════════════════════════════════════════════════════════════════════════
1214    // Canvas Drawing Board
1215    // ═══════════════════════════════════════════════════════════════════════════
1216
1217    pub c_canvas_preview_container {
1218        margin: format!("{} 0", var!(space-lg));
1219        overflow: "hidden";
1220        border: format!("2px solid {}", var!(border));
1221        background: "#ffffff";
1222        aspect-ratio: "9 / 16";
1223        display: "flex";
1224        align-items: "center";
1225        justify-content: "center";
1226        box-sizing: "border-box";
1227    }
1228
1229    pub c_canvas_placeholder {
1230        color: var!(muted-foreground);
1231        font-size: var!(font-sm);
1232        text-align: "center";
1233        padding: var!(space-lg);
1234    }
1235
1236    pub c_canvas_preview_image {
1237        width: "100%";
1238        height: "100%";
1239        object-fit: "cover";
1240        display: "block";
1241    }
1242
1243    pub c_canvas_container_fullscreen {
1244        width: "100%";
1245        height: "100%";
1246        background: var!(background);
1247        display: "flex";
1248        flex-direction: "column";
1249        position: "fixed";
1250        top: "0";
1251        left: "0";
1252        z-index: "10002";
1253        padding: format!("{} {} {} {}", var!(padding-shell-top), var!(space-lg), var!(padding-shell-bottom), var!(space-lg));
1254        box-sizing: "border-box";
1255    }
1256
1257    pub c_canvas_drawing_fullscreen_wrapper {
1258        flex: "1";
1259        display: "flex";
1260        align-items: "center";
1261        justify-content: "center";
1262        overflow: "hidden";
1263        padding: var!(space-xs);
1264    }
1265
1266    pub c_canvas_drawing_fullscreen {
1267        border: format!("2px solid {}", var!(border));
1268        display: "block";
1269        cursor: "crosshair";
1270        touch-action: "none";
1271    }
1272
1273    pub c_canvas_fullscreen_toolbar {
1274        display: "flex";
1275        flex-direction: "column";
1276        align-items: "stretch";
1277        width: "100%";
1278        padding: format!("{} {}", var!(space-xs), "0px");
1279        flex-shrink: "0";
1280        gap: var!(space-xs);
1281    }
1282
1283    pub c_canvas_fullscreen_toolbar_row_top {
1284        display: "flex";
1285        align-items: "center";
1286        height: var!(mobile-header-height);
1287        width: "100%";
1288        gap: var!(space-sm);
1289    }
1290
1291    pub c_canvas_fullscreen_toolbar_color_wrapper {
1292        display: "flex";
1293        align-items: "center";
1294        justify-content: "center";
1295        flex: "1";
1296        min-width: "0";
1297    }
1298
1299    pub c_canvas_color_input_fullscreen {
1300        width: "100%";
1301        height: "42px";
1302        border: format!("1px solid {}", var!(border));
1303        cursor: "pointer";
1304        padding: format!("{}", var!(space-xs));
1305    }
1306
1307    pub c_canvas_fullscreen_toolbar_row_bottom {
1308        display: "flex";
1309        align-items: "center";
1310        width: "100%";
1311    }
1312
1313    pub c_canvas_fullscreen_range_input {
1314        flex: "1 1 0%";
1315        min-width: "120px";
1316        cursor: "pointer";
1317        -webkit-appearance: "none";
1318        appearance: "none";
1319        border: "none";
1320        outline: "none";
1321        height: "24px";
1322        ::-webkit-slider-runnable-track {
1323            height: "6px";
1324            background: format!("linear-gradient(to right, {} 0%, {} var(--value,50%), {} var(--value,50%), {} 100%)", var!(foreground), var!(foreground), var!(border), var!(border));
1325            border-radius: "3px";
1326            border: "none";
1327        }
1328        ::-webkit-slider-thumb {
1329            width: "20px";
1330            height: "20px";
1331            background: var!(background);
1332            border: format!("2px solid {}", var!(accent));
1333            border-radius: "50%";
1334            cursor: "pointer";
1335            -webkit-appearance: "none";
1336            margin-top: "-7px";
1337        }
1338        ::-moz-range-track {
1339            height: "6px";
1340            background: format!("linear-gradient(to right, {} 0%, {} var(--value,50%), {} var(--value,50%), {} 100%)", var!(foreground), var!(foreground), var!(border), var!(border));
1341            border-radius: "3px";
1342            border: "none";
1343        }
1344        ::-moz-range-thumb {
1345            width: "20px";
1346            height: "20px";
1347            background: var!(background);
1348            border: format!("2px solid {}", var!(accent));
1349            border-radius: "50%";
1350            cursor: "pointer";
1351        }
1352    }
1353
1354    pub c_canvas_fullscreen_toolbar_button {
1355        flex: "0 0 auto";
1356        overflow: "hidden";
1357    }
1358
1359    // ═══════════════════════════════════════════════════════════════════════════
1360    // Game Fullscreen (2D / 3D)
1361    // ═══════════════════════════════════════════════════════════════════════════
1362
1363    // Fullscreen overlay container for the 2D and 3D game pages.
1364    //
1365    // Mirrors `c_canvas_container_fullscreen` so the safe-area caching
1366    // pass in `UseEuvLayout::apply_cached_insets` can pick this selector
1367    // up alongside the canvas one. Differs in that the game overlay holds
1368    // the *same* `<canvas>` element that the inline page mounts (no
1369    // canvas re-creation), so the running game loop, balls, cubes, FPS
1370    // counter and other reactive state survive the fullscreen toggle
1371    // without reset.
1372    pub c_game_container_fullscreen {
1373        width: "100%";
1374        height: "100%";
1375        background: var!(background);
1376        display: "flex";
1377        flex-direction: "column";
1378        position: "fixed";
1379        top: "0";
1380        left: "0";
1381        z-index: "10002";
1382        padding: format!(
1383        "{} {} {} {}",
1384        var!(padding-shell-top),
1385        var!(space-lg),
1386        var!(padding-shell-bottom),
1387        var!(space-lg)
1388        );
1389        box-sizing: "border-box";
1390    }
1391
1392    // Toolbar wrapping the fullscreen exit button on game pages.
1393    //
1394    // Game pages only need an `Exit` button here (no color picker / line
1395    // width control like the canvas drawing board), so the layout is a
1396    // single horizontal row at the bottom of the overlay.
1397    pub c_game_fullscreen_toolbar {
1398        display: "flex";
1399        align-items: "center";
1400        justify-content: "flex-end";
1401        width: "100%";
1402        padding: format!("{} {} {} {}", var!(space-xs), var!(space-lg), var!(space-xs), var!(space-lg));
1403        flex-shrink: "0";
1404        gap: var!(space-sm);
1405        box-sizing: "border-box";
1406    }
1407
1408    // Wrapper that fills the fullscreen game container with the canvas.
1409    //
1410    // The game's `<canvas>` backing buffer is 600x400 (3:2). The canvas
1411    // itself has `width: 100%; height: 100%` so it fills this wrapper
1412    // exactly, and `object-fit: contain` on the canvas class makes the
1413    // browser uniformly scale the backing buffer to fit while preserving
1414    // its 3:2 aspect ratio. Without `object-fit: contain`, the canvas
1415    // would be stretched to whatever shape the wrapper has, making balls
1416    // render as horizontally-ovoid ellipses (e.g. on 1280x800 viewports
1417    // → 1.6:1, slightly squashed vertically). The letterbox bars appear
1418    // inside the canvas element rather than around an outer wrapper, so
1419    // the canvas always fills the fullscreen container with the backing
1420    // buffer uniformly scaled to its native aspect ratio.
1421    pub c_game_fullscreen_canvas_letterbox {
1422        position: "relative";
1423        width: "100%";
1424        max-width: "100%";
1425        max-height: "100%";
1426        height: "100%";
1427        display: "flex";
1428        align-items: "center";
1429        justify-content: "center";
1430    }
1431
1432    // ═══════════════════════════════════════════════════════════════════════════
1433    // Custom Attrs Demo
1434    // ═══════════════════════════════════════════════════════════════════════════
1435
1436    pub c_custom_attrs_demo {
1437        // Use the theme foreground token (not `inherit`) so the text inside
1438        // the dynamic demo block stays readable when the block itself
1439        // applies a user-supplied background (e.g. `background-color: #000000`)
1440        // that otherwise paints the inherited text the same colour.
1441        color: var!(foreground);
1442        box-sizing: "border-box";
1443    }
1444
1445    pub c_demo_text {
1446        color: var!(foreground);
1447        margin-bottom: var!(gap-component);
1448    }
1449
1450    pub c_demo_text_muted {
1451        color: var!(foreground);
1452        opacity: "1";
1453        font-size: var!(font-base);
1454        margin-bottom: "0px";
1455    }
1456
1457    // ═══════════════════════════════════════════════════════════════════════════
1458    // Async / Loading States
1459    // ═══════════════════════════════════════════════════════════════════════════
1460
1461    pub c_loading_container {
1462        display: "flex";
1463        align-items: "center";
1464        justify-content: "center";
1465        gap: var!(gap-component);
1466        margin: format!("{} 0px", var!(gap-component));
1467        box-sizing: "border-box";
1468    }
1469
1470    pub c_spinner {
1471        width: "28px";
1472        height: "28px";
1473        border: format!("3px solid {}", var!(accent-muted));
1474        border-top: format!("3px solid {}", var!(accent));
1475        border-radius: "50%";
1476        flex-shrink: "0";
1477        animation: "euv-spin 0.8s linear infinite";
1478    }
1479
1480    pub c_loading_text_col {
1481        display: "flex";
1482        flex-direction: "column";
1483        gap: var!(space-xs);
1484    }
1485
1486    pub c_loading_title {
1487        color: var!(foreground);
1488        font-size: var!(font-md);
1489        font-weight: "500";
1490    }
1491
1492    pub c_loading_subtitle {
1493        color: var!(muted-foreground);
1494        font-size: var!(font-base);
1495    }
1496
1497    pub c_loading_overlay(background: &str) {
1498        position: "absolute";
1499        top: "0";
1500        left: "0";
1501        width: "100%";
1502        height: "100%";
1503        display: "flex";
1504        flex-direction: "column";
1505        align-items: "center";
1506        justify-content: "center";
1507        gap: var!(gap-component);
1508        background: background;
1509        z-index: "1";
1510        box-sizing: "border-box";
1511    }
1512
1513    pub c_error_container {
1514        display: "flex";
1515        align-items: "center";
1516        gap: var!(gap-element);
1517        margin-top: var!(gap-component);
1518        box-sizing: "border-box";
1519    }
1520
1521    pub c_error_icon {
1522        width: "20px";
1523        height: "20px";
1524        display: "flex";
1525        align-items: "center";
1526        justify-content: "center";
1527        flex-shrink: "0";
1528        color: var!(foreground);
1529        font-size: var!(font-sm);
1530        font-weight: "700";
1531    }
1532
1533    pub c_error_text {
1534        color: var!(foreground);
1535        font-size: var!(font-base);
1536    }
1537
1538    pub c_data_box {
1539        margin: format!("{} 0px", var!(gap-component));
1540        box-sizing: "border-box";
1541    }
1542
1543    pub c_data_pre {
1544        color: var!(foreground);
1545        font-size: var!(font-base);
1546        margin: "0px";
1547        white-space: "pre-wrap";
1548        word-break: "break-all";
1549        font-family: "ui-monospace, monospace";
1550    }
1551
1552    pub c_fetch_hint {
1553        color: "inherit";
1554        opacity: "1";
1555        font-size: var!(font-base);
1556        margin-bottom: var!(gap-component);
1557    }
1558
1559    // ═══════════════════════════════════════════════════════════════════════════
1560    // Conditional Rendering Demo
1561    // ═══════════════════════════════════════════════════════════════════════════
1562
1563    pub c_toggle_content {
1564        margin-top: var!(gap-component);
1565        color: "inherit";
1566    }
1567
1568    pub c_toggle_title {
1569        margin-top: "0px";
1570        color: var!(accent);
1571        font-size: var!(font-md);
1572    }
1573
1574    pub c_role_button_row {
1575        display: "flex";
1576        flex-wrap: "nowrap";
1577        gap: var!(gap-element);
1578        margin-bottom: var!(gap-component);
1579    }
1580
1581    pub c_role_guest_text {
1582        color: var!(foreground);
1583        font-size: var!(font-base);
1584    }
1585
1586    pub c_role_user_text {
1587        color: var!(foreground);
1588        font-size: var!(font-base);
1589    }
1590
1591    pub c_role_admin_text {
1592        color: var!(foreground);
1593        font-size: var!(font-base);
1594    }
1595
1596    // ═══════════════════════════════════════════════════════════════════════════
1597    // Tabs
1598    // ═══════════════════════════════════════════════════════════════════════════
1599
1600    pub c_tab_bar {
1601        display: "flex";
1602        border-bottom: format!("1px dashed {}", var!(border));
1603        margin-bottom: var!(gap-component);
1604        gap: var!(gap-element);
1605        @media ((max-width: 767px)) {
1606            flex-wrap: "wrap";
1607        }
1608    }
1609
1610    pub c_tab_item_active {
1611        padding: format!("{} {}", var!(space-md), var!(space-xl));
1612        cursor: "pointer";
1613        border-bottom: format!("2px solid {}", var!(accent));
1614        color: var!(text-on-accent);
1615        background: var!(accent);
1616        font-size: var!(font-base);
1617        font-weight: "500";
1618        // iOS WebKit: tap on a non-button element inside a scrollable
1619        // container can be silently dropped because iOS interprets the
1620        // touch as the start of a scroll gesture and never dispatches the
1621        // synthetic `click`. `touch-action: manipulation` tells iOS this
1622        // element only responds to taps and panning — no double-tap-zoom
1623        // wait, no scroll-gesture disambiguation. `user-select: none`
1624        // additionally suppresses the iOS text-selection bubble that
1625        // would otherwise intercept the tap. See ui/src/style/css/fn.rs
1626        // for the global reset and PR that documents the iOS repro.
1627        touch-action: "manipulation";
1628        user-select: "none";
1629        -webkit-user-select: "none";
1630    }
1631
1632    pub c_tab_item_inactive {
1633        padding: format!("{} {}", var!(space-md), var!(space-xl));
1634        cursor: "pointer";
1635        border-bottom: "2px solid transparent";
1636        color: "inherit";
1637        font-size: var!(font-base);
1638        font-weight: "500";
1639        // iOS WebKit fix — see c_tab_item_active above for the rationale.
1640        touch-action: "manipulation";
1641        user-select: "none";
1642        -webkit-user-select: "none";
1643        :hover {
1644            background: var!(accent-muted);
1645            color: var!(accent);
1646        }
1647    }
1648
1649    pub c_tab_content {
1650        padding: format!("{} 0px", var!(gap-element));
1651    }
1652
1653    pub c_tab_text {
1654        color: "inherit";
1655        font-size: var!(font-base);
1656        margin-bottom: var!(gap-element);
1657    }
1658
1659    pub c_tab_text_muted {
1660        color: "inherit";
1661        opacity: "1";
1662        font-size: var!(font-base);
1663    }
1664
1665    pub c_tab_text_input {
1666        color: "inherit";
1667        font-size: var!(font-base);
1668        margin-bottom: var!(gap-component);
1669    }
1670
1671    // ═══════════════════════════════════════════════════════════════════════════
1672    // List
1673    // ═══════════════════════════════════════════════════════════════════════════
1674
1675    pub c_list_input {
1676        width: "100%";
1677        flex: "1";
1678        height: "42px";
1679        padding: format!("0px {}", var!(space-lg));
1680        border: format!("1px solid {}", var!(border));
1681        font-size: var!(font-base);
1682        line-height: "normal";
1683        box-sizing: "border-box";
1684        outline: "none";
1685        color: var!(foreground);
1686        appearance: "none";
1687        -webkit-appearance: "none";
1688        -moz-appearance: "none";
1689        vertical-align: "middle";
1690        :hover {
1691            border-color: var!(accent);
1692            background: var!(accent-muted);
1693        }
1694        :focus {
1695            outline: "none";
1696            border-color: var!(accent);
1697            background: var!(accent-muted);
1698        }
1699    }
1700
1701    pub c_list_input_error {
1702        width: "100%";
1703        flex: "1";
1704        height: "42px";
1705        padding: format!("0px {}", var!(space-lg));
1706        border: format!("1px solid {}", var!(foreground));
1707        font-size: var!(font-base);
1708        line-height: "normal";
1709        box-sizing: "border-box";
1710        outline: "none";
1711        color: var!(foreground);
1712        appearance: "none";
1713        -webkit-appearance: "none";
1714        -moz-appearance: "none";
1715        vertical-align: "middle";
1716        :focus {
1717            outline: "none";
1718            border-color: var!(foreground);
1719        }
1720    }
1721
1722    pub c_list_error_text {
1723        color: var!(foreground);
1724        font-size: var!(font-base);
1725        margin: format!("{} 0px", var!(gap-element));
1726    }
1727
1728    pub c_inline_input_button_wrap {
1729        flex-shrink: "0";
1730    }
1731
1732    pub c_list_ul {
1733        list-style: "none";
1734        padding: "0px";
1735        margin: "0px";
1736        margin-top: var!(gap-component);
1737    }
1738
1739    pub c_list_item {
1740        display: "flex";
1741        justify-content: "space-between";
1742        align-items: "center";
1743        gap: var!(gap-component);
1744        min-height: var!(min-height-base);
1745        margin: format!("{} 0px", var!(gap-element));
1746    }
1747
1748    pub c_list_item_text {
1749        flex: "1";
1750        overflow: "hidden";
1751        text-overflow: "ellipsis";
1752        white-space: "nowrap";
1753        font-size: var!(font-base);
1754        color: "inherit";
1755        min-width: "0";
1756    }
1757
1758    pub c_list_item_button {
1759        max-width: "120px";
1760        flex-shrink: "0";
1761    }
1762
1763    // ═══════════════════════════════════════════════════════════════════════════
1764    // Log / Console Display
1765    // ═══════════════════════════════════════════════════════════════════════════
1766
1767    pub c_log_container {
1768        font-family: "ui-monospace, monospace";
1769        font-size: var!(font-base);
1770        margin-top: "0px";
1771        color: var!(foreground);
1772    }
1773
1774    pub c_log_item {
1775        padding: format!("{} 0px", var!(space-sm));
1776        font-size: var!(font-base);
1777        color: var!(foreground);
1778    }
1779
1780    // ═══════════════════════════════════════════════════════════════════════════
1781    // 404 Not Found
1782    // ═══════════════════════════════════════════════════════════════════════════
1783
1784    pub c_render_count_text {
1785        font-size: var!(font-base);
1786        color: "inherit";
1787        margin-bottom: var!(gap-component);
1788    }
1789
1790    // ═══════════════════════════════════════════════════════════════════════════
1791    // Event Demo
1792    // ═══════════════════════════════════════════════════════════════════════════
1793
1794    pub c_event_result {
1795        font-size: var!(font-base);
1796        color: "inherit";
1797        margin-top: var!(gap-element);
1798    }
1799
1800    pub c_event_highlight {
1801        font-weight: "600";
1802        color: var!(accent);
1803    }
1804
1805    pub c_event_info_grid {
1806        display: "grid";
1807        grid-template-columns: "1fr 1fr";
1808        gap: var!(gap-element);
1809        margin-top: var!(gap-component);
1810        @media ((max-width: 767px)) {
1811            grid-template-columns: "1fr";
1812            gap: var!(gap-element);
1813        }
1814    }
1815
1816    pub c_event_info_row {
1817        display: "flex";
1818        align-items: "center";
1819        gap: var!(space-sm);
1820        overflow: "hidden";
1821    }
1822
1823    pub c_event_info_label {
1824        font-size: var!(font-base);
1825        font-weight: "600";
1826        color: var!(foreground);
1827        flex-shrink: "0";
1828    }
1829
1830    pub c_event_info_value {
1831        c_text_ellipsis();
1832        font-size: var!(font-base);
1833        font-weight: "600";
1834        color: var!(accent);
1835        font-family: "ui-monospace, monospace";
1836        flex: "1";
1837    }
1838
1839    pub c_event_mouse_area {
1840        min-height: "120px";
1841        padding: format!("{} 0px", var!(space-xl));
1842        border: format!("2px dashed {}", var!(border));
1843        cursor: "crosshair";
1844        text-align: "center";
1845        user-select: "none";
1846        color: "inherit";
1847    }
1848
1849    pub c_event_drag_zone {
1850        min-height: "100px";
1851        padding: format!("{} 0px", var!(space-xl));
1852        border: format!("2px dashed {}", var!(border));
1853        text-align: "center";
1854        user-select: "none";
1855        color: var!(foreground);
1856    }
1857
1858    pub c_event_drag_zone_active {
1859        min-height: "100px";
1860        padding: format!("{} 0px", var!(space-xl));
1861        border: format!("2px dashed {}", var!(border));
1862        text-align: "center";
1863        user-select: "none";
1864        color: var!(foreground);
1865    }
1866
1867    pub c_event_drag_item {
1868        display: "inline-block";
1869        padding: format!("{} {}", var!(space-sm), var!(space-xl));
1870        background: var!(accent);
1871        color: var!(text-on-accent);
1872        font-size: var!(font-base);
1873        font-weight: "500";
1874        cursor: "grab";
1875        margin: var!(space-sm);
1876    }
1877
1878    pub c_event_drop_zone {
1879        border: format!("2px dashed {}", var!(border));
1880        padding: format!("{} {}", var!(space-4xl), var!(space-xl));
1881        text-align: "center";
1882        cursor: "pointer";
1883    }
1884
1885    pub c_event_drop_zone_active {
1886        border: format!("2px dashed {}", var!(accent));
1887        padding: format!("{} {}", var!(space-4xl), var!(space-xl));
1888        text-align: "center";
1889        cursor: "pointer";
1890        background: var!(accent-muted);
1891    }
1892
1893    pub c_event_drop_icon {
1894        font-size: var!(font-5xl);
1895        display: "block";
1896        padding-bottom: var!(space-md);
1897    }
1898
1899    pub c_event_drop_text {
1900        font-size: var!(font-lg);
1901        font-weight: "500";
1902        color: "inherit";
1903        padding-bottom: var!(space-md);
1904    }
1905
1906    pub c_event_drop_hint {
1907        font-size: var!(font-base);
1908        color: "inherit";
1909        opacity: "1";
1910        margin: "0px";
1911    }
1912
1913    pub c_event_wheel_zone {
1914        min-height: "120px";
1915        padding: format!("{} 0px", var!(space-xl));
1916        border: format!("2px dashed {}", var!(border));
1917        text-align: "center";
1918        overflow: "auto";
1919        color: var!(foreground);
1920    }
1921
1922    pub c_event_clipboard_area {
1923        color: var!(foreground);
1924    }
1925
1926    pub c_event_touch_zone {
1927        min-height: "120px";
1928        padding: format!("{} 0px", var!(space-xl));
1929        border: format!("2px dashed {}", var!(accent));
1930        text-align: "center";
1931        touch-action: "none";
1932        user-select: "none";
1933        color: var!(accent);
1934    }
1935
1936    pub c_event_form_area {
1937        padding: format!("{} 0px", var!(space-lg));
1938        color: var!(foreground);
1939    }
1940
1941    pub c_event_media_area {
1942        padding: format!("{} 0px", var!(space-lg));
1943        color: var!(foreground);
1944        max-width: "100%";
1945        overflow: "hidden";
1946    }
1947
1948    pub c_event_audio {
1949        width: "100%";
1950        max-width: "100%";
1951    }
1952
1953    pub c_event_video_area {
1954        color: var!(foreground);
1955        width: "100%";
1956        overflow: "hidden";
1957    }
1958
1959    pub c_event_video {
1960        width: "100%";
1961        max-width: "100%";
1962    }
1963
1964    pub c_event_image_area {
1965        padding: format!("{} 0px", var!(space-lg));
1966        color: "inherit";
1967        width: "100%";
1968        overflow: "hidden";
1969        display: "flex";
1970        flex-direction: "column";
1971        align-items: "center";
1972        gap: var!(space-md);
1973    }
1974
1975    pub c_event_image {
1976        width: "200px";
1977        max-width: "100%";
1978        object-fit: "contain";
1979        display: "block";
1980    }
1981
1982    pub c_event_url_text {
1983        text-align: "center";
1984        font-size: var!(font-sm);
1985        color: "inherit";
1986        opacity: "1";
1987        font-family: "ui-monospace, monospace";
1988        word-break: "break-all";
1989        width: "100%";
1990    }
1991
1992    // ═══════════════════════════════════════════════════════════════════════════
1993    // Timer Demo
1994    // ═══════════════════════════════════════════════════════════════════════════
1995
1996    pub c_timer_display {
1997        text-align: "center";
1998        padding: var!(space-xl);
1999        margin: format!("{} 0px", var!(gap-component));
2000        color: "inherit";
2001    }
2002
2003    pub c_timer_value {
2004        font-size: var!(font-base);
2005        font-weight: "700";
2006        color: var!(accent);
2007        letter-spacing: "0.04em";
2008        font-family: "ui-monospace, monospace";
2009    }
2010
2011    pub c_timer_controls {
2012        display: "flex";
2013        flex-wrap: "wrap";
2014        gap: var!(gap-element);
2015    }
2016
2017    pub c_timer_done {
2018        text-align: "center";
2019        margin-top: var!(gap-component);
2020        font-size: var!(font-lg);
2021        font-weight: "600";
2022        color: var!(foreground);
2023    }
2024
2025    // ═══════════════════════════════════════════════════════════════════════════
2026    // Modal
2027    // ═══════════════════════════════════════════════════════════════════════════
2028
2029    pub c_modal_overlay {
2030        position: "fixed";
2031        top: "0px";
2032        left: "0px";
2033        width: "100%";
2034        height: "100%";
2035        background: var!(bg-overlay);
2036        contain: "layout style paint";
2037        display: "flex";
2038        align-items: "center";
2039        justify-content: "center";
2040        z-index: "1000";
2041        animation: format!("euv-fade-in {} {}", var!(duration-modal-overlay), var!(ease-out));
2042        @media ((max-width: 767px)) {
2043            align-items: "center";
2044            justify-content: "center";
2045        }
2046    }
2047
2048    pub c_modal_content {
2049        background: var!(background);
2050        padding: "0px";
2051        max-width: "480px";
2052        width: "90%";
2053        animation: format!("euv-scale-in-modal {} {}", var!(duration-modal-content), var!(ease-bounce));
2054        overflow: "hidden";
2055        color: var!(foreground);
2056        box-sizing: "border-box";
2057        @media ((max-width: 767px)) {
2058            max-width: "100%";
2059            width: "calc(100% - 32px)";
2060            max-height: "85vh";
2061            overflow-y: "auto";
2062        }
2063    }
2064
2065    pub c_modal_header {
2066        display: "flex";
2067        justify-content: "space-between";
2068        align-items: "center";
2069        padding: format!("{} {} 0px {}", var!(space-md), var!(space-xl), var!(space-xl));
2070    }
2071
2072    pub c_modal_title {
2073        margin: "0px";
2074        font-size: var!(font-xl);
2075        font-weight: "600";
2076        color: "inherit";
2077    }
2078
2079    pub c_modal_body {
2080        padding: format!("0px {} {} {}", var!(space-xl), var!(space-md), var!(space-xl));
2081        color: "inherit";
2082    }
2083
2084    pub c_modal_actions {
2085        display: "flex";
2086        flex-wrap: "wrap";
2087        gap: var!(space-md);
2088        margin: format!("{} 0px", var!(space-md));
2089    }
2090
2091    // ═══════════════════════════════════════════════════════════════════════════
2092    // Animation Demo
2093    // ═══════════════════════════════════════════════════════════════════════════
2094
2095    pub c_anim_fade_in {
2096        margin-top: var!(gap-component);
2097        animation: format!("euv-fade-in 0.5s {}", var!(ease-out));
2098        font-size: var!(font-base);
2099        color: "inherit";
2100    }
2101
2102    pub c_anim_spin_container {
2103        display: "flex";
2104        justify-content: "center";
2105        align-items: "center";
2106        margin: format!("{} 0px", var!(space-lg));
2107        min-height: "80px";
2108    }
2109
2110    pub c_anim_spin {
2111        font-size: var!(font-5xl);
2112        animation: "euv-spin 1.5s linear infinite";
2113        display: "inline-block";
2114        @media ((max-width: 767px)) {
2115            font-size: var!(font-4xl);
2116        }
2117    }
2118
2119    pub c_anim_spin_stopped {
2120        font-size: var!(font-5xl);
2121        display: "inline-block";
2122        opacity: "1";
2123        @media ((max-width: 767px)) {
2124            font-size: var!(font-4xl);
2125        }
2126    }
2127
2128    pub c_anim_pulse_container {
2129        display: "flex";
2130        justify-content: "center";
2131        align-items: "center";
2132        margin: format!("{} 0px", var!(space-lg));
2133        min-height: "80px";
2134    }
2135
2136    pub c_anim_pulse {
2137        font-size: var!(font-5xl);
2138        animation: "euv-pulse 1.5s ease-in-out infinite";
2139        display: "inline-block";
2140        color: var!(foreground);
2141        @media ((max-width: 767px)) {
2142            font-size: var!(font-4xl);
2143        }
2144    }
2145
2146    pub c_anim_pulse_stopped {
2147        font-size: var!(font-5xl);
2148        display: "inline-block";
2149        opacity: "1";
2150        color: var!(foreground);
2151        @media ((max-width: 767px)) {
2152            font-size: var!(font-4xl);
2153        }
2154    }
2155
2156    pub c_progress_container {
2157        width: "100%";
2158        height: "12px";
2159        margin: format!("{} 0px", var!(space-lg));
2160        overflow: "hidden";
2161    }
2162
2163    pub c_progress_bar_running {
2164        height: "100%";
2165        background: var!(accent);
2166        animation: format!("euv-progress 1.6s {} forwards", var!(ease-in-out));
2167    }
2168
2169    pub c_progress_bar_stopped {
2170        height: "100%";
2171        background: var!(accent);
2172        width: "0%";
2173    }
2174
2175    pub c_anim_scale_box {
2176        margin: format!("{} 0px", var!(gap-component));
2177        padding: var!(space-xl);
2178        background: var!(accent);
2179        cursor: "pointer";
2180        transition: format!("transform {} {}", var!(duration-normal), var!(ease-out));
2181    }
2182
2183    // ═══════════════════════════════════════════════════════════════════════════
2184    // Browser API Demo
2185    // ═══════════════════════════════════════════════════════════════════════════
2186
2187    pub c_browser_api_row {
2188        display: "grid";
2189        grid-template-columns: "1fr 1fr";
2190        gap: var!(gap-component);
2191        margin-bottom: var!(gap-component);
2192        @media ((max-width: 767px)) {
2193            grid-template-columns: "1fr";
2194        }
2195    }
2196
2197    pub c_browser_api_actions {
2198        display: "flex";
2199        flex-wrap: "wrap";
2200        gap: var!(gap-element);
2201        margin: format!("{} 0px", var!(gap-component));
2202    }
2203
2204    pub c_browser_result_box {
2205        margin-top: var!(gap-component);
2206        font-size: var!(font-base);
2207        word-break: "break-all";
2208        color: "inherit";
2209    }
2210
2211    pub c_browser_result_label {
2212        font-weight: "600";
2213        color: var!(accent);
2214    }
2215
2216    pub c_browser_result_value {
2217        color: "inherit";
2218    }
2219
2220    pub c_browser_info_grid {
2221        display: "grid";
2222        gap: var!(gap-component);
2223        margin-top: var!(gap-component);
2224        @media ((max-width: 767px)) {
2225            grid-template-columns: "1fr";
2226        }
2227    }
2228
2229    pub c_browser_info_item {
2230        display: "flex";
2231        flex-direction: "column";
2232        gap: var!(space-xs);
2233        color: "inherit";
2234    }
2235
2236    pub c_browser_info_label {
2237        font-size: var!(font-sm);
2238        font-weight: "600";
2239        color: "inherit";
2240        opacity: "1";
2241        text-transform: "uppercase";
2242        letter-spacing: "0.05em";
2243    }
2244
2245    pub c_browser_info_value {
2246        font-size: var!(font-base);
2247        color: "inherit";
2248        word-break: "break-all";
2249        font-family: "ui-monospace, monospace";
2250    }
2251
2252    // ═══════════════════════════════════════════════════════════════════════════
2253    // VConsole Panel
2254    // ═══════════════════════════════════════════════════════════════════════════
2255
2256    pub c_vconsole_badge {
2257        position: "absolute";
2258        top: "-6px";
2259        right: "-8px";
2260        min-width: "18px";
2261        height: "18px";
2262        background: var!(background);
2263        color: var!(foreground);
2264        font-size: "10px";
2265        font-weight: "600";
2266        display: "flex";
2267        align-items: "center";
2268        justify-content: "center";
2269        padding: format!("0px {}", var!(space-xs));
2270        border: format!("1px solid {}", var!(accent));
2271        pointer-events: "none";
2272        transition: format!("transform {} {}, opacity {} {}", var!(duration-normal), var!(ease-out), var!(duration-normal), var!(ease-out));
2273    }
2274
2275    pub c_vconsole_overlay {
2276        position: "fixed";
2277        top: "0px";
2278        left: "0px";
2279        right: "0px";
2280        bottom: "0px";
2281        z-index: "10000";
2282        background: var!(bg-overlay);
2283        contain: "layout style paint";
2284        transition: format!("opacity {} {}", var!(duration-overlay), var!(ease-out));
2285    }
2286
2287    pub c_vconsole_overlay_hidden {
2288        opacity: "0";
2289        pointer-events: "none";
2290    }
2291
2292    pub c_vconsole_panel {
2293        position: "fixed";
2294        bottom: "0px";
2295        left: "0px";
2296        right: "0px";
2297        height: format!("calc(76vh - {})", var!(safe-area-inset-bottom));
2298        background: var!(background);
2299        z-index: "10001";
2300        display: "flex";
2301        flex-direction: "column";
2302        contain: "layout style paint";
2303        will-change: "transform";
2304        transition: format!("transform {} {}", var!(duration-overlay), var!(ease-out));
2305        overflow: "hidden";
2306        padding: format!("{} {}", var!(padding-main-top), var!(padding-main-horizontal));
2307        @media ((max-width: 767px)) {
2308            padding: format!("{} {}", var!(space-md), var!(padding-main-horizontal-mobile));
2309        }
2310    }
2311
2312    pub c_vconsole_panel_closed {
2313        transform: "translateY(100%)";
2314        will-change: "auto";
2315    }
2316
2317    pub c_vconsole_fab {
2318        position: "fixed";
2319        bottom: format!("calc(20px + {})", var!(safe-area-inset-bottom));
2320        right: var!(padding-main-horizontal);
2321        z-index: "9999";
2322        @media ((max-width: 767px)) {
2323            bottom: format!("calc(16px + {})", var!(safe-area-inset-bottom));
2324            right: var!(padding-main-horizontal-mobile);
2325        }
2326    }
2327
2328    pub c_vconsole_header {
2329        display: "flex";
2330        justify-content: "space-between";
2331        align-items: "center";
2332        flex-shrink: "0";
2333    }
2334
2335    pub c_vconsole_title {
2336        color: var!(foreground);
2337        font-size: var!(font-md);
2338        font-weight: "600";
2339        margin: "0px";
2340        letter-spacing: "0.03em";
2341        display: "flex";
2342        align-items: "center";
2343        gap: var!(space-sm);
2344    }
2345
2346    pub c_vconsole_title_dot {
2347        width: "8px";
2348        height: "8px";
2349        background: var!(accent);
2350        display: "inline-block";
2351        animation: "euv-pulse 2s ease-in-out infinite";
2352    }
2353
2354    pub c_vconsole_header_actions {
2355        display: "flex";
2356        gap: var!(space-sm);
2357        align-items: "center";
2358    }
2359
2360    pub c_vconsole_clear_button {
2361        display: "inline-flex";
2362        justify-content: "center";
2363        align-items: "center";
2364        color: var!(foreground);
2365        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
2366        font-size: var!(font-xs);
2367        font-weight: "600";
2368        cursor: "pointer";
2369        text-align: "center";
2370        border: format!("1.5px solid {}", var!(border));
2371        margin-left: "auto";
2372        :focus-visible {
2373            outline: "none";
2374        }
2375    }
2376
2377    pub c_vconsole_close_button {
2378        display: "inline-flex";
2379        justify-content: "center";
2380        align-items: "center";
2381        color: var!(foreground);
2382        padding: format!("{} {}", var!(space-xs), var!(space-md));
2383        cursor: "pointer";
2384        font-size: var!(font-sm);
2385        font-weight: "400";
2386        text-align: "center";
2387        white-space: "nowrap";
2388        user-select: "none";
2389        -webkit-user-select: "none";
2390        vertical-align: "middle";
2391        outline: "none";
2392        transition: format!("all {} {}", var!(duration-fast), var!(ease-out));
2393        :hover {
2394            border-color: var!(foreground);
2395            color: var!(foreground);
2396            background: var!(background);
2397        }
2398        :focus-visible {
2399            outline: "none";
2400        }
2401        :active {
2402            background: "transparent";
2403            color: var!(foreground);
2404            border-color: var!(border);
2405        }
2406    }
2407
2408    pub c_vconsole_body {
2409        flex: "1";
2410        overflow-y: "auto";
2411        contain: "content";
2412        padding-bottom: var!(space-md);
2413        font-family: "ui-monospace, monospace";
2414        font-size: var!(font-xs);
2415    }
2416
2417    pub c_vconsole_log_item {
2418        display: "flex";
2419        align-items: "center";
2420        padding: format!("{} 0px", var!(space-sm));
2421        border-bottom: format!("1px dashed {}", var!(border));
2422        color: var!(foreground);
2423        font-size: var!(font-xs);
2424        word-break: "break-all";
2425    }
2426
2427    pub c_vconsole_empty {
2428        color: var!(muted-foreground);
2429        font-size: var!(font-xs);
2430        text-align: "center";
2431        padding: format!("{} 0px", var!(space-4xl));
2432        overflow: "hidden";
2433    }
2434
2435    pub c_vconsole_empty_hidden {
2436        height: "0";
2437        overflow: "hidden";
2438        padding: "0";
2439    }
2440
2441    pub c_vconsole_log_list {
2442        overflow: "hidden";
2443    }
2444
2445    pub c_vconsole_log_list_hidden {
2446        height: "0";
2447        overflow: "hidden";
2448    }
2449
2450    pub c_vconsole_count {
2451        color: var!(muted-foreground);
2452        font-size: var!(font-sm);
2453        font-weight: "400";
2454    }
2455
2456    pub c_vconsole_filter_bar {
2457        display: "flex";
2458        gap: var!(space-sm);
2459        padding: format!("{} 0px", var!(space-sm));
2460        border-bottom: format!("1px dashed {}", var!(border));
2461        flex-shrink: "0";
2462        align-items: "center";
2463    }
2464
2465    pub c_vconsole_filter_badge {
2466        display: "inline-flex";
2467        justify-content: "center";
2468        align-items: "center";
2469        color: var!(text-on-accent);
2470        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
2471        border: format!("1px solid {}", var!(accent));
2472        font-size: var!(font-xs);
2473        font-weight: "600";
2474        cursor: "pointer";
2475        text-align: "center";
2476        background: var!(accent);
2477        :focus-visible {
2478            outline: "none";
2479        }
2480    }
2481
2482    pub c_vconsole_filter_badge_outline {
2483        display: "inline-flex";
2484        justify-content: "center";
2485        align-items: "center";
2486        color: var!(foreground);
2487        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
2488        font-size: var!(font-xs);
2489        font-weight: "600";
2490        cursor: "pointer";
2491        text-align: "center";
2492        border: format!("1.5px solid {}", var!(border));
2493    }
2494
2495    pub c_vconsole_level_badge {
2496        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
2497        font-size: var!(font-xs);
2498        margin-right: var!(space-sm);
2499        letter-spacing: "0.05em";
2500        color: var!(foreground);
2501        border: "1px solid currentColor";
2502        wrap: "nowrap";
2503        flex-shrink: "0";
2504    }
2505
2506    // ═══════════════════════════════════════════════════════════════════════════
2507    // Mobile Layout
2508    // ═══════════════════════════════════════════════════════════════════════════
2509
2510    pub c_mobile_header {
2511        display: "flex";
2512        align-items: "center";
2513        justify-content: "space-between";
2514        padding: format!("var(--euv-mobile-safe-top, 0px) 0px 0px {}", var!(space-lg));
2515        height: format!("calc({} + var(--euv-mobile-safe-top, 0px))", var!(mobile-header-height));
2516        flex-shrink: "0";
2517        position: "sticky";
2518        top: "0px";
2519        z-index: "100";
2520        contain: "content";
2521        background: var!(background);
2522        border-bottom: format!("1px solid {}", var!(border));
2523    }
2524
2525    pub c_mobile_header_left {
2526        display: "flex";
2527        align-items: "center";
2528        gap: format!("{}", var!(space-md));
2529    }
2530
2531    pub c_mobile_header_logo {
2532        display: "flex";
2533        align-items: "center";
2534        gap: format!("{}", var!(space-sm));
2535        text-decoration: "none";
2536        color: var!(foreground);
2537    }
2538
2539    pub c_mobile_menu_button {
2540        width: "40px";
2541        height: "40px";
2542        border: "none";
2543        cursor: "pointer";
2544        font-size: "22px";
2545        font-weight: "700";
2546        display: "flex";
2547        align-items: "center";
2548        justify-content: "center";
2549        color: var!(foreground);
2550        padding: "0px";
2551        :active {
2552            background: "transparent";
2553            color: var!(foreground);
2554        }
2555    }
2556
2557    pub c_mobile_theme_button {
2558        width: "40px";
2559        height: "40px";
2560        border: "none";
2561        cursor: "pointer";
2562        display: "flex";
2563        align-items: "center";
2564        justify-content: "center";
2565        padding: "0px";
2566        :active {
2567            background: "transparent";
2568        }
2569    }
2570
2571    pub c_mobile_menu_button_active {
2572        width: "40px";
2573        height: "40px";
2574        border: "none";
2575        cursor: "pointer";
2576        font-size: "22px";
2577        font-weight: "700";
2578        display: "flex";
2579        align-items: "center";
2580        justify-content: "center";
2581        color: var!(accent);
2582        padding: "0px";
2583        :active {
2584            background: var!(background);
2585            color: var!(accent);
2586        }
2587    }
2588
2589    pub c_mobile_drawer_close_button {
2590        width: "32px";
2591        height: "32px";
2592        border: "none";
2593        cursor: "pointer";
2594        font-size: "18px";
2595        font-weight: "500";
2596        display: "flex";
2597        align-items: "center";
2598        justify-content: "center";
2599        color: var!(muted-foreground);
2600        padding: "0px";
2601        transition: format!("color {} {}", var!(duration-fast), var!(ease-out));
2602        :hover {
2603            color: var!(foreground);
2604        }
2605        :active {
2606            color: var!(muted-foreground);
2607        }
2608    }
2609
2610    pub c_mobile_overlay {
2611        position: "fixed";
2612        top: "0px";
2613        left: "0px";
2614        width: "100%";
2615        height: "100%";
2616        background: var!(bg-overlay);
2617        z-index: "200";
2618        contain: "layout style paint";
2619        transition: format!("opacity {} {}", var!(duration-overlay), var!(ease-out));
2620    }
2621
2622    pub c_mobile_overlay_hidden {
2623        opacity: "0";
2624        pointer-events: "none";
2625    }
2626
2627    pub c_mobile_nav_drawer {
2628        position: "fixed";
2629        top: "0px";
2630        left: "0px";
2631        width: "240px";
2632        max-width: "100%";
2633        height: "100%";
2634        background: var!(background);
2635        z-index: "201";
2636        display: "flex";
2637        flex-direction: "column";
2638        padding-top: "var(--euv-mobile-safe-top, 0px)";
2639        padding-bottom: var!(padding-shell-bottom);
2640        contain: "layout style paint";
2641        will-change: "transform";
2642        transition: format!("transform {} {}", var!(duration-overlay), var!(ease-out));
2643        overflow: "hidden";
2644    }
2645
2646    pub c_mobile_nav_drawer_closed {
2647        transform: "translateX(-100%)";
2648    }
2649
2650    pub c_mobile_nav_drawer_header {
2651        display: "flex";
2652        align-items: "center";
2653        justify-content: "space-between";
2654        padding: format!("0px {}", var!(space-lg));
2655        height: var!(mobile-header-height);
2656        flex-shrink: "0";
2657        position: "relative";
2658        ::after {
2659            content: "''";
2660            position: "absolute";
2661            bottom: "0px";
2662            left: var!(space-lg);
2663            right: var!(space-lg);
2664            height: "1px";
2665            background: format!("linear-gradient(90deg, transparent, {}, transparent)", var!(border));
2666        }
2667    }
2668
2669    pub c_mobile_main {
2670        c_app_main();
2671        ::-webkit-scrollbar {
2672            width: "0px";
2673        }
2674    }
2675
2676    // ═══════════════════════════════════════════════════════════════════════════
2677    // Keep-Alive Demo
2678    // ═══════════════════════════════════════════════════════════════════════════
2679
2680    pub c_keep_alive_tab_bar {
2681        display: "flex";
2682        border-bottom: format!("1px dashed {}", var!(border));
2683        margin-bottom: var!(gap-component);
2684        gap: var!(gap-element);
2685    }
2686
2687    pub c_keep_alive_tab_panel {
2688        padding: format!("{} 0px", var!(gap-element));
2689    }
2690
2691    pub c_keep_alive_panel_title {
2692        margin-top: "0px";
2693        color: var!(accent);
2694        font-size: var!(font-md);
2695        margin-bottom: var!(gap-element);
2696    }
2697
2698    pub c_keep_alive_demo_text {
2699        color: "inherit";
2700        font-size: var!(font-base);
2701        margin-bottom: var!(gap-component);
2702    }
2703
2704    pub c_keep_alive_counter_display {
2705        display: "flex";
2706        justify-content: "center";
2707        align-items: "center";
2708        margin: format!("{} 0px", var!(space-xl));
2709    }
2710
2711    pub c_keep_alive_counter_value {
2712        font-size: var!(font-base);
2713        font-weight: "700";
2714        font-variant-numeric: "tabular-nums";
2715        color: var!(accent);
2716        text-align: "center";
2717    }
2718
2719    pub c_keep_alive_counter_controls {
2720        display: "flex";
2721        flex-wrap: "wrap";
2722        gap: format!("{}", var!(space-md));
2723    }
2724
2725    pub c_keep_alive_form_group {
2726        margin-bottom: var!(gap-component);
2727    }
2728
2729    pub c_keep_alive_form_preview {
2730        margin-top: var!(gap-component);
2731        background: var!(accent-muted);
2732    }
2733
2734    pub c_keep_alive_preview_label {
2735        font-size: var!(font-base);
2736        font-weight: "600";
2737        color: var!(accent);
2738        margin: format!("0px 0px {} 0px", var!(space-xs));
2739    }
2740
2741    // ═══════════════════════════════════════════════════════════════════════════
2742    // File Upload
2743    // ═══════════════════════════════════════════════════════════════════════════
2744
2745    pub c_file_upload_input_hidden {
2746        position: "absolute";
2747        width: "1px";
2748        height: "1px";
2749        padding: "0px";
2750        margin: "-1px";
2751        overflow: "hidden";
2752        clip: "rect(0, 0, 0, 0)";
2753        white-space: "nowrap";
2754        border: "0px";
2755    }
2756
2757    pub c_file_upload_options {
2758        margin: format!("{} 0px", var!(gap-component));
2759    }
2760
2761    pub c_file_upload_item {
2762        display: "flex";
2763        align-items: "center";
2764        gap: format!("{}", var!(space-md));
2765        margin: format!("{} 0px", var!(space-sm));
2766        font-size: var!(font-base);
2767        color: "inherit";
2768    }
2769
2770    pub c_file_upload_item_index {
2771        font-size: var!(font-sm);
2772        font-weight: "600";
2773        color: var!(accent);
2774        min-width: "24px";
2775    }
2776
2777    pub c_file_upload_item_name {
2778        color: "inherit";
2779        word-break: "break-all";
2780    }
2781
2782    // ═══════════════════════════════════════════════════════════════════════════
2783    // Binding Demo
2784    // ═══════════════════════════════════════════════════════════════════════════
2785
2786    pub c_binding_child_box {
2787        display: "flex";
2788        flex-direction: "column";
2789        gap: var!(gap-component);
2790        margin-top: var!(gap-component);
2791    }
2792
2793    pub c_binding_child_label {
2794        font-size: var!(font-base);
2795        font-weight: "600";
2796        color: var!(accent);
2797        text-transform: "uppercase";
2798        letter-spacing: "0.05em";
2799    }
2800
2801    pub c_binding_parent_box {
2802        display: "flex";
2803        flex-direction: "column";
2804        gap: var!(gap-component);
2805        margin-top: var!(gap-component);
2806    }
2807
2808    pub c_binding_section_title {
2809        margin-top: var!(gap-component);
2810        margin-bottom: var!(gap-element);
2811        color: var!(accent);
2812        font-size: var!(font-md);
2813        font-weight: "600";
2814    }
2815
2816    pub c_binding_temp_converter {
2817        display: "flex";
2818        align-items: "flex-end";
2819        gap: var!(gap-component);
2820        flex-wrap: "wrap";
2821        margin-top: var!(gap-component);
2822    }
2823
2824    pub c_binding_temp_field {
2825        flex: "1";
2826        min-width: "120px";
2827    }
2828
2829    pub c_binding_temp_arrow {
2830        font-size: "20px";
2831        font-weight: "700";
2832        color: var!(accent);
2833        padding-bottom: "10px";
2834    }
2835
2836    pub c_binding_color_mixer {
2837        margin-top: var!(gap-component);
2838    }
2839
2840    pub c_binding_color_preview {
2841        width: "100%";
2842        height: "80px";
2843        display: "flex";
2844        align-items: "center";
2845        justify-content: "center";
2846        margin-bottom: var!(gap-component);
2847    }
2848
2849    pub c_binding_color_hex {
2850        font-family: "ui-monospace, monospace";
2851        font-size: var!(font-xl);
2852        font-weight: "700";
2853        color: var!(text-on-accent);
2854        letter-spacing: "0.02em";
2855    }
2856
2857    pub c_binding_slider_row {
2858        display: "flex";
2859        align-items: "center";
2860        gap: format!("{}", var!(space-md));
2861        margin-bottom: var!(space-sm);
2862    }
2863
2864    pub c_binding_slider_label {
2865        font-size: var!(font-base);
2866        font-weight: "700";
2867        min-width: var!(font-sm);
2868    }
2869
2870    pub c_binding_slider {
2871        flex: "1";
2872        height: "24px";
2873        padding: "0px";
2874        cursor: "pointer";
2875        -webkit-appearance: "none";
2876        appearance: "none";
2877        border: "none";
2878        outline: "none";
2879        ::-webkit-slider-runnable-track {
2880            height: "6px";
2881            background: format!("linear-gradient(to right, {} 0%, {} var(--value,50%), {} var(--value,50%), {} 100%)", var!(foreground), var!(foreground), var!(border), var!(border));
2882            border-radius: "3px";
2883            border: "none";
2884        }
2885        ::-webkit-slider-thumb {
2886            width: "20px";
2887            height: "20px";
2888            background: var!(background);
2889            border: format!("2px solid {}", var!(accent));
2890            border-radius: "50%";
2891            cursor: "pointer";
2892            -webkit-appearance: "none";
2893            margin-top: "-7px";
2894        }
2895        : active::-webkit-slider-thumb {
2896            transform: "scale(0.92)";
2897        }
2898        ::-moz-range-track {
2899            height: "6px";
2900            background: format!("linear-gradient(to right, {} 0%, {} var(--value,50%), {} var(--value,50%), {} 100%)", var!(foreground), var!(foreground), var!(border), var!(border));
2901            border-radius: "3px";
2902            border: "none";
2903        }
2904        ::-moz-range-thumb {
2905            width: "20px";
2906            height: "20px";
2907            background: var!(background);
2908            border: format!("2px solid {}", var!(accent));
2909            border-radius: "50%";
2910            cursor: "pointer";
2911        }
2912        : active::-moz-range-thumb {
2913            transform: "scale(0.92)";
2914        }
2915    }
2916
2917    pub c_binding_slider_value {
2918        font-size: var!(font-base);
2919        font-weight: "500";
2920        color: "inherit";
2921        min-width: "32px";
2922        text-align: "right";
2923        font-family: "ui-monospace, monospace";
2924    }
2925
2926    pub c_binding_typed_prop_value {
2927        font-family: "ui-monospace, monospace";
2928        font-size: var!(font-base);
2929        font-weight: "600";
2930        color: var!(accent);
2931        padding: format!("1px {}", var!(space-sm));
2932    }
2933
2934    pub c_binding_typed_prop_group {
2935        display: "flex";
2936        align-items: "center";
2937        gap: var!(space-sm);
2938    }
2939
2940    pub c_binding_typed_warning {
2941        font-size: var!(font-base);
2942        font-weight: "500";
2943        color: var!(foreground);
2944        margin-bottom: "0px";
2945    }
2946
2947    pub c_binding_form_label {
2948        display: "block";
2949        color: "inherit";
2950        font-weight: "500";
2951        font-size: var!(font-base);
2952    }
2953
2954    pub c_binding_demo_text {
2955        color: "inherit";
2956        margin: "0px"
2957    }
2958
2959    pub c_binding_compact_button {
2960        display: "inline-flex";
2961        justify-content: "center";
2962        align-items: "center";
2963        height: "42px";
2964        padding: format!("0px {}", var!(space-md));
2965        background: var!(accent);
2966        color: var!(text-on-accent);
2967        border: format!("1px solid {}", var!(accent));
2968        cursor: "pointer";
2969        font-size: var!(font-sm);
2970        font-weight: "600";
2971        outline: "none";
2972        white-space: "nowrap";
2973        user-select: "none";
2974        -webkit-user-select: "none";
2975        box-sizing: "border-box";
2976        :hover {
2977            background: var!(accent);
2978        }
2979        :focus-visible {
2980            outline: "none";
2981        }
2982        :active {
2983            background: var!(accent);
2984            color: var!(text-on-accent);
2985            border-color: var!(accent);
2986        }
2987    }
2988
2989    // ═══════════════════════════════════════════════════════════════════════════
2990    // Custom Attrs - Dynamic Style
2991    // ═══════════════════════════════════════════════════════════════════════════
2992
2993    pub c_attrs_dynamic_demo(prop_key: &str, prop_value: &str) {
2994        {
2995            prop_key
2996        }
2997        : prop_value;
2998        // No layout defaults: this class lives on a `<p>` whose own margin /
2999        // spacing is controlled by its parent's typography rules, and pinning
3000        // any colour here would shadow the user-supplied dynamic property.
3001        // Users are expected to set `color` / `background` / `font-*` /
3002        // etc. via the two CSS Property Key / Value inputs above; whatever
3003        // they type becomes the literal CSS rule applied to the paragraph.
3004    }
3005
3006    // ═══════════════════════════════════════════════════════════════════════════
3007    // Dynamic Component Demo
3008    // ═══════════════════════════════════════════════════════════════════════════
3009
3010    pub c_dynamic_component_tab_bar {
3011        display: "flex";
3012        flex-wrap: "wrap";
3013        gap: var!(gap-element);
3014        margin-bottom: var!(gap-component);
3015    }
3016
3017    pub c_dynamic_component_panel {
3018        display: "block";
3019        min-height: var!(min-height-sm);
3020        margin-top: var!(gap-component);
3021    }
3022
3023    // ═══════════════════════════════════════════════════════════════════════════
3024    // Virtual List
3025    // ═══════════════════════════════════════════════════════════════════════════
3026
3027    pub c_virtual_list_status {
3028        display: "flex";
3029        gap: var!(gap-component);
3030        padding: format!("{} 0px", var!(gap-component));
3031        flex-wrap: "nowrap";
3032        overflow: "hidden";
3033        text-overflow: "ellipsis";
3034        white-space: "nowrap";
3035        @media ((max-width: 767px)) {
3036            gap: var!(gap-component-mobile);
3037        }
3038    }
3039
3040    pub c_virtual_list_status_item {
3041        font-size: var!(font-base);
3042        color: "inherit";
3043        overflow: "hidden";
3044        text-overflow: "ellipsis";
3045        white-space: "nowrap";
3046    }
3047
3048    pub c_virtual_list_status_value {
3049        font-weight: "700";
3050        color: var!(accent);
3051        font-family: "ui-monospace, monospace";
3052    }
3053
3054    pub c_virtual_list_container {
3055        flex: "1";
3056        height: "666px";
3057        max-height: "666px";
3058        overflow-y: "auto";
3059    }
3060
3061    pub c_virtual_list_card {
3062        flex: "1";
3063        padding: var!(space-xl);
3064        color: var!(foreground);
3065        display: "flex";
3066        flex-direction: "column";
3067        @media ((max-width: 767px)) {
3068            padding: var!(space-lg);
3069        }
3070    }
3071
3072    pub c_virtual_list_row {
3073        display: "flex";
3074        align-items: "center";
3075        gap: var!(space-lg);
3076        height: "100%";
3077        box-sizing: "border-box";
3078    }
3079
3080    pub c_virtual_list_row_index {
3081        min-width: "36px";
3082        font-size: var!(font-sm);
3083        font-weight: "600";
3084        color: var!(accent);
3085        font-family: "ui-monospace, monospace";
3086        flex-shrink: "0";
3087        display: "flex";
3088        align-items: "center";
3089    }
3090
3091    pub c_virtual_list_row_label {
3092        font-size: var!(font-base);
3093        font-weight: "500";
3094        color: "inherit";
3095        min-width: "120px";
3096        flex-shrink: "0";
3097        overflow: "hidden";
3098        text-overflow: "ellipsis";
3099        white-space: "nowrap";
3100        display: "flex";
3101        align-items: "center";
3102    }
3103
3104    pub c_virtual_list_row_description {
3105        font-size: var!(font-base);
3106        color: "inherit";
3107        opacity: "1";
3108        overflow: "hidden";
3109        text-overflow: "ellipsis";
3110        white-space: "nowrap";
3111        flex: "1";
3112        display: "flex";
3113        align-items: "center";
3114    }
3115
3116    // ═══════════════════════════════════════════════════════════════════════════
3117    // Unified Layout Primitives
3118    // ═══════════════════════════════════════════════════════════════════════════
3119
3120    pub c_element_stack {
3121        display: "flex";
3122        flex-direction: "column";
3123        gap: var!(gap-element);
3124    }
3125
3126    pub c_switcher {
3127        display: "flex";
3128        gap: var!(gap-component);
3129        flex-wrap: "wrap";
3130        @media ((max-width: 767px)) {
3131            flex-direction: "column";
3132            gap: var!(gap-component-mobile);
3133        }
3134    }
3135
3136    pub c_switcher_col {
3137        flex: "1";
3138        min-width: "200px";
3139        @media ((max-width: 767px)) {
3140            min-width: "100%";
3141        }
3142    }
3143
3144    // ═══════════════════════════════════════════════════════════════════════════
3145    // Unified Description / Hint Text
3146    // ═══════════════════════════════════════════════════════════════════════════
3147
3148    pub c_hint {
3149        color: "inherit";
3150        opacity: "1";
3151        font-size: var!(font-base);
3152        margin-bottom: var!(gap-component);
3153    }
3154
3155    // ═══════════════════════════════════════════════════════════════════════════
3156    // Network Demo
3157    // ═══════════════════════════════════════════════════════════════════════════
3158
3159    pub c_net_messages_empty {
3160        color: "inherit";
3161        opacity: "1";
3162        padding: var!(space-xl);
3163        text-align: "center";
3164        font-size: var!(font-base);
3165    }
3166
3167    pub c_net_messages_list {
3168        display: "flex";
3169        flex-direction: "column";
3170        gap: var!(space-xs);
3171    }
3172
3173    pub c_net_message_item {
3174        display: "flex";
3175        align-items: "baseline";
3176        gap: var!(gap-element);
3177        justify-content: "space-between";
3178    }
3179
3180    pub c_net_message_index {
3181        color: var!(accent);
3182        font-size: var!(font-sm);
3183        font-weight: "600";
3184        white-space: "nowrap";
3185        flex-shrink: "0";
3186    }
3187
3188    pub c_net_message_data {
3189        color: "inherit";
3190        font-size: var!(font-base);
3191        word-break: "break-all";
3192        overflow-wrap: "break-word";
3193        flex: "1";
3194        min-width: "0";
3195    }
3196
3197    // ═══════════════════════════════════════════════════════════════════════════
3198    // WebSocket Demo
3199    // ═══════════════════════════════════════════════════════════════════════════
3200
3201    pub c_ws_message_input {
3202        width: "100%";
3203        flex: "1";
3204        height: "42px";
3205        padding: format!("0px {}", var!(space-lg));
3206        color: var!(foreground);
3207        border: format!("1px solid {}", var!(border));
3208        font-size: var!(font-base);
3209        line-height: "normal";
3210        box-sizing: "border-box";
3211        outline: "none";
3212        appearance: "none";
3213        -webkit-appearance: "none";
3214        -moz-appearance: "none";
3215        vertical-align: "middle";
3216        :hover {
3217            border-color: var!(accent);
3218            background: var!(accent-muted);
3219        }
3220        :focus {
3221            outline: "none";
3222            border-color: var!(accent);
3223            background: var!(accent-muted);
3224        }
3225    }
3226
3227    pub c_ws_message_time {
3228        color: var!(foreground);
3229        font-size: var!(font-sm);
3230        white-space: "nowrap";
3231        flex-shrink: "0";
3232        margin-left: "auto";
3233    }
3234
3235    // ═══════════════════════════════════════════════════════════════════════════
3236    // Sticky & CSS Effects Demo
3237    // ═══════════════════════════════════════════════════════════════════════════
3238
3239    // ═══════════════════════════════════════════════════════════════════════════
3240    // Home Page — Section
3241    // ═══════════════════════════════════════════════════════════════════════════
3242
3243    pub c_home {
3244        position: "relative";
3245        text-align: "center";
3246        margin-bottom: var!(space-xl);
3247        flex: "1";
3248        display: "flex";
3249        flex-direction: "column";
3250        justify-content: "center";
3251        @media ((max-width: 767px)) {
3252            margin-bottom: var!(space-lg);
3253            flex: "0 0 auto";
3254            justify-content: "flex-start";
3255        }
3256    }
3257
3258    pub c_home_content {
3259        position: "relative";
3260        z-index: "1";
3261    }
3262
3263    pub c_home_badge_row {
3264        display: "inline-flex";
3265        align-items: "center";
3266        gap: var!(space-sm);
3267        margin-bottom: var!(space-md);
3268    }
3269
3270    pub c_home_badge {
3271        display: "inline-flex";
3272        justify-content: "center";
3273        align-items: "center";
3274        padding: format!("{} {}", var!(space-xs), var!(space-sm));
3275        color: var!(accent);
3276        font-size: var!(font-xs);
3277        font-weight: "600";
3278        letter-spacing: "0.05em";
3279        border: format!("1px solid {}", var!(accent));
3280    }
3281
3282    pub c_home_title {
3283        font-size: var!(font-5xl);
3284        font-weight: "800";
3285        letter-spacing: "-0.03em";
3286        margin: "0px";
3287        color: var!(foreground);
3288        margin-bottom: var!(space-xs);
3289        @media ((max-width: 767px)) {
3290            font-size: var!(font-4xl);
3291        }
3292    }
3293
3294    pub c_home_subtitle {
3295        font-size: var!(font-lg);
3296        color: var!(foreground);
3297        margin: "0px auto";
3298        max-width: "520px";
3299        margin-bottom: var!(space-lg);
3300        @media ((max-width: 767px)) {
3301            font-size: var!(font-base);
3302        }
3303    }
3304
3305    pub c_home_actions {
3306        display: "flex";
3307        gap: var!(space-md);
3308        justify-content: "center";
3309        flex-wrap: "wrap";
3310    }
3311
3312    pub c_home_btn_primary {
3313        display: "inline-flex";
3314        justify-content: "center";
3315        align-items: "center";
3316        gap: var!(space-sm);
3317        padding: format!("{} {}", var!(space-sm), var!(space-2xl));
3318        background: var!(accent);
3319        color: var!(text-on-accent);
3320        font-size: var!(font-base);
3321        font-weight: "600";
3322        text-decoration: "none";
3323        border: "1.5px solid transparent";
3324        cursor: "pointer";
3325        letter-spacing: "0.01em";
3326        vertical-align: "middle";
3327        min-height: var!(min-height-sm);
3328        :focus-visible {
3329            outline: "none";
3330        }
3331        :active {
3332            background: var!(accent);
3333            color: var!(text-on-accent);
3334            border-color: "1.5px solid transparent";
3335        }
3336    }
3337
3338    pub c_home_btn_secondary {
3339        display: "inline-flex";
3340        justify-content: "center";
3341        align-items: "center";
3342        gap: var!(space-sm);
3343        padding: format!("{} {}", var!(space-sm), var!(space-2xl));
3344        color: var!(accent);
3345        font-size: var!(font-base);
3346        font-weight: "600";
3347        text-decoration: "none";
3348        border: format!("1.5px solid {}", var!(accent));
3349        cursor: "pointer";
3350        letter-spacing: "0.01em";
3351        vertical-align: "middle";
3352        min-height: var!(min-height-sm);
3353        :focus-visible {
3354            outline: "none";
3355        }
3356        :active {
3357            background: "transparent";
3358            color: var!(accent);
3359            border-color: var!(accent);
3360        }
3361    }
3362
3363    // ═══════════════════════════════════════════════════════════════════════════
3364    // Home Page — Stats Row
3365    // ═══════════════════════════════════════════════════════════════════════════
3366
3367    pub c_home_stats {
3368        display: "grid";
3369        grid-template-columns: "repeat(4, 1fr)";
3370        gap: var!(space-md);
3371        margin-bottom: var!(space-xl);
3372        @media ((max-width: 767px)) {
3373            grid-template-columns: "repeat(2, 1fr)";
3374            gap: var!(space-sm);
3375        }
3376    }
3377
3378    pub c_home_stat_card {
3379        display: "flex";
3380        flex-direction: "column";
3381        align-items: "center";
3382        justify-content: "center";
3383        gap: var!(space-xs);
3384    }
3385
3386    pub c_home_stat_icon {
3387        font-size: var!(font-2xl);
3388    }
3389
3390    pub c_home_stat_value {
3391        font-size: var!(font-xl);
3392        font-weight: "800";
3393        color: var!(foreground);
3394        letter-spacing: "-0.01em";
3395    }
3396
3397    pub c_home_stat_label {
3398        font-size: var!(font-sm);
3399        color: var!(muted-foreground);
3400        font-weight: "500";
3401    }
3402
3403    // ═══════════════════════════════════════════════════════════════════════════
3404    // Home Page — Section & Feature Cards
3405    // ═══════════════════════════════════════════════════════════════════════════
3406
3407    pub c_home_section_title {
3408        font-size: var!(font-2xl);
3409        font-weight: "700";
3410        color: var!(foreground);
3411        margin: "0px";
3412        margin: format!("{} 0px", var!(gap-component));
3413        letter-spacing: "-0.02em";
3414    }
3415
3416    pub c_home_section_desc {
3417        font-size: var!(font-base);
3418        color: var!(foreground);
3419        margin: "0px";
3420        margin-bottom: var!(space-2xl);
3421    }
3422
3423    pub c_home_feature_grid {
3424        display: "grid";
3425        grid-template-columns: "repeat(2, 1fr)";
3426        gap: var!(space-md);
3427        @media ((max-width: 767px)) {
3428            grid-template-columns: "1fr";
3429        }
3430    }
3431
3432    pub c_feature_card {
3433        display: "flex";
3434        flex-direction: "column";
3435        gap: var!(space-sm);
3436        padding: "0px";
3437        overflow: "hidden";
3438    }
3439
3440    pub c_feature_header {
3441        display: "flex";
3442        align-items: "center";
3443        gap: var!(space-sm);
3444    }
3445
3446    pub c_feature_icon {
3447        font-size: var!(font-2xl);
3448        display: "flex";
3449        align-items: "center";
3450        justify-content: "center";
3451        line-height: "1";
3452        flex-shrink: "0";
3453    }
3454
3455    pub c_feature_name {
3456        font-size: var!(font-lg);
3457        font-weight: "600";
3458        color: var!(foreground);
3459        margin: "0px";
3460        overflow: "hidden";
3461        text-overflow: "ellipsis";
3462        white-space: "nowrap";
3463    }
3464
3465    pub c_feature_desc {
3466        font-size: var!(font-sm);
3467        color: var!(foreground);
3468        margin: "0px";
3469    }
3470
3471    // ═══════════════════════════════════════════════════════════════════════════
3472    // Global Utilities
3473    // ═══════════════════════════════════════════════════════════════════════════
3474
3475    // Dev-only readouts produced by `euv_debug`. The base wrapper
3476    // establishes the inline-flex layout so the label and the value
3477    // share a baseline; the `code` / `pre` value elements apply
3478    // monospace font and wrap behaviour for the two modes
3479    // (`expanded: false` = single-line `code`, `expanded: true` =
3480    // multi-line `pre`).
3481    pub c_debug {
3482        display: "flex";
3483        flex-direction: "row";
3484        align-items: "baseline";
3485        gap: var!(space-sm);
3486        padding: var!(space-xs);
3487        border: format!("1px dashed {}", var!(accent-muted));
3488        border-radius: var!(radius-sm);
3489        background: var!(surface-muted);
3490        font-family: "ui-monospace, SFMono-Regular, monospace";
3491        font-size: var!(font-sm);
3492        color: var!(foreground);
3493        margin: format!("{} 0px", var!(space-xs));
3494    }
3495
3496    pub c_debug_label {
3497        font-weight: "600";
3498        color: var!(accent);
3499        flex-shrink: "0";
3500    }
3501
3502    pub c_debug_value {
3503        font-family: "ui-monospace, SFMono-Regular, monospace";
3504        color: var!(foreground);
3505        margin: "0px";
3506    }
3507
3508    // ═══════════════════════════════════════════════════════════════════════════
3509    // euv_navbar
3510    // ═══════════════════════════════════════════════════════════════════════════
3511
3512    pub c_euv_navbar {
3513        position: "fixed";
3514        top: "0px";
3515        left: "0px";
3516        right: "0px";
3517        height: "56px";
3518        display: "flex";
3519        align-items: "center";
3520        gap: var!(gap-element);
3521        padding: format!("0px {}", var!(padding-main-horizontal));
3522        border-bottom: format!("1px solid {}", var!(border));
3523        background: var!(background);
3524        z-index: "100";
3525        @media ((max-width: 767px)) {
3526            padding: format!("0px {}", var!(padding-main-horizontal-mobile));
3527        }
3528    }
3529    pub c_euv_navbar_brand {
3530        display: "flex";
3531        align-items: "center";
3532        gap: var!(gap-element);
3533        font-size: var!(font-lg);
3534        font-weight: "700";
3535        letter-spacing: "-0.02em";
3536        color: var!(foreground);
3537        cursor: "pointer";
3538        flex-shrink: "0";
3539    }
3540    pub c_euv_navbar_logo {
3541        width: "32px";
3542        height: "32px";
3543        display: "flex";
3544        align-items: "center";
3545        justify-content: "center";
3546        background: var!(accent);
3547        color: var!(text-on-accent);
3548        font-size: var!(font-lg);
3549        flex-shrink: "0";
3550    }
3551    pub c_euv_navbar_links {
3552        display: "flex";
3553        align-items: "center";
3554        gap: var!(gap-section);
3555        margin-left: "auto";
3556        @media ((max-width: 767px)) {
3557            display: "none";
3558        }
3559    }
3560    pub c_euv_navbar_link {
3561        font-size: var!(font-sm);
3562        font-weight: "500";
3563        color: var!(foreground);
3564        padding: format!("{} {}", var!(space-xs), var!(space-sm));
3565        border-bottom: "2px solid transparent";
3566        cursor: "pointer";
3567        :hover {
3568            color: var!(accent);
3569        }
3570    }
3571    pub c_euv_navbar_link_active {
3572        font-size: var!(font-sm);
3573        font-weight: "600";
3574        color: var!(accent);
3575        padding: format!("{} {}", var!(space-xs), var!(space-sm));
3576        border-bottom: format!("2px solid {}", var!(accent));
3577        cursor: "pointer";
3578    }
3579    pub c_euv_navbar_actions {
3580        display: "flex";
3581        align-items: "center";
3582        gap: var!(gap-element);
3583        margin-left: var!(gap-section);
3584        @media ((max-width: 767px)) {
3585            margin-left: "auto";
3586        }
3587    }
3588    pub c_euv_navbar_icon_button {
3589        width: "36px";
3590        height: "36px";
3591        display: "flex";
3592        align-items: "center";
3593        justify-content: "center";
3594        border: format!("1px dashed {}", var!(border));
3595        cursor: "pointer";
3596        font-size: var!(font-base);
3597        :hover {
3598            background: var!(accent-muted);
3599        }
3600    }
3601    pub c_euv_navbar_menu_button {
3602        display: "none";
3603        width: "40px";
3604        height: "40px";
3605        align-items: "center";
3606        justify-content: "center";
3607        font-size: var!(font-xl);
3608        cursor: "pointer";
3609        transition: format!("background {} {}", var!(duration-fast), var!(ease-out));
3610        @media ((max-width: 767px)) {
3611            display: "flex";
3612        }
3613    }
3614    pub c_euv_navbar_menu_button_active {
3615        display: "none";
3616        width: "40px";
3617        height: "40px";
3618        align-items: "center";
3619        justify-content: "center";
3620        font-size: var!(font-xl);
3621        cursor: "pointer";
3622        background: var!(accent-muted);
3623        transition: format!("background {} {}", var!(duration-fast), var!(ease-out));
3624        @media ((max-width: 767px)) {
3625            display: "flex";
3626        }
3627    }
3628
3629    // ═══════════════════════════════════════════════════════════════════════════
3630    // euv_dropdown
3631    // ═══════════════════════════════════════════════════════════════════════════
3632
3633    pub c_euv_dropdown {
3634        position: "relative";
3635    }
3636    pub c_euv_dropdown_menu {
3637        position: "absolute";
3638        top: "44px";
3639        right: "0px";
3640    /* `width: 100%` instead of `min-width: 140px` so the menu
3641                                                                                                                                                           matches the dropdown container (and therefore the
3642                                                                                                                                                           trigger button) width exactly. With only `min-width`,
3643                                                                                                                                                           a trigger wider than 140px (e.g. the 206px-wide
3644                                                                                                                                                           nav-column locale switcher button) leaves a large
3645                                                                                                                                                           empty gap on the left of the menu, since `right: 0`
3646                                                                                                                                                           anchors only the right edge to the container. With
3647                                                                                                                                                           `width: 100%`, the menu's left edge lines up with the
3648                                                                                                                                                           trigger's left edge. The default minimum content width
3649                                                                                                                                                           is still guaranteed by the inner items' own padding,
3650                                                                                                                                                           so we keep the rule without an explicit min. */
3651        width: "100%";
3652        background: var!(background);
3653        border: format!("1px solid {}", var!(border));
3654        box-shadow: var!(shadow-accent-lg);
3655        flex-direction: "column";
3656        z-index: "101";
3657    }
3658    pub c_euv_dropdown_menu_open {
3659        display: "flex";
3660    }
3661    pub c_euv_dropdown_menu_closed {
3662        display: "none";
3663    }
3664    pub c_euv_dropdown_item {
3665        padding: format!("{} {}", var!(space-sm), var!(space-lg));
3666        font-size: var!(font-sm);
3667        text-align: "left";
3668        cursor: "pointer";
3669        :hover {
3670            background: var!(accent-muted);
3671        }
3672    }
3673
3674    // ═══════════════════════════════════════════════════════════════════════════
3675    // euv_sidebar
3676    // ═══════════════════════════════════════════════════════════════════════════
3677
3678    pub c_euv_sidebar_group {
3679        margin-bottom: var!(space-xs);
3680    }
3681    pub c_euv_sidebar_group_title {
3682        display: "flex";
3683        align-items: "center";
3684        justify-content: "space-between";
3685        width: "100%";
3686        // Symmetric horizontal padding so the text and the dashed border of
3687        // any nested children line up on the left edge (see sidebar_children
3688        // below). Left padding equals `border-left-width + padding-left` of
3689        // the children container — that's the "text and the dashed border
3690        // share the same x" requirement.
3691        padding: format!("{} {}", var!(space-md), var!(space-md));
3692        font-size: var!(font-base);
3693        font-weight: "400";
3694        cursor: "pointer";
3695        text-align: "left";
3696        // Hover: inset 3px shadow bar between the dashed tree guide and the
3697        // title text. Using `box-shadow inset` instead of a real border
3698        // avoids any layout change so the text x-position never moves on
3699        // hover (see comment on `c_euv_sidebar_link:hover`).
3700        :hover {
3701            box-shadow: format!("inset 3px 0 0 0 {}", var!(foreground));
3702        }
3703    }
3704    pub c_euv_sidebar_group_title_active {
3705        background: var!(accent);
3706        color: var!(text-on-accent);
3707        font-weight: "600";
3708        :hover {
3709            box-shadow: format!("inset 3px 0 0 0 {}", var!(foreground));
3710        }
3711    }
3712    pub c_euv_sidebar_group_arrow {
3713        font-size: var!(font-xs);
3714        color: var!(muted-foreground);
3715        transition: format!("transform {} {}", var!(duration-fast), var!(ease-out));
3716    }
3717    pub c_euv_sidebar_group_arrow_open {
3718        transform: "rotate(90deg)";
3719    }
3720    pub c_euv_sidebar_group_arrow_active {
3721        color: var!(text-on-accent);
3722    }
3723    pub c_euv_sidebar_children {
3724        display: "flex";
3725        flex-direction: "column";
3726        // Compact nesting: keep the dashed tree guide on the left of every
3727        // nesting level, but trim its indent so the child's text sits just
3728        // to the right of the dashed border instead of a full 33px gutter
3729        // away (the old `margin-left: 20px` + `padding-left: 12px` setup).
3730        // The numbers chosen (margin 8 + border 1 + padding 8 = 17px) are
3731        // large enough to read as a distinct level but small enough that
3732        // three-deep trees still fit in a 248–320px sidebar.
3733        margin-left: var!(space-sm);
3734        padding-left: var!(space-sm);
3735        border-left: format!("1px dashed {}", var!(border));
3736        animation: format!("euv-fade-in {} {}", var!(duration-normal), var!(ease-out));
3737    }
3738    pub c_euv_sidebar_link {
3739        display: "block";
3740        padding: format!("{} {}", var!(space-md), var!(space-md));
3741        font-size: var!(font-base);
3742        color: var!(foreground);
3743        font-weight: "400";
3744        cursor: "pointer";
3745        // Hover: paint a 3px solid bar *between* the dashed tree guide and
3746        // the link's text. We use `inset box-shadow` rather than a real
3747        // `border-left` because borders participate in the box's layout
3748        // (they grow the border-edge and require compensating padding to
3749        // keep the text x-position stable — and `calc(12px + 3px - 3px)`
3750        // rounds inconsistently across browsers, causing sub-pixel text
3751        // shifts on hover). An inset shadow is painted *inside* the
3752        // existing padding box without changing layout, so the text never
3753        // moves. The dashed parent border is also untouched.
3754        :hover {
3755            box-shadow: format!("inset 3px 0 0 0 {}", var!(foreground));
3756        }
3757    }
3758    pub c_euv_sidebar_link_active {
3759        display: "block";
3760        padding: format!("{} {}", var!(space-md), var!(space-md));
3761        font-size: var!(font-base);
3762        background: var!(accent);
3763        color: var!(text-on-accent);
3764        font-weight: "600";
3765        cursor: "pointer";
3766        :hover {
3767            box-shadow: format!("inset 3px 0 0 0 {}", var!(foreground));
3768        }
3769    }
3770
3771    // ═══════════════════════════════════════════════════════════════════════════
3772    // euv_toc
3773    // ═══════════════════════════════════════════════════════════════════════════
3774
3775    pub c_euv_toc {
3776        // The outer `c_euv_doc_toc` column is already sticky in
3777        // `c_app_main`'s scroll context — adding another sticky offset here
3778        // would double the offset and the TOC would slide past the top of
3779        // the scrollable area instead of staying pinned. Keep the inner
3780        // toc purely as a layout container.
3781        display: "flex";
3782        flex-direction: "column";
3783        gap: var!(space-xs);
3784        border-left: format!("1px solid {}", var!(border));
3785        padding-left: var!(space-lg);
3786    }
3787    pub c_euv_toc_title {
3788        font-size: var!(font-xs);
3789        font-weight: "700";
3790        text-transform: "uppercase";
3791        letter-spacing: "0.08em";
3792        color: var!(muted-foreground);
3793        margin-bottom: var!(space-xs);
3794    }
3795    pub c_euv_toc_link {
3796        font-size: var!(font-sm);
3797        color: var!(muted-foreground);
3798        cursor: "pointer";
3799        line-height: "1.5";
3800        :hover {
3801            color: var!(accent);
3802        }
3803    }
3804    pub c_euv_toc_link_nested {
3805        c_euv_toc_link();
3806        padding-left: var!(space-lg);
3807    }
3808
3809    // ═══════════════════════════════════════════════════════════════════════════
3810    // euv_pagination
3811    // ═══════════════════════════════════════════════════════════════════════════
3812
3813    pub c_euv_pagination {
3814        // CSS grid with two equal columns gives us perfect 50/50 widths
3815        // regardless of the link content length, which flex with `1 1
3816        // auto` cannot (each link starts at its own content size). The
3817        // mobile breakpoint stacks the grid to a single column so each
3818        // link sizes to its content.
3819        display: "grid";
3820        grid-template-columns: "1fr 1fr";
3821        gap: var!(gap-component);
3822        // ~`space-2xl` (1.5rem) above the pagination — comfortable
3823        // breathing room without a huge gap before prev/next. The original
3824        // `space-4xl` (2.5rem) margin was doubled by a `padding-top` in the
3825        // docs app override, leaving ~100px of empty space above the
3826        // pagination boxes which made the page feel bottom-heavy.
3827        margin-top: var!(space-2xl);
3828        // `min-width: 0` lets prev/next text actually use ellipsis when the
3829        // container is narrow — without it the grid track blows out the row.
3830        min-width: "0px";
3831        @media ((max-width: 767px)) {
3832            grid-template-columns: "minmax(0, 1fr)";
3833        }
3834    }
3835    pub c_euv_pagination_link {
3836        // `min-width: 0` lets long labels ellipsize on the desktop row
3837        // layout. `overflow: hidden` is required to actually apply ellipsis
3838        // when content is wider than the link.
3839        min-width: "0px";
3840        border: format!("1px solid {}", var!(border));
3841        padding: var!(space-lg);
3842        cursor: "pointer";
3843        display: "flex";
3844        flex-direction: "column";
3845        gap: var!(space-2xs);
3846        overflow: "hidden";
3847        :hover {
3848            border-color: var!(accent);
3849        }
3850    }
3851    pub c_euv_pagination_label {
3852        font-size: var!(font-xs);
3853        color: var!(muted-foreground);
3854        text-transform: "uppercase";
3855        letter-spacing: "0.08em";
3856    }
3857    pub c_euv_pagination_text {
3858        font-size: var!(font-base);
3859        font-weight: "600";
3860        color: var!(accent);
3861        // Ellipsize when the link is too narrow for the page title. The
3862        // outer `.c_euv_pagination_link` already sets `overflow: hidden`
3863        // and `min-width: 0`, so a single `text-overflow: ellipsis` here
3864        // is enough — without `white-space: nowrap` the text wraps to
3865        // multiple lines and the ellipsis never kicks in.
3866        white-space: "nowrap";
3867        overflow: "hidden";
3868        text-overflow: "ellipsis";
3869        min-width: "0px";
3870    }
3871    pub c_euv_pagination_next {
3872        text-align: "right";
3873    }
3874    pub c_euv_pagination_spacer {
3875        flex: "1";
3876    }
3877
3878    // ═══════════════════════════════════════════════════════════════════════════
3879    // euv_drawer
3880    // ═══════════════════════════════════════════════════════════════════════════
3881
3882    pub c_euv_drawer_overlay {
3883        position: "fixed";
3884        top: "0px";
3885        left: "0px";
3886        right: "0px";
3887        bottom: "0px";
3888        background: var!(bg-overlay);
3889        z-index: "200";
3890        transition: format!("opacity {} {}, visibility {} {}", var!(duration-overlay), var!(ease-out), var!(duration-overlay), var!(ease-out));
3891    }
3892    pub c_euv_drawer_overlay_open {
3893        opacity: "1";
3894        visibility: "visible";
3895    }
3896    pub c_euv_drawer_overlay_closed {
3897        opacity: "0";
3898        visibility: "hidden";
3899    }
3900    pub c_euv_drawer {
3901        position: "fixed";
3902        top: "0px";
3903        left: "0px";
3904        bottom: "0px";
3905        width: "260px";
3906        background: var!(background);
3907        border-right: format!("1px solid {}", var!(border));
3908        z-index: "201";
3909        overflow-y: "auto";
3910        padding: var!(space-xl);
3911        transition: format!("transform {} {}, visibility {} {}", var!(duration-normal), var!(ease-out), var!(duration-normal), var!(ease-out));
3912    }
3913    pub c_euv_drawer_open {
3914        transform: "translateX(0px)";
3915        visibility: "visible";
3916    }
3917    pub c_euv_drawer_closed {
3918        transform: "translateX(-100%)";
3919        visibility: "hidden";
3920    }
3921
3922    // ═══════════════════════════════════════════════════════════════════════════
3923    // euv_markdown / euv_footer
3924    // ═══════════════════════════════════════════════════════════════════════════
3925
3926    pub c_euv_markdown {
3927        width: "100%";
3928        min-width: "0px";
3929    }
3930    pub c_euv_footer {
3931        // Footer sits at the natural end of the article column. The user
3932        // reaches it by scrolling to the bottom of the article — no sticky
3933        // or fixed positioning. This matches the desktop behavior and
3934        // Avoid any layout interference on mobile (where a sticky footer
3935        // would overlap the last lines of content while scrolling).
3936        // `space-2xl` (1.5rem) above the footer matches the gap between
3937        // article and pagination, keeping a consistent rhythm in the
3938        // tail block. The previous `space-7xl` (5rem) was far beyond the
3939        // typography scale and made the footer feel detached from the
3940        // pagination.
3941        margin-top: var!(space-2xl);
3942        // `space-lg` top/bottom (1rem) — enough padding for the dashed
3943        // border to breathe without pushing the text far from the rule.
3944        padding: format!("{} 0px", var!(space-lg));
3945        border-top: format!("1px dashed {}", var!(border));
3946        text-align: "center";
3947        font-size: var!(font-sm);
3948        color: var!(muted-foreground);
3949    }
3950
3951    // ═══════════════════════════════════════════════════════════════════════════
3952    // euv_result / euv_doc_layout
3953    // ═══════════════════════════════════════════════════════════════════════════
3954
3955    pub c_euv_result {
3956        display: "flex";
3957        flex-direction: "column";
3958        align-items: "center";
3959        justify-content: "center";
3960        text-align: "center";
3961        gap: var!(space-md);
3962        padding: format!("{} {}", var!(space-4xl), var!(space-md));
3963        min-height: "50vh";
3964    }
3965    pub c_euv_result_code {
3966        font-size: var!(font-6xl);
3967        font-weight: "700";
3968        line-height: "1";
3969        letter-spacing: "-0.02em";
3970    }
3971    pub c_euv_result_title {
3972        font-size: var!(font-2xl);
3973        font-weight: "600";
3974        margin: "0px";
3975    }
3976    pub c_euv_result_description {
3977        color: var!(muted-foreground);
3978        margin: "0px";
3979    }
3980    pub c_euv_result_actions {
3981        display: "flex";
3982        gap: var!(space-md);
3983        margin-top: var!(space-lg);
3984    }
3985
3986    pub c_euv_doc_layout {
3987        display: "flex";
3988        gap: var!(space-4xl);
3989        width: "100%";
3990        min-width: "0px";
3991        max-width: "1080px";
3992        margin: "0px auto";
3993    }
3994    pub c_euv_doc_content {
3995        // Two parallel children — the article body and the
3996        // `c_euv_doc_tail` wrapper (pagination + footer). The flex column
3997        // distributes them at the two ends:
3998        //   - when the article is shorter than the column's intrinsic
3999        //     height, `justify-content: space-between` pushes the tail to
4000        //     the bottom edge;
4001        //   - when the article is longer, the tail sits right after the
4002        //     article in normal flow (because content height exceeds
4003        //     min-height, there's no remaining space to distribute).
4004        // `min-height: 100vh` stretches the column to at least one full
4005        // viewport tall — without this, a short article would leave the
4006        // tail directly under the body instead of at the bottom of the
4007        // viewport.
4008        flex: "1";
4009        min-width: "0px";
4010        max-width: var!(content-max-width);
4011        display: "flex";
4012        flex-direction: "column";
4013        justify-content: "space-between";
4014        min-height: "100vh";
4015    }
4016    pub c_euv_doc_tail {
4017        // Plain block wrapper that groups pagination + footer into one
4018        // flex child. With `display: contents` the wrapper would be
4019        // skipped and the two siblings would behave as direct children
4020        // of `c_euv_doc_content` — breaking the two-parallel-containers
4021        // contract that `justify-content: space-between` relies on.
4022        display: "block";
4023    }
4024    pub c_euv_doc_toc {
4025        width: "200px";
4026        flex-shrink: "0";
4027        // Pin the TOC column to the viewport while the main content scrolls.
4028        // The sticky scroll container is `c_app_main` (the overflow:auto
4029        // wrapper), so `top: 0` keeps the TOC aligned with the top of the
4030        // scrollable area for the whole article. The column is left at its
4031        // natural flex stretch height (= the article's content height) so
4032        // the sticky range covers the whole main column — without the stretch
4033        // the column would shrink to its content height and the sticky would
4034        // disengage as soon as the TOC's bottom exits the viewport.
4035        position: "sticky";
4036        top: "0px";
4037        padding-top: var!(padding-main-top);
4038        @media ((max-width: 1100px)) {
4039            display: "none";
4040        }
4041    }
4042}