@dryui/ui 1.1.1 → 1.1.2
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/calendar/calendar-button-grid.svelte +40 -140
- package/dist/date-picker/datepicker-button-calendar.svelte +46 -202
- package/dist/date-range-picker/date-range-picker-button-calendar.svelte +64 -239
- package/dist/image/image.svelte +4 -1
- package/dist/internal/calendar-grid-button.svelte +260 -0
- package/dist/internal/calendar-grid-button.svelte.d.ts +27 -0
- package/dist/internal/calendar-grid-utils.js +1 -1
- package/dist/number-input/number-input-button.svelte +2 -3
- package/dist/range-calendar/range-calendar-grid-button.svelte +41 -243
- package/dist/video-embed/video-embed-button.svelte +6 -0
- package/package.json +2 -2
|
@@ -1,43 +1,17 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
-
import
|
|
3
|
+
import { isSameDay } from '@dryui/primitives';
|
|
4
4
|
import { getRangeCalendarCtx } from './context.svelte.js';
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
isToday,
|
|
9
|
-
isDateInRange,
|
|
10
|
-
formatDate
|
|
11
|
-
} from '@dryui/primitives';
|
|
12
|
-
import {
|
|
13
|
-
generateWeekdayLabels,
|
|
14
|
-
splitIntoWeeks,
|
|
15
|
-
getDayISOString,
|
|
16
|
-
handleCalendarKeydown,
|
|
17
|
-
focusCalendarDay
|
|
18
|
-
} from '../internal/calendar-grid-utils.js';
|
|
5
|
+
import CalendarGridButton, {
|
|
6
|
+
type CalendarGridAdapter
|
|
7
|
+
} from '../internal/calendar-grid-button.svelte';
|
|
19
8
|
|
|
20
9
|
interface Props extends HTMLAttributes<HTMLDivElement> {}
|
|
21
10
|
|
|
22
|
-
let
|
|
11
|
+
let props: Props = $props();
|
|
23
12
|
|
|
24
13
|
const ctx = getRangeCalendarCtx();
|
|
25
14
|
|
|
26
|
-
let gridEl = $state<HTMLDivElement | undefined>();
|
|
27
|
-
|
|
28
|
-
const weekdayLabels = $derived(generateWeekdayLabels(ctx.locale, ctx.weekStartDay));
|
|
29
|
-
|
|
30
|
-
const calendarDays = $derived(getCalendarDays(ctx.viewYear, ctx.viewMonth, ctx.weekStartDay));
|
|
31
|
-
|
|
32
|
-
const monthYearLabel = $derived(
|
|
33
|
-
formatDate(new Date(ctx.viewYear, ctx.viewMonth, 1), ctx.locale, {
|
|
34
|
-
month: 'long',
|
|
35
|
-
year: 'numeric'
|
|
36
|
-
})
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
const weeks = $derived(splitIntoWeeks(calendarDays));
|
|
40
|
-
|
|
41
15
|
function isInRange(day: Date): boolean {
|
|
42
16
|
const start = ctx.startDate;
|
|
43
17
|
const end = ctx.endDate ?? ctx.hoveredDate;
|
|
@@ -63,217 +37,41 @@
|
|
|
63
37
|
return isSameDay(day, hi);
|
|
64
38
|
}
|
|
65
39
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
}
|
|
40
|
+
const adapter: CalendarGridAdapter = {
|
|
41
|
+
get viewYear() {
|
|
42
|
+
return ctx.viewYear;
|
|
43
|
+
},
|
|
44
|
+
get viewMonth() {
|
|
45
|
+
return ctx.viewMonth;
|
|
46
|
+
},
|
|
47
|
+
get locale() {
|
|
48
|
+
return ctx.locale;
|
|
49
|
+
},
|
|
50
|
+
get weekStartDay() {
|
|
51
|
+
return ctx.weekStartDay;
|
|
52
|
+
},
|
|
53
|
+
get focusedDate() {
|
|
54
|
+
return ctx.focusedDate;
|
|
55
|
+
},
|
|
56
|
+
get min() {
|
|
57
|
+
return ctx.min;
|
|
58
|
+
},
|
|
59
|
+
get max() {
|
|
60
|
+
return ctx.max;
|
|
61
|
+
},
|
|
62
|
+
get disabled() {
|
|
63
|
+
return ctx.disabled;
|
|
64
|
+
},
|
|
65
|
+
isSelected: (day) => isRangeStart(day) || isRangeEnd(day),
|
|
66
|
+
isInRange,
|
|
67
|
+
isRangeStart,
|
|
68
|
+
isRangeEnd,
|
|
69
|
+
selectDate: (day) => ctx.selectDate(day),
|
|
70
|
+
setFocusedDate: (day) => ctx.setFocusedDate(day),
|
|
71
|
+
prevMonth: () => ctx.prevMonth(),
|
|
72
|
+
nextMonth: () => ctx.nextMonth(),
|
|
73
|
+
onHover: (day) => ctx.setHoveredDate(day)
|
|
74
|
+
};
|
|
104
75
|
</script>
|
|
105
76
|
|
|
106
|
-
<
|
|
107
|
-
<div data-calendar-panel role="group" aria-label={monthYearLabel}>
|
|
108
|
-
<div data-calendar-header>
|
|
109
|
-
<Button
|
|
110
|
-
variant="outline"
|
|
111
|
-
size="icon-sm"
|
|
112
|
-
type="button"
|
|
113
|
-
aria-label="Previous month"
|
|
114
|
-
onclick={() => ctx.prevMonth()}
|
|
115
|
-
>
|
|
116
|
-
‹
|
|
117
|
-
</Button>
|
|
118
|
-
<span data-calendar-heading aria-live="polite" aria-atomic="true">
|
|
119
|
-
{monthYearLabel}
|
|
120
|
-
</span>
|
|
121
|
-
<Button
|
|
122
|
-
variant="outline"
|
|
123
|
-
size="icon-sm"
|
|
124
|
-
type="button"
|
|
125
|
-
aria-label="Next month"
|
|
126
|
-
onclick={() => ctx.nextMonth()}
|
|
127
|
-
>
|
|
128
|
-
›
|
|
129
|
-
</Button>
|
|
130
|
-
</div>
|
|
131
|
-
|
|
132
|
-
<div role="grid" aria-label={monthYearLabel}>
|
|
133
|
-
<div data-calendar-row role="row">
|
|
134
|
-
{#each weekdayLabels as label (label)}
|
|
135
|
-
<div data-calendar-columnheader role="columnheader" aria-label={label}>
|
|
136
|
-
<span aria-hidden="true">{label}</span>
|
|
137
|
-
</div>
|
|
138
|
-
{/each}
|
|
139
|
-
</div>
|
|
140
|
-
|
|
141
|
-
{#each weeks as week (week[0]?.getTime() ?? 0)}
|
|
142
|
-
<div data-calendar-row role="row">
|
|
143
|
-
{#each week as day (day.getTime())}
|
|
144
|
-
{@const isCurrent = day.getMonth() === ctx.viewMonth}
|
|
145
|
-
{@const inRange = isInRange(day)}
|
|
146
|
-
{@const rangeStart = isRangeStart(day)}
|
|
147
|
-
{@const rangeEnd = isRangeEnd(day)}
|
|
148
|
-
{@const today = isToday(day)}
|
|
149
|
-
{@const disabled = isDayDisabled(day)}
|
|
150
|
-
{@const focused = isSameDay(day, ctx.focusedDate)}
|
|
151
|
-
{@const isoStr = getDayISOString(day)}
|
|
152
|
-
<div
|
|
153
|
-
data-calendar-cell
|
|
154
|
-
data-in-range={inRange ? '' : undefined}
|
|
155
|
-
data-range-start={rangeStart ? '' : undefined}
|
|
156
|
-
data-range-end={rangeEnd ? '' : undefined}
|
|
157
|
-
>
|
|
158
|
-
<Button
|
|
159
|
-
variant="trigger"
|
|
160
|
-
size="icon-sm"
|
|
161
|
-
type="button"
|
|
162
|
-
role="gridcell"
|
|
163
|
-
tabindex={focused ? 0 : -1}
|
|
164
|
-
aria-label={formatDate(day, ctx.locale, {
|
|
165
|
-
year: 'numeric',
|
|
166
|
-
month: 'long',
|
|
167
|
-
day: 'numeric'
|
|
168
|
-
})}
|
|
169
|
-
aria-current={today ? 'date' : undefined}
|
|
170
|
-
aria-selected={inRange || undefined}
|
|
171
|
-
aria-disabled={disabled}
|
|
172
|
-
data-calendar-day={isoStr}
|
|
173
|
-
data-today={today ? '' : undefined}
|
|
174
|
-
data-in-range={inRange ? '' : undefined}
|
|
175
|
-
data-range-start={rangeStart ? '' : undefined}
|
|
176
|
-
data-range-end={rangeEnd ? '' : undefined}
|
|
177
|
-
data-outside-month={!isCurrent ? '' : undefined}
|
|
178
|
-
{disabled}
|
|
179
|
-
onclick={() => handleDayClick(day)}
|
|
180
|
-
onkeydown={(e) => handleDayKeydown(e, day)}
|
|
181
|
-
onmouseenter={() => ctx.setHoveredDate(day)}
|
|
182
|
-
onmouseleave={() => ctx.setHoveredDate(null)}
|
|
183
|
-
>
|
|
184
|
-
{day.getDate()}
|
|
185
|
-
</Button>
|
|
186
|
-
</div>
|
|
187
|
-
{/each}
|
|
188
|
-
</div>
|
|
189
|
-
{/each}
|
|
190
|
-
</div>
|
|
191
|
-
</div>
|
|
192
|
-
</div>
|
|
193
|
-
|
|
194
|
-
<style>
|
|
195
|
-
[data-range-calendar-grid] {
|
|
196
|
-
display: grid;
|
|
197
|
-
gap: var(--dry-space-2);
|
|
198
|
-
user-select: none;
|
|
199
|
-
color: var(--dry-color-text-strong);
|
|
200
|
-
font-family: var(--dry-font-sans);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
[data-range-calendar-grid] [data-calendar-panel] {
|
|
204
|
-
display: grid;
|
|
205
|
-
gap: var(--dry-space-3);
|
|
206
|
-
padding: var(--dry-space-3);
|
|
207
|
-
background: var(--dry-range-calendar-panel-bg, var(--dry-color-bg-overlay));
|
|
208
|
-
border: 1px solid var(--dry-range-calendar-panel-border, var(--dry-color-stroke-weak));
|
|
209
|
-
border-radius: calc(
|
|
210
|
-
var(--dry-range-calendar-radius, var(--dry-radius-lg)) - var(--dry-space-1)
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
[data-range-calendar-grid] [data-calendar-header] {
|
|
215
|
-
display: grid;
|
|
216
|
-
grid-template-columns: auto 1fr auto;
|
|
217
|
-
align-items: center;
|
|
218
|
-
gap: var(--dry-space-2);
|
|
219
|
-
padding-block-end: var(--dry-space-1);
|
|
220
|
-
border-block-end: 1px solid
|
|
221
|
-
color-mix(
|
|
222
|
-
in srgb,
|
|
223
|
-
var(--dry-range-calendar-panel-border, var(--dry-color-stroke-weak)) 70%,
|
|
224
|
-
transparent
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
[data-range-calendar-grid] [data-calendar-heading] {
|
|
229
|
-
font-size: var(--dry-type-small-size);
|
|
230
|
-
font-weight: 700;
|
|
231
|
-
letter-spacing: -0.02em;
|
|
232
|
-
color: var(--dry-range-calendar-heading-color, var(--dry-color-text-strong));
|
|
233
|
-
text-align: center;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
[data-range-calendar-grid] [role='grid'] {
|
|
237
|
-
display: grid;
|
|
238
|
-
gap: var(--dry-space-1);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
[data-range-calendar-grid] [data-calendar-row] {
|
|
242
|
-
display: grid;
|
|
243
|
-
grid-template-columns: repeat(7, minmax(0, 1fr));
|
|
244
|
-
gap: var(--dry-space-1);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
[data-range-calendar-grid] [data-calendar-columnheader] {
|
|
248
|
-
display: grid;
|
|
249
|
-
place-items: center;
|
|
250
|
-
min-height: var(--dry-space-7);
|
|
251
|
-
font-size: calc(var(--dry-type-tiny-size) * 0.92);
|
|
252
|
-
color: var(--dry-range-calendar-outside-color, var(--dry-color-text-weak));
|
|
253
|
-
text-transform: uppercase;
|
|
254
|
-
letter-spacing: 0.08em;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
[data-range-calendar-grid] [data-calendar-cell] {
|
|
258
|
-
display: grid;
|
|
259
|
-
place-items: center;
|
|
260
|
-
padding-block: var(--dry-space-0_5);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
[data-range-calendar-grid] [data-calendar-cell][data-in-range] {
|
|
264
|
-
background: var(
|
|
265
|
-
--dry-range-calendar-range-bg,
|
|
266
|
-
color-mix(in srgb, var(--dry-color-fill-brand) 14%, transparent)
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
[data-range-calendar-grid] [data-calendar-cell][data-range-start][data-in-range] {
|
|
271
|
-
border-start-start-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
|
|
272
|
-
border-end-start-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
[data-range-calendar-grid] [data-calendar-cell][data-range-end][data-in-range] {
|
|
276
|
-
border-start-end-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
|
|
277
|
-
border-end-end-radius: var(--dry-range-calendar-day-radius, var(--dry-radius-md));
|
|
278
|
-
}
|
|
279
|
-
</style>
|
|
77
|
+
<CalendarGridButton {adapter} {...props} />
|
|
@@ -79,6 +79,8 @@
|
|
|
79
79
|
data-part="media"
|
|
80
80
|
src={embedSrc}
|
|
81
81
|
{title}
|
|
82
|
+
width="100%"
|
|
83
|
+
height="100%"
|
|
82
84
|
controls
|
|
83
85
|
autoplay={autoplay || activated}
|
|
84
86
|
{poster}
|
|
@@ -90,6 +92,8 @@
|
|
|
90
92
|
data-part="media"
|
|
91
93
|
src={embedSrc}
|
|
92
94
|
{title}
|
|
95
|
+
width="100%"
|
|
96
|
+
height="100%"
|
|
93
97
|
frameborder="0"
|
|
94
98
|
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
95
99
|
allowfullscreen
|
|
@@ -136,6 +140,8 @@
|
|
|
136
140
|
}
|
|
137
141
|
|
|
138
142
|
[data-video-embed] [data-part='media'] {
|
|
143
|
+
position: absolute;
|
|
144
|
+
inset: 0;
|
|
139
145
|
height: 100%;
|
|
140
146
|
object-fit: cover;
|
|
141
147
|
border: 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dryui/ui",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"author": "Rob Balfre",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -770,7 +770,7 @@
|
|
|
770
770
|
"postpack": "bun ../../scripts/postpack-exports.ts"
|
|
771
771
|
},
|
|
772
772
|
"dependencies": {
|
|
773
|
-
"@dryui/primitives": "^1.1.
|
|
773
|
+
"@dryui/primitives": "^1.1.2"
|
|
774
774
|
},
|
|
775
775
|
"peerDependencies": {
|
|
776
776
|
"svelte": "^5.55.1"
|