@duskmoon-dev/core 0.1.0 → 0.2.0

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 (110) hide show
  1. package/README.md +366 -78
  2. package/dist/components/accordion.css +244 -0
  3. package/dist/components/alert.css +199 -0
  4. package/dist/components/appbar.css +493 -0
  5. package/dist/components/autocomplete.css +269 -0
  6. package/dist/components/avatar.css +167 -0
  7. package/dist/components/badge.css +178 -0
  8. package/dist/components/bottom-navigation.css +263 -0
  9. package/dist/components/bottomsheet.css +334 -0
  10. package/dist/components/button.css +475 -0
  11. package/dist/components/card.css +220 -0
  12. package/dist/components/cascader.css +418 -0
  13. package/dist/components/checkbox.css +231 -0
  14. package/dist/components/chip.css +211 -0
  15. package/dist/components/collapse.css +454 -0
  16. package/dist/components/datepicker.css +741 -0
  17. package/dist/components/dialog.css +173 -0
  18. package/dist/components/divider.css +284 -0
  19. package/dist/components/drawer.css +371 -0
  20. package/dist/components/file-upload.css +321 -0
  21. package/dist/components/form-group.css +308 -0
  22. package/dist/components/form.css +441 -0
  23. package/dist/components/index.css +14951 -0
  24. package/dist/components/input.css +240 -0
  25. package/dist/components/list.css +188 -0
  26. package/dist/components/markdown-body.css +405 -0
  27. package/dist/components/modal.css +291 -0
  28. package/dist/components/multi-select.css +491 -0
  29. package/dist/components/navigation.css +736 -0
  30. package/dist/components/otp-input.css +195 -0
  31. package/dist/components/pin-input.css +184 -0
  32. package/dist/components/popover.css +392 -0
  33. package/dist/components/progress.css +238 -0
  34. package/dist/components/radio.css +183 -0
  35. package/dist/components/rating.css +230 -0
  36. package/dist/components/segment-control.css +186 -0
  37. package/dist/components/select.css +205 -0
  38. package/dist/components/skeleton.css +216 -0
  39. package/dist/components/slider.css +327 -0
  40. package/dist/components/snackbar.css +311 -0
  41. package/dist/components/stepper.css +313 -0
  42. package/dist/components/switch.css +234 -0
  43. package/dist/components/table.css +199 -0
  44. package/dist/components/textarea.css +398 -0
  45. package/dist/components/time-input.css +252 -0
  46. package/dist/components/timeline.css +353 -0
  47. package/dist/components/toast.css +251 -0
  48. package/dist/components/tooltip.css +284 -0
  49. package/dist/components/tree-select.css +472 -0
  50. package/dist/esm/components/accordion.js +251 -0
  51. package/dist/esm/components/alert.js +206 -0
  52. package/dist/esm/components/appbar.js +500 -0
  53. package/dist/esm/components/autocomplete.js +276 -0
  54. package/dist/esm/components/avatar.js +174 -0
  55. package/dist/esm/components/badge.js +185 -0
  56. package/dist/esm/components/bottom-navigation.js +270 -0
  57. package/dist/esm/components/bottomsheet.js +341 -0
  58. package/dist/esm/components/button.js +482 -0
  59. package/dist/esm/components/card.js +227 -0
  60. package/dist/esm/components/cascader.js +425 -0
  61. package/dist/esm/components/checkbox.js +238 -0
  62. package/dist/esm/components/chip.js +218 -0
  63. package/dist/esm/components/collapse.js +461 -0
  64. package/dist/esm/components/datepicker.js +748 -0
  65. package/dist/esm/components/dialog.js +180 -0
  66. package/dist/esm/components/divider.js +291 -0
  67. package/dist/esm/components/drawer.js +378 -0
  68. package/dist/esm/components/file-upload.js +328 -0
  69. package/dist/esm/components/form-group.js +315 -0
  70. package/dist/esm/components/form.js +448 -0
  71. package/dist/esm/components/input.js +247 -0
  72. package/dist/esm/components/list.js +195 -0
  73. package/dist/esm/components/markdown-body.js +412 -0
  74. package/dist/esm/components/modal.js +298 -0
  75. package/dist/esm/components/multi-select.js +498 -0
  76. package/dist/esm/components/navigation.js +743 -0
  77. package/dist/esm/components/otp-input.js +202 -0
  78. package/dist/esm/components/pin-input.js +191 -0
  79. package/dist/esm/components/popover.js +399 -0
  80. package/dist/esm/components/progress.js +245 -0
  81. package/dist/esm/components/radio.js +190 -0
  82. package/dist/esm/components/rating.js +237 -0
  83. package/dist/esm/components/segment-control.js +193 -0
  84. package/dist/esm/components/select.js +212 -0
  85. package/dist/esm/components/skeleton.js +223 -0
  86. package/dist/esm/components/slider.js +334 -0
  87. package/dist/esm/components/snackbar.js +318 -0
  88. package/dist/esm/components/stepper.js +320 -0
  89. package/dist/esm/components/switch.js +241 -0
  90. package/dist/esm/components/table.js +206 -0
  91. package/dist/esm/components/textarea.js +405 -0
  92. package/dist/esm/components/time-input.js +259 -0
  93. package/dist/esm/components/timeline.js +360 -0
  94. package/dist/esm/components/toast.js +258 -0
  95. package/dist/esm/components/tooltip.js +291 -0
  96. package/dist/esm/components/tree-select.js +479 -0
  97. package/dist/index.css +15866 -0
  98. package/dist/themes/moonlight.css +253 -0
  99. package/dist/themes/sunshine.css +250 -0
  100. package/dist/types/index.d.ts +14 -0
  101. package/dist/types/index.d.ts.map +1 -0
  102. package/dist/types/plugin.d.ts +69 -0
  103. package/dist/types/plugin.d.ts.map +1 -0
  104. package/dist/types/theme.d.ts +202 -0
  105. package/dist/types/theme.d.ts.map +1 -0
  106. package/package.json +262 -18
  107. package/dist/index.cjs +0 -243
  108. package/dist/index.cjs.map +0 -15
  109. package/dist/index.js +0 -211
  110. package/dist/index.js.map +0 -15
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Chip Component Styles
3
+ * DuskMoonUI - Material Design 3 inspired chip system
4
+ */
5
+
6
+ @layer components {
7
+ /* Base Chip */
8
+ .chip {
9
+ display: inline-flex;
10
+ align-items: center;
11
+ gap: 0.375rem;
12
+ padding: 0.375rem 0.75rem;
13
+ font-size: 0.875rem;
14
+ font-weight: 500;
15
+ line-height: 1.25rem;
16
+ border-radius: 0.5rem;
17
+ background-color: var(--color-surface-container);
18
+ color: var(--color-on-surface);
19
+ border: 1px solid transparent;
20
+ cursor: default;
21
+ transition: all 150ms ease-in-out;
22
+ }
23
+
24
+ /* Interactive Chip */
25
+ .chip-clickable {
26
+ cursor: pointer;
27
+ }
28
+
29
+ .chip-clickable:hover {
30
+ background-color: var(--color-surface-container-high);
31
+ }
32
+
33
+ .chip-clickable:active {
34
+ transform: scale(0.98);
35
+ }
36
+
37
+ .chip:focus-visible {
38
+ outline: 2px solid var(--color-primary);
39
+ outline-offset: 2px;
40
+ }
41
+
42
+ /* Color Variants - Filled */
43
+ .chip-primary {
44
+ background-color: var(--color-primary);
45
+ color: var(--color-primary-content);
46
+ }
47
+
48
+ .chip-primary:hover {
49
+ background-color: color-mix(in oklch, var(--color-primary), black 10%);
50
+ }
51
+
52
+ .chip-secondary {
53
+ background-color: var(--color-secondary);
54
+ color: var(--color-secondary-content);
55
+ }
56
+
57
+ .chip-secondary:hover {
58
+ background-color: color-mix(in oklch, var(--color-secondary), black 10%);
59
+ }
60
+
61
+ .chip-tertiary {
62
+ background-color: var(--color-tertiary);
63
+ color: var(--color-tertiary-content);
64
+ }
65
+
66
+ .chip-tertiary:hover {
67
+ background-color: color-mix(in oklch, var(--color-tertiary), black 10%);
68
+ }
69
+
70
+ /* Outlined Variant */
71
+ .chip-outlined {
72
+ background-color: transparent;
73
+ border-color: var(--color-outline);
74
+ }
75
+
76
+ .chip-outlined:hover {
77
+ background-color: var(--color-surface-container);
78
+ }
79
+
80
+ .chip-outlined.chip-primary {
81
+ border-color: var(--color-primary);
82
+ color: var(--color-primary);
83
+ }
84
+
85
+ .chip-outlined.chip-primary:hover {
86
+ background-color: var(--color-primary-container);
87
+ }
88
+
89
+ .chip-outlined.chip-secondary {
90
+ border-color: var(--color-secondary);
91
+ color: var(--color-secondary);
92
+ }
93
+
94
+ .chip-outlined.chip-secondary:hover {
95
+ background-color: var(--color-secondary-container);
96
+ }
97
+
98
+ .chip-outlined.chip-tertiary {
99
+ border-color: var(--color-tertiary);
100
+ color: var(--color-tertiary);
101
+ }
102
+
103
+ .chip-outlined.chip-tertiary:hover {
104
+ background-color: var(--color-tertiary-container);
105
+ }
106
+
107
+ /* Tonal/Soft Variant */
108
+ .chip-tonal {
109
+ background-color: var(--color-surface-container-high);
110
+ }
111
+
112
+ .chip-tonal.chip-primary {
113
+ background-color: var(--color-primary-container);
114
+ color: var(--color-on-primary-container);
115
+ }
116
+
117
+ .chip-tonal.chip-secondary {
118
+ background-color: var(--color-secondary-container);
119
+ color: var(--color-on-secondary-container);
120
+ }
121
+
122
+ .chip-tonal.chip-tertiary {
123
+ background-color: var(--color-tertiary-container);
124
+ color: var(--color-on-tertiary-container);
125
+ }
126
+
127
+ /* Size Variants */
128
+ .chip-sm {
129
+ padding: 0.25rem 0.5rem;
130
+ font-size: 0.75rem;
131
+ line-height: 1rem;
132
+ gap: 0.25rem;
133
+ }
134
+
135
+ .chip-lg {
136
+ padding: 0.5rem 1rem;
137
+ font-size: 1rem;
138
+ line-height: 1.5rem;
139
+ gap: 0.5rem;
140
+ }
141
+
142
+ /* Chip Parts */
143
+ .chip-icon {
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ width: 1.125rem;
148
+ height: 1.125rem;
149
+ font-size: 1rem;
150
+ }
151
+
152
+ .chip-label {
153
+ display: inline-flex;
154
+ }
155
+
156
+ .chip-close {
157
+ display: flex;
158
+ align-items: center;
159
+ justify-content: center;
160
+ width: 1.125rem;
161
+ height: 1.125rem;
162
+ margin-left: 0.125rem;
163
+ font-size: 1rem;
164
+ color: currentColor;
165
+ opacity: 0.7;
166
+ background-color: transparent;
167
+ border: none;
168
+ border-radius: 50%;
169
+ cursor: pointer;
170
+ transition: opacity 150ms ease-in-out;
171
+ }
172
+
173
+ .chip-close:hover {
174
+ opacity: 1;
175
+ }
176
+
177
+ /* Selected State */
178
+ .chip-selected {
179
+ background-color: var(--color-primary);
180
+ color: var(--color-primary-content);
181
+ }
182
+
183
+ .chip-selected.chip-outlined {
184
+ background-color: var(--color-primary);
185
+ border-color: var(--color-primary);
186
+ color: var(--color-primary-content);
187
+ }
188
+
189
+ /* Disabled State */
190
+ .chip:disabled,
191
+ .chip-disabled {
192
+ opacity: 0.5;
193
+ pointer-events: none;
194
+ cursor: not-allowed;
195
+ }
196
+
197
+ /* Chip Group */
198
+ .chip-group {
199
+ display: flex;
200
+ flex-wrap: wrap;
201
+ gap: 0.5rem;
202
+ }
203
+
204
+ /* Reduce Motion */
205
+ @media (prefers-reduced-motion: reduce) {
206
+ .chip,
207
+ .chip-delete {
208
+ transition: none;
209
+ }
210
+ }
211
+ }
@@ -0,0 +1,454 @@
1
+ /**
2
+ * Collapse Component Styles
3
+ * DuskMoonUI - Material Design 3 inspired collapsible content system
4
+ */
5
+
6
+ @layer components {
7
+ /* Base Collapse */
8
+ .collapse {
9
+ display: flex;
10
+ flex-direction: column;
11
+ border-radius: 0.5rem;
12
+ background-color: var(--color-surface);
13
+ /* Override Tailwind's visibility: collapse utility */
14
+ visibility: visible !important;
15
+ }
16
+
17
+ /* Collapse Trigger */
18
+ .collapse-trigger {
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: space-between;
22
+ width: 100%;
23
+ padding: 0.75rem 1rem;
24
+ font-size: 1rem;
25
+ font-weight: 500;
26
+ color: var(--color-on-surface);
27
+ background-color: transparent;
28
+ border: none;
29
+ cursor: pointer;
30
+ transition: background-color 150ms ease-in-out;
31
+ text-align: left;
32
+ }
33
+
34
+ .collapse-trigger:hover {
35
+ background-color: var(--color-surface-container);
36
+ }
37
+
38
+ .collapse-trigger:focus-visible {
39
+ outline: 2px solid var(--color-primary);
40
+ outline-offset: -2px;
41
+ }
42
+
43
+ /* Collapse Icon */
44
+ .collapse-icon {
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ width: 1.5rem;
49
+ height: 1.5rem;
50
+ transition: transform 300ms ease-in-out;
51
+ flex-shrink: 0;
52
+ }
53
+
54
+ /* Collapse Content - hidden by default */
55
+ .collapse-content {
56
+ display: grid;
57
+ grid-template-rows: 0fr;
58
+ transition: grid-template-rows 300ms ease-in-out;
59
+ overflow: hidden;
60
+ }
61
+
62
+ .collapse-content > * {
63
+ overflow: hidden;
64
+ padding: 0 1rem;
65
+ }
66
+
67
+ /* Open State */
68
+ .collapse-open .collapse-content {
69
+ grid-template-rows: 1fr;
70
+ }
71
+
72
+ .collapse-open .collapse-content > * {
73
+ padding: 0 1rem 1rem;
74
+ }
75
+
76
+ .collapse-open .collapse-icon {
77
+ transform: rotate(180deg);
78
+ }
79
+
80
+ /* Closed State (explicit) */
81
+ .collapse-closed .collapse-content {
82
+ grid-template-rows: 0fr;
83
+ }
84
+
85
+ /* Legacy show class for backwards compatibility */
86
+ .collapse.show .collapse-content {
87
+ grid-template-rows: 1fr;
88
+ }
89
+
90
+ .collapse.show .collapse-content > * {
91
+ padding: 0 1rem 1rem;
92
+ }
93
+
94
+ .collapse.show .collapse-icon {
95
+ transform: rotate(180deg);
96
+ }
97
+
98
+ /* Collapse Inner (for padding) */
99
+ .collapse-inner {
100
+ /* Add padding here as needed */
101
+ }
102
+
103
+ /* Collapse with Fade */
104
+ .collapse-fade {
105
+ opacity: 0;
106
+ transition: grid-template-rows 300ms ease-in-out, opacity 200ms ease-in-out;
107
+ }
108
+
109
+ .collapse-fade.show {
110
+ opacity: 1;
111
+ transition: grid-template-rows 300ms ease-in-out, opacity 300ms ease-in-out 100ms;
112
+ }
113
+
114
+ /* Collapse Toggle Button */
115
+ .collapse-toggle {
116
+ display: inline-flex;
117
+ align-items: center;
118
+ gap: 0.5rem;
119
+ padding: 0.5rem 1rem;
120
+ font-size: 0.875rem;
121
+ font-weight: 500;
122
+ color: var(--color-primary);
123
+ background-color: transparent;
124
+ border: none;
125
+ cursor: pointer;
126
+ transition: background-color 150ms ease-in-out;
127
+ border-radius: 0.5rem;
128
+ }
129
+
130
+ .collapse-toggle:hover {
131
+ background-color: var(--color-primary-container);
132
+ }
133
+
134
+ .collapse-toggle:focus-visible {
135
+ outline: 2px solid var(--color-primary);
136
+ outline-offset: 2px;
137
+ }
138
+
139
+ /* Toggle Icon */
140
+ .collapse-toggle-icon {
141
+ display: flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ width: 1.25rem;
145
+ height: 1.25rem;
146
+ transition: transform 200ms ease-in-out;
147
+ }
148
+
149
+ .collapse-toggle[aria-expanded="true"] .collapse-toggle-icon {
150
+ transform: rotate(180deg);
151
+ }
152
+
153
+ /* Collapse Card Variant */
154
+ .collapse-card {
155
+ background-color: var(--color-surface);
156
+ border: 1px solid var(--color-outline-variant);
157
+ border-radius: 0.75rem;
158
+ overflow: hidden;
159
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
160
+ }
161
+
162
+ .collapse-card .collapse-toggle,
163
+ .collapse-card .collapse-trigger {
164
+ width: 100%;
165
+ justify-content: space-between;
166
+ padding: 1rem;
167
+ border-radius: 0;
168
+ color: var(--color-on-surface);
169
+ }
170
+
171
+ .collapse-card .collapse-toggle:hover,
172
+ .collapse-card .collapse-trigger:hover {
173
+ background-color: var(--color-surface-container);
174
+ }
175
+
176
+ .collapse-card .collapse-inner,
177
+ .collapse-card .collapse-content > * {
178
+ padding: 0 1rem 1rem;
179
+ color: var(--color-on-surface-variant);
180
+ }
181
+
182
+ /* Bordered Variant */
183
+ .collapse-bordered {
184
+ border: 1px solid var(--color-outline-variant);
185
+ border-radius: 0.5rem;
186
+ }
187
+
188
+ /* Ghost Variant */
189
+ .collapse-ghost {
190
+ background-color: transparent;
191
+ }
192
+
193
+ .collapse-ghost .collapse-trigger:hover {
194
+ background-color: color-mix(in oklch, var(--color-on-surface) 5%, transparent);
195
+ }
196
+
197
+ /* Color Variants */
198
+ .collapse-primary .collapse-trigger {
199
+ color: var(--color-primary);
200
+ }
201
+
202
+ .collapse-primary .collapse-trigger:hover {
203
+ background-color: var(--color-primary-container);
204
+ }
205
+
206
+ .collapse-secondary .collapse-trigger {
207
+ color: var(--color-secondary);
208
+ }
209
+
210
+ .collapse-secondary .collapse-trigger:hover {
211
+ background-color: var(--color-secondary-container);
212
+ }
213
+
214
+ .collapse-tertiary .collapse-trigger {
215
+ color: var(--color-tertiary);
216
+ }
217
+
218
+ .collapse-tertiary .collapse-trigger:hover {
219
+ background-color: var(--color-tertiary-container);
220
+ }
221
+
222
+ /* Size Variants */
223
+ .collapse-sm .collapse-trigger {
224
+ padding: 0.5rem 0.75rem;
225
+ font-size: 0.875rem;
226
+ }
227
+
228
+ .collapse-sm .collapse-content > * {
229
+ padding: 0 0.75rem;
230
+ }
231
+
232
+ .collapse-sm.collapse-open .collapse-content > * {
233
+ padding: 0 0.75rem 0.75rem;
234
+ }
235
+
236
+ .collapse-lg .collapse-trigger {
237
+ padding: 1rem 1.25rem;
238
+ font-size: 1.125rem;
239
+ }
240
+
241
+ .collapse-lg .collapse-content > * {
242
+ padding: 0 1.25rem;
243
+ }
244
+
245
+ .collapse-lg.collapse-open .collapse-content > * {
246
+ padding: 0 1.25rem 1.25rem;
247
+ }
248
+
249
+ /* Divider Variant */
250
+ .collapse-divider .collapse-trigger {
251
+ border-bottom: 1px solid var(--color-outline-variant);
252
+ }
253
+
254
+ .collapse-divider.collapse-open .collapse-trigger {
255
+ border-bottom-color: var(--color-outline-variant);
256
+ }
257
+
258
+ /* Disabled State */
259
+ .collapse-disabled {
260
+ opacity: 0.5;
261
+ pointer-events: none;
262
+ }
263
+
264
+ .collapse-disabled .collapse-trigger {
265
+ cursor: not-allowed;
266
+ }
267
+
268
+ /* Loading State */
269
+ .collapse-loading .collapse-trigger::after {
270
+ content: '';
271
+ display: inline-block;
272
+ width: 1rem;
273
+ height: 1rem;
274
+ margin-left: 0.5rem;
275
+ border: 2px solid var(--color-outline);
276
+ border-top-color: var(--color-primary);
277
+ border-radius: 50%;
278
+ animation: collapse-spin 0.8s linear infinite;
279
+ }
280
+
281
+ @keyframes collapse-spin {
282
+ to { transform: rotate(360deg); }
283
+ }
284
+
285
+ /* Slide Animation */
286
+ .collapse-slide .collapse-content > * {
287
+ transform: translateY(-0.5rem);
288
+ opacity: 0;
289
+ transition: transform 300ms ease-in-out, opacity 200ms ease-in-out;
290
+ }
291
+
292
+ .collapse-slide.collapse-open .collapse-content > * {
293
+ transform: translateY(0);
294
+ opacity: 1;
295
+ }
296
+
297
+ /* Horizontal Collapse */
298
+ .collapse-horizontal {
299
+ display: grid;
300
+ grid-template-columns: 0fr;
301
+ transition: grid-template-columns 300ms ease-in-out;
302
+ }
303
+
304
+ .collapse-horizontal.show {
305
+ grid-template-columns: 1fr;
306
+ }
307
+
308
+ .collapse-horizontal .collapse-content {
309
+ overflow: hidden;
310
+ white-space: nowrap;
311
+ }
312
+
313
+ /* Fixed Width Horizontal */
314
+ .collapse-horizontal-fixed {
315
+ display: block;
316
+ width: 0;
317
+ overflow: hidden;
318
+ transition: width 300ms ease-in-out;
319
+ }
320
+
321
+ .collapse-horizontal-fixed.show {
322
+ width: var(--collapse-width, 20rem);
323
+ }
324
+
325
+ /* Nested Collapse */
326
+ .collapse-nested {
327
+ margin-left: 1rem;
328
+ padding-left: 1rem;
329
+ border-left: 2px solid var(--color-outline-variant);
330
+ }
331
+
332
+ /* Show More/Less Pattern */
333
+ .collapse-showmore {
334
+ position: relative;
335
+ }
336
+
337
+ .collapse-showmore:not(.show)::after {
338
+ content: '';
339
+ position: absolute;
340
+ bottom: 0;
341
+ left: 0;
342
+ right: 0;
343
+ height: 3rem;
344
+ background: linear-gradient(to bottom, transparent, var(--color-surface));
345
+ pointer-events: none;
346
+ }
347
+
348
+ .collapse-showmore-toggle {
349
+ display: flex;
350
+ align-items: center;
351
+ justify-content: center;
352
+ gap: 0.25rem;
353
+ width: 100%;
354
+ padding: 0.5rem;
355
+ margin-top: 0.5rem;
356
+ font-size: 0.75rem;
357
+ font-weight: 500;
358
+ color: var(--color-primary);
359
+ background-color: transparent;
360
+ border: none;
361
+ cursor: pointer;
362
+ }
363
+
364
+ .collapse-showmore-toggle:hover {
365
+ text-decoration: underline;
366
+ }
367
+
368
+ /* Collapse Group */
369
+ .collapse-group {
370
+ display: flex;
371
+ flex-direction: column;
372
+ gap: 0.5rem;
373
+ }
374
+
375
+ /* Transition Speed Variants */
376
+ .collapse-fast {
377
+ transition-duration: 150ms;
378
+ }
379
+
380
+ .collapse-slow {
381
+ transition-duration: 500ms;
382
+ }
383
+
384
+ /* Easing Variants */
385
+ .collapse-ease-in {
386
+ transition-timing-function: ease-in;
387
+ }
388
+
389
+ .collapse-ease-out {
390
+ transition-timing-function: ease-out;
391
+ }
392
+
393
+ .collapse-ease-in-out {
394
+ transition-timing-function: ease-in-out;
395
+ }
396
+
397
+ .collapse-spring {
398
+ transition-timing-function: cubic-bezier(0.34, 1.56, 0.64, 1);
399
+ }
400
+
401
+ /* Initial States */
402
+ .collapse-hidden {
403
+ display: none;
404
+ }
405
+
406
+ /* Accessibility - Screen Reader Only Content */
407
+ .collapse-sr-only {
408
+ position: absolute;
409
+ width: 1px;
410
+ height: 1px;
411
+ padding: 0;
412
+ margin: -1px;
413
+ overflow: hidden;
414
+ clip: rect(0, 0, 0, 0);
415
+ white-space: nowrap;
416
+ border: 0;
417
+ }
418
+
419
+ /* With Max Height (fallback for older browsers) */
420
+ .collapse-maxheight {
421
+ max-height: 0;
422
+ overflow: hidden;
423
+ transition: max-height 300ms ease-in-out;
424
+ }
425
+
426
+ .collapse-maxheight.show {
427
+ max-height: var(--collapse-max-height, 100rem);
428
+ }
429
+
430
+ /* Animated Height (JS helper class) */
431
+ .collapse-animating {
432
+ overflow: hidden;
433
+ transition: height 300ms ease-in-out;
434
+ }
435
+
436
+ /* Reduce Motion */
437
+ @media (prefers-reduced-motion: reduce) {
438
+ .collapse,
439
+ .collapse-content,
440
+ .collapse-icon,
441
+ .collapse-fade,
442
+ .collapse-horizontal,
443
+ .collapse-horizontal-fixed,
444
+ .collapse-toggle-icon,
445
+ .collapse-maxheight,
446
+ .collapse-animating,
447
+ .collapse-slide .collapse-content > * {
448
+ transition: none;
449
+ }
450
+ .collapse-loading .collapse-trigger::after {
451
+ animation: none;
452
+ }
453
+ }
454
+ }