@duskmoon-dev/core 1.1.1 → 1.3.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 (33) hide show
  1. package/dist/components/checkbox.css +231 -0
  2. package/dist/components/collapse.css +208 -8
  3. package/dist/components/datepicker.css +404 -10
  4. package/dist/components/form-group.css +308 -0
  5. package/dist/components/index.css +4598 -816
  6. package/dist/components/multi-select.css +491 -0
  7. package/dist/components/navigation.css +346 -2
  8. package/dist/components/otp-input.css +195 -0
  9. package/dist/components/pin-input.css +184 -0
  10. package/dist/components/radio.css +183 -0
  11. package/dist/components/segment-control.css +186 -0
  12. package/dist/components/select.css +205 -0
  13. package/dist/components/switch.css +150 -193
  14. package/dist/components/textarea.css +202 -0
  15. package/dist/components/time-input.css +252 -0
  16. package/dist/components/tree-select.css +439 -0
  17. package/dist/esm/components/checkbox.js +238 -0
  18. package/dist/esm/components/collapse.js +208 -8
  19. package/dist/esm/components/datepicker.js +404 -10
  20. package/dist/esm/components/form-group.js +315 -0
  21. package/dist/esm/components/multi-select.js +498 -0
  22. package/dist/esm/components/navigation.js +346 -2
  23. package/dist/esm/components/otp-input.js +202 -0
  24. package/dist/esm/components/pin-input.js +191 -0
  25. package/dist/esm/components/radio.js +190 -0
  26. package/dist/esm/components/segment-control.js +193 -0
  27. package/dist/esm/components/select.js +212 -0
  28. package/dist/esm/components/switch.js +150 -193
  29. package/dist/esm/components/textarea.js +209 -0
  30. package/dist/esm/components/time-input.js +259 -0
  31. package/dist/esm/components/tree-select.js +446 -0
  32. package/dist/index.css +4402 -620
  33. package/package.json +56 -1
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Checkbox Component Styles
3
+ * DuskMoonUI - Material Design 3 inspired checkbox
4
+ *
5
+ * Usage: <input type="checkbox" class="checkbox" />
6
+ * With label: <label class="label cursor-pointer gap-2"><input type="checkbox" class="checkbox" /><span>Label</span></label>
7
+ */
8
+
9
+ @layer components {
10
+ /* Base Checkbox - applied directly to input[type="checkbox"] */
11
+ .checkbox {
12
+ --checkbox-size: 1.25rem;
13
+ --checkbox-color: var(--color-primary);
14
+ --checkbox-border-color: var(--color-on-surface-variant);
15
+
16
+ position: relative;
17
+ display: inline-grid;
18
+ place-content: center;
19
+ width: var(--checkbox-size);
20
+ height: var(--checkbox-size);
21
+ margin: 0;
22
+ cursor: pointer;
23
+ appearance: none;
24
+ background-color: transparent;
25
+ border: 2px solid var(--checkbox-border-color);
26
+ border-radius: 0.125rem;
27
+ transition: background-color 150ms ease-in-out, border-color 150ms ease-in-out;
28
+ }
29
+
30
+ /* Checkmark using ::before pseudo-element */
31
+ .checkbox::before {
32
+ content: "";
33
+ width: 0.65em;
34
+ height: 0.35em;
35
+ transform: scale(0) rotate(-45deg);
36
+ transform-origin: center;
37
+ border-bottom: 2px solid var(--color-on-primary);
38
+ border-left: 2px solid var(--color-on-primary);
39
+ transition: transform 150ms ease-in-out;
40
+ }
41
+
42
+ /* Checked State */
43
+ .checkbox:checked {
44
+ background-color: var(--checkbox-color);
45
+ border-color: var(--checkbox-color);
46
+ }
47
+
48
+ .checkbox:checked::before {
49
+ transform: scale(1) rotate(-45deg);
50
+ }
51
+
52
+ /* Indeterminate State */
53
+ .checkbox:indeterminate {
54
+ background-color: var(--checkbox-color);
55
+ border-color: var(--checkbox-color);
56
+ }
57
+
58
+ .checkbox:indeterminate::before {
59
+ width: 0.5em;
60
+ height: 0;
61
+ border-bottom: 2px solid var(--color-on-primary);
62
+ border-left: 0;
63
+ transform: scale(1) rotate(0deg);
64
+ }
65
+
66
+ /* Hover State */
67
+ .checkbox:hover:not(:disabled):not(:checked) {
68
+ border-color: var(--color-on-surface);
69
+ }
70
+
71
+ .checkbox:checked:hover:not(:disabled) {
72
+ background-color: color-mix(in oklch, var(--checkbox-color), black 10%);
73
+ border-color: color-mix(in oklch, var(--checkbox-color), black 10%);
74
+ }
75
+
76
+ /* Focus State */
77
+ .checkbox:focus-visible {
78
+ outline: 2px solid var(--checkbox-color);
79
+ outline-offset: 2px;
80
+ }
81
+
82
+ /* Disabled State */
83
+ .checkbox:disabled {
84
+ cursor: not-allowed;
85
+ opacity: 0.38;
86
+ }
87
+
88
+ /* ========================================
89
+ * Size Variants
90
+ * ======================================== */
91
+
92
+ .checkbox-xs {
93
+ --checkbox-size: 0.875rem;
94
+ }
95
+
96
+ .checkbox-sm {
97
+ --checkbox-size: 1rem;
98
+ }
99
+
100
+ .checkbox-md {
101
+ --checkbox-size: 1.25rem;
102
+ }
103
+
104
+ .checkbox-lg {
105
+ --checkbox-size: 1.5rem;
106
+ }
107
+
108
+ .checkbox-xl {
109
+ --checkbox-size: 1.75rem;
110
+ }
111
+
112
+ /* ========================================
113
+ * Color Variants
114
+ * ======================================== */
115
+
116
+ .checkbox-primary {
117
+ --checkbox-color: var(--color-primary);
118
+ }
119
+
120
+ .checkbox-primary:checked::before,
121
+ .checkbox-primary:indeterminate::before {
122
+ border-color: var(--color-primary-content);
123
+ }
124
+
125
+ .checkbox-secondary {
126
+ --checkbox-color: var(--color-secondary);
127
+ }
128
+
129
+ .checkbox-secondary:checked::before,
130
+ .checkbox-secondary:indeterminate::before {
131
+ border-color: var(--color-secondary-content);
132
+ }
133
+
134
+ .checkbox-tertiary {
135
+ --checkbox-color: var(--color-tertiary);
136
+ }
137
+
138
+ .checkbox-tertiary:checked::before,
139
+ .checkbox-tertiary:indeterminate::before {
140
+ border-color: var(--color-tertiary-content);
141
+ }
142
+
143
+ .checkbox-success {
144
+ --checkbox-color: var(--color-success);
145
+ }
146
+
147
+ .checkbox-success:checked::before,
148
+ .checkbox-success:indeterminate::before {
149
+ border-color: var(--color-success-content);
150
+ }
151
+
152
+ .checkbox-warning {
153
+ --checkbox-color: var(--color-warning);
154
+ }
155
+
156
+ .checkbox-warning:checked::before,
157
+ .checkbox-warning:indeterminate::before {
158
+ border-color: var(--color-warning-content);
159
+ }
160
+
161
+ .checkbox-error {
162
+ --checkbox-color: var(--color-error);
163
+ }
164
+
165
+ .checkbox-error:checked::before,
166
+ .checkbox-error:indeterminate::before {
167
+ border-color: var(--color-error-content);
168
+ }
169
+
170
+ .checkbox-info {
171
+ --checkbox-color: var(--color-info);
172
+ }
173
+
174
+ .checkbox-info:checked::before,
175
+ .checkbox-info:indeterminate::before {
176
+ border-color: var(--color-info-content);
177
+ }
178
+
179
+ /* ========================================
180
+ * Checkbox with Label (wrapper pattern)
181
+ * ======================================== */
182
+
183
+ .checkbox-label {
184
+ display: inline-flex;
185
+ align-items: center;
186
+ gap: 0.5rem;
187
+ cursor: pointer;
188
+ user-select: none;
189
+ font-size: 0.875rem;
190
+ color: var(--color-on-surface);
191
+ }
192
+
193
+ .checkbox-label:has(.checkbox:disabled) {
194
+ cursor: not-allowed;
195
+ opacity: 0.38;
196
+ }
197
+
198
+ /* ========================================
199
+ * Checkbox Group
200
+ * ======================================== */
201
+
202
+ .checkbox-group {
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: 0.75rem;
206
+ }
207
+
208
+ .checkbox-group-horizontal {
209
+ flex-direction: row;
210
+ flex-wrap: wrap;
211
+ gap: 1.5rem;
212
+ }
213
+
214
+ .checkbox-group-label {
215
+ font-size: 0.875rem;
216
+ font-weight: 500;
217
+ color: var(--color-on-surface);
218
+ margin-bottom: 0.5rem;
219
+ }
220
+
221
+ /* ========================================
222
+ * Reduce Motion
223
+ * ======================================== */
224
+
225
+ @media (prefers-reduced-motion: reduce) {
226
+ .checkbox,
227
+ .checkbox::before {
228
+ transition: none;
229
+ }
230
+ }
231
+ }
@@ -6,18 +6,93 @@
6
6
  @layer components {
7
7
  /* Base Collapse */
8
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 {
9
56
  display: grid;
10
57
  grid-template-rows: 0fr;
11
58
  transition: grid-template-rows 300ms ease-in-out;
59
+ overflow: hidden;
12
60
  }
13
61
 
14
- .collapse.show {
62
+ .collapse-content > * {
63
+ overflow: hidden;
64
+ padding: 0 1rem;
65
+ }
66
+
67
+ /* Open State */
68
+ .collapse-open .collapse-content {
15
69
  grid-template-rows: 1fr;
16
70
  }
17
71
 
18
- /* Collapse Content */
19
- .collapse-content {
20
- overflow: hidden;
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);
21
96
  }
22
97
 
23
98
  /* Collapse Inner (for padding) */
@@ -81,9 +156,11 @@
81
156
  border: 1px solid var(--color-outline-variant);
82
157
  border-radius: 0.75rem;
83
158
  overflow: hidden;
159
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
84
160
  }
