noph-ui 0.52.0 → 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 (103) hide show
  1. package/dist/animation.d.ts +1 -13
  2. package/dist/animation.js +18 -13
  3. package/dist/button/Button.svelte +2 -14
  4. package/dist/button/IconButton.svelte +5 -18
  5. package/dist/button/SegmentedButton.svelte +8 -11
  6. package/dist/card/Card.svelte +3 -19
  7. package/dist/card/types.d.ts +12 -2
  8. package/dist/carousel/Carousel.svelte +77 -14
  9. package/dist/carousel/CarouselItem.svelte +26 -14
  10. package/dist/carousel/carouselMorph.js +1 -1
  11. package/dist/carousel/carouselStrategy.js +25 -27
  12. package/dist/checkbox/Checkbox.svelte +1 -8
  13. package/dist/chip/FilterChip.svelte +1 -13
  14. package/dist/date-picker/Calendar.svelte +31 -30
  15. package/dist/date-picker/Calendar.svelte.d.ts +2 -0
  16. package/dist/date-picker/CalendarHeader.svelte +84 -62
  17. package/dist/date-picker/CalendarHeader.svelte.d.ts +3 -0
  18. package/dist/date-picker/DatePickerDialog.svelte +134 -75
  19. package/dist/date-picker/DatePickerDialog.svelte.d.ts +4 -3
  20. package/dist/date-picker/DateRangePicker.svelte +226 -78
  21. package/dist/date-picker/DateRangePicker.svelte.d.ts +3 -3
  22. package/dist/date-picker/DockedDatePicker.svelte +76 -464
  23. package/dist/date-picker/DockedDatePicker.svelte.d.ts +2 -2
  24. package/dist/date-picker/DockedDateTimePicker.svelte +128 -525
  25. package/dist/date-picker/DockedDateTimePicker.svelte.d.ts +2 -2
  26. package/dist/date-picker/DockedPickerField.svelte +221 -0
  27. package/dist/date-picker/DockedPickerField.svelte.d.ts +9 -0
  28. package/dist/date-picker/MonthPanel.svelte +291 -0
  29. package/dist/date-picker/MonthPanel.svelte.d.ts +12 -0
  30. package/dist/date-picker/SelectionList.svelte +7 -6
  31. package/dist/date-picker/SelectionList.svelte.d.ts +1 -0
  32. package/dist/date-picker/TimeColumn.svelte +2 -6
  33. package/dist/date-picker/TimeColumn.svelte.d.ts +1 -0
  34. package/dist/date-picker/YearGrid.svelte +2 -11
  35. package/dist/date-picker/YearGrid.svelte.d.ts +1 -0
  36. package/dist/date-picker/dateUtils.d.ts +4 -0
  37. package/dist/date-picker/dateUtils.js +15 -88
  38. package/dist/date-picker/exitVisibility.svelte.js +13 -6
  39. package/dist/date-picker/formatters.d.ts +16 -0
  40. package/dist/date-picker/formatters.js +48 -15
  41. package/dist/date-picker/internalTypes.d.ts +59 -1
  42. package/dist/date-picker/shortcuts.d.ts +11 -0
  43. package/dist/date-picker/shortcuts.js +40 -0
  44. package/dist/date-picker/timeUtils.d.ts +8 -3
  45. package/dist/date-picker/timeUtils.js +33 -51
  46. package/dist/date-picker/types.d.ts +22 -0
  47. package/dist/icons/Icon.svelte +1 -4
  48. package/dist/internal/exit.css +0 -14
  49. package/dist/internal/field.css +337 -0
  50. package/dist/internal/focus-ring.css +23 -8
  51. package/dist/internal/pop-in.css +19 -0
  52. package/dist/internal/visually-hidden.css +11 -0
  53. package/dist/list/Item.svelte +32 -18
  54. package/dist/menu/Menu.svelte +6 -25
  55. package/dist/menu/Menu.svelte.d.ts +1 -0
  56. package/dist/navigation-bar/NavigationBarItem.svelte +6 -30
  57. package/dist/navigation-drawer/NavigationDrawerItem.svelte +4 -11
  58. package/dist/navigation-rail/NavigationRailItem.svelte +2 -13
  59. package/dist/press.svelte.d.ts +0 -1
  60. package/dist/press.svelte.js +0 -11
  61. package/dist/progress/CircularProgress.svelte +26 -81
  62. package/dist/progress/CircularProgress.svelte.d.ts +1 -0
  63. package/dist/progress/LinearProgress.svelte +19 -151
  64. package/dist/progress/LinearProgress.svelte.d.ts +1 -0
  65. package/dist/progress/four-color.css +34 -0
  66. package/dist/radio/Radio.svelte +6 -9
  67. package/dist/ripple/Ripple.svelte +8 -16
  68. package/dist/search/Search.svelte +2 -9
  69. package/dist/search/Search.svelte.d.ts +1 -0
  70. package/dist/select/Check.svelte +8 -31
  71. package/dist/select/Check.svelte.d.ts +1 -1
  72. package/dist/select/NativeSelect.svelte +97 -366
  73. package/dist/select/NativeSelect.svelte.d.ts +1 -0
  74. package/dist/select/Option.svelte +1 -9
  75. package/dist/select/Select.svelte +139 -746
  76. package/dist/select/Select.svelte.d.ts +1 -0
  77. package/dist/select/VirtualList.svelte +0 -1
  78. package/dist/sheet/Sheet.svelte +11 -22
  79. package/dist/slider/Slider.svelte +13 -37
  80. package/dist/slider/Slider.svelte.d.ts +1 -0
  81. package/dist/switch/Switch.svelte +2 -8
  82. package/dist/tabs/Tab.svelte +2 -4
  83. package/dist/text-field/TextField.svelte +81 -609
  84. package/dist/text-field/TextField.svelte.d.ts +1 -0
  85. package/dist/time-picker/ClockDial.svelte +8 -25
  86. package/dist/time-picker/ClockDial.svelte.d.ts +2 -0
  87. package/dist/time-picker/DockedTimePicker.svelte +102 -244
  88. package/dist/time-picker/DockedTimePicker.svelte.d.ts +2 -2
  89. package/dist/time-picker/PeriodSelector.svelte +8 -7
  90. package/dist/time-picker/PeriodSelector.svelte.d.ts +1 -0
  91. package/dist/time-picker/TimeInputs.svelte +13 -2
  92. package/dist/time-picker/TimePickerDialog.svelte +32 -26
  93. package/dist/time-picker/TimePickerDialog.svelte.d.ts +2 -2
  94. package/dist/time-picker/TimePickerPanel.svelte +26 -4
  95. package/dist/time-picker/TimeSelectors.svelte +4 -9
  96. package/dist/time-picker/TimeSelectors.svelte.d.ts +1 -0
  97. package/dist/time-picker/internalTypes.d.ts +2 -0
  98. package/dist/time-picker/timePickerState.svelte.js +3 -9
  99. package/dist/tooltip/RichTooltip.svelte +2 -23
  100. package/dist/tooltip/RichTooltip.svelte.d.ts +1 -0
  101. package/dist/tooltip/Tooltip.svelte +2 -24
  102. package/dist/tooltip/Tooltip.svelte.d.ts +1 -0
  103. package/package.json +12 -12
