@duskmoon-dev/core 1.19.2 → 1.19.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +484 -0
  3. package/dist/components/accordion.css +33 -9
  4. package/dist/components/autocomplete.css +67 -13
  5. package/dist/components/avatar.css +39 -15
  6. package/dist/components/badge.css +15 -3
  7. package/dist/components/card.css +12 -0
  8. package/dist/components/carousel.css +28 -0
  9. package/dist/components/chat.css +15 -11
  10. package/dist/components/checkbox.css +83 -13
  11. package/dist/components/collapse.css +67 -16
  12. package/dist/components/countdown.css +22 -0
  13. package/dist/components/datepicker.css +76 -0
  14. package/dist/components/diff.css +33 -0
  15. package/dist/components/file-input.css +107 -0
  16. package/dist/components/filter-group.css +452 -0
  17. package/dist/components/footer.css +48 -0
  18. package/dist/components/form-group.css +95 -204
  19. package/dist/components/form.css +1551 -421
  20. package/dist/components/hero.css +57 -0
  21. package/dist/components/index.css +7657 -7321
  22. package/dist/components/indicator.css +63 -0
  23. package/dist/components/input.css +114 -31
  24. package/dist/components/join.css +70 -0
  25. package/dist/components/kbd.css +28 -0
  26. package/dist/components/list.css +22 -3
  27. package/dist/components/mask.css +38 -0
  28. package/dist/components/otp-input.css +124 -6
  29. package/dist/components/radio.css +70 -0
  30. package/dist/components/range.css +41 -0
  31. package/dist/components/rating.css +39 -12
  32. package/dist/components/select.css +74 -0
  33. package/dist/components/sidebar-layout.css +66 -0
  34. package/dist/components/stack.css +56 -0
  35. package/dist/components/stat.css +40 -0
  36. package/dist/components/switch.css +70 -0
  37. package/dist/components/table.css +8 -0
  38. package/dist/components/textarea.css +74 -0
  39. package/dist/components/timeline.css +40 -25
  40. package/dist/components/toggle-switch.css +165 -0
  41. package/dist/components/toggle.css +198 -32
  42. package/dist/components/validator.css +66 -0
  43. package/dist/effects/aura.css +22 -0
  44. package/dist/effects/hover-3d.css +8 -0
  45. package/dist/effects/hover-gallery.css +14 -0
  46. package/dist/effects/index.css +65 -0
  47. package/dist/effects/text-rotate.css +16 -0
  48. package/dist/esm/components/accordion.js +33 -9
  49. package/dist/esm/components/autocomplete.js +67 -13
  50. package/dist/esm/components/avatar.js +39 -15
  51. package/dist/esm/components/badge.js +15 -3
  52. package/dist/esm/components/card.js +12 -0
  53. package/dist/esm/components/carousel.d.ts +5 -0
  54. package/dist/esm/components/carousel.js +37 -0
  55. package/dist/esm/components/chat.js +15 -11
  56. package/dist/esm/components/checkbox.js +84 -14
  57. package/dist/esm/components/collapse.js +67 -16
  58. package/dist/esm/components/countdown.d.ts +5 -0
  59. package/dist/esm/components/countdown.js +31 -0
  60. package/dist/esm/components/datepicker.js +77 -1
  61. package/dist/esm/components/diff.d.ts +5 -0
  62. package/dist/esm/components/diff.js +42 -0
  63. package/dist/esm/components/file-input.d.ts +5 -0
  64. package/dist/esm/components/file-input.js +116 -0
  65. package/dist/esm/components/filter-group.d.ts +5 -0
  66. package/dist/esm/components/filter-group.js +461 -0
  67. package/dist/esm/components/footer.d.ts +5 -0
  68. package/dist/esm/components/footer.js +57 -0
  69. package/dist/esm/components/form-group.js +96 -205
  70. package/dist/esm/components/form.js +1539 -409
  71. package/dist/esm/components/hero.d.ts +5 -0
  72. package/dist/esm/components/hero.js +66 -0
  73. package/dist/esm/components/indicator.d.ts +5 -0
  74. package/dist/esm/components/indicator.js +72 -0
  75. package/dist/esm/components/input.js +115 -32
  76. package/dist/esm/components/join.d.ts +5 -0
  77. package/dist/esm/components/join.js +79 -0
  78. package/dist/esm/components/kbd.d.ts +5 -0
  79. package/dist/esm/components/kbd.js +37 -0
  80. package/dist/esm/components/list.js +22 -3
  81. package/dist/esm/components/mask.d.ts +5 -0
  82. package/dist/esm/components/mask.js +47 -0
  83. package/dist/esm/components/otp-input.js +125 -7
  84. package/dist/esm/components/radio.js +71 -1
  85. package/dist/esm/components/range.d.ts +5 -0
  86. package/dist/esm/components/range.js +50 -0
  87. package/dist/esm/components/rating.js +39 -12
  88. package/dist/esm/components/select.js +75 -1
  89. package/dist/esm/components/sidebar-layout.d.ts +5 -0
  90. package/dist/esm/components/sidebar-layout.js +75 -0
  91. package/dist/esm/components/stack.d.ts +5 -0
  92. package/dist/esm/components/stack.js +65 -0
  93. package/dist/esm/components/stat.d.ts +5 -0
  94. package/dist/esm/components/stat.js +49 -0
  95. package/dist/esm/components/switch.js +71 -1
  96. package/dist/esm/components/table.js +8 -0
  97. package/dist/esm/components/textarea.js +75 -1
  98. package/dist/esm/components/timeline.js +40 -25
  99. package/dist/esm/components/toggle-switch.d.ts +5 -0
  100. package/dist/esm/components/toggle-switch.js +174 -0
  101. package/dist/esm/components/toggle.js +198 -32
  102. package/dist/esm/components/validator.d.ts +5 -0
  103. package/dist/esm/components/validator.js +75 -0
  104. package/dist/esm/effects/aura.d.ts +5 -0
  105. package/dist/esm/effects/aura.js +31 -0
  106. package/dist/esm/effects/hover-3d.d.ts +5 -0
  107. package/dist/esm/effects/hover-3d.js +17 -0
  108. package/dist/esm/effects/hover-gallery.d.ts +5 -0
  109. package/dist/esm/effects/hover-gallery.js +23 -0
  110. package/dist/esm/effects/index.d.ts +5 -0
  111. package/dist/esm/effects/index.js +74 -0
  112. package/dist/esm/effects/text-rotate.d.ts +5 -0
  113. package/dist/esm/effects/text-rotate.js +25 -0
  114. package/dist/index.css +8324 -7989
  115. package/dist/index.min.css +1 -1
  116. package/dist/standalone/duskmoonui-themes.css +1 -1
  117. package/dist/standalone/duskmoonui.css +9103 -8759
  118. package/dist/standalone/duskmoonui.js +12 -13
  119. package/dist/standalone/duskmoonui.mjs +12 -13
  120. package/dist/types/types/plugin.d.ts +1 -1
  121. package/dist/types/types/plugin.d.ts.map +1 -1
  122. package/package.json +140 -1
