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