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_counter_value_row {
1041        display: "flex";
1042        align-items: "center";
1043        gap: var!(gap-element);
1044        min-height: var!(min-height-base);
1045        padding: format!("0px {}", var!(space-lg));
1046        word-break: "break-all";
1047        overflow-wrap: "anywhere";
1048    }
1049
1050    pub c_badge_row {
1051        display: "flex";
1052        gap: var!(gap-inline);
1053        flex-wrap: "wrap";
1054        align-items: "center";
1055    }
1056
1057    pub c_badge_hint {
1058        margin-bottom: var!(gap-component);
1059        color: "inherit";
1060        opacity: "1";
1061        font-size: var!(font-base);
1062    }
1063
1064    // ═══════════════════════════════════════════════════════════════════════════
1065    // Home Page
1066    // ═══════════════════════════════════════════════════════════════════════════
1067
1068    pub c_text_ellipsis {
1069        overflow: "hidden";
1070        text-overflow: "ellipsis";
1071        white-space: "nowrap";
1072    }
1073
1074    pub c_info_row {
1075        display: "flex";
1076        align-items: "center";
1077        gap: var!(space-md);
1078        padding: format!("{} 0", var!(space-sm));
1079        overflow: "hidden";
1080    }
1081
1082    pub c_info_label {
1083        font-size: var!(font-sm);
1084        font-weight: "500";
1085        color: var!(muted-foreground);
1086        min-width: "72px";
1087        flex-shrink: "0";
1088        letter-spacing: "0.02em";
1089    }
1090
1091    pub c_info_value {
1092        c_text_ellipsis();
1093        font-size: var!(font-base);
1094        font-weight: "600";
1095        color: var!(foreground);
1096        font-family: "ui-monospace, monospace";
1097        flex: "1";
1098    }
1099
1100    pub c_info_link {
1101        c_text_ellipsis();
1102        font-size: var!(font-base);
1103        font-weight: "600";
1104        color: var!(accent);
1105        font-family: "ui-monospace, monospace";
1106        flex: "1";
1107        text-decoration: "none";
1108        transition: format!("opacity {} {}", var!(duration-fast), var!(ease-out));
1109        :hover {
1110            opacity: "1";
1111        }
1112    }
1113
1114    // ═══════════════════════════════════════════════════════════════════════════
1115    // Camera Page
1116    // ═══════════════════════════════════════════════════════════════════════════
1117
1118    pub c_camera_video_container {
1119        margin: format!("{} 0", var!(space-lg));
1120    }
1121
1122    pub c_camera_video_active {
1123        width: "100%";
1124        background: "#000";
1125        aspect-ratio: "16 / 9";
1126        object-fit: "cover";
1127        border: format!("2px solid {}", var!(accent));
1128        box-sizing: "border-box";
1129    }
1130
1131    pub c_camera_video_hidden {
1132        width: "100%";
1133        aspect-ratio: "16 / 9";
1134        display: "none";
1135    }
1136
1137    pub c_camera_video_placeholder {
1138        width: "100%";
1139        aspect-ratio: "16 / 9";
1140        border: format!("2px dashed {}", var!(border));
1141        display: "flex";
1142        align-items: "center";
1143        justify-content: "center";
1144        box-sizing: "border-box";
1145    }
1146
1147    pub c_camera_placeholder_content {
1148        display: "flex";
1149        flex-direction: "column";
1150        align-items: "center";
1151        gap: var!(space-md);
1152    }
1153
1154    pub c_camera_placeholder_icon {
1155        font-size: var!(font-4xl);
1156        opacity: "1";
1157    }
1158
1159    pub c_camera_placeholder_text {
1160        font-size: var!(font-base);
1161        color: "inherit";
1162        opacity: "1";
1163    }
1164
1165    pub c_camera_error_box {
1166        margin: format!("{} 0px", var!(gap-component));
1167        color: var!(foreground);
1168        font-size: var!(font-base);
1169        word-break: "break-all";
1170        overflow-wrap: "break-word";
1171        box-sizing: "border-box";
1172    }
1173
1174    pub c_camera_scan_result_box {
1175        margin-top: var!(gap-component);
1176        box-sizing: "border-box";
1177    }
1178
1179    pub c_camera_scan_result_label {
1180        font-size: var!(font-sm);
1181        font-weight: "600";
1182        color: var!(foreground);
1183        margin-bottom: var!(space-xs);
1184    }
1185
1186    pub c_camera_scan_result_value {
1187        font-size: var!(font-base);
1188        color: "inherit";
1189        word-break: "break-all";
1190        overflow-wrap: "break-word";
1191    }
1192
1193    // ═══════════════════════════════════════════════════════════════════════════
1194    // Canvas Drawing Board
1195    // ═══════════════════════════════════════════════════════════════════════════
1196
1197    pub c_canvas_preview_container {
1198        margin: format!("{} 0", var!(space-lg));
1199        overflow: "hidden";
1200        border: format!("2px solid {}", var!(border));
1201        background: "#ffffff";
1202        aspect-ratio: "9 / 16";
1203        display: "flex";
1204        align-items: "center";
1205        justify-content: "center";
1206        box-sizing: "border-box";
1207    }
1208
1209    pub c_canvas_placeholder {
1210        color: var!(muted-foreground);
1211        font-size: var!(font-sm);
1212        text-align: "center";
1213        padding: var!(space-lg);
1214    }
1215
1216    pub c_canvas_preview_image {
1217        width: "100%";
1218        height: "100%";
1219        object-fit: "cover";
1220        display: "block";
1221    }
1222
1223    pub c_canvas_container_fullscreen {
1224        width: "100%";
1225        height: "100%";
1226        background: var!(background);
1227        display: "flex";
1228        flex-direction: "column";
1229        position: "fixed";
1230        top: "0";
1231        left: "0";
1232        z-index: "10002";
1233        padding: format!("{} {} {} {}", var!(padding-shell-top), var!(space-lg), var!(padding-shell-bottom), var!(space-lg));
1234        box-sizing: "border-box";
1235    }
1236
1237    pub c_canvas_drawing_fullscreen_wrapper {
1238        flex: "1";
1239        display: "flex";
1240        align-items: "center";
1241        justify-content: "center";
1242        overflow: "hidden";
1243        padding: var!(space-xs);
1244    }
1245
1246    pub c_canvas_drawing_fullscreen {
1247        border: format!("2px solid {}", var!(border));
1248        display: "block";
1249        cursor: "crosshair";
1250        touch-action: "none";
1251    }
1252
1253    pub c_canvas_fullscreen_toolbar {
1254        display: "flex";
1255        flex-direction: "column";
1256        align-items: "stretch";
1257        width: "100%";
1258        padding: format!("{} {}", var!(space-xs), "0px");
1259        flex-shrink: "0";
1260        gap: var!(space-xs);
1261    }
1262
1263    pub c_canvas_fullscreen_toolbar_row_top {
1264        display: "flex";
1265        align-items: "center";
1266        height: var!(mobile-header-height);
1267        width: "100%";
1268        gap: var!(space-sm);
1269    }
1270
1271    pub c_canvas_fullscreen_toolbar_color_wrapper {
1272        display: "flex";
1273        align-items: "center";
1274        justify-content: "center";
1275        flex: "1";
1276        min-width: "0";
1277    }
1278
1279    pub c_canvas_color_input_fullscreen {
1280        width: "100%";
1281        height: "42px";
1282        border: format!("1px solid {}", var!(border));
1283        cursor: "pointer";
1284        padding: format!("{}", var!(space-xs));
1285    }
1286
1287    pub c_canvas_fullscreen_toolbar_row_bottom {
1288        display: "flex";
1289        align-items: "center";
1290        width: "100%";
1291    }
1292
1293    pub c_canvas_fullscreen_range_input {
1294        flex: "1 1 0%";
1295        min-width: "120px";
1296        cursor: "pointer";
1297        -webkit-appearance: "none";
1298        appearance: "none";
1299        border: "none";
1300        outline: "none";
1301        height: "24px";
1302        ::-webkit-slider-runnable-track {
1303            height: "6px";
1304            background: format!("linear-gradient(to right, {} 0%, {} var(--value,50%), {} var(--value,50%), {} 100%)", var!(foreground), var!(foreground), var!(border), var!(border));
1305            border-radius: "3px";
1306            border: "none";
1307        }
1308        ::-webkit-slider-thumb {
1309            width: "20px";
1310            height: "20px";
1311            background: var!(background);
1312            border: format!("2px solid {}", var!(accent));
1313            border-radius: "50%";
1314            cursor: "pointer";
1315            -webkit-appearance: "none";
1316            margin-top: "-7px";
1317        }
1318        ::-moz-range-track {
1319            height: "6px";
1320            background: format!("linear-gradient(to right, {} 0%, {} var(--value,50%), {} var(--value,50%), {} 100%)", var!(foreground), var!(foreground), var!(border), var!(border));
1321            border-radius: "3px";
1322            border: "none";
1323        }
1324        ::-moz-range-thumb {
1325            width: "20px";
1326            height: "20px";
1327            background: var!(background);
1328            border: format!("2px solid {}", var!(accent));
1329            border-radius: "50%";
1330            cursor: "pointer";
1331        }
1332    }
1333
1334    pub c_canvas_fullscreen_toolbar_button {
1335        flex: "0 0 auto";
1336        overflow: "hidden";
1337    }
1338
1339    // ═══════════════════════════════════════════════════════════════════════════
1340    // Game Fullscreen (2D / 3D)
1341    // ═══════════════════════════════════════════════════════════════════════════
1342
1343    // Fullscreen overlay container for the 2D and 3D game pages.
1344    //
1345    // Mirrors `c_canvas_container_fullscreen` so the safe-area caching
1346    // pass in `UseEuvLayout::apply_cached_insets` can pick this selector
1347    // up alongside the canvas one. Differs in that the game overlay holds
1348    // the *same* `<canvas>` element that the inline page mounts (no
1349    // canvas re-creation), so the running game loop, balls, cubes, FPS
1350    // counter and other reactive state survive the fullscreen toggle
1351    // without reset.
1352    pub c_game_container_fullscreen {
1353        width: "100%";
1354        height: "100%";
1355        background: var!(background);
1356        display: "flex";
1357        flex-direction: "column";
1358        position: "fixed";
1359        top: "0";
1360        left: "0";
1361        z-index: "10002";
1362        padding: format!(
1363        "{} {} {} {}",
1364        var!(padding-shell-top),
1365        var!(space-lg),
1366        var!(padding-shell-bottom),
1367        var!(space-lg)
1368        );
1369        box-sizing: "border-box";
1370    }
1371
1372    // Toolbar wrapping the fullscreen exit button on game pages.
1373    //
1374    // Game pages only need an `Exit` button here (no color picker / line
1375    // width control like the canvas drawing board), so the layout is a
1376    // single horizontal row at the bottom of the overlay.
1377    pub c_game_fullscreen_toolbar {
1378        display: "flex";
1379        align-items: "center";
1380        justify-content: "flex-end";
1381        width: "100%";
1382        padding: format!("{} {} {} {}", var!(space-xs), var!(space-lg), var!(space-xs), var!(space-lg));
1383        flex-shrink: "0";
1384        gap: var!(space-sm);
1385        box-sizing: "border-box";
1386    }
1387
1388    // Wrapper that fills the fullscreen game container with the canvas.
1389    //
1390    // The game's `<canvas>` backing buffer is 600x400 (3:2). The canvas
1391    // itself has `width: 100%; height: 100%` so it fills this wrapper
1392    // exactly, and `object-fit: contain` on the canvas class makes the
1393    // browser uniformly scale the backing buffer to fit while preserving
1394    // its 3:2 aspect ratio. Without `object-fit: contain`, the canvas
1395    // would be stretched to whatever shape the wrapper has, making balls
1396    // render as horizontally-ovoid ellipses (e.g. on 1280x800 viewports
1397    // → 1.6:1, slightly squashed vertically). The letterbox bars appear
1398    // inside the canvas element rather than around an outer wrapper, so
1399    // the canvas always fills the fullscreen container with the backing
1400    // buffer uniformly scaled to its native aspect ratio.
1401    pub c_game_fullscreen_canvas_letterbox {
1402        position: "relative";
1403        width: "100%";
1404        max-width: "100%";
1405        max-height: "100%";
1406        height: "100%";
1407        display: "flex";
1408        align-items: "center";
1409        justify-content: "center";
1410    }
1411
1412    // ═══════════════════════════════════════════════════════════════════════════
1413    // Custom Attrs Demo
1414    // ═══════════════════════════════════════════════════════════════════════════
1415
1416    pub c_custom_attrs_demo {
1417        // Use the theme foreground token (not `inherit`) so the text inside
1418        // the dynamic demo block stays readable when the block itself
1419        // applies a user-supplied background (e.g. `background-color: #000000`)
1420        // that otherwise paints the inherited text the same colour.
1421        color: var!(foreground);
1422        box-sizing: "border-box";
1423    }
1424
1425    pub c_demo_text {
1426        color: var!(foreground);
1427        margin-bottom: var!(gap-component);
1428    }
1429
1430    pub c_demo_text_muted {
1431        color: var!(foreground);
1432        opacity: "1";
1433        font-size: var!(font-base);
1434        margin-bottom: "0px";
1435    }
1436
1437    // ═══════════════════════════════════════════════════════════════════════════
1438    // Async / Loading States
1439    // ═══════════════════════════════════════════════════════════════════════════
1440
1441    pub c_loading_container {
1442        display: "flex";
1443        align-items: "center";
1444        justify-content: "center";
1445        gap: var!(gap-component);
1446        margin: format!("{} 0px", var!(gap-component));
1447        box-sizing: "border-box";
1448    }
1449
1450    pub c_spinner {
1451        width: "28px";
1452        height: "28px";
1453        border: format!("3px solid {}", var!(accent-muted));
1454        border-top: format!("3px solid {}", var!(accent));
1455        border-radius: "50%";
1456        flex-shrink: "0";
1457        animation: "euv-spin 0.8s linear infinite";
1458    }
1459
1460    pub c_loading_text_col {
1461        display: "flex";
1462        flex-direction: "column";
1463        gap: var!(space-xs);
1464    }
1465
1466    pub c_loading_title {
1467        color: var!(foreground);
1468        font-size: var!(font-md);
1469        font-weight: "500";
1470    }
1471
1472    pub c_loading_subtitle {
1473        color: var!(muted-foreground);
1474        font-size: var!(font-base);
1475    }
1476
1477    pub c_loading_overlay(background: &str) {
1478        position: "absolute";
1479        top: "0";
1480        left: "0";
1481        width: "100%";
1482        height: "100%";
1483        display: "flex";
1484        flex-direction: "column";
1485        align-items: "center";
1486        justify-content: "center";
1487        gap: var!(gap-component);
1488        background: background;
1489        z-index: "1";
1490        box-sizing: "border-box";
1491    }
1492
1493    pub c_error_container {
1494        display: "flex";
1495        align-items: "center";
1496        gap: var!(gap-element);
1497        margin-top: var!(gap-component);
1498        box-sizing: "border-box";
1499    }
1500
1501    pub c_error_icon {
1502        width: "20px";
1503        height: "20px";
1504        display: "flex";
1505        align-items: "center";
1506        justify-content: "center";
1507        flex-shrink: "0";
1508        color: var!(foreground);
1509        font-size: var!(font-sm);
1510        font-weight: "700";
1511    }
1512
1513    pub c_error_text {
1514        color: var!(foreground);
1515        font-size: var!(font-base);
1516    }
1517
1518    pub c_data_box {
1519        margin: format!("{} 0px", var!(gap-component));
1520        box-sizing: "border-box";
1521    }
1522
1523    pub c_data_pre {
1524        color: var!(foreground);
1525        font-size: var!(font-base);
1526        margin: "0px";
1527        white-space: "pre-wrap";
1528        word-break: "break-all";
1529        font-family: "ui-monospace, monospace";
1530    }
1531
1532    pub c_fetch_hint {
1533        color: "inherit";
1534        opacity: "1";
1535        font-size: var!(font-base);
1536        margin-bottom: var!(gap-component);
1537    }
1538
1539    // ═══════════════════════════════════════════════════════════════════════════
1540    // Conditional Rendering Demo
1541    // ═══════════════════════════════════════════════════════════════════════════
1542
1543    pub c_toggle_content {
1544        margin-top: var!(gap-component);
1545        color: "inherit";
1546    }
1547
1548    pub c_toggle_title {
1549        margin-top: "0px";
1550        color: var!(accent);
1551        font-size: var!(font-md);
1552    }
1553
1554    pub c_role_button_row {
1555        display: "flex";
1556        flex-wrap: "nowrap";
1557        gap: var!(gap-element);
1558        margin-bottom: var!(gap-component);
1559    }
1560
1561    pub c_role_guest_text {
1562        color: var!(foreground);
1563        font-size: var!(font-base);
1564    }
1565
1566    pub c_role_user_text {
1567        color: var!(foreground);
1568        font-size: var!(font-base);
1569    }
1570
1571    pub c_role_admin_text {
1572        color: var!(foreground);
1573        font-size: var!(font-base);
1574    }
1575
1576    // ═══════════════════════════════════════════════════════════════════════════
1577    // Tabs
1578    // ═══════════════════════════════════════════════════════════════════════════
1579
1580    pub c_tab_bar {
1581        display: "flex";
1582        border-bottom: format!("1px dashed {}", var!(border));
1583        margin-bottom: var!(gap-component);
1584        gap: var!(gap-element);
1585        @media ((max-width: 767px)) {
1586            flex-wrap: "wrap";
1587        }
1588    }
1589
1590    pub c_tab_item_active {
1591        padding: format!("{} {}", var!(space-md), var!(space-xl));
1592        cursor: "pointer";
1593        border-bottom: format!("2px solid {}", var!(accent));
1594        color: var!(text-on-accent);
1595        background: var!(accent);
1596        font-size: var!(font-base);
1597        font-weight: "500";
1598    }
1599
1600    pub c_tab_item_inactive {
1601        padding: format!("{} {}", var!(space-md), var!(space-xl));
1602        cursor: "pointer";
1603        border-bottom: "2px solid transparent";
1604        color: "inherit";
1605        font-size: var!(font-base);
1606        font-weight: "500";
1607        :hover {
1608            background: var!(accent-muted);
1609            color: var!(accent);
1610        }
1611    }
1612
1613    pub c_tab_content {
1614        padding: format!("{} 0px", var!(gap-element));
1615    }
1616
1617    pub c_tab_text {
1618        color: "inherit";
1619        font-size: var!(font-base);
1620        margin-bottom: var!(gap-element);
1621    }
1622
1623    pub c_tab_text_muted {
1624        color: "inherit";
1625        opacity: "1";
1626        font-size: var!(font-base);
1627    }
1628
1629    pub c_tab_text_input {
1630        color: "inherit";
1631        font-size: var!(font-base);
1632        margin-bottom: var!(gap-component);
1633    }
1634
1635    // ═══════════════════════════════════════════════════════════════════════════
1636    // List
1637    // ═══════════════════════════════════════════════════════════════════════════
1638
1639    pub c_list_input {
1640        width: "100%";
1641        flex: "1";
1642        height: "42px";
1643        padding: format!("0px {}", var!(space-lg));
1644        border: format!("1px solid {}", var!(border));
1645        font-size: var!(font-base);
1646        line-height: "normal";
1647        box-sizing: "border-box";
1648        outline: "none";
1649        color: var!(foreground);
1650        appearance: "none";
1651        -webkit-appearance: "none";
1652        -moz-appearance: "none";
1653        vertical-align: "middle";
1654        :hover {
1655            border-color: var!(accent);
1656            background: var!(accent-muted);
1657        }
1658        :focus {
1659            outline: "none";
1660            border-color: var!(accent);
1661            background: var!(accent-muted);
1662        }
1663    }
1664
1665    pub c_list_input_error {
1666        width: "100%";
1667        flex: "1";
1668        height: "42px";
1669        padding: format!("0px {}", var!(space-lg));
1670        border: format!("1px solid {}", var!(foreground));
1671        font-size: var!(font-base);
1672        line-height: "normal";
1673        box-sizing: "border-box";
1674        outline: "none";
1675        color: var!(foreground);
1676        appearance: "none";
1677        -webkit-appearance: "none";
1678        -moz-appearance: "none";
1679        vertical-align: "middle";
1680        :focus {
1681            outline: "none";
1682            border-color: var!(foreground);
1683        }
1684    }
1685
1686    pub c_list_error_text {
1687        color: var!(foreground);
1688        font-size: var!(font-base);
1689        margin: format!("{} 0px", var!(gap-element));
1690    }
1691
1692    pub c_inline_input_button_wrap {
1693        flex-shrink: "0";
1694    }
1695
1696    pub c_list_ul {
1697        list-style: "none";
1698        padding: "0px";
1699        margin: "0px";
1700        margin-top: var!(gap-component);
1701    }
1702
1703    pub c_list_item {
1704        display: "flex";
1705        justify-content: "space-between";
1706        align-items: "center";
1707        gap: var!(gap-component);
1708        min-height: var!(min-height-base);
1709        margin: format!("{} 0px", var!(gap-element));
1710    }
1711
1712    pub c_list_item_text {
1713        flex: "1";
1714        overflow: "hidden";
1715        text-overflow: "ellipsis";
1716        white-space: "nowrap";
1717        font-size: var!(font-base);
1718        color: "inherit";
1719        min-width: "0";
1720    }
1721
1722    pub c_list_item_button {
1723        max-width: "120px";
1724        flex-shrink: "0";
1725    }
1726
1727    // ═══════════════════════════════════════════════════════════════════════════
1728    // Log / Console Display
1729    // ═══════════════════════════════════════════════════════════════════════════
1730
1731    pub c_log_container {
1732        font-family: "ui-monospace, monospace";
1733        font-size: var!(font-base);
1734        margin-top: "0px";
1735        color: var!(foreground);
1736    }
1737
1738    pub c_log_item {
1739        padding: format!("{} 0px", var!(space-sm));
1740        font-size: var!(font-base);
1741        color: var!(foreground);
1742    }
1743
1744    // ═══════════════════════════════════════════════════════════════════════════
1745    // 404 Not Found
1746    // ═══════════════════════════════════════════════════════════════════════════
1747
1748    pub c_render_count_text {
1749        font-size: var!(font-base);
1750        color: "inherit";
1751        margin-bottom: var!(gap-component);
1752    }
1753
1754    // ═══════════════════════════════════════════════════════════════════════════
1755    // Event Demo
1756    // ═══════════════════════════════════════════════════════════════════════════
1757
1758    pub c_event_result {
1759        font-size: var!(font-base);
1760        color: "inherit";
1761        margin-top: var!(gap-element);
1762    }
1763
1764    pub c_event_highlight {
1765        font-weight: "600";
1766        color: var!(accent);
1767    }
1768
1769    pub c_event_info_grid {
1770        display: "grid";
1771        grid-template-columns: "1fr 1fr";
1772        gap: var!(gap-element);
1773        margin-top: var!(gap-component);
1774        @media ((max-width: 767px)) {
1775            grid-template-columns: "1fr";
1776            gap: var!(gap-element);
1777        }
1778    }
1779
1780    pub c_event_info_row {
1781        display: "flex";
1782        align-items: "center";
1783        gap: var!(space-sm);
1784        overflow: "hidden";
1785    }
1786
1787    pub c_event_info_label {
1788        font-size: var!(font-base);
1789        font-weight: "600";
1790        color: var!(foreground);
1791        flex-shrink: "0";
1792    }
1793
1794    pub c_event_info_value {
1795        c_text_ellipsis();
1796        font-size: var!(font-base);
1797        font-weight: "600";
1798        color: var!(accent);
1799        font-family: "ui-monospace, monospace";
1800        flex: "1";
1801    }
1802
1803    pub c_event_mouse_area {
1804        min-height: "120px";
1805        padding: format!("{} 0px", var!(space-xl));
1806        border: format!("2px dashed {}", var!(border));
1807        cursor: "crosshair";
1808        text-align: "center";
1809        user-select: "none";
1810        color: "inherit";
1811    }
1812
1813    pub c_event_drag_zone {
1814        min-height: "100px";
1815        padding: format!("{} 0px", var!(space-xl));
1816        border: format!("2px dashed {}", var!(border));
1817        text-align: "center";
1818        user-select: "none";
1819        color: var!(foreground);
1820    }
1821
1822    pub c_event_drag_zone_active {
1823        min-height: "100px";
1824        padding: format!("{} 0px", var!(space-xl));
1825        border: format!("2px dashed {}", var!(border));
1826        text-align: "center";
1827        user-select: "none";
1828        color: var!(foreground);
1829    }
1830
1831    pub c_event_drag_item {
1832        display: "inline-block";
1833        padding: format!("{} {}", var!(space-sm), var!(space-xl));
1834        background: var!(accent);
1835        color: var!(text-on-accent);
1836        font-size: var!(font-base);
1837        font-weight: "500";
1838        cursor: "grab";
1839        margin: var!(space-sm);
1840    }
1841
1842    pub c_event_drop_zone {
1843        border: format!("2px dashed {}", var!(border));
1844        padding: format!("{} {}", var!(space-4xl), var!(space-xl));
1845        text-align: "center";
1846        cursor: "pointer";
1847    }
1848
1849    pub c_event_drop_zone_active {
1850        border: format!("2px dashed {}", var!(accent));
1851        padding: format!("{} {}", var!(space-4xl), var!(space-xl));
1852        text-align: "center";
1853        cursor: "pointer";
1854        background: var!(accent-muted);
1855    }
1856
1857    pub c_event_drop_icon {
1858        font-size: var!(font-5xl);
1859        display: "block";
1860        padding-bottom: var!(space-md);
1861    }
1862
1863    pub c_event_drop_text {
1864        font-size: var!(font-lg);
1865        font-weight: "500";
1866        color: "inherit";
1867        padding-bottom: var!(space-md);
1868    }
1869
1870    pub c_event_drop_hint {
1871        font-size: var!(font-base);
1872        color: "inherit";
1873        opacity: "1";
1874        margin: "0px";
1875    }
1876
1877    pub c_event_wheel_zone {
1878        min-height: "120px";
1879        padding: format!("{} 0px", var!(space-xl));
1880        border: format!("2px dashed {}", var!(border));
1881        text-align: "center";
1882        overflow: "auto";
1883        color: var!(foreground);
1884    }
1885
1886    pub c_event_clipboard_area {
1887        color: var!(foreground);
1888    }
1889
1890    pub c_event_touch_zone {
1891        min-height: "120px";
1892        padding: format!("{} 0px", var!(space-xl));
1893        border: format!("2px dashed {}", var!(accent));
1894        text-align: "center";
1895        touch-action: "none";
1896        user-select: "none";
1897        color: var!(accent);
1898    }
1899
1900    pub c_event_form_area {
1901        padding: format!("{} 0px", var!(space-lg));
1902        color: var!(foreground);
1903    }
1904
1905    pub c_event_media_area {
1906        padding: format!("{} 0px", var!(space-lg));
1907        color: var!(foreground);
1908        max-width: "100%";
1909        overflow: "hidden";
1910    }
1911
1912    pub c_event_audio {
1913        width: "100%";
1914        max-width: "100%";
1915    }
1916
1917    pub c_event_video_area {
1918        color: var!(foreground);
1919        width: "100%";
1920        overflow: "hidden";
1921    }
1922
1923    pub c_event_video {
1924        width: "100%";
1925        max-width: "100%";
1926    }
1927
1928    pub c_event_image_area {
1929        padding: format!("{} 0px", var!(space-lg));
1930        color: "inherit";
1931        width: "100%";
1932        overflow: "hidden";
1933        display: "flex";
1934        flex-direction: "column";
1935        align-items: "center";
1936        gap: var!(space-md);
1937    }
1938
1939    pub c_event_image {
1940        width: "200px";
1941        max-width: "100%";
1942        object-fit: "contain";
1943        display: "block";
1944    }
1945
1946    pub c_event_url_text {
1947        text-align: "center";
1948        font-size: var!(font-sm);
1949        color: "inherit";
1950        opacity: "1";
1951        font-family: "ui-monospace, monospace";
1952        word-break: "break-all";
1953        width: "100%";
1954    }
1955
1956    // ═══════════════════════════════════════════════════════════════════════════
1957    // Timer Demo
1958    // ═══════════════════════════════════════════════════════════════════════════
1959
1960    pub c_timer_display {
1961        text-align: "center";
1962        padding: var!(space-xl);
1963        margin: format!("{} 0px", var!(gap-component));
1964        color: "inherit";
1965    }
1966
1967    pub c_timer_value {
1968        font-size: var!(font-base);
1969        font-weight: "700";
1970        color: var!(accent);
1971        letter-spacing: "0.04em";
1972        font-family: "ui-monospace, monospace";
1973    }
1974
1975    pub c_timer_controls {
1976        display: "flex";
1977        flex-wrap: "wrap";
1978        gap: var!(gap-element);
1979    }
1980
1981    pub c_timer_done {
1982        text-align: "center";
1983        margin-top: var!(gap-component);
1984        font-size: var!(font-lg);
1985        font-weight: "600";
1986        color: var!(foreground);
1987    }
1988
1989    // ═══════════════════════════════════════════════════════════════════════════
1990    // Modal
1991    // ═══════════════════════════════════════════════════════════════════════════
1992
1993    pub c_modal_overlay {
1994        position: "fixed";
1995        top: "0px";
1996        left: "0px";
1997        width: "100%";
1998        height: "100%";
1999        background: var!(bg-overlay);
2000        contain: "layout style paint";
2001        display: "flex";
2002        align-items: "center";
2003        justify-content: "center";
2004        z-index: "1000";
2005        animation: format!("euv-fade-in {} {}", var!(duration-modal-overlay), var!(ease-out));
2006        @media ((max-width: 767px)) {
2007            align-items: "center";
2008            justify-content: "center";
2009        }
2010    }
2011
2012    pub c_modal_content {
2013        background: var!(background);
2014        padding: "0px";
2015        max-width: "480px";
2016        width: "90%";
2017        animation: format!("euv-scale-in-modal {} {}", var!(duration-modal-content), var!(ease-bounce));
2018        overflow: "hidden";
2019        color: var!(foreground);
2020        box-sizing: "border-box";
2021        @media ((max-width: 767px)) {
2022            max-width: "100%";
2023            width: "calc(100% - 32px)";
2024            max-height: "85vh";
2025            overflow-y: "auto";
2026        }
2027    }
2028
2029    pub c_modal_header {
2030        display: "flex";
2031        justify-content: "space-between";
2032        align-items: "center";
2033        padding: format!("{} {} 0px {}", var!(space-md), var!(space-xl), var!(space-xl));
2034    }
2035
2036    pub c_modal_title {
2037        margin: "0px";
2038        font-size: var!(font-xl);
2039        font-weight: "600";
2040        color: "inherit";
2041    }
2042
2043    pub c_modal_body {
2044        padding: format!("0px {} {} {}", var!(space-xl), var!(space-md), var!(space-xl));
2045        color: "inherit";
2046    }
2047
2048    pub c_modal_actions {
2049        display: "flex";
2050        flex-wrap: "wrap";
2051        gap: var!(space-md);
2052        margin: format!("{} 0px", var!(space-md));
2053    }
2054
2055    // ═══════════════════════════════════════════════════════════════════════════
2056    // Animation Demo
2057    // ═══════════════════════════════════════════════════════════════════════════
2058
2059    pub c_anim_fade_in {
2060        margin-top: var!(gap-component);
2061        animation: format!("euv-fade-in 0.5s {}", var!(ease-out));
2062        font-size: var!(font-base);
2063        color: "inherit";
2064    }
2065
2066    pub c_anim_spin_container {
2067        display: "flex";
2068        justify-content: "center";
2069        align-items: "center";
2070        margin: format!("{} 0px", var!(space-lg));
2071        min-height: "80px";
2072    }
2073
2074    pub c_anim_spin {
2075        font-size: var!(font-5xl);
2076        animation: "euv-spin 1.5s linear infinite";
2077        display: "inline-block";
2078        @media ((max-width: 767px)) {
2079            font-size: var!(font-4xl);
2080        }
2081    }
2082
2083    pub c_anim_spin_stopped {
2084        font-size: var!(font-5xl);
2085        display: "inline-block";
2086        opacity: "1";
2087        @media ((max-width: 767px)) {
2088            font-size: var!(font-4xl);
2089        }
2090    }
2091
2092    pub c_anim_pulse_container {
2093        display: "flex";
2094        justify-content: "center";
2095        align-items: "center";
2096        margin: format!("{} 0px", var!(space-lg));
2097        min-height: "80px";
2098    }
2099
2100    pub c_anim_pulse {
2101        font-size: var!(font-5xl);
2102        animation: "euv-pulse 1.5s ease-in-out infinite";
2103        display: "inline-block";
2104        color: var!(foreground);
2105        @media ((max-width: 767px)) {
2106            font-size: var!(font-4xl);
2107        }
2108    }
2109
2110    pub c_anim_pulse_stopped {
2111        font-size: var!(font-5xl);
2112        display: "inline-block";
2113        opacity: "1";
2114        color: var!(foreground);
2115        @media ((max-width: 767px)) {
2116            font-size: var!(font-4xl);
2117        }
2118    }
2119
2120    pub c_progress_container {
2121        width: "100%";
2122        height: "12px";
2123        margin: format!("{} 0px", var!(space-lg));
2124        overflow: "hidden";
2125    }
2126
2127    pub c_progress_bar_running {
2128        height: "100%";
2129        background: var!(accent);
2130        animation: format!("euv-progress 1.6s {} forwards", var!(ease-in-out));
2131    }
2132
2133    pub c_progress_bar_stopped {
2134        height: "100%";
2135        background: var!(accent);
2136        width: "0%";
2137    }
2138
2139    pub c_anim_scale_box {
2140        margin: format!("{} 0px", var!(gap-component));
2141        padding: var!(space-xl);
2142        background: var!(accent);
2143        cursor: "pointer";
2144        transition: format!("transform {} {}", var!(duration-normal), var!(ease-out));
2145    }
2146
2147    // ═══════════════════════════════════════════════════════════════════════════
2148    // Browser API Demo
2149    // ═══════════════════════════════════════════════════════════════════════════
2150
2151    pub c_browser_api_row {
2152        display: "grid";
2153        grid-template-columns: "1fr 1fr";
2154        gap: var!(gap-component);
2155        margin-bottom: var!(gap-component);
2156        @media ((max-width: 767px)) {
2157            grid-template-columns: "1fr";
2158        }
2159    }
2160
2161    pub c_browser_api_actions {
2162        display: "flex";
2163        flex-wrap: "wrap";
2164        gap: var!(gap-element);
2165        margin: format!("{} 0px", var!(gap-component));
2166    }
2167
2168    pub c_browser_result_box {
2169        margin-top: var!(gap-component);
2170        font-size: var!(font-base);
2171        word-break: "break-all";
2172        color: "inherit";
2173    }
2174
2175    pub c_browser_result_label {
2176        font-weight: "600";
2177        color: var!(accent);
2178    }
2179
2180    pub c_browser_result_value {
2181        color: "inherit";
2182    }
2183
2184    pub c_browser_info_grid {
2185        display: "grid";
2186        gap: var!(gap-component);
2187        margin-top: var!(gap-component);
2188        @media ((max-width: 767px)) {
2189            grid-template-columns: "1fr";
2190        }
2191    }
2192
2193    pub c_browser_info_item {
2194        display: "flex";
2195        flex-direction: "column";
2196        gap: var!(space-xs);
2197        color: "inherit";
2198    }
2199
2200    pub c_browser_info_label {
2201        font-size: var!(font-sm);
2202        font-weight: "600";
2203        color: "inherit";
2204        opacity: "1";
2205        text-transform: "uppercase";
2206        letter-spacing: "0.05em";
2207    }
2208
2209    pub c_browser_info_value {
2210        font-size: var!(font-base);
2211        color: "inherit";
2212        word-break: "break-all";
2213        font-family: "ui-monospace, monospace";
2214    }
2215
2216    // ═══════════════════════════════════════════════════════════════════════════
2217    // VConsole Panel
2218    // ═══════════════════════════════════════════════════════════════════════════
2219
2220    pub c_vconsole_badge {
2221        position: "absolute";
2222        top: "-6px";
2223        right: "-8px";
2224        min-width: "18px";
2225        height: "18px";
2226        background: var!(background);
2227        color: var!(foreground);
2228        font-size: "10px";
2229        font-weight: "600";
2230        display: "flex";
2231        align-items: "center";
2232        justify-content: "center";
2233        padding: format!("0px {}", var!(space-xs));
2234        border: format!("1px solid {}", var!(accent));
2235        pointer-events: "none";
2236        transition: format!("transform {} {}, opacity {} {}", var!(duration-normal), var!(ease-out), var!(duration-normal), var!(ease-out));
2237    }
2238
2239    pub c_vconsole_overlay {
2240        position: "fixed";
2241        top: "0px";
2242        left: "0px";
2243        right: "0px";
2244        bottom: "0px";
2245        z-index: "10000";
2246        background: var!(bg-overlay);
2247        contain: "layout style paint";
2248        transition: format!("opacity {} {}", var!(duration-overlay), var!(ease-out));
2249    }
2250
2251    pub c_vconsole_overlay_hidden {
2252        opacity: "0";
2253        pointer-events: "none";
2254    }
2255
2256    pub c_vconsole_panel {
2257        position: "fixed";
2258        bottom: "0px";
2259        left: "0px";
2260        right: "0px";
2261        height: format!("calc(76vh - {})", var!(safe-area-inset-bottom));
2262        background: var!(background);
2263        z-index: "10001";
2264        display: "flex";
2265        flex-direction: "column";
2266        contain: "layout style paint";
2267        will-change: "transform";
2268        transition: format!("transform {} {}", var!(duration-overlay), var!(ease-out));
2269        overflow: "hidden";
2270        padding: format!("{} {}", var!(padding-main-top), var!(padding-main-horizontal));
2271        @media ((max-width: 767px)) {
2272            padding: format!("{} {}", var!(space-md), var!(padding-main-horizontal-mobile));
2273        }
2274    }
2275
2276    pub c_vconsole_panel_closed {
2277        transform: "translateY(100%)";
2278        will-change: "auto";
2279    }
2280
2281    pub c_vconsole_fab {
2282        position: "fixed";
2283        bottom: format!("calc(20px + {})", var!(safe-area-inset-bottom));
2284        right: var!(padding-main-horizontal);
2285        z-index: "9999";
2286        @media ((max-width: 767px)) {
2287            bottom: format!("calc(16px + {})", var!(safe-area-inset-bottom));
2288            right: var!(padding-main-horizontal-mobile);
2289        }
2290    }
2291
2292    pub c_vconsole_header {
2293        display: "flex";
2294        justify-content: "space-between";
2295        align-items: "center";
2296        flex-shrink: "0";
2297    }
2298
2299    pub c_vconsole_title {
2300        color: var!(foreground);
2301        font-size: var!(font-md);
2302        font-weight: "600";
2303        margin: "0px";
2304        letter-spacing: "0.03em";
2305        display: "flex";
2306        align-items: "center";
2307        gap: var!(space-sm);
2308    }
2309
2310    pub c_vconsole_title_dot {
2311        width: "8px";
2312        height: "8px";
2313        background: var!(accent);
2314        display: "inline-block";
2315        animation: "euv-pulse 2s ease-in-out infinite";
2316    }
2317
2318    pub c_vconsole_header_actions {
2319        display: "flex";
2320        gap: var!(space-sm);
2321        align-items: "center";
2322    }
2323
2324    pub c_vconsole_clear_button {
2325        display: "inline-flex";
2326        justify-content: "center";
2327        align-items: "center";
2328        color: var!(foreground);
2329        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
2330        font-size: var!(font-xs);
2331        font-weight: "600";
2332        cursor: "pointer";
2333        text-align: "center";
2334        border: format!("1.5px solid {}", var!(border));
2335        margin-left: "auto";
2336        :focus-visible {
2337            outline: "none";
2338        }
2339    }
2340
2341    pub c_vconsole_close_button {
2342        display: "inline-flex";
2343        justify-content: "center";
2344        align-items: "center";
2345        color: var!(foreground);
2346        padding: format!("{} {}", var!(space-xs), var!(space-md));
2347        cursor: "pointer";
2348        font-size: var!(font-sm);
2349        font-weight: "400";
2350        text-align: "center";
2351        white-space: "nowrap";
2352        user-select: "none";
2353        -webkit-user-select: "none";
2354        vertical-align: "middle";
2355        outline: "none";
2356        transition: format!("all {} {}", var!(duration-fast), var!(ease-out));
2357        :hover {
2358            border-color: var!(foreground);
2359            color: var!(foreground);
2360            background: var!(background);
2361        }
2362        :focus-visible {
2363            outline: "none";
2364        }
2365        :active {
2366            background: "transparent";
2367            color: var!(foreground);
2368            border-color: var!(border);
2369        }
2370    }
2371
2372    pub c_vconsole_body {
2373        flex: "1";
2374        overflow-y: "auto";
2375        contain: "content";
2376        padding-bottom: var!(space-md);
2377        font-family: "ui-monospace, monospace";
2378        font-size: var!(font-xs);
2379    }
2380
2381    pub c_vconsole_log_item {
2382        display: "flex";
2383        align-items: "center";
2384        padding: format!("{} 0px", var!(space-sm));
2385        border-bottom: format!("1px dashed {}", var!(border));
2386        color: var!(foreground);
2387        font-size: var!(font-xs);
2388        word-break: "break-all";
2389    }
2390
2391    pub c_vconsole_empty {
2392        color: var!(muted-foreground);
2393        font-size: var!(font-xs);
2394        text-align: "center";
2395        padding: format!("{} 0px", var!(space-4xl));
2396        overflow: "hidden";
2397    }
2398
2399    pub c_vconsole_empty_hidden {
2400        height: "0";
2401        overflow: "hidden";
2402        padding: "0";
2403    }
2404
2405    pub c_vconsole_log_list {
2406        overflow: "hidden";
2407    }
2408
2409    pub c_vconsole_log_list_hidden {
2410        height: "0";
2411        overflow: "hidden";
2412    }
2413
2414    pub c_vconsole_count {
2415        color: var!(muted-foreground);
2416        font-size: var!(font-sm);
2417        font-weight: "400";
2418    }
2419
2420    pub c_vconsole_filter_bar {
2421        display: "flex";
2422        gap: var!(space-sm);
2423        padding: format!("{} 0px", var!(space-sm));
2424        border-bottom: format!("1px dashed {}", var!(border));
2425        flex-shrink: "0";
2426        align-items: "center";
2427    }
2428
2429    pub c_vconsole_filter_badge {
2430        display: "inline-flex";
2431        justify-content: "center";
2432        align-items: "center";
2433        color: var!(text-on-accent);
2434        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
2435        border: format!("1px solid {}", var!(accent));
2436        font-size: var!(font-xs);
2437        font-weight: "600";
2438        cursor: "pointer";
2439        text-align: "center";
2440        background: var!(accent);
2441        :focus-visible {
2442            outline: "none";
2443        }
2444    }
2445
2446    pub c_vconsole_filter_badge_outline {
2447        display: "inline-flex";
2448        justify-content: "center";
2449        align-items: "center";
2450        color: var!(foreground);
2451        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
2452        font-size: var!(font-xs);
2453        font-weight: "600";
2454        cursor: "pointer";
2455        text-align: "center";
2456        border: format!("1.5px solid {}", var!(border));
2457    }
2458
2459    pub c_vconsole_level_badge {
2460        padding: format!("{} {}", var!(space-2xs), var!(space-sm));
2461        font-size: var!(font-xs);
2462        margin-right: var!(space-sm);
2463        letter-spacing: "0.05em";
2464        color: var!(foreground);
2465        border: "1px solid currentColor";
2466        wrap: "nowrap";
2467        flex-shrink: "0";
2468    }
2469
2470    // ═══════════════════════════════════════════════════════════════════════════
2471    // Mobile Layout
2472    // ═══════════════════════════════════════════════════════════════════════════
2473
2474    pub c_mobile_header {
2475        display: "flex";
2476        align-items: "center";
2477        justify-content: "space-between";
2478        padding: format!("var(--euv-mobile-safe-top, 0px) 0px 0px {}", var!(space-lg));
2479        height: format!("calc({} + var(--euv-mobile-safe-top, 0px))", var!(mobile-header-height));
2480        flex-shrink: "0";
2481        position: "sticky";
2482        top: "0px";
2483        z-index: "100";
2484        contain: "content";
2485        background: var!(background);
2486        border-bottom: format!("1px solid {}", var!(border));
2487    }
2488
2489    pub c_mobile_header_left {
2490        display: "flex";
2491        align-items: "center";
2492        gap: format!("{}", var!(space-md));
2493    }
2494
2495    pub c_mobile_header_logo {
2496        display: "flex";
2497        align-items: "center";
2498        gap: format!("{}", var!(space-sm));
2499        text-decoration: "none";
2500        color: var!(foreground);
2501    }
2502
2503    pub c_mobile_menu_button {
2504        width: "40px";
2505        height: "40px";
2506        border: "none";
2507        cursor: "pointer";
2508        font-size: "22px";
2509        font-weight: "700";
2510        display: "flex";
2511        align-items: "center";
2512        justify-content: "center";
2513        color: var!(foreground);
2514        padding: "0px";
2515        :active {
2516            background: "transparent";
2517            color: var!(foreground);
2518        }
2519    }
2520
2521    pub c_mobile_theme_button {
2522        width: "40px";
2523        height: "40px";
2524        border: "none";
2525        cursor: "pointer";
2526        display: "flex";
2527        align-items: "center";
2528        justify-content: "center";
2529        padding: "0px";
2530        :active {
2531            background: "transparent";
2532        }
2533    }
2534
2535    pub c_mobile_menu_button_active {
2536        width: "40px";
2537        height: "40px";
2538        border: "none";
2539        cursor: "pointer";
2540        font-size: "22px";
2541        font-weight: "700";
2542        display: "flex";
2543        align-items: "center";
2544        justify-content: "center";
2545        color: var!(accent);
2546        padding: "0px";
2547        :active {
2548            background: var!(background);
2549            color: var!(accent);
2550        }
2551    }
2552
2553    pub c_mobile_drawer_close_button {
2554        width: "32px";
2555        height: "32px";
2556        border: "none";
2557        cursor: "pointer";
2558        font-size: "18px";
2559        font-weight: "500";
2560        display: "flex";
2561        align-items: "center";
2562        justify-content: "center";
2563        color: var!(muted-foreground);
2564        padding: "0px";
2565        transition: format!("color {} {}", var!(duration-fast), var!(ease-out));
2566        :hover {
2567            color: var!(foreground);
2568        }
2569        :active {
2570            color: var!(muted-foreground);
2571        }
2572    }
2573
2574    pub c_mobile_overlay {
2575        position: "fixed";
2576        top: "0px";
2577        left: "0px";
2578        width: "100%";
2579        height: "100%";
2580        background: var!(bg-overlay);
2581        z-index: "200";
2582        contain: "layout style paint";
2583        transition: format!("opacity {} {}", var!(duration-overlay), var!(ease-out));
2584    }
2585
2586    pub c_mobile_overlay_hidden {
2587        opacity: "0";
2588        pointer-events: "none";
2589    }
2590
2591    pub c_mobile_nav_drawer {
2592        position: "fixed";
2593        top: "0px";
2594        left: "0px";
2595        width: "240px";
2596        max-width: "100%";
2597        height: "100%";
2598        background: var!(background);
2599        z-index: "201";
2600        display: "flex";
2601        flex-direction: "column";
2602        padding-top: "var(--euv-mobile-safe-top, 0px)";
2603        padding-bottom: var!(padding-shell-bottom);
2604        contain: "layout style paint";
2605        will-change: "transform";
2606        transition: format!("transform {} {}", var!(duration-overlay), var!(ease-out));
2607        overflow: "hidden";
2608    }
2609
2610    pub c_mobile_nav_drawer_closed {
2611        transform: "translateX(-100%)";
2612    }
2613
2614    pub c_mobile_nav_drawer_header {
2615        display: "flex";
2616        align-items: "center";
2617        justify-content: "space-between";
2618        padding: format!("0px {}", var!(space-lg));
2619        height: var!(mobile-header-height);
2620        flex-shrink: "0";
2621        position: "relative";
2622        ::after {
2623            content: "''";
2624            position: "absolute";
2625            bottom: "0px";
2626            left: var!(space-lg);
2627            right: var!(space-lg);
2628            height: "1px";
2629            background: format!("linear-gradient(90deg, transparent, {}, transparent)", var!(border));
2630        }
2631    }
2632
2633    pub c_mobile_main {
2634        c_app_main();
2635        ::-webkit-scrollbar {
2636            width: "0px";
2637        }
2638    }
2639
2640    // ═══════════════════════════════════════════════════════════════════════════
2641    // Keep-Alive Demo
2642    // ═══════════════════════════════════════════════════════════════════════════
2643
2644    pub c_keep_alive_tab_bar {
2645        display: "flex";
2646        border-bottom: format!("1px dashed {}", var!(border));
2647        margin-bottom: var!(gap-component);
2648        gap: var!(gap-element);
2649    }
2650
2651    pub c_keep_alive_tab_panel {
2652        padding: format!("{} 0px", var!(gap-element));
2653    }
2654
2655    pub c_keep_alive_panel_title {
2656        margin-top: "0px";
2657        color: var!(accent);
2658        font-size: var!(font-md);
2659        margin-bottom: var!(gap-element);
2660    }
2661
2662    pub c_keep_alive_demo_text {
2663        color: "inherit";
2664        font-size: var!(font-base);
2665        margin-bottom: var!(gap-component);
2666    }
2667
2668    pub c_keep_alive_counter_display {
2669        display: "flex";
2670        justify-content: "center";
2671        align-items: "center";
2672        margin: format!("{} 0px", var!(space-xl));
2673    }
2674
2675    pub c_keep_alive_counter_value {
2676        font-size: var!(font-base);
2677        font-weight: "700";
2678        font-variant-numeric: "tabular-nums";
2679        color: var!(accent);
2680        text-align: "center";
2681    }
2682
2683    pub c_keep_alive_counter_controls {
2684        display: "flex";
2685        flex-wrap: "wrap";
2686        gap: format!("{}", var!(space-md));
2687    }
2688
2689    pub c_keep_alive_form_group {
2690        margin-bottom: var!(gap-component);
2691    }
2692
2693    pub c_keep_alive_form_preview {
2694        margin-top: var!(gap-component);
2695        background: var!(accent-muted);
2696    }
2697
2698    pub c_keep_alive_preview_label {
2699        font-size: var!(font-base);
2700        font-weight: "600";
2701        color: var!(accent);
2702        margin: format!("0px 0px {} 0px", var!(space-xs));
2703    }
2704
2705    // ═══════════════════════════════════════════════════════════════════════════
2706    // File Upload
2707    // ═══════════════════════════════════════════════════════════════════════════
2708
2709    pub c_file_upload_input_hidden {
2710        position: "absolute";
2711        width: "1px";
2712        height: "1px";
2713        padding: "0px";
2714        margin: "-1px";
2715        overflow: "hidden";
2716        clip: "rect(0, 0, 0, 0)";
2717        white-space: "nowrap";
2718        border: "0px";
2719    }
2720
2721    pub c_file_upload_options {
2722        margin: format!("{} 0px", var!(gap-component));
2723    }
2724
2725    pub c_file_upload_item {
2726        display: "flex";
2727        align-items: "center";
2728        gap: format!("{}", var!(space-md));
2729        margin: format!("{} 0px", var!(space-sm));
2730        font-size: var!(font-base);
2731        color: "inherit";
2732    }
2733
2734    pub c_file_upload_item_index {
2735        font-size: var!(font-sm);
2736        font-weight: "600";
2737        color: var!(accent);
2738        min-width: "24px";
2739    }
2740
2741    pub c_file_upload_item_name {
2742        color: "inherit";
2743        word-break: "break-all";
2744    }
2745
2746    // ═══════════════════════════════════════════════════════════════════════════
2747    // Binding Demo
2748    // ═══════════════════════════════════════════════════════════════════════════
2749
2750    pub c_binding_child_box {
2751        display: "flex";
2752        flex-direction: "column";
2753        gap: var!(gap-component);
2754        margin-top: var!(gap-component);
2755    }
2756
2757    pub c_binding_child_label {
2758        font-size: var!(font-base);
2759        font-weight: "600";
2760        color: var!(accent);
2761        text-transform: "uppercase";
2762        letter-spacing: "0.05em";
2763    }
2764
2765    pub c_binding_parent_box {
2766        display: "flex";
2767        flex-direction: "column";
2768        gap: var!(gap-component);
2769        margin-top: var!(gap-component);
2770    }
2771
2772    pub c_binding_section_title {
2773        margin-top: var!(gap-component);
2774        margin-bottom: var!(gap-element);
2775        color: var!(accent);
2776        font-size: var!(font-md);
2777        font-weight: "600";
2778    }
2779
2780    pub c_binding_temp_converter {
2781        display: "flex";
2782        align-items: "flex-end";
2783        gap: var!(gap-component);
2784        flex-wrap: "wrap";
2785        margin-top: var!(gap-component);
2786    }
2787
2788    pub c_binding_temp_field {
2789        flex: "1";
2790        min-width: "120px";
2791    }
2792
2793    pub c_binding_temp_arrow {
2794        font-size: "20px";
2795        font-weight: "700";
2796        color: var!(accent);
2797        padding-bottom: "10px";
2798    }
2799
2800    pub c_binding_color_mixer {
2801        margin-top: var!(gap-component);
2802    }
2803
2804    pub c_binding_color_preview {
2805        width: "100%";
2806        height: "80px";
2807        display: "flex";
2808        align-items: "center";
2809        justify-content: "center";
2810        margin-bottom: var!(gap-component);
2811    }
2812
2813    pub c_binding_color_hex {
2814        font-family: "ui-monospace, monospace";
2815        font-size: var!(font-xl);
2816        font-weight: "700";
2817        color: var!(text-on-accent);
2818        letter-spacing: "0.02em";
2819    }
2820
2821    pub c_binding_slider_row {
2822        display: "flex";
2823        align-items: "center";
2824        gap: format!("{}", var!(space-md));
2825        margin-bottom: var!(space-sm);
2826    }
2827
2828    pub c_binding_slider_label {
2829        font-size: var!(font-base);
2830        font-weight: "700";
2831        min-width: var!(font-sm);
2832    }
2833
2834    pub c_binding_slider {
2835        flex: "1";
2836        height: "24px";
2837        padding: "0px";
2838        cursor: "pointer";
2839        -webkit-appearance: "none";
2840        appearance: "none";
2841        border: "none";
2842        outline: "none";
2843        ::-webkit-slider-runnable-track {
2844            height: "6px";
2845            background: format!("linear-gradient(to right, {} 0%, {} var(--value,50%), {} var(--value,50%), {} 100%)", var!(foreground), var!(foreground), var!(border), var!(border));
2846            border-radius: "3px";
2847            border: "none";
2848        }
2849        ::-webkit-slider-thumb {
2850            width: "20px";
2851            height: "20px";
2852            background: var!(background);
2853            border: format!("2px solid {}", var!(accent));
2854            border-radius: "50%";
2855            cursor: "pointer";
2856            -webkit-appearance: "none";
2857            margin-top: "-7px";
2858        }
2859        : active::-webkit-slider-thumb {
2860            transform: "scale(0.92)";
2861        }
2862        ::-moz-range-track {
2863            height: "6px";
2864            background: format!("linear-gradient(to right, {} 0%, {} var(--value,50%), {} var(--value,50%), {} 100%)", var!(foreground), var!(foreground), var!(border), var!(border));
2865            border-radius: "3px";
2866            border: "none";
2867        }
2868        ::-moz-range-thumb {
2869            width: "20px";
2870            height: "20px";
2871            background: var!(background);
2872            border: format!("2px solid {}", var!(accent));
2873            border-radius: "50%";
2874            cursor: "pointer";
2875        }
2876        : active::-moz-range-thumb {
2877            transform: "scale(0.92)";
2878        }
2879    }
2880
2881    pub c_binding_slider_value {
2882        font-size: var!(font-base);
2883        font-weight: "500";
2884        color: "inherit";
2885        min-width: "32px";
2886        text-align: "right";
2887        font-family: "ui-monospace, monospace";
2888    }
2889
2890    pub c_binding_typed_prop_value {
2891        font-family: "ui-monospace, monospace";
2892        font-size: var!(font-base);
2893        font-weight: "600";
2894        color: var!(accent);
2895        padding: format!("1px {}", var!(space-sm));
2896    }
2897
2898    pub c_binding_typed_prop_group {
2899        display: "flex";
2900        align-items: "center";
2901        gap: var!(space-sm);
2902    }
2903
2904    pub c_binding_typed_warning {
2905        font-size: var!(font-base);
2906        font-weight: "500";
2907        color: var!(foreground);
2908        margin-bottom: "0px";
2909    }
2910
2911    pub c_binding_form_label {
2912        display: "block";
2913        color: "inherit";
2914        font-weight: "500";
2915        font-size: var!(font-base);
2916    }
2917
2918    pub c_binding_demo_text {
2919        color: "inherit";
2920        margin: "0px"
2921    }
2922
2923    pub c_binding_compact_button {
2924        display: "inline-flex";
2925        justify-content: "center";
2926        align-items: "center";
2927        height: "42px";
2928        padding: format!("0px {}", var!(space-md));
2929        background: var!(accent);
2930        color: var!(text-on-accent);
2931        border: format!("1px solid {}", var!(accent));
2932        cursor: "pointer";
2933        font-size: var!(font-sm);
2934        font-weight: "600";
2935        outline: "none";
2936        white-space: "nowrap";
2937        user-select: "none";
2938        -webkit-user-select: "none";
2939        box-sizing: "border-box";
2940        :hover {
2941            background: var!(accent);
2942        }
2943        :focus-visible {
2944            outline: "none";
2945        }
2946        :active {
2947            background: var!(accent);
2948            color: var!(text-on-accent);
2949            border-color: var!(accent);
2950        }
2951    }
2952
2953    // ═══════════════════════════════════════════════════════════════════════════
2954    // Custom Attrs - Dynamic Style
2955    // ═══════════════════════════════════════════════════════════════════════════
2956
2957    pub c_attrs_dynamic_demo(prop_key: &str, prop_value: &str) {
2958        {
2959            prop_key
2960        }
2961        : prop_value;
2962        // No layout defaults: this class lives on a `<p>` whose own margin /
2963        // spacing is controlled by its parent's typography rules, and pinning
2964        // any colour here would shadow the user-supplied dynamic property.
2965        // Users are expected to set `color` / `background` / `font-*` /
2966        // etc. via the two CSS Property Key / Value inputs above; whatever
2967        // they type becomes the literal CSS rule applied to the paragraph.
2968    }
2969
2970    // ═══════════════════════════════════════════════════════════════════════════
2971    // Dynamic Component Demo
2972    // ═══════════════════════════════════════════════════════════════════════════
2973
2974    pub c_dynamic_component_tab_bar {
2975        display: "flex";
2976        flex-wrap: "wrap";
2977        gap: var!(gap-element);
2978        margin-bottom: var!(gap-component);
2979    }
2980
2981    pub c_dynamic_component_panel {
2982        display: "block";
2983        min-height: var!(min-height-sm);
2984        margin-top: var!(gap-component);
2985    }
2986
2987    // ═══════════════════════════════════════════════════════════════════════════
2988    // Virtual List
2989    // ═══════════════════════════════════════════════════════════════════════════
2990
2991    pub c_virtual_list_status {
2992        display: "flex";
2993        gap: var!(gap-component);
2994        padding: format!("{} 0px", var!(gap-component));
2995        flex-wrap: "nowrap";
2996        overflow: "hidden";
2997        text-overflow: "ellipsis";
2998        white-space: "nowrap";
2999        @media ((max-width: 767px)) {
3000            gap: var!(gap-component-mobile);
3001        }
3002    }
3003
3004    pub c_virtual_list_status_item {
3005        font-size: var!(font-base);
3006        color: "inherit";
3007        overflow: "hidden";
3008        text-overflow: "ellipsis";
3009        white-space: "nowrap";
3010    }
3011
3012    pub c_virtual_list_status_value {
3013        font-weight: "700";
3014        color: var!(accent);
3015        font-family: "ui-monospace, monospace";
3016    }
3017
3018    pub c_virtual_list_container {
3019        flex: "1";
3020        height: "666px";
3021        max-height: "666px";
3022        overflow-y: "auto";
3023    }
3024
3025    pub c_virtual_list_card {
3026        flex: "1";
3027        padding: var!(space-xl);
3028        color: var!(foreground);
3029        display: "flex";
3030        flex-direction: "column";
3031        @media ((max-width: 767px)) {
3032            padding: var!(space-lg);
3033        }
3034    }
3035
3036    pub c_virtual_list_row {
3037        display: "flex";
3038        align-items: "center";
3039        gap: var!(space-lg);
3040        height: "100%";
3041        box-sizing: "border-box";
3042    }
3043
3044    pub c_virtual_list_row_index {
3045        min-width: "36px";
3046        font-size: var!(font-sm);
3047        font-weight: "600";
3048        color: var!(accent);
3049        font-family: "ui-monospace, monospace";
3050        flex-shrink: "0";
3051        display: "flex";
3052        align-items: "center";
3053    }
3054
3055    pub c_virtual_list_row_label {
3056        font-size: var!(font-base);
3057        font-weight: "500";
3058        color: "inherit";
3059        min-width: "120px";
3060        flex-shrink: "0";
3061        overflow: "hidden";
3062        text-overflow: "ellipsis";
3063        white-space: "nowrap";
3064        display: "flex";
3065        align-items: "center";
3066    }
3067
3068    pub c_virtual_list_row_description {
3069        font-size: var!(font-base);
3070        color: "inherit";
3071        opacity: "1";
3072        overflow: "hidden";
3073        text-overflow: "ellipsis";
3074        white-space: "nowrap";
3075        flex: "1";
3076        display: "flex";
3077        align-items: "center";
3078    }
3079
3080    // ═══════════════════════════════════════════════════════════════════════════
3081    // Unified Layout Primitives
3082    // ═══════════════════════════════════════════════════════════════════════════
3083
3084    pub c_element_stack {
3085        display: "flex";
3086        flex-direction: "column";
3087        gap: var!(gap-element);
3088    }
3089
3090    pub c_switcher {
3091        display: "flex";
3092        gap: var!(gap-component);
3093        flex-wrap: "wrap";
3094        @media ((max-width: 767px)) {
3095            flex-direction: "column";
3096            gap: var!(gap-component-mobile);
3097        }
3098    }
3099
3100    pub c_switcher_col {
3101        flex: "1";
3102        min-width: "200px";
3103        @media ((max-width: 767px)) {
3104            min-width: "100%";
3105        }
3106    }
3107
3108    // ═══════════════════════════════════════════════════════════════════════════
3109    // Unified Description / Hint Text
3110    // ═══════════════════════════════════════════════════════════════════════════
3111
3112    pub c_hint {
3113        color: "inherit";
3114        opacity: "1";
3115        font-size: var!(font-base);
3116        margin-bottom: var!(gap-component);
3117    }
3118
3119    // ═══════════════════════════════════════════════════════════════════════════
3120    // Network Demo
3121    // ═══════════════════════════════════════════════════════════════════════════
3122
3123    pub c_net_messages_empty {
3124        color: "inherit";
3125        opacity: "1";
3126        padding: var!(space-xl);
3127        text-align: "center";
3128        font-size: var!(font-base);
3129    }
3130
3131    pub c_net_messages_list {
3132        display: "flex";
3133        flex-direction: "column";
3134        gap: var!(space-xs);
3135    }
3136
3137    pub c_net_message_item {
3138        display: "flex";
3139        align-items: "baseline";
3140        gap: var!(gap-element);
3141        justify-content: "space-between";
3142    }
3143
3144    pub c_net_message_index {
3145        color: var!(accent);
3146        font-size: var!(font-sm);
3147        font-weight: "600";
3148        white-space: "nowrap";
3149        flex-shrink: "0";
3150    }
3151
3152    pub c_net_message_data {
3153        color: "inherit";
3154        font-size: var!(font-base);
3155        word-break: "break-all";
3156        overflow-wrap: "break-word";
3157        flex: "1";
3158        min-width: "0";
3159    }
3160
3161    // ═══════════════════════════════════════════════════════════════════════════
3162    // WebSocket Demo
3163    // ═══════════════════════════════════════════════════════════════════════════
3164
3165    pub c_ws_message_input {
3166        width: "100%";
3167        flex: "1";
3168        height: "42px";
3169        padding: format!("0px {}", var!(space-lg));
3170        color: var!(foreground);
3171        border: format!("1px solid {}", var!(border));
3172        font-size: var!(font-base);
3173        line-height: "normal";
3174        box-sizing: "border-box";
3175        outline: "none";
3176        appearance: "none";
3177        -webkit-appearance: "none";
3178        -moz-appearance: "none";
3179        vertical-align: "middle";
3180        :hover {
3181            border-color: var!(accent);
3182            background: var!(accent-muted);
3183        }
3184        :focus {
3185            outline: "none";
3186            border-color: var!(accent);
3187            background: var!(accent-muted);
3188        }
3189    }
3190
3191    pub c_ws_message_time {
3192        color: var!(foreground);
3193        font-size: var!(font-sm);
3194        white-space: "nowrap";
3195        flex-shrink: "0";
3196        margin-left: "auto";
3197    }
3198
3199    // ═══════════════════════════════════════════════════════════════════════════
3200    // Sticky & CSS Effects Demo
3201    // ═══════════════════════════════════════════════════════════════════════════
3202
3203    // ═══════════════════════════════════════════════════════════════════════════
3204    // Home Page — Section
3205    // ═══════════════════════════════════════════════════════════════════════════
3206
3207    pub c_home {
3208        position: "relative";
3209        text-align: "center";
3210        margin-bottom: var!(space-xl);
3211        flex: "1";
3212        display: "flex";
3213        flex-direction: "column";
3214        justify-content: "center";
3215        @media ((max-width: 767px)) {
3216            margin-bottom: var!(space-lg);
3217            flex: "0 0 auto";
3218            justify-content: "flex-start";
3219        }
3220    }
3221
3222    pub c_home_content {
3223        position: "relative";
3224        z-index: "1";
3225    }
3226
3227    pub c_home_badge_row {
3228        display: "inline-flex";
3229        align-items: "center";
3230        gap: var!(space-sm);
3231        margin-bottom: var!(space-md);
3232    }
3233
3234    pub c_home_badge {
3235        display: "inline-flex";
3236        justify-content: "center";
3237        align-items: "center";
3238        padding: format!("{} {}", var!(space-xs), var!(space-sm));
3239        color: var!(accent);
3240        font-size: var!(font-xs);
3241        font-weight: "600";
3242        letter-spacing: "0.05em";
3243        border: format!("1px solid {}", var!(accent));
3244    }
3245
3246    pub c_home_title {
3247        font-size: var!(font-5xl);
3248        font-weight: "800";
3249        letter-spacing: "-0.03em";
3250        margin: "0px";
3251        color: var!(foreground);
3252        margin-bottom: var!(space-xs);
3253        @media ((max-width: 767px)) {
3254            font-size: var!(font-4xl);
3255        }
3256    }
3257
3258    pub c_home_subtitle {
3259        font-size: var!(font-lg);
3260        color: var!(foreground);
3261        margin: "0px auto";
3262        max-width: "520px";
3263        margin-bottom: var!(space-lg);
3264        @media ((max-width: 767px)) {
3265            font-size: var!(font-base);
3266        }
3267    }
3268
3269    pub c_home_actions {
3270        display: "flex";
3271        gap: var!(space-md);
3272        justify-content: "center";
3273        flex-wrap: "wrap";
3274    }
3275
3276    pub c_home_btn_primary {
3277        display: "inline-flex";
3278        justify-content: "center";
3279        align-items: "center";
3280        gap: var!(space-sm);
3281        padding: format!("{} {}", var!(space-sm), var!(space-2xl));
3282        background: var!(accent);
3283        color: var!(text-on-accent);
3284        font-size: var!(font-base);
3285        font-weight: "600";
3286        text-decoration: "none";
3287        border: "1.5px solid transparent";
3288        cursor: "pointer";
3289        letter-spacing: "0.01em";
3290        vertical-align: "middle";
3291        min-height: var!(min-height-sm);
3292        :focus-visible {
3293            outline: "none";
3294        }
3295        :active {
3296            background: var!(accent);
3297            color: var!(text-on-accent);
3298            border-color: "1.5px solid transparent";
3299        }
3300    }
3301
3302    pub c_home_btn_secondary {
3303        display: "inline-flex";
3304        justify-content: "center";
3305        align-items: "center";
3306        gap: var!(space-sm);
3307        padding: format!("{} {}", var!(space-sm), var!(space-2xl));
3308        color: var!(accent);
3309        font-size: var!(font-base);
3310        font-weight: "600";
3311        text-decoration: "none";
3312        border: format!("1.5px solid {}", var!(accent));
3313        cursor: "pointer";
3314        letter-spacing: "0.01em";
3315        vertical-align: "middle";
3316        min-height: var!(min-height-sm);
3317        :focus-visible {
3318            outline: "none";
3319        }
3320        :active {
3321            background: "transparent";
3322            color: var!(accent);
3323            border-color: var!(accent);
3324        }
3325    }
3326
3327    // ═══════════════════════════════════════════════════════════════════════════
3328    // Home Page — Stats Row
3329    // ═══════════════════════════════════════════════════════════════════════════
3330
3331    pub c_home_stats {
3332        display: "grid";
3333        grid-template-columns: "repeat(4, 1fr)";
3334        gap: var!(space-md);
3335        margin-bottom: var!(space-xl);
3336        @media ((max-width: 767px)) {
3337            grid-template-columns: "repeat(2, 1fr)";
3338            gap: var!(space-sm);
3339        }
3340    }
3341
3342    pub c_home_stat_card {
3343        display: "flex";
3344        flex-direction: "column";
3345        align-items: "center";
3346        justify-content: "center";
3347        gap: var!(space-xs);
3348    }
3349
3350    pub c_home_stat_icon {
3351        font-size: var!(font-2xl);
3352    }
3353
3354    pub c_home_stat_value {
3355        font-size: var!(font-xl);
3356        font-weight: "800";
3357        color: var!(foreground);
3358        letter-spacing: "-0.01em";
3359    }
3360
3361    pub c_home_stat_label {
3362        font-size: var!(font-sm);
3363        color: var!(muted-foreground);
3364        font-weight: "500";
3365    }
3366
3367    // ═══════════════════════════════════════════════════════════════════════════
3368    // Home Page — Section & Feature Cards
3369    // ═══════════════════════════════════════════════════════════════════════════
3370
3371    pub c_home_section_title {
3372        font-size: var!(font-2xl);
3373        font-weight: "700";
3374        color: var!(foreground);
3375        margin: "0px";
3376        margin: format!("{} 0px", var!(gap-component));
3377        letter-spacing: "-0.02em";
3378    }
3379
3380    pub c_home_section_desc {
3381        font-size: var!(font-base);
3382        color: var!(foreground);
3383        margin: "0px";
3384        margin-bottom: var!(space-2xl);
3385    }
3386
3387    pub c_home_feature_grid {
3388        display: "grid";
3389        grid-template-columns: "repeat(2, 1fr)";
3390        gap: var!(space-md);
3391        @media ((max-width: 767px)) {
3392            grid-template-columns: "1fr";
3393        }
3394    }
3395
3396    pub c_feature_card {
3397        display: "flex";
3398        flex-direction: "column";
3399        gap: var!(space-sm);
3400        padding: "0px";
3401        overflow: "hidden";
3402    }
3403
3404    pub c_feature_header {
3405        display: "flex";
3406        align-items: "center";
3407        gap: var!(space-sm);
3408    }
3409
3410    pub c_feature_icon {
3411        font-size: var!(font-2xl);
3412        display: "flex";
3413        align-items: "center";
3414        justify-content: "center";
3415        line-height: "1";
3416        flex-shrink: "0";
3417    }
3418
3419    pub c_feature_name {
3420        font-size: var!(font-lg);
3421        font-weight: "600";
3422        color: var!(foreground);
3423        margin: "0px";
3424        overflow: "hidden";
3425        text-overflow: "ellipsis";
3426        white-space: "nowrap";
3427    }
3428
3429    pub c_feature_desc {
3430        font-size: var!(font-sm);
3431        color: var!(foreground);
3432        margin: "0px";
3433    }
3434
3435    // ═══════════════════════════════════════════════════════════════════════════
3436    // Global Utilities
3437    // ═══════════════════════════════════════════════════════════════════════════
3438
3439    // Dev-only readouts produced by `euv_debug`. The base wrapper
3440    // establishes the inline-flex layout so the label and the value
3441    // share a baseline; the `code` / `pre` value elements apply
3442    // monospace font and wrap behaviour for the two modes
3443    // (`expanded: false` = single-line `code`, `expanded: true` =
3444    // multi-line `pre`).
3445    pub c_debug {
3446        display: "flex";
3447        flex-direction: "row";
3448        align-items: "baseline";
3449        gap: var!(space-sm);
3450        padding: var!(space-xs);
3451        border: format!("1px dashed {}", var!(accent-muted));
3452        border-radius: var!(radius-sm);
3453        background: var!(surface-muted);
3454        font-family: "ui-monospace, SFMono-Regular, monospace";
3455        font-size: var!(font-sm);
3456        color: var!(foreground);
3457        margin: format!("{} 0px", var!(space-xs));
3458    }
3459
3460    pub c_debug_label {
3461        font-weight: "600";
3462        color: var!(accent);
3463        flex-shrink: "0";
3464    }
3465
3466    pub c_debug_value {
3467        font-family: "ui-monospace, SFMono-Regular, monospace";
3468        color: var!(foreground);
3469        margin: "0px";
3470    }
3471
3472    // ═══════════════════════════════════════════════════════════════════════════
3473    // euv_navbar
3474    // ═══════════════════════════════════════════════════════════════════════════
3475
3476    pub c_euv_navbar {
3477        position: "fixed";
3478        top: "0px";
3479        left: "0px";
3480        right: "0px";
3481        height: "56px";
3482        display: "flex";
3483        align-items: "center";
3484        gap: var!(gap-element);
3485        padding: format!("0px {}", var!(padding-main-horizontal));
3486        border-bottom: format!("1px solid {}", var!(border));
3487        background: var!(background);
3488        z-index: "100";
3489        @media ((max-width: 767px)) {
3490            padding: format!("0px {}", var!(padding-main-horizontal-mobile));
3491        }
3492    }
3493    pub c_euv_navbar_brand {
3494        display: "flex";
3495        align-items: "center";
3496        gap: var!(gap-element);
3497        font-size: var!(font-lg);
3498        font-weight: "700";
3499        letter-spacing: "-0.02em";
3500        color: var!(foreground);
3501        cursor: "pointer";
3502        flex-shrink: "0";
3503    }
3504    pub c_euv_navbar_logo {
3505        width: "32px";
3506        height: "32px";
3507        display: "flex";
3508        align-items: "center";
3509        justify-content: "center";
3510        background: var!(accent);
3511        color: var!(text-on-accent);
3512        font-size: var!(font-lg);
3513        flex-shrink: "0";
3514    }
3515    pub c_euv_navbar_links {
3516        display: "flex";
3517        align-items: "center";
3518        gap: var!(gap-section);
3519        margin-left: "auto";
3520        @media ((max-width: 767px)) {
3521            display: "none";
3522        }
3523    }
3524    pub c_euv_navbar_link {
3525        font-size: var!(font-sm);
3526        font-weight: "500";
3527        color: var!(foreground);
3528        padding: format!("{} {}", var!(space-xs), var!(space-sm));
3529        border-bottom: "2px solid transparent";
3530        cursor: "pointer";
3531        hover {
3532            color: var!(accent);
3533        }
3534    }
3535    pub c_euv_navbar_link_active {
3536        font-size: var!(font-sm);
3537        font-weight: "600";
3538        color: var!(accent);
3539        padding: format!("{} {}", var!(space-xs), var!(space-sm));
3540        border-bottom: format!("2px solid {}", var!(accent));
3541        cursor: "pointer";
3542    }
3543    pub c_euv_navbar_actions {
3544        display: "flex";
3545        align-items: "center";
3546        gap: var!(gap-element);
3547        margin-left: var!(gap-section);
3548        @media ((max-width: 767px)) {
3549            margin-left: "auto";
3550        }
3551    }
3552    pub c_euv_navbar_icon_button {
3553        width: "36px";
3554        height: "36px";
3555        display: "flex";
3556        align-items: "center";
3557        justify-content: "center";
3558        border: format!("1px dashed {}", var!(border));
3559        cursor: "pointer";
3560        font-size: var!(font-base);
3561        hover {
3562            background: var!(accent-muted);
3563        }
3564    }
3565    pub c_euv_navbar_menu_button {
3566        display: "none";
3567        width: "40px";
3568        height: "40px";
3569        align-items: "center";
3570        justify-content: "center";
3571        font-size: var!(font-xl);
3572        cursor: "pointer";
3573        transition: format!("background {} {}", var!(duration-fast), var!(ease-out));
3574        @media ((max-width: 767px)) {
3575            display: "flex";
3576        }
3577    }
3578    pub c_euv_navbar_menu_button_active {
3579        display: "none";
3580        width: "40px";
3581        height: "40px";
3582        align-items: "center";
3583        justify-content: "center";
3584        font-size: var!(font-xl);
3585        cursor: "pointer";
3586        background: var!(accent-muted);
3587        transition: format!("background {} {}", var!(duration-fast), var!(ease-out));
3588        @media ((max-width: 767px)) {
3589            display: "flex";
3590        }
3591    }
3592
3593    // ═══════════════════════════════════════════════════════════════════════════
3594    // euv_dropdown
3595    // ═══════════════════════════════════════════════════════════════════════════
3596
3597    pub c_euv_dropdown {
3598        position: "relative";
3599    }
3600    pub c_euv_dropdown_menu {
3601        position: "absolute";
3602        top: "44px";
3603        right: "0px";
3604    /* `width: 100%` instead of `min-width: 140px` so the menu
3605                                                                                                                                                           matches the dropdown container (and therefore the
3606                                                                                                                                                           trigger button) width exactly. With only `min-width`,
3607                                                                                                                                                           a trigger wider than 140px (e.g. the 206px-wide
3608                                                                                                                                                           nav-column locale switcher button) leaves a large
3609                                                                                                                                                           empty gap on the left of the menu, since `right: 0`
3610                                                                                                                                                           anchors only the right edge to the container. With
3611                                                                                                                                                           `width: 100%`, the menu's left edge lines up with the
3612                                                                                                                                                           trigger's left edge. The default minimum content width
3613                                                                                                                                                           is still guaranteed by the inner items' own padding,
3614                                                                                                                                                           so we keep the rule without an explicit min. */
3615        width: "100%";
3616        background: var!(background);
3617        border: format!("1px solid {}", var!(border));
3618        box-shadow: var!(shadow-accent-lg);
3619        flex-direction: "column";
3620        z-index: "101";
3621    }
3622    pub c_euv_dropdown_menu_open {
3623        display: "flex";
3624    }
3625    pub c_euv_dropdown_menu_closed {
3626        display: "none";
3627    }
3628    pub c_euv_dropdown_item {
3629        padding: format!("{} {}", var!(space-sm), var!(space-lg));
3630        font-size: var!(font-sm);
3631        text-align: "left";
3632        cursor: "pointer";
3633        hover {
3634            background: var!(accent-muted);
3635        }
3636    }
3637
3638    // ═══════════════════════════════════════════════════════════════════════════
3639    // euv_sidebar
3640    // ═══════════════════════════════════════════════════════════════════════════
3641
3642    pub c_euv_sidebar_group {
3643        margin-bottom: var!(space-xs);
3644    }
3645    pub c_euv_sidebar_group_title {
3646        display: "flex";
3647        align-items: "center";
3648        justify-content: "space-between";
3649        width: "100%";
3650        padding: format!("{} {}", var!(space-sm), var!(space-xl));
3651        font-size: var!(font-sm);
3652        font-weight: "600";
3653        cursor: "pointer";
3654        text-align: "left";
3655        hover {
3656            background: var!(accent-muted);
3657        }
3658    }
3659    pub c_euv_sidebar_group_arrow {
3660        font-size: var!(font-xs);
3661        color: var!(muted-foreground);
3662        transition: format!("transform {} {}", var!(duration-fast), var!(ease-out));
3663    }
3664    pub c_euv_sidebar_group_arrow_open {
3665        transform: "rotate(90deg)";
3666    }
3667    pub c_euv_sidebar_children {
3668        display: "flex";
3669        flex-direction: "column";
3670        padding-left: var!(space-md);
3671        border-left: format!("1px dashed {}", var!(border));
3672        margin-left: var!(space-sm);
3673        animation: format!("euv-fade-in {} {}", var!(duration-normal), var!(ease-out));
3674    }
3675    pub c_euv_sidebar_link {
3676        display: "block";
3677        padding: format!("{} {}", var!(space-sm), var!(space-xl));
3678        font-size: var!(font-sm);
3679        color: var!(foreground);
3680        cursor: "pointer";
3681        transition: format!("background {} {}", var!(duration-fast), var!(ease-out));
3682        hover {
3683            background: var!(accent-muted);
3684            color: var!(accent);
3685            box-shadow: format!("inset 4px 0px 0px {}", var!(accent));
3686        }
3687    }
3688    pub c_euv_sidebar_link_active {
3689        display: "block";
3690        padding: format!("{} {}", var!(space-sm), var!(space-xl));
3691        font-size: var!(font-sm);
3692        background: var!(accent);
3693        color: var!(text-on-accent);
3694        font-weight: "600";
3695        cursor: "pointer";
3696    }
3697
3698    // ═══════════════════════════════════════════════════════════════════════════
3699    // euv_toc
3700    // ═══════════════════════════════════════════════════════════════════════════
3701
3702    pub c_euv_toc {
3703        position: "sticky";
3704        top: "76px";
3705        display: "flex";
3706        flex-direction: "column";
3707        gap: var!(space-xs);
3708        border-left: format!("1px solid {}", var!(border));
3709        padding-left: var!(space-lg);
3710    }
3711    pub c_euv_toc_title {
3712        font-size: var!(font-xs);
3713        font-weight: "700";
3714        text-transform: "uppercase";
3715        letter-spacing: "0.08em";
3716        color: var!(muted-foreground);
3717        margin-bottom: var!(space-xs);
3718    }
3719    pub c_euv_toc_link {
3720        font-size: var!(font-sm);
3721        color: var!(muted-foreground);
3722        cursor: "pointer";
3723        line-height: "1.5";
3724        hover {
3725            color: var!(accent);
3726        }
3727    }
3728    pub c_euv_toc_link_nested {
3729        padding-left: var!(space-lg);
3730    }
3731
3732    // ═══════════════════════════════════════════════════════════════════════════
3733    // euv_pagination
3734    // ═══════════════════════════════════════════════════════════════════════════
3735
3736    pub c_euv_pagination {
3737        display: "flex";
3738        justify-content: "space-between";
3739        gap: var!(gap-component);
3740        margin-top: var!(space-4xl);
3741        @media ((max-width: 767px)) {
3742            flex-direction: "column";
3743        }
3744    }
3745    pub c_euv_pagination_link {
3746        flex: "1";
3747        border: format!("1px solid {}", var!(border));
3748        padding: var!(space-lg);
3749        cursor: "pointer";
3750        display: "flex";
3751        flex-direction: "column";
3752        gap: var!(space-2xs);
3753        hover {
3754            border-color: var!(accent);
3755        }
3756    }
3757    pub c_euv_pagination_label {
3758        font-size: var!(font-xs);
3759        color: var!(muted-foreground);
3760        text-transform: "uppercase";
3761        letter-spacing: "0.08em";
3762    }
3763    pub c_euv_pagination_text {
3764        font-size: var!(font-base);
3765        font-weight: "600";
3766        color: var!(accent);
3767    }
3768    pub c_euv_pagination_next {
3769        text-align: "right";
3770    }
3771    pub c_euv_pagination_spacer {
3772        flex: "1";
3773    }
3774
3775    // ═══════════════════════════════════════════════════════════════════════════
3776    // euv_drawer
3777    // ═══════════════════════════════════════════════════════════════════════════
3778
3779    pub c_euv_drawer_overlay {
3780        position: "fixed";
3781        top: "0px";
3782        left: "0px";
3783        right: "0px";
3784        bottom: "0px";
3785        background: var!(bg-overlay);
3786        z-index: "200";
3787        transition: format!("opacity {} {}, visibility {} {}", var!(duration-overlay), var!(ease-out), var!(duration-overlay), var!(ease-out));
3788    }
3789    pub c_euv_drawer_overlay_open {
3790        opacity: "1";
3791        visibility: "visible";
3792    }
3793    pub c_euv_drawer_overlay_closed {
3794        opacity: "0";
3795        visibility: "hidden";
3796    }
3797    pub c_euv_drawer {
3798        position: "fixed";
3799        top: "0px";
3800        left: "0px";
3801        bottom: "0px";
3802        width: "260px";
3803        background: var!(background);
3804        border-right: format!("1px solid {}", var!(border));
3805        z-index: "201";
3806        overflow-y: "auto";
3807        padding: var!(space-xl);
3808        transition: format!("transform {} {}, visibility {} {}", var!(duration-normal), var!(ease-out), var!(duration-normal), var!(ease-out));
3809    }
3810    pub c_euv_drawer_open {
3811        transform: "translateX(0px)";
3812        visibility: "visible";
3813    }
3814    pub c_euv_drawer_closed {
3815        transform: "translateX(-100%)";
3816        visibility: "hidden";
3817    }
3818
3819    // ═══════════════════════════════════════════════════════════════════════════
3820    // euv_markdown / euv_footer
3821    // ═══════════════════════════════════════════════════════════════════════════
3822
3823    pub c_euv_markdown {
3824        width: "100%";
3825        min-width: "0px";
3826    }
3827    pub c_euv_footer {
3828        margin-top: var!(space-7xl);
3829        padding: format!("{} 0px", var!(space-2xl));
3830        border-top: format!("1px dashed {}", var!(border));
3831        text-align: "center";
3832        font-size: var!(font-sm);
3833        color: var!(muted-foreground);
3834    }
3835
3836    // ═══════════════════════════════════════════════════════════════════════════
3837    // euv_result / euv_doc_layout
3838    // ═══════════════════════════════════════════════════════════════════════════
3839
3840    pub c_euv_result {
3841        display: "flex";
3842        flex-direction: "column";
3843        align-items: "center";
3844        justify-content: "center";
3845        text-align: "center";
3846        gap: var!(space-md);
3847        padding: format!("{} {}", var!(space-4xl), var!(space-md));
3848        min-height: "50vh";
3849    }
3850    pub c_euv_result_code {
3851        font-size: var!(font-6xl);
3852        font-weight: "700";
3853        line-height: "1";
3854        letter-spacing: "-0.02em";
3855    }
3856    pub c_euv_result_title {
3857        font-size: var!(font-2xl);
3858        font-weight: "600";
3859        margin: "0px";
3860    }
3861    pub c_euv_result_description {
3862        color: var!(muted-foreground);
3863        margin: "0px";
3864    }
3865    pub c_euv_result_actions {
3866        display: "flex";
3867        gap: var!(space-md);
3868        margin-top: var!(space-lg);
3869    }
3870
3871    pub c_euv_doc_layout {
3872        display: "flex";
3873        gap: var!(space-4xl);
3874        width: "100%";
3875        min-width: "0px";
3876        max-width: "1080px";
3877        margin: "0px auto";
3878    }
3879    pub c_euv_doc_content {
3880        flex: "1";
3881        min-width: "0px";
3882        max-width: var!(content-max-width);
3883    }
3884    pub c_euv_doc_toc {
3885        width: "200px";
3886        flex-shrink: "0";
3887        @media ((max-width: 1100px)) {
3888            display: "none";
3889        }
3890    }
3891}