Skip to main content

euv_ui/style/class/
fn.rs

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