@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
@@ -8,6 +8,13 @@
8
8
  isDateInRange,
9
9
  formatDate
10
10
  } from '@dryui/primitives';
11
+ import {
12
+ generateWeekdayLabels,
13
+ splitIntoWeeks,
14
+ getDayISOString,
15
+ handleCalendarKeydown,
16
+ focusCalendarDay
17
+ } from '../internal/calendar-grid-utils.js';
11
18
 
12
19
  interface Props extends HTMLAttributes<HTMLDivElement> {}
13
20
 
@@ -15,7 +22,7 @@
15
22
 
16
23
  const ctx = getRangeCalendarCtx();
17
24
 
18
- let gridEl = $state<HTMLDivElement>();
25
+ let gridEl = $state<HTMLDivElement | undefined>();
19
26
 
20
27
  const weekdayLabels = $derived(generateWeekdayLabels(ctx.locale, ctx.weekStartDay));
21
28
 
@@ -30,28 +37,6 @@
30
37
 
31
38
  const weeks = $derived(splitIntoWeeks(calendarDays));
32
39
 
33
- function generateWeekdayLabels(locale: string, weekStartDay: number): string[] {
34
- const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' });
35
- const labels: string[] = [];
36
- for (let i = 0; i < 7; i++) {
37
- const d = new Date(2024, 0, 7 + ((i + weekStartDay) % 7));
38
- labels.push(formatter.format(d));
39
- }
40
- return labels;
41
- }
42
-
43
- function splitIntoWeeks(days: Date[]): Date[][] {
44
- const result: Date[][] = [];
45
- for (let i = 0; i < days.length; i += 7) {
46
- result.push(days.slice(i, i + 7));
47
- }
48
- return result;
49
- }
50
-
51
- function getDayISOString(day: Date): string {
52
- return `${day.getFullYear()}-${String(day.getMonth() + 1).padStart(2, '0')}-${String(day.getDate()).padStart(2, '0')}`;
53
- }
54
-
55
40
  function isInRange(day: Date): boolean {
56
41
  const start = ctx.startDate;
57
42
  const end = ctx.endDate ?? ctx.hoveredDate;
@@ -83,72 +68,71 @@
83
68
  }
84
69
 
