@dryui/ui 4.0.0 → 4.0.1

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 (39) hide show
  1. package/dist/badge/badge.svelte +2 -6
  2. package/dist/chromatic-aberration/chromatic-aberration.svelte +25 -13
  3. package/dist/date-picker/datepicker-button-trigger.svelte +146 -44
  4. package/dist/displacement/displacement.svelte +1 -0
  5. package/dist/file-upload/file-upload-dropzone.svelte +1 -1
  6. package/dist/gradient-mesh/gradient-mesh.svelte +83 -90
  7. package/dist/link-preview/link-preview-trigger.svelte +1 -1
  8. package/dist/option-picker/option-picker-preview.svelte +11 -2
  9. package/dist/rich-text-editor/rich-text-editor-content.svelte +1 -1
  10. package/dist/select/index.d.ts +7 -1
  11. package/dist/tag/tag-button.svelte +2 -6
  12. package/dist/tags-input/tags-input-tag.svelte +1 -1
  13. package/dist/themes/aurora.css +54 -6
  14. package/dist/themes/dark.css +66 -6
  15. package/dist/themes/default.css +26 -1
  16. package/dist/themes/midnight.css +31 -1
  17. package/dist/themes/terminal.css +31 -1
  18. package/dist/time-input/index.d.ts +2 -2
  19. package/dist/time-input/time-input.meta.js +1 -1
  20. package/package.json +6 -6
  21. package/src/badge/badge.svelte +2 -6
  22. package/src/chromatic-aberration/chromatic-aberration.svelte +25 -13
  23. package/src/date-picker/datepicker-button-trigger.svelte +146 -44
  24. package/src/displacement/displacement.svelte +1 -0
  25. package/src/file-upload/file-upload-dropzone.svelte +1 -1
  26. package/src/gradient-mesh/gradient-mesh.svelte +83 -90
  27. package/src/link-preview/link-preview-trigger.svelte +1 -1
  28. package/src/option-picker/option-picker-preview.svelte +11 -2
  29. package/src/rich-text-editor/rich-text-editor-content.svelte +1 -1
  30. package/src/select/index.ts +7 -1
  31. package/src/tag/tag-button.svelte +2 -6
  32. package/src/tags-input/tags-input-tag.svelte +1 -1
  33. package/src/themes/aurora.css +54 -6
  34. package/src/themes/dark.css +66 -6
  35. package/src/themes/default.css +26 -1
  36. package/src/themes/midnight.css +31 -1
  37. package/src/themes/terminal.css +31 -1
  38. package/src/time-input/index.ts +6 -2
  39. package/src/time-input/time-input.meta.ts +1 -1
@@ -10,6 +10,8 @@
10
10
 
11
11
  [data-theme='aurora'],
