noph-ui 0.52.0 → 0.53.1
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/animation.d.ts +1 -13
- package/dist/animation.js +18 -13
- package/dist/button/Button.svelte +2 -14
- package/dist/button/IconButton.svelte +5 -18
- package/dist/button/SegmentedButton.svelte +8 -11
- package/dist/card/Card.svelte +3 -19
- package/dist/card/types.d.ts +12 -2
- package/dist/carousel/Carousel.svelte +77 -14
- package/dist/carousel/CarouselItem.svelte +26 -14
- package/dist/carousel/carouselMorph.js +1 -1
- package/dist/carousel/carouselStrategy.js +25 -27
- package/dist/checkbox/Checkbox.svelte +1 -8
- package/dist/chip/FilterChip.svelte +1 -13
- package/dist/date-picker/Calendar.svelte +31 -30
- package/dist/date-picker/Calendar.svelte.d.ts +2 -0
- package/dist/date-picker/CalendarHeader.svelte +84 -62
- package/dist/date-picker/CalendarHeader.svelte.d.ts +3 -0
- package/dist/date-picker/DatePickerDialog.svelte +134 -75
- package/dist/date-picker/DatePickerDialog.svelte.d.ts +4 -3
- package/dist/date-picker/DateRangePicker.svelte +226 -78
- package/dist/date-picker/DateRangePicker.svelte.d.ts +3 -3
- package/dist/date-picker/DockedDatePicker.svelte +76 -464
- package/dist/date-picker/DockedDatePicker.svelte.d.ts +2 -2
- package/dist/date-picker/DockedDateTimePicker.svelte +128 -525
- package/dist/date-picker/DockedDateTimePicker.svelte.d.ts +2 -2
- package/dist/date-picker/DockedPickerField.svelte +221 -0
- package/dist/date-picker/DockedPickerField.svelte.d.ts +9 -0
- package/dist/date-picker/MonthPanel.svelte +291 -0
- package/dist/date-picker/MonthPanel.svelte.d.ts +12 -0
- package/dist/date-picker/SelectionList.svelte +7 -6
- package/dist/date-picker/SelectionList.svelte.d.ts +1 -0
- package/dist/date-picker/TimeColumn.svelte +2 -6
- package/dist/date-picker/TimeColumn.svelte.d.ts +1 -0
- package/dist/date-picker/YearGrid.svelte +2 -11
- package/dist/date-picker/YearGrid.svelte.d.ts +1 -0
- package/dist/date-picker/dateUtils.d.ts +4 -0
- package/dist/date-picker/dateUtils.js +15 -88
- package/dist/date-picker/exitVisibility.svelte.js +13 -6
- package/dist/date-picker/formatters.d.ts +16 -0
- package/dist/date-picker/formatters.js +48 -15
- package/dist/date-picker/internalTypes.d.ts +59 -1
- package/dist/date-picker/shortcuts.d.ts +11 -0
- package/dist/date-picker/shortcuts.js +40 -0
- package/dist/date-picker/timeUtils.d.ts +8 -3
- package/dist/date-picker/timeUtils.js +33 -51
- package/dist/date-picker/types.d.ts +22 -0
- package/dist/icons/Icon.svelte +1 -4
- package/dist/internal/exit.css +0 -14
- package/dist/internal/field.css +337 -0
- package/dist/internal/focus-ring.css +23 -8
- package/dist/internal/pop-in.css +19 -0
- package/dist/internal/visually-hidden.css +11 -0
- package/dist/list/Item.svelte +32 -18
- package/dist/menu/Menu.svelte +6 -25
- package/dist/menu/Menu.svelte.d.ts +1 -0
- package/dist/navigation-bar/NavigationBarItem.svelte +6 -30
- package/dist/navigation-drawer/NavigationDrawerItem.svelte +4 -11
- package/dist/navigation-rail/NavigationRail.svelte +2 -3
- package/dist/navigation-rail/NavigationRailItem.svelte +2 -13
- package/dist/press.svelte.d.ts +0 -1
- package/dist/press.svelte.js +0 -11
- package/dist/progress/CircularProgress.svelte +26 -81
- package/dist/progress/CircularProgress.svelte.d.ts +1 -0
- package/dist/progress/LinearProgress.svelte +19 -151
- package/dist/progress/LinearProgress.svelte.d.ts +1 -0
- package/dist/progress/four-color.css +34 -0
- package/dist/radio/Radio.svelte +6 -9
- package/dist/ripple/Ripple.svelte +8 -16
- package/dist/search/Search.svelte +2 -9
- package/dist/search/Search.svelte.d.ts +1 -0
- package/dist/select/Check.svelte +8 -31
- package/dist/select/Check.svelte.d.ts +1 -1
- package/dist/select/NativeSelect.svelte +97 -366
- package/dist/select/NativeSelect.svelte.d.ts +1 -0
- package/dist/select/Option.svelte +1 -9
- package/dist/select/Select.svelte +139 -746
- package/dist/select/Select.svelte.d.ts +1 -0
- package/dist/select/VirtualList.svelte +0 -1
- package/dist/sheet/Sheet.svelte +11 -22
- package/dist/slider/Slider.svelte +13 -37
- package/dist/slider/Slider.svelte.d.ts +1 -0
- package/dist/switch/Switch.svelte +2 -8
- package/dist/tabs/Tab.svelte +2 -4
- package/dist/text-field/TextField.svelte +81 -609
- package/dist/text-field/TextField.svelte.d.ts +1 -0
- package/dist/time-picker/ClockDial.svelte +8 -25
- package/dist/time-picker/ClockDial.svelte.d.ts +2 -0
- package/dist/time-picker/DockedTimePicker.svelte +102 -244
- package/dist/time-picker/DockedTimePicker.svelte.d.ts +2 -2
- package/dist/time-picker/PeriodSelector.svelte +8 -7
- package/dist/time-picker/PeriodSelector.svelte.d.ts +1 -0
- package/dist/time-picker/TimeInputs.svelte +13 -2
- package/dist/time-picker/TimePickerDialog.svelte +32 -26
- package/dist/time-picker/TimePickerDialog.svelte.d.ts +2 -2
- package/dist/time-picker/TimePickerPanel.svelte +26 -4
- package/dist/time-picker/TimeSelectors.svelte +4 -9
- package/dist/time-picker/TimeSelectors.svelte.d.ts +1 -0
- package/dist/time-picker/internalTypes.d.ts +2 -0
- package/dist/time-picker/timePickerState.svelte.js +3 -9
- package/dist/tooltip/RichTooltip.svelte +2 -23
- package/dist/tooltip/RichTooltip.svelte.d.ts +1 -0
- package/dist/tooltip/Tooltip.svelte +2 -24
- package/dist/tooltip/Tooltip.svelte.d.ts +1 -0
- package/package.json +12 -12
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import
|
|
2
|
+
import '../internal/focus-ring.css'
|
|
3
|
+
import { afterTwoFrames, morphSize } from '../animation.js'
|
|
3
4
|
import Button from '../button/Button.svelte'
|
|
4
5
|
import IconButton from '../button/IconButton.svelte'
|
|
5
6
|
import Dialog from '../dialog/Dialog.svelte'
|
|
6
|
-
import { syncOpenEffect } from '../popover.svelte.js'
|
|
7
7
|
import Divider from '../divider/Divider.svelte'
|
|
8
8
|
import { exitVisibility } from './exitVisibility.svelte.js'
|
|
9
9
|
import ArrowDropDownIcon from '../icons/ArrowDropDownIcon.svelte'
|
|
@@ -11,17 +11,20 @@
|
|
|
11
11
|
import ChevronLeftIcon from '../icons/ChevronLeftIcon.svelte'
|
|
12
12
|
import ChevronRightIcon from '../icons/ChevronRightIcon.svelte'
|
|
13
13
|
import EditCalendarIcon from '../icons/EditCalendarIcon.svelte'
|
|
14
|
+
import Ripple from '../ripple/Ripple.svelte'
|
|
14
15
|
import TextField from '../text-field/TextField.svelte'
|
|
15
|
-
import
|
|
16
|
+
import Tooltip from '../tooltip/Tooltip.svelte'
|
|
17
|
+
import { flushSync, tick } from 'svelte'
|
|
16
18
|
import Calendar from './Calendar.svelte'
|
|
17
19
|
import YearGrid from './YearGrid.svelte'
|
|
20
|
+
import { DEFAULT_SHORTCUT_LABELS, pickerShortcut, withShortcut } from './shortcuts.js'
|
|
18
21
|
import {
|
|
19
22
|
addMonths,
|
|
20
23
|
clampMonthInYear,
|
|
21
|
-
|
|
24
|
+
isMonthWithin,
|
|
22
25
|
DEFAULT_YEAR_RANGE,
|
|
23
26
|
formatDate,
|
|
24
|
-
|
|
27
|
+
formatDateHeadline,
|
|
25
28
|
formatMonthYear,
|
|
26
29
|
getDatePattern,
|
|
27
30
|
getFirstDayOfWeek,
|
|
@@ -32,7 +35,7 @@
|
|
|
32
35
|
toISODate,
|
|
33
36
|
today as getToday,
|
|
34
37
|
} from './dateUtils.js'
|
|
35
|
-
import type { DatePickerDialogProps, ISODate } from './types.js'
|
|
38
|
+
import type { DatePickerDialogProps, DatePickerMode, ISODate } from './types.js'
|
|
36
39
|
|
|
37
40
|
let {
|
|
38
41
|
value = $bindable(),
|
|
@@ -53,12 +56,14 @@
|
|
|
53
56
|
issues,
|
|
54
57
|
name,
|
|
55
58
|
form,
|
|
56
|
-
|
|
59
|
+
mode = $bindable<DatePickerMode>('calendar'),
|
|
60
|
+
modeToggle = true,
|
|
57
61
|
cancelLabel = 'Cancel',
|
|
58
62
|
confirmLabel = 'OK',
|
|
59
63
|
nextMonthLabel = 'Next month',
|
|
60
64
|
previousMonthLabel = 'Previous month',
|
|
61
65
|
selectYearLabel = 'Select year',
|
|
66
|
+
shortcutLabels,
|
|
62
67
|
calendarModeLabel = 'Switch to calendar mode',
|
|
63
68
|
inputModeLabel = 'Switch to text input mode',
|
|
64
69
|
selectedDateLabel = 'selected',
|
|
@@ -70,7 +75,6 @@
|
|
|
70
75
|
|
|
71
76
|
const uid = $props.id()
|
|
72
77
|
|
|
73
|
-
let mode = $state<'calendar' | 'input'>('calendar')
|
|
74
78
|
let yearPickerVisible = $state(false)
|
|
75
79
|
let pending = $state<ISODate | undefined>(undefined)
|
|
76
80
|
let focusedDay = $state<Date | undefined>(undefined)
|
|
@@ -92,67 +96,61 @@
|
|
|
92
96
|
parseISODate(displayMonth) ?? startOfMonth(pendingDate ?? parseISODate(value) ?? todayValue),
|
|
93
97
|
)
|
|
94
98
|
let headlineText = $derived(
|
|
95
|
-
headline ?? (pendingDate ?
|
|
99
|
+
headline ?? (pendingDate ? formatDateHeadline(pendingDate, locale) : title),
|
|
96
100
|
)
|
|
97
101
|
|
|
98
|
-
let
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
let steps = $derived.by(() => {
|
|
103
|
+
const year = monthDate.getFullYear()
|
|
104
|
+
const month = monthDate.getMonth()
|
|
105
|
+
return {
|
|
106
|
+
previousMonth: isMonthWithin(year, month - 1, minDate, maxDate) ? -1 : 0,
|
|
107
|
+
nextMonth: isMonthWithin(year, month + 1, minDate, maxDate) ? 1 : 0,
|
|
108
|
+
previousYear:
|
|
109
|
+
year > yearRange[0] && isMonthWithin(year - 1, month, minDate, maxDate) ? -12 : 0,
|
|
110
|
+
nextYear: year < yearRange[1] && isMonthWithin(year + 1, month, minDate, maxDate) ? 12 : 0,
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
let canPreviousMonth = $derived(steps.previousMonth !== 0)
|
|
114
|
+
let canNextMonth = $derived(steps.nextMonth !== 0)
|
|
115
|
+
|
|
116
|
+
let keys = $derived({ ...DEFAULT_SHORTCUT_LABELS, ...shortcutLabels })
|
|
106
117
|
|
|
107
118
|
let canConfirm = $derived(
|
|
108
119
|
!pendingDate ||
|
|
109
120
|
(isWithin(pendingDate, minDate, maxDate) && (isDateEnabled?.(pendingDate) ?? true)),
|
|
110
121
|
)
|
|
111
122
|
|
|
112
|
-
|
|
113
|
-
let
|
|
123
|
+
// The view switched to slides in. Only a switch does, so opening in input mode stays still.
|
|
124
|
+
let modeEnter = $state<DatePickerMode>()
|
|
114
125
|
let cancelModeEnter: (() => void) | undefined
|
|
115
|
-
let cancelYearEnter: (() => void) | undefined
|
|
116
126
|
|
|
117
|
-
|
|
127
|
+
let content = $state<HTMLElement>()
|
|
128
|
+
|
|
129
|
+
const setMode = (next: DatePickerMode) => {
|
|
118
130
|
if (mode === next) return
|
|
119
|
-
mode = next
|
|
120
131
|
cancelModeEnter?.()
|
|
121
|
-
|
|
122
|
-
|
|
132
|
+
morphSize(
|
|
133
|
+
content,
|
|
134
|
+
() =>
|
|
135
|
+
flushSync(() => {
|
|
136
|
+
mode = next
|
|
137
|
+
modeEnter = next
|
|
138
|
+
yearPickerVisible = false
|
|
139
|
+
}),
|
|
140
|
+
'--np-motion-expressive-default-spatial',
|
|
141
|
+
)
|
|
142
|
+
cancelModeEnter = afterTwoFrames(() => (modeEnter = undefined))
|
|
123
143
|
}
|
|
124
144
|
|
|
125
|
-
|
|
126
|
-
yearPickerVisible = next
|
|
127
|
-
if (!next) return
|
|
128
|
-
cancelYearEnter?.()
|
|
129
|
-
yearEnter = true
|
|
130
|
-
cancelYearEnter = afterTwoFrames(() => (yearEnter = false))
|
|
131
|
-
}
|
|
145
|
+
let dialog = $state<Dialog>()
|
|
132
146
|
|
|
133
|
-
export const show = () =>
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export const close = () => {
|
|
138
|
-
if (element?.open) element.close()
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
syncOpenEffect(
|
|
142
|
-
() => element,
|
|
143
|
-
() => open,
|
|
144
|
-
show,
|
|
145
|
-
close,
|
|
146
|
-
)
|
|
147
|
+
export const show = () => dialog?.show()
|
|
148
|
+
export const close = () => dialog?.close()
|
|
147
149
|
|
|
148
150
|
const setMonth = (date: Date) => {
|
|
149
151
|
displayMonth = toISODate(startOfMonth(date))
|
|
150
152
|
}
|
|
151
153
|
|
|
152
|
-
const cancel = () => {
|
|
153
|
-
open = false
|
|
154
|
-
}
|
|
155
|
-
|
|
156
154
|
const confirm = () => {
|
|
157
155
|
confirming = true
|
|
158
156
|
value = pending
|
|
@@ -161,9 +159,13 @@
|
|
|
161
159
|
open = false
|
|
162
160
|
}
|
|
163
161
|
|
|
164
|
-
const
|
|
162
|
+
const focusWhenReady = async () => {
|
|
165
163
|
await tick()
|
|
166
|
-
element
|
|
164
|
+
element
|
|
165
|
+
?.querySelector<HTMLElement>(
|
|
166
|
+
mode === 'input' ? '.np-date-picker-dialog-input input' : '.np-calendar-day[tabindex="0"]',
|
|
167
|
+
)
|
|
168
|
+
?.focus()
|
|
167
169
|
}
|
|
168
170
|
|
|
169
171
|
const syncText = () => {
|
|
@@ -194,32 +196,66 @@
|
|
|
194
196
|
inputInvalid = !parsed
|
|
195
197
|
if (parsed) text = formatDate(parsed, locale)
|
|
196
198
|
}
|
|
199
|
+
|
|
200
|
+
let navigation = $state<HTMLElement>()
|
|
201
|
+
|
|
202
|
+
const showYears = (visible: boolean) => {
|
|
203
|
+
flushSync(() => (yearPickerVisible = visible))
|
|
204
|
+
element
|
|
205
|
+
?.querySelector<HTMLElement>(
|
|
206
|
+
yearPickerVisible ? '.np-date-picker-year[tabindex="0"]' : '.np-calendar-day[tabindex="0"]',
|
|
207
|
+
)
|
|
208
|
+
?.focus()
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const handleKeydown = (event: KeyboardEvent) => {
|
|
212
|
+
if (event.key === 'Escape' && yearPickerVisible && !event.defaultPrevented) {
|
|
213
|
+
event.preventDefault()
|
|
214
|
+
showYears(false)
|
|
215
|
+
return
|
|
216
|
+
}
|
|
217
|
+
const target = event.target as Node
|
|
218
|
+
const onHeader = target === event.currentTarget || !!navigation?.contains(target)
|
|
219
|
+
const shortcut = mode === 'calendar' ? pickerShortcut(event) : undefined
|
|
220
|
+
if (shortcut === 'yearList') {
|
|
221
|
+
event.preventDefault()
|
|
222
|
+
showYears(!yearPickerVisible)
|
|
223
|
+
} else if (shortcut && shortcut !== 'monthList' && !yearPickerVisible && onHeader) {
|
|
224
|
+
event.preventDefault()
|
|
225
|
+
if (steps[shortcut]) setMonth(addMonths(monthDate, steps[shortcut]))
|
|
226
|
+
}
|
|
227
|
+
}
|
|
197
228
|
</script>
|
|
198
229
|
|
|
199
230
|
<Dialog
|
|
200
231
|
role="dialog"
|
|
201
232
|
{...attributes}
|
|
233
|
+
bind:this={dialog}
|
|
202
234
|
bind:element
|
|
235
|
+
bind:open
|
|
203
236
|
aria-label={title}
|
|
204
237
|
class={['np-date-picker-dialog', attributes.class]}
|
|
205
238
|
--np-dialog-container-width="fit-content"
|
|
206
239
|
--np-dialog-container-min-width="0"
|
|
207
240
|
--np-dialog-padding="0"
|
|
241
|
+
--np-dialog-elevation="none"
|
|
242
|
+
tabindex={-1}
|
|
208
243
|
--np-dialog-container-color="var(--np-date-picker-dialog-container-color, var(--np-color-surface-container-high))"
|
|
209
244
|
--np-dialog-container-shape="var(--np-date-picker-dialog-container-shape, var(--np-shape-corner-extra-large))"
|
|
245
|
+
onkeydown={(event) => {
|
|
246
|
+
attributes.onkeydown?.(event)
|
|
247
|
+
handleKeydown(event)
|
|
248
|
+
}}
|
|
210
249
|
ontoggle={(event) => {
|
|
211
|
-
|
|
212
|
-
open = nowOpen
|
|
213
|
-
if (nowOpen) {
|
|
250
|
+
if (event.newState === 'open') {
|
|
214
251
|
exit.show()
|
|
215
252
|
monthBeforeOpen = displayMonth
|
|
216
253
|
confirming = false
|
|
217
254
|
pending = value ?? undefined
|
|
218
|
-
|
|
219
|
-
showYearPicker(false)
|
|
255
|
+
yearPickerVisible = false
|
|
220
256
|
focusedDay = undefined
|
|
221
257
|
syncText()
|
|
222
|
-
|
|
258
|
+
focusWhenReady()
|
|
223
259
|
} else {
|
|
224
260
|
if (!confirming) oncancel?.()
|
|
225
261
|
confirming = false
|
|
@@ -229,7 +265,7 @@
|
|
|
229
265
|
>
|
|
230
266
|
<input class="np-date-picker-dialog-value" type="hidden" value={value ?? ''} {name} {form} />
|
|
231
267
|
{#if exit.visible}
|
|
232
|
-
<div class="np-date-picker-dialog-content">
|
|
268
|
+
<div class="np-date-picker-dialog-content" bind:this={content}>
|
|
233
269
|
<div class="np-date-picker-dialog-header">
|
|
234
270
|
<div class="np-date-picker-dialog-header-text">
|
|
235
271
|
<span class="np-date-picker-dialog-title">{title}</span>
|
|
@@ -242,7 +278,6 @@
|
|
|
242
278
|
onclick={() => {
|
|
243
279
|
if (mode === 'calendar') syncText()
|
|
244
280
|
setMode(mode === 'calendar' ? 'input' : 'calendar')
|
|
245
|
-
showYearPicker(false)
|
|
246
281
|
}}
|
|
247
282
|
>
|
|
248
283
|
{#if mode === 'calendar'}
|
|
@@ -256,7 +291,7 @@
|
|
|
256
291
|
<Divider />
|
|
257
292
|
|
|
258
293
|
{#if mode === 'input'}
|
|
259
|
-
<div class={['np-date-picker-dialog-input', modeEnter &&
|
|
294
|
+
<div class={['np-date-picker-dialog-input', modeEnter === 'input' && 'to-input']}>
|
|
260
295
|
<TextField
|
|
261
296
|
{label}
|
|
262
297
|
{issues}
|
|
@@ -265,28 +300,35 @@
|
|
|
265
300
|
aria-invalid={inputInvalid ? 'true' : undefined}
|
|
266
301
|
oninput={handleInput}
|
|
267
302
|
onblur={handleBlur}
|
|
303
|
+
onkeydown={(event) => {
|
|
304
|
+
if (event.key === 'Enter') handleBlur()
|
|
305
|
+
}}
|
|
268
306
|
/>
|
|
269
307
|
</div>
|
|
270
308
|
{:else}
|
|
271
|
-
<div class="np-date-picker-dialog-navigation">
|
|
309
|
+
<div class="np-date-picker-dialog-navigation" bind:this={navigation}>
|
|
272
310
|
<button
|
|
273
311
|
type="button"
|
|
274
|
-
class="np-date-picker-dialog-year-button"
|
|
312
|
+
class="np-date-picker-dialog-year-button np-focus-ring"
|
|
275
313
|
aria-label="{selectYearLabel}, {formatMonthYear(monthDate, locale)}"
|
|
314
|
+
aria-describedby="{uid}-year-tip"
|
|
276
315
|
aria-expanded={yearPickerVisible}
|
|
277
316
|
aria-controls={yearPickerVisible ? `${uid}-years` : undefined}
|
|
278
|
-
onclick={() =>
|
|
317
|
+
onclick={() => (yearPickerVisible = !yearPickerVisible)}
|
|
279
318
|
>
|
|
280
319
|
<span aria-live="polite">{formatMonthYear(monthDate, locale)}</span>
|
|
281
320
|
<span class={['np-date-picker-dialog-caret', yearPickerVisible && 'expanded']}>
|
|
282
321
|
<ArrowDropDownIcon />
|
|
283
322
|
</span>
|
|
323
|
+
<Ripple />
|
|
284
324
|
</button>
|
|
325
|
+
<Tooltip id="{uid}-year-tip">{withShortcut(selectYearLabel, keys.yearList)}</Tooltip>
|
|
285
326
|
{#if !yearPickerVisible}
|
|
286
327
|
<div class="np-date-picker-dialog-arrows">
|
|
287
328
|
<IconButton
|
|
288
329
|
type="button"
|
|
289
330
|
aria-label={previousMonthLabel}
|
|
331
|
+
title={withShortcut(previousMonthLabel, keys.previousMonth)}
|
|
290
332
|
disabled={!canPreviousMonth}
|
|
291
333
|
onclick={() => setMonth(addMonths(monthDate, -1))}
|
|
292
334
|
>
|
|
@@ -295,6 +337,7 @@
|
|
|
295
337
|
<IconButton
|
|
296
338
|
type="button"
|
|
297
339
|
aria-label={nextMonthLabel}
|
|
340
|
+
title={withShortcut(nextMonthLabel, keys.nextMonth)}
|
|
298
341
|
disabled={!canNextMonth}
|
|
299
342
|
onclick={() => setMonth(addMonths(monthDate, 1))}
|
|
300
343
|
>
|
|
@@ -306,7 +349,6 @@
|
|
|
306
349
|
|
|
307
350
|
{#if yearPickerVisible}
|
|
308
351
|
<YearGrid
|
|
309
|
-
class={yearEnter ? 'entering' : undefined}
|
|
310
352
|
id="{uid}-years"
|
|
311
353
|
aria-label={selectYearLabel}
|
|
312
354
|
{yearRange}
|
|
@@ -317,12 +359,14 @@
|
|
|
317
359
|
setMonth(
|
|
318
360
|
new Date(year, clampMonthInYear(year, monthDate.getMonth(), minDate, maxDate), 1),
|
|
319
361
|
)
|
|
320
|
-
|
|
362
|
+
showYears(false)
|
|
321
363
|
}}
|
|
322
364
|
/>
|
|
323
365
|
<Divider />
|
|
324
366
|
{:else}
|
|
325
|
-
<div
|
|
367
|
+
<div
|
|
368
|
+
class={['np-date-picker-dialog-calendar', modeEnter === 'calendar' && 'to-calendar']}
|
|
369
|
+
>
|
|
326
370
|
<Calendar
|
|
327
371
|
month={monthDate}
|
|
328
372
|
selected={pendingDate}
|
|
@@ -340,6 +384,7 @@
|
|
|
340
384
|
pending = toISODate(date)
|
|
341
385
|
focusedDay = date
|
|
342
386
|
}}
|
|
387
|
+
onconfirm={confirm}
|
|
343
388
|
onfocusday={(date) => {
|
|
344
389
|
focusedDay = date
|
|
345
390
|
if (
|
|
@@ -357,7 +402,7 @@
|
|
|
357
402
|
{/if}
|
|
358
403
|
|
|
359
404
|
{#snippet actions()}
|
|
360
|
-
<Button type="button" variant="text" onclick={
|
|
405
|
+
<Button type="button" variant="text" onclick={close}>{cancelLabel}</Button>
|
|
361
406
|
<Button type="button" variant="text" disabled={!canConfirm} onclick={confirm}>
|
|
362
407
|
{confirmLabel}
|
|
363
408
|
</Button>
|
|
@@ -375,6 +420,10 @@
|
|
|
375
420
|
padding: 0.5rem 0.75rem 0.75rem;
|
|
376
421
|
}
|
|
377
422
|
|
|
423
|
+
:global(.np-date-picker-dialog:has(.np-date-picker-dialog-calendar) .np-dialog-actions) {
|
|
424
|
+
padding-top: 0.25rem;
|
|
425
|
+
}
|
|
426
|
+
|
|
378
427
|
.np-date-picker-dialog-header {
|
|
379
428
|
box-sizing: border-box;
|
|
380
429
|
height: 7.5rem;
|
|
@@ -430,6 +479,7 @@
|
|
|
430
479
|
border: 0;
|
|
431
480
|
color: inherit;
|
|
432
481
|
cursor: pointer;
|
|
482
|
+
position: relative;
|
|
433
483
|
display: flex;
|
|
434
484
|
align-items: center;
|
|
435
485
|
gap: 0.25rem;
|
|
@@ -440,9 +490,11 @@
|
|
|
440
490
|
line-height: 1.25rem;
|
|
441
491
|
}
|
|
442
492
|
|
|
443
|
-
.np-date-picker-dialog-year-button
|
|
444
|
-
|
|
445
|
-
|
|
493
|
+
.np-date-picker-dialog-year-button::before {
|
|
494
|
+
content: '';
|
|
495
|
+
position: absolute;
|
|
496
|
+
inset-block: -0.375rem;
|
|
497
|
+
inset-inline: 0;
|
|
446
498
|
}
|
|
447
499
|
|
|
448
500
|
.np-date-picker-dialog-caret {
|
|
@@ -461,7 +513,7 @@
|
|
|
461
513
|
}
|
|
462
514
|
|
|
463
515
|
.np-date-picker-dialog-calendar {
|
|
464
|
-
padding
|
|
516
|
+
padding: 0 0.75rem 0.25rem;
|
|
465
517
|
}
|
|
466
518
|
|
|
467
519
|
.np-date-picker-dialog-input {
|
|
@@ -472,14 +524,14 @@
|
|
|
472
524
|
overflow: hidden;
|
|
473
525
|
}
|
|
474
526
|
|
|
475
|
-
.np-date-picker-dialog-
|
|
476
|
-
transform: translateY(
|
|
527
|
+
.np-date-picker-dialog-calendar.to-calendar {
|
|
528
|
+
transform: translateY(-3rem);
|
|
477
529
|
opacity: 0;
|
|
478
530
|
transition: none;
|
|
479
531
|
}
|
|
480
532
|
|
|
481
|
-
.np-date-picker-dialog-
|
|
482
|
-
transform: translateY(
|
|
533
|
+
.np-date-picker-dialog-input.to-input {
|
|
534
|
+
transform: translateY(100%);
|
|
483
535
|
opacity: 0;
|
|
484
536
|
transition: none;
|
|
485
537
|
}
|
|
@@ -491,5 +543,12 @@
|
|
|
491
543
|
transform var(--np-motion-expressive-default-spatial),
|
|
492
544
|
opacity var(--np-motion-expressive-default-effects);
|
|
493
545
|
}
|
|
546
|
+
|
|
547
|
+
.np-date-picker-dialog-content :global(.np-date-picker-year-grid) {
|
|
548
|
+
@starting-style {
|
|
549
|
+
height: 0;
|
|
550
|
+
opacity: 0.6;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
494
553
|
}
|
|
495
554
|
</style>
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import '../internal/focus-ring.css';
|
|
1
2
|
import type { DatePickerDialogProps } from './types.js';
|
|
2
3
|
declare const DatePickerDialog: import("svelte").Component<DatePickerDialogProps, {
|
|
3
|
-
show: () =>
|
|
4
|
-
close: () =>
|
|
5
|
-
}, "open" | "element" | "value" | "displayMonth">;
|
|
4
|
+
show: () => any;
|
|
5
|
+
close: () => any;
|
|
6
|
+
}, "open" | "element" | "value" | "displayMonth" | "mode">;
|
|
6
7
|
type DatePickerDialog = ReturnType<typeof DatePickerDialog>;
|
|
7
8
|
export default DatePickerDialog;
|