@duskmoon-dev/core 0.1.0 → 1.0.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 (51) 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 +308 -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 +474 -0
  11. package/dist/components/card.css +220 -0
  12. package/dist/components/chip.css +211 -0
  13. package/dist/components/collapse.css +254 -0
  14. package/dist/components/datepicker.css +347 -0
  15. package/dist/components/dialog.css +173 -0
  16. package/dist/components/divider.css +284 -0
  17. package/dist/components/drawer.css +371 -0
  18. package/dist/components/file-upload.css +321 -0
  19. package/dist/components/form.css +441 -0
  20. package/dist/components/index.css +9994 -0
  21. package/dist/components/input.css +240 -0
  22. package/dist/components/list.css +188 -0
  23. package/dist/components/markdown-body.css +405 -0
  24. package/dist/components/modal.css +291 -0
  25. package/dist/components/navigation.css +392 -0
  26. package/dist/components/popover.css +326 -0
  27. package/dist/components/progress.css +238 -0
  28. package/dist/components/rating.css +230 -0
  29. package/dist/components/skeleton.css +216 -0
  30. package/dist/components/slider.css +327 -0
  31. package/dist/components/snackbar.css +311 -0
  32. package/dist/components/stepper.css +313 -0
  33. package/dist/components/switch.css +277 -0
  34. package/dist/components/table.css +199 -0
  35. package/dist/components/timeline.css +353 -0
  36. package/dist/components/toast.css +251 -0
  37. package/dist/components/tooltip.css +284 -0
  38. package/dist/index.css +10699 -0
  39. package/dist/themes/moonlight.css +168 -0
  40. package/dist/themes/sunshine.css +166 -0
  41. package/dist/types/index.d.ts +14 -0
  42. package/dist/types/index.d.ts.map +1 -0
  43. package/dist/types/plugin.d.ts +69 -0
  44. package/dist/types/plugin.d.ts.map +1 -0
  45. package/dist/types/theme.d.ts +202 -0
  46. package/dist/types/theme.d.ts.map +1 -0
  47. package/package.json +137 -18
  48. package/dist/index.cjs +0 -243
  49. package/dist/index.cjs.map +0 -15
  50. package/dist/index.js +0 -211
  51. package/dist/index.js.map +0 -15