85
70
  function handleDayKeydown(e: KeyboardEvent, day: Date) {
86
- const { key } = e;
87
- let newDate: Date | null = null;
88
-
89
- if (key === 'ArrowLeft') {
90
- e.preventDefault();
91
- newDate = new Date(day);
92
- newDate.setDate(newDate.getDate() - 1);
93
- } else if (key === 'ArrowRight') {
94
- e.preventDefault();
95
- newDate = new Date(day);
96
- newDate.setDate(newDate.getDate() + 1);
97
- } else if (key === 'ArrowUp') {
98
- e.preventDefault();
99
- newDate = new Date(day);
100
- newDate.setDate(newDate.getDate() - 7);
101
- } else if (key === 'ArrowDown') {
102
- e.preventDefault();
103
- newDate = new Date(day);
104
- newDate.setDate(newDate.getDate() + 7);
105
- } else if (key === 'Enter' || key === ' ') {
106
- e.preventDefault();
107
- if (isDateInRange(day, ctx.min, ctx.max)) ctx.selectDate(day);
108
- return;
109
- } else return;
110
-
111
- if (newDate) {
112
- ctx.setFocusedDate(newDate);
113
- requestAnimationFrame(() => {
114
- const isoStr = getDayISOString(newDate!);
115
- const btn = gridEl?.querySelector(`[data-calendar-day="${isoStr}"]`) as HTMLButtonElement;
116
- btn?.focus();
117
- });
71
+ const result = handleCalendarKeydown(e, day, {
72
+ onSelect: (date) => {
73
+ if (isDateInRange(date, ctx.min, ctx.max)) {
74
+ ctx.selectDate(date);
75
+ }
76
+ },
77
+ onEscape: () => {},
78
+ setFocusedDate: (date) => ctx.setFocusedDate(date),
79
+ weekStartDay: ctx.weekStartDay,
80
+ min: ctx.min,
81
+ max: ctx.max
82
+ });
83
+ if (result?.type === 'navigate') {
84
+ requestAnimationFrame(() => focusCalendarDay(gridEl, result.newDate));
118
85
  }
119
86
  }
120
87
 
121
88
  function isDayDisabled(day: Date): boolean {
122
89
  return !isDateInRange(day, ctx.min, ctx.max);
123
90
  }
91
+
92
+ function captureGrid(node: HTMLDivElement) {
93
+ gridEl = node;
94
+
95
+ return {
96
+ destroy() {
97
+ if (gridEl === node) {
98
+ gridEl = undefined;
99
+ }
100
+ }
101
+ };
102
+ }
124
103
  </script>
125
104
 
126
- <div bind:this={gridEl} data-range-calendar-grid class={className} {...rest}>
127
- <div role="group" aria-label={monthYearLabel}>
105
+ <div {@attach captureGrid} data-range-calendar-grid class={className} {...rest}>
106
+ <div data-calendar-panel role="group" aria-label={monthYearLabel}>
128
107
  <div data-calendar-header>
129
- <button type="button" aria-label="Previous month" onclick={() => ctx.prevMonth()}>
108
+ <button
109
+ type="button"
110
+ data-calendar-nav
111
+ aria-label="Previous month"
112
+ onclick={() => ctx.prevMonth()}
113
+ >
130
114
  &#8249;
131
115
  </button>
132
- <span aria-live="polite" aria-atomic="true">
116
+ <span data-calendar-heading aria-live="polite" aria-atomic="true">
133
117
  {monthYearLabel}
134
118
  </span>
135
- <button type="button" aria-label="Next month" onclick={() => ctx.nextMonth()}>
119
+ <button type="button" data-calendar-nav aria-label="Next month" onclick={() => ctx.nextMonth()}>
136
120
  &#8250;
137
121
  </button>
138
122
  </div>
139
123
 
140
124
  <div role="grid" aria-label={monthYearLabel}>
141
- <div role="row">
142
- {#each weekdayLabels as label}
143
- <div role="columnheader" aria-label={label}>
125
+ <div data-calendar-row role="row">
126
+ {#each weekdayLabels as label (label)}
127
+ <div data-calendar-columnheader role="columnheader" aria-label={label}>
144
128
  <span aria-hidden="true">{label}</span>
145
129
  </div>
146
130
  {/each}
147
131
  </div>
148
132
 
149
- {#each weeks as week}
150
- <div role="row">
151
- {#each week as day}
133
+ {#each weeks as week (week[0]?.getTime() ?? 0)}
134
+ <div data-calendar-row role="row">
135
+ {#each week as day (day.getTime())}
152
136
  {@const isCurrent = day.getMonth() === ctx.viewMonth}
153
137
  {@const inRange = isInRange(day)}
154
138
  {@const rangeStart = isRangeStart(day)}
@@ -157,15 +141,24 @@
157
141
  {@const disabled = isDayDisabled(day)}
158
142
  {@const focused = isSameDay(day, ctx.focusedDate)}
159
143
  {@const isoStr = getDayISOString(day)}
160
- <div role="gridcell" aria-selected={inRange || undefined}>
144
+ <div
145
+ data-calendar-cell
146
+ data-in-range={inRange ? '' : undefined}
147
+ data-range-start={rangeStart ? '' : undefined}
148
+ data-range-end={rangeEnd ? '' : undefined}
149
+ >
161
150
  <button
151
+ role="gridcell"
162
152
  type="button"
153
+ data-calendar-day-button
163
154
  tabindex={focused ? 0 : -1}
164
155
  aria-label={formatDate(day, ctx.locale, {
165
156
  year: 'numeric',
166
157
  month: 'long',
167
158
  day: 'numeric'
168
159
  })}
160
+ aria-current={today ? 'date' : undefined}
161
+ aria-selected={inRange || undefined}
169
162
  aria-disabled={disabled}
170
163
  data-calendar-day={isoStr}
171
164
  data-today={today ? '' : undefined}
@@ -193,139 +186,184 @@
193
186
  [data-range-calendar-grid] {
194
187
  display: grid;
195
188
  gap: var(--dry-space-2);
189
+ user-select: none;
190
+ color: var(--dry-color-text-strong);
191
+ font-family: var(--dry-font-sans);
192
+ }
196
193
 
197
- [role='group'] {
198
- display: grid;
199
- gap: var(--dry-space-2);
200
- }
194
+ [data-range-calendar-grid] [data-calendar-panel] {
195
+ display: grid;
196
+ gap: var(--dry-space-3);
197
+ padding: var(--dry-space-3);
198
+ background: var(--dry-range-calendar-panel-bg, var(--dry-color-bg-overlay));
199
+ border: 1px solid var(--dry-range-calendar-panel-border, var(--dry-color-stroke-weak));
200
+ border-radius: calc(var(--dry-range-calendar-radius, var(--dry-radius-lg)) - var(--dry-space-1));
201
+ }
201
202
 
202
- [role='group'] > div:first-child {
203
- display: grid;
204
- grid-template-columns: auto 1fr auto;
205
- align-items: center;
206
- gap: var(--dry-space-2);
207
- }
203
+ [data-range-calendar-grid] [data-calendar-header] {
204
+ display: grid;
205
+ grid-template-columns: auto 1fr auto;
206
+ align-items: center;
207
+ gap: var(--dry-space-2);
208
+ padding-block-end: var(--dry-space-1);
209
+ border-block-end: 1px solid
210
+ color-mix(
211
+ in srgb,
212
+ var(--dry-range-calendar-panel-border, var(--dry-color-stroke-weak)) 70%,
213
+ transparent
214
+ );
215
+ }
208
216
 
209
- [role='group'] > div:first-child button {
210
- display: inline-grid;
211
- place-items: center;
212
- height: var(--dry-space-8);
213
- aspect-ratio: 1;
214
- border: 1px solid transparent;
215
- border-radius: var(--dry-range-calendar-day-radius);
216
- background: transparent;
217
- color: var(--dry-color-text-strong);
218
- cursor: pointer;
219
- transition:
220
- background var(--dry-duration-fast) var(--dry-ease-default),
221
- border-color var(--dry-duration-fast) var(--dry-ease-default);
222
- }
217
+ [data-range-calendar-grid] [data-calendar-nav] {
218
+ display: inline-grid;
219
+ place-items: center;
220
+ height: var(--dry-space-8);
221
+ aspect-ratio: 1;
222
+ border: 1px solid var(--dry-range-calendar-nav-border, var(--dry-color-stroke-weak));
223
+ border-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
224
+ background: var(--dry-range-calendar-nav-bg, var(--dry-color-bg-raised));
225
+ color: var(--dry-range-calendar-nav-color, var(--dry-color-text-weak));
226
+ cursor: pointer;
227
+ transition:
228
+ background var(--dry-duration-fast) var(--dry-ease-default),
229
+ border-color var(--dry-duration-fast) var(--dry-ease-default),
230
+ color var(--dry-duration-fast) var(--dry-ease-default);
231
+ }
223
232
 
224
- [role='group'] > div:first-child button:hover:not([disabled]) {
225
- background: var(--dry-range-calendar-day-hover-bg);
226
- border-color: var(--dry-color-stroke-strong);
227
- }
233
+ [data-range-calendar-grid] [data-calendar-nav]:hover:not([disabled]) {
234
+ background: var(--dry-range-calendar-day-hover-bg, var(--dry-color-fill-hover));
235
+ border-color: var(--dry-color-stroke-strong);
236
+ color: var(--dry-color-text-strong);
237
+ }
228
238
 
229
- [role='group'] > div:first-child button:focus-visible {
230
- outline: 2px solid var(--dry-color-focus-ring);
231
- outline-offset: 1px;
232
- }
239
+ [data-range-calendar-grid] [data-calendar-nav]:focus-visible {
240
+ outline: 2px solid var(--dry-color-focus-ring);
241
+ outline-offset: 1px;
242
+ }
233
243
 
234
- [role='group'] > div:first-child span {
235
- font-size: var(--dry-type-small-size, var(--dry-type-small-size));
236
- font-weight: 600;
237
- letter-spacing: -0.01em;
238
- }
244
+ [data-range-calendar-grid] [data-calendar-heading] {
245
+ font-size: var(--dry-type-small-size, var(--dry-type-small-size));
246
+ font-weight: 700;
247
+ letter-spacing: -0.02em;
248
+ color: var(--dry-range-calendar-heading-color, var(--dry-color-text-strong));
249
+ }
239
250
 
240
- [role='grid'] {
241
- display: grid;
242
- gap: 1px;
243
- }
251
+ [data-range-calendar-grid] [role='grid'] {
252
+ display: grid;
253
+ gap: var(--dry-space-1);
254
+ }
244
255
 
245
- [role='row'] {
246
- display: grid;
247
- grid-template-columns: repeat(7, minmax(0, 1fr));
248
- gap: 1px;
249
- }
256
+ [data-range-calendar-grid] [data-calendar-row] {
257
+ display: grid;
258
+ grid-template-columns: repeat(7, minmax(0, 1fr));
259
+ gap: var(--dry-space-1);
260
+ }
250
261
 
251
- [role='columnheader'] {
252
- display: grid;
253
- place-items: center;
254
- min-height: var(--dry-space-8);
255
- font-size: var(--dry-type-tiny-size, var(--dry-type-tiny-size));
256
- color: var(--dry-range-calendar-outside-color);
257
- text-transform: uppercase;
258
- letter-spacing: 0.04em;
259
- }
262
+ [data-range-calendar-grid] [data-calendar-columnheader] {
263
+ display: grid;
264
+ place-items: center;
265
+ min-height: var(--dry-space-7);
266
+ font-size: calc(var(--dry-type-tiny-size, var(--dry-type-tiny-size)) * 0.92);
267
+ color: var(--dry-range-calendar-outside-color, var(--dry-color-text-weak));
268
+ text-transform: uppercase;
269
+ letter-spacing: 0.08em;
270
+ }
260
271
 
261
- [role='gridcell'] {
262
- display: grid;
263
- place-items: center;
264
- }
272
+ [data-range-calendar-grid] [data-calendar-cell] {
273
+ display: grid;
274
+ grid-template-columns: var(--dry-range-calendar-day-size, 2.5rem);
275
+ place-items: center;
276
+ padding-block: var(--dry-space-0_5);
277
+ border-radius: 0;
278
+ }
265
279
 
266
- [role='gridcell'] button {
267
- display: inline-grid;
268
- place-items: center;
269
- min-height: var(--dry-range-calendar-day-size);
270
- aspect-ratio: 1;
271
- border: none;
272
- border-radius: var(--dry-range-calendar-day-radius);
273
- background: transparent;
274
- color: var(--dry-color-text-strong);
275
- font: inherit;
276
- font-size: var(--dry-type-small-size, var(--dry-type-small-size));
277
- font-variant-numeric: tabular-nums;
278
- cursor: pointer;
279
- transition:
280
- background var(--dry-duration-fast) var(--dry-ease-default),
281
- color var(--dry-duration-fast) var(--dry-ease-default);
282
- }
280
+ [data-range-calendar-grid] [data-calendar-cell][data-in-range] {
281
+ background: var(
282
+ --dry-range-calendar-range-bg,
283
+ color-mix(in srgb, var(--dry-color-fill-brand) 14%, transparent)
284
+ );
285
+ }
283
286
 
284
- [role='gridcell'] button:hover:not([data-disabled]) {
285
- background: var(--dry-range-calendar-day-hover-bg);
286
- }
287
+ [data-range-calendar-grid] [data-calendar-cell][data-range-start][data-in-range] {
288
+ border-start-start-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
289
+ border-end-start-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
290
+ }
287
291
 
288
- [role='gridcell'] button:focus-visible {
289
- outline: 2px solid var(--dry-color-focus-ring);
290
- outline-offset: 1px;
291
- }
292
+ [data-range-calendar-grid] [data-calendar-cell][data-range-end][data-in-range] {
293
+ border-start-end-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
294
+ border-end-end-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
295
+ }
292
296
 
293
- [role='gridcell'] button[data-today]:not([data-range-start]):not([data-range-end]) {
294
- color: var(--dry-range-calendar-today-color);
295
- font-weight: 600;
296
- }
297
+ [data-range-calendar-grid] [data-calendar-cell][data-range-start][data-range-end] {
298
+ border-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
299
+ }
297
300
 
298
- [role='gridcell'] button[data-range-start],
299
- [role='gridcell'] button[data-range-end] {
300
- background: var(--dry-range-calendar-selected-bg);
301
- color: var(--dry-range-calendar-selected-color);
302
- font-weight: 600;
303
- }
301
+ [data-range-calendar-grid] [data-calendar-day-button] {
302
+ display: inline-grid;
303
+ place-items: center;
304
+ min-height: var(--dry-range-calendar-day-size, 2.5rem);
305
+ padding: 0;
306
+ aspect-ratio: 1;
307
+ border: 1px solid transparent;
308
+ border-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
309
+ background: transparent;
310
+ color: var(--dry-color-text-strong);
311
+ font: inherit;
312
+ font-size: var(--dry-type-small-size, var(--dry-type-small-size));
313
+ font-variant-numeric: tabular-nums;
314
+ font-weight: 500;
315
+ cursor: pointer;
316
+ transition:
317
+ background var(--dry-duration-fast) var(--dry-ease-default),
318
+ border-color var(--dry-duration-fast) var(--dry-ease-default),
319
+ color var(--dry-duration-fast) var(--dry-ease-default);
320
+ }
304
321
 
305
- [role='gridcell'] button[data-range-start]:hover:not([data-disabled]),
306
- [role='gridcell'] button[data-range-end]:hover:not([data-disabled]) {
307
- background: var(--dry-range-calendar-selected-hover-bg);
308
- }
322
+ [data-range-calendar-grid]
323
+ [data-calendar-day-button]:hover:not([data-disabled]):not([data-range-start]):not(
324
+ [data-range-end]
325
+ ) {
326
+ background: var(--dry-range-calendar-day-hover-bg, var(--dry-color-fill-hover));
327
+ }
309
328
 
310
- [role='gridcell'] button[data-in-range] {
311
- background: var(--dry-range-calendar-range-bg);
312
- border-radius: 0;
313
- }
329
+ [data-range-calendar-grid] [data-calendar-day-button]:focus-visible {
330
+ outline: 2px solid var(--dry-color-focus-ring);
331
+ outline-offset: 1px;
332
+ }
314
333
 
315
- [role='gridcell'] button[data-range-start],
316
- [role='gridcell'] button[data-range-end] {
317
- border-radius: var(--dry-range-calendar-day-radius);
318
- }
334
+ [data-range-calendar-grid]
335
+ [data-calendar-day-button][data-today]:not([data-range-start]):not([data-range-end]) {
336
+ border-color: color-mix(
337
+ in srgb,
338
+ var(--dry-range-calendar-today-color, var(--dry-color-text-brand)) 24%,
339
+ transparent
340
+ );
341
+ color: var(--dry-range-calendar-today-color, var(--dry-color-text-brand));
342
+ font-weight: 600;
343
+ }
319
344
 
320
- [role='gridcell'] button[data-outside-month] {
321
- color: var(--dry-range-calendar-outside-color);
322
- opacity: 0.6;
323
- }
345
+ [data-range-calendar-grid] [data-calendar-day-button][data-range-start],
346
+ [data-range-calendar-grid] [data-calendar-day-button][data-range-end] {
347
+ background: var(--dry-range-calendar-selected-bg, var(--dry-color-fill-brand));
348
+ color: var(--dry-range-calendar-selected-color, var(--dry-color-on-brand));
349
+ font-weight: 700;
350
+ }
324
351
 
325
- [role='gridcell'] button[data-disabled] {
326
- cursor: not-allowed;
327
- opacity: 0.4;
328
- pointer-events: none;
329
- }
352
+ [data-range-calendar-grid]
353
+ [data-calendar-day-button][data-range-start]:hover:not([data-disabled]),
354
+ [data-range-calendar-grid]
355
+ [data-calendar-day-button][data-range-end]:hover:not([data-disabled]) {
356
+ background: var(--dry-range-calendar-selected-hover-bg, var(--dry-color-fill-brand-hover));
357
+ }
358
+
359
+ [data-range-calendar-grid] [data-calendar-day-button][data-outside-month] {
360
+ color: var(--dry-range-calendar-outside-color, var(--dry-color-text-weak));
361
+ opacity: 0.55;
362
+ }
363
+
364
+ [data-range-calendar-grid] [data-calendar-day-button][data-disabled] {
365
+ cursor: not-allowed;
366
+ opacity: 0.35;
367
+ pointer-events: none;
330
368
  }
331
369
  </style>
@@ -112,23 +112,39 @@
112
112
 
113
113
  <style>
114
114
  [data-range-calendar-root] {
115
- --dry-range-calendar-bg: var(--dry-color-bg-overlay);
115
+ --dry-range-calendar-bg: var(--dry-color-bg-base);
116
116
  --dry-range-calendar-border: var(--dry-color-stroke-weak);
117
- --dry-range-calendar-radius: var(--dry-radius-lg);
118
- --dry-range-calendar-shadow: var(--dry-shadow-sm);
117
+ --dry-range-calendar-panel-bg: var(--dry-color-bg-overlay);
118
+ --dry-range-calendar-panel-border: color-mix(
119
+ in srgb,
120
+ var(--dry-color-stroke-strong) 18%,
121
+ transparent
122
+ );
123
+ --dry-range-calendar-heading-color: var(--dry-color-text-strong);
124
+ --dry-range-calendar-nav-bg: var(--dry-color-bg-raised);
125
+ --dry-range-calendar-nav-border: var(--dry-color-stroke-weak);
126
+ --dry-range-calendar-nav-color: var(--dry-color-text-weak);
127
+ --dry-range-calendar-radius: var(--dry-radius-xl);
128
+ --dry-range-calendar-shadow: var(--dry-shadow-raised, var(--dry-shadow-sm));
119
129
  --dry-range-calendar-padding: var(--dry-space-3);
120
- --dry-range-calendar-day-size: 2.25rem;
130
+ --dry-range-calendar-day-size: 2.5rem;
121
131
  --dry-range-calendar-day-radius: var(--dry-radius-md);
122
- --dry-range-calendar-day-hover-bg: var(--dry-color-bg-raised);
132
+ --dry-range-calendar-day-hover-bg: var(--dry-color-fill-hover);
123
133
  --dry-range-calendar-selected-bg: var(--dry-color-fill-brand);
124
134
  --dry-range-calendar-selected-color: var(--dry-color-on-brand);
125
135
  --dry-range-calendar-selected-hover-bg: var(--dry-color-fill-brand-hover);
126
- --dry-range-calendar-range-bg: color-mix(in srgb, var(--dry-color-fill-brand) 15%, transparent);
127
- --dry-range-calendar-today-color: var(--dry-color-fill-brand);
136
+ --dry-range-calendar-range-bg: color-mix(
137
+ in srgb,
138
+ var(--dry-color-fill-brand) 14%,
139
+ transparent
140
+ );
141
+ --dry-range-calendar-today-color: var(--dry-color-text-brand);
128
142
  --dry-range-calendar-outside-color: var(--dry-color-text-weak);
129
143
 
130
- display: grid;
144
+ display: inline-grid;
131
145
  box-sizing: border-box;
146
+ justify-items: start;
147
+ gap: var(--dry-space-3);
132
148
  padding: var(--dry-range-calendar-padding);
133
149
  background: var(--dry-range-calendar-bg);
134
150
  border: 1px solid var(--dry-range-calendar-border);
@@ -137,6 +153,4 @@
137
153
  color: var(--dry-color-text-strong);
138
154
  font-family: var(--dry-font-sans);
139
155
  }
140
-
141
-
142
156
  </style>
@@ -78,6 +78,7 @@
78
78
  <div bind:this={wrapperEl} data-select-trigger-wrap>
79
79
  <button type="button" data-select-trigger data-size={size} class={className} {...rest}>
80
80
  {@render children()}
81
+ <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"><path d="m6 9 6 6 6-6"/></svg>
81
82
  </button>
82
83
  </div>
83
84
 
@@ -97,6 +98,7 @@
97
98
  display: grid;
98
99
  grid-template-columns: 1fr 1.5rem;
99
100
  align-items: center;
101
+ gap: var(--dry-space-2);
100
102
  padding: var(--dry-select-padding-y) var(--dry-select-padding-x);
101
103
  font-size: var(--dry-select-font-size);
102
104
  line-height: var(--dry-type-small-leading);
@@ -114,20 +116,15 @@
114
116
  box-shadow var(--dry-duration-fast) var(--dry-ease-default);
115
117
  }
116
118
 
117
- [data-select-trigger]::after {
118
- content: '';
119
+ [data-select-trigger] [data-indicator] {
119
120
  height: 1em;
120
121
  aspect-ratio: 1;
121
122
  place-self: center;
122
- background: currentColor;
123
- 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='m6 9 6 6 6-6'/%3E%3C/svg%3E");
124
- mask-size: contain;
125
- mask-repeat: no-repeat;
126
- mask-position: center;
123
+ opacity: 0.5;
127
124
  transition: transform var(--dry-duration-fast) var(--dry-ease-default);
128
125
  }
129
126
 
130
- [data-select-trigger][data-state='open']::after {
127
+ [data-select-trigger][data-state='open'] [data-indicator] {
131
128
  transform: rotate(180deg);
132
129
  }
133
130