@human-kit/svelte-components 1.0.0-alpha.2 → 1.0.0-alpha.4
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/FOCUS_STATE_CONTRACT.md +63 -0
- package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
- package/dist/calendar/README.md +2 -1
- package/dist/calendar/TODO.md +21 -107
- package/dist/calendar/body-cell/README.md +15 -0
- package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
- package/dist/calendar/grid/README.md +13 -0
- package/dist/calendar/grid-body/README.md +13 -0
- package/dist/calendar/grid-header/README.md +13 -0
- package/dist/calendar/header-cell/README.md +14 -0
- package/dist/calendar/heading/README.md +13 -0
- package/dist/calendar/root/README.md +24 -0
- package/dist/calendar/root/calendar-root-test.svelte +4 -0
- package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
- package/dist/calendar/root/calendar-root.svelte +3 -0
- package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
- package/dist/calendar/root/context.d.ts +4 -0
- package/dist/calendar/root/context.js +28 -25
- package/dist/calendar/root/date-utils.d.ts +1 -1
- package/dist/calendar/root/date-utils.js +16 -26
- package/dist/calendar/trigger-next/README.md +14 -0
- package/dist/calendar/trigger-previous/README.md +14 -0
- package/dist/clock/README.md +75 -0
- package/dist/clock/axis/README.md +24 -0
- package/dist/clock/axis/clock-axis.svelte +37 -0
- package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
- package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
- package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
- package/dist/clock/index.d.ts +10 -0
- package/dist/clock/index.js +10 -0
- package/dist/clock/index.parts.d.ts +4 -0
- package/dist/clock/index.parts.js +4 -0
- package/dist/clock/root/README.md +38 -0
- package/dist/clock/root/clock-root-test.svelte +62 -0
- package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
- package/dist/clock/root/clock-root.svelte +329 -0
- package/dist/clock/root/clock-root.svelte.d.ts +25 -0
- package/dist/clock/root/context.d.ts +22 -0
- package/dist/clock/root/context.js +15 -0
- package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
- package/dist/clock/root/resolve-visible-columns.js +16 -0
- package/dist/clock/root/time-utils.d.ts +48 -0
- package/dist/clock/root/time-utils.js +314 -0
- package/dist/clock/root/wheel-options.d.ts +17 -0
- package/dist/clock/root/wheel-options.js +63 -0
- package/dist/clock/wheel-column/README.md +25 -0
- package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
- package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
- package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
- package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
- package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
- package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
- package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
- package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
- package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
- package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
- package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
- package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
- package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
- package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
- package/dist/clock/wheel-item/README.md +17 -0
- package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
- package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
- package/dist/combobox/TODO.md +28 -175
- package/dist/combobox/button/combobox-button.svelte +2 -0
- package/dist/combobox/root/combobox.svelte +30 -0
- package/dist/datepicker/README.md +100 -0
- package/dist/datepicker/TODO.md +28 -0
- package/dist/datepicker/calendar/README.md +19 -0
- package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
- package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
- package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
- package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
- package/dist/datepicker/index.d.ts +18 -0
- package/dist/datepicker/index.js +18 -0
- package/dist/datepicker/index.parts.d.ts +14 -0
- package/dist/datepicker/index.parts.js +14 -0
- package/dist/datepicker/input/README.md +15 -0
- package/dist/datepicker/input/date-picker-input.svelte +108 -0
- package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
- package/dist/datepicker/internal/strict-props.d.ts +2 -0
- package/dist/datepicker/internal/strict-props.js +28 -0
- package/dist/datepicker/popover/README.md +20 -0
- package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
- package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
- package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
- package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
- package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
- package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
- package/dist/datepicker/root/README.md +38 -0
- package/dist/datepicker/root/context.d.ts +43 -0
- package/dist/datepicker/root/context.js +15 -0
- package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
- package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
- package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
- package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
- package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
- package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
- package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
- package/dist/datepicker/root/date-picker-root.svelte +495 -0
- package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
- package/dist/datepicker/root/date-picker-test.svelte +86 -0
- package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
- package/dist/datepicker/root/date-utils.d.ts +17 -0
- package/dist/datepicker/root/date-utils.js +138 -0
- package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
- package/dist/datepicker/root/draft-evaluation.js +56 -0
- package/dist/datepicker/root/focus-controller.d.ts +3 -0
- package/dist/datepicker/root/focus-controller.js +15 -0
- package/dist/datepicker/root/open-change.d.ts +5 -0
- package/dist/datepicker/root/open-change.js +13 -0
- package/dist/datepicker/root/open-controller.d.ts +7 -0
- package/dist/datepicker/root/open-controller.js +15 -0
- package/dist/datepicker/root/segment-controller.d.ts +8 -0
- package/dist/datepicker/root/segment-controller.js +53 -0
- package/dist/datepicker/root/segment-state.d.ts +18 -0
- package/dist/datepicker/root/segment-state.js +134 -0
- package/dist/datepicker/root/value-commit.d.ts +4 -0
- package/dist/datepicker/root/value-commit.js +8 -0
- package/dist/datepicker/segment/README.md +14 -0
- package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
- package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
- package/dist/datepicker/trigger/README.md +14 -0
- package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
- package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
- package/dist/dialog/content/dialog-content.svelte +6 -6
- package/dist/dialog/root/context.d.ts +2 -1
- package/dist/dialog/root/dialog-root.svelte +9 -2
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/listbox/root/listbox.svelte +44 -0
- package/dist/popover/README.md +10 -0
- package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
- package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
- package/dist/popover/content/popover-content-test.svelte +2 -1
- package/dist/popover/content/popover-content-test.svelte.d.ts +2 -1
- package/dist/popover/content/popover-content.svelte +91 -18
- package/dist/popover/content/popover-content.svelte.d.ts +5 -1
- package/dist/popover/index.d.ts +1 -1
- package/dist/popover/index.js +1 -3
- package/dist/popover/root/README.md +10 -15
- package/dist/popover/root/context.d.ts +16 -7
- package/dist/popover/root/context.js +0 -2
- package/dist/popover/root/focus-state.d.ts +4 -0
- package/dist/popover/root/focus-state.js +33 -0
- package/dist/popover/root/popover-root.svelte +90 -17
- package/dist/popover/root/popover-root.svelte.d.ts +2 -1
- package/dist/popover/root/popover-test.svelte +2 -1
- package/dist/popover/root/popover-test.svelte.d.ts +2 -1
- package/dist/popover/trigger/popover-trigger-button.svelte +4 -4
- package/dist/popover/trigger/popover-trigger.svelte +1 -1
- package/dist/portal/portal.svelte +3 -1
- package/dist/primitives/click-outside.d.ts +1 -1
- package/dist/primitives/click-outside.js +1 -1
- package/dist/primitives/focus-trap.d.ts +7 -2
- package/dist/primitives/focus-trap.js +50 -17
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.js +1 -0
- package/dist/primitives/input-modality.d.ts +7 -0
- package/dist/primitives/input-modality.js +125 -0
- package/dist/test-utils/focus-contract.d.ts +3 -0
- package/dist/test-utils/focus-contract.js +26 -0
- package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
- package/dist/timepicker/README.md +97 -0
- package/dist/timepicker/TODO.md +86 -0
- package/dist/timepicker/clock/README.md +14 -0
- package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
- package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
- package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
- package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
- package/dist/timepicker/index.d.ts +14 -0
- package/dist/timepicker/index.js +14 -0
- package/dist/timepicker/index.parts.d.ts +8 -0
- package/dist/timepicker/index.parts.js +8 -0
- package/dist/timepicker/input/README.md +15 -0
- package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
- package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
- package/dist/timepicker/input/time-picker-input.svelte +109 -0
- package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
- package/dist/timepicker/internal/strict-props.d.ts +4 -0
- package/dist/timepicker/internal/strict-props.js +51 -0
- package/dist/timepicker/popover/README.md +20 -0
- package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
- package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
- package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
- package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
- package/dist/timepicker/root/README.md +42 -0
- package/dist/timepicker/root/context.d.ts +51 -0
- package/dist/timepicker/root/context.js +15 -0
- package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
- package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
- package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
- package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
- package/dist/timepicker/root/time-picker-root.svelte +625 -0
- package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
- package/dist/timepicker/root/time-picker-test.svelte +72 -0
- package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
- package/dist/timepicker/root/time-utils.d.ts +1 -0
- package/dist/timepicker/root/time-utils.js +3 -0
- package/dist/timepicker/segment/README.md +14 -0
- package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
- package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
- package/dist/timepicker/trigger/README.md +14 -0
- package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
- package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
- package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
- package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
- package/dist/utils/date-only.d.ts +11 -0
- package/dist/utils/date-only.js +53 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/package.json +16 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import DatePicker from '../index';
|
|
3
|
+
|
|
4
|
+
type Props = {
|
|
5
|
+
defaultValue?: string;
|
|
6
|
+
defaultOpen?: boolean;
|
|
7
|
+
isDisabled?: boolean;
|
|
8
|
+
isReadOnly?: boolean;
|
|
9
|
+
minValue?: string;
|
|
10
|
+
maxValue?: string;
|
|
11
|
+
isDateUnavailable?: (date: string) => boolean;
|
|
12
|
+
popoverAriaLabel?: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
defaultValue = '2026-02-10',
|
|
17
|
+
defaultOpen = false,
|
|
18
|
+
isDisabled = false,
|
|
19
|
+
isReadOnly = false,
|
|
20
|
+
minValue,
|
|
21
|
+
maxValue,
|
|
22
|
+
isDateUnavailable,
|
|
23
|
+
popoverAriaLabel = 'Calendar'
|
|
24
|
+
}: Props = $props();
|
|
25
|
+
|
|
26
|
+
let selectedValue = $state<string | null>('');
|
|
27
|
+
let openState = $state((() => defaultOpen)());
|
|
28
|
+
let openReason = $state('');
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<DatePicker.Root
|
|
32
|
+
{defaultValue}
|
|
33
|
+
{defaultOpen}
|
|
34
|
+
{isDisabled}
|
|
35
|
+
{isReadOnly}
|
|
36
|
+
{minValue}
|
|
37
|
+
{maxValue}
|
|
38
|
+
{isDateUnavailable}
|
|
39
|
+
onChange={(nextValue) => {
|
|
40
|
+
selectedValue = nextValue;
|
|
41
|
+
}}
|
|
42
|
+
onOpenChange={(nextOpen, details) => {
|
|
43
|
+
openState = nextOpen;
|
|
44
|
+
openReason = details.reason;
|
|
45
|
+
}}
|
|
46
|
+
>
|
|
47
|
+
<DatePicker.Input class="date-picker-input" aria-label="Date input">
|
|
48
|
+
{#snippet children(segment)}
|
|
49
|
+
<DatePicker.Segment class="date-picker-segment" {segment} />
|
|
50
|
+
{/snippet}
|
|
51
|
+
</DatePicker.Input>
|
|
52
|
+
<DatePicker.Trigger class="date-picker-trigger">Open calendar</DatePicker.Trigger>
|
|
53
|
+
|
|
54
|
+
<DatePicker.Popover class="date-picker-popover" aria-label={popoverAriaLabel}>
|
|
55
|
+
<DatePicker.Calendar class="date-picker-calendar">
|
|
56
|
+
<div class="flex items-center justify-between gap-2 p-2">
|
|
57
|
+
<DatePicker.TriggerPrevious
|
|
58
|
+
class="inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-gray-100 dark:hover:bg-gray-700"
|
|
59
|
+
/>
|
|
60
|
+
<DatePicker.Heading class="text-sm font-medium" />
|
|
61
|
+
<DatePicker.TriggerNext
|
|
62
|
+
class="inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-gray-100 dark:hover:bg-gray-700"
|
|
63
|
+
/>
|
|
64
|
+
</div>
|
|
65
|
+
<DatePicker.Grid class="w-full border-separate border-spacing-1 px-2 pb-2">
|
|
66
|
+
<DatePicker.GridHeader>
|
|
67
|
+
{#snippet children(dayLabel: string)}
|
|
68
|
+
<DatePicker.HeaderCell>
|
|
69
|
+
{dayLabel}
|
|
70
|
+
</DatePicker.HeaderCell>
|
|
71
|
+
{/snippet}
|
|
72
|
+
</DatePicker.GridHeader>
|
|
73
|
+
<DatePicker.GridBody>
|
|
74
|
+
{#snippet children(date: string)}
|
|
75
|
+
<DatePicker.BodyCell {date} />
|
|
76
|
+
{/snippet}
|
|
77
|
+
</DatePicker.GridBody>
|
|
78
|
+
</DatePicker.Grid>
|
|
79
|
+
</DatePicker.Calendar>
|
|
80
|
+
</DatePicker.Popover>
|
|
81
|
+
</DatePicker.Root>
|
|
82
|
+
|
|
83
|
+
<p data-testid="date-picker-value">{selectedValue}</p>
|
|
84
|
+
<p data-testid="date-picker-open">{String(openState)}</p>
|
|
85
|
+
<p data-testid="date-picker-open-reason">{openReason}</p>
|
|
86
|
+
<button type="button" data-testid="outside-button">Outside</button>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
defaultValue?: string;
|
|
3
|
+
defaultOpen?: boolean;
|
|
4
|
+
isDisabled?: boolean;
|
|
5
|
+
isReadOnly?: boolean;
|
|
6
|
+
minValue?: string;
|
|
7
|
+
maxValue?: string;
|
|
8
|
+
isDateUnavailable?: (date: string) => boolean;
|
|
9
|
+
popoverAriaLabel?: string;
|
|
10
|
+
};
|
|
11
|
+
declare const DatePickerTest: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type DatePickerTest = ReturnType<typeof DatePickerTest>;
|
|
13
|
+
export default DatePickerTest;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type DatePickerDateValue = string;
|
|
2
|
+
export type DatePickerSegmentType = 'day' | 'month' | 'year' | 'literal';
|
|
3
|
+
export type DatePickerEditableSegmentType = Exclude<DatePickerSegmentType, 'literal'>;
|
|
4
|
+
export type DatePickerSegmentPart = {
|
|
5
|
+
type: DatePickerSegmentType;
|
|
6
|
+
text: string;
|
|
7
|
+
value: string;
|
|
8
|
+
placeholder: string;
|
|
9
|
+
isPlaceholder: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare function isValidDatePickerValue(value: string | undefined): value is DatePickerDateValue;
|
|
12
|
+
export declare function parseDatePickerValue(value: string): Date | null;
|
|
13
|
+
export declare function formatDatePickerValue(date: Date): DatePickerDateValue;
|
|
14
|
+
export declare function compareDatePickerValues(left: DatePickerDateValue, right: DatePickerDateValue): number;
|
|
15
|
+
export declare function getDatePickerSegmentOrder(locale: string): DatePickerEditableSegmentType[];
|
|
16
|
+
export declare function getDatePickerSegmentLabel(locale: string, type: DatePickerEditableSegmentType): string;
|
|
17
|
+
export declare function buildDatePickerSegments(locale: string, value?: DatePickerDateValue): DatePickerSegmentPart[];
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { compareDateOnlyValues, formatDateOnlyValue, isValidDateOnlyValue, parseDateOnlyValue } from '../../utils/date-only';
|
|
2
|
+
const segmentsFormatterCache = new Map();
|
|
3
|
+
const segmentTemplateCache = new Map();
|
|
4
|
+
const segmentLabelCache = new Map();
|
|
5
|
+
const fallbackSegmentLabels = {
|
|
6
|
+
day: 'Day',
|
|
7
|
+
month: 'Month',
|
|
8
|
+
year: 'Year'
|
|
9
|
+
};
|
|
10
|
+
export function isValidDatePickerValue(value) {
|
|
11
|
+
return isValidDateOnlyValue(value);
|
|
12
|
+
}
|
|
13
|
+
export function parseDatePickerValue(value) {
|
|
14
|
+
return parseDateOnlyValue(value);
|
|
15
|
+
}
|
|
16
|
+
export function formatDatePickerValue(date) {
|
|
17
|
+
return formatDateOnlyValue(date);
|
|
18
|
+
}
|
|
19
|
+
export function compareDatePickerValues(left, right) {
|
|
20
|
+
return compareDateOnlyValues(left, right);
|
|
21
|
+
}
|
|
22
|
+
function getPartValue(type, value) {
|
|
23
|
+
if (!value || !isValidDatePickerValue(value))
|
|
24
|
+
return '';
|
|
25
|
+
const [year, month, day] = value.split('-');
|
|
26
|
+
if (type === 'day')
|
|
27
|
+
return day;
|
|
28
|
+
if (type === 'month')
|
|
29
|
+
return month;
|
|
30
|
+
return year;
|
|
31
|
+
}
|
|
32
|
+
function getPlaceholder(type) {
|
|
33
|
+
if (type === 'day')
|
|
34
|
+
return 'dd';
|
|
35
|
+
if (type === 'month')
|
|
36
|
+
return 'mm';
|
|
37
|
+
return 'yyyy';
|
|
38
|
+
}
|
|
39
|
+
function getFormatter(locale) {
|
|
40
|
+
let formatter = segmentsFormatterCache.get(locale);
|
|
41
|
+
if (!formatter) {
|
|
42
|
+
formatter = new Intl.DateTimeFormat(locale, {
|
|
43
|
+
timeZone: 'UTC',
|
|
44
|
+
year: 'numeric',
|
|
45
|
+
month: '2-digit',
|
|
46
|
+
day: '2-digit'
|
|
47
|
+
});
|
|
48
|
+
segmentsFormatterCache.set(locale, formatter);
|
|
49
|
+
}
|
|
50
|
+
return formatter;
|
|
51
|
+
}
|
|
52
|
+
function getSegmentTemplate(locale) {
|
|
53
|
+
let template = segmentTemplateCache.get(locale);
|
|
54
|
+
if (template)
|
|
55
|
+
return template;
|
|
56
|
+
const formatter = getFormatter(locale);
|
|
57
|
+
const sample = new Date(Date.UTC(2030, 10, 22));
|
|
58
|
+
const parts = formatter.formatToParts(sample);
|
|
59
|
+
template = parts
|
|
60
|
+
.filter((part) => part.type === 'literal' ||
|
|
61
|
+
part.type === 'day' ||
|
|
62
|
+
part.type === 'month' ||
|
|
63
|
+
part.type === 'year')
|
|
64
|
+
.map((part) => {
|
|
65
|
+
if (part.type === 'literal') {
|
|
66
|
+
return {
|
|
67
|
+
type: 'literal',
|
|
68
|
+
text: part.value
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const type = part.type;
|
|
72
|
+
return {
|
|
73
|
+
type,
|
|
74
|
+
placeholder: getPlaceholder(type)
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
segmentTemplateCache.set(locale, template);
|
|
78
|
+
return template;
|
|
79
|
+
}
|
|
80
|
+
function sentenceCase(value) {
|
|
81
|
+
if (value.length === 0)
|
|
82
|
+
return value;
|
|
83
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
84
|
+
}
|
|
85
|
+
function getSegmentLabels(locale) {
|
|
86
|
+
const labels = segmentLabelCache.get(locale);
|
|
87
|
+
if (labels)
|
|
88
|
+
return labels;
|
|
89
|
+
const nextLabels = { ...fallbackSegmentLabels };
|
|
90
|
+
if (typeof Intl.DisplayNames === 'function') {
|
|
91
|
+
try {
|
|
92
|
+
const displayNames = new Intl.DisplayNames([locale], {
|
|
93
|
+
type: 'dateTimeField'
|
|
94
|
+
});
|
|
95
|
+
const day = displayNames.of('day');
|
|
96
|
+
const month = displayNames.of('month');
|
|
97
|
+
const year = displayNames.of('year');
|
|
98
|
+
if (day)
|
|
99
|
+
nextLabels.day = sentenceCase(day);
|
|
100
|
+
if (month)
|
|
101
|
+
nextLabels.month = sentenceCase(month);
|
|
102
|
+
if (year)
|
|
103
|
+
nextLabels.year = sentenceCase(year);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Ignore locale/feature errors and use fallback labels.
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
segmentLabelCache.set(locale, nextLabels);
|
|
110
|
+
return nextLabels;
|
|
111
|
+
}
|
|
112
|
+
export function getDatePickerSegmentOrder(locale) {
|
|
113
|
+
return getSegmentTemplate(locale).flatMap((part) => (part.type === 'literal' ? [] : [part.type]));
|
|
114
|
+
}
|
|
115
|
+
export function getDatePickerSegmentLabel(locale, type) {
|
|
116
|
+
return getSegmentLabels(locale)[type];
|
|
117
|
+
}
|
|
118
|
+
export function buildDatePickerSegments(locale, value) {
|
|
119
|
+
return getSegmentTemplate(locale).map((part) => {
|
|
120
|
+
if (part.type === 'literal') {
|
|
121
|
+
return {
|
|
122
|
+
type: 'literal',
|
|
123
|
+
text: part.text,
|
|
124
|
+
value: part.text,
|
|
125
|
+
placeholder: part.text,
|
|
126
|
+
isPlaceholder: false
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const segmentValue = getPartValue(part.type, value);
|
|
130
|
+
return {
|
|
131
|
+
type: part.type,
|
|
132
|
+
text: segmentValue || part.placeholder,
|
|
133
|
+
value: segmentValue,
|
|
134
|
+
placeholder: part.placeholder,
|
|
135
|
+
isPlaceholder: segmentValue.length === 0
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DatePickerDateValue } from './date-utils';
|
|
2
|
+
import { type DatePickerSegmentDraft } from './segment-state';
|
|
3
|
+
export type DatePickerDraftStatus = 'empty' | 'incomplete' | 'invalid' | 'out-of-range' | 'unavailable' | 'valid';
|
|
4
|
+
export type DatePickerDraftEvaluation = {
|
|
5
|
+
status: DatePickerDraftStatus;
|
|
6
|
+
value: DatePickerDateValue | null;
|
|
7
|
+
isCommitable: boolean;
|
|
8
|
+
isInvalid: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function evaluateDatePickerDraft(draft: DatePickerSegmentDraft, options: {
|
|
11
|
+
isDateOutOfRange: (value: DatePickerDateValue) => boolean;
|
|
12
|
+
isDateUnavailable: (value: DatePickerDateValue) => boolean;
|
|
13
|
+
}): DatePickerDraftEvaluation;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getCandidateValueFromDraft } from './segment-state';
|
|
2
|
+
function isDraftEmpty(draft) {
|
|
3
|
+
return draft.day.length === 0 && draft.month.length === 0 && draft.year.length === 0;
|
|
4
|
+
}
|
|
5
|
+
function isDraftIncomplete(draft) {
|
|
6
|
+
return draft.day.length === 0 || draft.month.length === 0 || draft.year.length === 0;
|
|
7
|
+
}
|
|
8
|
+
export function evaluateDatePickerDraft(draft, options) {
|
|
9
|
+
if (isDraftEmpty(draft)) {
|
|
10
|
+
return {
|
|
11
|
+
status: 'empty',
|
|
12
|
+
value: null,
|
|
13
|
+
isCommitable: false,
|
|
14
|
+
isInvalid: false
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (isDraftIncomplete(draft)) {
|
|
18
|
+
return {
|
|
19
|
+
status: 'incomplete',
|
|
20
|
+
value: null,
|
|
21
|
+
isCommitable: false,
|
|
22
|
+
isInvalid: true
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const candidate = getCandidateValueFromDraft(draft);
|
|
26
|
+
if (!candidate) {
|
|
27
|
+
return {
|
|
28
|
+
status: 'invalid',
|
|
29
|
+
value: null,
|
|
30
|
+
isCommitable: false,
|
|
31
|
+
isInvalid: true
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (options.isDateOutOfRange(candidate)) {
|
|
35
|
+
return {
|
|
36
|
+
status: 'out-of-range',
|
|
37
|
+
value: null,
|
|
38
|
+
isCommitable: false,
|
|
39
|
+
isInvalid: true
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (options.isDateUnavailable(candidate)) {
|
|
43
|
+
return {
|
|
44
|
+
status: 'unavailable',
|
|
45
|
+
value: null,
|
|
46
|
+
isCommitable: false,
|
|
47
|
+
isInvalid: true
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
status: 'valid',
|
|
52
|
+
value: candidate,
|
|
53
|
+
isCommitable: true,
|
|
54
|
+
isInvalid: false
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { focusWithModality } from '../../primitives/input-modality';
|
|
2
|
+
export function applyTriggerSelectionCloseState(triggerRef, modality) {
|
|
3
|
+
if (!triggerRef)
|
|
4
|
+
return;
|
|
5
|
+
requestAnimationFrame(() => {
|
|
6
|
+
if (!triggerRef || !triggerRef.isConnected)
|
|
7
|
+
return;
|
|
8
|
+
focusWithModality(triggerRef, modality);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export function computeDatePickerFocusWithin(rootId) {
|
|
12
|
+
const root = document.getElementById(rootId);
|
|
13
|
+
const activeElement = document.activeElement;
|
|
14
|
+
return !!root && !!activeElement && root.contains(activeElement);
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function createDatePickerOpenChangeDetails(details) {
|
|
2
|
+
let canceled = false;
|
|
3
|
+
return {
|
|
4
|
+
reason: details?.reason ?? 'none',
|
|
5
|
+
event: details?.event,
|
|
6
|
+
cancel: () => {
|
|
7
|
+
canceled = true;
|
|
8
|
+
},
|
|
9
|
+
get isCanceled() {
|
|
10
|
+
return canceled;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DatePickerOpenChangeDetails, DatePickerOpenChangeReason } from './context';
|
|
2
|
+
type DatePickerOpenChangeInput = DatePickerOpenChangeDetails | {
|
|
3
|
+
reason?: DatePickerOpenChangeReason;
|
|
4
|
+
event?: Event;
|
|
5
|
+
} | undefined;
|
|
6
|
+
export declare function resolveDatePickerOpenChangeDetails(input: DatePickerOpenChangeInput): DatePickerOpenChangeDetails;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createDatePickerOpenChangeDetails } from './open-change';
|
|
2
|
+
function isDatePickerOpenChangeDetails(value) {
|
|
3
|
+
if (!value || typeof value !== 'object')
|
|
4
|
+
return false;
|
|
5
|
+
const candidate = value;
|
|
6
|
+
return (typeof candidate.cancel === 'function' &&
|
|
7
|
+
typeof candidate.reason === 'string' &&
|
|
8
|
+
typeof candidate.isCanceled === 'boolean');
|
|
9
|
+
}
|
|
10
|
+
export function resolveDatePickerOpenChangeDetails(input) {
|
|
11
|
+
if (isDatePickerOpenChangeDetails(input)) {
|
|
12
|
+
return input;
|
|
13
|
+
}
|
|
14
|
+
return createDatePickerOpenChangeDetails(input);
|
|
15
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DatePickerEditableSegmentType } from './date-utils';
|
|
2
|
+
export type DatePickerSegmentRefs = Record<DatePickerEditableSegmentType, HTMLElement | null>;
|
|
3
|
+
export declare function createDatePickerSegmentRefs(): DatePickerSegmentRefs;
|
|
4
|
+
export declare function registerDatePickerSegmentRef(refs: DatePickerSegmentRefs, type: DatePickerEditableSegmentType, element: HTMLElement | null): boolean;
|
|
5
|
+
export declare function focusDatePickerSegmentByType(refs: DatePickerSegmentRefs, type: DatePickerEditableSegmentType): boolean;
|
|
6
|
+
export declare function focusNextDatePickerSegment(refs: DatePickerSegmentRefs, segmentOrder: DatePickerEditableSegmentType[], type: DatePickerEditableSegmentType): boolean;
|
|
7
|
+
export declare function focusPreviousDatePickerSegment(refs: DatePickerSegmentRefs, segmentOrder: DatePickerEditableSegmentType[], type: DatePickerEditableSegmentType): boolean;
|
|
8
|
+
export declare function focusLastDatePickerSegment(refs: DatePickerSegmentRefs, segmentOrder: DatePickerEditableSegmentType[]): boolean;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export function createDatePickerSegmentRefs() {
|
|
2
|
+
return {
|
|
3
|
+
day: null,
|
|
4
|
+
month: null,
|
|
5
|
+
year: null
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function registerDatePickerSegmentRef(refs, type, element) {
|
|
9
|
+
if (refs[type] === element)
|
|
10
|
+
return false;
|
|
11
|
+
refs[type] = element;
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
export function focusDatePickerSegmentByType(refs, type) {
|
|
15
|
+
const target = refs[type];
|
|
16
|
+
if (!target)
|
|
17
|
+
return false;
|
|
18
|
+
target.focus();
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
export function focusNextDatePickerSegment(refs, segmentOrder, type) {
|
|
22
|
+
const index = segmentOrder.indexOf(type);
|
|
23
|
+
if (index < 0)
|
|
24
|
+
return false;
|
|
25
|
+
for (let nextIndex = index + 1; nextIndex < segmentOrder.length; nextIndex += 1) {
|
|
26
|
+
const nextType = segmentOrder[nextIndex];
|
|
27
|
+
if (focusDatePickerSegmentByType(refs, nextType)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
export function focusPreviousDatePickerSegment(refs, segmentOrder, type) {
|
|
34
|
+
const index = segmentOrder.indexOf(type);
|
|
35
|
+
if (index < 0)
|
|
36
|
+
return false;
|
|
37
|
+
for (let previousIndex = index - 1; previousIndex >= 0; previousIndex -= 1) {
|
|
38
|
+
const previousType = segmentOrder[previousIndex];
|
|
39
|
+
if (focusDatePickerSegmentByType(refs, previousType)) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
export function focusLastDatePickerSegment(refs, segmentOrder) {
|
|
46
|
+
for (let index = segmentOrder.length - 1; index >= 0; index -= 1) {
|
|
47
|
+
const type = segmentOrder[index];
|
|
48
|
+
if (focusDatePickerSegmentByType(refs, type)) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type DatePickerDateValue, type DatePickerSegmentType } from './date-utils';
|
|
2
|
+
export type EditableSegmentType = Exclude<DatePickerSegmentType, 'literal'>;
|
|
3
|
+
export type DatePickerSegmentDraft = {
|
|
4
|
+
day: string;
|
|
5
|
+
month: string;
|
|
6
|
+
year: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function createEmptySegmentDraft(): DatePickerSegmentDraft;
|
|
9
|
+
export declare function toDraftFromValue(nextValue: DatePickerDateValue): DatePickerSegmentDraft;
|
|
10
|
+
export declare function normalizeSegmentInput(type: EditableSegmentType, rawValue: string): string;
|
|
11
|
+
export declare function clampSegmentDraft(draft: DatePickerSegmentDraft, type: EditableSegmentType, fromTyping: boolean, rawNumericLength: number): DatePickerSegmentDraft;
|
|
12
|
+
export declare function getCandidateValueFromDraft(draft: DatePickerSegmentDraft): DatePickerDateValue | null;
|
|
13
|
+
export declare function getSegmentBounds(type: EditableSegmentType): {
|
|
14
|
+
min: number;
|
|
15
|
+
max: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function getSegmentNumericValue(type: EditableSegmentType, draft: DatePickerSegmentDraft, valueInternal: DatePickerDateValue | null): number;
|
|
18
|
+
export declare function clampSegment(type: EditableSegmentType, valueToClamp: number): number;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { isValidDatePickerValue } from './date-utils';
|
|
2
|
+
export function createEmptySegmentDraft() {
|
|
3
|
+
return {
|
|
4
|
+
day: '',
|
|
5
|
+
month: '',
|
|
6
|
+
year: ''
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function toDraftFromValue(nextValue) {
|
|
10
|
+
const [year, month, day] = nextValue.split('-');
|
|
11
|
+
return {
|
|
12
|
+
day: `${Number(day)}`,
|
|
13
|
+
month: `${Number(month)}`,
|
|
14
|
+
year: `${Number(year)}`
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function normalizeSegmentInput(type, rawValue) {
|
|
18
|
+
const maxLength = type === 'year' ? 4 : 2;
|
|
19
|
+
const numeric = rawValue.replace(/\D/g, '').slice(0, maxLength);
|
|
20
|
+
if (numeric.length === 0)
|
|
21
|
+
return '';
|
|
22
|
+
return numeric.replace(/^0+(?=\d)/, '');
|
|
23
|
+
}
|
|
24
|
+
function getMaxValidDayInMonth(year, month) {
|
|
25
|
+
const yearText = `${year}`.padStart(4, '0');
|
|
26
|
+
const monthText = `${month}`.padStart(2, '0');
|
|
27
|
+
for (let day = 31; day >= 28; day -= 1) {
|
|
28
|
+
const candidate = `${yearText}-${monthText}-${`${day}`.padStart(2, '0')}`;
|
|
29
|
+
if (isValidDatePickerValue(candidate)) {
|
|
30
|
+
return day;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return 28;
|
|
34
|
+
}
|
|
35
|
+
export function clampSegmentDraft(draft, type, fromTyping, rawNumericLength) {
|
|
36
|
+
const nextDraft = { ...draft };
|
|
37
|
+
if (nextDraft.year.length > 0) {
|
|
38
|
+
const parsedYear = Number(nextDraft.year);
|
|
39
|
+
if (Number.isFinite(parsedYear)) {
|
|
40
|
+
nextDraft.year = `${Math.min(9999, Math.max(1, parsedYear))}`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (nextDraft.month.length > 0) {
|
|
44
|
+
const parsedMonth = Number(nextDraft.month);
|
|
45
|
+
if (Number.isFinite(parsedMonth)) {
|
|
46
|
+
if (parsedMonth <= 0) {
|
|
47
|
+
if (!(fromTyping && type === 'month' && rawNumericLength < 2)) {
|
|
48
|
+
nextDraft.month = '1';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (parsedMonth > 12) {
|
|
52
|
+
nextDraft.month = '12';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (nextDraft.day.length > 0) {
|
|
57
|
+
const parsedDay = Number(nextDraft.day);
|
|
58
|
+
if (Number.isFinite(parsedDay)) {
|
|
59
|
+
if (parsedDay <= 0) {
|
|
60
|
+
if (!(fromTyping && type === 'day' && rawNumericLength < 2)) {
|
|
61
|
+
nextDraft.day = '1';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (parsedDay > 31) {
|
|
65
|
+
nextDraft.day = '31';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (nextDraft.day && nextDraft.month && nextDraft.year) {
|
|
70
|
+
const year = Number(nextDraft.year);
|
|
71
|
+
const month = Number(nextDraft.month);
|
|
72
|
+
const day = Number(nextDraft.day);
|
|
73
|
+
if (Number.isFinite(year) &&
|
|
74
|
+
Number.isFinite(month) &&
|
|
75
|
+
Number.isFinite(day) &&
|
|
76
|
+
year >= 1 &&
|
|
77
|
+
month >= 1 &&
|
|
78
|
+
month <= 12) {
|
|
79
|
+
const maxDayInMonth = getMaxValidDayInMonth(year, month);
|
|
80
|
+
if (day > maxDayInMonth) {
|
|
81
|
+
nextDraft.day = `${maxDayInMonth}`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return nextDraft;
|
|
86
|
+
}
|
|
87
|
+
export function getCandidateValueFromDraft(draft) {
|
|
88
|
+
if (!draft.day || !draft.month || !draft.year)
|
|
89
|
+
return null;
|
|
90
|
+
const day = Number(draft.day);
|
|
91
|
+
const month = Number(draft.month);
|
|
92
|
+
const year = Number(draft.year);
|
|
93
|
+
if (!Number.isInteger(day) || !Number.isInteger(month) || !Number.isInteger(year)) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
if (year < 1 || year > 9999 || month < 1 || month > 12 || day < 1 || day > 31) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const candidate = `${`${year}`.padStart(4, '0')}-${`${month}`.padStart(2, '0')}-${`${day}`.padStart(2, '0')}`;
|
|
100
|
+
if (!isValidDatePickerValue(candidate)) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return candidate;
|
|
104
|
+
}
|
|
105
|
+
export function getSegmentBounds(type) {
|
|
106
|
+
if (type === 'month')
|
|
107
|
+
return { min: 1, max: 12 };
|
|
108
|
+
if (type === 'day')
|
|
109
|
+
return { min: 1, max: 31 };
|
|
110
|
+
return { min: 1, max: 9999 };
|
|
111
|
+
}
|
|
112
|
+
export function getSegmentNumericValue(type, draft, valueInternal) {
|
|
113
|
+
const draftValue = draft[type];
|
|
114
|
+
if (draftValue.length > 0) {
|
|
115
|
+
const parsed = Number(draftValue);
|
|
116
|
+
if (Number.isFinite(parsed))
|
|
117
|
+
return parsed;
|
|
118
|
+
}
|
|
119
|
+
if (valueInternal && isValidDatePickerValue(valueInternal)) {
|
|
120
|
+
const [year, month, day] = valueInternal.split('-');
|
|
121
|
+
if (type === 'day')
|
|
122
|
+
return Number(day);
|
|
123
|
+
if (type === 'month')
|
|
124
|
+
return Number(month);
|
|
125
|
+
return Number(year);
|
|
126
|
+
}
|
|
127
|
+
if (type === 'year')
|
|
128
|
+
return new Date().getUTCFullYear();
|
|
129
|
+
return 1;
|
|
130
|
+
}
|
|
131
|
+
export function clampSegment(type, valueToClamp) {
|
|
132
|
+
const { min, max } = getSegmentBounds(type);
|
|
133
|
+
return Math.min(max, Math.max(min, valueToClamp));
|
|
134
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DatePickerDateValue } from './date-utils';
|
|
2
|
+
export type DatePickerValueLike = DatePickerDateValue | null | undefined;
|
|
3
|
+
export declare function normalizeDatePickerValue(value: DatePickerValueLike, isValid: (value: string | undefined) => value is DatePickerDateValue): DatePickerDateValue | null;
|
|
4
|
+
export declare function normalizeBindableDatePickerValue(value: DatePickerValueLike): DatePickerDateValue | null;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# DatePicker Segment
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### DatePicker.Segment
|
|
6
|
+
|
|
7
|
+
Name: `DatePicker.Segment`
|
|
8
|
+
Description: Editable (or literal) date segment renderer used inside `DatePicker.Input`.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | --------------------------------- | ---------- | ------------------------------------------------------- |
|
|
12
|
+
| `segment` | `DatePickerSegmentPart` | `required` | Segment metadata and text payload. |
|
|
13
|
+
| `class` | `string` | `''` | CSS class names for the segment span element. |
|
|
14
|
+
| `...restProps` | `HTMLAttributes<HTMLSpanElement>` | `-` | Additional attributes forwarded to the segment element. |
|