@@ -0,0 +1,327 @@
1
+ /**
2
+ * Slider Component Styles
3
+ * DuskMoonUI - Material Design 3 inspired slider system
4
+ */
5
+
6
+ @layer components {
7
+ /* Base Slider */
8
+ .slider {
9
+ position: relative;
10
+ display: flex;
11
+ align-items: center;
12
+ width: 100%;
13
+ height: 2.5rem;
14
+ touch-action: none;
15
+ user-select: none;
16
+ }
17
+
18
+ /* Slider Track */
19
+ .slider-track {
20
+ position: relative;
21
+ width: 100%;
22
+ height: 0.25rem;
23
+ background-color: var(--color-surface-container-highest);
24
+ border-radius: 9999px;
25
+ }
26
+
27
+ /* Slider Track Filled (Progress) */
28
+ .slider-track-filled {
29
+ position: absolute;
30
+ top: 0;
31
+ left: 0;
32
+ height: 100%;
33
+ background-color: var(--color-primary);
34
+ border-radius: 9999px;
35
+ }
36
+
37
+ /* Slider Thumb */
38
+ .slider-thumb {
39
+ position: absolute;
40
+ top: 50%;
41
+ width: 1.25rem;
42
+ height: 1.25rem;
43
+ background-color: var(--color-primary);
44
+ border: none;
45
+ border-radius: 50%;
46
+ box-shadow: 0 2px 4px rgb(0 0 0 / 0.2);
47
+ transform: translate(-50%, -50%);
48
+ cursor: grab;
49
+ transition: box-shadow 150ms ease-in-out, transform 150ms ease-in-out;
50
+ }
51
+
52
+ .slider-thumb:hover {
53
+ box-shadow: 0 0 0 8px var(--color-primary-container), 0 2px 4px rgb(0 0 0 / 0.2);
54
+ }
55
+
56
+ .slider-thumb:focus-visible {
57
+ outline: none;
58
+ box-shadow: 0 0 0 8px var(--color-primary-container), 0 2px 4px rgb(0 0 0 / 0.2);
59
+ }
60
+
61
+ .slider-thumb:active {
62
+ cursor: grabbing;
63
+ transform: translate(-50%, -50%) scale(1.1);
64
+ }
65
+
66
+ /* Slider Thumb Label (Value tooltip) */
67
+ .slider-thumb-label {
68
+ position: absolute;
69
+ bottom: 100%;
70
+ left: 50%;
71
+ transform: translateX(-50%);
72
+ padding: 0.25rem 0.5rem;
73
+ margin-bottom: 0.5rem;
74
+ font-size: 0.75rem;
75
+ font-weight: 500;
76
+ color: var(--color-on-primary);
77
+ background-color: var(--color-primary);
78
+ border-radius: 0.25rem;
79
+ white-space: nowrap;
80
+ opacity: 0;
81
+ visibility: hidden;
82
+ transition: opacity 150ms ease-out, visibility 150ms ease-out;
83
+ }
84
+
85
+ .slider-thumb-label::after {
86
+ content: '';
87
+ position: absolute;
88
+ top: 100%;
89
+ left: 50%;
90
+ transform: translateX(-50%);
91
+ border: 0.25rem solid transparent;
92
+ border-top-color: var(--color-primary);
93
+ }
94
+
95
+ .slider-thumb:hover .slider-thumb-label,
96
+ .slider-thumb:focus-visible .slider-thumb-label,
97
+ .slider-thumb:active .slider-thumb-label {
98
+ opacity: 1;
99
+ visibility: visible;
100
+ }
101
+
102
+ /* Always Show Labels Variant */
103
+ .slider-labels-always .slider-thumb-label {
104
+ opacity: 1;
105
+ visibility: visible;
106
+ }
107
+
108
+ /* Marks Container */
109
+ .slider-marks {
110
+ position: absolute;
111
+ top: 50%;
112
+ left: 0;
113
+ right: 0;
114
+ display: flex;
115
+ justify-content: space-between;
116
+ transform: translateY(-50%);
117
+ pointer-events: none;
118
+ }
119
+
120
+ /* Individual Mark */
121
+ .slider-mark {
122
+ position: relative;
123
+ width: 0.125rem;
124
+ height: 0.5rem;
125
+ background-color: var(--color-outline);
126
+ border-radius: 9999px;
127
+ }
128
+
129
+ .slider-mark-active {
130
+ background-color: var(--color-on-primary);
131
+ }
132
+
133
+ /* Mark Label */
134
+ .slider-mark-label {
135
+ position: absolute;
136
+ top: 1rem;
137
+ left: 50%;
138
+ transform: translateX(-50%);
139
+ font-size: 0.75rem;
140
+ color: var(--color-on-surface-variant);
141
+ white-space: nowrap;
142
+ }
143
+
144
+ /* Min/Max Labels Container */
145
+ .slider-labels {
146
+ display: flex;
147
+ justify-content: space-between;
148
+ margin-top: 0.25rem;
149
+ font-size: 0.75rem;
150
+ color: var(--color-on-surface-variant);
151
+ }
152
+
153
+ /* Size Variants */
154
+ .slider-sm {
155
+ height: 2rem;
156
+ }
157
+
158
+ .slider-sm .slider-track {
159
+ height: 0.125rem;
160
+ }
161
+
162
+ .slider-sm .slider-thumb {
163
+ width: 1rem;
164
+ height: 1rem;
165
+ }
166
+
167
+ .slider-lg {
168
+ height: 3rem;
169
+ }
170
+
171
+ .slider-lg .slider-track {
172
+ height: 0.375rem;
173
+ }
174
+
175
+ .slider-lg .slider-thumb {
176
+ width: 1.5rem;
177
+ height: 1.5rem;
178
+ }
179
+
180
+ /* Color Variants */
181
+ .slider-secondary .slider-track-filled,
182
+ .slider-secondary .slider-thumb {
183
+ background-color: var(--color-secondary);
184
+ }
185
+
186
+ .slider-secondary .slider-thumb:hover,
187
+ .slider-secondary .slider-thumb:focus-visible {
188
+ box-shadow: 0 0 0 8px var(--color-secondary-container), 0 2px 4px rgb(0 0 0 / 0.2);
189
+ }
190
+
191
+ .slider-secondary .slider-thumb-label {
192
+ background-color: var(--color-secondary);
193
+ color: var(--color-on-secondary);
194
+ }
195
+
196
+ .slider-secondary .slider-thumb-label::after {
197
+ border-top-color: var(--color-secondary);
198
+ }
199
+
200
+ .slider-tertiary .slider-track-filled,
201
+ .slider-tertiary .slider-thumb {
202
+ background-color: var(--color-tertiary);
203
+ }
204
+
205
+ .slider-tertiary .slider-thumb:hover,
206
+ .slider-tertiary .slider-thumb:focus-visible {
207
+ box-shadow: 0 0 0 8px var(--color-tertiary-container), 0 2px 4px rgb(0 0 0 / 0.2);
208
+ }
209
+
210
+ .slider-tertiary .slider-thumb-label {
211
+ background-color: var(--color-tertiary);
212
+ color: var(--color-on-tertiary);
213
+ }
214
+
215
+ .slider-tertiary .slider-thumb-label::after {
216
+ border-top-color: var(--color-tertiary);
217
+ }
218
+
219
+ /* Disabled State */
220
+ .slider-disabled {
221
+ opacity: 0.6;
222
+ pointer-events: none;
223
+ }
224
+
225
+ .slider-disabled .slider-thumb {
226
+ cursor: not-allowed;
227
+ }
228
+
229
+ /* Range Slider */
230
+ .slider-range .slider-track-filled {
231
+ left: var(--slider-start, 0%);
232
+ width: var(--slider-range, 100%);
233
+ }
234
+
235
+ /* Vertical Slider */
236
+ .slider-vertical {
237
+ flex-direction: column;
238
+ width: 2.5rem;
239
+ height: 12rem;
240
+ }
241
+
242
+ .slider-vertical .slider-track {
243
+ width: 0.25rem;
244
+ height: 100%;
245
+ }
246
+
247
+ .slider-vertical .slider-track-filled {
248
+ width: 100%;
249
+ height: auto;
250
+ bottom: 0;
251
+ top: auto;
252
+ }
253
+
254
+ .slider-vertical .slider-thumb {
255
+ left: 50%;
256
+ top: auto;
257
+ transform: translate(-50%, 50%);
258
+ }
259
+
260
+ .slider-vertical .slider-thumb-label {
261
+ bottom: auto;
262
+ left: 100%;
263
+ top: 50%;
264
+ transform: translateY(-50%);
265
+ margin-left: 0.5rem;
266
+ margin-bottom: 0;
267
+ }
268
+
269
+ .slider-vertical .slider-thumb-label::after {
270
+ top: 50%;
271
+ left: auto;
272
+ right: 100%;
273
+ transform: translateY(-50%);
274
+ border-top-color: transparent;
275
+ border-right-color: var(--color-primary);
276
+ }
277
+
278
+ .slider-vertical .slider-marks {
279
+ flex-direction: column;
280
+ top: 0;
281
+ bottom: 0;
282
+ left: 50%;
283
+ right: auto;
284
+ transform: translateX(-50%);
285
+ }
286
+
287
+ .slider-vertical .slider-mark-label {
288
+ top: 50%;
289
+ left: 1rem;
290
+ transform: translateY(-50%);
291
+ }
292
+
293
+ /* Input Integration */
294
+ .slider-with-input {
295
+ display: flex;
296
+ align-items: center;
297
+ gap: 1rem;
298
+ }
299
+
300
+ .slider-with-input .slider {
301
+ flex: 1;
302
+ }
303
+
304
+ .slider-input {
305
+ width: 4rem;
306
+ padding: 0.5rem;
307
+ font-size: 0.875rem;
308
+ text-align: center;
309
+ color: var(--color-on-surface);
310
+ background-color: var(--color-surface);
311
+ border: 1px solid var(--color-outline);
312
+ border-radius: 0.375rem;
313
+ }
314
+
315
+ .slider-input:focus {
316
+ outline: none;
317
+ border-color: var(--color-primary);
318
+ }
319
+
320
+ /* Reduce Motion */
321
+ @media (prefers-reduced-motion: reduce) {
322
+ .slider-thumb,
323
+ .slider-thumb-label {
324
+ transition: none;
325
+ }
326
+ }
327
+ }
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Snackbar Component Styles
3
+ * DuskMoonUI - Material Design 3 inspired snackbar system
4
+ */
5
+
6
+ @layer components {
7
+ /* Snackbar Container */
8
+ .snackbar-container {
9
+ position: fixed;
10
+ z-index: 1100;
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: 0.5rem;
14
+ padding: 1rem;
15
+ pointer-events: none;
16
+ }
17
+
18
+ /* Position Variants */
19
+ .snackbar-container-bottom {
20
+ bottom: 0;
21
+ left: 50%;
22
+ transform: translateX(-50%);
23
+ align-items: center;
24
+ }
25
+
26
+ .snackbar-container-bottom-left {
27
+ bottom: 0;
28
+ left: 0;
29
+ align-items: flex-start;
30
+ }
31
+
32
+ .snackbar-container-bottom-right {
33
+ bottom: 0;
34
+ right: 0;
35
+ align-items: flex-end;
36
+ }
37
+
38
+ .snackbar-container-top {
39
+ top: 0;
40
+ left: 50%;
41
+ transform: translateX(-50%);
42
+ align-items: center;
43
+ }
44
+
45
+ .snackbar-container-top-left {
46
+ top: 0;
47
+ left: 0;
48
+ align-items: flex-start;
49
+ }
50
+
51
+ .snackbar-container-top-right {
52
+ top: 0;
53
+ right: 0;
54
+ align-items: flex-end;
55
+ }
56
+
57
+ /* Base Snackbar */
58
+ .snackbar {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 0.75rem;
62
+ min-width: 20rem;
63
+ max-width: 40rem;
64
+ padding: 0.875rem 1rem;
65
+ background-color: var(--color-surface-container-highest);
66
+ color: var(--color-on-surface);
67
+ border-radius: 0.5rem;
68
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
69
+ pointer-events: auto;
70
+ opacity: 0;
71
+ transform: translateY(100%);
72
+ transition: opacity 200ms ease-out, transform 200ms ease-out;
73
+ }
74
+
75
+ .snackbar-container-top .snackbar,
76
+ .snackbar-container-top-left .snackbar,
77
+ .snackbar-container-top-right .snackbar {
78
+ transform: translateY(-100%);
79
+ }
80
+
81
+ /* Snackbar Open State */
82
+ .snackbar.snackbar-open,
83
+ .snackbar.snackbar-show,
84
+ .snackbar.show {
85
+ opacity: 1;
86
+ transform: translateY(0);
87
+ }
88
+
89
+ /* Standalone Position Variants (for snackbar without container) */
90
+ .snackbar.snackbar-bottom {
91
+ position: fixed;
92
+ bottom: 1rem;
93
+ left: 50%;
94
+ transform: translateX(-50%) translateY(100%);
95
+ z-index: 1100;
96
+ }
97
+
98
+ .snackbar.snackbar-bottom.snackbar-show {
99
+ transform: translateX(-50%) translateY(0);
100
+ }
101
+
102
+ .snackbar.snackbar-bottom-left {
103
+ position: fixed;
104
+ bottom: 1rem;
105
+ left: 1rem;
106
+ z-index: 1100;
107
+ }
108
+
109
+ .snackbar.snackbar-bottom-right {
110
+ position: fixed;
111
+ bottom: 1rem;
112
+ right: 1rem;
113
+ z-index: 1100;
114
+ }
115
+
116
+ .snackbar.snackbar-top {
117
+ position: fixed;
118
+ top: 1rem;
119
+ left: 50%;
120
+ transform: translateX(-50%) translateY(-100%);
121
+ z-index: 1100;
122
+ }
123
+
124
+ .snackbar.snackbar-top.snackbar-show {
125
+ transform: translateX(-50%) translateY(0);
126
+ }
127
+
128
+ .snackbar.snackbar-top-left {
129
+ position: fixed;
130
+ top: 1rem;
131
+ left: 1rem;
132
+ transform: translateY(-100%);
133
+ z-index: 1100;
134
+ }
135
+
136
+ .snackbar.snackbar-top-left.snackbar-show {
137
+ transform: translateY(0);
138
+ }
139
+
140
+ .snackbar.snackbar-top-right {
141
+ position: fixed;
142
+ top: 1rem;
143
+ right: 1rem;
144
+ transform: translateY(-100%);
145
+ z-index: 1100;
146
+ }
147
+
148
+ .snackbar.snackbar-top-right.snackbar-show {
149
+ transform: translateY(0);
150
+ }
151
+
152
+ .snackbar.snackbar-bottom-left.snackbar-show,
153
+ .snackbar.snackbar-bottom-right.snackbar-show {
154
+ transform: translateY(0);
155
+ }
156
+
157
+ /* Snackbar Message */
158
+ .snackbar-message {
159
+ flex: 1;
160
+ font-size: 0.875rem;
161
+ line-height: 1.25rem;
162
+ }
163
+
164
+ /* Snackbar Action */
165
+ .snackbar-action {
166
+ display: inline-flex;
167
+ align-items: center;
168
+ padding: 0.375rem 0.75rem;
169
+ font-size: 0.875rem;
170
+ font-weight: 500;
171
+ color: var(--color-primary);
172
+ background-color: transparent;
173
+ border: none;
174
+ border-radius: 0.25rem;
175
+ cursor: pointer;
176
+ transition: background-color 150ms ease-in-out;
177
+ white-space: nowrap;
178
+ flex-shrink: 0;
179
+ }
180
+
181
+ .snackbar-action:hover {
182
+ background-color: var(--color-primary-container);
183
+ }
184
+
185
+ .snackbar-action:focus-visible {
186
+ outline: 2px solid var(--color-primary);
187
+ outline-offset: 2px;
188
+ }
189
+
190
+ /* Snackbar Close */
191
+ .snackbar-close {
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ width: 1.5rem;
196
+ height: 1.5rem;
197
+ font-size: 1rem;
198
+ color: var(--color-on-surface-variant);
199
+ background-color: transparent;
200
+ border: none;
201
+ border-radius: 50%;
202
+ cursor: pointer;
203
+ transition: background-color 150ms ease-in-out;
204
+ flex-shrink: 0;
205
+ }
206
+
207
+ .snackbar-close:hover {
208
+ background-color: var(--color-surface-container);
209
+ }
210
+
211
+ /* Color Variants */
212
+ .snackbar-info {
213
+ background-color: var(--color-info-container);
214
+ color: var(--color-on-info-container);
215
+ }
216
+
217
+ .snackbar-success {
218
+ background-color: var(--color-success-container);
219
+ color: var(--color-on-success-container);
220
+ }
221
+
222
+ .snackbar-warning {
223
+ background-color: var(--color-warning-container);
224
+ color: var(--color-on-warning-container);
225
+ }
226
+
227
+ .snackbar-error {
228
+ background-color: var(--color-error-container);
229
+ color: var(--color-on-error-container);
230
+ }
231
+
232
+ /* Brand Color Variants */
233
+ .snackbar-primary {
234
+ background-color: var(--color-primary-container);
235
+ color: var(--color-on-primary-container);
236
+ }
237
+
238
+ .snackbar-secondary {
239
+ background-color: var(--color-secondary-container);
240
+ color: var(--color-on-secondary-container);
241
+ }
242
+
243
+ .snackbar-tertiary {
244
+ background-color: var(--color-tertiary-container);
245
+ color: var(--color-on-tertiary-container);
246
+ }
247
+
248
+ /* Dark Snackbar (default MD3 style) */
249
+ .snackbar-dark {
250
+ background-color: var(--color-on-surface);
251
+ color: var(--color-surface);
252
+ }
253
+
254
+ .snackbar-dark .snackbar-action {
255
+ color: var(--color-primary-container);
256
+ }
257
+
258
+ .snackbar-dark .snackbar-close {
259
+ color: var(--color-surface);
260
+ }
261
+
262
+ /* Icon */
263
+ .snackbar-icon {
264
+ display: flex;
265
+ align-items: center;
266
+ justify-content: center;
267
+ flex-shrink: 0;
268
+ font-size: 1.25rem;
269
+ }
270
+
271
+ /* Multiline */
272
+ .snackbar-multiline {
273
+ flex-wrap: wrap;
274
+ min-height: 4rem;
275
+ }
276
+
277
+ .snackbar-multiline .snackbar-message {
278
+ width: 100%;
279
+ margin-bottom: 0.5rem;
280
+ }
281
+
282
+ .snackbar-multiline .snackbar-action {
283
+ margin-left: auto;
284
+ }
285
+
286
+ /* Responsive */
287
+ @media (max-width: 640px) {
288
+ .snackbar {
289
+ min-width: calc(100vw - 2rem);
290
+ max-width: calc(100vw - 2rem);
291
+ }
292
+
293
+ .snackbar-container {
294
+ left: 0;
295
+ right: 0;
296
+ transform: none;
297
+ }
298
+
299
+ .snackbar-container-bottom,
300
+ .snackbar-container-top {
301
+ align-items: stretch;
302
+ }
303
+ }
304
+
305
+ /* Reduce Motion */
306
+ @media (prefers-reduced-motion: reduce) {
307
+ .snackbar {
308
+ transition: opacity 0ms, transform 0ms;
309
+ }
310
+ }
311
+ }