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