@duskmoon-dev/core 1.19.3 → 1.19.5

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 (121) 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/alert.css +81 -3
  5. package/dist/components/autocomplete.css +67 -13
  6. package/dist/components/avatar.css +39 -15
  7. package/dist/components/badge.css +15 -3
  8. package/dist/components/card.css +12 -0
  9. package/dist/components/carousel.css +28 -0
  10. package/dist/components/chat.css +15 -11
  11. package/dist/components/checkbox.css +83 -13
  12. package/dist/components/collapse.css +67 -16
  13. package/dist/components/countdown.css +22 -0
  14. package/dist/components/datepicker.css +76 -0
  15. package/dist/components/diff.css +33 -0
  16. package/dist/components/file-input.css +107 -0
  17. package/dist/components/filter-group.css +452 -0
  18. package/dist/components/form-group.css +95 -204
  19. package/dist/components/form.css +1551 -421
  20. package/dist/components/index.css +6248 -5799
  21. package/dist/components/input.css +114 -31
  22. package/dist/components/kbd.css +28 -0
  23. package/dist/components/list.css +22 -3
  24. package/dist/components/loading.css +105 -0
  25. package/dist/components/modal.css +62 -1
  26. package/dist/components/otp-input.css +124 -6
  27. package/dist/components/progress.css +74 -0
  28. package/dist/components/radial-progress.css +47 -0
  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/skeleton.css +13 -1
  34. package/dist/components/snackbar.css +48 -18
  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/toast.css +188 -34
  41. package/dist/components/toggle-switch.css +165 -0
  42. package/dist/components/toggle.css +198 -32
  43. package/dist/components/tooltip.css +2 -47
  44. package/dist/components/validator.css +66 -0
  45. package/dist/effects/aura.css +22 -0
  46. package/dist/effects/hover-3d.css +8 -0
  47. package/dist/effects/hover-gallery.css +14 -0
  48. package/dist/effects/index.css +65 -0
  49. package/dist/effects/text-rotate.css +16 -0
  50. package/dist/esm/components/accordion.js +33 -9
  51. package/dist/esm/components/alert.js +81 -3
  52. package/dist/esm/components/autocomplete.js +67 -13
  53. package/dist/esm/components/avatar.js +39 -15
  54. package/dist/esm/components/badge.js +15 -3
  55. package/dist/esm/components/card.js +12 -0
  56. package/dist/esm/components/carousel.d.ts +5 -0
  57. package/dist/esm/components/carousel.js +37 -0
  58. package/dist/esm/components/chat.js +15 -11
  59. package/dist/esm/components/checkbox.js +84 -14
  60. package/dist/esm/components/collapse.js +67 -16
  61. package/dist/esm/components/countdown.d.ts +5 -0
  62. package/dist/esm/components/countdown.js +31 -0
  63. package/dist/esm/components/datepicker.js +77 -1
  64. package/dist/esm/components/diff.d.ts +5 -0
  65. package/dist/esm/components/diff.js +42 -0
  66. package/dist/esm/components/file-input.d.ts +5 -0
  67. package/dist/esm/components/file-input.js +116 -0
  68. package/dist/esm/components/filter-group.d.ts +5 -0
  69. package/dist/esm/components/filter-group.js +461 -0
  70. package/dist/esm/components/form-group.js +96 -205
  71. package/dist/esm/components/form.js +1539 -409
  72. package/dist/esm/components/input.js +115 -32
  73. package/dist/esm/components/kbd.d.ts +5 -0
  74. package/dist/esm/components/kbd.js +37 -0
  75. package/dist/esm/components/list.js +22 -3
  76. package/dist/esm/components/loading.d.ts +5 -0
  77. package/dist/esm/components/loading.js +114 -0
  78. package/dist/esm/components/modal.js +62 -1
  79. package/dist/esm/components/otp-input.js +125 -7
  80. package/dist/esm/components/progress.js +74 -0
  81. package/dist/esm/components/radial-progress.d.ts +5 -0
  82. package/dist/esm/components/radial-progress.js +56 -0
  83. package/dist/esm/components/radio.js +71 -1
  84. package/dist/esm/components/range.d.ts +5 -0
  85. package/dist/esm/components/range.js +50 -0
  86. package/dist/esm/components/rating.js +39 -12
  87. package/dist/esm/components/select.js +75 -1
  88. package/dist/esm/components/skeleton.js +13 -1
  89. package/dist/esm/components/snackbar.js +48 -18
  90. package/dist/esm/components/stat.d.ts +5 -0
  91. package/dist/esm/components/stat.js +49 -0
  92. package/dist/esm/components/switch.js +71 -1
  93. package/dist/esm/components/table.js +8 -0
  94. package/dist/esm/components/textarea.js +75 -1
  95. package/dist/esm/components/timeline.js +40 -25
  96. package/dist/esm/components/toast.js +188 -34
  97. package/dist/esm/components/toggle-switch.d.ts +5 -0
  98. package/dist/esm/components/toggle-switch.js +174 -0
  99. package/dist/esm/components/toggle.js +198 -32
  100. package/dist/esm/components/tooltip.js +2 -47
  101. package/dist/esm/components/validator.d.ts +5 -0
  102. package/dist/esm/components/validator.js +75 -0
  103. package/dist/esm/effects/aura.d.ts +5 -0
  104. package/dist/esm/effects/aura.js +31 -0
  105. package/dist/esm/effects/hover-3d.d.ts +5 -0
  106. package/dist/esm/effects/hover-3d.js +17 -0
  107. package/dist/esm/effects/hover-gallery.d.ts +5 -0
  108. package/dist/esm/effects/hover-gallery.js +23 -0
  109. package/dist/esm/effects/index.d.ts +5 -0
  110. package/dist/esm/effects/index.js +74 -0
  111. package/dist/esm/effects/text-rotate.d.ts +5 -0
  112. package/dist/esm/effects/text-rotate.js +25 -0
  113. package/dist/index.css +7652 -7204
  114. package/dist/index.min.css +1 -1
  115. package/dist/standalone/duskmoonui-themes.css +1 -1
  116. package/dist/standalone/duskmoonui.css +7598 -7141
  117. package/dist/standalone/duskmoonui.js +18 -16
  118. package/dist/standalone/duskmoonui.mjs +18 -16
  119. package/dist/types/types/plugin.d.ts +1 -1
  120. package/dist/types/types/plugin.d.ts.map +1 -1
  121. package/package.json +110 -1
