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