@@ -0,0 +1,49 @@
1
+ // Auto-generated from stat.css
2
+ export const css = `@layer components {
3
+ .stats {
4
+ display: grid;
5
+ grid-auto-flow: column;
6
+ grid-auto-columns: minmax(0, 1fr);
7
+ max-inline-size: 100%;
8
+ color: var(--color-on-surface);
9
+ background: var(--color-surface-container-low);
10
+ border-radius: var(--radius-md);
11
+ }
12
+ .stat {
13
+ display: grid;
14
+ grid-template-columns: minmax(0, 1fr) auto;
15
+ gap: 0.25rem 1rem;
16
+ min-inline-size: 0;
17
+ padding: 1rem;
18
+ color: var(--color-on-surface);
19
+ overflow-wrap: anywhere;
20
+ }
21
+ .stats > .stat + .stat { border-inline-start: 1px solid var(--color-outline-variant); }
22
+ .stat-title, .stat-desc { grid-column: 1; color: var(--color-on-surface-variant); font-size: 0.875rem; }
23
+ .stat-value { grid-column: 1; font-size: 2rem; font-weight: 700; line-height: 1.2; font-variant-numeric: tabular-nums; }
24
+ .stat-figure { grid-column: 2; grid-row: 1 / 4; align-self: center; }
25
+ .stat-actions { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 0.5rem; margin-block-start: 0.5rem; }
26
+ .stats-vertical { grid-auto-flow: row; }
27
+ .stats-horizontal { grid-auto-flow: column; }
28
+ .stats-vertical > .stat + .stat { border-inline-start: 0; border-block-start: 1px solid var(--color-outline-variant); }
29
+ .stats-responsive { container-type: inline-size; container-name: stats; }
30
+ @container stats (max-width: 32rem) {
31
+ .stats-responsive > .stat { grid-column: 1; }
32
+ .stats-responsive > .stat + .stat { border-inline-start: 0; border-block-start: 1px solid var(--color-outline-variant); }
33
+ }
34
+ .stat-primary .stat-value { color: var(--color-primary); }
35
+ .stat-secondary .stat-value { color: var(--color-secondary); }
36
+ .stat-tertiary .stat-value { color: var(--color-tertiary); }
37
+ .stat-info .stat-value { color: var(--color-info); }
38
+ .stat-success .stat-value { color: var(--color-success); }
39
+ .stat-warning .stat-value { color: var(--color-warning); }
40
+ .stat-error .stat-value { color: var(--color-error); }
41
+ }
42
+ `;
43
+
44
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
45
+ if (sheet) {
46
+ sheet.replaceSync(css);
47
+ }
48
+ export const styles = sheet;
49
+ export default sheet;
@@ -1,5 +1,73 @@
1
1
  // Auto-generated from switch.css
