Skip to main content

euv_ui/style/class/
fn.rs

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