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
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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"
|
|
205
|
-
|
|
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,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(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
>
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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(
|
|
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-
|
|
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;
|