2
- export const css = `/**
2
+ export const css = `/** Opt-in native presentation. Applications own errors, messages and announcements. */
3
+ @layer components {
4
+ /* Compatibility wrapper states are intentionally immediate. */
5
+ :is(.form-group-info, .form-control.info) { --dm-validation-color: var(--color-info); }
6
+ :is(.form-group-warning, .form-control.warning) { --dm-validation-color: var(--color-warning); }
7
+ :is(.form-group-success, .form-control.success) { --dm-validation-color: var(--color-success); }
8
+
9
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :valid, .validate:valid, .validator.validator-success:user-valid):not([aria-invalid="true"]):not(:where(.form-group-error *, .form-control.error *)):not(:disabled) {
10
+ --dm-validation-color: var(--color-success);
11
+ --dm-validation-content: var(--color-success-content);
12
+ }
13
+
14
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :invalid, .validate:invalid, .validator:user-invalid):not(:disabled) {
15
+ --dm-validation-color: var(--color-error);
16
+ --dm-validation-content: var(--color-error-content);
17
+ }
18
+
19
+ :is(.form-group-error, .form-control.error) {
20
+ --dm-validation-color: var(--color-error);
21
+ --dm-validation-content: var(--color-error-content);
22
+ }
23
+
24
+ /* Higher specificity than native states, including server-invalid + user-valid. */
25
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .form-group-error *, .form-control.error *):not(:disabled):is(:focus, :not(:focus)) {
26
+ --dm-validation-color: var(--color-error);
27
+ --dm-validation-content: var(--color-error-content);
28
+ }
29
+
30
+ /* This shared selector wins over filled/ghost focus and semantic modifiers. */
31
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled) {
32
+ color: var(--dm-validation-color);
33
+ border-color: var(--dm-validation-color);
34
+ --checkbox-color: var(--dm-validation-color);
35
+ --radio-color: var(--dm-validation-color);
36
+ --switch-color: var(--dm-validation-color);
37
+ --switch-content-color: var(--dm-validation-content, var(--color-primary-content));
38
+ --toggle-color: var(--dm-validation-color);
39
+ }
40
+
41
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled):focus {
42
+ border-color: var(--dm-validation-color);
43
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--dm-validation-color) 20%, transparent);
44
+ }
45
+
46
+ :is(.form-group-error, .form-control.error) :is(.form-label, .label-text) { color: var(--color-error); }
47
+ :is(.form-group-success, .form-control.success) :is(.form-label, .label-text) { color: var(--color-success); }
48
+ :is(.form-group-warning, .form-control.warning) :is(.form-label, .label-text) { color: var(--color-warning); }
49
+ :is(.form-group-info, .form-control.info) :is(.form-label, .label-text) { color: var(--color-info); }
50
+
51
+ .validator-hint { font-size: 0.75rem; color: var(--color-on-surface-variant); }
52
+ .validator-error { display: none; font-size: 0.75rem; color: var(--color-error); }
53
+ /* Keep OTP actions stationary when blur reveals an error during a click. */
54
+ .otp-code ~ .validator-error { display: block; visibility: hidden; }
55
+ :is(.form-group, .form-control):has(:is([aria-invalid="true"], .validator:user-invalid, .validate :invalid, .validate:invalid):not(:disabled)) > .validator-error,
56
+ :is(.form-group-error, .form-control.error) > .validator-error { display: block; visibility: visible; }
57
+
58
+ @media (forced-colors: active) {
59
+ :is(input, select, textarea):is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):focus-visible {
60
+ outline: 2px solid Highlight;
61
+ outline-offset: 2px;
62
+ }
63
+ input:is(.checkbox, .radio, .switch, .toggle) { appearance: auto; }
64
+ input:is(.checkbox, .radio, .switch, .toggle)::before,
65
+ input:is(.checkbox, .radio, .switch, .toggle)::after { content: none; }
66
+ }
67
+ }
68
+
69
+
70
+ /**
3
71
  * Switch Component Styles
4
72
  * DuskMoonUI - Material Design 3 inspired switch/toggle
5
73
  *
@@ -8,6 +76,8 @@ export const css = `/**
8
76
  */
