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