@dryui/ui 0.1.3 → 0.1.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 (55) hide show
  1. package/dist/accordion/accordion-trigger.svelte +5 -6
  2. package/dist/alert-dialog/alert-dialog-action.svelte +42 -6
  3. package/dist/alert-dialog/alert-dialog-cancel.svelte +44 -5
  4. package/dist/alert-dialog/alert-dialog-footer.svelte +3 -2
  5. package/dist/aurora/aurora.svelte.d.ts +6 -0
  6. package/dist/beam/beam.svelte +17 -10
  7. package/dist/chromatic-aberration/chromatic-aberration.svelte +7 -9
  8. package/dist/collapsible/collapsible-trigger.svelte +4 -7
  9. package/dist/color-picker/color-picker-eyedropper.svelte +4 -11
  10. package/dist/data-grid/data-grid-pagination.svelte +20 -2
  11. package/dist/data-grid/data-grid-root.svelte +1 -0
  12. package/dist/date-field/date-field-root.svelte +66 -20
  13. package/dist/date-field/date-field-segment.svelte +11 -9
  14. package/dist/date-field/date-field-separator.svelte +9 -1
  15. package/dist/date-picker/datepicker-calendar.svelte +168 -13
  16. package/dist/date-picker/datepicker-trigger.svelte +3 -8
  17. package/dist/date-range-picker/date-range-picker-calendar.svelte +177 -13
  18. package/dist/date-range-picker/date-range-picker-trigger.svelte +18 -12
  19. package/dist/dialog/dialog-content.svelte +1 -0
  20. package/dist/field/field-root.svelte +0 -1
  21. package/dist/file-select/file-select-clear.svelte +2 -8
  22. package/dist/file-upload/file-upload-item-delete.svelte +4 -7
  23. package/dist/flip-card/flip-card-back.svelte +2 -2
  24. package/dist/flip-card/flip-card-front.svelte +2 -2
  25. package/dist/flip-card/flip-card-root.svelte +2 -0
  26. package/dist/float-button/float-button-root.svelte +2 -1
  27. package/dist/image-comparison/image-comparison.svelte +16 -24
  28. package/dist/input-group/input-group-action.svelte +5 -0
  29. package/dist/input-group/input-group-input.svelte +7 -2
  30. package/dist/input-group/input-group-prefix.svelte +5 -0
  31. package/dist/input-group/input-group-root.svelte +10 -2
  32. package/dist/input-group/input-group-select.svelte +5 -0
  33. package/dist/input-group/input-group-separator.svelte +10 -0
  34. package/dist/input-group/input-group-suffix.svelte +5 -0
  35. package/dist/option-swatch-group/option-swatch-group-item.svelte +46 -0
  36. package/dist/option-swatch-group/option-swatch-group-label.svelte +10 -0
  37. package/dist/option-swatch-group/option-swatch-group-meta.svelte +10 -0
  38. package/dist/option-swatch-group/option-swatch-group-root.svelte +0 -79
  39. package/dist/option-swatch-group/option-swatch-group-swatch.svelte +25 -6
  40. package/dist/pin-input/pin-input-cell.svelte +4 -1
  41. package/dist/range-calendar/range-calendar-grid.svelte +219 -181
  42. package/dist/range-calendar/range-calendar-root.svelte +24 -10
  43. package/dist/select/select-trigger.svelte +5 -8
  44. package/dist/system-map/system-map.svelte +120 -674
  45. package/dist/tags-input/tags-input-input.svelte +3 -0
  46. package/dist/tags-input/tags-input-root.svelte +4 -13
  47. package/dist/tags-input/tags-input-tag.svelte +3 -0
  48. package/dist/themes/dark.css +6 -0
  49. package/dist/themes/default.css +3 -0
  50. package/dist/toast/toast-action.svelte +1 -0
  51. package/dist/toast/toast-close.svelte +4 -0
  52. package/dist/toast/toast-provider.svelte +5 -26
  53. package/dist/toast/toast-root.svelte +5 -10
  54. package/package.json +441 -1182
  55. package/skills/dryui/SKILL.md +24 -4
