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.
Files changed (187) hide show
  1. package/dist/animation.d.ts +14 -1
  2. package/dist/animation.js +55 -2
  3. package/dist/app-bar/AppBar.svelte +71 -7
  4. package/dist/app-bar/types.d.ts +6 -0
  5. package/dist/autocomplete/AutoComplete.svelte +6 -31
  6. package/dist/autocomplete/AutoComplete.svelte.d.ts +1 -1
  7. package/dist/badge/Badge.svelte +12 -4
  8. package/dist/badge/description.d.ts +4 -0
  9. package/dist/badge/description.js +4 -0
  10. package/dist/button/Button.svelte +53 -30
  11. package/dist/button/ButtonGroup.svelte +139 -19
  12. package/dist/button/ButtonGroup.svelte.d.ts +1 -1
  13. package/dist/button/IconButton.svelte +51 -33
  14. package/dist/button/SegmentedButton.svelte +52 -15
  15. package/dist/button/SplitButton.svelte +77 -3
  16. package/dist/button/SplitButton.svelte.d.ts +1 -1
  17. package/dist/button/buttonGroup.d.ts +0 -4
  18. package/dist/button/buttonGroup.js +0 -9
  19. package/dist/button/groupContext.d.ts +10 -0
  20. package/dist/button/groupContext.js +4 -0
  21. package/dist/button/types.d.ts +19 -0
  22. package/dist/card/Card.svelte +3 -19
  23. package/dist/card/types.d.ts +12 -2
  24. package/dist/carousel/Carousel.svelte +77 -14
  25. package/dist/carousel/CarouselItem.svelte +26 -14
  26. package/dist/carousel/carouselMorph.js +1 -1
  27. package/dist/carousel/carouselStrategy.js +25 -27
  28. package/dist/checkbox/Checkbox.svelte +6 -8
  29. package/dist/chip/ChipSet.svelte +28 -2
  30. package/dist/chip/FilterChip.svelte +33 -17
  31. package/dist/chip/InputChip.svelte +127 -26
  32. package/dist/chip/SuggestionChip.svelte +6 -22
  33. package/dist/chip/SuggestionChip.svelte.d.ts +1 -2
  34. package/dist/chip/types.d.ts +8 -1
  35. package/dist/date-picker/Calendar.svelte +34 -31
  36. package/dist/date-picker/Calendar.svelte.d.ts +2 -0
  37. package/dist/date-picker/CalendarHeader.svelte +84 -62
  38. package/dist/date-picker/CalendarHeader.svelte.d.ts +3 -0
  39. package/dist/date-picker/DatePickerDialog.svelte +135 -75
  40. package/dist/date-picker/DatePickerDialog.svelte.d.ts +4 -3
  41. package/dist/date-picker/DateRangePicker.svelte +227 -78
  42. package/dist/date-picker/DateRangePicker.svelte.d.ts +3 -3
  43. package/dist/date-picker/DockedDatePicker.svelte +76 -457
  44. package/dist/date-picker/DockedDatePicker.svelte.d.ts +3 -3
  45. package/dist/date-picker/DockedDateTimePicker.svelte +128 -518
  46. package/dist/date-picker/DockedDateTimePicker.svelte.d.ts +3 -3
  47. package/dist/date-picker/DockedPickerField.svelte +221 -0
  48. package/dist/date-picker/DockedPickerField.svelte.d.ts +9 -0
  49. package/dist/date-picker/MonthPanel.svelte +291 -0
  50. package/dist/date-picker/MonthPanel.svelte.d.ts +12 -0
  51. package/dist/date-picker/SelectionList.svelte +7 -6
  52. package/dist/date-picker/SelectionList.svelte.d.ts +1 -0
  53. package/dist/date-picker/TimeColumn.svelte +2 -6
  54. package/dist/date-picker/TimeColumn.svelte.d.ts +1 -0
  55. package/dist/date-picker/YearGrid.svelte +6 -13
  56. package/dist/date-picker/YearGrid.svelte.d.ts +1 -0
  57. package/dist/date-picker/dateUtils.d.ts +4 -0
  58. package/dist/date-picker/dateUtils.js +15 -88
  59. package/dist/date-picker/exitVisibility.svelte.js +13 -6
  60. package/dist/date-picker/formatters.d.ts +16 -0
  61. package/dist/date-picker/formatters.js +48 -15
  62. package/dist/date-picker/internalTypes.d.ts +59 -1
  63. package/dist/date-picker/shortcuts.d.ts +11 -0
  64. package/dist/date-picker/shortcuts.js +40 -0
  65. package/dist/date-picker/timeUtils.d.ts +8 -3
  66. package/dist/date-picker/timeUtils.js +33 -51
  67. package/dist/date-picker/types.d.ts +22 -0
  68. package/dist/dialog/Dialog.svelte +171 -33
  69. package/dist/dialog/Dialog.svelte.d.ts +2 -1
  70. package/dist/dialog/types.d.ts +6 -0
  71. package/dist/divider/Divider.svelte +36 -10
  72. package/dist/divider/types.d.ts +1 -0
  73. package/dist/fab/ExtendedFab.svelte +26 -60
  74. package/dist/fab/Fab.svelte +13 -48
  75. package/dist/fab/FabMenu.svelte +102 -44
  76. package/dist/fab/FabMenu.svelte.d.ts +2 -1
  77. package/dist/fab/FabMenuItem.svelte +8 -0
  78. package/dist/fab/FabMenuItem.svelte.d.ts +4 -0
  79. package/dist/fab/index.d.ts +1 -0
  80. package/dist/fab/index.js +1 -0
  81. package/dist/fab/types.d.ts +6 -4
  82. package/dist/icons/Icon.svelte +1 -4
  83. package/dist/icons/MenuIcon.svelte +13 -0
  84. package/dist/icons/MenuIcon.svelte.d.ts +7 -0
  85. package/dist/icons/MenuOpenIcon.svelte +15 -0
  86. package/dist/icons/MenuOpenIcon.svelte.d.ts +7 -0
  87. package/dist/icons/index.d.ts +2 -0
  88. package/dist/icons/index.js +2 -0
  89. package/dist/internal/exit.css +33 -0
  90. package/dist/internal/field.css +337 -0
  91. package/dist/internal/fieldTypes.d.ts +6 -0
  92. package/dist/internal/focus-ring.css +25 -6
  93. package/dist/internal/interest.css +3 -1
  94. package/dist/internal/pop-in.css +19 -0
  95. package/dist/internal/visually-hidden.css +11 -0
  96. package/dist/keyboard-nav.d.ts +12 -1
  97. package/dist/keyboard-nav.js +104 -14
  98. package/dist/list/Item.svelte +84 -24
  99. package/dist/list/List.svelte +35 -2
  100. package/dist/list/ListItem.svelte +16 -2
  101. package/dist/list/context.d.ts +6 -0
  102. package/dist/list/context.js +4 -0
  103. package/dist/list/types.d.ts +7 -0
  104. package/dist/media.d.ts +1 -0
  105. package/dist/media.js +1 -0
  106. package/dist/menu/Menu.svelte +53 -20
  107. package/dist/menu/Menu.svelte.d.ts +3 -1
  108. package/dist/menu/MenuItem.svelte +9 -3
  109. package/dist/menu/types.d.ts +7 -1
  110. package/dist/navigation-bar/NavigationBar.svelte +9 -3
  111. package/dist/navigation-bar/NavigationBarItem.svelte +31 -39
  112. package/dist/navigation-drawer/NavigationDrawer.svelte +96 -20
  113. package/dist/navigation-drawer/NavigationDrawer.svelte.d.ts +2 -1
  114. package/dist/navigation-drawer/NavigationDrawerItem.svelte +10 -12
  115. package/dist/navigation-drawer/NavigationDrawerSection.svelte +49 -0
  116. package/dist/navigation-drawer/NavigationDrawerSection.svelte.d.ts +4 -0
  117. package/dist/navigation-drawer/index.d.ts +1 -0
  118. package/dist/navigation-drawer/index.js +1 -0
  119. package/dist/navigation-drawer/types.d.ts +12 -0
  120. package/dist/navigation-rail/NavigationRail.svelte +367 -7
  121. package/dist/navigation-rail/NavigationRail.svelte.d.ts +1 -1
  122. package/dist/navigation-rail/NavigationRailItem.svelte +185 -59
  123. package/dist/navigation-rail/NavigationRailSection.svelte +57 -0
  124. package/dist/navigation-rail/NavigationRailSection.svelte.d.ts +4 -0
  125. package/dist/navigation-rail/context.d.ts +6 -0
  126. package/dist/navigation-rail/context.js +5 -0
  127. package/dist/navigation-rail/index.d.ts +1 -0
  128. package/dist/navigation-rail/index.js +1 -0
  129. package/dist/navigation-rail/morph.d.ts +14 -0
  130. package/dist/navigation-rail/morph.js +78 -0
  131. package/dist/navigation-rail/types.d.ts +21 -0
  132. package/dist/press.svelte.d.ts +0 -1
  133. package/dist/press.svelte.js +0 -11
  134. package/dist/progress/CircularProgress.svelte +28 -82
  135. package/dist/progress/CircularProgress.svelte.d.ts +1 -0
  136. package/dist/progress/LinearProgress.svelte +67 -171
  137. package/dist/progress/LinearProgress.svelte.d.ts +1 -0
  138. package/dist/progress/four-color.css +34 -0
  139. package/dist/progress/types.d.ts +1 -0
  140. package/dist/radio/Radio.svelte +13 -10
  141. package/dist/ripple/Ripple.svelte +8 -16
  142. package/dist/search/Search.svelte +238 -58
  143. package/dist/search/Search.svelte.d.ts +1 -0
  144. package/dist/search/types.d.ts +4 -0
  145. package/dist/select/Check.svelte +8 -31
  146. package/dist/select/Check.svelte.d.ts +1 -1
  147. package/dist/select/NativeSelect.svelte +113 -374
  148. package/dist/select/NativeSelect.svelte.d.ts +1 -0
  149. package/dist/select/Option.svelte +2 -11
  150. package/dist/select/Select.svelte +170 -858
  151. package/dist/select/Select.svelte.d.ts +1 -0
  152. package/dist/select/VirtualList.svelte +16 -2
  153. package/dist/select/VirtualList.svelte.d.ts +6 -2
  154. package/dist/sheet/Sheet.svelte +229 -22
  155. package/dist/sheet/Sheet.svelte.d.ts +3 -1
  156. package/dist/sheet/types.d.ts +10 -0
  157. package/dist/slider/Slider.svelte +14 -64
  158. package/dist/slider/Slider.svelte.d.ts +1 -0
  159. package/dist/snackbar/Snackbar.svelte +3 -0
  160. package/dist/snackbar/Snackbar.svelte.d.ts +2 -1
  161. package/dist/switch/Switch.svelte +53 -19
  162. package/dist/tabs/Tab.svelte +30 -18
  163. package/dist/tabs/Tabs.svelte +28 -4
  164. package/dist/tabs/types.d.ts +3 -0
  165. package/dist/text-field/TextField.svelte +124 -616
  166. package/dist/text-field/TextField.svelte.d.ts +1 -0
  167. package/dist/time-picker/ClockDial.svelte +8 -25
  168. package/dist/time-picker/ClockDial.svelte.d.ts +2 -0
  169. package/dist/time-picker/DockedTimePicker.svelte +102 -239
  170. package/dist/time-picker/DockedTimePicker.svelte.d.ts +3 -3
  171. package/dist/time-picker/PeriodSelector.svelte +8 -7
  172. package/dist/time-picker/PeriodSelector.svelte.d.ts +1 -0
  173. package/dist/time-picker/TimeInputs.svelte +13 -2
  174. package/dist/time-picker/TimePickerDialog.svelte +33 -26
  175. package/dist/time-picker/TimePickerDialog.svelte.d.ts +3 -3
  176. package/dist/time-picker/TimePickerPanel.svelte +26 -4
  177. package/dist/time-picker/TimeSelectors.svelte +4 -9
  178. package/dist/time-picker/TimeSelectors.svelte.d.ts +1 -0
  179. package/dist/time-picker/internalTypes.d.ts +2 -0
  180. package/dist/time-picker/timePickerState.svelte.js +3 -9
  181. package/dist/toolbar/Toolbar.svelte +21 -11
  182. package/dist/toolbar/types.d.ts +1 -0
  183. package/dist/tooltip/RichTooltip.svelte +2 -23
  184. package/dist/tooltip/RichTooltip.svelte.d.ts +2 -1
  185. package/dist/tooltip/Tooltip.svelte +5 -25
  186. package/dist/tooltip/Tooltip.svelte.d.ts +2 -1
  187. 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 { syncOpenEffect } from '../popover.svelte.js'