@@ -54,7 +54,7 @@
54
54
  <rect class="mark short" />
55
55
  <rect class="mark long" />
56
56
  </svg>
57
- <div class="np-input-wrapper">
57
+ <div class="np-input-wrapper np-focus-ring-within">
58
58
  {#if !attributes.disabled}
59
59
  <Ripple forElement={inputEl} />
60
60
  {/if}
@@ -115,13 +115,6 @@
115
115
  cursor: inherit;
116
116
  }
117
117
 
118
- .np-input-wrapper:has(input:focus-visible) {
119
- outline-style: solid;
120
- outline-color: var(--np-color-secondary);
121
- outline-width: 3px;
122
- outline-offset: 2px;
123
- animation: focusAnimation var(--np-motion-expressive-slow-effects) forwards;
124
- }
125
118
  .np-outline,
126
119
  .np-background,
127
120
  .np-icon {
@@ -52,6 +52,7 @@
52
52
  bind:this={element}
53
53
  class={[
54
54
  'np-filter-chip',
55
+ 'np-focus-ring-within',
55
56
  variant === 'elevated' ? 'np-filter-chip-elevated' : 'np-filter-chip-default',
56
57
  icon ? 'np-filter-chip-icon' : '',
57
58
  removable ? 'np-filter-chip-removable' : '',
@@ -257,16 +258,6 @@
257
258
  .np-filter-chip:has(input:checked) .np-filter-chip-label {
258
259
  color: var(--np-color-on-secondary-container);
259
260
  }
260
- .np-filter-chip-label:focus-visible {
261
- outline-width: 0;
262
- }
263
- .np-filter-chip:has(input:focus-visible) {
264
- outline-style: solid;
265
- outline-color: var(--np-color-secondary);
266
- outline-width: 3px;
267
- outline-offset: 2px;
268
- }
269
-
270
261
  .np-filter-chip-disabled .np-filter-chip-label {
271
262
  cursor: default;
272
263
  color: var(--np-color-on-surface) !important;
@@ -298,8 +289,5 @@
298
289
  .np-filter-chip-icon .np-chip-icon-checked {
299
290
  transition: none;
300
291
  }
301
- .np-filter-chip:has(input:focus-visible) {
302
- animation: focusAnimation var(--np-motion-expressive-slow-effects) forwards;
303
- }
304
292
  }
305
293
  </style>
@@ -1,6 +1,8 @@
1
1
  <script lang="ts">
2
+ import '../internal/focus-ring.css'
3
+ import '../internal/visually-hidden.css'
2
4
  import Ripple from '../ripple/Ripple.svelte'
3
- import { tick } from 'svelte'
5
+ import { flushSync } from 'svelte'
4
6
  import type { Attachment } from 'svelte/attachments'
5
7
  import {
6
8
  addDays,
@@ -16,6 +18,7 @@
16
18
  isSameDay,
17
19
  isWithin,
18
20
  MAX_CALENDAR_ROWS,
21
+ parseISODate,
19
22
  startOfDay,
20
23
  toISODate,
21
24
  today as getToday,
@@ -42,6 +45,7 @@
42
45
  tabStopDate,
43
46
  focusRoot,
44
47
  onselect,
48
+ onconfirm,
45
49
  onfocusday,
46
50
  onmonthstep,
47
51
  monthSubhead,
@@ -100,17 +104,25 @@
100
104
  )
101
105
  }
102
106
 
103
- const moveFocus = async (grid: HTMLElement, date: Date) => {
107
+ // The month changes and focus moves in one step, so no key lands on the page in between.
108
+ const moveFocus = (grid: HTMLElement, date: Date) => {
104
109
  const target = startOfDay(clampDate(date, min, max))
105
- onfocusday?.(target)
106
- await tick()
110
+ flushSync(() => onfocusday?.(target))
107
111
  findDay(focusRoot ?? grid, target)?.focus()
108
112
  }
109
113
 
110
114
  const handleKeydown = (event: KeyboardEvent & { currentTarget: EventTarget & HTMLElement }) => {
111
115
  const grid = event.currentTarget
112
116
  const from = focusedDate ?? tabStop
113
- // Right to left, the next day sits to the left.
117
+ if (event.key === 'Enter' && onconfirm) {
118
+ const day = (event.target as HTMLElement).closest<HTMLElement>('.np-calendar-day')
119
+ const date = parseISODate(day?.dataset.date)
120
+ if (!day || !date || day.getAttribute('aria-disabled') === 'true') return
121
+ event.preventDefault()
122
+ onselect?.(date)
123
+ onconfirm(date)
124
+ return
125
+ }
114
126
  const forward = getComputedStyle(grid).direction === 'rtl' ? -1 : 1
115
127
  switch (event.key) {
116
128
  case 'ArrowLeft':
@@ -197,12 +209,14 @@
197
209
  aria-label={monthLabel}
198
210
  onkeydown={handleKeydown}
199
211
  >
200
- <thead class={weekdays ? undefined : 'np-calendar-head-hidden'}>
212
+ <thead class={weekdays ? undefined : 'np-visually-hidden'}>
201
213
  <tr>
202
214
  {#each weekdayLabels as weekday (weekday.long)}
203
215
  <th scope="col" abbr={weekday.long} class="np-calendar-weekday">
204
- <span aria-hidden="true">{weekday.narrow}</span>
205
- <span class="np-calendar-sr-only">{weekday.long}</span>
216
+ <span class="np-calendar-weekday-short" aria-hidden="true" title={weekday.long}
217
+ >{weekday.narrow}</span
218
+ >
219
+ <span class="np-visually-hidden">{weekday.long}</span>
206
220
  </th>
207
221
  {/each}
208
222
  </tr>
@@ -256,7 +270,7 @@
256
270
  if (event.currentTarget.matches(':focus-visible')) onfocusday?.(date)
257
271
  }}
258
272
  >
259
- <span class="np-calendar-day-container">
273
+ <span class="np-calendar-day-container np-focus-ring-part">
260
274
  {date.getDate()}
261
275
  {#if enabled}
262
276
  <Ripple />
@@ -275,27 +289,17 @@
275
289
 
276
290
  <style>
277
291
  .np-calendar-body.dynamic {
292
+ box-sizing: content-box;
278
293
  overflow: hidden;
279
294
  height: calc(var(--np-calendar-head, 2.5rem) + var(--np-calendar-rows) * 3rem);
295
+ padding: 0 0.25rem 0.25rem;
296
+ margin: 0 -0.25rem -0.25rem;
280
297
  }
281
298
 
282
299
  .np-calendar.swipeable {
283
300
  touch-action: pan-y;
284
301
  }
285
302
 
286
- .np-calendar-sr-only,
287
- .np-calendar-head-hidden {
288
- position: absolute;
289
- width: 1px;
290
- height: 1px;
291
- padding: 0;
292
- margin: -1px;
293
- overflow: hidden;
294
- clip-path: inset(50%);
295
- white-space: nowrap;
296
- border-width: 0;
297
- }
298
-
299
303
  .np-calendar-grid {
300
304
  display: table;
301
305
  border-collapse: collapse;
@@ -354,6 +358,10 @@
354
358
  vertical-align: middle;
355
359
  }
356
360
 
361
+ .np-calendar-weekday-short {
362
+ display: block;
363
+ }
364
+
357
365
  .np-calendar-weekday {
358
366
  box-sizing: content-box;
359
367
  height: 1.5rem;
@@ -408,9 +416,7 @@
408
416
  }
409
417
 
410
418
  .np-calendar-day:not(.between) .np-calendar-day-container {
411
- transition:
412
- background-color var(--np-motion-expressive-default-effects),
413
- outline-color var(--np-motion-expressive-default-effects);
419
+ transition: background-color var(--np-motion-expressive-default-effects);
414
420
  }
415
421
  }
416
422
 
@@ -458,11 +464,6 @@
458
464
  outline: none;
459
465
  }
460
466
 
461
- .np-calendar-day:focus-visible .np-calendar-day-container {
462
- outline: 3px solid var(--np-color-secondary);
463
- outline-offset: 2px;
464
- }
465
-
466
467
  .np-calendar-cell.in-range::before,
467
468
  .np-calendar-cell.range-start::before,
468
469
  .np-calendar-cell.range-end::before {
@@ -1,3 +1,5 @@
1
+ import '../internal/focus-ring.css';
2
+ import '../internal/visually-hidden.css';
1
3
  import type { CalendarProps } from './types.js';
2
4
  declare const Calendar: import("svelte").Component<CalendarProps, {}, "">;
3
5
  type Calendar = ReturnType<typeof Calendar>;
@@ -1,9 +1,14 @@
1
1
  <script lang="ts">
2
+ import '../internal/focus-ring.css'
3
+ import IconButton from '../button/IconButton.svelte'
2
4
  import ArrowDropDownIcon from '../icons/ArrowDropDownIcon.svelte'
3
5
  import ChevronLeftIcon from '../icons/ChevronLeftIcon.svelte'
4
6
  import ChevronRightIcon from '../icons/ChevronRightIcon.svelte'
5
7
  import Ripple from '../ripple/Ripple.svelte'
8
+ import Tooltip from '../tooltip/Tooltip.svelte'
6
9
  import type { HTMLAttributes } from 'svelte/elements'
10
+ import { DEFAULT_SHORTCUT_LABELS, withShortcut } from './shortcuts.js'
11
+ import type { DatePickerShortcutLabels } from './types.js'
7
12
 
8
13
  interface CalendarHeaderProps extends HTMLAttributes<HTMLDivElement> {
9
14
  monthLabel: string
@@ -19,6 +24,7 @@
19
24
  nextYearLabel: string
20
25
  selectMonthLabel: string
21
26
  selectYearLabel: string
27
+ shortcutLabels?: Partial<DatePickerShortcutLabels>
22
28
  monthListId: string
23
29
  yearListId: string
24
30
  onpreviousmonth?: () => void
@@ -43,6 +49,7 @@
43
49
  nextYearLabel,
44
50
  selectMonthLabel,
45
51
  selectYearLabel,
52
+ shortcutLabels,
46
53
  monthListId,
47
54
  yearListId,
48
55
  onpreviousmonth,
@@ -54,40 +61,51 @@
54
61
  ...attributes
55
62
  }: CalendarHeaderProps = $props()
56
63
 
64
+ const uid = $props.id()
57
65
  let showSteppers = $derived(mode === 'days')
66
+ let keys = $derived({ ...DEFAULT_SHORTCUT_LABELS, ...shortcutLabels })
58
67
  </script>
59
68
 
60
- {#snippet stepper(label: string, enabled: boolean, next: boolean, onclick?: () => void)}
61
- <button
62
- type="button"
63
- class={['np-date-picker-stepper', !showSteppers && 'hidden']}
64
- aria-label={label}
65
- disabled={!enabled}
66
- {onclick}
67
- >
68
- {#if next}
69
- <ChevronRightIcon />
70
- {:else}
71
- <ChevronLeftIcon />
72
- {/if}
73
- {#if enabled}
74
- <Ripple />
75
- {/if}
76
- </button>
69
+ {#snippet stepper(
70
+ label: string,
71
+ key: string,
72
+ enabled: boolean,
73
+ next: boolean,
74
+ onclick?: () => void,
75
+ )}
76
+ <span class={['np-date-picker-stepper', !showSteppers && 'hidden']}>
77
+ <IconButton
78
+ type="button"
79
+ class="np-focus-ring-inset"
80
+ aria-label={label}
81
+ title={withShortcut(label, key)}
82
+ disabled={!enabled}
83
+ {onclick}
84
+ >
85
+ {#if next}
86
+ <ChevronRightIcon />
87
+ {:else}
88
+ <ChevronLeftIcon />
89
+ {/if}
90
+ </IconButton>
91
+ </span>
77
92
  {/snippet}
78
93
 
79
94
  {#snippet menuButton(
80
95
  label: string,
81
96
  accessibleLabel: string,
97
+ key: string,
82
98
  expanded: boolean,
83
99
  disabled: boolean,
84
100
  controls: string,
101
+ tooltipId: string,
85
102
  onclick?: () => void,
86
103
  )}
87
104
  <button
88
105
  type="button"
89
- class="np-date-picker-menu-button"
106
+ class="np-date-picker-menu-button np-focus-ring"
90
107
  aria-label="{accessibleLabel}, {label}"
108
+ aria-describedby={disabled ? undefined : tooltipId}
91
109
  aria-haspopup="listbox"
92
110
  aria-expanded={expanded}
93
111
  aria-controls={expanded ? controls : undefined}
@@ -102,32 +120,45 @@
102
120
  <Ripple />
103
121
  {/if}
104
122
  </button>
123
+ {#if !disabled}
124
+ <Tooltip id={tooltipId}>{withShortcut(accessibleLabel, key)}</Tooltip>
125
+ {/if}
105
126
  {/snippet}
106
127
 
107
128
  <div {...attributes} class={['np-date-picker-header', attributes.class]}>
108
129
  <div class="np-date-picker-header-group">
109
- {@render stepper(previousMonthLabel, canPreviousMonth, false, onpreviousmonth)}
130
+ {@render stepper(
131
+ previousMonthLabel,
132
+ keys.previousMonth,
133
+ canPreviousMonth,
134
+ false,
135
+ onpreviousmonth,
136
+ )}
110
137
  {@render menuButton(
111
138
  monthLabel,
112
139
  selectMonthLabel,
140
+ keys.monthList,
113
141
  mode === 'months',
114
142
  mode === 'years',
115
143
  monthListId,
144
+ `${uid}-month-tip`,
116
145
  ontogglemonths,
117
146
  )}
118
- {@render stepper(nextMonthLabel, canNextMonth, true, onnextmonth)}
147
+ {@render stepper(nextMonthLabel, keys.nextMonth, canNextMonth, true, onnextmonth)}
119
148
  </div>
120
149
  <div class="np-date-picker-header-group">
121
- {@render stepper(previousYearLabel, canPreviousYear, false, onpreviousyear)}
150
+ {@render stepper(previousYearLabel, keys.previousYear, canPreviousYear, false, onpreviousyear)}
122
151
  {@render menuButton(
123
152
  yearLabel,
124
153
  selectYearLabel,
154
+ keys.yearList,
125
155
  mode === 'years',
126
156
  mode === 'months',
127
157
  yearListId,
158
+ `${uid}-year-tip`,
128
159
  ontoggleyears,
129
160
  )}
130
- {@render stepper(nextYearLabel, canNextYear, true, onnextyear)}
161
+ {@render stepper(nextYearLabel, keys.nextYear, canNextYear, true, onnextyear)}
131
162
  </div>
132
163
  </div>
133
164
 
@@ -138,6 +169,10 @@
138
169
  justify-content: space-between;
139
170
  height: 1.5rem;
140
171
  color: var(--np-date-picker-header-color, var(--np-color-on-surface-variant));
172
+ --np-icon-button-icon-color: var(
173
+ --np-date-picker-header-color,
174
+ var(--np-color-on-surface-variant)
175
+ );
141
176
  }
142
177
 
143
178
  .np-date-picker-header-group {
@@ -146,24 +181,48 @@
146
181
  gap: 0.25rem;
147
182
  }
148
183
 
149
- .np-date-picker-stepper,
184
+ .np-date-picker-header-group:first-child {
185
+ margin-inline-start: -0.5rem;
186
+ }
187
+ .np-date-picker-header-group:last-child {
188
+ margin-inline-end: -0.5rem;
189
+ }
190
+
191
+ .np-date-picker-stepper {
192
+ display: flex;
193
+ flex: none;
194
+ }
195
+
196
+ .np-date-picker-stepper.hidden {
197
+ visibility: hidden;
198
+ opacity: 0;
199
+ }
200
+
201
+ @media (prefers-reduced-motion: no-preference) {
202
+ .np-date-picker-stepper {
203
+ transition:
204
+ opacity var(--np-motion-expressive-default-effects),
205
+ visibility var(--np-motion-expressive-default-effects);
206
+ }
207
+ }
208
+
150
209
  .np-date-picker-menu-button {
151
210
  font: inherit;
152
211
  -webkit-tap-highlight-color: transparent;
153
212
  background: none;
154
213
  border: 0;
155
- padding: 0;
156
214
  margin: 0;
157
215
  color: inherit;
158
216
  cursor: pointer;
159
217
  position: relative;
160
218
  display: flex;
161
219
  align-items: center;
220
+ gap: 0.25rem;
162
221
  height: 1.5rem;
222
+ padding: 0 0.5rem;
163
223
  border-radius: var(--np-shape-corner-full);
164
224
  }
165
225
 
166
- .np-date-picker-stepper::before,
167
226
  .np-date-picker-menu-button::before {
168
227
  content: '';
169
228
  position: absolute;
@@ -171,30 +230,6 @@
171
230
  inset-inline: 0;
172
231
  }
173
232
 
174
- .np-date-picker-stepper.hidden {
175
- visibility: hidden;
176
- opacity: 0;
177
- }
178
-
179
- @media (prefers-reduced-motion: no-preference) {
180
- .np-date-picker-stepper {
181
- transition:
182
- opacity var(--np-motion-expressive-default-effects),
183
- visibility var(--np-motion-expressive-default-effects);
184
- }
185
- }
186
-
187
- .np-date-picker-stepper {
188
- width: 1.5rem;
189
- justify-content: center;
190
- flex: none;
191
- }
192
-
193
- .np-date-picker-menu-button {
194
- gap: 0.25rem;
195
- padding-inline: 0.5rem;
196
- }
197
-
198
233
  .np-date-picker-menu-button-label {
199
234
  font-size: 0.875rem;
200
235
  line-height: 1.25rem;
@@ -212,27 +247,14 @@
212
247
  rotate: 180deg;
213
248
  }
214
249
 
215
- :global(.np-date-picker-stepper svg) {
216
- width: 1.5rem;
217
- height: 1.5rem;
218
- fill: currentColor;
219
- }
220
-
221
250
  :global(.np-date-picker-menu-button-caret svg) {
222
251
  width: 1.25rem;
223
252
  height: 1.25rem;
224
253
  fill: currentColor;
225
254
  }
226
255
 
227
- .np-date-picker-stepper:disabled,
228
256
  .np-date-picker-menu-button:disabled {
229
257
  cursor: default;
230
258
  color: color-mix(in srgb, var(--np-color-on-surface) 38%, transparent);
231
259
  }
232
-
233
- .np-date-picker-stepper:focus-visible,
234
- .np-date-picker-menu-button:focus-visible {
235
- outline: 3px solid var(--np-color-secondary);
236
- outline-offset: 2px;
237
- }
238
260
  </style>
@@ -1,4 +1,6 @@
1
+ import '../internal/focus-ring.css';
1
2
  import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { DatePickerShortcutLabels } from './types.js';
2
4
  interface CalendarHeaderProps extends HTMLAttributes<HTMLDivElement> {
3
5
  monthLabel: string;
4
6
  yearLabel: string;
@@ -13,6 +15,7 @@ interface CalendarHeaderProps extends HTMLAttributes<HTMLDivElement> {
13
15
  nextYearLabel: string;
14
16
  selectMonthLabel: string;
15
17
  selectYearLabel: string;
18
+ shortcutLabels?: Partial<DatePickerShortcutLabels>;
16
19
  monthListId: string;
17
20
  yearListId: string;
18
21
  onpreviousmonth?: () => void;