@@ -4,6 +4,172 @@ export const css = `/**
4
4
  * DuskMoonUI - Material Design 3 inspired toggle button
5
5
  * Used for selecting between multiple options or toggling states
6
6
  */
7
+ /** Opt-in native presentation. Applications own errors, messages and announcements. */
8
+ @layer components {
9
+ /* Compatibility wrapper states are intentionally immediate. */
10
+ :is(.form-group-info, .form-control.info) { --dm-validation-color: var(--color-info); }
11
+ :is(.form-group-warning, .form-control.warning) { --dm-validation-color: var(--color-warning); }
12
+ :is(.form-group-success, .form-control.success) { --dm-validation-color: var(--color-success); }
13
+
14
+ :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) {
15
+ --dm-validation-color: var(--color-success);
16
+ --dm-validation-content: var(--color-success-content);
17
+ }
18
+
19
+ :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) {
20
+ --dm-validation-color: var(--color-error);
21
+ --dm-validation-content: var(--color-error-content);
22
+ }
23
+
24
+ :is(.form-group-error, .form-control.error) {
25
+ --dm-validation-color: var(--color-error);
26
+ --dm-validation-content: var(--color-error-content);
27
+ }
28
+
29
+ /* Higher specificity than native states, including server-invalid + user-valid. */
30
+ :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)) {
31
+ --dm-validation-color: var(--color-error);
32
+ --dm-validation-content: var(--color-error-content);
33
+ }
34
+
35
+ /* This shared selector wins over filled/ghost focus and semantic modifiers. */
36
+ :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) {
37
+ color: var(--dm-validation-color);
38
+ border-color: var(--dm-validation-color);
39
+ --checkbox-color: var(--dm-validation-color);
40
+ --radio-color: var(--dm-validation-color);
41
+ --switch-color: var(--dm-validation-color);
42
+ --switch-content-color: var(--dm-validation-content, var(--color-primary-content));
43
+ --toggle-color: var(--dm-validation-color);
44
+ }
45
+
46
+ :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 {
47
+ border-color: var(--dm-validation-color);
48
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--dm-validation-color) 20%, transparent);
49
+ }
50
+
51
+ :is(.form-group-error, .form-control.error) :is(.form-label, .label-text) { color: var(--color-error); }
52
+ :is(.form-group-success, .form-control.success) :is(.form-label, .label-text) { color: var(--color-success); }
53
+ :is(.form-group-warning, .form-control.warning) :is(.form-label, .label-text) { color: var(--color-warning); }
54
+ :is(.form-group-info, .form-control.info) :is(.form-label, .label-text) { color: var(--color-info); }
55
+
56
+ .validator-hint { font-size: 0.75rem; color: var(--color-on-surface-variant); }
57
+ .validator-error { display: none; font-size: 0.75rem; color: var(--color-error); }
58
+ /* Keep OTP actions stationary when blur reveals an error during a click. */
59
+ .otp-code ~ .validator-error { display: block; visibility: hidden; }
60
+ :is(.form-group, .form-control):has(:is([aria-invalid="true"], .validator:user-invalid, .validate :invalid, .validate:invalid):not(:disabled)) > .validator-error,
61
+ :is(.form-group-error, .form-control.error) > .validator-error { display: block; visibility: visible; }
62
+
63
+ @media (forced-colors: active) {
64
+ :is(input, select, textarea):is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):focus-visible {
65
+ outline: 2px solid Highlight;
66
+ outline-offset: 2px;
67
+ }
68
+ input:is(.checkbox, .radio, .switch, .toggle) { appearance: auto; }
69
+ input:is(.checkbox, .radio, .switch, .toggle)::before,
70
+ input:is(.checkbox, .radio, .switch, .toggle)::after { content: none; }
71
+ }
72
+ }
73
+
74
+
75
+ @layer components {
76
+ /* Toggle/Switch */
77
+ .toggle {
78
+ --toggle-color: var(--color-primary);
79
+ box-sizing: border-box;
80
+ color: var(--color-on-surface);
81
+ border: 1px solid currentColor;
82
+ appearance: none;
83
+ width: 3rem;
84
+ height: 1.5rem;
85
+ border-radius: var(--radius-lg);
86
+ background-color: var(--color-surface-container-highest);
87
+ cursor: pointer;
88
+ transition: all 150ms ease-in-out;
89
+ position: relative;
90
+ }
91
+
92
+ .toggle::after {
93
+ content: '';
94
+ position: absolute;
95
+ inset-inline-start: 0.25rem;
96
+ top: 50%;
97
+ transform: translateY(-50%);
98
+ width: 1rem;
99
+ height: 1rem;
100
+ background-color: var(--color-on-surface-variant);
101
+ border-radius: var(--radius-full);
102
+ transition: all 150ms ease-in-out;
103
+ }
104
+
105
+ .toggle:checked {
106
+ background-color: var(--toggle-color);
107
+ }
108
+
109
+ .toggle:checked::after {
110
+ inset-inline-start: calc(100% - 1.25rem);
111
+ background-color: var(--dm-validation-content, var(--color-primary-content));
112
+ }
113
+
114
+ .toggle:focus-visible {
115
+ outline: none;
116
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
117
+ }
118
+
119
+ .toggle:disabled {
120
+ cursor: not-allowed;
121
+ opacity: 0.5;
122
+ }
123
+
124
+ /* Toggle Sizes */
125
+ .toggle-xs {
126
+ width: 2rem;
127
+ height: 1rem;
128
+ }
129
+
130
+ .toggle-xs::after {
131
+ width: 0.625rem;
132
+ height: 0.625rem;
133
+ inset-inline-start: 0.1875rem;
134
+ }
135
+
136
+ .toggle-xs:checked::after {
137
+ inset-inline-start: calc(100% - 0.8125rem);
138
+ }
139
+
140
+ .toggle-sm {
141
+ width: 2.5rem;
142
+ height: 1.25rem;
143
+ }
144
+
145
+ .toggle-sm::after {
146
+ width: 0.75rem;
147
+ height: 0.75rem;
148
+ }
149
+
150
+ .toggle-lg {
151
+ width: 4rem;
152
+ height: 2rem;
153
+ }
154
+
155
+ .toggle-lg::after {
156
+ width: 1.5rem;
157
+ height: 1.5rem;
158
+ }
159
+
160
+ .toggle-sm:checked::after { inset-inline-start: calc(100% - 1rem); }
161
+ .toggle-lg:checked::after { inset-inline-start: calc(100% - 1.75rem); }
162
+ .toggle-primary { --toggle-color: var(--color-primary); }
163
+ .toggle-secondary { --toggle-color: var(--color-secondary); }
164
+ .toggle-tertiary { --toggle-color: var(--color-tertiary); }
165
+ .toggle-info { --toggle-color: var(--color-info); }
166
+ .toggle-success { --toggle-color: var(--color-success); }
167
+ .toggle-warning { --toggle-color: var(--color-warning); }
168
+ .toggle-error { --toggle-color: var(--color-error); }
169
+ .toggle-ghost { border-color: transparent; }
170
+ @media (prefers-reduced-motion: reduce) { .toggle, .toggle::after { transition: none; } }
171
+ }
172
+
7
173
 
8
174
  @layer components {
9
175
  /* Base toggle button */
@@ -31,93 +197,93 @@ export const css = `/**
31
197
  }
32
198
 
33
199
  /* Active/Selected state */