12
12
  .theme-aurora {
13
+ color-scheme: light;
14
+
13
15
  /* ─── Public aliases (aurora) ─────────────────────────────────── */
14
16
  --dry-color-primary: hsl(15, 85%, 55%);
15
17
  --dry-color-primary-hover: hsl(15, 85%, 47%);
@@ -24,11 +26,12 @@
24
26
 
25
27
  /* ─── Brand — warm coral instead of cold blue ─────────────────── */
26
28
  --dry-color-text-brand: hsl(15, 80%, 42%);
29
+ --dry-color-fill-brand: var(--dry-color-primary);
27
30
  --dry-color-fill-brand-active: hsl(15, 85%, 41%);
28
31
  --dry-color-fill-brand-weak: hsla(15, 85%, 55%, 0.07);
29
32
  --dry-color-stroke-brand: hsla(15, 85%, 55%, 0.5);
30
33
  --dry-color-stroke-brand-strong: hsla(15, 85%, 55%, 0.8);
31
- --dry-color-on-brand: #ffffff;
34
+ --dry-color-on-brand: hsl(15, 30%, 10%);
32
35
  --dry-color-focus-ring: hsla(15, 85%, 55%, 0.4);
33
36
 
34
37
  /* ─── Accent — golden amber ───────────────────────────────────── */
@@ -36,17 +39,20 @@
36
39
  --dry-color-fill-accent-weak: hsla(38, 92%, 55%, 0.08);
37
40
  --dry-color-stroke-accent: hsla(38, 92%, 55%, 0.5);
38
41
  --dry-color-stroke-accent-strong: hsla(38, 92%, 55%, 0.8);
42
+ --dry-color-on-accent: hsl(38, 30%, 10%);
39
43
 
40
44
  /* ─── Status: Error (warm-shifted hue 8) ──────────────────────── */
41
45
  --dry-color-text-error: hsl(8, 70%, 38%);
42
- --dry-color-fill-error-hover: hsl(8, 75%, 44%);
46
+ --dry-color-fill-error: var(--dry-color-danger);
47
+ --dry-color-fill-error-hover: hsl(8, 75%, 55%);
43
48
  --dry-color-fill-error-weak: hsla(8, 75%, 52%, 0.1);
44
49
  --dry-color-stroke-error: hsl(8, 50%, 70%);
45
50
  --dry-color-stroke-error-strong: hsla(8, 75%, 52%, 0.8);
46
- --dry-color-on-error: #ffffff;
51
+ --dry-color-on-error: hsl(8, 30%, 5%);
47
52
 
48
53
  /* ─── Status: Warning ─────────────────────────────────────────── */
49
54
  --dry-color-text-warning: hsl(40, 80%, 32%);
55
+ --dry-color-fill-warning: var(--dry-color-warning);
50
56
  --dry-color-fill-warning-weak: hsla(40, 85%, 52%, 0.1);
51
57
  --dry-color-stroke-warning: hsl(40, 60%, 65%);
52
58
  --dry-color-stroke-warning-strong: hsla(40, 85%, 52%, 0.8);
@@ -54,10 +60,11 @@
54
60
 
55
61
  /* ─── Status: Success ─────────────────────────────────────────── */
56
62
  --dry-color-text-success: hsl(140, 60%, 30%);
63
+ --dry-color-fill-success: var(--dry-color-success);
57
64
  --dry-color-fill-success-weak: hsla(140, 60%, 45%, 0.1);
58
65
  --dry-color-stroke-success: hsl(140, 50%, 65%);
59
66
  --dry-color-stroke-success-strong: hsla(140, 60%, 45%, 0.8);
60
- --dry-color-on-success: #ffffff;
67
+ --dry-color-on-success: hsl(140, 30%, 8%);
61
68
 
62
69
  /* ─── Status: Info ────────────────────────────────────────────── */
63
70
  --dry-color-text-info: hsl(205, 70%, 35%);
@@ -65,13 +72,22 @@
65
72
  --dry-color-fill-info-weak: hsla(205, 70%, 50%, 0.1);
66
73
  --dry-color-stroke-info: hsl(205, 50%, 70%);
67
74
  --dry-color-stroke-info-strong: hsla(205, 70%, 50%, 0.8);
75
+ --dry-color-on-info: hsl(205, 30%, 10%);
68
76
 
69
77
  /* ─── Purple semantic palette (badge / tag purple variants) ───── */
70
78
  --dry-color-text-purple: hsl(290, 55%, 38%);
71
79
  --dry-color-fill-purple: hsl(290, 65%, 55%);
72
80
  --dry-color-fill-purple-weak: hsla(290, 65%, 55%, 0.1);
73
81
  --dry-color-stroke-purple: hsla(290, 65%, 55%, 0.5);
74
- --dry-color-on-purple: #ffffff;
82
+ --dry-color-on-purple: hsl(290, 30%, 5%);
83
+
84
+ /* ─── Orange semantic palette (badge / tag orange variants) ───── */
85
+ --dry-color-fill-orange: color-mix(
86
+ in srgb,
87
+ var(--dry-color-fill-warning) 70%,
88
+ var(--dry-color-fill-error)
89
+ );
90
+ --dry-color-on-orange: hsl(24, 30%, 10%);
75
91
 
76
92
  /* ─── Overlay backdrops — warm-tinted ─────────────────────────── */
77
93
  --dry-color-overlay-backdrop: hsla(20, 30%, 15%, 0.4);
@@ -119,6 +135,8 @@
119
135
  /* ─── Aurora Dark variant ────────────────────────────────────────── */
120
136
  [data-theme='aurora-dark'],
121
137
  .theme-aurora-dark {
138
+ color-scheme: dark;
139
+
122
140
  /* ─── Public aliases (aurora-dark) ────────────────────────────── */
123
141
  --dry-color-primary: hsl(15, 90%, 70%);
124
142
  --dry-color-primary-hover: hsl(15, 90%, 62%);
@@ -132,6 +150,7 @@
132
150
  --dry-color-border-hover: hsla(30, 15%, 80%, 0.5);
133
151
 
134
152
  /* ─── Brand — coral, lighter for dark bg ──────────────────────── */
153
+ --dry-color-fill-brand: var(--dry-color-primary);
135
154
  --dry-color-fill-brand-active: hsl(15, 90%, 56%);
136
155
  --dry-color-fill-brand-weak: hsla(15, 90%, 70%, 0.08);
137
156
  --dry-color-stroke-brand: hsla(15, 90%, 70%, 0.5);
@@ -144,10 +163,12 @@
144
163
  --dry-color-fill-accent-weak: hsla(38, 88%, 68%, 0.1);
145
164
  --dry-color-stroke-accent: hsla(38, 88%, 68%, 0.5);
146
165
  --dry-color-stroke-accent-strong: hsla(38, 88%, 68%, 0.8);
166
+ --dry-color-on-accent: hsl(38, 30%, 8%);
147
167
 
148
168
  /* ─── Status: Error (warm-shifted hue 8) ──────────────────────── */
149
169
  --dry-color-text-error: hsl(8, 75%, 72%);
150
- --dry-color-fill-error-hover: hsl(8, 75%, 52%);
170
+ --dry-color-fill-error: var(--dry-color-danger);
171
+ --dry-color-fill-error-hover: hsl(8, 75%, 62%);
151
172
  --dry-color-fill-error-weak: hsla(8, 75%, 60%, 0.15);
152
173
  --dry-color-stroke-error: hsl(8, 55%, 55%);
153
174
  --dry-color-stroke-error-strong: hsla(8, 75%, 60%, 0.8);
@@ -155,6 +176,7 @@
155
176
 
156
177
  /* ─── Status: Warning ─────────────────────────────────────────── */
157
178
  --dry-color-text-warning: hsl(40, 85%, 68%);
179
+ --dry-color-fill-warning: var(--dry-color-warning);
158
180
  --dry-color-fill-warning-weak: hsla(40, 80%, 56%, 0.15);
159
181
  --dry-color-stroke-warning: hsl(40, 60%, 55%);
160
182
  --dry-color-stroke-warning-strong: hsla(40, 80%, 56%, 0.8);
@@ -162,6 +184,7 @@
162
184
 
163
185
  /* ─── Status: Success ─────────────────────────────────────────── */
164
186
  --dry-color-text-success: hsl(140, 55%, 65%);
187
+ --dry-color-fill-success: var(--dry-color-success);
165
188
  --dry-color-fill-success-weak: hsla(140, 55%, 50%, 0.15);
166
189
  --dry-color-stroke-success: hsl(140, 45%, 55%);
167
190
  --dry-color-stroke-success-strong: hsla(140, 55%, 50%, 0.8);
@@ -173,6 +196,7 @@
173
196
  --dry-color-fill-info-weak: hsla(205, 65%, 56%, 0.15);
174
197
  --dry-color-stroke-info: hsl(205, 45%, 55%);
175
198
  --dry-color-stroke-info-strong: hsla(205, 65%, 56%, 0.8);
199
+ --dry-color-on-info: hsl(205, 30%, 8%);
176
200
 
177
201
  /* ─── Purple semantic palette (badge / tag purple variants) ───── */
178
202
  --dry-color-text-purple: hsl(290, 75%, 78%);
@@ -181,6 +205,14 @@
181
205
  --dry-color-stroke-purple: hsla(290, 70%, 70%, 0.5);
182
206
  --dry-color-on-purple: hsl(290, 30%, 8%);
183
207
 
208
+ /* ─── Orange semantic palette (badge / tag orange variants) ───── */
209
+ --dry-color-fill-orange: color-mix(
210
+ in srgb,
211
+ var(--dry-color-fill-warning) 70%,
212
+ var(--dry-color-fill-error)
213
+ );
214
+ --dry-color-on-orange: hsl(24, 30%, 8%);
215
+
184
216
  /* ─── Backgrounds — warm dark ─────────────────────────────────── */
185
217
  --dry-color-bg-base: hsl(20, 18%, 8%);
186
218
  --dry-color-bg-raised: hsl(20, 14%, 12%);
@@ -241,3 +273,19 @@
241
273
  --dry-radius-xl: 14px;
242
274
  --dry-radius-2xl: 20px;
243
275
  }
276
+
277
+ @supports (color: contrast-color(white)) {
278
+ [data-theme='aurora'],
279
+ .theme-aurora,
280
+ [data-theme='aurora-dark'],
281
+ .theme-aurora-dark {
282
+ --dry-color-on-brand: contrast-color(var(--dry-color-fill-brand));
283
+ --dry-color-on-error: contrast-color(var(--dry-color-fill-error));
284
+ --dry-color-on-warning: contrast-color(var(--dry-color-fill-warning));
285
+ --dry-color-on-success: contrast-color(var(--dry-color-fill-success));
286
+ --dry-color-on-info: contrast-color(var(--dry-color-fill-info));
287
+ --dry-color-on-accent: contrast-color(var(--dry-color-fill-accent));
288
+ --dry-color-on-purple: contrast-color(var(--dry-color-fill-purple));
289
+ --dry-color-on-orange: contrast-color(var(--dry-color-fill-orange));
290
+ }
291
+ }
@@ -1,4 +1,6 @@
1
1
  [data-theme='dark'] {
2
+ color-scheme: dark;
3
+
2
4
  /* ─── Public aliases (dark) ────────────────────────────────────── */
3
5
  --dry-color-primary: hsl(230, 100%, 82%);
4
6
  --dry-color-primary-hover: hsl(230, 100%, 75%);
@@ -18,6 +20,7 @@
18
20
  --dry-color-fill-active: hsla(0, 0%, 100%, 0.14);
19
21
 
20
22
  /* ─── Brand dark overrides ────────────────────────────────────── */
23
+ --dry-color-fill-brand: var(--dry-color-primary);
21
24
  --dry-color-fill-brand-active: hsl(230, 100%, 70%);
22
25
  --dry-color-fill-brand-weak: hsla(230, 100%, 82%, 0.06);
23
26
  --dry-color-stroke-brand: hsla(230, 100%, 82%, 0.5);
@@ -66,14 +69,16 @@
66
69
 
67
70
  /* ─── Status: Error ───────────────────────────────────────────── */
68
71
  --dry-color-text-error: hsl(0, 60%, 70%);
69
- --dry-color-fill-error-hover: hsl(0, 65%, 48%);
72
+ --dry-color-fill-error: var(--dry-color-danger);
73
+ --dry-color-fill-error-hover: hsl(0, 65%, 58%);
70
74
  --dry-color-fill-error-weak: hsla(0, 60%, 60%, 0.15);
71
75
  --dry-color-stroke-error: hsl(0, 45%, 55%);
72
76
  --dry-color-stroke-error-strong: hsla(0, 65%, 55%, 0.8);
73
- --dry-color-on-error: #ffffff;
77
+ --dry-color-on-error: hsl(0, 30%, 4%);
74
78
 
75
79
  /* ─── Status: Warning ─────────────────────────────────────────── */
76
80
  --dry-color-text-warning: hsl(40, 80%, 65%);
81
+ --dry-color-fill-warning: var(--dry-color-warning);
77
82
  --dry-color-fill-warning-weak: hsla(40, 75%, 60%, 0.15);
78
83
  --dry-color-stroke-warning: hsl(40, 55%, 55%);
79
84
  --dry-color-stroke-warning-strong: hsla(40, 75%, 52%, 0.8);
@@ -81,10 +86,11 @@
81
86
 
82
87
  /* ─── Status: Success ─────────────────────────────────────────── */
83
88
  --dry-color-text-success: hsl(145, 55%, 65%);
89
+ --dry-color-fill-success: var(--dry-color-success);
84
90
  --dry-color-fill-success-weak: hsla(145, 55%, 60%, 0.15);
85
91
  --dry-color-stroke-success: hsl(145, 45%, 55%);
86
92
  --dry-color-stroke-success-strong: hsla(145, 55%, 48%, 0.8);
87
- --dry-color-on-success: #ffffff;
93
+ --dry-color-on-success: hsl(145, 30%, 8%);
88
94
 
89
95
  /* ─── Status: Info ────────────────────────────────────────────── */
90
96
  --dry-color-text-info: hsl(210, 65%, 70%);
@@ -92,12 +98,14 @@
92
98
  --dry-color-fill-info-weak: hsla(210, 60%, 65%, 0.15);
93
99
  --dry-color-stroke-info: hsl(210, 45%, 55%);
94
100
  --dry-color-stroke-info-strong: hsla(210, 65%, 55%, 0.8);
101
+ --dry-color-on-info: hsl(210, 30%, 8%);
95
102
 
96
103
  /* ─── Accent tone (warm counterpoint to brand) ───────────────── */
97
104
  --dry-color-fill-accent: hsl(25, 85%, 68%);
98
105
  --dry-color-fill-accent-weak: hsla(25, 85%, 68%, 0.1);
99
106
  --dry-color-stroke-accent: hsla(25, 85%, 68%, 0.5);
100
107
  --dry-color-stroke-accent-strong: hsla(25, 85%, 68%, 0.8);
108
+ --dry-color-on-accent: hsl(25, 30%, 8%);
101
109
 
102
110
  /* ─── Purple semantic palette (badge / tag purple variants) ───── */
103
111
  --dry-color-text-purple: hsl(280, 75%, 78%);
@@ -106,6 +114,14 @@
106
114
  --dry-color-stroke-purple: hsla(280, 75%, 70%, 0.5);
107
115
  --dry-color-on-purple: hsl(233, 18%, 9%);
108
116
 
117
+ /* ─── Orange semantic palette (badge / tag orange variants) ───── */
118
+ --dry-color-fill-orange: color-mix(
119
+ in srgb,
120
+ var(--dry-color-fill-warning) 70%,
121
+ var(--dry-color-fill-error)
122
+ );
123
+ --dry-color-on-orange: hsl(25, 30%, 8%);
124
+
109
125
  /* ─── Extended surface depth ──────────────────────────────────── */
110
126
  --dry-color-bg-floating: hsl(234, 8%, 26%);
111
127
 
@@ -164,6 +180,8 @@
164
180
  .theme-auto:not([data-theme='light']) {
165
181
  @media (prefers-color-scheme: dark) {
166
182
  & {
183
+ color-scheme: dark;
184
+
167
185
  /* ─── Public aliases (auto dark) ────────────────────────────── */
168
186
  --dry-color-primary: hsl(230, 100%, 82%);
169
187
  --dry-color-primary-hover: hsl(230, 100%, 75%);
@@ -183,6 +201,7 @@
183
201
  --dry-color-fill-active: hsla(0, 0%, 100%, 0.14);
184
202
 
185
203
  /* ─── Brand dark overrides ────────────────────────────────────── */
204
+ --dry-color-fill-brand: var(--dry-color-primary);
186
205
  --dry-color-fill-brand-active: hsl(230, 100%, 70%);
187
206
  --dry-color-fill-brand-weak: hsla(230, 100%, 82%, 0.06);
188
207
  --dry-color-stroke-brand: hsla(230, 100%, 82%, 0.5);
@@ -227,14 +246,16 @@
227
246
 
228
247
  /* ─── Status: Error ───────────────────────────────────────────── */
229
248
  --dry-color-text-error: hsl(0, 60%, 70%);
230
- --dry-color-fill-error-hover: hsl(0, 65%, 48%);
249
+ --dry-color-fill-error: var(--dry-color-danger);
250
+ --dry-color-fill-error-hover: hsl(0, 65%, 58%);
231
251
  --dry-color-fill-error-weak: hsla(0, 60%, 60%, 0.15);
232
252
  --dry-color-stroke-error: hsl(0, 45%, 55%);
233
253
  --dry-color-stroke-error-strong: hsla(0, 65%, 55%, 0.8);
234
- --dry-color-on-error: #ffffff;
254
+ --dry-color-on-error: hsl(0, 30%, 4%);
235
255
 
236
256
  /* ─── Status: Warning ─────────────────────────────────────────── */
237
257
  --dry-color-text-warning: hsl(40, 80%, 65%);
258
+ --dry-color-fill-warning: var(--dry-color-warning);
238
259
  --dry-color-fill-warning-weak: hsla(40, 75%, 60%, 0.15);
239
260
  --dry-color-stroke-warning: hsl(40, 55%, 55%);
240
261
  --dry-color-stroke-warning-strong: hsla(40, 75%, 52%, 0.8);
@@ -242,10 +263,11 @@
242
263
 
243
264
  /* ─── Status: Success ─────────────────────────────────────────── */
244
265
  --dry-color-text-success: hsl(145, 55%, 65%);
266
+ --dry-color-fill-success: var(--dry-color-success);
245
267
  --dry-color-fill-success-weak: hsla(145, 55%, 60%, 0.15);
246
268
  --dry-color-stroke-success: hsl(145, 45%, 55%);
247
269
  --dry-color-stroke-success-strong: hsla(145, 55%, 48%, 0.8);
248
- --dry-color-on-success: #ffffff;
270
+ --dry-color-on-success: hsl(145, 30%, 8%);
249
271
 
250
272
  /* ─── Status: Info ────────────────────────────────────────────── */
251
273
  --dry-color-text-info: hsl(210, 65%, 70%);
@@ -253,12 +275,14 @@
253
275
  --dry-color-fill-info-weak: hsla(210, 60%, 65%, 0.15);
254
276
  --dry-color-stroke-info: hsl(210, 45%, 55%);
255
277
  --dry-color-stroke-info-strong: hsla(210, 65%, 55%, 0.8);
278
+ --dry-color-on-info: hsl(210, 30%, 8%);
256
279
 
257
280
  /* ─── Accent tone (warm counterpoint to brand) ───────────────── */
258
281
  --dry-color-fill-accent: hsl(25, 85%, 68%);
259
282
  --dry-color-fill-accent-weak: hsla(25, 85%, 68%, 0.1);
260
283
  --dry-color-stroke-accent: hsla(25, 85%, 68%, 0.5);
261
284
  --dry-color-stroke-accent-strong: hsla(25, 85%, 68%, 0.8);
285
+ --dry-color-on-accent: hsl(25, 30%, 8%);
262
286
 
263
287
  /* ─── Purple semantic palette (badge / tag purple variants) ───── */
264
288
  --dry-color-text-purple: hsl(280, 75%, 78%);
@@ -267,6 +291,14 @@
267
291
  --dry-color-stroke-purple: hsla(280, 75%, 70%, 0.5);
268
292
  --dry-color-on-purple: hsl(233, 18%, 9%);
269
293
 
294
+ /* ─── Orange semantic palette (badge / tag orange variants) ───── */
295
+ --dry-color-fill-orange: color-mix(
296
+ in srgb,
297
+ var(--dry-color-fill-warning) 70%,
298
+ var(--dry-color-fill-error)
299
+ );
300
+ --dry-color-on-orange: hsl(25, 30%, 8%);
301
+
270
302
  /* ─── Extended surface depth ──────────────────────────────────── */
271
303
  --dry-color-bg-floating: hsl(234, 8%, 26%);
272
304
 
@@ -315,3 +347,31 @@
315
347
  }
316
348
  }
317
349
  }
350
+
351
+ @supports (color: contrast-color(white)) {
352
+ [data-theme='dark'] {
353
+ --dry-color-on-brand: contrast-color(var(--dry-color-fill-brand));
354
+ --dry-color-on-error: contrast-color(var(--dry-color-fill-error));
355
+ --dry-color-on-warning: contrast-color(var(--dry-color-fill-warning));
356
+ --dry-color-on-success: contrast-color(var(--dry-color-fill-success));
357
+ --dry-color-on-info: contrast-color(var(--dry-color-fill-info));
358
+ --dry-color-on-accent: contrast-color(var(--dry-color-fill-accent));
359
+ --dry-color-on-purple: contrast-color(var(--dry-color-fill-purple));
360
+ --dry-color-on-orange: contrast-color(var(--dry-color-fill-orange));
361
+ }
362
+
363
+ .theme-auto:not([data-theme='light']) {
364
+ @media (prefers-color-scheme: dark) {
365
+ & {
366
+ --dry-color-on-brand: contrast-color(var(--dry-color-fill-brand));
367
+ --dry-color-on-error: contrast-color(var(--dry-color-fill-error));
368
+ --dry-color-on-warning: contrast-color(var(--dry-color-fill-warning));
369
+ --dry-color-on-success: contrast-color(var(--dry-color-fill-success));
370
+ --dry-color-on-info: contrast-color(var(--dry-color-fill-info));
371
+ --dry-color-on-accent: contrast-color(var(--dry-color-fill-accent));
372
+ --dry-color-on-purple: contrast-color(var(--dry-color-fill-purple));
373
+ --dry-color-on-orange: contrast-color(var(--dry-color-fill-orange));
374
+ }
375
+ }
376
+ }
377
+ }
@@ -7,6 +7,8 @@
7
7
  }
8
8
 
9
9
  :root {
10
+ color-scheme: light;
11
+
10
12
  /* ─── Public aliases (Tier 2, documented) ──────────────────────────
11
13
  Override at `:root` to retheme. Tier 3 tokens below derive via
12
14
  `var(--alias)` so overrides cascade. See skills/dryui-build/SKILL.md. */
@@ -124,7 +126,7 @@
124
126
  --dry-color-fill-success-weak: hsla(145, 60%, 45%, 0.1);
125
127
  --dry-color-stroke-success: hsl(145, 50%, 65%);
126
128
  --dry-color-stroke-success-strong: hsla(145, 60%, 45%, 0.8);
127
- --dry-color-on-success: #ffffff;
129
+ --dry-color-on-success: hsl(145, 60%, 12%);
128
130
 
129
131
  /* ─── Status: Info (hue 210) ──────────────────────────────────── */
130
132
  --dry-color-text-info: hsl(210, 70%, 35%);
@@ -132,12 +134,14 @@
132
134
  --dry-color-fill-info-weak: hsla(210, 70%, 50%, 0.1);
133
135
  --dry-color-stroke-info: hsl(210, 50%, 70%);
134
136
  --dry-color-stroke-info-strong: hsla(210, 70%, 50%, 0.8);
137
+ --dry-color-on-info: hsl(210, 70%, 7%);
135
138
 
136
139
  /* ─── Accent tone (warm counterpoint to brand) ───────────────── */
137
140
  --dry-color-fill-accent: hsl(25, 90%, 58%);
138
141
  --dry-color-fill-accent-weak: hsla(25, 90%, 58%, 0.08);
139
142
  --dry-color-stroke-accent: hsla(25, 90%, 58%, 0.5);
140
143
  --dry-color-stroke-accent-strong: hsla(25, 90%, 58%, 0.8);
144
+ --dry-color-on-accent: hsl(25, 90%, 12%);
141
145
 
142
146
  /* ─── Purple semantic palette (badge / tag purple variants) ───── */
143
147
  --dry-color-text-purple: hsl(280, 60%, 38%);
@@ -146,6 +150,14 @@
146
150
  --dry-color-stroke-purple: hsla(280, 65%, 55%, 0.5);
147
151
  --dry-color-on-purple: #ffffff;
148
152
 
153
+ /* ─── Orange semantic palette (badge / tag orange variants) ───── */
154
+ --dry-color-fill-orange: color-mix(
155
+ in srgb,
156
+ var(--dry-color-fill-warning) 70%,
157
+ var(--dry-color-fill-error)
158
+ );
159
+ --dry-color-on-orange: hsl(25, 80%, 12%);
160
+
149
161
  /* ─── Extended surface depth ──────────────────────────────────── */
150
162
  --dry-color-bg-floating: #ffffff;
151
163
 
@@ -448,6 +460,19 @@
448
460
  --dry-scrollbar-width: 8px;
449
461
  }
450
462
 
463
+ @supports (color: contrast-color(white)) {
464
+ :root {
465
+ --dry-color-on-brand: contrast-color(var(--dry-color-fill-brand));
466
+ --dry-color-on-error: contrast-color(var(--dry-color-fill-error));
467
+ --dry-color-on-warning: contrast-color(var(--dry-color-fill-warning));
468
+ --dry-color-on-success: contrast-color(var(--dry-color-fill-success));
469
+ --dry-color-on-info: contrast-color(var(--dry-color-fill-info));
470
+ --dry-color-on-accent: contrast-color(var(--dry-color-fill-accent));
471
+ --dry-color-on-purple: contrast-color(var(--dry-color-fill-purple));
472
+ --dry-color-on-orange: contrast-color(var(--dry-color-fill-orange));
473
+ }
474
+ }
475
+
451
476
  :where([data-dry-type-mode='desktop']) {
452
477
  --dry-type-display-size: 3.5rem;
453
478
  --dry-type-display-leading: 4rem;
@@ -12,6 +12,8 @@
12
12
 
13
13
  [data-theme='midnight'],
14
14
  .theme-midnight {
15
+ color-scheme: dark;
16
+
15
17
  /* ─── Public aliases (midnight) ───────────────────────────────── */
16
18
  --dry-color-primary: hsl(250, 70%, 75%);
17
19
  --dry-color-primary-hover: hsl(250, 70%, 67%);
@@ -25,6 +27,7 @@
25
27
  --dry-color-border-hover: hsla(240, 15%, 85%, 0.5);
26
28
 
27
29
  /* ─── Brand — soft lavender ───────────────────────────────────── */
30
+ --dry-color-fill-brand: var(--dry-color-primary);
28
31
  --dry-color-fill-brand-active: hsl(250, 70%, 62%);
29
32
  --dry-color-fill-brand-weak: hsla(250, 70%, 75%, 0.08);
30
33
  --dry-color-stroke-brand: hsla(250, 70%, 75%, 0.45);
@@ -37,10 +40,12 @@
37
40
  --dry-color-fill-accent-weak: hsla(350, 60%, 70%, 0.08);
38
41
  --dry-color-stroke-accent: hsla(350, 60%, 70%, 0.45);
39
42
  --dry-color-stroke-accent-strong: hsla(350, 60%, 70%, 0.75);
43
+ --dry-color-on-accent: hsl(350, 30%, 8%);
40
44
 
41
45
  /* ─── Status: Error ───────────────────────────────────────────── */
42
46
  --dry-color-text-error: hsl(355, 70%, 72%);
43
- --dry-color-fill-error-hover: hsl(355, 70%, 52%);
47
+ --dry-color-fill-error: var(--dry-color-danger);
48
+ --dry-color-fill-error-hover: hsl(355, 70%, 62%);
44
49
  --dry-color-fill-error-weak: hsla(355, 70%, 60%, 0.12);
45
50
  --dry-color-stroke-error: hsl(355, 50%, 55%);
46
51
  --dry-color-stroke-error-strong: hsla(355, 70%, 60%, 0.8);
@@ -48,6 +53,7 @@
48
53
 
49
54
  /* ─── Status: Warning ─────────────────────────────────────────── */
50
55
  --dry-color-text-warning: hsl(38, 80%, 68%);
56
+ --dry-color-fill-warning: var(--dry-color-warning);
51
57
  --dry-color-fill-warning-weak: hsla(38, 75%, 55%, 0.12);
52
58
  --dry-color-stroke-warning: hsl(38, 55%, 55%);
53
59
  --dry-color-stroke-warning-strong: hsla(38, 75%, 55%, 0.8);
@@ -55,6 +61,7 @@
55
61
 
56
62
  /* ─── Status: Success ─────────────────────────────────────────── */
57
63
  --dry-color-text-success: hsl(150, 55%, 68%);
64
+ --dry-color-fill-success: var(--dry-color-success);
58
65
  --dry-color-fill-success-weak: hsla(150, 55%, 50%, 0.12);
59
66
  --dry-color-stroke-success: hsl(150, 45%, 55%);
60
67
  --dry-color-stroke-success-strong: hsla(150, 55%, 50%, 0.8);
@@ -66,6 +73,7 @@
66
73
  --dry-color-fill-info-weak: hsla(215, 65%, 60%, 0.12);
67
74
  --dry-color-stroke-info: hsl(215, 45%, 55%);
68
75
  --dry-color-stroke-info-strong: hsla(215, 65%, 60%, 0.8);
76
+ --dry-color-on-info: hsl(215, 30%, 8%);
69
77
 
70
78
  /* ─── Purple semantic palette (badge / tag purple variants) ───── */
71
79
  --dry-color-text-purple: hsl(285, 70%, 78%);
@@ -74,6 +82,14 @@
74
82
  --dry-color-stroke-purple: hsla(285, 70%, 70%, 0.5);
75
83
  --dry-color-on-purple: hsl(285, 30%, 8%);
76
84
 
85
+ /* ─── Orange semantic palette (badge / tag orange variants) ───── */
86
+ --dry-color-fill-orange: color-mix(
87
+ in srgb,
88
+ var(--dry-color-fill-warning) 70%,
89
+ var(--dry-color-fill-error)
90
+ );
91
+ --dry-color-on-orange: hsl(30, 30%, 8%);
92
+
77
93
  /* ─── Backgrounds — deep layered dark ─────────────────────────── */
78
94
  --dry-color-bg-base: hsl(240, 20%, 6%);
79
95
  --dry-color-bg-raised: hsl(240, 15%, 10%);
@@ -145,3 +161,17 @@
145
161
  --dry-toggle-selected-stroke: hsl(350, 60%, 70%);
146
162
  --dry-toggle-thumb-bg: hsl(240, 20%, 8%);
147
163
  }
164
+
165
+ @supports (color: contrast-color(white)) {
166
+ [data-theme='midnight'],
167
+ .theme-midnight {
168
+ --dry-color-on-brand: contrast-color(var(--dry-color-fill-brand));
169
+ --dry-color-on-error: contrast-color(var(--dry-color-fill-error));
170
+ --dry-color-on-warning: contrast-color(var(--dry-color-fill-warning));
171
+ --dry-color-on-success: contrast-color(var(--dry-color-fill-success));
172
+ --dry-color-on-info: contrast-color(var(--dry-color-fill-info));
173
+ --dry-color-on-accent: contrast-color(var(--dry-color-fill-accent));
174
+ --dry-color-on-purple: contrast-color(var(--dry-color-fill-purple));
175
+ --dry-color-on-orange: contrast-color(var(--dry-color-fill-orange));
176
+ }
177
+ }
@@ -11,6 +11,8 @@
11
11
 
12
12
  [data-theme='terminal'],
13
13
  .theme-terminal {
14
+ color-scheme: dark;
15
+
14
16
  /* ─── Public aliases (terminal) ───────────────────────────────── */
15
17
  --dry-color-primary: hsl(145, 80%, 50%);
16
18
  --dry-color-primary-hover: hsl(145, 80%, 42%);
@@ -24,6 +26,7 @@
24
26
  --dry-color-border-hover: hsla(0, 0%, 100%, 0.4);
25
27
 
26
28
  /* ─── Brand — terminal green ──────────────────────────────────── */
29
+ --dry-color-fill-brand: var(--dry-color-primary);
27
30
  --dry-color-fill-brand-active: hsl(145, 80%, 36%);
28
31
  --dry-color-fill-brand-weak: hsla(145, 80%, 50%, 0.08);
29
32
  --dry-color-stroke-brand: hsla(145, 80%, 50%, 0.5);
@@ -36,6 +39,7 @@
36
39
  --dry-color-fill-accent-weak: hsla(45, 90%, 55%, 0.08);
37
40
  --dry-color-stroke-accent: hsla(45, 90%, 55%, 0.5);
38
41
  --dry-color-stroke-accent-strong: hsla(45, 90%, 55%, 0.8);
42
+ --dry-color-on-accent: hsl(45, 30%, 5%);
39
43
 
40
44
  /* ─── Backgrounds — pure black, minimal saturation ────────────── */
41
45
  --dry-color-bg-base: hsl(0, 0%, 2%);
@@ -128,19 +132,22 @@
128
132
 
129
133
  /* ─── Status overrides — more vivid for data-dense UIs ────────── */
130
134
  --dry-color-text-error: hsl(0, 80%, 65%);
131
- --dry-color-fill-error-hover: hsl(0, 80%, 47%);
135
+ --dry-color-fill-error: var(--dry-color-danger);
136
+ --dry-color-fill-error-hover: hsl(0, 80%, 58%);
132
137
  --dry-color-fill-error-weak: hsla(0, 80%, 55%, 0.12);
133
138
  --dry-color-stroke-error: hsl(0, 60%, 55%);
134
139
  --dry-color-stroke-error-strong: hsla(0, 80%, 55%, 0.85);
135
140
  --dry-color-on-error: hsl(0, 30%, 5%);
136
141
 
137
142
  --dry-color-text-warning: hsl(45, 90%, 60%);
143
+ --dry-color-fill-warning: var(--dry-color-warning);
138
144
  --dry-color-fill-warning-weak: hsla(45, 90%, 55%, 0.12);
139
145
  --dry-color-stroke-warning: hsl(45, 70%, 55%);
140
146
  --dry-color-stroke-warning-strong: hsla(45, 90%, 55%, 0.85);
141
147
  --dry-color-on-warning: hsl(45, 30%, 5%);
142
148
 
143
149
  --dry-color-text-success: hsl(145, 80%, 55%);
150
+ --dry-color-fill-success: var(--dry-color-success);
144
151
  --dry-color-fill-success-weak: hsla(145, 80%, 50%, 0.12);
145
152
  --dry-color-stroke-success: hsl(145, 60%, 50%);
146
153
  --dry-color-stroke-success-strong: hsla(145, 80%, 50%, 0.85);
@@ -151,6 +158,7 @@
151
158
  --dry-color-fill-info-weak: hsla(200, 80%, 55%, 0.12);
152
159
  --dry-color-stroke-info: hsl(200, 60%, 55%);
153
160
  --dry-color-stroke-info-strong: hsla(200, 80%, 55%, 0.85);
161
+ --dry-color-on-info: hsl(200, 30%, 5%);
154
162
 
155
163
  /* ─── Purple semantic palette (badge / tag purple variants) ───── */
156
164
  --dry-color-text-purple: hsl(285, 80%, 70%);
@@ -158,4 +166,26 @@
158
166
  --dry-color-fill-purple-weak: hsla(285, 75%, 60%, 0.12);
159
167
  --dry-color-stroke-purple: hsla(285, 75%, 60%, 0.5);
160
168
  --dry-color-on-purple: hsl(285, 30%, 5%);
169
+
170
+ /* ─── Orange semantic palette (badge / tag orange variants) ───── */
171
+ --dry-color-fill-orange: color-mix(
172
+ in srgb,
173
+ var(--dry-color-fill-warning) 70%,
174
+ var(--dry-color-fill-error)
175
+ );
176
+ --dry-color-on-orange: hsl(30, 30%, 5%);
177
+ }
178
+
179
+ @supports (color: contrast-color(white)) {
180
+ [data-theme='terminal'],
181
+ .theme-terminal {
182
+ --dry-color-on-brand: contrast-color(var(--dry-color-fill-brand));
183
+ --dry-color-on-error: contrast-color(var(--dry-color-fill-error));
184
+ --dry-color-on-warning: contrast-color(var(--dry-color-fill-warning));
185
+ --dry-color-on-success: contrast-color(var(--dry-color-fill-success));
186
+ --dry-color-on-info: contrast-color(var(--dry-color-fill-info));
187
+ --dry-color-on-accent: contrast-color(var(--dry-color-fill-accent));
188
+ --dry-color-on-purple: contrast-color(var(--dry-color-fill-purple));
189
+ --dry-color-on-orange: contrast-color(var(--dry-color-fill-orange));
190
+ }
161
191
  }
@@ -1,10 +1,14 @@
1
- export interface TimeInputProps {
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+
3
+ export interface TimeInputProps extends Omit<
4
+ HTMLAttributes<HTMLDivElement>,
5
+ 'role' | 'aria-label'
6
+ > {
2
7
  value?: string;
3
8
  disabled?: boolean;
4
9
  step?: number;
5
10
  size?: 'sm' | 'md' | 'lg';
6
11
  name?: string;
7
- class?: string;
8
12
  }
9
13
 
10
14
  export { default as TimeInput } from './time-input.svelte';
@@ -1,7 +1,7 @@
1
1
  /** DryUI agent metadata. Consumed by @dryui/mcp/load-component-meta. */
2
2
  export default {
3
3
  name: 'TimeInput',
4
- description: 'Native time input with form control integration',
4
+ description: 'Segmented time input with select-based hour and minute controls',
5
5
  category: 'input',
6
6
  tags: ['time', 'input', 'form', 'clock']
7
7
  };