@@ -24,6 +24,16 @@
24
24
 
25
25
  let containerEl = $state<HTMLDivElement>();
26
26
 
27
+ function bindContainer(node: HTMLDivElement) {
28
+ containerEl = node;
29
+
30
+ return () => {
31
+ if (containerEl === node) {
32
+ containerEl = undefined;
33
+ }
34
+ };
35
+ }
36
+
27
37
  const weekdayLabels = $derived(generateWeekdayLabels(ctx.locale, ctx.weekStartDay));
28
38
 
29
39
  const calendarDays = $derived(getCalendarDays(ctx.viewYear, ctx.viewMonth, ctx.weekStartDay));
@@ -70,38 +80,54 @@
70
80
  }
71
81
  </script>
72
82
 
73
- <div bind:this={containerEl} class={className} {...rest} data-dp-calendar>
83
+ <div {@attach bindContainer} class={className} {...rest} data-dp-calendar>
74
84
  <!-- Calendar header: month/year + navigation -->
75
- <div role="group" aria-label={monthYearLabel}>
76
- <div class="dp-header">
77
- <button type="button" aria-label="Previous month" onclick={() => ctx.prevMonth()}> ‹ </button>
78
- <span aria-live="polite" aria-atomic="true">
85
+ <div role="group" aria-label={monthYearLabel} data-calendar-panel>
86
+ <div class="dp-header" data-calendar-header>
87
+ <button
88
+ type="button"
89
+ aria-label="Previous month"
90
+ data-calendar-nav
91
+ disabled={ctx.disabled}
92
+ onclick={() => ctx.prevMonth()}
93
+ >
94
+
95
+ </button>
96
+ <span aria-live="polite" aria-atomic="true" data-calendar-heading>
79
97
  {monthYearLabel}
80
98
  </span>
81
- <button type="button" aria-label="Next month" onclick={() => ctx.nextMonth()}> › </button>
99
+ <button
100
+ type="button"
101
+ aria-label="Next month"
102
+ data-calendar-nav
103
+ disabled={ctx.disabled}
104
+ onclick={() => ctx.nextMonth()}
105
+ >
106
+
107
+ </button>
82
108
  </div>
83
109
 
84
110
  <!-- Day-of-week header row -->
85
111
  <div role="grid" aria-label={monthYearLabel}>