9
77
 
10
78
  @layer components {
79
+ :where(.switch) { box-sizing: border-box; }
80
+
11
81
  /* Base Switch - applied directly to input[type="checkbox"] */
12
82
  .switch {
13
83
  --switch-width: 3.25rem;
@@ -172,6 +172,8 @@ export const css = `/**
172
172
  /* Selected Row */
173
173
  .table-row-selected,
174
174
  .table tr.selected,
175
+ .table-hover tbody tr:is(.selected, .table-row-selected),
176
+ .table-hover .table-row:is(.selected, .table-row-selected),
175
177
  .table-selectable tbody tr.table-row-selected,
176
178
  .table-selectable .table-row.table-row-selected,
177
179
  .table-selectable tbody tr.selected,
@@ -180,6 +182,12 @@ export const css = `/**
180
182
  color: var(--color-on-primary-container);
181
183
  }
182
184
 
185
+ .table-numeric { text-align: end; font-variant-numeric: tabular-nums; }
186
+ .table-center { text-align: center; }
187
+ .table-actions { white-space: nowrap; text-align: end; }
188
+ .table-checkbox { inline-size: 1%; }
189
+ .table-sort-icon { display: inline-block; margin-inline-start: 0.25rem; }
190
+
183
191
  /* Clickable Row */
184
192
  .table-row-clickable,
185
193
  .table tbody tr[data-href] {
@@ -1,10 +1,80 @@
1
1
  // Auto-generated from textarea.css
2
- export const css = `/**
2
+ export const css = `/** Opt-in native presentation. Applications own errors, messages and announcements. */
3
+ @layer components {
4
+ /* Compatibility wrapper states are intentionally immediate. */
5
+ :is(.form-group-info, .form-control.info) { --dm-validation-color: var(--color-info); }
6
+ :is(.form-group-warning, .form-control.warning) { --dm-validation-color: var(--color-warning); }
7
+ :is(.form-group-success, .form-control.success) { --dm-validation-color: var(--color-success); }
8
+
9
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :valid, .validate:valid, .validator.validator-success:user-valid):not([aria-invalid="true"]):not(:where(.form-group-error *, .form-control.error *)):not(:disabled) {
10
+ --dm-validation-color: var(--color-success);
11
+ --dm-validation-content: var(--color-success-content);
12
+ }
13
+
14
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :invalid, .validate:invalid, .validator:user-invalid):not(:disabled) {
15
+ --dm-validation-color: var(--color-error);
16
+ --dm-validation-content: var(--color-error-content);
17
+ }
18
+
19
+ :is(.form-group-error, .form-control.error) {
20
+ --dm-validation-color: var(--color-error);
21
+ --dm-validation-content: var(--color-error-content);
22
+ }
23
+
24
+ /* Higher specificity than native states, including server-invalid + user-valid. */
25
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .form-group-error *, .form-control.error *):not(:disabled):is(:focus, :not(:focus)) {
26
+ --dm-validation-color: var(--color-error);
27
+ --dm-validation-content: var(--color-error-content);
28
+ }
29
+
30
+ /* This shared selector wins over filled/ghost focus and semantic modifiers. */
31
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled) {
32
+ color: var(--dm-validation-color);
33
+ border-color: var(--dm-validation-color);
34
+ --checkbox-color: var(--dm-validation-color);
35
+ --radio-color: var(--dm-validation-color);
36
+ --switch-color: var(--dm-validation-color);
37
+ --switch-content-color: var(--dm-validation-content, var(--color-primary-content));
38
+ --toggle-color: var(--dm-validation-color);
39
+ }
40
+
41
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled):focus {
42
+ border-color: var(--dm-validation-color);
43
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--dm-validation-color) 20%, transparent);
44
+ }
45
+
46
+ :is(.form-group-error, .form-control.error) :is(.form-label, .label-text) { color: var(--color-error); }
47
+ :is(.form-group-success, .form-control.success) :is(.form-label, .label-text) { color: var(--color-success); }
48
+ :is(.form-group-warning, .form-control.warning) :is(.form-label, .label-text) { color: var(--color-warning); }
49
+ :is(.form-group-info, .form-control.info) :is(.form-label, .label-text) { color: var(--color-info); }
50
+
51
+ .validator-hint { font-size: 0.75rem; color: var(--color-on-surface-variant); }
52
+ .validator-error { display: none; font-size: 0.75rem; color: var(--color-error); }
53
+ /* Keep OTP actions stationary when blur reveals an error during a click. */
54
+ .otp-code ~ .validator-error { display: block; visibility: hidden; }
55
+ :is(.form-group, .form-control):has(:is([aria-invalid="true"], .validator:user-invalid, .validate :invalid, .validate:invalid):not(:disabled)) > .validator-error,
56
+ :is(.form-group-error, .form-control.error) > .validator-error { display: block; visibility: visible; }
57
+
58
+ @media (forced-colors: active) {
59
+ :is(input, select, textarea):is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):focus-visible {
60
+ outline: 2px solid Highlight;
61
+ outline-offset: 2px;
62
+ }
63
+ input:is(.checkbox, .radio, .switch, .toggle) { appearance: auto; }
64
+ input:is(.checkbox, .radio, .switch, .toggle)::before,
65
+ input:is(.checkbox, .radio, .switch, .toggle)::after { content: none; }
66
+ }
67
+ }
68
+
69
+
70
+ /**
3
71
  * Textarea Component Styles
4
72
  * DuskMoonUI - Material Design 3 inspired multi-line text input
5
73
  */
