@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,20 @@
|
|
|
1
|
+
# TimePicker Popover
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### TimePicker.Popover
|
|
6
|
+
|
|
7
|
+
Name: `TimePicker.Popover`
|
|
8
|
+
Description: Popover content wrapper integrated with `TimePicker.Root` controlled open state and trigger reference.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | ---------------------------------------- | --------------- | ---------------------------------------------------------------- |
|
|
12
|
+
| `aria-label` | `string` | `'Time picker'` | Accessible name for the popover dialog content. |
|
|
13
|
+
| `initialFocus` | `() => HTMLElement \| null \| undefined` | `first wheel` | Optional initial focus resolver for popover open. |
|
|
14
|
+
| `class` | `string` | `''` | CSS class names applied to popover content. |
|
|
15
|
+
| `...restProps` | `ComponentProps<typeof Popover.Content>` | `-` | Forwarded popover content props, excluding root-controlled keys. |
|
|
16
|
+
|
|
17
|
+
### Notes
|
|
18
|
+
|
|
19
|
+
Name: Root-controlled props
|
|
20
|
+
Description: `open`, `triggerRef`, `onOpenChange`, and `id` are controlled by `TimePicker.Root` and ignored when passed to this part.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import TimePicker from '../index';
|
|
3
|
+
|
|
4
|
+
let value = $state<string | null>('14:30');
|
|
5
|
+
let open = $state(true);
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<TimePicker.Root bind:value bind:open>
|
|
9
|
+
<TimePicker.Input aria-label="Time input">
|
|
10
|
+
{#snippet children(segment)}
|
|
11
|
+
<TimePicker.Segment {segment} />
|
|
12
|
+
{/snippet}
|
|
13
|
+
</TimePicker.Input>
|
|
14
|
+
<TimePicker.Trigger>Open time picker</TimePicker.Trigger>
|
|
15
|
+
<TimePicker.Popover>
|
|
16
|
+
<TimePicker.Clock class="flex">
|
|
17
|
+
{#snippet column(col)}
|
|
18
|
+
<TimePicker.WheelColumn type={col.type} class="h-44" />
|
|
19
|
+
{/snippet}
|
|
20
|
+
</TimePicker.Clock>
|
|
21
|
+
</TimePicker.Popover>
|
|
22
|
+
</TimePicker.Root>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ComponentProps } from 'svelte';
|
|
3
|
+
import { useTimePickerContext } from '../root/context';
|
|
4
|
+
import { Popover } from '../../popover';
|
|
5
|
+
import type { PopoverOpenChangeDetails } from '../../popover/root/context';
|
|
6
|
+
import { composeEventHandlers, sanitizeTimePickerProps } from '../internal/strict-props';
|
|
7
|
+
import { trackInteractionModality } from '../../primitives/input-modality';
|
|
8
|
+
|
|
9
|
+
type ForbiddenPopoverProp = 'open' | 'triggerRef' | 'onOpenChange' | 'id';
|
|
10
|
+
type TimePickerPopoverProps = Omit<ComponentProps<typeof Popover.Content>, ForbiddenPopoverProp>;
|
|
11
|
+
|
|
12
|
+
const forbiddenPopoverProps: ForbiddenPopoverProp[] = [
|
|
13
|
+
'open',
|
|
14
|
+
'triggerRef',
|
|
15
|
+
'onOpenChange',
|
|
16
|
+
'id'
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
class: className = '',
|
|
21
|
+
children,
|
|
22
|
+
'aria-label': ariaLabel = 'Time picker',
|
|
23
|
+
initialFocus,
|
|
24
|
+
onmousedown: onMouseDownExternal,
|
|
25
|
+
onkeydowncapture: onKeydownCaptureExternal,
|
|
26
|
+
...unsafeRestProps
|
|
27
|
+
}: TimePickerPopoverProps = $props();
|
|
28
|
+
|
|
29
|
+
const timePicker = useTimePickerContext();
|
|
30
|
+
const dialogId = `${timePicker.id}-popover`;
|
|
31
|
+
const restProps = $derived.by(
|
|
32
|
+
() =>
|
|
33
|
+
sanitizeTimePickerProps(
|
|
34
|
+
'Popover',
|
|
35
|
+
unsafeRestProps as Record<string, unknown>,
|
|
36
|
+
forbiddenPopoverProps
|
|
37
|
+
) as Omit<ComponentProps<typeof Popover.Content>, ForbiddenPopoverProp>
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const resolvedInitialFocus = $derived.by(() => {
|
|
41
|
+
if (typeof initialFocus === 'function') {
|
|
42
|
+
return () => initialFocus() ?? resolveInitialWheelFocus();
|
|
43
|
+
}
|
|
44
|
+
if (initialFocus !== undefined) {
|
|
45
|
+
return initialFocus;
|
|
46
|
+
}
|
|
47
|
+
return resolveInitialWheelFocus;
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
function resolveInitialWheelFocus(): HTMLElement | null {
|
|
51
|
+
const dialog = document.getElementById(dialogId);
|
|
52
|
+
const firstSpinbutton = dialog?.querySelector<HTMLElement>('[role="spinbutton"]');
|
|
53
|
+
return firstSpinbutton ?? null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function handleOpenChange(nextOpen: boolean, details: PopoverOpenChangeDetails) {
|
|
57
|
+
timePicker.onOpenChange(nextOpen, details);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function handlePointerDown(event: MouseEvent) {
|
|
61
|
+
trackInteractionModality(event);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function handleKeydown(event: KeyboardEvent) {
|
|
65
|
+
trackInteractionModality(event);
|
|
66
|
+
}
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
<Popover.Root
|
|
70
|
+
open={timePicker.open}
|
|
71
|
+
triggerRef={timePicker.triggerRef}
|
|
72
|
+
onOpenChange={handleOpenChange}
|
|
73
|
+
>
|
|
74
|
+
<Popover.Content
|
|
75
|
+
id={dialogId}
|
|
76
|
+
class={className}
|
|
77
|
+
aria-label={ariaLabel}
|
|
78
|
+
onmousedown={composeEventHandlers(handlePointerDown, onMouseDownExternal ?? undefined)}
|
|
79
|
+
onkeydowncapture={composeEventHandlers(handleKeydown, onKeydownCaptureExternal ?? undefined, {
|
|
80
|
+
skipExternalOnDefaultPrevented: true
|
|
81
|
+
})}
|
|
82
|
+
initialFocus={resolvedInitialFocus}
|
|
83
|
+
{...restProps}
|
|
84
|
+
>
|
|
85
|
+
{#if children}
|
|
86
|
+
{@render children()}
|
|
87
|
+
{/if}
|
|
88
|
+
</Popover.Content>
|
|
89
|
+
</Popover.Root>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ComponentProps } from 'svelte';
|
|
2
|
+
import { Popover } from '../../popover';
|
|
3
|
+
type ForbiddenPopoverProp = 'open' | 'triggerRef' | 'onOpenChange' | 'id';
|
|
4
|
+
type TimePickerPopoverProps = Omit<ComponentProps<typeof Popover.Content>, ForbiddenPopoverProp>;
|
|
5
|
+
declare const TimePickerPopover: import("svelte").Component<TimePickerPopoverProps, {}, "">;
|
|
6
|
+
type TimePickerPopover = ReturnType<typeof TimePickerPopover>;
|
|
7
|
+
export default TimePickerPopover;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# TimePicker Root
|
|
2
|
+
|
|
3
|
+
## API reference
|
|
4
|
+
|
|
5
|
+
### TimePicker.Root
|
|
6
|
+
|
|
7
|
+
Name: `TimePicker.Root`
|
|
8
|
+
Description: State container for segmented time input, popover lifecycle, wheel selection, and value validation.
|
|
9
|
+
|
|
10
|
+
| Prop | Type | Default | Description |
|
|
11
|
+
| -------------- | ---------------------------------- | ----------- | ------------------------------------------------------------ |
|
|
12
|
+
| `value` | `string \| null` | `bindable` | Controlled time value (`HH:mm` or `HH:mm:ss`). |
|
|
13
|
+
| `defaultValue` | `string \| null` | `undefined` | Initial value for uncontrolled mode. |
|
|
14
|
+
| `onChange` | `(value: string \| null) => void` | `undefined` | Called when committed value changes. |
|
|
15
|
+
| `open` | `boolean` | `bindable` | Controlled open state for popover panel. |
|
|
16
|
+
| `defaultOpen` | `boolean` | `false` | Initial open state in uncontrolled mode. |
|
|
17
|
+
| `onOpenChange` | `(open: boolean, details) => void` | `undefined` | Called on open-state transitions (supports cancellation). |
|
|
18
|
+
| `hourCycle` | `12 \| 24` | `locale` | Hour cycle used for rendering and parsing. |
|
|
19
|
+
| `granularity` | `'hour' \| 'minute' \| 'second'` | `'minute'` | Controls visible segments and wheel columns. |
|
|
20
|
+
| `hourStep` | `number` | `1` | Hour increment for segment and wheel interactions. |
|
|
21
|
+
| `minuteStep` | `number` | `1` | Minute increment for segment and wheel interactions. |
|
|
22
|
+
| `secondStep` | `number` | `1` | Second increment for segment and wheel interactions. |
|
|
23
|
+
| `minValue` | `string` | `undefined` | Optional lower bound for valid values. |
|
|
24
|
+
| `maxValue` | `string` | `undefined` | Optional upper bound for valid values. |
|
|
25
|
+
| `isDisabled` | `boolean` | `false` | Disables user interaction. |
|
|
26
|
+
| `isReadOnly` | `boolean` | `false` | Prevents value changes while keeping focus/navigation. |
|
|
27
|
+
| `isRequired` | `boolean` | `false` | Propagates required state to input accessibility attributes. |
|
|
28
|
+
| `children` | `Snippet` | `undefined` | Composed `TimePicker` parts. |
|
|
29
|
+
| `class` | `string` | `''` | CSS class names for the root element. |
|
|
30
|
+
| `aria-label` | `string` | `undefined` | Accessible label for the root wrapper. |
|
|
31
|
+
|
|
32
|
+
### Context utilities
|
|
33
|
+
|
|
34
|
+
Name: `setTimePickerContext` / `getTimePickerContext` / `useTimePickerContext`
|
|
35
|
+
Description: Context helpers for internal/public part composition.
|
|
36
|
+
|
|
37
|
+
| Prop | Type | Default | Description |
|
|
38
|
+
| ---------------------- | -------------------------------------- | ------- | --------------------------------------------------- |
|
|
39
|
+
| `setTimePickerContext` | `(ctx: TimePickerContext) => void` | `-` | Publishes root context. |
|
|
40
|
+
| `getTimePickerContext` | `() => TimePickerContext \| undefined` | `-` | Reads context when available. |
|
|
41
|
+
| `useTimePickerContext` | `() => TimePickerContext` | `-` | Reads context and throws outside `TimePicker.Root`. |
|
|
42
|
+
| `TimePickerContext` | `type` | `-` | Full context contract used by all child parts. |
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { TimePickerEditableSegmentType, TimePickerGranularity, TimePickerHourCycle, TimePickerSegmentPart, TimePickerSegmentType, TimePickerTimeValue } from './time-utils';
|
|
2
|
+
import type { PopoverChangeReason, PopoverOpenChangeDetails } from '../../popover/root/context';
|
|
3
|
+
export type TimePickerOpenChangeReason = PopoverChangeReason;
|
|
4
|
+
export type TimePickerOpenChangeDetails = PopoverOpenChangeDetails;
|
|
5
|
+
export type TimePickerContext = {
|
|
6
|
+
id: string;
|
|
7
|
+
isDisabled: boolean;
|
|
8
|
+
isReadOnly: boolean;
|
|
9
|
+
isRequired: boolean;
|
|
10
|
+
granularity: TimePickerGranularity;
|
|
11
|
+
hourCycle: TimePickerHourCycle;
|
|
12
|
+
open: boolean;
|
|
13
|
+
focusVisible: boolean;
|
|
14
|
+
focusWithin: boolean;
|
|
15
|
+
isInvalidDraft: boolean;
|
|
16
|
+
value: TimePickerTimeValue | null;
|
|
17
|
+
locale: string;
|
|
18
|
+
triggerRef: HTMLElement | null;
|
|
19
|
+
activeSegment: Exclude<TimePickerSegmentType, 'literal'> | null;
|
|
20
|
+
setTriggerRef: (element: HTMLElement | null) => void;
|
|
21
|
+
setFocusVisible: (visible: boolean) => void;
|
|
22
|
+
syncFocusWithin: () => void;
|
|
23
|
+
setActiveSegment: (segment: Exclude<TimePickerSegmentType, 'literal'> | null) => void;
|
|
24
|
+
openPopover: (reason?: TimePickerOpenChangeReason, event?: Event) => void;
|
|
25
|
+
closePopover: (reason?: TimePickerOpenChangeReason, event?: Event) => void;
|
|
26
|
+
togglePopover: (reason?: TimePickerOpenChangeReason, event?: Event) => void;
|
|
27
|
+
onOpenChange: (open: boolean, details: TimePickerOpenChangeDetails) => void;
|
|
28
|
+
setValue: (nextValue: TimePickerTimeValue | null) => void;
|
|
29
|
+
getSegments: () => TimePickerSegmentPart[];
|
|
30
|
+
getSegmentValue: (type: Exclude<TimePickerSegmentType, 'literal'>) => string;
|
|
31
|
+
setSegmentValue: (type: Exclude<TimePickerSegmentType, 'literal'>, nextValue: string) => void;
|
|
32
|
+
typeSegmentDigit: (type: Exclude<TimePickerSegmentType, 'literal'>, digit: string) => boolean;
|
|
33
|
+
adjustSegmentValue: (type: Exclude<TimePickerSegmentType, 'literal'>, step: number) => void;
|
|
34
|
+
getSegmentLabel: (type: TimePickerEditableSegmentType) => string;
|
|
35
|
+
registerSegmentRef: (type: TimePickerEditableSegmentType, element: HTMLElement | null) => void;
|
|
36
|
+
focusNextPlaceholderOrLastSegment: () => boolean;
|
|
37
|
+
focusNextSegment: (type: TimePickerEditableSegmentType) => boolean;
|
|
38
|
+
focusPreviousSegment: (type: TimePickerEditableSegmentType) => boolean;
|
|
39
|
+
focusLastSegment: () => boolean;
|
|
40
|
+
selectWheelValue: (type: TimePickerEditableSegmentType, value: string) => void;
|
|
41
|
+
getSelectedWheelValue: (type: TimePickerEditableSegmentType) => string | null;
|
|
42
|
+
getWheelOptions: (type: TimePickerEditableSegmentType) => Array<{
|
|
43
|
+
value: string;
|
|
44
|
+
label: string;
|
|
45
|
+
disabled: boolean;
|
|
46
|
+
}>;
|
|
47
|
+
};
|
|
48
|
+
export declare function setTimePickerContext(context: TimePickerContext): void;
|
|
49
|
+
export declare function getTimePickerContext(): TimePickerContext | undefined;
|
|
50
|
+
export declare function useTimePickerContext(): TimePickerContext;
|
|
51
|
+
export type { TimePickerSegmentPart, TimePickerSegmentType, TimePickerEditableSegmentType };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
const KEY = Symbol('time-picker');
|
|
3
|
+
export function setTimePickerContext(context) {
|
|
4
|
+
setContext(KEY, context);
|
|
5
|
+
}
|
|
6
|
+
export function getTimePickerContext() {
|
|
7
|
+
return getContext(KEY);
|
|
8
|
+
}
|
|
9
|
+
export function useTimePickerContext() {
|
|
10
|
+
const context = getTimePickerContext();
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error('TimePicker components must be used within TimePicker.Root.');
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { LocaleProvider } from '../../locale-provider';
|
|
3
|
+
import TimePicker from '../index';
|
|
4
|
+
|
|
5
|
+
let value = $state<string | null>('14:30');
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<LocaleProvider locale="en-US">
|
|
9
|
+
<TimePicker.Root bind:value hourCycle={12}>
|
|
10
|
+
<TimePicker.Input aria-label="Time input">
|
|
11
|
+
{#snippet children(segment)}
|
|
12
|
+
<TimePicker.Segment {segment} />
|
|
13
|
+
{/snippet}
|
|
14
|
+
</TimePicker.Input>
|
|
15
|
+
<TimePicker.Trigger>Open time picker</TimePicker.Trigger>
|
|
16
|
+
<TimePicker.Popover>
|
|
17
|
+
<TimePicker.Clock />
|
|
18
|
+
</TimePicker.Popover>
|
|
19
|
+
</TimePicker.Root>
|
|
20
|
+
</LocaleProvider>
|
|
21
|
+
|
|
22
|
+
<p data-testid="bind-value">{value}</p>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import TimePicker from '../index';
|
|
3
|
+
|
|
4
|
+
let value = $state<string | null | undefined>('14:30');
|
|
5
|
+
let open = $state(false);
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<TimePicker.Root bind:value bind:open hourCycle={24}>
|
|
9
|
+
<TimePicker.Input aria-label="Time input">
|
|
10
|
+
{#snippet children(segment)}
|
|
11
|
+
<TimePicker.Segment {segment} />
|
|
12
|
+
{/snippet}
|
|
13
|
+
</TimePicker.Input>
|
|
14
|
+
<TimePicker.Trigger>Open time picker</TimePicker.Trigger>
|
|
15
|
+
<TimePicker.Popover>
|
|
16
|
+
<TimePicker.Clock />
|
|
17
|
+
</TimePicker.Popover>
|
|
18
|
+
</TimePicker.Root>
|
|
19
|
+
|
|
20
|
+
<p data-testid="bind-value">{value}</p>
|
|
21
|
+
<p data-testid="bind-open">{String(open)}</p>
|
|
22
|
+
<button type="button" data-testid="clear-undefined" onclick={() => (value = undefined)}
|
|
23
|
+
>Clear undefined</button
|
|
24
|
+
>
|
|
25
|
+
<button type="button" data-testid="clear-null" onclick={() => (value = null)}>Clear null</button>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import TimePicker from '../index';
|
|
3
|
+
|
|
4
|
+
let value = $state<string | null>(null);
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<TimePicker.Root bind:value hourCycle={24}>
|
|
8
|
+
<TimePicker.Input aria-label="Time input">
|
|
9
|
+
{#snippet children(segment)}
|
|
10
|
+
<TimePicker.Segment {segment} />
|
|
11
|
+
{/snippet}
|
|
12
|
+
</TimePicker.Input>
|
|
13
|
+
<TimePicker.Trigger>Open time picker</TimePicker.Trigger>
|
|
14
|
+
<TimePicker.Popover>
|
|
15
|
+
<TimePicker.Clock />
|
|
16
|
+
</TimePicker.Popover>
|
|
17
|
+
</TimePicker.Root>
|
|
18
|
+
|
|
19
|
+
<p data-testid="bind-value">{value}</p>
|
|
20
|
+
<button type="button" data-testid="outside-button">Outside</button>
|