noph-ui 0.51.2 → 0.53.0
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 +14 -1
- package/dist/animation.js +55 -2
- package/dist/app-bar/AppBar.svelte +71 -7
- package/dist/app-bar/types.d.ts +6 -0
- package/dist/autocomplete/AutoComplete.svelte +6 -31
- package/dist/autocomplete/AutoComplete.svelte.d.ts +1 -1
- package/dist/badge/Badge.svelte +12 -4
- package/dist/badge/description.d.ts +4 -0
- package/dist/badge/description.js +4 -0
- package/dist/button/Button.svelte +53 -30
- package/dist/button/ButtonGroup.svelte +139 -19
- package/dist/button/ButtonGroup.svelte.d.ts +1 -1
- package/dist/button/IconButton.svelte +51 -33
- package/dist/button/SegmentedButton.svelte +52 -15
- package/dist/button/SplitButton.svelte +77 -3
- package/dist/button/SplitButton.svelte.d.ts +1 -1
- package/dist/button/buttonGroup.d.ts +0 -4
- package/dist/button/buttonGroup.js +0 -9
- package/dist/button/groupContext.d.ts +10 -0
- package/dist/button/groupContext.js +4 -0
- package/dist/button/types.d.ts +19 -0
- 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 +6 -8
- package/dist/chip/ChipSet.svelte +28 -2
- package/dist/chip/FilterChip.svelte +33 -17
- package/dist/chip/InputChip.svelte +127 -26
- package/dist/chip/SuggestionChip.svelte +6 -22
- package/dist/chip/SuggestionChip.svelte.d.ts +1 -2
- package/dist/chip/types.d.ts +8 -1
- package/dist/date-picker/Calendar.svelte +34 -31
- 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 +135 -75
- package/dist/date-picker/DatePickerDialog.svelte.d.ts +4 -3
- package/dist/date-picker/DateRangePicker.svelte +227 -78
- package/dist/date-picker/DateRangePicker.svelte.d.ts +3 -3
- package/dist/date-picker/DockedDatePicker.svelte +76 -457
- package/dist/date-picker/DockedDatePicker.svelte.d.ts +3 -3
- package/dist/date-picker/DockedDateTimePicker.svelte +128 -518
- package/dist/date-picker/DockedDateTimePicker.svelte.d.ts +3 -3
- 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 +6 -13
- 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/dialog/Dialog.svelte +171 -33
- package/dist/dialog/Dialog.svelte.d.ts +2 -1
- package/dist/dialog/types.d.ts +6 -0
- package/dist/divider/Divider.svelte +36 -10
- package/dist/divider/types.d.ts +1 -0
- package/dist/fab/ExtendedFab.svelte +26 -60
- package/dist/fab/Fab.svelte +13 -48
- package/dist/fab/FabMenu.svelte +102 -44
- package/dist/fab/FabMenu.svelte.d.ts +2 -1
- package/dist/fab/FabMenuItem.svelte +8 -0
- package/dist/fab/FabMenuItem.svelte.d.ts +4 -0
- package/dist/fab/index.d.ts +1 -0
- package/dist/fab/index.js +1 -0
- package/dist/fab/types.d.ts +6 -4
- package/dist/icons/Icon.svelte +1 -4
- package/dist/icons/MenuIcon.svelte +13 -0
- package/dist/icons/MenuIcon.svelte.d.ts +7 -0
- package/dist/icons/MenuOpenIcon.svelte +15 -0
- package/dist/icons/MenuOpenIcon.svelte.d.ts +7 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.js +2 -0
- package/dist/internal/exit.css +33 -0
- package/dist/internal/field.css +337 -0
- package/dist/internal/fieldTypes.d.ts +6 -0
- package/dist/internal/focus-ring.css +25 -6
- package/dist/internal/interest.css +3 -1
- package/dist/internal/pop-in.css +19 -0
- package/dist/internal/visually-hidden.css +11 -0
- package/dist/keyboard-nav.d.ts +12 -1
- package/dist/keyboard-nav.js +104 -14
- package/dist/list/Item.svelte +84 -24
- package/dist/list/List.svelte +35 -2
- package/dist/list/ListItem.svelte +16 -2
- package/dist/list/context.d.ts +6 -0
- package/dist/list/context.js +4 -0
- package/dist/list/types.d.ts +7 -0
- package/dist/media.d.ts +1 -0
- package/dist/media.js +1 -0
- package/dist/menu/Menu.svelte +53 -20
- package/dist/menu/Menu.svelte.d.ts +3 -1
- package/dist/menu/MenuItem.svelte +9 -3
- package/dist/menu/types.d.ts +7 -1
- package/dist/navigation-bar/NavigationBar.svelte +9 -3
- package/dist/navigation-bar/NavigationBarItem.svelte +31 -39
- package/dist/navigation-drawer/NavigationDrawer.svelte +96 -20
- package/dist/navigation-drawer/NavigationDrawer.svelte.d.ts +2 -1
- package/dist/navigation-drawer/NavigationDrawerItem.svelte +10 -12
- package/dist/navigation-drawer/NavigationDrawerSection.svelte +49 -0
- package/dist/navigation-drawer/NavigationDrawerSection.svelte.d.ts +4 -0
- package/dist/navigation-drawer/index.d.ts +1 -0
- package/dist/navigation-drawer/index.js +1 -0
- package/dist/navigation-drawer/types.d.ts +12 -0
- package/dist/navigation-rail/NavigationRail.svelte +367 -7
- package/dist/navigation-rail/NavigationRail.svelte.d.ts +1 -1
- package/dist/navigation-rail/NavigationRailItem.svelte +185 -59
- package/dist/navigation-rail/NavigationRailSection.svelte +57 -0
- package/dist/navigation-rail/NavigationRailSection.svelte.d.ts +4 -0
- package/dist/navigation-rail/context.d.ts +6 -0
- package/dist/navigation-rail/context.js +5 -0
- package/dist/navigation-rail/index.d.ts +1 -0
- package/dist/navigation-rail/index.js +1 -0
- package/dist/navigation-rail/morph.d.ts +14 -0
- package/dist/navigation-rail/morph.js +78 -0
- package/dist/navigation-rail/types.d.ts +21 -0
- package/dist/press.svelte.d.ts +0 -1
- package/dist/press.svelte.js +0 -11
- package/dist/progress/CircularProgress.svelte +28 -82
- package/dist/progress/CircularProgress.svelte.d.ts +1 -0
- package/dist/progress/LinearProgress.svelte +67 -171
- package/dist/progress/LinearProgress.svelte.d.ts +1 -0
- package/dist/progress/four-color.css +34 -0
- package/dist/progress/types.d.ts +1 -0
- package/dist/radio/Radio.svelte +13 -10
- package/dist/ripple/Ripple.svelte +8 -16
- package/dist/search/Search.svelte +238 -58
- package/dist/search/Search.svelte.d.ts +1 -0
- package/dist/search/types.d.ts +4 -0
- package/dist/select/Check.svelte +8 -31
- package/dist/select/Check.svelte.d.ts +1 -1
- package/dist/select/NativeSelect.svelte +113 -374
- package/dist/select/NativeSelect.svelte.d.ts +1 -0
- package/dist/select/Option.svelte +2 -11
- package/dist/select/Select.svelte +170 -858
- package/dist/select/Select.svelte.d.ts +1 -0
- package/dist/select/VirtualList.svelte +16 -2
- package/dist/select/VirtualList.svelte.d.ts +6 -2
- package/dist/sheet/Sheet.svelte +229 -22
- package/dist/sheet/Sheet.svelte.d.ts +3 -1
- package/dist/sheet/types.d.ts +10 -0
- package/dist/slider/Slider.svelte +14 -64
- package/dist/slider/Slider.svelte.d.ts +1 -0
- package/dist/snackbar/Snackbar.svelte +3 -0
- package/dist/snackbar/Snackbar.svelte.d.ts +2 -1
- package/dist/switch/Switch.svelte +53 -19
- package/dist/tabs/Tab.svelte +30 -18
- package/dist/tabs/Tabs.svelte +28 -4
- package/dist/tabs/types.d.ts +3 -0
- package/dist/text-field/TextField.svelte +124 -616
- 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 -239
- package/dist/time-picker/DockedTimePicker.svelte.d.ts +3 -3
- 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 +33 -26
- package/dist/time-picker/TimePickerDialog.svelte.d.ts +3 -3
- 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/toolbar/Toolbar.svelte +21 -11
- package/dist/toolbar/types.d.ts +1 -0
- package/dist/tooltip/RichTooltip.svelte +2 -23
- package/dist/tooltip/RichTooltip.svelte.d.ts +2 -1
- package/dist/tooltip/Tooltip.svelte +5 -25
- package/dist/tooltip/Tooltip.svelte.d.ts +2 -1
- package/package.json +12 -12
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { afterTwoFrames, morphSize } from '../animation.js'
|
|
2
3
|
import Button from '../button/Button.svelte'
|
|
3
4
|
import IconButton from '../button/IconButton.svelte'
|
|
4
5
|
import Dialog from '../dialog/Dialog.svelte'
|
|
5
6
|
import Divider from '../divider/Divider.svelte'
|
|
7
|
+
import CalendarToday from '../icons/CalendarToday.svelte'
|
|
6
8
|
import CloseIcon from '../icons/CloseIcon.svelte'
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
+
import EditCalendarIcon from '../icons/EditCalendarIcon.svelte'
|
|
10
|
+
import TextField from '../text-field/TextField.svelte'
|
|
11
|
+
import { flushSync, tick } from 'svelte'
|
|
9
12
|
import Calendar from './Calendar.svelte'
|
|
10
13
|
import { exitVisibility } from './exitVisibility.svelte.js'
|
|
11
14
|
import {
|
|
12
15
|
clampDate,
|
|
13
16
|
compareDays,
|
|
14
17
|
DEFAULT_YEAR_RANGE,
|
|
15
|
-
|
|
18
|
+
formatDate,
|
|
19
|
+
formatMonthDay,
|
|
20
|
+
getDatePattern,
|
|
16
21
|
getFirstDayOfWeek,
|
|
17
22
|
getWeekdayLabels,
|
|
18
23
|
isWithin,
|
|
24
|
+
parseDateInput,
|
|
19
25
|
parseISODate,
|
|
20
26
|
startOfDay,
|
|
21
27
|
startOfMonth,
|
|
22
28
|
toISODate,
|
|
23
29
|
today as getToday,
|
|
24
30
|
} from './dateUtils.js'
|
|
25
|
-
import type { DateRange, DateRangePickerProps } from './types.js'
|
|
31
|
+
import type { DateRange, DatePickerMode, DateRangePickerProps } from './types.js'
|
|
26
32
|
|
|
27
33
|
let {
|
|
28
34
|
value = $bindable({}),
|
|
@@ -42,6 +48,10 @@
|
|
|
42
48
|
form,
|
|
43
49
|
startLabel = 'Start date',
|
|
44
50
|
endLabel = 'End date',
|
|
51
|
+
mode = $bindable<DatePickerMode>('calendar'),
|
|
52
|
+
modeToggle = true,
|
|
53
|
+
calendarModeLabel = 'Switch to calendar mode',
|
|
54
|
+
inputModeLabel = 'Switch to text input mode',
|
|
45
55
|
cancelLabel = 'Cancel',
|
|
46
56
|
confirmLabel = 'Save',
|
|
47
57
|
selectedDateLabel = 'selected',
|
|
@@ -116,20 +126,10 @@
|
|
|
116
126
|
if (target && scroller) scroller.scrollTop = target.offsetTop
|
|
117
127
|
}
|
|
118
128
|
|
|
119
|
-
|
|
120
|
-
if (element && !element.open) element.showModal()
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export const close = () => {
|
|
124
|
-
if (element?.open) element.close()
|
|
125
|
-
}
|
|
129
|
+
let dialog = $state<Dialog>()
|
|
126
130
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
() => open,
|
|
130
|
-
show,
|
|
131
|
-
close,
|
|
132
|
-
)
|
|
131
|
+
export const show = () => dialog?.show()
|
|
132
|
+
export const close = () => dialog?.close()
|
|
133
133
|
|
|
134
134
|
let prepending = false
|
|
135
135
|
|
|
@@ -167,10 +167,6 @@
|
|
|
167
167
|
if (index > lastMonth) lastMonth = index
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
const cancel = () => {
|
|
171
|
-
open = false
|
|
172
|
-
}
|
|
173
|
-
|
|
174
170
|
const confirm = () => {
|
|
175
171
|
confirming = true
|
|
176
172
|
value = pending
|
|
@@ -179,25 +175,92 @@
|
|
|
179
175
|
open = false
|
|
180
176
|
}
|
|
181
177
|
|
|
182
|
-
|
|
183
|
-
|
|
178
|
+
// The input mode types the range into two fields, read as they are typed and formatted once
|
|
179
|
+
// left or entered. An end before the start does not count.
|
|
180
|
+
let startText = $state('')
|
|
181
|
+
let endText = $state('')
|
|
182
|
+
let startInvalid = $state(false)
|
|
183
|
+
let endInvalid = $state(false)
|
|
184
|
+
let pattern = $derived(getDatePattern(locale))
|
|
185
|
+
|
|
186
|
+
const usableDate = (typed: string) => {
|
|
187
|
+
const parsed = parseDateInput(typed, locale)
|
|
188
|
+
return parsed && isSelectable(parsed) ? parsed : undefined
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const syncText = () => {
|
|
192
|
+
startText = startDate ? formatDate(startDate, locale) : ''
|
|
193
|
+
endText = endDate ? formatDate(endDate, locale) : ''
|
|
194
|
+
startInvalid = false
|
|
195
|
+
endInvalid = false
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const readTyped = () => {
|
|
199
|
+
const start = usableDate(startText)
|
|
200
|
+
const end = usableDate(endText)
|
|
201
|
+
pending = {
|
|
202
|
+
start: start && toISODate(start),
|
|
203
|
+
end: start && end && compareDays(end, start) >= 0 ? toISODate(end) : undefined,
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const settleTyped = () => {
|
|
208
|
+
startInvalid = startText.trim() !== '' && !startDate
|
|
209
|
+
endInvalid = endText.trim() !== '' && !endDate
|
|
210
|
+
if (startDate) startText = formatDate(startDate, locale)
|
|
211
|
+
if (endDate) endText = formatDate(endDate, locale)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// The fields slide in on a switch to input mode, not when the picker opens in it.
|
|
215
|
+
let inputEnter = $state(false)
|
|
216
|
+
let cancelInputEnter: (() => void) | undefined
|
|
217
|
+
|
|
218
|
+
let content = $state<HTMLElement>()
|
|
219
|
+
|
|
220
|
+
const setMode = (next: DatePickerMode) => {
|
|
221
|
+
cancelInputEnter?.()
|
|
222
|
+
morphSize(
|
|
223
|
+
content,
|
|
224
|
+
() =>
|
|
225
|
+
flushSync(() => {
|
|
226
|
+
mode = next
|
|
227
|
+
inputEnter = next === 'input'
|
|
228
|
+
if (next === 'input') syncText()
|
|
229
|
+
else resetWindow()
|
|
230
|
+
}),
|
|
231
|
+
'--np-motion-expressive-default-spatial',
|
|
232
|
+
)
|
|
233
|
+
if (next === 'input') cancelInputEnter = afterTwoFrames(() => (inputEnter = false))
|
|
234
|
+
else scrollToAnchor()
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
let headlineStart = $derived(startDate ? formatMonthDay(startDate, locale) : startLabel)
|
|
238
|
+
let headlineEnd = $derived(endDate ? formatMonthDay(endDate, locale) : endLabel)
|
|
184
239
|
</script>
|
|
185
240
|
|
|
186
241
|
<Dialog
|
|
242
|
+
role="dialog"
|
|
187
243
|
{...attributes}
|
|
244
|
+
bind:this={dialog}
|
|
188
245
|
bind:element
|
|
246
|
+
bind:open
|
|
189
247
|
aria-label={title}
|
|
190
248
|
class={['np-date-range-picker', attributes.class]}
|
|
191
249
|
ontoggle={(event) => {
|
|
192
|
-
|
|
193
|
-
open = nowOpen
|
|
194
|
-
if (nowOpen) {
|
|
250
|
+
if (event.newState === 'open') {
|
|
195
251
|
exit.show()
|
|
196
252
|
confirming = false
|
|
197
253
|
pending = { ...value }
|
|
198
254
|
focusedDay = undefined
|
|
199
|
-
|
|
200
|
-
|
|
255
|
+
if (mode === 'input') {
|
|
256
|
+
syncText()
|
|
257
|
+
tick().then(() =>
|
|
258
|
+
element?.querySelector<HTMLInputElement>('.np-date-range-picker-inputs input')?.focus(),
|
|
259
|
+
)
|
|
260
|
+
} else {
|
|
261
|
+
resetWindow()
|
|
262
|
+
scrollToAnchor()
|
|
263
|
+
}
|
|
201
264
|
} else {
|
|
202
265
|
if (!confirming) oncancel?.()
|
|
203
266
|
confirming = false
|
|
@@ -214,72 +277,117 @@
|
|
|
214
277
|
{form}
|
|
215
278
|
/>
|
|
216
279
|
{#if exit.visible}
|
|
217
|
-
<div class="np-date-range-picker-content">
|
|
280
|
+
<div class="np-date-range-picker-content" bind:this={content}>
|
|
218
281
|
<div class="np-date-range-picker-header">
|
|
219
282
|
<div class="np-date-range-picker-top-bar">
|
|
220
|
-
<IconButton type="button" aria-label={cancelLabel} onclick={
|
|
283
|
+
<IconButton type="button" aria-label={cancelLabel} onclick={close}>
|
|
221
284
|
<CloseIcon />
|
|
222
285
|
</IconButton>
|
|
223
286
|
<Button type="button" variant="text" disabled={!canConfirm} onclick={confirm}>
|
|
224
287
|
{confirmLabel}
|
|
225
288
|
</Button>
|
|
226
289
|
</div>
|
|
227
|
-
<div class="np-date-range-picker-header-
|
|
228
|
-
<
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
290
|
+
<div class="np-date-range-picker-header-row">
|
|
291
|
+
<div class="np-date-range-picker-header-text">
|
|
292
|
+
<span class="np-date-range-picker-title">{title}</span>
|
|
293
|
+
<h2 class="np-date-range-picker-headline">
|
|
294
|
+
{#if headline}
|
|
295
|
+
<span>{headline}</span>
|
|
296
|
+
{:else}
|
|
297
|
+
<span class={[!startDate && 'placeholder']}>{headlineStart}</span>
|
|
298
|
+
<span aria-hidden="true">–</span>
|
|
299
|
+
<span class={[!endDate && 'placeholder']}>{headlineEnd}</span>
|
|
300
|
+
{/if}
|
|
301
|
+
</h2>
|
|
302
|
+
</div>
|
|
303
|
+
{#if modeToggle}
|
|
304
|
+
<IconButton
|
|
305
|
+
type="button"
|
|
306
|
+
aria-label={mode === 'calendar' ? inputModeLabel : calendarModeLabel}
|
|
307
|
+
onclick={() => setMode(mode === 'calendar' ? 'input' : 'calendar')}
|
|
308
|
+
>
|
|
309
|
+
{#if mode === 'calendar'}
|
|
310
|
+
<EditCalendarIcon />
|
|
311
|
+
{:else}
|
|
312
|
+
<CalendarToday />
|
|
313
|
+
{/if}
|
|
314
|
+
</IconButton>
|
|
315
|
+
{/if}
|
|
238
316
|
</div>
|
|
239
317
|
</div>
|
|
240
318
|
<Divider />
|
|
241
319
|
|
|
242
|
-
|
|
243
|
-
{
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
320
|
+
{#if mode === 'input'}
|
|
321
|
+
<div class={['np-date-range-picker-inputs', inputEnter && 'entering']}>
|
|
322
|
+
{#snippet field(label: string, text: string, invalid: boolean, start: boolean)}
|
|
323
|
+
<TextField
|
|
324
|
+
{label}
|
|
325
|
+
supportingText={pattern}
|
|
326
|
+
value={text}
|
|
327
|
+
aria-invalid={invalid ? 'true' : undefined}
|
|
328
|
+
oninput={(event) => {
|
|
329
|
+
const typed = (event.currentTarget as HTMLInputElement).value
|
|
330
|
+
if (start) {
|
|
331
|
+
startText = typed
|
|
332
|
+
startInvalid = false
|
|
333
|
+
} else {
|
|
334
|
+
endText = typed
|
|
335
|
+
endInvalid = false
|
|
336
|
+
}
|
|
337
|
+
readTyped()
|
|
338
|
+
}}
|
|
339
|
+
onblur={settleTyped}
|
|
340
|
+
onkeydown={(event) => {
|
|
341
|
+
if (event.key === 'Enter') settleTyped()
|
|
342
|
+
}}
|
|
343
|
+
/>
|
|
344
|
+
{/snippet}
|
|
345
|
+
{@render field(startLabel, startText, startInvalid, true)}
|
|
346
|
+
{@render field(endLabel, endText, endInvalid, false)}
|
|
347
|
+
</div>
|
|
348
|
+
{:else}
|
|
349
|
+
<div class="np-date-range-picker-weekdays" aria-hidden="true">
|
|
350
|
+
{#each weekdayLabels as weekday (weekday.long)}
|
|
351
|
+
<span>{weekday.narrow}</span>
|
|
352
|
+
{/each}
|
|
353
|
+
</div>
|
|
247
354
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
355
|
+
<div class="np-date-range-picker-months" bind:this={scroller} onscroll={handleScroll}>
|
|
356
|
+
{#each months as month (month.getTime())}
|
|
357
|
+
<Calendar
|
|
358
|
+
{month}
|
|
359
|
+
data-month={monthIndex(month)}
|
|
360
|
+
rangeStart={startDate}
|
|
361
|
+
rangeEnd={endDate}
|
|
362
|
+
min={minDate}
|
|
363
|
+
max={maxDate}
|
|
364
|
+
{locale}
|
|
365
|
+
firstDayOfWeek={week}
|
|
366
|
+
{isDateEnabled}
|
|
367
|
+
{adjacentMonthDays}
|
|
368
|
+
weekdays={false}
|
|
369
|
+
dynamicRows
|
|
370
|
+
todayDate={todayValue}
|
|
371
|
+
focusedDate={focusedDay}
|
|
372
|
+
selectedLabel={selectedDateLabel}
|
|
373
|
+
{tabStopDate}
|
|
374
|
+
focusRoot={scroller}
|
|
375
|
+
onselect={selectDay}
|
|
376
|
+
onfocusday={focusDay}
|
|
377
|
+
>
|
|
378
|
+
{#snippet monthSubhead(monthName)}
|
|
379
|
+
<div class="np-date-range-picker-subhead">{monthName}</div>
|
|
380
|
+
{/snippet}
|
|
381
|
+
</Calendar>
|
|
382
|
+
{/each}
|
|
383
|
+
</div>
|
|
384
|
+
{/if}
|
|
277
385
|
</div>
|
|
278
386
|
{/if}
|
|
279
387
|
|
|
280
388
|
{#snippet actions()}
|
|
281
389
|
{#if exit.visible}
|
|
282
|
-
<Button type="button" variant="text" onclick={
|
|
390
|
+
<Button type="button" variant="text" onclick={close}>{cancelLabel}</Button>
|
|
283
391
|
<Button type="button" variant="text" disabled={!canConfirm} onclick={confirm}>
|
|
284
392
|
{confirmLabel}
|
|
285
393
|
</Button>
|
|
@@ -348,12 +456,47 @@
|
|
|
348
456
|
color: var(--np-color-on-surface-variant);
|
|
349
457
|
}
|
|
350
458
|
|
|
351
|
-
.np-date-range-picker-top-bar
|
|
459
|
+
.np-date-range-picker-top-bar,
|
|
460
|
+
.np-date-range-picker-header-row {
|
|
352
461
|
display: flex;
|
|
353
462
|
align-items: center;
|
|
354
463
|
justify-content: space-between;
|
|
355
464
|
}
|
|
356
465
|
|
|
466
|
+
.np-date-range-picker-header-row {
|
|
467
|
+
align-items: flex-end;
|
|
468
|
+
gap: 0.5rem;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.np-date-range-picker-inputs {
|
|
472
|
+
box-sizing: border-box;
|
|
473
|
+
display: flex;
|
|
474
|
+
gap: 1rem;
|
|
475
|
+
max-width: var(--np-date-range-picker-content-width, 25.5rem);
|
|
476
|
+
width: 100%;
|
|
477
|
+
margin-inline: auto;
|
|
478
|
+
padding: 1rem 1rem 0;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
.np-date-range-picker-inputs > :global(.np-text-field) {
|
|
482
|
+
flex: 1;
|
|
483
|
+
min-width: 0;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.np-date-range-picker-inputs.entering {
|
|
487
|
+
transform: translateY(1.5rem);
|
|
488
|
+
opacity: 0;
|
|
489
|
+
transition: none;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
493
|
+
.np-date-range-picker-inputs {
|
|
494
|
+
transition:
|
|
495
|
+
transform var(--np-motion-expressive-default-spatial),
|
|
496
|
+
opacity var(--np-motion-expressive-default-effects);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
357
500
|
.np-date-range-picker-header-text {
|
|
358
501
|
display: flex;
|
|
359
502
|
flex-direction: column;
|
|
@@ -398,6 +541,9 @@
|
|
|
398
541
|
min-height: 0;
|
|
399
542
|
overflow-y: auto;
|
|
400
543
|
overscroll-behavior: contain;
|
|
544
|
+
/* Months added above are made up for in script, in every browser alike. Scroll anchoring
|
|
545
|
+
would make up for them a second time. */
|
|
546
|
+
overflow-anchor: none;
|
|
401
547
|
padding-inline: 0.75rem;
|
|
402
548
|
scrollbar-color: var(--np-color-on-surface-variant) transparent;
|
|
403
549
|
scrollbar-width: thin;
|
|
@@ -419,7 +565,6 @@
|
|
|
419
565
|
--np-dialog-container-width: fit-content;
|
|
420
566
|
--np-dialog-inset: 2rem 1rem;
|
|
421
567
|
--np-dialog-max-height: calc(100dvh - 3rem);
|
|
422
|
-
--np-dialog-elevation: var(--np-elevation-3);
|
|
423
568
|
--np-dialog-container-shape: var(
|
|
424
569
|
--np-date-range-picker-container-shape,
|
|
425
570
|
var(--np-shape-corner-extra-large)
|
|
@@ -445,6 +590,10 @@
|
|
|
445
590
|
display: none;
|
|
446
591
|
}
|
|
447
592
|
|
|
593
|
+
.np-date-range-picker-inputs {
|
|
594
|
+
padding-inline: 1.5rem;
|
|
595
|
+
}
|
|
596
|
+
|
|
448
597
|
.np-date-range-picker-header {
|
|
449
598
|
min-height: 7.5rem;
|
|
450
599
|
justify-content: flex-end;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { DateRangePickerProps } from './types.js';
|
|
2
2
|
declare const DateRangePicker: import("svelte").Component<DateRangePickerProps, {
|
|
3
|
-
show: () =>
|
|
4
|
-
close: () =>
|
|
5
|
-
}, "element" | "value" | "
|
|
3
|
+
show: () => any;
|
|
4
|
+
close: () => any;
|
|
5
|
+
}, "open" | "element" | "value" | "mode">;
|
|
6
6
|
type DateRangePicker = ReturnType<typeof DateRangePicker>;
|
|
7
7
|
export default DateRangePicker;
|