Skip to main content

euv_ui/style/class/
fn.rs

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