1use dioxus::prelude::*;
2use serde::{Deserialize, Serialize};
3
4macro_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#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
4340pub enum ThemeMode {
4341 Light,
4342 Dark,
4343 Custom,
4344}
4345
4346#[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 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 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#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
4505pub struct Theme {
4506 pub mode: ThemeMode,
4507 pub tokens: ThemeTokens,
4508}
4509
4510impl Theme {
4511 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 pub fn light() -> Self {
4525 Self {
4526 mode: ThemeMode::Light,
4527 tokens: ThemeTokens::light(),
4528 }
4529 }
4530
4531 pub fn dark() -> Self {
4533 Self {
4534 mode: ThemeMode::Dark,
4535 tokens: ThemeTokens::dark(),
4536 }
4537 }
4538}
4539
4540#[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
4581pub fn use_theme() -> ThemeHandle {
4583 let signal: Signal<Theme> = use_context();
4584 ThemeHandle { signal }
4585}
4586
4587#[derive(Props, Clone, PartialEq)]
4589pub struct ThemeProviderProps {
4590 #[props(optional)]
4591 pub theme: Option<Theme>,
4592 pub children: Element,
4593}
4594
4595#[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}