86
- <div role="row">
87
- {#each weekdayLabels as label}
88
- <div role="columnheader" aria-label={label}>
112
+ <div role="row" data-calendar-row>
113
+ {#each weekdayLabels as label (label)}
114
+ <div role="columnheader" aria-label={label} data-calendar-columnheader>
89
115
  <span aria-hidden="true">{label}</span>
90
116
  </div>
91
117
  {/each}
92
118
  </div>
93
119
 
94
120
  <!-- Calendar day grid -->
95
- {#each weeks as week}
96
- <div role="row">
97
- {#each week as day}
121
+ {#each weeks as week, weekIndex (weekIndex)}
122
+ <div role="row" data-calendar-row>
123
+ {#each week as day (getDayISOString(day))}
98
124
  {@const isCurrent = day.getMonth() === ctx.viewMonth}
99
125
  {@const selected = ctx.value ? isSameDay(day, ctx.value) : false}
100
126
  {@const today = isToday(day)}
101
127
  {@const disabled = isDayDisabled(day)}
102
128
  {@const focused = isSameDay(day, ctx.focusedDate)}
103
129
  {@const isoStr = getDayISOString(day)}
104
- <div role="gridcell">
130
+ <div role="gridcell" data-calendar-cell>
105
131
  <button
106
132
  type="button"
107
133
  tabindex={focused ? 0 : -1}
@@ -112,6 +138,7 @@
112
138
  })}
113
139
  aria-pressed={selected}
114
140
  aria-disabled={disabled}
141
+ data-calendar-day-button
115
142
  data-calendar-day={isoStr}
116
143
  data-today={today ? '' : undefined}
117
144
  data-selected={selected ? '' : undefined}
@@ -132,7 +159,135 @@
132
159
 
133
160
  <style>
134
161
  [data-dp-calendar] {
162
+ --dry-calendar-grid-gap: 1px;
135
163
  container-type: inline-size;
164
+ display: grid;
165
+ gap: var(--dry-space-2);
136
166
  user-select: none;
167
+ color: var(--dry-calendar-header-color, var(--dry-color-text-strong));
168
+ font-family: var(--dry-font-sans);
169
+ }
170
+
171
+ [data-dp-calendar] [data-calendar-panel] {
172
+ display: grid;
173
+ gap: var(--dry-space-2);
174
+ }
175
+
176
+ [data-dp-calendar] [data-calendar-header] {
177
+ display: grid;
178
+ grid-template-columns: auto 1fr auto;
179
+ align-items: center;
180
+ gap: var(--dry-space-2);
181
+ }
182
+
183
+ [data-dp-calendar] [data-calendar-nav] {
184
+ display: inline-grid;
185
+ place-items: center;
186
+ height: var(--dry-space-8);
187
+ aspect-ratio: 1;
188
+ border: 1px solid transparent;
189
+ border-radius: var(--dry-calendar-day-radius, var(--dry-radius-md));
190
+ background: transparent;
191
+ color: var(--dry-calendar-header-color, var(--dry-color-text-strong));
192
+ cursor: pointer;
193
+ transition:
194
+ background var(--dry-duration-fast) var(--dry-ease-default),
195
+ border-color var(--dry-duration-fast) var(--dry-ease-default);
196
+ }
197
+
198
+ [data-dp-calendar] [data-calendar-nav]:hover:not([disabled]) {
199
+ background: var(--dry-calendar-day-hover-bg, var(--dry-color-bg-raised));
200
+ border-color: var(--dry-color-stroke-strong);
201
+ }
202
+
203
+ [data-dp-calendar] [data-calendar-nav]:focus-visible {
204
+ outline: 2px solid var(--dry-color-focus-ring);
205
+ outline-offset: 1px;
206
+ }
207
+
208
+ [data-dp-calendar] [data-calendar-heading] {
209
+ font-size: var(--dry-type-small-size, var(--dry-type-small-size));
210
+ font-weight: 600;
211
+ letter-spacing: -0.01em;
212
+ }
213
+
214
+ [data-dp-calendar] [role='grid'] {
215
+ display: grid;
216
+ gap: var(--dry-calendar-grid-gap);
217
+ }
218
+
219
+ [data-dp-calendar] [data-calendar-row] {
220
+ display: grid;
221
+ grid-template-columns: repeat(7, minmax(0, 1fr));
222
+ gap: var(--dry-calendar-grid-gap);
223
+ }
224
+
225
+ [data-dp-calendar] [data-calendar-columnheader] {
226
+ display: grid;
227
+ place-items: center;
228
+ min-height: var(--dry-space-8);
229
+ font-size: var(--dry-type-tiny-size, var(--dry-type-tiny-size));
230
+ color: var(--dry-calendar-muted-color, var(--dry-color-text-weak));
231
+ text-transform: uppercase;
232
+ letter-spacing: 0.04em;
233
+ }
234
+
235
+ [data-dp-calendar] [data-calendar-cell] {
236
+ display: grid;
237
+ grid-template-columns: var(--dry-calendar-day-size, 2.25rem);
238
+ place-items: center;
239
+ }
240
+
241
+ [data-dp-calendar] [data-calendar-day-button] {
242
+ display: inline-grid;
243
+ place-items: center;
244
+ min-height: var(--dry-calendar-day-size, 2.25rem);
245
+ aspect-ratio: 1;
246
+ border: none;
247
+ border-radius: var(--dry-calendar-day-radius, var(--dry-radius-md));
248
+ background: transparent;
249
+ color: var(--dry-color-text-strong);
250
+ font: inherit;
251
+ font-size: var(--dry-type-small-size, var(--dry-type-small-size));
252
+ font-variant-numeric: tabular-nums;
253
+ cursor: pointer;
254
+ transition:
255
+ background var(--dry-duration-fast) var(--dry-ease-default),
256
+ color var(--dry-duration-fast) var(--dry-ease-default);
257
+ }
258
+
259
+ [data-dp-calendar] [data-calendar-day-button]:hover:not([data-disabled]) {
260
+ background: var(--dry-calendar-day-hover-bg, var(--dry-color-bg-raised));
261
+ }
262
+
263
+ [data-dp-calendar] [data-calendar-day-button]:focus-visible {
264
+ outline: 2px solid var(--dry-color-focus-ring);
265
+ outline-offset: 1px;
266
+ }
267
+
268
+ [data-dp-calendar] [data-calendar-day-button][data-today]:not([data-selected]) {
269
+ color: var(--dry-calendar-today-color, var(--dry-color-fill-brand));
270
+ font-weight: 600;
271
+ }
272
+
273
+ [data-dp-calendar] [data-calendar-day-button][data-selected] {
274
+ background: var(--dry-calendar-selected-bg, var(--dry-color-fill-brand));
275
+ color: var(--dry-calendar-selected-color, var(--dry-color-on-brand));
276
+ font-weight: 600;
277
+ }
278
+
279
+ [data-dp-calendar] [data-calendar-day-button][data-selected]:hover:not([data-disabled]) {
280
+ background: var(--dry-calendar-selected-hover-bg, var(--dry-color-fill-brand-hover));
281
+ }
282
+
283
+ [data-dp-calendar] [data-calendar-day-button][data-outside-month] {
284
+ color: var(--dry-calendar-outside-color, var(--dry-color-text-weak));
285
+ opacity: 0.6;
286
+ }
287
+
288
+ [data-dp-calendar] [data-calendar-day-button][data-disabled] {
289
+ cursor: not-allowed;
290
+ opacity: 0.4;
291
+ pointer-events: none;
137
292
  }
138
293
  </style>
@@ -61,6 +61,7 @@
61
61
  {displayText || placeholder}
62
62
  </span>
63
63
  {/if}
64
+ <svg data-indicator xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"/><line x1="16" y1="2" x2="16" y2="6"/><line x1="8" y1="2" x2="8" y2="6"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
64
65
  </button>
65
66
 
66
67
  <style>
@@ -94,15 +95,9 @@
94
95
  transform var(--dry-duration-fast) var(--dry-ease-default);
95
96
  }
96
97
 
97
- [data-dp-trigger]::after {
98
- content: '';
99
- aspect-ratio: 1;
98
+ [data-dp-trigger] [data-indicator] {
100
99
  height: 1rem;
101
- background: currentColor;
102
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");
103
- mask-size: contain;
104
- mask-repeat: no-repeat;
105
- mask-position: center;
100
+ aspect-ratio: 1;
106
101
  opacity: 0.6;
107
102
  }
108
103
 
@@ -24,6 +24,16 @@
24
24
 
25
25
  let containerEl = $state<HTMLDivElement>();
26
26
 
27
+ function bindContainer(node: HTMLDivElement) {
28
+ containerEl = node;
29
+
30
+ return () => {
31
+ if (containerEl === node) {
32
+ containerEl = undefined;
33
+ }
34
+ };
35
+ }
36
+
27
37
  const weekdayLabels = $derived(generateWeekdayLabels(ctx.locale, ctx.weekStartDay));
28
38
 
29
39
  const calendarDays = $derived(getCalendarDays(ctx.viewYear, ctx.viewMonth, ctx.weekStartDay));
@@ -116,35 +126,47 @@
116
126
  }
117
127
  </script>
118
128
 
119
- <div bind:this={containerEl} class={className} {...rest} data-drp-calendar>
129
+ <div {@attach bindContainer} class={className} {...rest} data-drp-calendar>
120
130
  <!-- Calendar header: month/year + navigation -->
121
- <div role="group" aria-label={monthYearLabel}>
122
- <div>
123
- <button type="button" aria-label="Previous month" onclick={() => ctx.prevMonth()}>
131
+ <div role="group" aria-label={monthYearLabel} data-calendar-panel>
132
+ <div data-calendar-header>
133
+ <button
134
+ type="button"
135
+ aria-label="Previous month"
136
+ data-calendar-nav
137
+ disabled={ctx.disabled}
138
+ onclick={() => ctx.prevMonth()}
139
+ >
124
140
  &#8249;
125
141
  </button>
126
- <span aria-live="polite" aria-atomic="true">
142
+ <span aria-live="polite" aria-atomic="true" data-calendar-heading>
127
143
  {monthYearLabel}
128
144
  </span>
129
- <button type="button" aria-label="Next month" onclick={() => ctx.nextMonth()}>
145
+ <button
146
+ type="button"
147
+ aria-label="Next month"
148
+ data-calendar-nav
149
+ disabled={ctx.disabled}
150
+ onclick={() => ctx.nextMonth()}
151
+ >
130
152
  &#8250;
131
153
  </button>
132
154
  </div>
133
155
 
134
156
  <!-- Day-of-week header row -->
135
157
  <div role="grid" aria-label={monthYearLabel}>
136
- <div role="row">
137
- {#each weekdayLabels as label}
138
- <div role="columnheader" aria-label={label}>
158
+ <div role="row" data-calendar-row>
159
+ {#each weekdayLabels as label (label)}
160
+ <div role="columnheader" aria-label={label} data-calendar-columnheader>
139
161
  <span aria-hidden="true">{label}</span>
140
162
  </div>
141
163
  {/each}
142
164
  </div>
143
165
 
144
166
  <!-- Calendar day grid -->
145
- {#each weeks as week}
146
- <div role="row">
147
- {#each week as day}
167
+ {#each weeks as week, weekIndex (weekIndex)}
168
+ <div role="row" data-calendar-row>
169
+ {#each week as day (getDayISOString(day))}
148
170
  {@const isCurrent = day.getMonth() === ctx.viewMonth}
149
171
  {@const selected = isSelected(day)}
150
172
  {@const today = isToday(day)}
@@ -154,7 +176,7 @@
154
176
  {@const inRange = isInSelectedRange(day) || isInPreviewRange(day)}
155
177
  {@const rangeStart = isRangeStart(day)}
156
178
  {@const rangeEnd = isRangeEnd(day)}
157
- <div role="gridcell">
179
+ <div role="gridcell" data-calendar-cell>
158
180
  <button
159
181
  type="button"
160
182
  tabindex={focused ? 0 : -1}
@@ -165,6 +187,7 @@
165
187
  })}
166
188
  aria-pressed={selected}
167
189
  aria-disabled={disabled}
190
+ data-calendar-day-button
168
191
  data-calendar-day={isoStr}
169
192
  data-today={today ? '' : undefined}
170
193
  data-selected={selected ? '' : undefined}
@@ -200,5 +223,146 @@
200
223
  [data-drp-calendar] {
201
224
  display: grid;
202
225
  gap: var(--dry-space-2);
226
+ user-select: none;
227
+ color: var(--dry-color-text-strong);
228
+ font-family: var(--dry-font-sans);
229
+ }
230
+
231
+ [data-drp-calendar] [data-calendar-panel] {
232
+ display: grid;
233
+ gap: var(--dry-space-2);
234
+ }
235
+
236
+ [data-drp-calendar] [data-calendar-header] {
237
+ display: grid;
238
+ grid-template-columns: auto 1fr auto;
239
+ align-items: center;
240
+ gap: var(--dry-space-2);
241
+ }
242
+
243
+ [data-drp-calendar] [data-calendar-nav] {
244
+ display: inline-grid;
245
+ place-items: center;
246
+ height: var(--dry-space-8);
247
+ aspect-ratio: 1;
248
+ border: 1px solid transparent;
249
+ border-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
250
+ background: transparent;
251
+ color: var(--dry-color-text-strong);
252
+ cursor: pointer;
253
+ transition:
254
+ background var(--dry-duration-fast) var(--dry-ease-default),
255
+ border-color var(--dry-duration-fast) var(--dry-ease-default);
256
+ }
257
+
258
+ [data-drp-calendar] [data-calendar-nav]:hover:not([disabled]) {
259
+ background: var(--dry-range-calendar-day-hover-bg, var(--dry-color-bg-raised));
260
+ border-color: var(--dry-color-stroke-strong);
261
+ }
262
+
263
+ [data-drp-calendar] [data-calendar-nav]:focus-visible {
264
+ outline: 2px solid var(--dry-color-focus-ring);
265
+ outline-offset: 1px;
266
+ }
267
+
268
+ [data-drp-calendar] [data-calendar-heading] {
269
+ font-size: var(--dry-type-small-size, var(--dry-type-small-size));
270
+ font-weight: 600;
271
+ letter-spacing: -0.01em;
272
+ }
273
+
274
+ [data-drp-calendar] [role='grid'] {
275
+ display: grid;
276
+ gap: 1px;
277
+ }
278
+
279
+ [data-drp-calendar] [data-calendar-row] {
280
+ display: grid;
281
+ grid-template-columns: repeat(7, minmax(0, 1fr));
282
+ gap: 1px;
283
+ }
284
+
285
+ [data-drp-calendar] [data-calendar-columnheader] {
286
+ display: grid;
287
+ place-items: center;
288
+ min-height: var(--dry-space-8);
289
+ font-size: var(--dry-type-tiny-size, var(--dry-type-tiny-size));
290
+ color: var(--dry-range-calendar-outside-color, var(--dry-color-text-weak));
291
+ text-transform: uppercase;
292
+ letter-spacing: 0.04em;
293
+ }
294
+
295
+ [data-drp-calendar] [data-calendar-cell] {
296
+ display: grid;
297
+ place-items: center;
298
+ }
299
+
300
+ [data-drp-calendar] [data-calendar-day-button] {
301
+ display: inline-grid;
302
+ place-items: center;
303
+ min-height: var(--dry-range-calendar-day-size, 2.25rem);
304
+ aspect-ratio: 1;
305
+ border: none;
306
+ border-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
307
+ background: transparent;
308
+ color: var(--dry-color-text-strong);
309
+ font: inherit;
310
+ font-size: var(--dry-type-small-size, var(--dry-type-small-size));
311
+ font-variant-numeric: tabular-nums;
312
+ cursor: pointer;
313
+ transition:
314
+ background var(--dry-duration-fast) var(--dry-ease-default),
315
+ color var(--dry-duration-fast) var(--dry-ease-default);
316
+ }
317
+
318
+ [data-drp-calendar] [data-calendar-day-button]:hover:not([data-disabled]) {
319
+ background: var(--dry-range-calendar-day-hover-bg, var(--dry-color-bg-raised));
320
+ }
321
+
322
+ [data-drp-calendar] [data-calendar-day-button]:focus-visible {
323
+ outline: 2px solid var(--dry-color-focus-ring);
324
+ outline-offset: 1px;
325
+ }
326
+
327
+ [data-drp-calendar]
328
+ [data-calendar-day-button][data-today]:not([data-range-start]):not([data-range-end]) {
329
+ color: var(--dry-range-calendar-today-color, var(--dry-color-fill-brand));
330
+ font-weight: 600;
331
+ }
332
+
333
+ [data-drp-calendar] [data-calendar-day-button][data-range-start],
334
+ [data-drp-calendar] [data-calendar-day-button][data-range-end] {
335
+ background: var(--dry-range-calendar-selected-bg, var(--dry-color-fill-brand));
336
+ color: var(--dry-range-calendar-selected-color, var(--dry-color-on-brand));
337
+ font-weight: 600;
338
+ }
339
+
340
+ [data-drp-calendar] [data-calendar-day-button][data-range-start]:hover:not([data-disabled]),
341
+ [data-drp-calendar] [data-calendar-day-button][data-range-end]:hover:not([data-disabled]) {
342
+ background: var(--dry-range-calendar-selected-hover-bg, var(--dry-color-fill-brand-hover));
343
+ }
344
+
345
+ [data-drp-calendar] [data-calendar-day-button][data-in-range] {
346
+ background: var(
347
+ --dry-range-calendar-range-bg,
348
+ color-mix(in srgb, var(--dry-color-fill-brand) 15%, transparent)
349
+ );
350
+ border-radius: 0;
351
+ }
352
+
353
+ [data-drp-calendar] [data-calendar-day-button][data-range-start],
354
+ [data-drp-calendar] [data-calendar-day-button][data-range-end] {
355
+ border-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
356
+ }
357
+
358
+ [data-drp-calendar] [data-calendar-day-button][data-outside-month] {
359
+ color: var(--dry-range-calendar-outside-color, var(--dry-color-text-weak));
360
+ opacity: 0.6;
361
+ }
362
+
363
+ [data-drp-calendar] [data-calendar-day-button][data-disabled] {
364
+ cursor: not-allowed;
365
+ opacity: 0.4;
366
+ pointer-events: none;
203
367
  }
204
368
  </style>
@@ -15,10 +15,19 @@
15
15
 
16
16
  let buttonEl = $state<HTMLButtonElement>();
17
17
 
18
- $effect(() => {
19
- if (!buttonEl) return;
20
- ctx.triggerEl = buttonEl;
21
- });
18
+ function bindTrigger(node: HTMLButtonElement) {
19
+ buttonEl = node;
20
+ ctx.triggerEl = node;
21
+
22
+ return () => {
23
+ if (buttonEl === node) {
24
+ buttonEl = undefined;
25
+ }
26
+ if (ctx.triggerEl === node) {
27
+ ctx.triggerEl = null;
28
+ }
29
+ };
30
+ }
22
31
 
23
32
  const formatOpts: Intl.DateTimeFormatOptions = {
24
33
  year: 'numeric',
@@ -38,7 +47,7 @@
38
47
  </script>
39
48
 
40
49
  <button
41
- bind:this={buttonEl}
50
+ {@attach bindTrigger}
42
51
  id={ctx.triggerId}
43
52
  type="button"
44
53
  aria-haspopup="dialog"
@@ -46,6 +55,7 @@
46
55
  aria-controls={ctx.contentId}
47
56
  data-state={ctx.open ? 'open' : 'closed'}
48
57
  data-disabled={ctx.disabled ? '' : undefined}
58
+ data-drp-trigger
49
59
  disabled={ctx.disabled}
50
60
  popovertarget={ctx.contentId}
51
61
  class={className}
@@ -58,6 +68,7 @@
58
68
  {displayText || placeholder}
59
69
  </span>
60
70
  {/if}
71
+ <svg data-indicator xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="3" y="4" width="18" height="17" rx="2" ry="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>
61
72
  </button>
62
73
 
63
74
  <style>
@@ -83,14 +94,9 @@
83
94
  box-shadow var(--dry-duration-fast) var(--dry-ease-default);
84
95
  }
85
96
 
86
- [data-drp-trigger]::after {
87
- content: '';
88
- aspect-ratio: 1;
97
+ [data-drp-trigger] [data-indicator] {
89
98
  height: 1rem;
90
- background: currentColor;
91
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Crect x='3' y='4' width='18' height='17' rx='2' ry='2'/%3E%3Cpath d='M16 2v4M8 2v4M3 10h18'/%3E%3C/svg%3E");
92
- mask-size: contain;
93
- mask-repeat: no-repeat;
99
+ aspect-ratio: 1;
94
100
  opacity: 0.75;
95
101
  }
96
102
 
@@ -82,6 +82,7 @@
82
82
  );
83
83
 
84
84
  container-type: inline-size;
85
+ justify-self: stretch;
85
86
  border: 1px solid var(--dry-dialog-border);
86
87
  border-radius: var(--dry-dialog-radius, var(--dry-overlay-radius, var(--dry-radius-2xl)));
87
88
  background: var(--dry-dialog-bg, var(--dry-overlay-bg, var(--dry-color-bg-overlay)));
@@ -76,7 +76,6 @@
76
76
  <style>
77
77
  [data-field] {
78
78
  --dry-field-gap: var(--dry-space-1_5);
79
- --dry-field-label-order: 1;
80
79
  display: grid;
81
80
  gap: var(--dry-field-gap);
82
81
 
@@ -25,7 +25,7 @@
25
25
  {#if children}
26
26
  {@render children()}
27
27
  {:else}
28
-
28
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
29
29
  {/if}
30
30
  </button>
31
31
  {/if}
@@ -47,15 +47,9 @@
47
47
  background var(--dry-duration-fast) var(--dry-ease-default);
48
48
  }
49
49
 
50
- [data-fs-clear]::before {
51
- content: '';
52
- display: block;
50
+ [data-fs-clear] svg {
53
51
  height: 0.875rem;
54
52
  aspect-ratio: 1;
55
- background: currentColor;
56
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M18 6 6 18'/%3E%3Cpath d='m6 6 12 12'/%3E%3C/svg%3E");
57
- mask-size: contain;
58
- mask-repeat: no-repeat;
59
53
  }
60
54
 
61
55
  [data-fs-clear]:hover {
@@ -23,6 +23,7 @@
23
23
  type="button"
24
24
  disabled={ctx.disabled}
25
25
  data-disabled={ctx.disabled || undefined}
26
+ data-fu-item-delete
26
27
  aria-label="Remove file"
27
28
  onclick={handleClick}
28
29
  {...rest}
@@ -30,6 +31,8 @@
30
31
  >
31
32
  {#if children}
32
33
  {@render children()}
34
+ {:else}
35
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
33
36
  {/if}
34
37
  </button>
35
38
 
@@ -50,15 +53,9 @@
50
53
  background var(--dry-duration-fast) var(--dry-ease-default);
51
54
  }
52
55
 
53
- [data-fu-item-delete]::before {
54
- content: '';
55
- display: block;
56
+ [data-fu-item-delete] svg {
56
57
  height: 1rem;
57
58
  aspect-ratio: 1;
58
- background: currentColor;
59
- mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M18 6 6 18'/%3E%3Cpath d='m6 6 12 12'/%3E%3C/svg%3E");
60
- mask-size: contain;
61
- mask-repeat: no-repeat;
62
59
  }
63
60
 
64
61
  [data-fu-item-delete]:hover:not([data-disabled]) {
@@ -27,8 +27,8 @@
27
27
  z-index: 1;
28
28
  backface-visibility: hidden;
29
29
  transition: transform var(--dry-flip-card-duration, 0.6s) ease;
30
- position: absolute;
31
- inset: 0;
30
+ grid-area: 1 / 1;
32
31
  transform: var(--dry-flip-card-back-transform, rotateY(180deg));
32
+ transform-origin: center;
33
33
  }
34
34
  </style>
@@ -18,8 +18,8 @@
18
18
  z-index: 2;
19
19
  backface-visibility: hidden;
20
20
  transition: transform var(--dry-flip-card-duration, 0.6s) ease;
21
- position: absolute;
22
- inset: 0;
21
+ grid-area: 1 / 1;
23
22
  transform: var(--dry-flip-card-front-transform, rotateY(0deg));
23
+ transform-origin: center;
24
24
  }
25
25
  </style>
@@ -66,8 +66,10 @@
66
66
  --dry-flip-card-front-transform: rotateY(0deg);
67
67
  --dry-flip-card-back-transform: rotateY(180deg);
68
68
 
69
+ display: grid;
69
70
  perspective: var(--dry-flip-card-perspective);
70
71
  position: relative;
72
+ transform-style: preserve-3d;
71
73
  }
72
74
 
73
75
  [data-flip-card][data-direction='horizontal'][data-flipped] {
@@ -35,9 +35,10 @@
35
35
  [data-float-button] {
36
36
  --dry-fab-offset: var(--dry-space-6);
37
37
  --dry-fab-gap: var(--dry-space-3);
38
+ --dry-fab-position: fixed;
38
39
  --dry-fab-z-index: var(--dry-layer-overlay);
39
40
 
40
- position: fixed;
41
+ position: var(--dry-fab-position);
41
42
  z-index: var(--dry-fab-z-index);
42
43
  display: grid;
43
44
  justify-items: center;