@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.
Files changed (217) hide show
  1. package/dist/FOCUS_STATE_CONTRACT.md +63 -0
  2. package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
  3. package/dist/calendar/README.md +2 -1
  4. package/dist/calendar/TODO.md +21 -107
  5. package/dist/calendar/body-cell/README.md +15 -0
  6. package/dist/calendar/body-cell/calendar-body-cell.svelte +116 -41
  7. package/dist/calendar/grid/README.md +13 -0
  8. package/dist/calendar/grid-body/README.md +13 -0
  9. package/dist/calendar/grid-header/README.md +13 -0
  10. package/dist/calendar/header-cell/README.md +14 -0
  11. package/dist/calendar/heading/README.md +13 -0
  12. package/dist/calendar/root/README.md +24 -0
  13. package/dist/calendar/root/calendar-root-test.svelte +4 -0
  14. package/dist/calendar/root/calendar-root-test.svelte.d.ts +1 -0
  15. package/dist/calendar/root/calendar-root.svelte +3 -0
  16. package/dist/calendar/root/calendar-root.svelte.d.ts +1 -0
  17. package/dist/calendar/root/context.d.ts +4 -0
  18. package/dist/calendar/root/context.js +28 -25
  19. package/dist/calendar/root/date-utils.d.ts +1 -1
  20. package/dist/calendar/root/date-utils.js +16 -26
  21. package/dist/calendar/trigger-next/README.md +14 -0
  22. package/dist/calendar/trigger-previous/README.md +14 -0
  23. package/dist/clock/README.md +75 -0
  24. package/dist/clock/axis/README.md +24 -0
  25. package/dist/clock/axis/clock-axis.svelte +37 -0
  26. package/dist/clock/axis/clock-axis.svelte.d.ts +8 -0
  27. package/dist/clock/hooks/use-wheel-scroll.svelte.d.ts +16 -0
  28. package/dist/clock/hooks/use-wheel-scroll.svelte.js +336 -0
  29. package/dist/clock/index.d.ts +10 -0
  30. package/dist/clock/index.js +10 -0
  31. package/dist/clock/index.parts.d.ts +4 -0
  32. package/dist/clock/index.parts.js +4 -0
  33. package/dist/clock/root/README.md +38 -0
  34. package/dist/clock/root/clock-root-test.svelte +62 -0
  35. package/dist/clock/root/clock-root-test.svelte.d.ts +14 -0
  36. package/dist/clock/root/clock-root.svelte +329 -0
  37. package/dist/clock/root/clock-root.svelte.d.ts +25 -0
  38. package/dist/clock/root/context.d.ts +22 -0
  39. package/dist/clock/root/context.js +15 -0
  40. package/dist/clock/root/resolve-visible-columns.d.ts +7 -0
  41. package/dist/clock/root/resolve-visible-columns.js +16 -0
  42. package/dist/clock/root/time-utils.d.ts +48 -0
  43. package/dist/clock/root/time-utils.js +314 -0
  44. package/dist/clock/root/wheel-options.d.ts +17 -0
  45. package/dist/clock/root/wheel-options.js +63 -0
  46. package/dist/clock/wheel-column/README.md +25 -0
  47. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte +16 -0
  48. package/dist/clock/wheel-column/clock-wheel-column-bindable-test.svelte.d.ts +3 -0
  49. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte +29 -0
  50. package/dist/clock/wheel-column/clock-wheel-column-custom-snippet-test.svelte.d.ts +6 -0
  51. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte +11 -0
  52. package/dist/clock/wheel-column/clock-wheel-column-default-height-test.svelte.d.ts +3 -0
  53. package/dist/clock/wheel-column/clock-wheel-column-test.svelte +38 -0
  54. package/dist/clock/wheel-column/clock-wheel-column-test.svelte.d.ts +12 -0
  55. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte +38 -0
  56. package/dist/clock/wheel-column/clock-wheel-column-tp-test.svelte.d.ts +12 -0
  57. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte +29 -0
  58. package/dist/clock/wheel-column/clock-wheel-column-untagged-snippet-test.svelte.d.ts +6 -0
  59. package/dist/clock/wheel-column/clock-wheel-column.svelte +499 -0
  60. package/dist/clock/wheel-column/clock-wheel-column.svelte.d.ts +17 -0
  61. package/dist/clock/wheel-item/README.md +17 -0
  62. package/dist/clock/wheel-item/clock-wheel-item.svelte +49 -0
  63. package/dist/clock/wheel-item/clock-wheel-item.svelte.d.ts +17 -0
  64. package/dist/combobox/TODO.md +28 -175
  65. package/dist/combobox/button/combobox-button.svelte +2 -0
  66. package/dist/combobox/root/combobox.svelte +30 -0
  67. package/dist/datepicker/README.md +100 -0
  68. package/dist/datepicker/TODO.md +28 -0
  69. package/dist/datepicker/calendar/README.md +19 -0
  70. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  71. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  72. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  73. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  74. package/dist/datepicker/index.d.ts +18 -0
  75. package/dist/datepicker/index.js +18 -0
  76. package/dist/datepicker/index.parts.d.ts +14 -0
  77. package/dist/datepicker/index.parts.js +14 -0
  78. package/dist/datepicker/input/README.md +15 -0
  79. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  80. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  81. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  82. package/dist/datepicker/internal/strict-props.js +28 -0
  83. package/dist/datepicker/popover/README.md +20 -0
  84. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  85. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  86. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  87. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  88. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  89. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  90. package/dist/datepicker/root/README.md +38 -0
  91. package/dist/datepicker/root/context.d.ts +43 -0
  92. package/dist/datepicker/root/context.js +15 -0
  93. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  94. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  95. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  96. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  97. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  98. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  99. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  100. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  101. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  102. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  103. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  104. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  105. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  106. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  107. package/dist/datepicker/root/date-utils.d.ts +17 -0
  108. package/dist/datepicker/root/date-utils.js +138 -0
  109. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  110. package/dist/datepicker/root/draft-evaluation.js +56 -0
  111. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  112. package/dist/datepicker/root/focus-controller.js +15 -0
  113. package/dist/datepicker/root/open-change.d.ts +5 -0
  114. package/dist/datepicker/root/open-change.js +13 -0
  115. package/dist/datepicker/root/open-controller.d.ts +7 -0
  116. package/dist/datepicker/root/open-controller.js +15 -0
  117. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  118. package/dist/datepicker/root/segment-controller.js +53 -0
  119. package/dist/datepicker/root/segment-state.d.ts +18 -0
  120. package/dist/datepicker/root/segment-state.js +134 -0
  121. package/dist/datepicker/root/value-commit.d.ts +4 -0
  122. package/dist/datepicker/root/value-commit.js +8 -0
  123. package/dist/datepicker/segment/README.md +14 -0
  124. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  125. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  126. package/dist/datepicker/trigger/README.md +14 -0
  127. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  128. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  129. package/dist/dialog/content/dialog-content.svelte +6 -6
  130. package/dist/dialog/root/context.d.ts +2 -1
  131. package/dist/dialog/root/dialog-root.svelte +9 -2
  132. package/dist/index.d.ts +8 -0
  133. package/dist/index.js +8 -0
  134. package/dist/listbox/root/listbox.svelte +44 -0
  135. package/dist/popover/README.md +10 -0
  136. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  137. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  138. package/dist/popover/content/popover-content-test.svelte +2 -1
  139. package/dist/popover/content/popover-content-test.svelte.d.ts +2 -1
  140. package/dist/popover/content/popover-content.svelte +91 -18
  141. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  142. package/dist/popover/index.d.ts +1 -1
  143. package/dist/popover/index.js +1 -3
  144. package/dist/popover/root/README.md +10 -15
  145. package/dist/popover/root/context.d.ts +16 -7
  146. package/dist/popover/root/context.js +0 -2
  147. package/dist/popover/root/focus-state.d.ts +4 -0
  148. package/dist/popover/root/focus-state.js +33 -0
  149. package/dist/popover/root/popover-root.svelte +90 -17
  150. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  151. package/dist/popover/root/popover-test.svelte +2 -1
  152. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  153. package/dist/popover/trigger/popover-trigger-button.svelte +4 -4
  154. package/dist/popover/trigger/popover-trigger.svelte +1 -1
  155. package/dist/portal/portal.svelte +3 -1
  156. package/dist/primitives/click-outside.d.ts +1 -1
  157. package/dist/primitives/click-outside.js +1 -1
  158. package/dist/primitives/focus-trap.d.ts +7 -2
  159. package/dist/primitives/focus-trap.js +50 -17
  160. package/dist/primitives/index.d.ts +1 -0
  161. package/dist/primitives/index.js +1 -0
  162. package/dist/primitives/input-modality.d.ts +7 -0
  163. package/dist/primitives/input-modality.js +125 -0
  164. package/dist/test-utils/focus-contract.d.ts +3 -0
  165. package/dist/test-utils/focus-contract.js +26 -0
  166. package/dist/timepicker/IMPLEMENTATION_PLAN.md +254 -0
  167. package/dist/timepicker/README.md +97 -0
  168. package/dist/timepicker/TODO.md +86 -0
  169. package/dist/timepicker/clock/README.md +14 -0
  170. package/dist/timepicker/clock/time-picker-clock-test.svelte +45 -0
  171. package/dist/timepicker/clock/time-picker-clock-test.svelte.d.ts +11 -0
  172. package/dist/timepicker/clock/time-picker-clock.svelte +65 -0
  173. package/dist/timepicker/clock/time-picker-clock.svelte.d.ts +10 -0
  174. package/dist/timepicker/index.d.ts +14 -0
  175. package/dist/timepicker/index.js +14 -0
  176. package/dist/timepicker/index.parts.d.ts +8 -0
  177. package/dist/timepicker/index.parts.js +8 -0
  178. package/dist/timepicker/input/README.md +15 -0
  179. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte +40 -0
  180. package/dist/timepicker/input/time-picker-input-forwarding-test.svelte.d.ts +3 -0
  181. package/dist/timepicker/input/time-picker-input.svelte +109 -0
  182. package/dist/timepicker/input/time-picker-input.svelte.d.ts +11 -0
  183. package/dist/timepicker/internal/strict-props.d.ts +4 -0
  184. package/dist/timepicker/internal/strict-props.js +51 -0
  185. package/dist/timepicker/popover/README.md +20 -0
  186. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte +22 -0
  187. package/dist/timepicker/popover/time-picker-popover-unsafe-props-test.svelte.d.ts +3 -0
  188. package/dist/timepicker/popover/time-picker-popover.svelte +89 -0
  189. package/dist/timepicker/popover/time-picker-popover.svelte.d.ts +7 -0
  190. package/dist/timepicker/root/README.md +42 -0
  191. package/dist/timepicker/root/context.d.ts +51 -0
  192. package/dist/timepicker/root/context.js +15 -0
  193. package/dist/timepicker/root/time-picker-12h-test.svelte +22 -0
  194. package/dist/timepicker/root/time-picker-12h-test.svelte.d.ts +3 -0
  195. package/dist/timepicker/root/time-picker-bindable-test.svelte +25 -0
  196. package/dist/timepicker/root/time-picker-bindable-test.svelte.d.ts +3 -0
  197. package/dist/timepicker/root/time-picker-empty-test.svelte +20 -0
  198. package/dist/timepicker/root/time-picker-empty-test.svelte.d.ts +3 -0
  199. package/dist/timepicker/root/time-picker-root.svelte +625 -0
  200. package/dist/timepicker/root/time-picker-root.svelte.d.ts +28 -0
  201. package/dist/timepicker/root/time-picker-test.svelte +72 -0
  202. package/dist/timepicker/root/time-picker-test.svelte.d.ts +15 -0
  203. package/dist/timepicker/root/time-utils.d.ts +1 -0
  204. package/dist/timepicker/root/time-utils.js +3 -0
  205. package/dist/timepicker/segment/README.md +14 -0
  206. package/dist/timepicker/segment/time-picker-segment.svelte +365 -0
  207. package/dist/timepicker/segment/time-picker-segment.svelte.d.ts +9 -0
  208. package/dist/timepicker/trigger/README.md +14 -0
  209. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte +35 -0
  210. package/dist/timepicker/trigger/time-picker-trigger-forwarding-test.svelte.d.ts +3 -0
  211. package/dist/timepicker/trigger/time-picker-trigger.svelte +122 -0
  212. package/dist/timepicker/trigger/time-picker-trigger.svelte.d.ts +9 -0
  213. package/dist/utils/date-only.d.ts +11 -0
  214. package/dist/utils/date-only.js +53 -0
  215. package/dist/utils/index.d.ts +1 -0
  216. package/dist/utils/index.js +1 -0
  217. 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,3 @@
1
+ declare const TimePickerPopoverUnsafePropsTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type TimePickerPopoverUnsafePropsTest = ReturnType<typeof TimePickerPopoverUnsafePropsTest>;
3
+ export default TimePickerPopoverUnsafePropsTest;
@@ -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,3 @@
1
+ declare const TimePicker12hTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type TimePicker12hTest = ReturnType<typeof TimePicker12hTest>;
3
+ export default TimePicker12hTest;
@@ -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,3 @@
1
+ declare const TimePickerBindableTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type TimePickerBindableTest = ReturnType<typeof TimePickerBindableTest>;
3
+ export default TimePickerBindableTest;
@@ -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>
@@ -0,0 +1,3 @@
1
+ declare const TimePickerEmptyTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type TimePickerEmptyTest = ReturnType<typeof TimePickerEmptyTest>;
3
+ export default TimePickerEmptyTest;