@dryui/ui 0.1.3 → 0.1.4
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.
- package/dist/accordion/accordion-trigger.svelte +5 -6
- package/dist/alert-dialog/alert-dialog-action.svelte +42 -6
- package/dist/alert-dialog/alert-dialog-cancel.svelte +44 -5
- package/dist/alert-dialog/alert-dialog-footer.svelte +3 -2
- package/dist/aurora/aurora.svelte.d.ts +6 -0
- package/dist/beam/beam.svelte +17 -10
- package/dist/chromatic-aberration/chromatic-aberration.svelte +60 -18
- package/dist/collapsible/collapsible-trigger.svelte +4 -7
- package/dist/color-picker/color-picker-eyedropper.svelte +4 -11
- package/dist/data-grid/data-grid-pagination.svelte +20 -2
- package/dist/data-grid/data-grid-root.svelte +1 -0
- package/dist/date-field/date-field-root.svelte +66 -20
- package/dist/date-field/date-field-segment.svelte +11 -9
- package/dist/date-field/date-field-separator.svelte +9 -1
- package/dist/date-picker/datepicker-calendar.svelte +168 -13
- package/dist/date-picker/datepicker-trigger.svelte +3 -8
- package/dist/date-range-picker/date-range-picker-calendar.svelte +177 -13
- package/dist/date-range-picker/date-range-picker-trigger.svelte +18 -12
- package/dist/dialog/dialog-content.svelte +1 -0
- package/dist/field/field-root.svelte +0 -1
- package/dist/file-select/file-select-clear.svelte +2 -8
- package/dist/file-upload/file-upload-item-delete.svelte +4 -7
- package/dist/flip-card/flip-card-back.svelte +2 -2
- package/dist/flip-card/flip-card-front.svelte +2 -2
- package/dist/flip-card/flip-card-root.svelte +2 -0
- package/dist/float-button/float-button-root.svelte +2 -1
- package/dist/image-comparison/image-comparison.svelte +16 -24
- package/dist/input-group/input-group-action.svelte +5 -0
- package/dist/input-group/input-group-input.svelte +7 -2
- package/dist/input-group/input-group-prefix.svelte +5 -0
- package/dist/input-group/input-group-root.svelte +10 -2
- package/dist/input-group/input-group-select.svelte +5 -0
- package/dist/input-group/input-group-separator.svelte +10 -0
- package/dist/input-group/input-group-suffix.svelte +5 -0
- package/dist/option-swatch-group/option-swatch-group-item.svelte +46 -0
- package/dist/option-swatch-group/option-swatch-group-label.svelte +10 -0
- package/dist/option-swatch-group/option-swatch-group-meta.svelte +10 -0
- package/dist/option-swatch-group/option-swatch-group-root.svelte +0 -79
- package/dist/option-swatch-group/option-swatch-group-swatch.svelte +25 -6
- package/dist/pin-input/pin-input-cell.svelte +4 -1
- package/dist/range-calendar/range-calendar-grid.svelte +219 -181
- package/dist/range-calendar/range-calendar-root.svelte +24 -10
- package/dist/select/select-trigger.svelte +5 -8
- package/dist/system-map/system-map.svelte +120 -674
- package/dist/tags-input/tags-input-input.svelte +3 -0
- package/dist/tags-input/tags-input-root.svelte +4 -13
- package/dist/tags-input/tags-input-tag.svelte +3 -0
- package/dist/themes/dark.css +6 -0
- package/dist/themes/default.css +3 -0
- package/dist/toast/toast-action.svelte +1 -0
- package/dist/toast/toast-close.svelte +4 -0
- package/dist/toast/toast-provider.svelte +5 -26
- package/dist/toast/toast-root.svelte +5 -10
- package/package.json +3 -3
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
3
|
import { getDateFieldCtx, type DateSegmentType } from './context.svelte.js';
|
|
4
|
-
import { onMount } from 'svelte';
|
|
5
4
|
|
|
6
5
|
interface Props extends HTMLAttributes<HTMLSpanElement> {
|
|
7
6
|
type: DateSegmentType;
|
|
@@ -11,13 +10,6 @@
|
|
|
11
10
|
|
|
12
11
|
const ctx = getDateFieldCtx();
|
|
13
12
|
|
|
14
|
-
let el: HTMLSpanElement;
|
|
15
|
-
|
|
16
|
-
onMount(() => {
|
|
17
|
-
ctx.registerSegment(type, el);
|
|
18
|
-
return () => ctx.unregisterSegment(type);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
13
|
const segmentData = $derived(ctx.segments.find((s) => s.type === type));
|
|
22
14
|
|
|
23
15
|
const minValue = $derived(type === 'month' ? 1 : type === 'day' ? 1 : 1000);
|
|
@@ -35,6 +27,15 @@
|
|
|
35
27
|
let inputBuffer = '';
|
|
36
28
|
let bufferTimeout: ReturnType<typeof setTimeout>;
|
|
37
29
|
|
|
30
|
+
function registerSegment(node: HTMLSpanElement) {
|
|
31
|
+
ctx.registerSegment(type, node);
|
|
32
|
+
return {
|
|
33
|
+
destroy() {
|
|
34
|
+
ctx.unregisterSegment(type);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
38
39
|
function increment() {
|
|
39
40
|
const current = segmentData?.value ?? minValue - 1;
|
|
40
41
|
const next = current >= maxValue ? minValue : current + 1;
|
|
@@ -111,7 +112,7 @@
|
|
|
111
112
|
</script>
|
|
112
113
|
|
|
113
114
|
<span
|
|
114
|
-
|
|
115
|
+
{@attach registerSegment}
|
|
115
116
|
role="spinbutton"
|
|
116
117
|
tabindex={ctx.disabled ? undefined : 0}
|
|
117
118
|
aria-label={type}
|
|
@@ -119,6 +120,7 @@
|
|
|
119
120
|
aria-valuemax={maxValue}
|
|
120
121
|
aria-valuenow={segmentData?.value ?? undefined}
|
|
121
122
|
aria-valuetext={displayValue}
|
|
123
|
+
data-df-segment
|
|
122
124
|
data-segment={type}
|
|
123
125
|
data-placeholder={segmentData?.value === null ? '' : undefined}
|
|
124
126
|
data-disabled={ctx.disabled || undefined}
|
|
@@ -13,7 +13,15 @@
|
|
|
13
13
|
const display = $derived(separator ?? ctx.separator);
|
|
14
14
|
</script>
|
|
15
15
|
|
|
16
|
-
<span
|
|
16
|
+
<span
|
|
17
|
+
aria-hidden="true"
|
|
18
|
+
data-df-separator
|
|
19
|
+
data-separator=""
|
|
20
|
+
{...rest}
|
|
21
|
+
class={className}
|
|
22
|
+
>
|
|
23
|
+
{display}
|
|
24
|
+
</span>
|
|
17
25
|
|
|
18
26
|
<style>
|
|
19
27
|
[data-df-separator] {
|
|
@@ -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
|
|
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
|
|
78
|
-
|
|
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
|
|
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]
|
|
98
|
-
content: '';
|
|
99
|
-
aspect-ratio: 1;
|
|
98
|
+
[data-dp-trigger] [data-indicator] {
|
|
100
99
|
height: 1rem;
|
|
101
|
-
|
|
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
|
|
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
|
|
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
|
‹
|
|
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
|
|
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
|
›
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
ctx.triggerEl =
|
|
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
|
-
|
|
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]
|
|
87
|
-
content: '';
|
|
88
|
-
aspect-ratio: 1;
|
|
97
|
+
[data-drp-trigger] [data-indicator] {
|
|
89
98
|
height: 1rem;
|
|
90
|
-
|
|
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)));
|
|
@@ -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]
|
|
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 {
|