8
- import { tick } from 'svelte'
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
- formatDateMedium,
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
- export const show = () => {
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
- syncOpenEffect(
128
- () => element,
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
- let headlineStart = $derived(startDate ? formatDateMedium(startDate, locale) : startLabel)
183
- let headlineEnd = $derived(endDate ? formatDateMedium(endDate, locale) : endLabel)
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
- const nowOpen = event.newState === 'open'
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
- resetWindow()
200
- scrollToAnchor()
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={cancel}>
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-text">
228
- <span class="np-date-range-picker-title">{title}</span>
229
- <h2 class="np-date-range-picker-headline">
230
- {#if headline}
231
- <span>{headline}</span>
232
- {:else}
233
- <span class={[!startDate && 'placeholder']}>{headlineStart}</span>
234
- <span aria-hidden="true">–</span>
235
- <span class={[!endDate && 'placeholder']}>{headlineEnd}</span>
236
- {/if}
237
- </h2>
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
- <div class="np-date-range-picker-weekdays" aria-hidden="true">
243
- {#each weekdayLabels as weekday (weekday.long)}
244
- <span>{weekday.narrow}</span>
245
- {/each}
246
- </div>
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
- <div class="np-date-range-picker-months" bind:this={scroller} onscroll={handleScroll}>
249
- {#each months as month (month.getTime())}
250
- <Calendar
251
- {month}
252
- data-month={monthIndex(month)}
253
- rangeStart={startDate}
254
- rangeEnd={endDate}
255
- min={minDate}
256
- max={maxDate}
257
- {locale}
258
- firstDayOfWeek={week}
259
- {isDateEnabled}
260
- {adjacentMonthDays}
261
- weekdays={false}
262
- dynamicRows
263
- todayDate={todayValue}
264
- focusedDate={focusedDay}
265
- selectedLabel={selectedDateLabel}
266
- {tabStopDate}
267
- focusRoot={scroller}
268
- onselect={selectDay}
269
- onfocusday={focusDay}
270
- >
271
- {#snippet monthSubhead(monthName)}
272
- <div class="np-date-range-picker-subhead">{monthName}</div>
273
- {/snippet}
274
- </Calendar>
275
- {/each}
276
- </div>
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={cancel}>{cancelLabel}</Button>
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: () => void;
4
- close: () => void;
5
- }, "element" | "value" | "open">;
3
+ show: () => any;
4
+ close: () => any;
5
+ }, "open" | "element" | "value" | "mode">;
6
6
  type DateRangePicker = ReturnType<typeof DateRangePicker>;
7
7
  export default DateRangePicker;