@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.
@@ -1,43 +1,17 @@
1
1
  <script lang="ts">
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
- import Button from '../button/button.svelte';
3
+ import { isSameDay } from '@dryui/primitives';
4
4
  import { getRangeCalendarCtx } from './context.svelte.js';
5
- import {
6
- getCalendarDays,
7
- isSameDay,
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 { class: className, ...rest }: Props = $props();
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
- function handleDayClick(day: Date) {
67
- if (!isDateInRange(day, ctx.min, ctx.max)) return;
68
- ctx.selectDate(day);
69
- }
70
-
71
- function handleDayKeydown(e: KeyboardEvent, day: Date) {
72
- const result = handleCalendarKeydown(e, day, {
73
- onSelect: (date) => {
74
- if (isDateInRange(date, ctx.min, ctx.max)) {
75
- ctx.selectDate(date);
76
- }
77
- },
78
- onEscape: () => {},
79
- setFocusedDate: (date) => ctx.setFocusedDate(date),
80
- weekStartDay: ctx.weekStartDay,
81
- min: ctx.min,
82
- max: ctx.max
83
- });
84
- if (result?.type === 'navigate') {
85
- requestAnimationFrame(() => focusCalendarDay(gridEl, result.newDate));
86
- }
87
- }
88
-
89
- function isDayDisabled(day: Date): boolean {
90
- return !isDateInRange(day, ctx.min, ctx.max);
91
- }
92
-
93
- function captureGrid(node: HTMLDivElement) {
94
- gridEl = node;
95
-
96
- return {
97
- destroy() {
98
- if (gridEl === node) {
99
- gridEl = undefined;
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
- <div {@attach captureGrid} data-range-calendar-grid class={className} {...rest}>
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
- &#8249;
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
- &#8250;
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.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.1"
773
+ "@dryui/primitives": "^1.1.2"
774
774
  },
775
775
  "peerDependencies": {
776
776
  "svelte": "^5.55.1"