34
- .toggle-btn-active,
35
- .toggle-btn.active {
200
+ :is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
201
+ .toggle-btn.active:not([aria-pressed]) {
36
202
  color: var(--color-on-primary-container);
37
203
  background-color: var(--color-primary-container);
38
204
  border-color: var(--color-primary);
39
205
  }
40
206
 
41
- .toggle-btn-active:hover:not(:disabled),
42
- .toggle-btn.active:hover:not(:disabled) {
207
+ :is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]):hover:not(:disabled),
208
+ .toggle-btn.active:not([aria-pressed]):hover:not(:disabled) {
43
209
  background-color: color-mix(in oklch, var(--color-primary-container) 90%, transparent);
44
210
  }
45
211
 
46
212
  /* Primary variant */
47
- .toggle-btn-primary.toggle-btn-active,
48
- .toggle-btn-primary.active {
213
+ .toggle-btn-primary:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
214
+ .toggle-btn-primary.active:not([aria-pressed]) {
49
215
  color: var(--color-on-primary-container);
50
216
  background-color: var(--color-primary-container);
51
217
  border-color: var(--color-primary);
52
218
  }
53
219
 
54
220
  /* Secondary variant */
55
- .toggle-btn-secondary.toggle-btn-active,
56
- .toggle-btn-secondary.active {
221
+ .toggle-btn-secondary:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
222
+ .toggle-btn-secondary.active:not([aria-pressed]) {
57
223
  color: var(--color-on-secondary-container);
58
224
  background-color: var(--color-secondary-container);
59
225
  border-color: var(--color-secondary);
60
226
  }
61
227
 
62
228
  /* Tertiary variant */
63
- .toggle-btn-tertiary.toggle-btn-active,
64
- .toggle-btn-tertiary.active {
229
+ .toggle-btn-tertiary:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
230
+ .toggle-btn-tertiary.active:not([aria-pressed]) {
65
231
  color: var(--color-on-tertiary-container);
66
232
  background-color: var(--color-tertiary-container);
67
233
  border-color: var(--color-tertiary);
68
234
  }
69
235
 
70
236
  /* Info variant */
71
- .toggle-btn-info.toggle-btn-active,
72
- .toggle-btn-info.active {
237
+ .toggle-btn-info:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
238
+ .toggle-btn-info.active:not([aria-pressed]) {
73
239
  color: var(--color-on-info-container);
74
240
  background-color: var(--color-info-container);
75
241
  border-color: var(--color-info);
76
242
  }
77
243
 
78
244
  /* Success variant */
79
- .toggle-btn-success.toggle-btn-active,
80
- .toggle-btn-success.active {
245
+ .toggle-btn-success:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
246
+ .toggle-btn-success.active:not([aria-pressed]) {
81
247
  color: var(--color-on-success-container);
82
248
  background-color: var(--color-success-container);
83
249
  border-color: var(--color-success);
84
250
  }
85
251
 
86
252
  /* Warning variant */
87
- .toggle-btn-warning.toggle-btn-active,
88
- .toggle-btn-warning.active {
253
+ .toggle-btn-warning:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
254
+ .toggle-btn-warning.active:not([aria-pressed]) {
89
255
  color: var(--color-on-warning-container);
90
256
  background-color: var(--color-warning-container);
91
257
  border-color: var(--color-warning);
92
258
  }
93
259
 
94
260
  /* Error variant */
95
- .toggle-btn-error.toggle-btn-active,
96
- .toggle-btn-error.active {
261
+ .toggle-btn-error:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
262
+ .toggle-btn-error.active:not([aria-pressed]) {
97
263
  color: var(--color-on-error-container);
98
264
  background-color: var(--color-error-container);
99
265
  border-color: var(--color-error);
100
266
  }
101
267
 
102
268
  /* Accent variant */
103
- .toggle-btn-accent.toggle-btn-active,
104
- .toggle-btn-accent.active {
269
+ .toggle-btn-accent:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
270
+ .toggle-btn-accent.active:not([aria-pressed]) {
105
271
  color: var(--color-on-surface);
106
272
  background-color: color-mix(in oklch, var(--color-accent) 15%, var(--color-surface));
107
273
  border-color: var(--color-accent);
108
274
  }
109
275
 
110
276
  /* Neutral variant */
111
- .toggle-btn-neutral.toggle-btn-active,
112
- .toggle-btn-neutral.active {
277
+ .toggle-btn-neutral:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
278
+ .toggle-btn-neutral.active:not([aria-pressed]) {
113
279
  color: var(--color-on-surface);
114
280
  background-color: color-mix(in oklch, var(--color-neutral) 15%, var(--color-surface));
115
281
  border-color: var(--color-neutral);
116
282
  }
117
283
 
118
284
  /* Base variant */
119
- .toggle-btn-base.toggle-btn-active,
120
- .toggle-btn-base.active {
285
+ .toggle-btn-base:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
286
+ .toggle-btn-base.active:not([aria-pressed]) {
121
287
  color: var(--color-base-content);
122
288
  background-color: var(--color-base-200);
123
289
  border-color: var(--color-base-content);
@@ -246,8 +412,8 @@ export const css = `/**
246
412
  border-radius: var(--radius-xs);
247
413
  }
248
414
 
249
- .toggle-segmented .toggle-btn.toggle-btn-active,
250
- .toggle-segmented .toggle-btn.active {
415
+ .toggle-segmented .toggle-btn:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
416
+ .toggle-segmented .toggle-btn.active:not([aria-pressed]) {
251
417
  background-color: var(--color-surface-variant);
252
418
  border-color: transparent;
253
419
  box-shadow: var(--shadow-sm);
@@ -259,8 +425,8 @@ export const css = `/**
259
425
  padding: 0.5rem 1rem;
260
426
  }
261
427
 
262
- .toggle-chip.toggle-btn-active,
263
- .toggle-chip.active {
428
+ .toggle-chip:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
429
+ .toggle-chip.active:not([aria-pressed]) {
264
430
  background-color: var(--color-primary-container);
265
431
  border-color: var(--color-primary-container);
266
432
  }
@@ -270,8 +436,8 @@ export const css = `/**
270
436
  background-color: transparent;
271
437
  }
272
438
 
273
- .toggle-outlined.toggle-btn-active,
274
- .toggle-outlined.active {
439
+ .toggle-outlined:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
440
+ .toggle-outlined.active:not([aria-pressed]) {
275
441
  background-color: color-mix(in oklch, var(--color-primary) 10%, transparent);
276
442
  }
277
443
 
@@ -281,8 +447,8 @@ export const css = `/**
281
447
  border: none;
282
448
  }
283
449
 
284
- .toggle-filled.toggle-btn-active,
285
- .toggle-filled.active {
450
+ .toggle-filled:is(.toggle-btn-active:not([aria-pressed]), .toggle-btn[aria-pressed="true"]),
451
+ .toggle-filled.active:not([aria-pressed]) {
286
452
  background-color: var(--color-primary);
287
453
  color: var(--color-primary-content);
288
454
  }
@@ -77,53 +77,8 @@ export const css = `/**
77
77
  position-area: right;
78
78
  }
79
79
 
80
- /* ========================================
81
- * Arrow (preferred position only; may be wrong after flip)
82
- * ======================================== */
83
-
84
- .tooltip[popover]::before {
85
- content: '';
86
- position: absolute;
87
- width: 0;
88
- height: 0;
89
- border: 0.375rem solid transparent;
90
- }
91
-
92
- .tooltip-top[popover]::before,
93
- .tooltip[popover]:not(.tooltip-bottom):not(.tooltip-left):not(.tooltip-right)::before {
94
- top: 100%;
95
- left: 50%;
96
- transform: translateX(-50%);
97
- border-top-color: var(--tooltip-bg);
98
- }
99
-
100
- .tooltip-bottom[popover]::before {
101
- bottom: 100%;
102
- top: auto;
103
- left: 50%;
104
- transform: translateX(-50%);
105
- border-bottom-color: var(--tooltip-bg);
106
- border-top-color: transparent;
107
- }
108
-
109
- .tooltip-left[popover]::before {
110
- left: 100%;
111
- top: 50%;
112
- bottom: auto;
113
- transform: translateY(-50%);
114
- border-left-color: var(--tooltip-bg);
115
- border-top-color: transparent;
116
- }
117
-
118
- .tooltip-right[popover]::before {
119
- right: 100%;
120
- left: auto;
121
- top: 50%;
122
- bottom: auto;
123
- transform: translateY(-50%);
124
- border-right-color: var(--tooltip-bg);
125
- border-top-color: transparent;
126
- }
80
+ /* Automatic placement can flip independently of the preferred side. The
81
+ core stays arrowless instead of showing a misleading arrow. */
127
82
 
128
83
  /* ========================================
129
84
  * Color variants
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for validator
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,75 @@
1
+ // Auto-generated from validator.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
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
71
+ if (sheet) {
72
+ sheet.replaceSync(css);
73
+ }
74
+ export const styles = sheet;
75
+ export default sheet;
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for aura
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,31 @@
1
+ // Auto-generated from aura.css
2
+ export const css = `@layer components {
3
+ .aura {
4
+ position: relative;
5
+ isolation: isolate;
6
+ border-radius: var(--radius-md);
7
+ outline: 1px solid var(--color-primary);
8
+ }
9
+ .aura::before {
10
+ content: '';
11
+ position: absolute;
12
+ inset: 0;
13
+ z-index: -1;
14
+ border-radius: inherit;
15
+ box-shadow: 0 0 1rem color-mix(in oklch, var(--color-primary) 35%, transparent);
16
+ pointer-events: none;
17
+ }
18
+ @media (prefers-reduced-motion: no-preference) {
19
+ .aura-animated::before { animation: dm-aura 4s ease-in-out infinite; }
20
+ }
21
+ @keyframes dm-aura { 50% { opacity: 0.4; } }
22
+ @media print { .aura::before { display: none; } }
23
+ }
24
+ `;
25
+
26
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
27
+ if (sheet) {
28
+ sheet.replaceSync(css);
29
+ }
30
+ export const styles = sheet;
31
+ export default sheet;
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for hover-3d
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,17 @@
1
+ // Auto-generated from hover-3d.css
2
+ export const css = `@layer components {
3
+ .hover-3d { border-radius: var(--radius-md); }
4
+ @media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
5
+ .hover-3d { transition: transform 200ms ease; }
6
+ .hover-3d:hover:not(:focus-within) { transform: perspective(60rem) rotateX(var(--hover-3d-x, 2deg)) rotateY(var(--hover-3d-y, -2deg)); }
7
+ }
8
+ @media print { .hover-3d { transform: none; } }
9
+ }
10
+ `;
11
+
12
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
13
+ if (sheet) {
14
+ sheet.replaceSync(css);
15
+ }
16
+ export const styles = sheet;
17
+ export default sheet;
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for hover-gallery
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,23 @@
1
+ // Auto-generated from hover-gallery.css
2
+ export const css = `@layer components {
3
+ .hover-gallery { display: grid; gap: 0.5rem; min-inline-size: 0; color: var(--color-on-surface); }
4
+ .hover-gallery-stage { aspect-ratio: var(--hover-gallery-ratio, 4 / 3); overflow: hidden; border-radius: var(--radius-md); }
5
+ .hover-gallery-stage img { inline-size: 100%; block-size: 100%; object-fit: cover; }
6
+ .hover-gallery-controls { display: flex; flex-wrap: wrap; gap: 0.5rem; }
7
+ .hover-gallery-controls > button { border: 1px solid currentColor; color: inherit; background: var(--color-surface-container); padding: 0.25rem; border-radius: var(--radius-sm); cursor: pointer; }
8
+ .hover-gallery-controls img { display: block; inline-size: 3rem; block-size: 3rem; object-fit: cover; }
9
+ .hover-gallery-controls > button[aria-pressed="true"] { color: var(--color-primary); outline: 2px solid currentColor; }
10
+ .hover-gallery-controls > button:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; }
11
+ @media (hover: hover) and (prefers-reduced-motion: no-preference) {
12
+ .hover-gallery-controls > button:hover { background: var(--color-primary-container); }
13
+ }
14
+ @media print { .hover-gallery-controls { display: none; } }
15
+ }
16
+ `;
17
+
18
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
19
+ if (sheet) {
20
+ sheet.replaceSync(css);
21
+ }
22
+ export const styles = sheet;
23
+ export default sheet;
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for index
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,74 @@
1
+ // Auto-generated from index.css
2
+ export const css = `/* Explicitly opt-in. Not imported by core or components/index.css. */
3
+ @layer components {
4
+ .aura {
5
+ position: relative;
6
+ isolation: isolate;
7
+ border-radius: var(--radius-md);
8
+ outline: 1px solid var(--color-primary);
9
+ }
10
+ .aura::before {
11
+ content: '';
12
+ position: absolute;
13
+ inset: 0;
14
+ z-index: -1;
15
+ border-radius: inherit;
16
+ box-shadow: 0 0 1rem color-mix(in oklch, var(--color-primary) 35%, transparent);
17
+ pointer-events: none;
18
+ }
19
+ @media (prefers-reduced-motion: no-preference) {
20
+ .aura-animated::before { animation: dm-aura 4s ease-in-out infinite; }
21
+ }
22
+ @keyframes dm-aura { 50% { opacity: 0.4; } }
23
+ @media print { .aura::before { display: none; } }
24
+ }
25
+
26
+ @layer components {
27
+ .hover-3d { border-radius: var(--radius-md); }
28
+ @media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
29
+ .hover-3d { transition: transform 200ms ease; }
30
+ .hover-3d:hover:not(:focus-within) { transform: perspective(60rem) rotateX(var(--hover-3d-x, 2deg)) rotateY(var(--hover-3d-y, -2deg)); }
31
+ }
32
+ @media print { .hover-3d { transform: none; } }
33
+ }
34
+
35
+ @layer components {
36
+ .hover-gallery { display: grid; gap: 0.5rem; min-inline-size: 0; color: var(--color-on-surface); }
37
+ .hover-gallery-stage { aspect-ratio: var(--hover-gallery-ratio, 4 / 3); overflow: hidden; border-radius: var(--radius-md); }
38
+ .hover-gallery-stage img { inline-size: 100%; block-size: 100%; object-fit: cover; }
39
+ .hover-gallery-controls { display: flex; flex-wrap: wrap; gap: 0.5rem; }
40
+ .hover-gallery-controls > button { border: 1px solid currentColor; color: inherit; background: var(--color-surface-container); padding: 0.25rem; border-radius: var(--radius-sm); cursor: pointer; }
41
+ .hover-gallery-controls img { display: block; inline-size: 3rem; block-size: 3rem; object-fit: cover; }
42
+ .hover-gallery-controls > button[aria-pressed="true"] { color: var(--color-primary); outline: 2px solid currentColor; }
43
+ .hover-gallery-controls > button:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; }
44
+ @media (hover: hover) and (prefers-reduced-motion: no-preference) {
45
+ .hover-gallery-controls > button:hover { background: var(--color-primary-container); }
46
+ }
47
+ @media print { .hover-gallery-controls { display: none; } }
48
+ }
49
+
50
+ @layer components {
51
+ .text-rotate { display: inline-grid; color: var(--color-on-surface); vertical-align: baseline; }
52
+ .text-rotate > span { grid-area: 1 / 1; visibility: hidden; }
53
+ .text-rotate > span:first-child { visibility: visible; }
54
+ @media (prefers-reduced-motion: no-preference) {
55
+ .text-rotate-animated > span { animation: dm-text-rotate var(--text-rotate-duration, 6s) steps(1, end) infinite; }
56
+ .text-rotate-animated > span:nth-child(2) { animation-delay: calc(var(--text-rotate-duration, 6s) / -3); }
57
+ .text-rotate-animated > span:nth-child(3) { animation-delay: calc(var(--text-rotate-duration, 6s) / -3 * 2); }
58
+ .text-rotate-animated:is(:hover, :focus-within, .text-rotate-paused) > span { animation-play-state: paused; }
59
+ }
60
+ @keyframes dm-text-rotate { 0%, 33.32% { visibility: visible; } 33.33%, 100% { visibility: hidden; } }
61
+ @media print {
62
+ .text-rotate > span { animation: none; visibility: hidden; }
63
+ .text-rotate > span:first-child { visibility: visible; }
64
+ }
65
+ }
66
+
67
+ `;
68
+
69
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
70
+ if (sheet) {
71
+ sheet.replaceSync(css);
72
+ }
73
+ export const styles = sheet;
74
+ export default sheet;
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for text-rotate
2
+ export declare const css: string;
3
+ export declare const styles: CSSStyleSheet | null;
4
+ declare const sheet: CSSStyleSheet | null;
5
+ export default sheet;