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