85
161
 
86
- .collapse-card .collapse-toggle {
162
+ .collapse-card .collapse-toggle,
163
+ .collapse-card .collapse-trigger {
87
164
  width: 100%;
88
165
  justify-content: space-between;
89
166
  padding: 1rem;
@@ -91,15 +168,132 @@
91
168
  color: var(--color-on-surface);
92
169
  }
93
170
 
94
- .collapse-card .collapse-toggle:hover {
171
+ .collapse-card .collapse-toggle:hover,
172
+ .collapse-card .collapse-trigger:hover {
95
173
  background-color: var(--color-surface-container);
96
174
  }
97
175
 
98
- .collapse-card .collapse-inner {
176
+ .collapse-card .collapse-inner,
177
+ .collapse-card .collapse-content > * {
99
178
  padding: 0 1rem 1rem;
100
179
  color: var(--color-on-surface-variant);
101
180
  }
102
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
+
103
297
  /* Horizontal Collapse */
104
298
  .collapse-horizontal {
105
299
  display: grid;
@@ -242,13 +436,19 @@
242
436
  /* Reduce Motion */
243
437
  @media (prefers-reduced-motion: reduce) {
244
438
  .collapse,
439
+ .collapse-content,
440
+ .collapse-icon,
245
441
  .collapse-fade,
246
442
  .collapse-horizontal,
247
443
  .collapse-horizontal-fixed,
248
444
  .collapse-toggle-icon,
249
445
  .collapse-maxheight,
250
- .collapse-animating {
446
+ .collapse-animating,
447
+ .collapse-slide .collapse-content > * {
251
448
  transition: none;
252
449
  }
450
+ .collapse-loading .collapse-trigger::after {
451
+ animation: none;
452
+ }
253
453
  }
254
454
  }