adui_dioxus/
theme.rs

1use dioxus::prelude::*;
2use serde::{Deserialize, Serialize};
3
4/// 主题作用域基础样式与组件样式片段。
5macro_rules! adui_scope_style {
6    () => {
7        r#"
8.adui-theme-scope {
9    color: var(--adui-color-text);
10    background-color: var(--adui-color-bg-base);
11    font-family: "Segoe UI", "SF Pro Text", system-ui, -apple-system, sans-serif;
12    line-height: var(--adui-line-height, 1.5715);
13}
14"#
15    };
16}
17
18macro_rules! adui_calendar_style {
19    () => {
20        r#"
21.adui-calendar {
22    display: inline-block;
23    padding: 8px 12px;
24    border-radius: var(--adui-radius, 4px);
25    border: 1px solid var(--adui-color-border, #d9d9d9);
26    background-color: var(--adui-color-bg-container, #ffffff);
27}
28
29.adui-calendar-fullscreen {
30    width: 100%;
31}
32
33.adui-calendar-header {
34    display: flex;
35    align-items: center;
36    justify-content: space-between;
37    margin-bottom: 8px;
38}
39
40.adui-calendar-nav-btn {
41    border: none;
42    background: transparent;
43    cursor: pointer;
44    padding: 0 4px;
45}
46
47.adui-calendar-header-view {
48    font-weight: 500;
49}
50
51.adui-calendar-week-row {
52    display: grid;
53    grid-template-columns: repeat(7, 1fr);
54    gap: 2px;
55    margin-bottom: 4px;
56    font-size: 12px;
57    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
58}
59
60.adui-calendar-week-cell {
61    text-align: center;
62}
63
64.adui-calendar-body {
65    display: grid;
66    grid-template-columns: repeat(7, 1fr);
67    gap: 2px;
68}
69
70.adui-calendar-date {
71    box-sizing: border-box;
72}
73
74.adui-calendar-date-empty {
75    cursor: default;
76}
77
78.adui-calendar-date-cell {
79    padding: 4px 0;
80    border-radius: var(--adui-radius-sm, 4px);
81    text-align: center;
82    cursor: pointer;
83}
84
85.adui-calendar-date-cell:hover {
86    background-color: var(--adui-color-bg-base, #f5f5f5);
87}
88
89.adui-calendar-date-selected .adui-calendar-date-cell {
90    background-color: var(--adui-color-primary, #1677ff);
91    color: #fff;
92}
93
94.adui-calendar-date-value {
95    display: inline-block;
96}
97"#
98    };
99}
100
101macro_rules! adui_time_picker_style {
102    () => {
103        r#"
104.adui-time-picker-root {
105    position: relative;
106    display: inline-block;
107}
108
109.adui-time-picker {
110    display: inline-flex;
111    align-items: center;
112    box-sizing: border-box;
113    min-width: 160px;
114    width: auto;
115    min-height: var(--adui-control-height, 32px);
116    padding: 4px 8px;
117    border-radius: var(--adui-radius, 4px);
118    border: 1px solid var(--adui-color-border, #d9d9d9);
119    background-color: var(--adui-color-bg-container, #ffffff);
120    cursor: text;
121}
122
123.adui-time-picker-disabled {
124    background-color: var(--adui-color-bg-base, #f5f5f5);
125    cursor: not-allowed;
126    opacity: 0.6;
127}
128
129.adui-time-picker-input {
130    flex: 1;
131    border: none;
132    outline: none;
133    background: transparent;
134    padding: 0;
135    margin: 0;
136    font: inherit;
137}
138
139.adui-time-picker-clear {
140    margin-left: 4px;
141    cursor: pointer;
142    user-select: none;
143    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
144}
145
146.adui-time-picker-dropdown {
147    margin-top: 4px;
148    padding: 8px 12px;
149    border-radius: var(--adui-radius, 4px);
150    background-color: var(--adui-color-bg-container, #ffffff);
151    box-shadow: var(--adui-shadow, 0 3px 6px rgba(0,0,0,0.12));
152}
153
154.adui-time-picker-panel {
155    display: flex;
156    gap: 8px;
157}
158
159.adui-time-picker-column {
160    max-height: 200px;
161    overflow-y: auto;
162}
163
164.adui-time-picker-cell {
165    display: block;
166    min-width: 40px;
167    padding: 4px 0;
168    text-align: center;
169    border-radius: var(--adui-radius-sm, 4px);
170    cursor: pointer;
171}
172
173.adui-time-picker-cell:hover {
174    background-color: var(--adui-color-bg-base, #f5f5f5);
175}
176
177.adui-time-picker-cell-active {
178    background-color: var(--adui-color-primary, #1677ff);
179    color: #fff;
180}
181"#
182    };
183}
184
185macro_rules! adui_button_style {
186    () => {
187        r#"
188.adui-btn {
189    display: inline-flex;
190    align-items: center;
191    justify-content: center;
192    gap: 6px;
193    border: var(--adui-control-line-width, 1px) solid var(--adui-btn-border);
194    border-style: var(--adui-btn-border-style, solid);
195    background: var(--adui-btn-bg);
196    color: var(--adui-btn-color);
197    padding: var(--adui-btn-padding-block) var(--adui-btn-padding-inline);
198    height: var(--adui-btn-height);
199    min-width: 0;
200    border-radius: var(--adui-btn-radius);
201    font-size: var(--adui-btn-font-size);
202    line-height: 1.2;
203    cursor: pointer;
204    transition: all var(--adui-motion-duration-fast, 0.18s) ease;
205    box-shadow: var(--adui-btn-shadow, none);
206    text-decoration: none;
207    user-select: none;
208}
209
210.adui-btn:hover:not(.adui-btn-disabled) {
211    background: var(--adui-btn-bg-hover);
212    color: var(--adui-btn-color-hover);
213    border-color: var(--adui-btn-border-hover);
214}
215
216.adui-btn:active:not(.adui-btn-disabled) {
217    background: var(--adui-btn-bg-active);
218    color: var(--adui-btn-color-active);
219    border-color: var(--adui-btn-border-active);
220    box-shadow: none;
221}
222
223.adui-btn:focus-visible {
224    outline: none;
225    box-shadow: var(--adui-btn-focus-shadow, 0 0 0 2px rgba(22, 119, 255, 0.3));
226}
227
228.adui-btn-dashed {
229    border-style: dashed;
230}
231
232.adui-btn-text,
233.adui-btn-link {
234    border-color: transparent;
235    background: transparent;
236}
237
238.adui-btn-link {
239    box-shadow: none;
240}
241
242.adui-btn-primary {
243    color: #fff;
244}
245
246.adui-btn-disabled {
247    cursor: not-allowed;
248    opacity: 0.65;
249}
250
251.adui-btn-block {
252    width: 100%;
253}
254
255.adui-btn-ghost {
256    background: transparent;
257}
258
259.adui-btn-icon {
260    display: inline-flex;
261    align-items: center;
262    justify-content: center;
263}
264
265.adui-btn-spinner {
266    width: 14px;
267    height: 14px;
268    border-radius: 50%;
269    border: 2px solid currentColor;
270    border-right-color: transparent;
271    animation: adui-spin 0.9s linear infinite;
272}
273
274.adui-btn-group {
275    display: inline-flex;
276    align-items: stretch;
277}
278
279.adui-btn-group > .adui-btn {
280    border-radius: 0;
281}
282
283.adui-btn-group > .adui-btn:first-child {
284    border-top-left-radius: var(--adui-btn-radius);
285    border-bottom-left-radius: var(--adui-btn-radius);
286}
287
288.adui-btn-group > .adui-btn:last-child {
289    border-top-right-radius: var(--adui-btn-radius);
290    border-bottom-right-radius: var(--adui-btn-radius);
291}
292
293.adui-btn-group > .adui-btn:not(:last-child) {
294    margin-right: -1px;
295}
296
297[dir="rtl"] .adui-btn-group {
298    direction: rtl;
299}
300
301[dir="rtl"] .adui-btn-group > .adui-btn:first-child {
302    border-top-right-radius: var(--adui-btn-radius);
303    border-bottom-right-radius: var(--adui-btn-radius);
304    border-top-left-radius: 0;
305    border-bottom-left-radius: 0;
306}
307
308[dir="rtl"] .adui-btn-group > .adui-btn:last-child {
309    border-top-left-radius: var(--adui-btn-radius);
310    border-bottom-left-radius: var(--adui-btn-radius);
311    border-top-right-radius: 0;
312    border-bottom-right-radius: 0;
313}
314
315[dir="rtl"] .adui-btn-group > .adui-btn:not(:last-child) {
316    margin-right: 0;
317    margin-left: -1px;
318}
319"#
320    };
321}
322
323macro_rules! adui_icon_style {
324    () => {
325        r#"
326.adui-icon {
327    display: inline-flex;
328    align-items: center;
329    justify-content: center;
330    vertical-align: middle;
331    transition: transform 0.16s ease;
332}
333
334.adui-icon-spin {
335    animation: adui-spin 1s linear infinite;
336}
337"#
338    };
339}
340
341macro_rules! adui_divider_style {
342    () => {
343        r#"
344.adui-divider {
345    border-top: 1px solid var(--adui-color-split, var(--adui-color-border));
346    margin: 16px 0;
347    position: relative;
348}
349
350.adui-divider-vertical {
351    display: inline-block;
352    height: 1em;
353    border-left: 1px solid var(--adui-color-split, var(--adui-color-border));
354    margin: 0 8px;
355}
356
357.adui-divider-horizontal {
358    display: flex;
359    align-items: center;
360}
361
362.adui-divider-plain {
363    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
364    font-size: 13px;
365}
366
367.adui-divider-dashed {
368    border-top-style: dashed;
369}
370
371.adui-divider-inner-text {
372    padding: 0 8px;
373    background: transparent;
374    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
375    font-size: 13px;
376}
377
378.adui-divider-left::before,
379.adui-divider-right::after,
380.adui-divider-center::before,
381.adui-divider-center::after {
382    content: "";
383    border-top: 1px solid var(--adui-color-split, var(--adui-color-border));
384    flex: 1;
385}
386
387.adui-divider-left { justify-content: flex-start; gap: 8px; }
388.adui-divider-center { justify-content: center; gap: 8px; }
389.adui-divider-right { justify-content: flex-end; gap: 8px; }
390"#
391    };
392}
393
394macro_rules! adui_alert_style {
395    () => {
396        r#"
397.adui-alert {
398    position: relative;
399    display: flex;
400    align-items: flex-start;
401    padding: 8px 12px;
402    border-radius: var(--adui-radius, 4px);
403    border: 1px solid var(--adui-color-border);
404    background-color: var(--adui-color-bg-container);
405    color: var(--adui-color-text);
406    font-size: 13px;
407    line-height: 1.4;
408}
409
410.adui-alert + .adui-alert {
411    margin-top: 8px;
412}
413
414.adui-alert-icon {
415    margin-right: 8px;
416    display: flex;
417    align-items: center;
418    padding-top: 1px;
419}
420
421.adui-alert-content {
422    flex: 1;
423}
424
425.adui-alert-message {
426    font-weight: 500;
427}
428
429.adui-alert-description {
430    margin-top: 4px;
431    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
432}
433
434.adui-alert-close-icon {
435    margin-left: 8px;
436    border: none;
437    background: transparent;
438    cursor: pointer;
439    color: inherit;
440    padding: 0;
441}
442
443.adui-alert-success {
444    border-color: var(--adui-color-success-border, #b7eb8f);
445    background-color: var(--adui-color-success-bg, #f6ffed);
446    color: var(--adui-color-success-text, #3f6600);
447}
448
449.adui-alert-info {
450    border-color: var(--adui-color-info-border, #91d5ff);
451    background-color: var(--adui-color-info-bg, #e6f7ff);
452    color: var(--adui-color-info-text, #09599b);
453}
454
455.adui-alert-warning {
456    border-color: var(--adui-color-warning-border, #ffe58f);
457    background-color: var(--adui-color-warning-bg, #fffbe6);
458    color: var(--adui-color-warning-text, #613400);
459}
460
461.adui-alert-error {
462    border-color: var(--adui-color-error-border, #ffa39e);
463    background-color: var(--adui-color-error-bg, #fff1f0);
464    color: var(--adui-color-error-text, #a8071a);
465}
466
467.adui-alert-banner {
468    border-radius: 0;
469    border-left: none;
470    border-right: none;
471}
472"#
473    };
474}
475
476macro_rules! adui_date_picker_style {
477    () => {
478        r#"
479.adui-date-picker-root {
480    position: relative;
481    display: inline-block;
482}
483
484.adui-date-picker,
485.adui-date-picker-range {
486    display: inline-flex;
487    align-items: center;
488    box-sizing: border-box;
489    min-width: 220px;
490    width: auto;
491    min-height: var(--adui-control-height, 32px);
492    padding: 4px 8px;
493    border-radius: var(--adui-radius, 4px);
494    border: 1px solid var(--adui-color-border, #d9d9d9);
495    background-color: var(--adui-color-bg-container, #ffffff);
496    cursor: text;
497}
498
499.adui-date-picker-disabled {
500    background-color: var(--adui-color-bg-base, #f5f5f5);
501    cursor: not-allowed;
502    opacity: 0.6;
503}
504
505.adui-date-picker-input {
506    flex: 1;
507    border: none;
508    outline: none;
509    background: transparent;
510    padding: 0;
511    margin: 0;
512    font: inherit;
513}
514
515.adui-date-picker-input-start,
516.adui-date-picker-input-end {
517    flex: 1;
518}
519
520.adui-date-picker-range-separator {
521    padding: 0 4px;
522    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
523}
524
525.adui-date-picker-clear {
526    margin-left: 4px;
527    cursor: pointer;
528    user-select: none;
529    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
530}
531
532.adui-date-picker-dropdown {
533    margin-top: 4px;
534    padding: 8px 12px;
535    border-radius: var(--adui-radius, 4px);
536    background-color: var(--adui-color-bg-container, #ffffff);
537    box-shadow: var(--adui-shadow, 0 3px 6px rgba(0,0,0,0.12));
538}
539
540.adui-date-picker-header {
541    display: flex;
542    align-items: center;
543    justify-content: space-between;
544    margin-bottom: 8px;
545}
546
547.adui-date-picker-nav-btn {
548    border: none;
549    background: transparent;
550    cursor: pointer;
551    padding: 0 4px;
552}
553
554.adui-date-picker-header-view {
555    font-weight: 500;
556}
557
558.adui-date-picker-week-row {
559    display: grid;
560    grid-template-columns: repeat(7, 1fr);
561    gap: 2px;
562    margin-bottom: 4px;
563    font-size: 12px;
564    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
565}
566
567.adui-date-picker-week-cell {
568    text-align: center;
569}
570
571.adui-date-picker-body {
572    display: grid;
573    grid-template-columns: repeat(7, 1fr);
574    gap: 2px;
575}
576
577.adui-date-picker-cell {
578    box-sizing: border-box;
579    text-align: center;
580    padding: 4px 0;
581    border-radius: var(--adui-radius-sm, 4px);
582    cursor: pointer;
583}
584
585.adui-date-picker-cell-empty {
586    cursor: default;
587}
588
589.adui-date-picker-cell-date:hover {
590    background-color: var(--adui-color-bg-base, #f5f5f5);
591}
592
593.adui-date-picker-cell-selected {
594    background-color: var(--adui-color-primary, #1677ff);
595    color: #fff;
596}
597
598.adui-date-picker-cell-in-range {
599    background-color: rgba(22, 119, 255, 0.15);
600}
601
602.adui-date-picker-cell-range-start,
603.adui-date-picker-cell-range-end {
604    background-color: var(--adui-color-primary, #1677ff);
605    color: #fff;
606}
607"#
608    };
609}
610
611macro_rules! adui_result_style {
612    () => {
613        r#"
614.adui-result {
615    padding: 24px 32px;
616    text-align: center;
617}
618
619.adui-result-icon {
620    margin-bottom: 16px;
621    font-size: 0;
622}
623
624.adui-result-title {
625    margin-bottom: 8px;
626    font-size: 20px;
627    font-weight: 600;
628    color: var(--adui-color-text);
629}
630
631.adui-result-subtitle {
632    margin-bottom: 16px;
633    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
634}
635
636.adui-result-extra {
637    margin-top: 16px;
638}
639
640.adui-result-content {
641    margin-top: 24px;
642    text-align: left;
643}
644
645.adui-result-success .adui-result-icon {
646    color: var(--adui-color-success, #52c41a);
647}
648
649.adui-result-info .adui-result-icon {
650    color: var(--adui-color-primary, #1677ff);
651}
652
653.adui-result-warning .adui-result-icon {
654    color: var(--adui-color-warning, #faad14);
655}
656
657.adui-result-error .adui-result-icon,
658.adui-result-403 .adui-result-icon,
659.adui-result-404 .adui-result-icon,
660.adui-result-500 .adui-result-icon {
661    color: var(--adui-color-error, #ff4d4f);
662}
663"#
664    };
665}
666
667macro_rules! adui_steps_style {
668    () => {
669        r#"
670.adui-steps {
671    display: flex;
672    list-style: none;
673    padding: 0;
674    margin: 0;
675}
676
677.adui-steps-horizontal {
678    flex-direction: row;
679    gap: 16px;
680}
681
682.adui-steps-vertical {
683    flex-direction: column;
684    gap: 12px;
685}
686
687.adui-steps-item {
688    display: flex;
689    align-items: flex-start;
690}
691
692.adui-steps-item-icon {
693    width: 24px;
694    height: 24px;
695    border-radius: 50%;
696    border: 1px solid var(--adui-color-border);
697    display: inline-flex;
698    align-items: center;
699    justify-content: center;
700    margin-right: 8px;
701    background: var(--adui-color-bg-container);
702    font-size: 13px;
703}
704
705.adui-steps-item-index {
706    line-height: 1;
707}
708
709.adui-steps-item-content {
710    display: flex;
711    flex-direction: column;
712}
713
714.adui-steps-item-title {
715    font-size: var(--adui-font-size, 14px);
716    color: var(--adui-color-text);
717}
718
719.adui-steps-item-description {
720    margin-top: 2px;
721    font-size: var(--adui-font-size-sm, 13px);
722    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
723}
724
725.adui-steps-status-wait .adui-steps-item-icon {
726    border-color: var(--adui-color-border);
727    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
728}
729
730.adui-steps-status-process .adui-steps-item-icon {
731    border-color: var(--adui-color-primary, #1677ff);
732    background: var(--adui-color-primary, #1677ff);
733    color: #fff;
734}
735
736.adui-steps-status-finish .adui-steps-item-icon {
737    border-color: var(--adui-color-success, #52c41a);
738    background: var(--adui-color-success, #52c41a);
739    color: #fff;
740}
741
742.adui-steps-status-error .adui-steps-item-icon {
743    border-color: var(--adui-color-error, #ff4d4f);
744    background: var(--adui-color-error, #ff4d4f);
745    color: #fff;
746}
747
748.adui-steps-item-disabled {
749    cursor: not-allowed;
750    opacity: 0.6;
751}
752
753.adui-steps-sm .adui-steps-item-title {
754    font-size: var(--adui-font-size-sm, 13px);
755}
756
757.adui-steps-lg .adui-steps-item-title {
758    font-size: var(--adui-font-size-lg, 16px);
759}
760"#
761    };
762}
763
764macro_rules! adui_typography_style {
765    () => {
766        r#"
767.adui-text {
768    font-size: inherit;
769    line-height: var(--adui-line-height, 1.5715);
770    word-break: break-word;
771}
772
773.adui-text-code {
774    padding: 1px 4px;
775    background: rgba(0, 0, 0, 0.04);
776    border: 1px solid rgba(0, 0, 0, 0.06);
777    border-radius: 6px;
778    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
779    font-size: 0.95em;
780}
781
782.adui-text-mark {
783    background: rgba(255, 229, 143, 0.8);
784    padding: 1px 2px;
785}
786
787.adui-text-strong {
788    font-weight: 600;
789}
790
791.adui-text-italic {
792    font-style: italic;
793}
794
795.adui-text-nowrap {
796    white-space: nowrap;
797}
798
799.adui-text-ellipsis {
800    display: inline-block;
801    max-width: 100%;
802    overflow: hidden;
803    text-overflow: ellipsis;
804    white-space: nowrap;
805    vertical-align: bottom;
806}
807
808.adui-text-ellipsis-multiline {
809    display: -webkit-box;
810    -webkit-box-orient: vertical;
811    overflow: hidden;
812}
813
814.adui-text-disabled {
815    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
816    cursor: not-allowed;
817}
818
819.adui-paragraph {
820    margin: 0 0 0.6em 0;
821}
822
823.adui-title {
824    margin: 0 0 0.4em 0;
825    font-weight: 600;
826    color: var(--adui-color-text);
827    line-height: 1.25;
828}
829
830.adui-title-1 { font-size: 32px; }
831.adui-title-2 { font-size: 28px; }
832.adui-title-3 { font-size: 24px; }
833.adui-title-4 { font-size: 20px; }
834.adui-title-5 { font-size: 16px; }
835
836.adui-typography-control {
837    display: inline-flex;
838    align-items: center;
839    justify-content: center;
840    margin-left: 6px;
841    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
842    cursor: pointer;
843    border: none;
844    background: transparent;
845    padding: 0;
846    font-size: 0.9em;
847}
848
849.adui-typography-control:hover {
850    color: var(--adui-color-text, inherit);
851}
852
853.adui-typography-control[aria-disabled="true"] {
854    cursor: not-allowed;
855    opacity: 0.5;
856}
857
858.adui-text-editing {
859    display: inline-flex;
860    align-items: center;
861    gap: 6px;
862}
863
864.adui-typography-input,
865.adui-typography-textarea {
866    border: 1px solid var(--adui-color-border);
867    border-radius: var(--adui-radius-sm, 4px);
868    padding: 2px 6px;
869    font: inherit;
870    background: var(--adui-color-bg-container);
871    color: var(--adui-color-text);
872    min-width: 160px;
873}
874
875.adui-typography-textarea {
876    min-height: 80px;
877    resize: vertical;
878}
879
880.adui-typography-edit-btn {
881    border: 1px solid var(--adui-color-border);
882    background: var(--adui-color-bg-container);
883    border-radius: var(--adui-radius-sm, 4px);
884    padding: 2px 6px;
885    cursor: pointer;
886    display: inline-flex;
887    align-items: center;
888    justify-content: center;
889}
890
891.adui-typography-edit-btn:hover {
892    border-color: var(--adui-color-border-hover);
893}
894"#
895    };
896}
897
898macro_rules! adui_layout_style {
899    () => {
900        r#"
901.adui-layout {
902    display: flex;
903    flex-direction: column;
904    min-height: 100vh;
905}
906
907.adui-layout-has-sider {
908    flex-direction: row;
909    min-height: auto;
910}
911
912.adui-layout-header,
913.adui-layout-footer {
914    padding: 12px 16px;
915}
916
917.adui-layout-content {
918    padding: 16px;
919    flex: 1;
920}
921
922.adui-layout-sider {
923    min-height: 100%;
924    padding: 12px;
925    display: flex;
926    flex-direction: column;
927    position: relative;
928    transition: width var(--adui-motion-duration-mid, 0.24s) ease;
929}
930
931.adui-layout-sider-children {
932    flex: 1;
933}
934
935.adui-layout-sider-trigger {
936    text-align: center;
937    line-height: 40px;
938    height: 40px;
939    cursor: pointer;
940    border-top: 1px solid rgba(255, 255, 255, 0.06);
941}
942
943.adui-layout-sider-zero-width {
944    padding-inline: 0;
945}
946
947.adui-layout-sider-zero-trigger {
948    position: absolute;
949    top: 16px;
950    width: 32px;
951    height: 32px;
952    border-radius: var(--adui-radius);
953    display: inline-flex;
954    align-items: center;
955    justify-content: center;
956    cursor: pointer;
957    box-shadow: var(--adui-shadow);
958    background: var(--adui-color-bg-container);
959    color: var(--adui-color-text);
960}
961
962	.adui-layout-sider-zero-trigger-left {
963	    right: -16px;
964	}
965
966		.adui-layout-sider-zero-trigger-right {
967	    left: -16px;
968	}
969
970	/* Menu */
971	.adui-menu {
972	    margin: 0;
973	    padding: 0;
974	    list-style: none;
975	    box-sizing: border-box;
976	    color: var(--adui-color-text);
977	    font-size: var(--adui-font-size, 14px);
978	}
979
980	.adui-menu-inline {
981	    width: 100%;
982	}
983
984	.adui-menu-horizontal {
985	    display: flex;
986	    align-items: center;
987	    gap: 8px;
988	}
989
990	.adui-menu-list {
991	    list-style: none;
992	    margin: 0;
993	    padding: 0;
994	}
995
996	.adui-menu-item {
997	    display: flex;
998	    align-items: center;
999	    padding: 6px 12px;
1000	    cursor: pointer;
1001	    border-radius: var(--adui-radius-sm, 4px);
1002	    transition: background 0.16s ease, color 0.16s ease;
1003	}
1004
1005	.adui-menu-horizontal .adui-menu-item {
1006	    border-radius: 0;
1007	    padding: 8px 12px;
1008	}
1009
1010	.adui-menu-item:hover:not(.adui-menu-item-disabled) {
1011	    background: rgba(0, 0, 0, 0.04);
1012	}
1013
1014	.adui-menu-item-selected {
1015	    background: rgba(22, 119, 255, 0.08);
1016	    color: var(--adui-color-primary);
1017	}
1018
1019	.adui-menu-item-disabled {
1020	    cursor: not-allowed;
1021	    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
1022	}
1023
1024	.adui-menu-item-title {
1025	    display: inline-flex;
1026	    align-items: center;
1027	    gap: 8px;
1028	    width: 100%;
1029	}
1030
1031	.adui-menu-item-icon {
1032	    display: inline-flex;
1033	    align-items: center;
1034	    justify-content: center;
1035	}
1036
1037	.adui-menu-item-label {
1038	    flex: 1;
1039	    min-width: 0;
1040	    white-space: nowrap;
1041	    text-overflow: ellipsis;
1042	    overflow: hidden;
1043	}
1044
1045	.adui-menu-submenu-list {
1046	    list-style: none;
1047	    margin: 4px 0 0 12px;
1048	    padding: 0;
1049	}
1050
1051	.adui-menu-submenu-item {
1052	    padding-inline-start: 12px;
1053	}
1054
1055		.adui-menu-inline-collapsed .adui-menu-submenu-list {
1056		    display: none;
1057		}
1058
1059		/* Breadcrumb */
1060		.adui-breadcrumb {
1061		    font-size: 13px;
1062		    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1063		}
1064
1065		.adui-breadcrumb-list {
1066		    list-style: none;
1067		    margin: 0;
1068		    padding: 0;
1069		    display: flex;
1070		    flex-wrap: wrap;
1071		    align-items: center;
1072		}
1073
1074		.adui-breadcrumb-item {
1075		    display: inline-flex;
1076		    align-items: center;
1077		}
1078
1079		.adui-breadcrumb-link {
1080		    color: var(--adui-color-link);
1081		    text-decoration: none;
1082		}
1083
1084		.adui-breadcrumb-link:hover {
1085		    text-decoration: underline;
1086		}
1087
1088		.adui-breadcrumb-text {
1089		    color: inherit;
1090		}
1091
1092		.adui-breadcrumb-text-current {
1093		    font-weight: 500;
1094		    color: var(--adui-color-text, #000);
1095		}
1096
1097		.adui-breadcrumb-separator {
1098		    margin: 0 4px;
1099		    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1100		}
1101
1102		/* Pagination */
1103		.adui-pagination {
1104		    display: inline-flex;
1105		    align-items: center;
1106		    gap: 8px;
1107		    font-size: 14px;
1108		    color: var(--adui-color-text);
1109		}
1110
1111		.adui-pagination-total {
1112		    margin-right: 8px;
1113		    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1114		}
1115
1116		.adui-pagination-list {
1117		    display: inline-flex;
1118		    list-style: none;
1119		    margin: 0;
1120		    padding: 0;
1121		    gap: 4px;
1122		}
1123
1124		.adui-pagination-item {
1125		    min-width: 28px;
1126		    height: 28px;
1127		    padding: 0 8px;
1128		    display: inline-flex;
1129		    align-items: center;
1130		    justify-content: center;
1131		    border-radius: var(--adui-radius-sm, 4px);
1132		    border: 1px solid transparent;
1133		    cursor: pointer;
1134		    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1135		}
1136
1137		.adui-pagination-item:hover:not(.adui-pagination-item-disabled) {
1138		    border-color: var(--adui-color-border-hover);
1139		    background: rgba(0, 0, 0, 0.02);
1140		}
1141
1142		.adui-pagination-item-active {
1143		    border-color: var(--adui-color-primary);
1144		    color: var(--adui-color-primary);
1145		    background: rgba(22, 119, 255, 0.08);
1146		}
1147
1148		.adui-pagination-item-disabled {
1149		    cursor: not-allowed;
1150		    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
1151		}
1152
1153		.adui-pagination-item-ellipsis {
1154		    cursor: default;
1155		}
1156
1157		.adui-pagination-size-changer {
1158		    margin-left: 4px;
1159		    padding: 2px 6px;
1160		    border-radius: var(--adui-radius-sm, 4px);
1161		    border: 1px solid var(--adui-color-border);
1162		    background: var(--adui-color-bg-container);
1163		    font-size: 13px;
1164		}
1165	"#
1166    };
1167}
1168
1169macro_rules! adui_grid_style {
1170    () => {
1171        r#"
1172.adui-row {
1173    width: 100%;
1174    --adui-row-gutter-x: 0px;
1175    --adui-row-gutter-y: 0px;
1176}
1177
1178.adui-col {
1179    box-sizing: border-box;
1180    padding-left: calc(var(--adui-row-gutter-x, 0px) / 2);
1181    padding-right: calc(var(--adui-row-gutter-x, 0px) / 2);
1182    padding-bottom: var(--adui-row-gutter-y, 0px);
1183}
1184"#
1185    };
1186}
1187
1188macro_rules! adui_space_style {
1189    () => {
1190        r#"
1191.adui-space {
1192    display: inline-flex;
1193    flex-direction: row;
1194    flex-wrap: nowrap;
1195    align-items: flex-start;
1196    gap: 0;
1197}
1198
1199.adui-space-horizontal { flex-direction: row; }
1200.adui-space-vertical { flex-direction: column; }
1201.adui-space-wrap { flex-wrap: wrap; }
1202
1203.adui-space-align-start { align-items: flex-start; }
1204.adui-space-align-end { align-items: flex-end; }
1205.adui-space-align-center { align-items: center; }
1206.adui-space-align-baseline { align-items: baseline; }
1207
1208.adui-space-size-small { gap: var(--adui-padding-inline-sm, 8px); }
1209.adui-space-size-middle { gap: var(--adui-padding-inline, 16px); }
1210.adui-space-size-large { gap: var(--adui-padding-inline-lg, 24px); }
1211
1212.adui-space-compact { gap: 0; }
1213"#
1214    };
1215}
1216
1217macro_rules! adui_flex_style {
1218    () => {
1219        r#"
1220.adui-flex {
1221    display: flex;
1222    gap: 0;
1223}
1224
1225.adui-flex-horizontal { flex-direction: row; }
1226.adui-flex-horizontal.adui-flex-row-reverse { flex-direction: row-reverse; }
1227.adui-flex-vertical { flex-direction: column; }
1228.adui-flex-vertical.adui-flex-column-reverse { flex-direction: column-reverse; }
1229
1230.adui-flex-wrap-nowrap { flex-wrap: nowrap; }
1231.adui-flex-wrap-wrap { flex-wrap: wrap; }
1232.adui-flex-wrap-wrap-reverse { flex-wrap: wrap-reverse; }
1233
1234.adui-flex-justify-start { justify-content: flex-start; }
1235.adui-flex-justify-end { justify-content: flex-end; }
1236.adui-flex-justify-center { justify-content: center; }
1237.adui-flex-justify-between { justify-content: space-between; }
1238.adui-flex-justify-around { justify-content: space-around; }
1239.adui-flex-justify-evenly { justify-content: space-evenly; }
1240
1241.adui-flex-align-start { align-items: flex-start; }
1242.adui-flex-align-end { align-items: flex-end; }
1243.adui-flex-align-center { align-items: center; }
1244.adui-flex-align-stretch { align-items: stretch; }
1245.adui-flex-align-baseline { align-items: baseline; }
1246
1247.adui-flex-gap-small { gap: var(--adui-padding-inline-sm, 8px); }
1248.adui-flex-gap-middle { gap: var(--adui-padding-inline, 16px); }
1249.adui-flex-gap-large { gap: var(--adui-padding-inline-lg, 20px); }
1250"#
1251    };
1252}
1253
1254macro_rules! adui_form_style {
1255    () => {
1256        r#"
1257.adui-form {
1258    width: 100%;
1259    display: block;
1260}
1261
1262.adui-form-inline {
1263    display: inline-flex;
1264    flex-wrap: wrap;
1265    gap: 16px;
1266    align-items: flex-end;
1267}
1268
1269.adui-form-item {
1270    display: flex;
1271    flex-direction: column;
1272    gap: 4px;
1273    margin-bottom: 16px;
1274    font-size: 14px;
1275}
1276
1277.adui-form-horizontal .adui-form-item {
1278    flex-direction: row;
1279    align-items: flex-start;
1280}
1281
1282.adui-form-horizontal .adui-form-item-label {
1283    width: 120px;
1284    padding-inline-end: 12px;
1285    text-align: right;
1286}
1287
1288.adui-form-vertical .adui-form-item-label,
1289.adui-form-inline .adui-form-item-label {
1290    text-align: left;
1291    padding-inline-end: 0;
1292    margin-bottom: 4px;
1293}
1294
1295.adui-form-item-label {
1296    display: inline-flex;
1297    align-items: center;
1298    justify-content: flex-start;
1299    min-height: 32px;
1300    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1301    font-size: 14px;
1302}
1303
1304.adui-form-item-required {
1305    color: var(--adui-color-error);
1306    margin-inline-end: 4px;
1307}
1308
1309.adui-form-item-control {
1310    flex: 1;
1311    min-width: 0;
1312}
1313
1314.adui-form-item-control > *:first-child {
1315    width: 100%;
1316}
1317
1318.adui-form-item-help {
1319    font-size: 13px;
1320    color: var(--adui-color-error);
1321    margin-top: 2px;
1322}
1323
1324.adui-form-item-extra {
1325    font-size: 12px;
1326    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1327}
1328
1329.adui-form-item-has-error .adui-form-item-control > *:first-child {
1330    border-color: var(--adui-color-error);
1331    box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.1);
1332}
1333
1334.adui-form-item-has-feedback .adui-form-item-label {
1335    position: relative;
1336}
1337
1338.adui-form-small .adui-form-item-label {
1339    min-height: 24px;
1340}
1341
1342.adui-form-large .adui-form-item-label {
1343    min-height: 40px;
1344}
1345"#
1346    };
1347}
1348
1349macro_rules! adui_control_style {
1350    () => {
1351        r#"
1352/* Text input controls */
1353.adui-input {
1354    box-sizing: border-box;
1355    width: 100%;
1356    padding: 4px 11px;
1357    border-radius: var(--adui-radius-sm, 4px);
1358    border: 1px solid var(--adui-color-border);
1359    background: var(--adui-color-bg-container);
1360    color: var(--adui-color-text);
1361    font-size: var(--adui-font-size, 14px);
1362    line-height: var(--adui-line-height, 1.5715);
1363    outline: none;
1364    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1365}
1366
1367.adui-input::placeholder {
1368    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1369}
1370
1371.adui-input:hover {
1372    border-color: var(--adui-color-border-hover);
1373}
1374
1375.adui-input:focus,
1376.adui-input:focus-visible {
1377    border-color: var(--adui-color-primary);
1378    box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.12);
1379}
1380
1381.adui-input[disabled] {
1382    background: rgba(0, 0, 0, 0.02);
1383    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
1384    cursor: not-allowed;
1385}
1386
1387.adui-input-textarea {
1388    min-height: 80px;
1389    resize: vertical;
1390}
1391
1392.adui-input-affix-wrapper {
1393    display: inline-flex;
1394    align-items: center;
1395    box-sizing: border-box;
1396    width: 100%;
1397    padding: 0 11px;
1398    border-radius: var(--adui-radius-sm, 4px);
1399    border: 1px solid var(--adui-color-border);
1400    background: var(--adui-color-bg-container);
1401    color: var(--adui-color-text);
1402    font-size: var(--adui-font-size, 14px);
1403    line-height: var(--adui-line-height, 1.5715);
1404    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1405}
1406
1407.adui-input-affix-wrapper:hover {
1408    border-color: var(--adui-color-border-hover);
1409}
1410
1411.adui-input-affix-wrapper:focus-within {
1412    border-color: var(--adui-color-primary);
1413    box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.12);
1414}
1415
1416.adui-input-prefix,
1417.adui-input-suffix {
1418    display: inline-flex;
1419    align-items: center;
1420    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1421}
1422
1423.adui-input-prefix {
1424    margin-right: 4px;
1425}
1426
1427.adui-input-suffix {
1428    margin-left: 4px;
1429}
1430
1431.adui-input-clear {
1432    margin-left: 4px;
1433    cursor: pointer;
1434}
1435
1436.adui-input-clear:hover {
1437    color: var(--adui-color-text, inherit);
1438}
1439
1440/* InputNumber */
1441.adui-input-number {
1442    display: inline-flex;
1443    align-items: center;
1444    box-sizing: border-box;
1445    min-height: var(--adui-control-height, 32px);
1446    padding: 0 8px;
1447    border-radius: var(--adui-radius-sm, 4px);
1448    border: 1px solid var(--adui-color-border);
1449    background: var(--adui-color-bg-container);
1450    color: var(--adui-color-text);
1451    font-size: var(--adui-font-size, 14px);
1452    line-height: var(--adui-line-height, 1.5715);
1453    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1454}
1455
1456.adui-input-number:focus-within {
1457    border-color: var(--adui-color-primary);
1458    box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.12);
1459}
1460
1461.adui-input-number-disabled {
1462    background: rgba(0, 0, 0, 0.02);
1463    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
1464    cursor: not-allowed;
1465    opacity: 0.7;
1466}
1467
1468.adui-input-number-input {
1469    flex: 1;
1470    border: none;
1471    outline: none;
1472    background: transparent;
1473    padding: 4px 0;
1474    color: inherit;
1475    font: inherit;
1476}
1477
1478.adui-input-number-input:disabled {
1479    background: transparent;
1480}
1481
1482.adui-input-number-prefix,
1483.adui-input-number-suffix {
1484    display: inline-flex;
1485    align-items: center;
1486    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1487}
1488
1489.adui-input-number-prefix { margin-right: 4px; }
1490.adui-input-number-suffix { margin-left: 4px; }
1491
1492.adui-input-number-handlers {
1493    display: flex;
1494    flex-direction: column;
1495    margin-left: 4px;
1496    gap: 2px;
1497}
1498
1499.adui-input-number-handler {
1500    width: 18px;
1501    height: 12px;
1502    border: none;
1503    padding: 0;
1504    margin: 0;
1505    background: transparent;
1506    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1507    cursor: pointer;
1508    line-height: 1;
1509}
1510
1511.adui-input-number-handler:hover {
1512    color: var(--adui-color-text, inherit);
1513}
1514
1515.adui-input-number-handler:disabled {
1516    cursor: not-allowed;
1517    opacity: 0.4;
1518}
1519
1520/* Slider */
1521.adui-slider {
1522    position: relative;
1523    width: 100%;
1524    height: 32px;
1525    padding: 12px 0;
1526    box-sizing: border-box;
1527}
1528
1529.adui-slider-rail {
1530    position: absolute;
1531    left: 0;
1532    right: 0;
1533    top: 50%;
1534    transform: translateY(-50%);
1535    height: 4px;
1536    background: var(--adui-color-fill-secondary, rgba(0, 0, 0, 0.06));
1537    border-radius: 2px;
1538}
1539
1540.adui-slider-track {
1541    position: absolute;
1542    height: 4px;
1543    top: 50%;
1544    transform: translateY(-50%);
1545    background: var(--adui-color-primary, #1677ff);
1546    border-radius: 2px;
1547}
1548
1549.adui-slider-handle {
1550    position: absolute;
1551    width: 14px;
1552    height: 14px;
1553    border-radius: 50%;
1554    border: 2px solid var(--adui-color-bg-container, #fff);
1555    background: var(--adui-color-primary, #1677ff);
1556    box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.2);
1557    cursor: pointer;
1558    transform: translate(-50%, -50%);
1559    outline: none;
1560}
1561
1562.adui-slider-handle:focus-visible,
1563.adui-slider-handle:hover {
1564    box-shadow: 0 0 0 4px rgba(22, 119, 255, 0.25);
1565}
1566
1567.adui-slider-disabled .adui-slider-handle {
1568    background: var(--adui-color-fill-secondary, rgba(0, 0, 0, 0.06));
1569    cursor: not-allowed;
1570    box-shadow: none;
1571}
1572
1573.adui-slider-disabled .adui-slider-track {
1574    background: var(--adui-color-fill-secondary, rgba(0, 0, 0, 0.06));
1575}
1576
1577.adui-slider-marks {
1578    position: absolute;
1579    left: 0;
1580    right: 0;
1581    top: 18px;
1582    font-size: 12px;
1583    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
1584}
1585
1586.adui-slider-mark {
1587    position: absolute;
1588    text-align: center;
1589    transform: translateX(-50%);
1590}
1591
1592.adui-slider-dot {
1593    display: inline-block;
1594    width: 6px;
1595    height: 6px;
1596    border-radius: 50%;
1597    background: var(--adui-color-fill-secondary, rgba(0, 0, 0, 0.15));
1598    margin-bottom: 4px;
1599}
1600
1601.adui-slider-vertical {
1602    width: 32px;
1603    height: 160px;
1604    padding: 0 12px;
1605}
1606
1607.adui-slider-vertical .adui-slider-rail {
1608    width: 4px;
1609    height: 100%;
1610    left: 50%;
1611    right: auto;
1612    top: 0;
1613    transform: translateX(-50%);
1614}
1615
1616.adui-slider-vertical .adui-slider-track {
1617    width: 4px;
1618    left: 50%;
1619    right: auto;
1620    transform: translateX(-50%);
1621    top: auto;
1622}
1623
1624.adui-slider-vertical .adui-slider-handle {
1625    left: 50%;
1626    transform: translate(-50%, 50%);
1627}
1628
1629.adui-slider-vertical .adui-slider-marks {
1630    left: 18px;
1631    right: auto;
1632    top: 0;
1633    bottom: 0;
1634}
1635
1636.adui-slider-vertical .adui-slider-mark {
1637    transform: translateY(50%);
1638}
1639
1640/* Rate */
1641.adui-rate {
1642    display: inline-flex;
1643    align-items: center;
1644    gap: 4px;
1645    color: var(--adui-color-text, #faad14);
1646}
1647
1648.adui-rate-star {
1649    position: relative;
1650    font-size: 20px;
1651    color: var(--adui-color-fill-secondary, rgba(0, 0, 0, 0.25));
1652    cursor: pointer;
1653    line-height: 1;
1654}
1655
1656.adui-rate-star:hover {
1657    transform: scale(1.05);
1658}
1659
1660.adui-rate-disabled .adui-rate-star {
1661    cursor: not-allowed;
1662    opacity: 0.6;
1663}
1664
1665.adui-rate-star-default {
1666    display: inline-block;
1667}
1668
1669.adui-rate-star-full {
1670    color: var(--adui-color-warning, #faad14);
1671}
1672
1673.adui-rate-star-half {
1674    color: var(--adui-color-warning-hover, #ffc53d);
1675}
1676
1677/* Segmented */
1678.adui-segmented {
1679    display: inline-flex;
1680    gap: 4px;
1681    padding: 2px;
1682    border-radius: var(--adui-radius, 6px);
1683    background: var(--adui-color-bg-base, #f5f5f5);
1684}
1685
1686.adui-segmented-block {
1687    width: 100%;
1688}
1689
1690.adui-segmented-round {
1691    border-radius: var(--adui-radius-lg, 999px);
1692}
1693
1694.adui-segmented-disabled {
1695    opacity: 0.6;
1696    cursor: not-allowed;
1697}
1698
1699.adui-segmented-item {
1700    display: inline-flex;
1701    align-items: center;
1702    justify-content: center;
1703    gap: 6px;
1704    min-height: 28px;
1705    padding: 4px 10px;
1706    border-radius: var(--adui-radius-sm, 6px);
1707    border: 1px solid transparent;
1708    background: transparent;
1709    color: var(--adui-color-text, inherit);
1710    cursor: pointer;
1711    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1712}
1713
1714.adui-segmented-item:hover:not(:disabled) {
1715    background: var(--adui-color-bg-container, #ffffff);
1716    border-color: var(--adui-color-border, #d9d9d9);
1717}
1718
1719.adui-segmented-item:disabled {
1720    cursor: not-allowed;
1721    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
1722}
1723
1724.adui-segmented-item-active {
1725    background: var(--adui-color-bg-container, #ffffff);
1726    border-color: var(--adui-color-primary, #1677ff);
1727    color: var(--adui-color-primary, #1677ff);
1728    box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.12);
1729}
1730
1731.adui-segmented-item-icon {
1732    display: inline-flex;
1733    align-items: center;
1734}
1735
1736.adui-segmented-item-label {
1737    white-space: nowrap;
1738}
1739
1740/* Color Picker */
1741.adui-color-picker {
1742    display: inline-flex;
1743    gap: 12px;
1744    align-items: flex-start;
1745    padding: 8px;
1746    border: 1px solid var(--adui-color-border, #d9d9d9);
1747    border-radius: var(--adui-radius, 8px);
1748    background: var(--adui-color-bg-container, #ffffff);
1749}
1750
1751.adui-color-picker-disabled {
1752    opacity: 0.6;
1753    cursor: not-allowed;
1754}
1755
1756.adui-color-picker-preview {
1757    width: 40px;
1758    height: 40px;
1759    border-radius: var(--adui-radius-sm, 6px);
1760    border: 1px solid var(--adui-color-border, #d9d9d9);
1761    background: transparent;
1762}
1763
1764.adui-color-picker-controls {
1765    display: flex;
1766    flex-direction: column;
1767    gap: 8px;
1768    min-width: 180px;
1769}
1770
1771.adui-color-picker-sat {
1772    position: relative;
1773    width: 100%;
1774    aspect-ratio: 1 / 1;
1775    border-radius: var(--adui-radius-sm, 6px);
1776    overflow: hidden;
1777    cursor: crosshair;
1778}
1779
1780.adui-color-picker-sat-white {
1781    position: absolute;
1782    inset: 0;
1783    background: linear-gradient(90deg, #fff, rgba(255,255,255,0));
1784}
1785
1786.adui-color-picker-sat-black {
1787    position: absolute;
1788    inset: 0;
1789    background: linear-gradient(0deg, #000, rgba(0,0,0,0));
1790}
1791
1792.adui-color-picker-sat-handle {
1793    position: absolute;
1794    width: 12px;
1795    height: 12px;
1796    border-radius: 50%;
1797    border: 2px solid #fff;
1798    box-shadow: 0 0 0 1px rgba(0,0,0,0.3);
1799    transform: translate(-50%, -50%);
1800    pointer-events: none;
1801}
1802
1803.adui-color-picker-slider {
1804    position: relative;
1805    height: 12px;
1806    border-radius: 6px;
1807    border: 1px solid var(--adui-color-border, #d9d9d9);
1808    cursor: pointer;
1809}
1810
1811.adui-color-picker-input-row {
1812    display: flex;
1813    gap: 8px;
1814    align-items: center;
1815}
1816
1817.adui-color-picker-input {
1818    flex: 1;
1819    padding: 4px 8px;
1820    border: 1px solid var(--adui-color-border, #d9d9d9);
1821    border-radius: var(--adui-radius-sm, 4px);
1822    font: inherit;
1823}
1824
1825.adui-color-picker-clear {
1826    padding: 4px 8px;
1827    border: 1px solid var(--adui-color-border, #d9d9d9);
1828    background: var(--adui-color-bg-base, #f5f5f5);
1829    border-radius: var(--adui-radius-sm, 4px);
1830    cursor: pointer;
1831}
1832
1833/* Checkbox */
1834.adui-checkbox {
1835    display: inline-flex;
1836    align-items: center;
1837    cursor: pointer;
1838    font-size: var(--adui-font-size, 14px);
1839    color: var(--adui-color-text);
1840    gap: 8px;
1841}
1842
1843.adui-checkbox-input {
1844    position: absolute;
1845    opacity: 0;
1846}
1847
1848.adui-checkbox-inner {
1849    position: relative;
1850    width: 16px;
1851    height: 16px;
1852    border-radius: 4px;
1853    border: 1px solid var(--adui-color-border);
1854    background: var(--adui-color-bg-container);
1855    box-sizing: border-box;
1856    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1857}
1858
1859.adui-checkbox-checked .adui-checkbox-inner {
1860    background: var(--adui-color-primary);
1861    border-color: var(--adui-color-primary);
1862}
1863
1864.adui-checkbox-checked .adui-checkbox-inner::after {
1865    content: "";
1866    position: absolute;
1867    inset: 3px 2px;
1868    border: 2px solid #fff;
1869    border-top: 0;
1870    border-right: 0;
1871    transform: rotate(-45deg);
1872}
1873
1874.adui-checkbox-indeterminate .adui-checkbox-inner::after {
1875    content: "";
1876    position: absolute;
1877    inset: 50% 3px auto 3px;
1878    height: 0;
1879    border-bottom: 2px solid #fff;
1880    transform: translateY(-50%);
1881}
1882
1883.adui-checkbox-disabled {
1884    cursor: not-allowed;
1885    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
1886}
1887
1888.adui-checkbox-disabled .adui-checkbox-inner {
1889    background: rgba(0, 0, 0, 0.02);
1890    border-color: var(--adui-color-border);
1891}
1892
1893.adui-checkbox-group {
1894    display: inline-flex;
1895    flex-wrap: wrap;
1896    gap: 8px 16px;
1897}
1898
1899/* Radio */
1900.adui-radio {
1901    display: inline-flex;
1902    align-items: center;
1903    cursor: pointer;
1904    font-size: var(--adui-font-size, 14px);
1905    color: var(--adui-color-text);
1906    gap: 8px;
1907}
1908
1909.adui-radio-input {
1910    position: absolute;
1911    opacity: 0;
1912}
1913
1914.adui-radio-inner {
1915    position: relative;
1916    width: 16px;
1917    height: 16px;
1918    border-radius: 50%;
1919    border: 1px solid var(--adui-color-border);
1920    background: var(--adui-color-bg-container);
1921    box-sizing: border-box;
1922    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1923}
1924
1925.adui-radio-checked .adui-radio-inner {
1926    border-color: var(--adui-color-primary);
1927}
1928
1929.adui-radio-checked .adui-radio-inner::after {
1930    content: "";
1931    position: absolute;
1932    inset: 4px;
1933    border-radius: 50%;
1934    background: var(--adui-color-primary);
1935}
1936
1937.adui-radio-disabled {
1938    cursor: not-allowed;
1939    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
1940}
1941
1942.adui-radio-disabled .adui-radio-inner {
1943    background: rgba(0, 0, 0, 0.02);
1944    border-color: var(--adui-color-border);
1945}
1946
1947.adui-radio-group {
1948    display: inline-flex;
1949    flex-wrap: wrap;
1950    gap: 8px 16px;
1951}
1952
1953/* Switch */
1954.adui-switch {
1955    position: relative;
1956    display: inline-flex;
1957    align-items: center;
1958    box-sizing: border-box;
1959    min-width: 44px;
1960    height: 22px;
1961    border-radius: 100px;
1962    background: rgba(0, 0, 0, 0.25);
1963    cursor: pointer;
1964    border: none;
1965    padding: 2px;
1966    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1967}
1968
1969.adui-switch-handle {
1970    position: absolute;
1971    top: 2px;
1972    left: 2px;
1973    width: 18px;
1974    height: 18px;
1975    border-radius: 50%;
1976    background: #fff;
1977    box-shadow: 0 2px 4px rgba(0,0,0,0.15);
1978    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
1979}
1980
1981.adui-switch-checked {
1982    background: var(--adui-color-primary);
1983}
1984
1985.adui-switch-checked .adui-switch-handle {
1986    left: calc(100% - 20px);
1987}
1988
1989.adui-switch-inner {
1990    width: 100%;
1991    text-align: center;
1992    font-size: 12px;
1993    color: #fff;
1994    pointer-events: none;
1995}
1996
1997.adui-switch-small {
1998    min-width: 32px;
1999    height: 18px;
2000}
2001
2002.adui-switch-small .adui-switch-handle {
2003    width: 14px;
2004    height: 14px;
2005    top: 2px;
2006    left: 2px;
2007}
2008
2009.adui-switch-small.adui-switch-checked .adui-switch-handle {
2010    left: calc(100% - 16px);
2011}
2012
2013.adui-switch-disabled {
2014    cursor: not-allowed;
2015    opacity: 0.5;
2016}
2017
2018/* Select */
2019.adui-select-root {
2020    display: inline-block;
2021    min-width: 120px;
2022}
2023
2024.adui-select {
2025    display: inline-flex;
2026    align-items: center;
2027    box-sizing: border-box;
2028    width: 100%;
2029    min-height: 32px;
2030    padding: 0 11px;
2031    border-radius: var(--adui-radius-sm, 4px);
2032    border: 1px solid var(--adui-color-border);
2033    background: var(--adui-color-bg-container);
2034    color: var(--adui-color-text);
2035    font-size: var(--adui-font-size, 14px);
2036    line-height: var(--adui-line-height, 1.5715);
2037    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
2038    cursor: pointer;
2039}
2040
2041.adui-select:hover:not(.adui-select-disabled) {
2042    border-color: var(--adui-color-border-hover);
2043}
2044
2045.adui-select:focus-visible,
2046.adui-select:focus-within {
2047    outline: none;
2048    border-color: var(--adui-color-primary);
2049    box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.12);
2050}
2051
2052.adui-select-disabled {
2053    cursor: not-allowed;
2054    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
2055    background: rgba(0, 0, 0, 0.02);
2056}
2057
2058.adui-select-sm {
2059    min-height: 24px;
2060    padding: 0 8px;
2061    font-size: 13px;
2062}
2063
2064.adui-select-lg {
2065    min-height: 40px;
2066    padding: 0 12px;
2067    font-size: 15px;
2068}
2069
2070.adui-select-selector {
2071    flex: 1;
2072    min-width: 0;
2073    display: inline-flex;
2074    align-items: center;
2075    flex-wrap: wrap;
2076    gap: 4px;
2077}
2078
2079.adui-select-selection-placeholder {
2080    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2081}
2082
2083.adui-select-selection-item {
2084    max-width: 100%;
2085    display: inline-flex;
2086    align-items: center;
2087    padding: 0 4px;
2088    border-radius: 2px;
2089    background: transparent;
2090    color: inherit;
2091    white-space: nowrap;
2092    text-overflow: ellipsis;
2093    overflow: hidden;
2094}
2095
2096.adui-select-multiple .adui-select-selection-item {
2097    background: rgba(0, 0, 0, 0.04);
2098}
2099
2100.adui-select-clear {
2101    margin-left: 4px;
2102    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2103    font-size: 12px;
2104    cursor: pointer;
2105}
2106
2107.adui-select-clear:hover {
2108    color: var(--adui-color-text, inherit);
2109}
2110
2111.adui-select-dropdown {
2112    margin-top: 4px;
2113    border-radius: var(--adui-radius-sm, 4px);
2114    border: 1px solid var(--adui-color-border);
2115    background: var(--adui-color-bg-container);
2116    box-shadow: 0 6px 16px rgba(0,0,0,0.08);
2117    max-height: 240px;
2118    overflow-y: auto;
2119    box-sizing: border-box;
2120}
2121
2122.adui-select-search {
2123    padding: 4px 8px;
2124    border-bottom: 1px solid var(--adui-color-border);
2125}
2126
2127.adui-select-search-input {
2128    width: 100%;
2129    box-sizing: border-box;
2130    padding: 4px 8px;
2131    border-radius: var(--adui-radius-sm, 4px);
2132    border: 1px solid var(--adui-color-border);
2133    background: var(--adui-color-bg-container);
2134    font-size: var(--adui-font-size, 14px);
2135}
2136
2137.adui-select-item-list {
2138    list-style: none;
2139    margin: 0;
2140    padding: 4px 0;
2141}
2142
2143.adui-select-item {
2144    padding: 4px 12px;
2145    cursor: pointer;
2146    font-size: var(--adui-font-size, 14px);
2147    color: var(--adui-color-text);
2148    display: flex;
2149    align-items: center;
2150    transition: background 0.12s ease;
2151}
2152
2153.adui-select-item-option-active:not(.adui-select-item-option-disabled) {
2154    background: rgba(0, 0, 0, 0.04);
2155}
2156
2157.adui-select-item-option-selected:not(.adui-select-item-option-disabled) {
2158    background: rgba(22, 119, 255, 0.08);
2159    color: var(--adui-color-primary);
2160}
2161
2162.adui-select-item-option-disabled {
2163    cursor: not-allowed;
2164    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
2165}
2166
2167.adui-dropdown-root {
2168    position: relative;
2169    display: inline-block;
2170}
2171
2172.adui-dropdown-menu {
2173    border-radius: var(--adui-radius-sm, 4px);
2174    border: 1px solid var(--adui-color-border);
2175    background: var(--adui-color-bg-container);
2176    box-shadow: 0 6px 16px rgba(0,0,0,0.08);
2177    box-sizing: border-box;
2178}
2179
2180.adui-dropdown-menu-list {
2181    list-style: none;
2182    margin: 0;
2183    padding: 4px 0;
2184}
2185
2186.adui-dropdown-menu-item {
2187    padding: 4px 12px;
2188    cursor: pointer;
2189    font-size: var(--adui-font-size, 14px);
2190    color: var(--adui-color-text);
2191    display: flex;
2192    align-items: center;
2193    transition: background 0.12s ease;
2194}
2195
2196.adui-dropdown-menu-item:hover:not(.adui-dropdown-menu-item-disabled) {
2197    background: rgba(0, 0, 0, 0.04);
2198}
2199
2200.adui-dropdown-menu-item-disabled {
2201    cursor: not-allowed;
2202    color: var(--adui-color-text-disabled, rgba(0,0,0,0.25));
2203}
2204
2205.adui-dropdown-sm .adui-dropdown-menu-item {
2206    font-size: 13px;
2207    padding: 4px 10px;
2208}
2209
2210.adui-dropdown-lg .adui-dropdown-menu-item {
2211    font-size: 15px;
2212    padding: 6px 14px;
2213}
2214
2215 	/* Generic status helpers (can be applied to wrappers) */
2216 	.adui-control-status-success,
2217.adui-control-status-success:focus,
2218.adui-control-status-success:focus-within {
2219    border-color: var(--adui-color-success);
2220}
2221
2222.adui-control-status-warning,
2223.adui-control-status-warning:focus,
2224.adui-control-status-warning:focus-within {
2225    border-color: var(--adui-color-warning);
2226}
2227
2228.adui-control-status-error,
2229.adui-control-status-error:focus,
2230.adui-control-status-error:focus-within {
2231    border-color: var(--adui-color-error);
2232}
2233"#
2234    };
2235}
2236
2237macro_rules! adui_empty_style {
2238    () => {
2239        r#"
2240.adui-empty {
2241    margin: 0;
2242    padding: 16px 8px;
2243    text-align: center;
2244    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2245    font-size: var(--adui-font-size-sm, 13px);
2246}
2247
2248.adui-empty-sm {
2249    padding: 8px 4px;
2250}
2251
2252.adui-empty-image {
2253    margin-bottom: 8px;
2254    display: flex;
2255    align-items: center;
2256    justify-content: center;
2257}
2258
2259.adui-empty-image-svg {
2260    width: 64px;
2261    height: 41px;
2262}
2263
2264.adui-empty-image-simple {
2265    width: 40px;
2266    height: 32px;
2267    border-radius: var(--adui-radius-sm, 4px);
2268    background: var(--adui-color-bg-container);
2269    border: 1px dashed var(--adui-color-border);
2270}
2271
2272.adui-empty-image-img {
2273    max-width: 100%;
2274    max-height: 80px;
2275    object-fit: contain;
2276}
2277
2278.adui-empty-description {
2279    margin: 0;
2280    margin-top: 4px;
2281    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2282}
2283
2284.adui-empty-footer {
2285    margin-top: 12px;
2286}
2287"#
2288    };
2289}
2290
2291macro_rules! adui_spin_style {
2292    () => {
2293        r#"
2294.adui-spin {
2295    display: inline-flex;
2296    flex-direction: column;
2297    align-items: center;
2298    justify-content: center;
2299    gap: 8px;
2300    color: var(--adui-color-primary);
2301}
2302
2303.adui-spin-sm {
2304    font-size: var(--adui-font-size-sm, 13px);
2305}
2306
2307.adui-spin-lg {
2308    font-size: var(--adui-font-size-lg, 16px);
2309}
2310
2311.adui-spin-indicator {
2312    display: inline-flex;
2313    align-items: center;
2314    justify-content: center;
2315}
2316
2317.adui-spin-dot {
2318    width: 20px;
2319    height: 20px;
2320    border-radius: 50%;
2321    border: 2px solid currentColor;
2322    border-right-color: transparent;
2323    animation: adui-spin 0.9s linear infinite;
2324}
2325
2326.adui-spin-text {
2327    font-size: var(--adui-font-size-sm, 13px);
2328    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2329}
2330
2331.adui-spin-nested {
2332    position: relative;
2333    display: block;
2334}
2335
2336.adui-spin-nested-container {
2337    position: relative;
2338}
2339
2340.adui-spin-nested-mask {
2341    position: absolute;
2342    inset: 0;
2343    display: flex;
2344    flex-direction: column;
2345    align-items: center;
2346    justify-content: center;
2347    background: rgba(255, 255, 255, 0.65);
2348}
2349
2350.adui-theme-scope[theme-mode="dark"] .adui-spin-nested-mask {
2351    background: rgba(0, 0, 0, 0.45);
2352}
2353
2354.adui-spin-fullscreen {
2355    position: fixed;
2356    inset: 0;
2357    z-index: 9999;
2358    background: rgba(255, 255, 255, 0.65);
2359}
2360"#
2361    };
2362}
2363
2364macro_rules! adui_progress_style {
2365    () => {
2366        r#"
2367.adui-progress {
2368    display: inline-flex;
2369    align-items: center;
2370    gap: 8px;
2371    font-size: var(--adui-font-size-sm, 13px);
2372}
2373
2374.adui-progress-outer {
2375    flex: 1;
2376}
2377
2378.adui-progress-inner {
2379    width: 100%;
2380    background: rgba(0, 0, 0, 0.04);
2381    border-radius: 100px;
2382    overflow: hidden;
2383}
2384
2385.adui-theme-scope[theme-mode="dark"] .adui-progress-inner {
2386    background: rgba(255, 255, 255, 0.16);
2387}
2388
2389.adui-progress-bg {
2390    background: var(--adui-color-primary, #1677ff);
2391    border-radius: inherit;
2392    transition: width var(--adui-motion-duration-mid, 0.24s) ease;
2393}
2394
2395.adui-progress-text {
2396    min-width: 40px;
2397    text-align: right;
2398    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2399}
2400
2401.adui-progress-status-success .adui-progress-bg {
2402    background: var(--adui-color-success, #52c41a);
2403}
2404
2405.adui-progress-status-exception .adui-progress-bg {
2406    background: var(--adui-color-error, #ff4d4f);
2407}
2408
2409.adui-progress-status-active .adui-progress-bg {
2410    background: var(--adui-color-primary, #1677ff);
2411}
2412
2413.adui-progress-circle {
2414    flex-direction: column;
2415}
2416
2417.adui-progress-circle-inner {
2418    box-sizing: border-box;
2419    border-style: solid;
2420    border-color: transparent;
2421    border-radius: 50%;
2422}
2423
2424.adui-progress-circle .adui-progress-text {
2425    margin-top: 8px;
2426    text-align: center;
2427}
2428"#
2429    };
2430}
2431
2432macro_rules! adui_statistic_style {
2433    () => {
2434        r#"
2435.adui-statistic {
2436    display: inline-flex;
2437    flex-direction: column;
2438}
2439
2440.adui-statistic-title {
2441    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2442    font-size: var(--adui-font-size-sm, 13px);
2443    margin-bottom: 4px;
2444}
2445
2446.adui-statistic-content {
2447    display: inline-flex;
2448    align-items: baseline;
2449    gap: 4px;
2450}
2451
2452.adui-statistic-prefix,
2453.adui-statistic-suffix {
2454    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2455}
2456
2457.adui-statistic-value {
2458    font-size: 20px;
2459    font-weight: 600;
2460    color: var(--adui-color-text);
2461}
2462"#
2463    };
2464}
2465
2466macro_rules! adui_skeleton_style {
2467    () => {
2468        r#"
2469.adui-skeleton {
2470    display: block;
2471    padding: 12px 16px;
2472    background: var(--adui-color-bg-container);
2473    border-radius: var(--adui-radius);
2474}
2475
2476.adui-skeleton-title,
2477.adui-skeleton-paragraph-line {
2478    height: 14px;
2479    margin-bottom: 8px;
2480    border-radius: 999px;
2481    background: rgba(0, 0, 0, 0.06);
2482}
2483
2484.adui-theme-scope[theme-mode="dark"] .adui-skeleton-title,
2485.adui-theme-scope[theme-mode="dark"] .adui-skeleton-paragraph-line {
2486    background: rgba(255, 255, 255, 0.1);
2487}
2488
2489.adui-skeleton-title {
2490    width: 40%;
2491}
2492
2493.adui-skeleton-paragraph {
2494    margin-top: 8px;
2495}
2496
2497.adui-skeleton-paragraph-line-last {
2498    width: 60%;
2499}
2500
2501.adui-skeleton-active .adui-skeleton-title,
2502.adui-skeleton-active .adui-skeleton-paragraph-line {
2503    position: relative;
2504    overflow: hidden;
2505}
2506
2507.adui-skeleton-active .adui-skeleton-title::after,
2508.adui-skeleton-active .adui-skeleton-paragraph-line::after {
2509    content: "";
2510    position: absolute;
2511    inset: 0;
2512    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.35), transparent);
2513    animation: adui-skeleton-shimmer 1.2s ease-in-out infinite;
2514}
2515
2516@keyframes adui-skeleton-shimmer {
2517    0% { transform: translateX(-100%); }
2518    100% { transform: translateX(100%); }
2519}
2520"#
2521    };
2522}
2523
2524macro_rules! adui_list_style {
2525    () => {
2526        r#"
2527.adui-list {
2528    background: var(--adui-color-bg-container);
2529    border-radius: var(--adui-radius);
2530    border: 1px solid transparent;
2531    padding: 0;
2532    margin: 0;
2533}
2534
2535.adui-list-bordered {
2536    border-color: var(--adui-color-border);
2537}
2538
2539.adui-list-sm .adui-list-item {
2540    padding: 8px 12px;
2541}
2542
2543.adui-list-lg .adui-list-item {
2544    padding: 16px 20px;
2545}
2546
2547.adui-list-header,
2548.adui-list-footer {
2549    padding: 12px 16px;
2550    border-bottom: 1px solid var(--adui-color-border);
2551}
2552
2553.adui-list-footer {
2554    border-top: 1px solid var(--adui-color-border);
2555    border-bottom: none;
2556}
2557
2558.adui-list-body {
2559    padding: 0;
2560}
2561
2562.adui-list-items {
2563    list-style: none;
2564    margin: 0;
2565    padding: 0;
2566}
2567
2568.adui-list-item {
2569    padding: 12px 16px;
2570    border-bottom: 1px solid var(--adui-color-border);
2571}
2572
2573.adui-list-item:last-child {
2574    border-bottom: none;
2575}
2576
2577.adui-list-empty {
2578    padding: 16px;
2579}
2580
2581.adui-list-pagination {
2582    padding: 8px 16px;
2583    text-align: right;
2584}
2585"#
2586    };
2587}
2588
2589macro_rules! adui_tabs_style {
2590    () => {
2591        r#"
2592.adui-tabs {
2593    margin: 0;
2594}
2595
2596.adui-tabs-nav {
2597    display: flex;
2598    border-bottom: 1px solid var(--adui-color-border);
2599    margin-bottom: 8px;
2600}
2601
2602.adui-tabs-nav-list {
2603    display: flex;
2604    gap: 16px;
2605}
2606
2607.adui-tabs-tab {
2608    position: relative;
2609    padding: 8px 0;
2610    margin: 0;
2611    border: none;
2612    background: transparent;
2613    cursor: pointer;
2614    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2615    font-size: var(--adui-font-size, 14px);
2616}
2617
2618.adui-tabs-tab:focus-visible {
2619    outline: none;
2620}
2621
2622.adui-tabs-tab-active {
2623    color: var(--adui-color-text);
2624    font-weight: 500;
2625}
2626
2627.adui-tabs-tab-active::after {
2628    content: "";
2629    position: absolute;
2630    left: 0;
2631    right: 0;
2632    bottom: -1px;
2633    height: 2px;
2634    background: var(--adui-color-primary);
2635    border-radius: 2px 2px 0 0;
2636}
2637
2638.adui-tabs-tab-disabled {
2639    cursor: not-allowed;
2640    color: var(--adui-color-text-disabled);
2641}
2642
2643.adui-tabs-sm .adui-tabs-tab {
2644    padding: 4px 0;
2645    font-size: var(--adui-font-size-sm, 13px);
2646}
2647
2648.adui-tabs-lg .adui-tabs-tab {
2649    padding: 10px 0;
2650    font-size: var(--adui-font-size-lg, 16px);
2651}
2652
2653.adui-tabs-content {
2654    padding-top: 4px;
2655}
2656
2657.adui-tabs-tabpane {
2658    padding-top: 4px;
2659}
2660"#
2661    };
2662}
2663
2664macro_rules! adui_card_style {
2665    () => {
2666        r#"
2667.adui-card {
2668    position: relative;
2669    border-radius: var(--adui-radius);
2670    background: var(--adui-color-bg-container);
2671    border: 1px solid transparent;
2672    box-shadow: none;
2673    transition: box-shadow var(--adui-motion-duration-fast, 0.16s) ease,
2674                transform var(--adui-motion-duration-fast, 0.16s) ease,
2675                border-color var(--adui-motion-duration-fast, 0.16s) ease;
2676}
2677
2678.adui-card-bordered {
2679    border-color: var(--adui-color-border);
2680}
2681
2682.adui-card-hoverable {
2683    cursor: pointer;
2684}
2685
2686.adui-card-hoverable:hover {
2687    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
2688    transform: translateY(-1px);
2689}
2690
2691.adui-card-head {
2692    display: flex;
2693    align-items: center;
2694    justify-content: space-between;
2695    padding: 12px 16px;
2696    border-bottom: 1px solid var(--adui-color-border);
2697}
2698
2699.adui-card-head-title {
2700    font-weight: 500;
2701}
2702
2703.adui-card-head-extra {
2704    margin-left: 12px;
2705}
2706
2707.adui-card-body {
2708    padding: 16px;
2709}
2710
2711.adui-card-sm .adui-card-head {
2712    padding: 8px 12px;
2713}
2714
2715.adui-card-sm .adui-card-body {
2716    padding: 12px;
2717}
2718
2719.adui-card-lg .adui-card-head {
2720    padding: 16px 20px;
2721}
2722
2723.adui-card-lg .adui-card-body {
2724    padding: 20px;
2725}
2726"#
2727    };
2728}
2729
2730macro_rules! adui_tag_style {
2731    () => {
2732        r#"
2733.adui-tag {
2734    display: inline-flex;
2735    align-items: center;
2736    gap: 4px;
2737    padding: 0 7px;
2738    min-height: 22px;
2739    border-radius: 2px;
2740    font-size: 12px;
2741    line-height: 1.6;
2742    border: 1px solid transparent;
2743    background: rgba(0, 0, 0, 0.02);
2744    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
2745}
2746
2747.adui-tag-default {
2748    border-color: var(--adui-color-border);
2749}
2750
2751.adui-tag-primary {
2752    border-color: var(--adui-color-primary);
2753    color: var(--adui-color-primary);
2754    background: rgba(22, 119, 255, 0.08);
2755}
2756
2757.adui-tag-success {
2758    border-color: var(--adui-color-success);
2759    color: var(--adui-color-success);
2760    background: rgba(82, 196, 26, 0.08);
2761}
2762
2763.adui-tag-warning {
2764    border-color: var(--adui-color-warning);
2765    color: var(--adui-color-warning);
2766    background: rgba(250, 173, 20, 0.08);
2767}
2768
2769.adui-tag-error {
2770    border-color: var(--adui-color-error);
2771    color: var(--adui-color-error);
2772    background: rgba(255, 77, 79, 0.08);
2773}
2774
2775.adui-tag-checkable {
2776    cursor: pointer;
2777}
2778
2779.adui-tag-checkable-checked {
2780    background: var(--adui-color-primary);
2781    color: #fff;
2782    border-color: transparent;
2783}
2784
2785.adui-tag-close {
2786    display: inline-flex;
2787    align-items: center;
2788    justify-content: center;
2789    padding: 0;
2790    border: none;
2791    background: transparent;
2792    cursor: pointer;
2793    color: inherit;
2794}
2795
2796.adui-tag-close:focus-visible {
2797    outline: none;
2798}
2799"#
2800    };
2801}
2802
2803macro_rules! adui_badge_style {
2804    () => {
2805        r#"
2806.adui-badge {
2807    position: relative;
2808    display: inline-block;
2809}
2810
2811.adui-badge > *:not(.adui-badge-count):not(.adui-badge-dot) {
2812    vertical-align: middle;
2813}
2814
2815.adui-badge-count,
2816.adui-badge-dot {
2817    position: absolute;
2818    top: 0;
2819    right: 0;
2820    transform: translate(50%, -50%);
2821}
2822
2823.adui-badge-count {
2824    min-width: 20px;
2825    height: 20px;
2826    padding: 0 6px;
2827    border-radius: 999px;
2828    background: var(--adui-color-error);
2829    color: #fff;
2830    font-size: 12px;
2831    line-height: 20px;
2832    text-align: center;
2833    box-sizing: border-box;
2834}
2835
2836.adui-badge-dot {
2837    width: 8px;
2838    height: 8px;
2839    border-radius: 50%;
2840    background: var(--adui-color-error);
2841}
2842
2843.adui-badge-status-success .adui-badge-count,
2844.adui-badge-status-success .adui-badge-dot {
2845    background: var(--adui-color-success);
2846}
2847
2848.adui-badge-status-warning .adui-badge-count,
2849.adui-badge-status-warning .adui-badge-dot {
2850    background: var(--adui-color-warning);
2851}
2852
2853.adui-badge-status-error .adui-badge-count,
2854.adui-badge-status-error .adui-badge-dot {
2855    background: var(--adui-color-error);
2856}
2857"#
2858    };
2859}
2860
2861macro_rules! adui_avatar_style {
2862    () => {
2863        r#"
2864.adui-avatar {
2865    display: inline-flex;
2866    align-items: center;
2867    justify-content: center;
2868    border-radius: 50%;
2869    background: var(--adui-color-bg-container);
2870    color: var(--adui-color-text);
2871    overflow: hidden;
2872}
2873
2874.adui-avatar-circle {
2875    border-radius: 50%;
2876}
2877
2878.adui-avatar-square {
2879    border-radius: var(--adui-radius);
2880}
2881
2882.adui-avatar-sm {
2883    width: 24px;
2884    height: 24px;
2885    font-size: 12px;
2886}
2887
2888.adui-avatar-md {
2889    width: 32px;
2890    height: 32px;
2891    font-size: 14px;
2892}
2893
2894.adui-avatar-lg {
2895    width: 40px;
2896    height: 40px;
2897    font-size: 16px;
2898}
2899
2900.adui-avatar-img {
2901    width: 100%;
2902    height: 100%;
2903    object-fit: cover;
2904    display: block;
2905}
2906
2907.adui-avatar-icon,
2908.adui-avatar-text {
2909    display: inline-flex;
2910    align-items: center;
2911    justify-content: center;
2912    width: 100%;
2913    height: 100%;
2914}
2915
2916.adui-avatar-group {
2917    display: inline-flex;
2918}
2919
2920.adui-avatar-group .adui-avatar {
2921    margin-left: -8px;
2922    border: 2px solid var(--adui-color-bg-base);
2923}
2924
2925.adui-avatar-group .adui-avatar:first-child {
2926    margin-left: 0;
2927}
2928"#
2929    };
2930}
2931
2932macro_rules! adui_table_style {
2933    () => {
2934        r#"
2935.adui-table {
2936    width: 100%;
2937    background: var(--adui-color-bg-container);
2938    border-radius: var(--adui-radius);
2939    border: 1px solid transparent;
2940    overflow: hidden;
2941}
2942
2943.adui-table-bordered {
2944    border-color: var(--adui-color-border);
2945}
2946
2947.adui-table-header {
2948    border-bottom: 1px solid var(--adui-color-border);
2949}
2950
2951.adui-table-row {
2952    display: flex;
2953}
2954
2955.adui-table-row-header {
2956    background: rgba(0, 0, 0, 0.02);
2957    font-weight: 500;
2958}
2959
2960.adui-table-cell {
2961    flex: 1;
2962    padding: 8px 12px;
2963    border-right: 1px solid var(--adui-color-border);
2964    box-sizing: border-box;
2965}
2966
2967.adui-table-row .adui-table-cell:last-child {
2968    border-right: none;
2969}
2970
2971.adui-table-body-inner .adui-table-row:nth-child(even) {
2972    background: rgba(0, 0, 0, 0.01);
2973}
2974
2975.adui-table-align-left { text-align: left; }
2976.adui-table-align-center { text-align: center; }
2977.adui-table-align-right { text-align: right; }
2978
2979.adui-table-empty {
2980    padding: 16px;
2981}
2982
2983.adui-table-pagination {
2984    padding: 8px 16px;
2985    text-align: right;
2986}
2987"#
2988    };
2989}
2990
2991macro_rules! adui_masonry_style {
2992    () => {
2993        r#"
2994.adui-masonry > * {
2995    break-inside: avoid;
2996    margin-bottom: var(--adui-masonry-row-gap, var(--adui-masonry-gap, 16px));
2997}
2998"#
2999    };
3000}
3001
3002macro_rules! adui_splitter_style {
3003    () => {
3004        r#"
3005.adui-splitter {
3006    border: 1px solid var(--adui-color-border);
3007    border-radius: var(--adui-radius);
3008    padding: 8px;
3009    background: var(--adui-color-bg-container);
3010}
3011
3012.adui-splitter-pane {
3013    background: var(--adui-color-bg-container);
3014    border: 1px solid var(--adui-color-border);
3015    border-radius: var(--adui-radius);
3016    padding: 12px;
3017    min-height: 60px;
3018}
3019
3020.adui-splitter-gutter {
3021    flex: 0 0 6px;
3022    background: rgba(0,0,0,0.02);
3023}
3024.adui-splitter-horizontal .adui-splitter-gutter {
3025    cursor: col-resize;
3026}
3027.adui-splitter-vertical .adui-splitter-gutter {
3028    cursor: row-resize;
3029}
3030"#
3031    };
3032}
3033
3034macro_rules! adui_float_button_style {
3035    () => {
3036        r#"
3037.adui-float-btn {
3038    position: relative;
3039    display: inline-flex;
3040    flex-direction: column;
3041    align-items: center;
3042    justify-content: center;
3043    gap: 6px;
3044    min-width: var(--adui-fb-size, 56px);
3045    height: var(--adui-fb-size, 56px);
3046    padding: 0 var(--adui-fb-padding-inline, 0px);
3047    border: 1px solid var(--adui-fb-border);
3048    background: var(--adui-fb-bg);
3049    color: var(--adui-fb-color);
3050    border-radius: var(--adui-fb-radius);
3051    box-shadow: var(--adui-fb-shadow);
3052    cursor: pointer;
3053    transition: all var(--adui-motion-duration-fast, 0.18s) ease;
3054    text-decoration: none;
3055    text-align: center;
3056}
3057
3058.adui-float-btn-individual {
3059    position: fixed;
3060    z-index: 99;
3061}
3062
3063.adui-float-btn:hover {
3064    background: var(--adui-fb-bg-hover);
3065    color: var(--adui-fb-color-hover);
3066    border-color: var(--adui-fb-border-hover);
3067    transform: translateY(-2px);
3068}
3069
3070.adui-float-btn:focus-visible {
3071    outline: none;
3072    box-shadow: 0 0 0 3px rgba(64, 150, 255, 0.35), var(--adui-fb-shadow);
3073}
3074
3075.adui-float-btn:active {
3076    background: var(--adui-fb-bg-active);
3077    color: var(--adui-fb-color-active);
3078    border-color: var(--adui-fb-border-active);
3079    transform: translateY(0);
3080}
3081
3082.adui-float-btn-icon {
3083    display: inline-flex;
3084    align-items: center;
3085    justify-content: center;
3086    font-size: 18px;
3087    line-height: 1;
3088}
3089
3090.adui-float-btn-icon-only .adui-float-btn-icon {
3091    font-size: 22px;
3092}
3093
3094.adui-float-btn-circle {
3095    padding: 0;
3096}
3097
3098.adui-float-btn-square {
3099    padding-inline: var(--adui-fb-padding-inline, 12px);
3100}
3101
3102.adui-float-btn-square .adui-float-btn-content {
3103    margin-top: 4px;
3104}
3105
3106.adui-float-btn-content {
3107    font-size: 12px;
3108    line-height: 1.2;
3109    text-align: center;
3110    white-space: normal;
3111    word-break: break-word;
3112}
3113
3114.adui-float-btn-badge {
3115    display: inline-flex;
3116    align-items: center;
3117    justify-content: center;
3118    min-width: 18px;
3119    height: 18px;
3120    padding: 0 6px;
3121    border-radius: 999px;
3122    background: var(--adui-color-error);
3123    color: #fff;
3124    font-size: 11px;
3125    position: absolute;
3126    top: 0;
3127    right: 0;
3128    transform: translate(50%, -50%);
3129}
3130
3131.adui-float-btn-badge-dot {
3132    width: 8px;
3133    height: 8px;
3134    padding: 0;
3135    border-radius: 50%;
3136}
3137
3138[dir="rtl"] .adui-float-btn-badge:not(.adui-float-btn-badge-dot) {
3139    right: auto;
3140    left: 0;
3141    transform: translate(-50%, -50%);
3142}
3143
3144.adui-float-btn-group {
3145    position: fixed;
3146    display: flex;
3147    flex-direction: column;
3148    gap: var(--adui-fb-group-gap, 12px);
3149}
3150
3151.adui-float-btn-group > .adui-float-btn {
3152    position: relative;
3153}
3154
3155.adui-float-btn-group-pure {
3156    position: static;
3157}
3158
3159	.adui-float-btn-primary {
3160	    color: #fff;
3161	}
3162	"#
3163    };
3164}
3165
3166macro_rules! adui_tooltip_style {
3167    () => {
3168        r#"
3169.adui-tooltip-root {
3170    position: relative;
3171    display: inline-block;
3172}
3173
3174.adui-tooltip {
3175    padding: 4px 8px;
3176    background: rgba(0, 0, 0, 0.75);
3177    color: #fff;
3178    border-radius: var(--adui-radius-sm, 4px);
3179    font-size: 12px;
3180    line-height: 1.4;
3181    box-shadow: 0 2px 8px rgba(0,0,0,0.15);
3182    max-width: 320px;
3183    pointer-events: auto;
3184}
3185
3186.adui-tooltip-inner {
3187    white-space: normal;
3188    word-break: break-word;
3189}
3190
3191.adui-popover-root {
3192    position: relative;
3193    display: inline-block;
3194}
3195
3196.adui-popover {
3197    background: var(--adui-color-bg-container);
3198    color: var(--adui-color-text);
3199    border-radius: var(--adui-radius-sm, 4px);
3200    border: 1px solid var(--adui-color-border);
3201    box-shadow: var(--adui-shadow-secondary);
3202    min-width: 200px;
3203    max-width: 360px;
3204}
3205
3206.adui-popover-inner {
3207    padding: 12px 16px;
3208}
3209
3210.adui-popover-title {
3211    margin-bottom: 8px;
3212    font-weight: 600;
3213}
3214
3215.adui-popover-content {
3216    font-size: 14px;
3217}
3218
3219.adui-popconfirm-inner {
3220    min-width: 220px;
3221}
3222
3223.adui-popconfirm-body {
3224    margin-bottom: 12px;
3225}
3226
3227.adui-popconfirm-title {
3228    font-weight: 600;
3229    margin-bottom: 4px;
3230}
3231
3232.adui-popconfirm-description {
3233    font-size: 13px;
3234    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
3235}
3236
3237.adui-popconfirm-footer {
3238    display: flex;
3239    justify-content: flex-end;
3240    gap: 8px;
3241}
3242"#
3243    };
3244}
3245
3246macro_rules! adui_keyframes_style {
3247    () => {
3248        r#"
3249@keyframes adui-spin {
3250    from { transform: rotate(0deg); }
3251    to { transform: rotate(360deg); }
3252}
3253"#
3254    };
3255}
3256
3257macro_rules! adui_watermark_style {
3258    () => {
3259        r#"
3260.adui-watermark-wrapper {
3261    position: relative;
3262    overflow: hidden;
3263}
3264
3265.adui-watermark {
3266    position: absolute;
3267    inset: 0;
3268    pointer-events: none;
3269    background-repeat: repeat;
3270    z-index: 9;
3271}
3272"#
3273    };
3274}
3275
3276macro_rules! adui_qrcode_style {
3277    () => {
3278        r#"
3279.adui-qrcode-wrapper {
3280    display: inline-block;
3281}
3282
3283.adui-qrcode {
3284    position: relative;
3285    display: inline-flex;
3286    align-items: center;
3287    justify-content: center;
3288    padding: 12px;
3289    border-radius: var(--adui-radius, 8px);
3290    border: 1px solid var(--adui-color-border, #d9d9d9);
3291    background: var(--adui-color-bg-container, #ffffff);
3292}
3293
3294.adui-qrcode-borderless {
3295    border: none;
3296    padding: 0;
3297}
3298
3299.adui-qrcode svg {
3300    display: block;
3301}
3302
3303.adui-qrcode-cover {
3304    position: absolute;
3305    inset: 0;
3306    display: flex;
3307    align-items: center;
3308    justify-content: center;
3309    background: rgba(255, 255, 255, 0.9);
3310    border-radius: inherit;
3311}
3312
3313.adui-theme-scope[theme-mode="dark"] .adui-qrcode-cover {
3314    background: rgba(0, 0, 0, 0.75);
3315}
3316
3317.adui-qrcode-status {
3318    display: flex;
3319    flex-direction: column;
3320    align-items: center;
3321    gap: 8px;
3322    text-align: center;
3323}
3324
3325.adui-qrcode-status-text {
3326    font-size: 14px;
3327    color: var(--adui-color-text-secondary, var(--adui-color-text-muted));
3328}
3329
3330.adui-qrcode-status-icon {
3331    font-size: 24px;
3332    color: var(--adui-color-success, #52c41a);
3333}
3334
3335.adui-qrcode-refresh-btn {
3336    padding: 4px 12px;
3337    border: 1px solid var(--adui-color-primary, #1677ff);
3338    border-radius: var(--adui-radius-sm, 4px);
3339    background: transparent;
3340    color: var(--adui-color-primary, #1677ff);
3341    cursor: pointer;
3342    font-size: 14px;
3343    transition: all var(--adui-motion-duration-fast, 0.16s) ease;
3344}
3345
3346.adui-qrcode-refresh-btn:hover {
3347    background: var(--adui-color-primary, #1677ff);
3348    color: #fff;
3349}
3350
3351.adui-qrcode-spinner {
3352    width: 24px;
3353    height: 24px;
3354    border: 2px solid var(--adui-color-primary, #1677ff);
3355    border-right-color: transparent;
3356    border-radius: 50%;
3357    animation: adui-spin 0.9s linear infinite;
3358}
3359
3360.adui-qrcode-expired .adui-qrcode-cover {
3361    background: rgba(255, 255, 255, 0.96);
3362}
3363
3364.adui-theme-scope[theme-mode="dark"] .adui-qrcode-expired .adui-qrcode-cover {
3365    background: rgba(0, 0, 0, 0.85);
3366}
3367"#
3368    };
3369}
3370
3371macro_rules! adui_tree_style {
3372    () => {
3373        r#"
3374/* Tree Component Styles */
3375.adui-tree {
3376    padding: 4px 0;
3377    list-style: none;
3378    background: transparent;
3379    font-size: 14px;
3380    line-height: 1.5;
3381}
3382
3383.adui-tree-list {
3384    margin: 0;
3385    padding: 0;
3386    list-style: none;
3387}
3388
3389.adui-tree-treenode {
3390    display: flex;
3391    align-items: stretch;
3392    min-height: 28px;
3393    cursor: pointer;
3394    transition: background 0.2s;
3395    position: relative;
3396    white-space: nowrap;
3397}
3398
3399.adui-tree-treenode:hover {
3400    background: var(--adui-color-fill-tertiary, rgba(0, 0, 0, 0.04));
3401}
3402
3403.adui-tree-treenode-selected {
3404    background: var(--adui-color-primary-bg, #e6f4ff);
3405}
3406
3407.adui-tree-treenode-disabled {
3408    color: var(--adui-color-text-disabled, rgba(0, 0, 0, 0.25));
3409    cursor: not-allowed;
3410}
3411
3412.adui-tree-treenode-disabled:hover {
3413    background: transparent;
3414}
3415
3416.adui-tree-treenode-active {
3417    outline: 2px solid var(--adui-color-primary, #1677ff);
3418    outline-offset: -2px;
3419}
3420
3421/* Indent unit for tree structure */
3422.adui-tree-indent-unit {
3423    flex-shrink: 0;
3424}
3425
3426/* Switcher (expand/collapse icon) */
3427.adui-tree-switcher {
3428    display: inline-flex;
3429    align-items: center;
3430    justify-content: center;
3431    width: 24px;
3432    color: var(--adui-color-text-tertiary, rgba(0, 0, 0, 0.45));
3433    cursor: pointer;
3434    flex-shrink: 0;
3435}
3436
3437.adui-tree-switcher:hover {
3438    color: var(--adui-color-text, rgba(0, 0, 0, 0.88));
3439}
3440
3441.adui-tree-switcher-leaf {
3442    cursor: default;
3443}
3444
3445.adui-tree-switcher-icon {
3446    font-size: 10px;
3447    user-select: none;
3448}
3449
3450/* Checkbox */
3451.adui-tree-checkbox {
3452    display: inline-flex;
3453    align-items: center;
3454    justify-content: center;
3455    width: 16px;
3456    height: 16px;
3457    margin-right: 8px;
3458    cursor: pointer;
3459    flex-shrink: 0;
3460    align-self: center;
3461}
3462
3463.adui-tree-checkbox-inner {
3464    display: block;
3465    width: 16px;
3466    height: 16px;
3467    border: 1px solid var(--adui-color-border, #d9d9d9);
3468    border-radius: 4px;
3469    background: var(--adui-color-bg-container, #ffffff);
3470    transition: all 0.2s;
3471    position: relative;
3472}
3473
3474.adui-tree-checkbox:hover .adui-tree-checkbox-inner {
3475    border-color: var(--adui-color-primary, #1677ff);
3476}
3477
3478.adui-tree-checkbox-checked .adui-tree-checkbox-inner {
3479    background: var(--adui-color-primary, #1677ff);
3480    border-color: var(--adui-color-primary, #1677ff);
3481}
3482
3483.adui-tree-checkbox-checked .adui-tree-checkbox-inner::after {
3484    content: '';
3485    position: absolute;
3486    top: 50%;
3487    left: 22%;
3488    width: 5px;
3489    height: 9px;
3490    border: 2px solid #fff;
3491    border-top: 0;
3492    border-left: 0;
3493    transform: rotate(45deg) translate(-50%, -50%);
3494    transform-origin: left top;
3495}
3496
3497.adui-tree-checkbox-indeterminate .adui-tree-checkbox-inner::after {
3498    content: '';
3499    position: absolute;
3500    top: 50%;
3501    left: 50%;
3502    width: 8px;
3503    height: 2px;
3504    background: var(--adui-color-primary, #1677ff);
3505    transform: translate(-50%, -50%);
3506}
3507
3508.adui-tree-checkbox-disabled {
3509    cursor: not-allowed;
3510}
3511
3512.adui-tree-checkbox-disabled .adui-tree-checkbox-inner {
3513    background: var(--adui-color-fill-tertiary, rgba(0, 0, 0, 0.04));
3514    border-color: var(--adui-color-border, #d9d9d9);
3515}
3516
3517/* Content wrapper */
3518.adui-tree-node-content-wrapper {
3519    display: inline-flex;
3520    align-items: center;
3521    padding: 2px 8px;
3522    border-radius: 4px;
3523    transition: all 0.2s;
3524    flex: 1;
3525    min-width: 0;
3526}
3527
3528.adui-tree-node-content-wrapper:hover {
3529    background: var(--adui-color-fill-tertiary, rgba(0, 0, 0, 0.04));
3530}
3531
3532.adui-tree-node-selected {
3533    background: var(--adui-color-primary-bg, #e6f4ff);
3534}
3535
3536.adui-tree-iconEle {
3537    display: inline-flex;
3538    align-items: center;
3539    margin-right: 4px;
3540    flex-shrink: 0;
3541}
3542
3543.adui-tree-title {
3544    overflow: hidden;
3545    text-overflow: ellipsis;
3546}
3547
3548/* Show Line mode - no extra CSS pseudo-elements, lines are rendered inline */
3549.adui-tree-show-line .adui-tree-treenode {
3550    /* Lines are rendered via inline spans */
3551}
3552
3553/* Directory Tree specific styles */
3554.adui-directory-tree {
3555    font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
3556    font-size: 13px;
3557}
3558
3559.adui-directory-tree .adui-tree-treenode-selected {
3560    background: var(--adui-color-primary-bg, #e6f4ff);
3561}
3562
3563.adui-directory-tree .adui-tree-node-content-wrapper {
3564    padding: 2px 8px;
3565}
3566
3567/* Dark theme adjustments */
3568.adui-theme-scope[theme-mode="dark"] .adui-tree-treenode:hover {
3569    background: rgba(255, 255, 255, 0.08);
3570}
3571
3572.adui-theme-scope[theme-mode="dark"] .adui-tree-treenode-selected {
3573    background: rgba(24, 144, 255, 0.2);
3574}
3575
3576.adui-theme-scope[theme-mode="dark"] .adui-tree-checkbox-inner {
3577    background: var(--adui-color-bg-elevated, #1f1f1f);
3578    border-color: var(--adui-color-border, #424242);
3579}
3580
3581.adui-theme-scope[theme-mode="dark"] .adui-tree-checkbox-checked .adui-tree-checkbox-inner {
3582    background: var(--adui-color-primary, #1677ff);
3583    border-color: var(--adui-color-primary, #1677ff);
3584}
3585
3586.adui-theme-scope[theme-mode="dark"] .adui-tree-node-content-wrapper:hover {
3587    background: rgba(255, 255, 255, 0.08);
3588}
3589
3590.adui-theme-scope[theme-mode="dark"] .adui-tree-node-selected {
3591    background: rgba(24, 144, 255, 0.2);
3592}
3593"#
3594    };
3595}
3596
3597macro_rules! adui_transfer_style {
3598    () => {
3599        r#"
3600.adui-transfer {
3601    display: flex;
3602    align-items: stretch;
3603    gap: 16px;
3604}
3605
3606.adui-transfer-disabled {
3607    opacity: 0.6;
3608    pointer-events: none;
3609}
3610
3611.adui-transfer-list {
3612    flex: 1;
3613    display: flex;
3614    flex-direction: column;
3615    min-width: 200px;
3616    max-width: 300px;
3617    border: 1px solid var(--adui-color-border, #d9d9d9);
3618    border-radius: var(--adui-radius, 6px);
3619    background: var(--adui-color-bg-container, #ffffff);
3620}
3621
3622.adui-transfer-list-header {
3623    display: flex;
3624    align-items: center;
3625    padding: 8px 12px;
3626    border-bottom: 1px solid var(--adui-color-border, #d9d9d9);
3627    background: rgba(0, 0, 0, 0.02);
3628}
3629
3630.adui-transfer-list-header-checkbox {
3631    display: inline-flex;
3632    align-items: center;
3633    justify-content: center;
3634    width: 16px;
3635    height: 16px;
3636    margin-right: 8px;
3637    cursor: pointer;
3638}
3639
3640.adui-transfer-list-header-checkbox .adui-checkbox-inner {
3641    width: 16px;
3642    height: 16px;
3643    border: 1px solid var(--adui-color-border, #d9d9d9);
3644    border-radius: 4px;
3645    background: var(--adui-color-bg-container, #ffffff);
3646}
3647
3648.adui-transfer-list-header-checkbox.adui-checkbox-checked .adui-checkbox-inner {
3649    background: var(--adui-color-primary, #1677ff);
3650    border-color: var(--adui-color-primary, #1677ff);
3651}
3652
3653.adui-transfer-list-header-checkbox.adui-checkbox-indeterminate .adui-checkbox-inner {
3654    background: var(--adui-color-primary, #1677ff);
3655    border-color: var(--adui-color-primary, #1677ff);
3656}
3657
3658.adui-transfer-list-header-selected {
3659    flex: 1;
3660    font-size: 12px;
3661    color: var(--adui-color-text-secondary, #8c8c8c);
3662}
3663
3664.adui-transfer-list-header-title {
3665    font-weight: 500;
3666    color: var(--adui-color-text, #1f1f1f);
3667}
3668
3669.adui-transfer-list-search {
3670    padding: 8px 12px;
3671    border-bottom: 1px solid var(--adui-color-border, #d9d9d9);
3672}
3673
3674.adui-transfer-list-body {
3675    flex: 1;
3676    overflow-y: auto;
3677    max-height: 300px;
3678}
3679
3680.adui-transfer-list-content {
3681    list-style: none;
3682    margin: 0;
3683    padding: 4px 0;
3684}
3685
3686.adui-transfer-list-item {
3687    display: flex;
3688    align-items: center;
3689    padding: 6px 12px;
3690    cursor: pointer;
3691    transition: background 0.2s ease;
3692}
3693
3694.adui-transfer-list-item:hover {
3695    background: rgba(0, 0, 0, 0.04);
3696}
3697
3698.adui-transfer-list-item-selected {
3699    background: rgba(22, 119, 255, 0.08);
3700}
3701
3702.adui-transfer-list-item-disabled {
3703    cursor: not-allowed;
3704    color: var(--adui-color-text-disabled, rgba(0, 0, 0, 0.25));
3705}
3706
3707.adui-transfer-list-item-content {
3708    flex: 1;
3709    margin-left: 8px;
3710    min-width: 0;
3711}
3712
3713.adui-transfer-list-item-title {
3714    display: block;
3715    overflow: hidden;
3716    text-overflow: ellipsis;
3717    white-space: nowrap;
3718}
3719
3720.adui-transfer-list-item-description {
3721    display: block;
3722    font-size: 12px;
3723    color: var(--adui-color-text-secondary, #8c8c8c);
3724    overflow: hidden;
3725    text-overflow: ellipsis;
3726    white-space: nowrap;
3727}
3728
3729.adui-transfer-list-empty {
3730    padding: 16px;
3731    text-align: center;
3732    color: var(--adui-color-text-secondary, #8c8c8c);
3733}
3734
3735.adui-transfer-operations {
3736    display: flex;
3737    flex-direction: column;
3738    justify-content: center;
3739    gap: 8px;
3740}
3741
3742.adui-transfer-operation-btn {
3743    display: inline-flex;
3744    align-items: center;
3745    justify-content: center;
3746    min-width: 32px;
3747    height: 32px;
3748    padding: 0 8px;
3749    border: 1px solid var(--adui-color-border, #d9d9d9);
3750    border-radius: var(--adui-radius-sm, 4px);
3751    background: var(--adui-color-bg-container, #ffffff);
3752    color: var(--adui-color-text, #1f1f1f);
3753    cursor: pointer;
3754    transition: all 0.2s ease;
3755}
3756
3757.adui-transfer-operation-btn:hover:not(:disabled) {
3758    border-color: var(--adui-color-primary, #1677ff);
3759    color: var(--adui-color-primary, #1677ff);
3760}
3761
3762.adui-transfer-operation-btn:disabled {
3763    cursor: not-allowed;
3764    opacity: 0.5;
3765}
3766"#
3767    };
3768}
3769
3770macro_rules! adui_carousel_style {
3771    () => {
3772        r#"
3773.adui-carousel {
3774    position: relative;
3775    overflow: hidden;
3776}
3777
3778.adui-carousel-inner {
3779    position: relative;
3780    width: 100%;
3781    overflow: hidden;
3782}
3783
3784.adui-carousel-track {
3785    display: flex;
3786    transition: transform var(--adui-carousel-speed, 500ms) ease;
3787}
3788
3789.adui-carousel-fade .adui-carousel-track {
3790    display: block;
3791    position: relative;
3792}
3793
3794.adui-carousel-slide {
3795    flex: 0 0 100%;
3796    width: 100%;
3797    min-height: 200px;
3798    display: flex;
3799    align-items: center;
3800    justify-content: center;
3801    color: #fff;
3802    font-size: 24px;
3803    font-weight: 500;
3804}
3805
3806.adui-carousel-fade .adui-carousel-slide {
3807    position: absolute;
3808    top: 0;
3809    left: 0;
3810    width: 100%;
3811    height: 100%;
3812    opacity: 0;
3813    visibility: hidden;
3814    transition: opacity var(--adui-carousel-speed, 500ms) ease, visibility 0s var(--adui-carousel-speed, 500ms);
3815}
3816
3817.adui-carousel-fade .adui-carousel-slide-active {
3818    position: relative;
3819    opacity: 1;
3820    visibility: visible;
3821    transition: opacity var(--adui-carousel-speed, 500ms) ease;
3822}
3823
3824.adui-carousel-fade .adui-carousel-track {
3825    position: relative;
3826    min-height: 200px;
3827}
3828
3829.adui-carousel-arrow {
3830    position: absolute;
3831    top: 50%;
3832    transform: translateY(-50%);
3833    z-index: 2;
3834    width: 32px;
3835    height: 32px;
3836    border: none;
3837    border-radius: 50%;
3838    background: rgba(0, 0, 0, 0.3);
3839    color: #fff;
3840    font-size: 18px;
3841    cursor: pointer;
3842    transition: background 0.2s ease;
3843}
3844
3845.adui-carousel-arrow:hover {
3846    background: rgba(0, 0, 0, 0.5);
3847}
3848
3849.adui-carousel-arrow-prev {
3850    left: 12px;
3851}
3852
3853.adui-carousel-arrow-next {
3854    right: 12px;
3855}
3856
3857.adui-carousel-dots {
3858    display: flex;
3859    justify-content: center;
3860    gap: 8px;
3861    padding: 12px 0;
3862}
3863
3864.adui-carousel-dots-top {
3865    position: absolute;
3866    top: 12px;
3867    left: 50%;
3868    transform: translateX(-50%);
3869}
3870
3871.adui-carousel-dots-bottom .adui-carousel-dots {
3872    position: absolute;
3873    bottom: 12px;
3874    left: 50%;
3875    transform: translateX(-50%);
3876}
3877
3878.adui-carousel-dots-left .adui-carousel-dots,
3879.adui-carousel-dots-right .adui-carousel-dots {
3880    flex-direction: column;
3881    position: absolute;
3882    top: 50%;
3883    transform: translateY(-50%);
3884}
3885
3886.adui-carousel-dots-left .adui-carousel-dots {
3887    left: 12px;
3888}
3889
3890.adui-carousel-dots-right .adui-carousel-dots {
3891    right: 12px;
3892}
3893
3894.adui-carousel-dot {
3895    width: 16px;
3896    height: 4px;
3897    border: none;
3898    border-radius: 2px;
3899    background: rgba(255, 255, 255, 0.4);
3900    cursor: pointer;
3901    transition: all 0.3s ease;
3902    padding: 0;
3903}
3904
3905.adui-carousel-dot:hover {
3906    background: rgba(255, 255, 255, 0.6);
3907}
3908
3909.adui-carousel-dot-active {
3910    width: 24px;
3911    background: #fff;
3912}
3913
3914.adui-carousel-vertical .adui-carousel-dot {
3915    width: 4px;
3916    height: 16px;
3917}
3918
3919.adui-carousel-vertical .adui-carousel-dot-active {
3920    width: 4px;
3921    height: 24px;
3922}
3923"#
3924    };
3925}
3926
3927macro_rules! adui_mentions_style {
3928    () => {
3929        r#"
3930.adui-mentions-root {
3931    position: relative;
3932    display: inline-block;
3933    width: 100%;
3934}
3935
3936.adui-mentions {
3937    box-sizing: border-box;
3938    width: 100%;
3939    padding: 4px 11px;
3940    border-radius: var(--adui-radius-sm, 4px);
3941    border: 1px solid var(--adui-color-border, #d9d9d9);
3942    background: var(--adui-color-bg-container, #ffffff);
3943    color: var(--adui-color-text, #1f1f1f);
3944    font-size: var(--adui-font-size, 14px);
3945    line-height: var(--adui-line-height, 1.5715);
3946    resize: vertical;
3947    transition: all 0.2s ease;
3948}
3949
3950.adui-mentions:hover {
3951    border-color: var(--adui-color-border-hover, #91caff);
3952}
3953
3954.adui-mentions:focus {
3955    border-color: var(--adui-color-primary, #1677ff);
3956    box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.12);
3957    outline: none;
3958}
3959
3960.adui-mentions-disabled {
3961    background: rgba(0, 0, 0, 0.02);
3962    cursor: not-allowed;
3963    color: var(--adui-color-text-disabled, rgba(0, 0, 0, 0.25));
3964}
3965
3966.adui-mentions-sm {
3967    padding: 2px 8px;
3968    font-size: 13px;
3969}
3970
3971.adui-mentions-lg {
3972    padding: 6px 12px;
3973    font-size: 16px;
3974}
3975
3976.adui-mentions-dropdown {
3977    position: absolute;
3978    left: 0;
3979    right: 0;
3980    z-index: 1050;
3981    background: var(--adui-color-bg-container, #ffffff);
3982    border: 1px solid var(--adui-color-border, #d9d9d9);
3983    border-radius: var(--adui-radius-sm, 4px);
3984    box-shadow: var(--adui-shadow-secondary, 0 6px 16px rgba(0, 0, 0, 0.08));
3985    max-height: 200px;
3986    overflow-y: auto;
3987}
3988
3989.adui-mentions-dropdown-top {
3990    bottom: 100%;
3991    margin-bottom: 4px;
3992}
3993
3994.adui-mentions-dropdown-bottom {
3995    top: 100%;
3996    margin-top: 4px;
3997}
3998
3999.adui-mentions-dropdown-loading {
4000    padding: 8px 12px;
4001    text-align: center;
4002    color: var(--adui-color-text-secondary, #8c8c8c);
4003}
4004
4005.adui-mentions-dropdown-list {
4006    list-style: none;
4007    margin: 0;
4008    padding: 4px 0;
4009}
4010
4011.adui-mentions-dropdown-item {
4012    padding: 6px 12px;
4013    cursor: pointer;
4014    transition: background 0.2s ease;
4015}
4016
4017.adui-mentions-dropdown-item:hover {
4018    background: rgba(0, 0, 0, 0.04);
4019}
4020
4021.adui-mentions-dropdown-item-active {
4022    background: rgba(22, 119, 255, 0.08);
4023}
4024
4025.adui-mentions-dropdown-item-disabled {
4026    cursor: not-allowed;
4027    color: var(--adui-color-text-disabled, rgba(0, 0, 0, 0.25));
4028}
4029"#
4030    };
4031}
4032
4033macro_rules! adui_image_style {
4034    () => {
4035        r#"
4036.adui-image {
4037    position: relative;
4038    display: inline-block;
4039    overflow: hidden;
4040}
4041
4042.adui-image-loading .adui-image-img,
4043.adui-image-error .adui-image-img {
4044    opacity: 0;
4045}
4046
4047.adui-image-loaded .adui-image-img {
4048    opacity: 1;
4049}
4050
4051.adui-image-img {
4052    display: block;
4053    width: 100%;
4054    height: 100%;
4055    object-fit: cover;
4056    transition: opacity 0.3s ease;
4057}
4058
4059.adui-image-preview-enabled {
4060    cursor: pointer;
4061}
4062
4063.adui-image-placeholder {
4064    position: absolute;
4065    inset: 0;
4066    display: flex;
4067    align-items: center;
4068    justify-content: center;
4069    background: var(--adui-color-bg-base, #f5f5f5);
4070}
4071
4072.adui-image-placeholder-icon {
4073    width: 32px;
4074    height: 32px;
4075    border-radius: 4px;
4076    background: var(--adui-color-border, #d9d9d9);
4077    animation: adui-image-placeholder-pulse 1.5s ease-in-out infinite;
4078}
4079
4080@keyframes adui-image-placeholder-pulse {
4081    0%, 100% { opacity: 0.4; }
4082    50% { opacity: 0.8; }
4083}
4084
4085.adui-image-error-content {
4086    position: absolute;
4087    inset: 0;
4088    display: flex;
4089    flex-direction: column;
4090    align-items: center;
4091    justify-content: center;
4092    background: var(--adui-color-bg-base, #f5f5f5);
4093    color: var(--adui-color-text-secondary, #8c8c8c);
4094}
4095
4096.adui-image-error-icon {
4097    font-size: 24px;
4098    margin-bottom: 4px;
4099}
4100
4101.adui-image-error-text {
4102    font-size: 12px;
4103}
4104
4105.adui-image-mask {
4106    position: absolute;
4107    inset: 0;
4108    display: flex;
4109    align-items: center;
4110    justify-content: center;
4111    background: rgba(0, 0, 0, 0.5);
4112    opacity: 0;
4113    transition: opacity 0.3s ease;
4114    cursor: pointer;
4115}
4116
4117.adui-image:hover .adui-image-mask {
4118    opacity: 1;
4119}
4120
4121.adui-image-mask-text {
4122    color: #fff;
4123    font-size: 14px;
4124}
4125
4126.adui-image-preview-root {
4127    position: fixed;
4128    inset: 0;
4129    z-index: 1070;
4130    display: flex;
4131    align-items: center;
4132    justify-content: center;
4133}
4134
4135.adui-image-preview-mask {
4136    position: absolute;
4137    inset: 0;
4138    background: rgba(0, 0, 0, 0.45);
4139}
4140
4141.adui-image-preview-wrap {
4142    position: relative;
4143    z-index: 1;
4144    display: flex;
4145    flex-direction: column;
4146    align-items: center;
4147    max-width: 90vw;
4148    max-height: 90vh;
4149}
4150
4151.adui-image-preview-body {
4152    display: flex;
4153    align-items: center;
4154    justify-content: center;
4155    max-width: 100%;
4156    max-height: calc(100vh - 100px);
4157    overflow: hidden;
4158}
4159
4160.adui-image-preview-img {
4161    max-width: 100%;
4162    max-height: 100%;
4163    object-fit: contain;
4164    transition: transform 0.3s ease;
4165    user-select: none;
4166}
4167
4168.adui-image-preview-actions {
4169    display: flex;
4170    gap: 8px;
4171    padding: 12px;
4172    background: rgba(0, 0, 0, 0.1);
4173    border-radius: 8px;
4174    margin-top: 16px;
4175}
4176
4177.adui-image-preview-action {
4178    width: 40px;
4179    height: 40px;
4180    border: none;
4181    border-radius: 50%;
4182    background: rgba(255, 255, 255, 0.1);
4183    color: #fff;
4184    font-size: 18px;
4185    cursor: pointer;
4186    transition: background 0.2s ease;
4187}
4188
4189.adui-image-preview-action:hover {
4190    background: rgba(255, 255, 255, 0.2);
4191}
4192
4193.adui-image-preview-close {
4194    position: absolute;
4195    top: 16px;
4196    right: 16px;
4197    width: 40px;
4198    height: 40px;
4199    border: none;
4200    border-radius: 50%;
4201    background: rgba(255, 255, 255, 0.1);
4202    color: #fff;
4203    font-size: 24px;
4204    cursor: pointer;
4205    transition: background 0.2s ease;
4206}
4207
4208.adui-image-preview-close:hover {
4209    background: rgba(255, 255, 255, 0.2);
4210}
4211
4212.adui-image-preview-nav {
4213    position: absolute;
4214    top: 50%;
4215    transform: translateY(-50%);
4216    width: 44px;
4217    height: 44px;
4218    border: none;
4219    border-radius: 50%;
4220    background: rgba(255, 255, 255, 0.1);
4221    color: #fff;
4222    font-size: 28px;
4223    cursor: pointer;
4224    transition: background 0.2s ease;
4225}
4226
4227.adui-image-preview-nav:hover {
4228    background: rgba(255, 255, 255, 0.2);
4229}
4230
4231.adui-image-preview-nav-prev {
4232    left: 16px;
4233}
4234
4235.adui-image-preview-nav-next {
4236    right: 16px;
4237}
4238
4239.adui-image-preview-counter {
4240    position: absolute;
4241    top: 16px;
4242    left: 50%;
4243    transform: translateX(-50%);
4244    padding: 6px 16px;
4245    background: rgba(0, 0, 0, 0.5);
4246    border-radius: 20px;
4247    color: #fff;
4248    font-size: 14px;
4249    font-weight: 500;
4250    letter-spacing: 0.5px;
4251}
4252"#
4253    };
4254}
4255
4256pub const SCOPE_STYLE: &str = adui_scope_style!();
4257pub const BUTTON_STYLE: &str = adui_button_style!();
4258pub const ICON_STYLE: &str = adui_icon_style!();
4259pub const DIVIDER_STYLE: &str = adui_divider_style!();
4260pub const TYPOGRAPHY_STYLE: &str = adui_typography_style!();
4261pub const LAYOUT_STYLE: &str = adui_layout_style!();
4262pub const GRID_STYLE: &str = adui_grid_style!();
4263pub const SPACE_STYLE: &str = adui_space_style!();
4264pub const FLEX_STYLE: &str = adui_flex_style!();
4265pub const FORM_STYLE: &str = adui_form_style!();
4266pub const CONTROL_STYLE: &str = adui_control_style!();
4267pub const MASONRY_STYLE: &str = adui_masonry_style!();
4268pub const SPLITTER_STYLE: &str = adui_splitter_style!();
4269pub const FLOAT_BUTTON_STYLE: &str = adui_float_button_style!();
4270pub const TOOLTIP_STYLE: &str = adui_tooltip_style!();
4271pub const KEYFRAMES_STYLE: &str = adui_keyframes_style!();
4272pub const EMPTY_STYLE: &str = adui_empty_style!();
4273pub const SPIN_STYLE: &str = adui_spin_style!();
4274pub const PROGRESS_STYLE: &str = adui_progress_style!();
4275pub const STATISTIC_STYLE: &str = adui_statistic_style!();
4276pub const SKELETON_STYLE: &str = adui_skeleton_style!();
4277pub const LIST_STYLE: &str = adui_list_style!();
4278pub const TABS_STYLE: &str = adui_tabs_style!();
4279pub const CARD_STYLE: &str = adui_card_style!();
4280pub const TAG_STYLE: &str = adui_tag_style!();
4281pub const BADGE_STYLE: &str = adui_badge_style!();
4282pub const AVATAR_STYLE: &str = adui_avatar_style!();
4283pub const TABLE_STYLE: &str = adui_table_style!();
4284pub const RESULT_STYLE: &str = adui_result_style!();
4285pub const STEPS_STYLE: &str = adui_steps_style!();
4286pub const WATERMARK_STYLE: &str = adui_watermark_style!();
4287pub const QRCODE_STYLE: &str = adui_qrcode_style!();
4288pub const TREE_STYLE: &str = adui_tree_style!();
4289pub const TRANSFER_STYLE: &str = adui_transfer_style!();
4290pub const CAROUSEL_STYLE: &str = adui_carousel_style!();
4291pub const MENTIONS_STYLE: &str = adui_mentions_style!();
4292pub const IMAGE_STYLE: &str = adui_image_style!();
4293
4294pub const THEME_BASE_STYLE: &str = concat!(
4295    adui_scope_style!(),
4296    adui_button_style!(),
4297    adui_icon_style!(),
4298    adui_divider_style!(),
4299    adui_alert_style!(),
4300    adui_result_style!(),
4301    adui_calendar_style!(),
4302    adui_date_picker_style!(),
4303    adui_time_picker_style!(),
4304    adui_steps_style!(),
4305    adui_typography_style!(),
4306    adui_layout_style!(),
4307    adui_grid_style!(),
4308    adui_flex_style!(),
4309    adui_form_style!(),
4310    adui_control_style!(),
4311    adui_tooltip_style!(),
4312    adui_space_style!(),
4313    adui_masonry_style!(),
4314    adui_splitter_style!(),
4315    adui_float_button_style!(),
4316    adui_keyframes_style!(),
4317    adui_empty_style!(),
4318    adui_spin_style!(),
4319    adui_progress_style!(),
4320    adui_statistic_style!(),
4321    adui_skeleton_style!(),
4322    adui_list_style!(),
4323    adui_tabs_style!(),
4324    adui_card_style!(),
4325    adui_tag_style!(),
4326    adui_badge_style!(),
4327    adui_avatar_style!(),
4328    adui_table_style!(),
4329    adui_watermark_style!(),
4330    adui_qrcode_style!(),
4331    adui_tree_style!(),
4332    adui_transfer_style!(),
4333    adui_carousel_style!(),
4334    adui_mentions_style!(),
4335    adui_image_style!(),
4336);
4337
4338/// Theme mode tracks the seed variant.
4339#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
4340pub enum ThemeMode {
4341    Light,
4342    Dark,
4343    Custom,
4344}
4345
4346/// Core design tokens needed by early components.
4347#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
4348pub struct ThemeTokens {
4349    pub color_primary: String,
4350    pub color_primary_hover: String,
4351    pub color_primary_active: String,
4352    pub color_success: String,
4353    pub color_success_hover: String,
4354    pub color_success_active: String,
4355    pub color_warning: String,
4356    pub color_warning_hover: String,
4357    pub color_warning_active: String,
4358    pub color_error: String,
4359    pub color_error_hover: String,
4360    pub color_error_active: String,
4361    pub color_link: String,
4362    pub color_link_hover: String,
4363    pub color_link_active: String,
4364    pub color_text: String,
4365    pub color_text_muted: String,
4366    pub color_text_secondary: String,
4367    pub color_text_disabled: String,
4368    pub color_split: String,
4369    pub color_bg_base: String,
4370    pub color_bg_container: String,
4371    pub color_bg_layout: String,
4372    pub color_border: String,
4373    pub color_border_hover: String,
4374    pub border_radius: f32,
4375    pub border_radius_sm: f32,
4376    pub border_radius_lg: f32,
4377    pub control_height: f32,
4378    pub control_height_small: f32,
4379    pub control_height_large: f32,
4380    pub padding_inline: f32,
4381    pub padding_inline_small: f32,
4382    pub padding_inline_large: f32,
4383    pub padding_block: f32,
4384    pub padding_block_small: f32,
4385    pub padding_block_large: f32,
4386    pub font_size: f32,
4387    pub font_size_small: f32,
4388    pub font_size_large: f32,
4389    pub line_height: f32,
4390    pub control_line_width: f32,
4391    pub motion_duration_fast: f32,
4392    pub motion_duration_mid: f32,
4393    pub shadow: String,
4394    pub shadow_secondary: String,
4395}
4396
4397impl ThemeTokens {
4398    /// Ant Design 6.x inspired light tokens.
4399    pub fn light() -> Self {
4400        Self {
4401            color_primary: "#1677ff".into(),
4402            color_primary_hover: "#4096ff".into(),
4403            color_primary_active: "#0958d9".into(),
4404            color_success: "#52c41a".into(),
4405            color_success_hover: "#73d13d".into(),
4406            color_success_active: "#389e0d".into(),
4407            color_warning: "#faad14".into(),
4408            color_warning_hover: "#ffc53d".into(),
4409            color_warning_active: "#d48806".into(),
4410            color_error: "#ff4d4f".into(),
4411            color_error_hover: "#ff7875".into(),
4412            color_error_active: "#d9363e".into(),
4413            color_link: "#1677ff".into(),
4414            color_link_hover: "#4096ff".into(),
4415            color_link_active: "#0958d9".into(),
4416            color_text: "#1f1f1f".into(),
4417            color_text_muted: "#595959".into(),
4418            color_text_secondary: "#8c8c8c".into(),
4419            color_text_disabled: "rgba(0,0,0,0.25)".into(),
4420            color_split: "#f0f0f0".into(),
4421            color_bg_base: "#f5f5f5".into(),
4422            color_bg_container: "#ffffff".into(),
4423            color_bg_layout: "#f5f5f5".into(),
4424            color_border: "#d9d9d9".into(),
4425            color_border_hover: "#91caff".into(),
4426            border_radius: 6.0,
4427            border_radius_sm: 4.0,
4428            border_radius_lg: 8.0,
4429            control_height: 32.0,
4430            control_height_small: 24.0,
4431            control_height_large: 40.0,
4432            padding_inline: 15.0,
4433            padding_inline_small: 12.0,
4434            padding_inline_large: 18.0,
4435            padding_block: 6.0,
4436            padding_block_small: 4.0,
4437            padding_block_large: 8.0,
4438            font_size: 14.0,
4439            font_size_small: 13.0,
4440            font_size_large: 16.0,
4441            line_height: 1.5715,
4442            control_line_width: 1.0,
4443            motion_duration_fast: 0.16,
4444            motion_duration_mid: 0.24,
4445            shadow: "0 2px 0 rgba(5, 145, 255, 0.1)".into(),
4446            shadow_secondary: "0 6px 16px rgba(0,0,0,0.08)".into(),
4447        }
4448    }
4449
4450    /// Ant Design 6.x inspired dark tokens.
4451    pub fn dark() -> Self {
4452        Self {
4453            color_primary: "#177ddc".into(),
4454            color_primary_hover: "#3c9ae8".into(),
4455            color_primary_active: "#1668b2".into(),
4456            color_success: "#49aa19".into(),
4457            color_success_hover: "#6abe39".into(),
4458            color_success_active: "#3f8618".into(),
4459            color_warning: "#d89614".into(),
4460            color_warning_hover: "#e8b339".into(),
4461            color_warning_active: "#ad6800".into(),
4462            color_error: "#f16364".into(),
4463            color_error_hover: "#ff7875".into(),
4464            color_error_active: "#d84a45".into(),
4465            color_link: "#3c9ae8".into(),
4466            color_link_hover: "#65b7f3".into(),
4467            color_link_active: "#2b74b1".into(),
4468            color_text: "#f0f0f0".into(),
4469            color_text_muted: "#bfbfbf".into(),
4470            color_text_secondary: "#8c8c8c".into(),
4471            color_text_disabled: "rgba(255,255,255,0.35)".into(),
4472            color_split: "#303030".into(),
4473            color_bg_base: "#141414".into(),
4474            color_bg_container: "#1f1f1f".into(),
4475            color_bg_layout: "#0f0f0f".into(),
4476            color_border: "#2a2a2a".into(),
4477            color_border_hover: "#3a3a3a".into(),
4478            border_radius: 6.0,
4479            border_radius_sm: 4.0,
4480            border_radius_lg: 8.0,
4481            control_height: 32.0,
4482            control_height_small: 24.0,
4483            control_height_large: 40.0,
4484            padding_inline: 15.0,
4485            padding_inline_small: 12.0,
4486            padding_inline_large: 18.0,
4487            padding_block: 6.0,
4488            padding_block_small: 4.0,
4489            padding_block_large: 8.0,
4490            font_size: 14.0,
4491            font_size_small: 13.0,
4492            font_size_large: 16.0,
4493            line_height: 1.5715,
4494            control_line_width: 1.0,
4495            motion_duration_fast: 0.16,
4496            motion_duration_mid: 0.24,
4497            shadow: "0 2px 0 rgba(23, 125, 220, 0.25)".into(),
4498            shadow_secondary: "0 6px 16px rgba(0,0,0,0.5)".into(),
4499        }
4500    }
4501}
4502
4503/// Theme object bundling mode and resolved tokens.
4504#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
4505pub struct Theme {
4506    pub mode: ThemeMode,
4507    pub tokens: ThemeTokens,
4508}
4509
4510impl Theme {
4511    /// Build a theme from a given mode using defaults.
4512    pub fn for_mode(mode: ThemeMode) -> Self {
4513        match mode {
4514            ThemeMode::Light => Self::light(),
4515            ThemeMode::Dark => Self::dark(),
4516            ThemeMode::Custom => Self {
4517                mode,
4518                tokens: ThemeTokens::light(),
4519            },
4520        }
4521    }
4522
4523    /// Light preset.
4524    pub fn light() -> Self {
4525        Self {
4526            mode: ThemeMode::Light,
4527            tokens: ThemeTokens::light(),
4528        }
4529    }
4530
4531    /// Dark preset.
4532    pub fn dark() -> Self {
4533        Self {
4534            mode: ThemeMode::Dark,
4535            tokens: ThemeTokens::dark(),
4536        }
4537    }
4538}
4539
4540/// Handle for reading or mutating the active theme from components.
4541#[derive(Clone, Copy)]
4542pub struct ThemeHandle {
4543    signal: Signal<Theme>,
4544}
4545
4546impl ThemeHandle {
4547    pub fn theme(&self) -> Theme {
4548        self.signal.read().clone()
4549    }
4550
4551    pub fn tokens(&self) -> ThemeTokens {
4552        self.signal.read().tokens.clone()
4553    }
4554
4555    pub fn set_theme(&self, theme: Theme) {
4556        let mut signal = self.signal;
4557        signal.set(theme);
4558    }
4559
4560    pub fn set_mode(&self, mode: ThemeMode) {
4561        let mut signal = self.signal;
4562        signal.set(Theme::for_mode(mode));
4563    }
4564
4565    pub fn update_tokens(&self, mode: Option<ThemeMode>, update: impl FnOnce(&mut ThemeTokens)) {
4566        let mut signal = self.signal;
4567        signal.with_mut(|theme| {
4568            if let Some(next_mode) = mode {
4569                theme.mode = next_mode;
4570                theme.tokens = match next_mode {
4571                    ThemeMode::Light => ThemeTokens::light(),
4572                    ThemeMode::Dark => ThemeTokens::dark(),
4573                    ThemeMode::Custom => theme.tokens.clone(),
4574                };
4575            }
4576            update(&mut theme.tokens);
4577        });
4578    }
4579}
4580
4581/// Hook to access the current theme signal.
4582pub fn use_theme() -> ThemeHandle {
4583    let signal: Signal<Theme> = use_context();
4584    ThemeHandle { signal }
4585}
4586
4587/// Props for [`ThemeProvider`].
4588#[derive(Props, Clone, PartialEq)]
4589pub struct ThemeProviderProps {
4590    #[props(optional)]
4591    pub theme: Option<Theme>,
4592    pub children: Element,
4593}
4594
4595/// Provide theme context and CSS variables for descendant components.
4596#[component]
4597pub fn ThemeProvider(props: ThemeProviderProps) -> Element {
4598    let initial = props.theme.clone().unwrap_or_else(Theme::light);
4599    let signal = use_context_provider(|| Signal::new(initial));
4600    let handle = ThemeHandle { signal };
4601    let tokens = handle.tokens();
4602    let css_vars = tokens_to_css_vars(&tokens);
4603
4604    rsx! {
4605        style { {THEME_BASE_STYLE} }
4606        div {
4607            class: "adui-theme-scope",
4608            style: css_vars,
4609            {props.children}
4610        }
4611    }
4612}
4613
4614fn tokens_to_css_vars(tokens: &ThemeTokens) -> String {
4615    format!(
4616        "--adui-color-primary:{};\
4617        --adui-color-primary-hover:{};\
4618        --adui-color-primary-active:{};\
4619        --adui-color-success:{};\
4620        --adui-color-success-hover:{};\
4621        --adui-color-success-active:{};\
4622        --adui-color-warning:{};\
4623        --adui-color-warning-hover:{};\
4624        --adui-color-warning-active:{};\
4625        --adui-color-error:{};\
4626        --adui-color-error-hover:{};\
4627        --adui-color-error-active:{};\
4628        --adui-color-link:{};\
4629        --adui-color-link-hover:{};\
4630        --adui-color-link-active:{};\
4631        --adui-color-text:{};\
4632        --adui-color-text-muted:{};\
4633        --adui-color-text-secondary:{};\
4634        --adui-color-text-disabled:{};\
4635        --adui-color-split:{};\
4636        --adui-color-bg-base:{};\
4637        --adui-color-bg-container:{};\
4638        --adui-color-bg-layout:{};\
4639        --adui-color-border:{};\
4640        --adui-color-border-hover:{};\
4641        --adui-radius:{}px;\
4642        --adui-radius-sm:{}px;\
4643        --adui-radius-lg:{}px;\
4644        --adui-control-line-width:{}px;\
4645        --adui-control-height:{}px;\
4646        --adui-control-height-sm:{}px;\
4647        --adui-control-height-lg:{}px;\
4648        --adui-padding-inline:{}px;\
4649        --adui-padding-inline-sm:{}px;\
4650        --adui-padding-inline-lg:{}px;\
4651        --adui-padding-block:{}px;\
4652        --adui-padding-block-sm:{}px;\
4653        --adui-padding-block-lg:{}px;\
4654        --adui-font-size:{}px;\
4655        --adui-font-size-sm:{}px;\
4656        --adui-font-size-lg:{}px;\
4657        --adui-line-height:{};\
4658        --adui-motion-duration-fast:{}s;\
4659        --adui-motion-duration-mid:{}s;\
4660        --adui-shadow:{};\
4661        --adui-shadow-secondary:{};",
4662        tokens.color_primary,
4663        tokens.color_primary_hover,
4664        tokens.color_primary_active,
4665        tokens.color_success,
4666        tokens.color_success_hover,
4667        tokens.color_success_active,
4668        tokens.color_warning,
4669        tokens.color_warning_hover,
4670        tokens.color_warning_active,
4671        tokens.color_error,
4672        tokens.color_error_hover,
4673        tokens.color_error_active,
4674        tokens.color_link,
4675        tokens.color_link_hover,
4676        tokens.color_link_active,
4677        tokens.color_text,
4678        tokens.color_text_muted,
4679        tokens.color_text_secondary,
4680        tokens.color_text_disabled,
4681        tokens.color_split,
4682        tokens.color_bg_base,
4683        tokens.color_bg_container,
4684        tokens.color_bg_layout,
4685        tokens.color_border,
4686        tokens.color_border_hover,
4687        tokens.border_radius,
4688        tokens.border_radius_sm,
4689        tokens.border_radius_lg,
4690        tokens.control_line_width,
4691        tokens.control_height,
4692        tokens.control_height_small,
4693        tokens.control_height_large,
4694        tokens.padding_inline,
4695        tokens.padding_inline_small,
4696        tokens.padding_inline_large,
4697        tokens.padding_block,
4698        tokens.padding_block_small,
4699        tokens.padding_block_large,
4700        tokens.font_size,
4701        tokens.font_size_small,
4702        tokens.font_size_large,
4703        tokens.line_height,
4704        tokens.motion_duration_fast,
4705        tokens.motion_duration_mid,
4706        tokens.shadow,
4707        tokens.shadow_secondary,
4708    )
4709}
4710
4711#[cfg(test)]
4712mod tests {
4713    use super::*;
4714
4715    #[test]
4716    fn tokens_to_css_vars_emits_expected_variables() {
4717        let tokens = ThemeTokens::light();
4718        let css = tokens_to_css_vars(&tokens);
4719        assert!(
4720            css.contains("--adui-color-primary:#1677ff;"),
4721            "primary color missing: {css}"
4722        );
4723        assert!(css.contains("--adui-color-bg-container:#ffffff;"));
4724        assert!(css.contains("--adui-font-size:14px;"));
4725        assert!(css.contains("--adui-shadow-secondary:0 6px 16px rgba(0,0,0,0.08);"));
4726    }
4727
4728    #[test]
4729    fn tokens_to_css_vars_reflect_custom_updates() {
4730        let mut tokens = ThemeTokens::light();
4731        tokens.color_primary = "#000000".into();
4732        tokens.font_size = 18.0;
4733        let css = tokens_to_css_vars(&tokens);
4734        assert!(css.contains("--adui-color-primary:#000000;"));
4735        assert!(css.contains("--adui-font-size:18px;"));
4736    }
4737}