6
74
 
7
75
  @layer components {
76
+ :where(.textarea) { box-sizing: border-box; }
77
+
8
78
  /* ============================================
9
79
  * TEXTAREA CONTAINER
10
80
  * ============================================ */
@@ -218,6 +288,10 @@ export const css = `/**
218
288
  * SIZE VARIANTS
219
289
  * ============================================ */
220
290
 
291
+ .textarea-xs { min-height: 3rem; padding: 0.375rem 0.625rem; font-size: 0.75rem; line-height: 1rem; }
292
+ .textarea-md { min-height: 6rem; }
293
+ .textarea-bordered { border-color: var(--color-outline); }
294
+
221
295
  .textarea-sm {
222
296
  min-height: 4rem;
223
297
  padding: 0.5rem 0.75rem;
@@ -18,7 +18,7 @@ export const css = `/**
18
18
  content: '';
19
19
  position: absolute;
20
20
  top: 0;
21
- left: 1.25rem;
21
+ inset-inline-start: 1.25rem;
22
22
  width: 2px;
23
23
  height: 100%;
24
24
  background-color: var(--color-outline-variant);
@@ -65,6 +65,7 @@ export const css = `/**
65
65
 
66
66
  /* Timeline Content */
67
67
  .timeline-content {
68
+ overflow-wrap: anywhere;
68
69
  flex: 1;
69
70
  padding-top: 0.375rem;
70
71
  min-width: 0;
@@ -164,9 +165,18 @@ export const css = `/**
164
165
  background-color: var(--color-primary-content);
165
166
  }
166
167
 
168
+ .timeline-marker-secondary { border-color: var(--color-secondary); background: var(--color-secondary-container); }
169
+ .timeline-marker-tertiary { border-color: var(--color-tertiary); background: var(--color-tertiary-container); }
170
+ .timeline-marker-success { border-color: var(--color-success); background: var(--color-success-container); }
171
+ .timeline-marker-error { border-color: var(--color-error); background: var(--color-error-container); }
172
+ .timeline-item-active > .timeline-marker { border-color: var(--color-primary); background: var(--color-primary-container); }
173
+ .timeline-item-pending > .timeline-marker { border-style: dashed; }
174
+ .timeline-compact > .timeline-item { padding-block-end: 0.75rem; gap: 0.5rem; }
175
+ .timeline-content-card { padding: 1rem; border: 1px solid var(--color-outline-variant); border-radius: var(--radius-md); background: var(--color-surface-container); box-shadow: var(--shadow-sm); }
176
+
167
177
  /* Size Variants */
168
178
  .timeline-sm::before {
169
- left: 0.75rem;
179
+ inset-inline-start: 0.75rem;
170
180
  }
171
181
 
172
182
  .timeline-sm .timeline-marker {
@@ -184,7 +194,7 @@ export const css = `/**
184
194
  }
185
195
 
186
196
  .timeline-lg::before {
187
- left: 1.5rem;
197
+ inset-inline-start: 1.5rem;
188
198
  }
189
199
 
190
200
  .timeline-lg .timeline-marker {
@@ -198,38 +208,38 @@ export const css = `/**
198
208
 
199
209
  /* Alternate Layout (zigzag) */
200
210
  .timeline-alternate {
201
- padding-left: 0;
211
+ padding-inline-start: 0;
202
212
  }
203
213
 
204
214
  .timeline-alternate::before {
205
- left: 50%;
215
+ inset-inline-start: 50%;
206
216
  transform: translateX(-50%);
207
217
  }
208
218
 
209
219
  .timeline-alternate .timeline-item {
210
220
  width: 50%;
211
- padding-right: 2rem;
221
+ padding-inline-end: 2rem;
212
222
  }
213
223
 
214
224
  .timeline-alternate .timeline-item:nth-child(even) {
215
- margin-left: 50%;
216
- padding-right: 0;
217
- padding-left: 2rem;
225
+ margin-inline-start: 50%;
226
+ padding-inline-end: 0;
227
+ padding-inline-start: 2rem;
218
228
  flex-direction: row-reverse;
219
229
  }
220
230
 
221
231
  .timeline-alternate .timeline-item:nth-child(even) .timeline-content {
222
- text-align: right;
232
+ text-align: end;
223
233
  }
224
234
 
225
235
  .timeline-alternate .timeline-marker {
226
236
  position: absolute;
227
- left: 100%;
237
+ inset-inline-start: 100%;
228
238
  transform: translateX(-50%);
229
239
  }
230
240
 
231
241
  .timeline-alternate .timeline-item:nth-child(even) .timeline-marker {
232
- left: 0;
242
+ inset-inline-start: 0;
233
243
  transform: translateX(-50%);
234
244
  }
235
245
 
@@ -239,8 +249,8 @@ export const css = `/**
239
249
  }
240
250
 
241
251
  .timeline-right::before {
242
- left: auto;
243
- right: 1.25rem;
252
+ inset-inline-start: auto;
253
+ inset-inline-end: 1.25rem;
244
254
  }
245
255
 
246
256
  .timeline-right .timeline-item {
@@ -248,7 +258,7 @@ export const css = `/**
248
258
  }
249
259
 
250
260
  .timeline-right .timeline-content {
251
- text-align: right;
261
+ text-align: end;
252
262
  }
253
263
 
254
264
  /* Horizontal Timeline */
@@ -260,7 +270,7 @@ export const css = `/**
260
270
 
261
271
  .timeline-horizontal::before {
262
272
  top: 1.25rem;
263
- left: 0;
273
+ inset-inline-start: 0;
264
274
  width: 100%;
265
275
  height: 2px;
266
276
  }
@@ -268,12 +278,12 @@ export const css = `/**
268
278
  .timeline-horizontal .timeline-item {
269
279
  flex-direction: column;
270
280
  padding-bottom: 0;
271
- padding-right: 2rem;
281
+ padding-inline-end: 2rem;
272
282
  min-width: 10rem;
273
283
  }
274
284
 
275
285
  .timeline-horizontal .timeline-item:last-child {
276
- padding-right: 0;
286
+ padding-inline-end: 0;
277
287
  }
278
288
 
279
289
  .timeline-horizontal .timeline-content {
@@ -281,6 +291,9 @@ export const css = `/**
281
291
  text-align: center;
282
292
  }
283
293
 
294
+ .timeline-alternate:dir(rtl)::before,
295
+ .timeline-alternate:dir(rtl) .timeline-marker { transform: translateX(50%); }
296
+
284
297
  /* Collapsible Timeline */
285
298
  .timeline-collapsible .timeline-item {
286
299
  cursor: pointer;
@@ -319,28 +332,30 @@ export const css = `/**
319
332
 
320
333
  /* Responsive */
321
334
  @media (max-width: 640px) {
322
- .timeline-alternate::before {
323
- left: 1.25rem;
335
+ .timeline-alternate::before,
336
+ .timeline-alternate:dir(rtl)::before {
337
+ inset-inline-start: 1.25rem;
324
338
  transform: none;
325
339
  }
326
340
 
327
341
  .timeline-alternate .timeline-item,
328
342
  .timeline-alternate .timeline-item:nth-child(even) {
329
343
  width: 100%;
330
- margin-left: 0;
331
- padding-left: 0;
332
- padding-right: 0;
344
+ margin-inline-start: 0;
345
+ padding-inline-start: 0;
346
+ padding-inline-end: 0;
333
347
  flex-direction: row;
334
348
  }
335
349
 
336
350
  .timeline-alternate .timeline-item:nth-child(even) .timeline-content {
337
- text-align: left;
351
+ text-align: start;
338
352
  }
339
353
 
340
354
  .timeline-alternate .timeline-marker,
355
+ .timeline-alternate:dir(rtl) .timeline-marker,
341
356
  .timeline-alternate .timeline-item:nth-child(even) .timeline-marker {
342
357
  position: relative;
343
- left: 0;
358
+ inset-inline-start: 0;
344
359
  transform: none;
345
360
  }
346
361
  }
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for toggle-switch
2
+ export declare const css: string;
3
+ export declare const styles: CSSStyleSheet | null;
4
+ declare const sheet: CSSStyleSheet | null;
5
+ export default sheet;
@@ -0,0 +1,174 @@
1
+ // Auto-generated from toggle-switch.css
2
+ export const css = `/** Opt-in native presentation. Applications own errors, messages and announcements. */
3
+ @layer components {
4
+ /* Compatibility wrapper states are intentionally immediate. */
5
+ :is(.form-group-info, .form-control.info) { --dm-validation-color: var(--color-info); }
6
+ :is(.form-group-warning, .form-control.warning) { --dm-validation-color: var(--color-warning); }
7
+ :is(.form-group-success, .form-control.success) { --dm-validation-color: var(--color-success); }
8
+
9
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :valid, .validate:valid, .validator.validator-success:user-valid):not([aria-invalid="true"]):not(:where(.form-group-error *, .form-control.error *)):not(:disabled) {
10
+ --dm-validation-color: var(--color-success);
11
+ --dm-validation-content: var(--color-success-content);
12
+ }
13
+
14
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :invalid, .validate:invalid, .validator:user-invalid):not(:disabled) {
15
+ --dm-validation-color: var(--color-error);
16
+ --dm-validation-content: var(--color-error-content);
17
+ }
18
+
19
+ :is(.form-group-error, .form-control.error) {
20
+ --dm-validation-color: var(--color-error);
21
+ --dm-validation-content: var(--color-error-content);
22
+ }
23
+
24
+ /* Higher specificity than native states, including server-invalid + user-valid. */
25
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .form-group-error *, .form-control.error *):not(:disabled):is(:focus, :not(:focus)) {
26
+ --dm-validation-color: var(--color-error);
27
+ --dm-validation-content: var(--color-error-content);
28
+ }
29
+
30
+ /* This shared selector wins over filled/ghost focus and semantic modifiers. */
31
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled) {
32
+ color: var(--dm-validation-color);
33
+ border-color: var(--dm-validation-color);
34
+ --checkbox-color: var(--dm-validation-color);
35
+ --radio-color: var(--dm-validation-color);
36
+ --switch-color: var(--dm-validation-color);
37
+ --switch-content-color: var(--dm-validation-content, var(--color-primary-content));
38
+ --toggle-color: var(--dm-validation-color);
39
+ }
40
+
41
+ :is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled):focus {
42
+ border-color: var(--dm-validation-color);
43
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--dm-validation-color) 20%, transparent);
44
+ }
45
+
46
+ :is(.form-group-error, .form-control.error) :is(.form-label, .label-text) { color: var(--color-error); }
47
+ :is(.form-group-success, .form-control.success) :is(.form-label, .label-text) { color: var(--color-success); }
48
+ :is(.form-group-warning, .form-control.warning) :is(.form-label, .label-text) { color: var(--color-warning); }
49
+ :is(.form-group-info, .form-control.info) :is(.form-label, .label-text) { color: var(--color-info); }
50
+
51
+ .validator-hint { font-size: 0.75rem; color: var(--color-on-surface-variant); }
52
+ .validator-error { display: none; font-size: 0.75rem; color: var(--color-error); }
53
+ /* Keep OTP actions stationary when blur reveals an error during a click. */
54
+ .otp-code ~ .validator-error { display: block; visibility: hidden; }
55
+ :is(.form-group, .form-control):has(:is([aria-invalid="true"], .validator:user-invalid, .validate :invalid, .validate:invalid):not(:disabled)) > .validator-error,
56
+ :is(.form-group-error, .form-control.error) > .validator-error { display: block; visibility: visible; }
57
+
58
+ @media (forced-colors: active) {
59
+ :is(input, select, textarea):is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):focus-visible {
60
+ outline: 2px solid Highlight;
61
+ outline-offset: 2px;
62
+ }
63
+ input:is(.checkbox, .radio, .switch, .toggle) { appearance: auto; }
64
+ input:is(.checkbox, .radio, .switch, .toggle)::before,
65
+ input:is(.checkbox, .radio, .switch, .toggle)::after { content: none; }
66
+ }
67
+ }
68
+
69
+
70
+ @layer components {
71
+ /* Toggle/Switch */
72
+ .toggle {
73
+ --toggle-color: var(--color-primary);
74
+ box-sizing: border-box;
75
+ color: var(--color-on-surface);
76
+ border: 1px solid currentColor;
77
+ appearance: none;
78
+ width: 3rem;
79
+ height: 1.5rem;
80
+ border-radius: var(--radius-lg);
81
+ background-color: var(--color-surface-container-highest);
82
+ cursor: pointer;
83
+ transition: all 150ms ease-in-out;
84
+ position: relative;
85
+ }
86
+
87
+ .toggle::after {
88
+ content: '';
89
+ position: absolute;
90
+ inset-inline-start: 0.25rem;
91
+ top: 50%;
92
+ transform: translateY(-50%);
93
+ width: 1rem;
94
+ height: 1rem;
95
+ background-color: var(--color-on-surface-variant);
96
+ border-radius: var(--radius-full);
97
+ transition: all 150ms ease-in-out;
98
+ }
99
+
100
+ .toggle:checked {
101
+ background-color: var(--toggle-color);
102
+ }
103
+
104
+ .toggle:checked::after {
105
+ inset-inline-start: calc(100% - 1.25rem);
106
+ background-color: var(--dm-validation-content, var(--color-primary-content));
107
+ }
108
+
109
+ .toggle:focus-visible {
110
+ outline: none;
111
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
112
+ }
113
+
114
+ .toggle:disabled {
115
+ cursor: not-allowed;
116
+ opacity: 0.5;
117
+ }
118
+
119
+ /* Toggle Sizes */
120
+ .toggle-xs {
121
+ width: 2rem;
122
+ height: 1rem;
123
+ }
124
+
125
+ .toggle-xs::after {
126
+ width: 0.625rem;
127
+ height: 0.625rem;
128
+ inset-inline-start: 0.1875rem;
129
+ }
130
+
131
+ .toggle-xs:checked::after {
132
+ inset-inline-start: calc(100% - 0.8125rem);
133
+ }
134
+
135
+ .toggle-sm {
136
+ width: 2.5rem;
137
+ height: 1.25rem;
138
+ }
139
+
140
+ .toggle-sm::after {
141
+ width: 0.75rem;
142
+ height: 0.75rem;
143
+ }
144
+
145
+ .toggle-lg {
146
+ width: 4rem;
147
+ height: 2rem;
148
+ }
149
+
150
+ .toggle-lg::after {
151
+ width: 1.5rem;
152
+ height: 1.5rem;
153
+ }
154
+
155
+ .toggle-sm:checked::after { inset-inline-start: calc(100% - 1rem); }
156
+ .toggle-lg:checked::after { inset-inline-start: calc(100% - 1.75rem); }
157
+ .toggle-primary { --toggle-color: var(--color-primary); }
158
+ .toggle-secondary { --toggle-color: var(--color-secondary); }
159
+ .toggle-tertiary { --toggle-color: var(--color-tertiary); }
160
+ .toggle-info { --toggle-color: var(--color-info); }
161
+ .toggle-success { --toggle-color: var(--color-success); }
162
+ .toggle-warning { --toggle-color: var(--color-warning); }
163
+ .toggle-error { --toggle-color: var(--color-error); }
164
+ .toggle-ghost { border-color: transparent; }
165
+ @media (prefers-reduced-motion: reduce) { .toggle, .toggle::after { transition: none; } }
166
+ }
167
+ `;
168
+
169
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
170
+ if (sheet) {
171
+ sheet.replaceSync(css);
172
+ }
173
+ export const styles = sheet;
174
+ export default sheet;