@human-kit/svelte-components 1.0.0-alpha.1 → 1.0.0-alpha.3

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 (187) hide show
  1. package/dist/FOCUS_STATE_CONTRACT.md +51 -0
  2. package/dist/FOCUS_STATE_REVIEW_TEMPLATE.md +70 -0
  3. package/dist/calendar/README.md +66 -0
  4. package/dist/calendar/TODO.md +23 -0
  5. package/dist/calendar/body-cell/calendar-body-cell.svelte +230 -0
  6. package/dist/calendar/body-cell/calendar-body-cell.svelte.d.ts +9 -0
  7. package/dist/calendar/grid/calendar-grid-month-scope.svelte +16 -0
  8. package/dist/calendar/grid/calendar-grid-month-scope.svelte.d.ts +8 -0
  9. package/dist/calendar/grid/calendar-grid.svelte +45 -0
  10. package/dist/calendar/grid/calendar-grid.svelte.d.ts +8 -0
  11. package/dist/calendar/grid/month-scope.d.ts +2 -0
  12. package/dist/calendar/grid/month-scope.js +8 -0
  13. package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte +13 -0
  14. package/dist/calendar/grid-body/calendar-grid-body-custom-test.svelte.d.ts +18 -0
  15. package/dist/calendar/grid-body/calendar-grid-body.svelte +36 -0
  16. package/dist/calendar/grid-body/calendar-grid-body.svelte.d.ts +8 -0
  17. package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte +13 -0
  18. package/dist/calendar/grid-header/calendar-grid-header-custom-test.svelte.d.ts +18 -0
  19. package/dist/calendar/grid-header/calendar-grid-header.svelte +31 -0
  20. package/dist/calendar/grid-header/calendar-grid-header.svelte.d.ts +8 -0
  21. package/dist/calendar/header-cell/calendar-header-cell-test.svelte +11 -0
  22. package/dist/calendar/header-cell/calendar-header-cell-test.svelte.d.ts +18 -0
  23. package/dist/calendar/header-cell/calendar-header-cell.svelte +16 -0
  24. package/dist/calendar/header-cell/calendar-header-cell.svelte.d.ts +8 -0
  25. package/dist/calendar/heading/calendar-heading.svelte +17 -0
  26. package/dist/calendar/heading/calendar-heading.svelte.d.ts +5 -0
  27. package/dist/calendar/index.d.ts +13 -0
  28. package/dist/calendar/index.js +13 -0
  29. package/dist/calendar/index.parts.d.ts +9 -0
  30. package/dist/calendar/index.parts.js +9 -0
  31. package/dist/calendar/root/calendar-root-bind-value-test.svelte +14 -0
  32. package/dist/calendar/root/calendar-root-bind-value-test.svelte.d.ts +3 -0
  33. package/dist/calendar/root/calendar-root-controlled-clear-test.svelte +20 -0
  34. package/dist/calendar/root/calendar-root-controlled-clear-test.svelte.d.ts +3 -0
  35. package/dist/calendar/root/calendar-root-test.svelte +71 -0
  36. package/dist/calendar/root/calendar-root-test.svelte.d.ts +13 -0
  37. package/dist/calendar/root/calendar-root.svelte +143 -0
  38. package/dist/calendar/root/calendar-root.svelte.d.ts +31 -0
  39. package/dist/calendar/root/context.d.ts +66 -0
  40. package/dist/calendar/root/context.js +727 -0
  41. package/dist/calendar/root/date-utils.d.ts +17 -0
  42. package/dist/calendar/root/date-utils.js +94 -0
  43. package/dist/calendar/trigger-next/calendar-trigger-next.svelte +38 -0
  44. package/dist/calendar/trigger-next/calendar-trigger-next.svelte.d.ts +8 -0
  45. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte +38 -0
  46. package/dist/calendar/trigger-previous/calendar-trigger-previous.svelte.d.ts +8 -0
  47. package/dist/combobox/README.md +40 -0
  48. package/dist/combobox/TODO.md +28 -175
  49. package/dist/combobox/button/README.md +15 -0
  50. package/dist/combobox/button/combobox-button.svelte +2 -0
  51. package/dist/combobox/input/README.md +16 -0
  52. package/dist/combobox/item/README.md +27 -0
  53. package/dist/combobox/item-indicator/README.md +15 -0
  54. package/dist/combobox/list/README.md +27 -0
  55. package/dist/combobox/popover/README.md +13 -0
  56. package/dist/combobox/root/README.md +44 -0
  57. package/dist/combobox/root/combobox.svelte +30 -0
  58. package/dist/combobox/tag/README.md +37 -0
  59. package/dist/combobox/tag-remove/README.md +14 -0
  60. package/dist/combobox/tags/README.md +23 -0
  61. package/dist/datepicker/README.md +100 -0
  62. package/dist/datepicker/TODO.md +28 -0
  63. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte +60 -0
  64. package/dist/datepicker/calendar/date-picker-calendar-unsafe-props-test.svelte.d.ts +3 -0
  65. package/dist/datepicker/calendar/date-picker-calendar.svelte +65 -0
  66. package/dist/datepicker/calendar/date-picker-calendar.svelte.d.ts +10 -0
  67. package/dist/datepicker/index.d.ts +18 -0
  68. package/dist/datepicker/index.js +18 -0
  69. package/dist/datepicker/index.parts.d.ts +14 -0
  70. package/dist/datepicker/index.parts.js +14 -0
  71. package/dist/datepicker/input/date-picker-input.svelte +108 -0
  72. package/dist/datepicker/input/date-picker-input.svelte.d.ts +11 -0
  73. package/dist/datepicker/internal/strict-props.d.ts +2 -0
  74. package/dist/datepicker/internal/strict-props.js +28 -0
  75. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte +57 -0
  76. package/dist/datepicker/popover/date-picker-popover-handler-test.svelte.d.ts +3 -0
  77. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte +45 -0
  78. package/dist/datepicker/popover/date-picker-popover-unsafe-props-test.svelte.d.ts +18 -0
  79. package/dist/datepicker/popover/date-picker-popover.svelte +87 -0
  80. package/dist/datepicker/popover/date-picker-popover.svelte.d.ts +7 -0
  81. package/dist/datepicker/root/context.d.ts +43 -0
  82. package/dist/datepicker/root/context.js +15 -0
  83. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte +24 -0
  84. package/dist/datepicker/root/date-picker-bindable-empty-test.svelte.d.ts +3 -0
  85. package/dist/datepicker/root/date-picker-bindable-test.svelte +41 -0
  86. package/dist/datepicker/root/date-picker-bindable-test.svelte.d.ts +3 -0
  87. package/dist/datepicker/root/date-picker-empty-test.svelte +47 -0
  88. package/dist/datepicker/root/date-picker-empty-test.svelte.d.ts +3 -0
  89. package/dist/datepicker/root/date-picker-locale-typing-test.svelte +47 -0
  90. package/dist/datepicker/root/date-picker-locale-typing-test.svelte.d.ts +3 -0
  91. package/dist/datepicker/root/date-picker-open-cancel-test.svelte +54 -0
  92. package/dist/datepicker/root/date-picker-open-cancel-test.svelte.d.ts +8 -0
  93. package/dist/datepicker/root/date-picker-root.svelte +495 -0
  94. package/dist/datepicker/root/date-picker-root.svelte.d.ts +24 -0
  95. package/dist/datepicker/root/date-picker-test.svelte +86 -0
  96. package/dist/datepicker/root/date-picker-test.svelte.d.ts +13 -0
  97. package/dist/datepicker/root/date-utils.d.ts +17 -0
  98. package/dist/datepicker/root/date-utils.js +138 -0
  99. package/dist/datepicker/root/draft-evaluation.d.ts +13 -0
  100. package/dist/datepicker/root/draft-evaluation.js +56 -0
  101. package/dist/datepicker/root/focus-controller.d.ts +3 -0
  102. package/dist/datepicker/root/focus-controller.js +15 -0
  103. package/dist/datepicker/root/open-change.d.ts +5 -0
  104. package/dist/datepicker/root/open-change.js +13 -0
  105. package/dist/datepicker/root/open-controller.d.ts +7 -0
  106. package/dist/datepicker/root/open-controller.js +15 -0
  107. package/dist/datepicker/root/segment-controller.d.ts +8 -0
  108. package/dist/datepicker/root/segment-controller.js +53 -0
  109. package/dist/datepicker/root/segment-state.d.ts +18 -0
  110. package/dist/datepicker/root/segment-state.js +134 -0
  111. package/dist/datepicker/root/value-commit.d.ts +4 -0
  112. package/dist/datepicker/root/value-commit.js +8 -0
  113. package/dist/datepicker/segment/date-picker-segment.svelte +319 -0
  114. package/dist/datepicker/segment/date-picker-segment.svelte.d.ts +9 -0
  115. package/dist/datepicker/trigger/date-picker-trigger.svelte +110 -0
  116. package/dist/datepicker/trigger/date-picker-trigger.svelte.d.ts +9 -0
  117. package/dist/dialog/README.md +35 -0
  118. package/dist/dialog/content/README.md +16 -0
  119. package/dist/dialog/content/dialog-content.svelte +6 -6
  120. package/dist/dialog/overlay/README.md +13 -0
  121. package/dist/dialog/portal/README.md +12 -0
  122. package/dist/dialog/root/README.md +53 -0
  123. package/dist/dialog/root/context.d.ts +2 -1
  124. package/dist/dialog/root/dialog-root.svelte +9 -2
  125. package/dist/dialog/trigger/README.md +12 -0
  126. package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte +19 -0
  127. package/dist/dialog/trigger/dialog-trigger-multi-button-test.svelte.d.ts +18 -0
  128. package/dist/dialog/trigger/dialog-trigger.svelte +18 -6
  129. package/dist/index.d.ts +7 -0
  130. package/dist/index.js +7 -0
  131. package/dist/listbox/README.md +26 -0
  132. package/dist/listbox/item/README.md +24 -0
  133. package/dist/listbox/root/README.md +40 -0
  134. package/dist/listbox/root/listbox.svelte +44 -0
  135. package/dist/locale-provider/context.d.ts +8 -0
  136. package/dist/locale-provider/context.js +18 -0
  137. package/dist/locale-provider/index.d.ts +4 -0
  138. package/dist/locale-provider/index.js +4 -0
  139. package/dist/locale-provider/locale-provider-initial-value-test.svelte +15 -0
  140. package/dist/locale-provider/locale-provider-initial-value-test.svelte.d.ts +7 -0
  141. package/dist/locale-provider/locale-provider-test.svelte +20 -0
  142. package/dist/locale-provider/locale-provider-test.svelte.d.ts +6 -0
  143. package/dist/locale-provider/locale-provider-value-probe.svelte +22 -0
  144. package/dist/locale-provider/locale-provider-value-probe.svelte.d.ts +6 -0
  145. package/dist/locale-provider/locale-provider.svelte +23 -0
  146. package/dist/locale-provider/locale-provider.svelte.d.ts +8 -0
  147. package/dist/popover/README.md +42 -0
  148. package/dist/popover/content/README.md +25 -0
  149. package/dist/popover/content/popover-content-standalone-test.svelte +28 -0
  150. package/dist/popover/content/popover-content-standalone-test.svelte.d.ts +6 -0
  151. package/dist/popover/content/popover-content-test.svelte +2 -1
  152. package/dist/popover/content/popover-content-test.svelte.d.ts +2 -1
  153. package/dist/popover/content/popover-content.svelte +91 -18
  154. package/dist/popover/content/popover-content.svelte.d.ts +5 -1
  155. package/dist/popover/index.d.ts +1 -1
  156. package/dist/popover/index.js +1 -3
  157. package/dist/popover/root/README.md +25 -0
  158. package/dist/popover/root/context.d.ts +16 -7
  159. package/dist/popover/root/context.js +0 -2
  160. package/dist/popover/root/focus-state.d.ts +4 -0
  161. package/dist/popover/root/focus-state.js +33 -0
  162. package/dist/popover/root/popover-root.svelte +90 -17
  163. package/dist/popover/root/popover-root.svelte.d.ts +2 -1
  164. package/dist/popover/root/popover-test.svelte +2 -1
  165. package/dist/popover/root/popover-test.svelte.d.ts +2 -1
  166. package/dist/popover/trigger/README.md +23 -0
  167. package/dist/popover/trigger/popover-trigger-button.svelte +10 -7
  168. package/dist/popover/trigger/popover-trigger-button.svelte.d.ts +2 -3
  169. package/dist/popover/trigger/popover-trigger-multi-button-test.svelte +16 -0
  170. package/dist/popover/trigger/popover-trigger-multi-button-test.svelte.d.ts +18 -0
  171. package/dist/popover/trigger/popover-trigger.svelte +19 -7
  172. package/dist/portal/portal.svelte +3 -1
  173. package/dist/primitives/click-outside.d.ts +1 -1
  174. package/dist/primitives/click-outside.js +1 -1
  175. package/dist/primitives/focus-trap.d.ts +7 -2
  176. package/dist/primitives/focus-trap.js +40 -6
  177. package/dist/primitives/index.d.ts +1 -0
  178. package/dist/primitives/index.js +1 -0
  179. package/dist/primitives/input-modality.d.ts +7 -0
  180. package/dist/primitives/input-modality.js +116 -0
  181. package/dist/test-utils/focus-contract.d.ts +3 -0
  182. package/dist/test-utils/focus-contract.js +26 -0
  183. package/dist/utils/date-only.d.ts +11 -0
  184. package/dist/utils/date-only.js +53 -0
  185. package/dist/utils/index.d.ts +1 -0
  186. package/dist/utils/index.js +1 -0
  187. package/package.json +16 -1
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { useCalendarContext } from '../root/context';
4
+ import CalendarHeaderCell from '../header-cell/calendar-header-cell.svelte';
5
+
6
+ type CalendarGridHeaderProps = {
7
+ children?: Snippet<[string]>;
8
+ class?: string;
9
+ };
10
+
11
+ let { children, class: className = '' }: CalendarGridHeaderProps = $props();
12
+
13
+ const calendar = useCalendarContext();
14
+ const layoutVersion = calendar.layoutVersion;
15
+ const weekdays = $derived.by(() => {
16
+ void $layoutVersion;
17
+ return calendar.weekdayLabels;
18
+ });
19
+ </script>
20
+
21
+ <thead class={className}>
22
+ <tr>
23
+ {#each weekdays as day (day)}
24
+ {#if children}
25
+ {@render children(day)}
26
+ {:else}
27
+ <CalendarHeaderCell>{day}</CalendarHeaderCell>
28
+ {/if}
29
+ {/each}
30
+ </tr>
31
+ </thead>
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from 'svelte';
2
+ type CalendarGridHeaderProps = {
3
+ children?: Snippet<[string]>;
4
+ class?: string;
5
+ };
6
+ declare const CalendarGridHeader: import("svelte").Component<CalendarGridHeaderProps, {}, "">;
7
+ type CalendarGridHeader = ReturnType<typeof CalendarGridHeader>;
8
+ export default CalendarGridHeader;
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ import Calendar from '../index';
3
+ </script>
4
+
5
+ <table>
6
+ <thead>
7
+ <tr>
8
+ <Calendar.HeaderCell>Mon</Calendar.HeaderCell>
9
+ </tr>
10
+ </thead>
11
+ </table>
@@ -0,0 +1,18 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const CalendarHeaderCellTest: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type CalendarHeaderCellTest = InstanceType<typeof CalendarHeaderCellTest>;
18
+ export default CalendarHeaderCellTest;
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+
5
+ type CalendarHeaderCellProps = Omit<HTMLAttributes<HTMLTableCellElement>, 'children'> & {
6
+ children?: Snippet;
7
+ };
8
+
9
+ let { children, class: className = '', ...restProps }: CalendarHeaderCellProps = $props();
10
+ </script>
11
+
12
+ <th role="columnheader" class={className} {...restProps}>
13
+ {#if children}
14
+ {@render children()}
15
+ {/if}
16
+ </th>
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type CalendarHeaderCellProps = Omit<HTMLAttributes<HTMLTableCellElement>, 'children'> & {
4
+ children?: Snippet;
5
+ };
6
+ declare const CalendarHeaderCell: import("svelte").Component<CalendarHeaderCellProps, {}, "">;
7
+ type CalendarHeaderCell = ReturnType<typeof CalendarHeaderCell>;
8
+ export default CalendarHeaderCell;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { useCalendarContext } from '../root/context';
4
+
5
+ type CalendarHeadingProps = Omit<HTMLAttributes<HTMLHeadingElement>, 'children'>;
6
+
7
+ let { class: className = '', ...restProps }: CalendarHeadingProps = $props();
8
+
9
+ const calendar = useCalendarContext();
10
+ const layoutVersion = calendar.layoutVersion;
11
+ const heading = $derived.by(() => {
12
+ void $layoutVersion;
13
+ return calendar.headingLabel;
14
+ });
15
+ </script>
16
+
17
+ <h2 class={className} aria-live="polite" {...restProps}>{heading}</h2>
@@ -0,0 +1,5 @@
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ type CalendarHeadingProps = Omit<HTMLAttributes<HTMLHeadingElement>, 'children'>;
3
+ declare const CalendarHeading: import("svelte").Component<CalendarHeadingProps, {}, "">;
4
+ type CalendarHeading = ReturnType<typeof CalendarHeading>;
5
+ export default CalendarHeading;
@@ -0,0 +1,13 @@
1
+ export * as Calendar from './index.parts.ts';
2
+ export { default as CalendarRoot } from './root/calendar-root.svelte';
3
+ export { default as CalendarTriggerPrevious } from './trigger-previous/calendar-trigger-previous.svelte';
4
+ export { default as CalendarHeading } from './heading/calendar-heading.svelte';
5
+ export { default as CalendarTriggerNext } from './trigger-next/calendar-trigger-next.svelte';
6
+ export { default as CalendarGrid } from './grid/calendar-grid.svelte';
7
+ export { default as CalendarGridHeader } from './grid-header/calendar-grid-header.svelte';
8
+ export { default as CalendarHeaderCell } from './header-cell/calendar-header-cell.svelte';
9
+ export { default as CalendarGridBody } from './grid-body/calendar-grid-body.svelte';
10
+ export { default as CalendarBodyCell } from './body-cell/calendar-body-cell.svelte';
11
+ export { getCalendarContext, setCalendarContext, useCalendarContext, createCalendarContext, type CalendarContext, type CalendarMonth, type CalendarSelectionMode, type CalendarRangeValue, type CalendarValueBySelectionMode, type CalendarValue, type CreateCalendarContextOptions } from './root/context';
12
+ import * as CalendarParts from './index.parts.ts';
13
+ export default CalendarParts;
@@ -0,0 +1,13 @@
1
+ export * as Calendar from './index.parts.ts';
2
+ export { default as CalendarRoot } from './root/calendar-root.svelte';
3
+ export { default as CalendarTriggerPrevious } from './trigger-previous/calendar-trigger-previous.svelte';
4
+ export { default as CalendarHeading } from './heading/calendar-heading.svelte';
5
+ export { default as CalendarTriggerNext } from './trigger-next/calendar-trigger-next.svelte';
6
+ export { default as CalendarGrid } from './grid/calendar-grid.svelte';
7
+ export { default as CalendarGridHeader } from './grid-header/calendar-grid-header.svelte';
8
+ export { default as CalendarHeaderCell } from './header-cell/calendar-header-cell.svelte';
9
+ export { default as CalendarGridBody } from './grid-body/calendar-grid-body.svelte';
10
+ export { default as CalendarBodyCell } from './body-cell/calendar-body-cell.svelte';
11
+ export { getCalendarContext, setCalendarContext, useCalendarContext, createCalendarContext } from './root/context';
12
+ import * as CalendarParts from './index.parts.ts';
13
+ export default CalendarParts;
@@ -0,0 +1,9 @@
1
+ export { default as Root } from './root/calendar-root.svelte';
2
+ export { default as TriggerPrevious } from './trigger-previous/calendar-trigger-previous.svelte';
3
+ export { default as Heading } from './heading/calendar-heading.svelte';
4
+ export { default as TriggerNext } from './trigger-next/calendar-trigger-next.svelte';
5
+ export { default as Grid } from './grid/calendar-grid.svelte';
6
+ export { default as GridHeader } from './grid-header/calendar-grid-header.svelte';
7
+ export { default as HeaderCell } from './header-cell/calendar-header-cell.svelte';
8
+ export { default as GridBody } from './grid-body/calendar-grid-body.svelte';
9
+ export { default as BodyCell } from './body-cell/calendar-body-cell.svelte';
@@ -0,0 +1,9 @@
1
+ export { default as Root } from './root/calendar-root.svelte';
2
+ export { default as TriggerPrevious } from './trigger-previous/calendar-trigger-previous.svelte';
3
+ export { default as Heading } from './heading/calendar-heading.svelte';
4
+ export { default as TriggerNext } from './trigger-next/calendar-trigger-next.svelte';
5
+ export { default as Grid } from './grid/calendar-grid.svelte';
6
+ export { default as GridHeader } from './grid-header/calendar-grid-header.svelte';
7
+ export { default as HeaderCell } from './header-cell/calendar-header-cell.svelte';
8
+ export { default as GridBody } from './grid-body/calendar-grid-body.svelte';
9
+ export { default as BodyCell } from './body-cell/calendar-body-cell.svelte';
@@ -0,0 +1,14 @@
1
+ <script lang="ts">
2
+ import Calendar from '../index';
3
+
4
+ let value = $state('');
5
+ </script>
6
+
7
+ <Calendar.Root bind:value defaultValue="2026-02-10" aria-label="Bind value test calendar">
8
+ <Calendar.Grid>
9
+ <Calendar.GridHeader />
10
+ <Calendar.GridBody />
11
+ </Calendar.Grid>
12
+ </Calendar.Root>
13
+
14
+ <div data-testid="calendar-value">{value}</div>
@@ -0,0 +1,3 @@
1
+ declare const CalendarRootBindValueTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type CalendarRootBindValueTest = ReturnType<typeof CalendarRootBindValueTest>;
3
+ export default CalendarRootBindValueTest;
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import Calendar from '../index';
3
+
4
+ let value = $state('2026-02-10');
5
+ </script>
6
+
7
+ <Calendar.Root
8
+ selectionMode="single"
9
+ {value}
10
+ onChange={(nextValue: string) => (value = nextValue)}
11
+ aria-label="Controlled clear test calendar"
12
+ >
13
+ <Calendar.Grid>
14
+ <Calendar.GridHeader />
15
+ <Calendar.GridBody />
16
+ </Calendar.Grid>
17
+ </Calendar.Root>
18
+
19
+ <button type="button" data-testid="clear-value" onclick={() => (value = '')}>Clear value</button>
20
+ <div data-testid="calendar-value">{value}</div>
@@ -0,0 +1,3 @@
1
+ declare const CalendarRootControlledClearTest: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type CalendarRootControlledClearTest = ReturnType<typeof CalendarRootControlledClearTest>;
3
+ export default CalendarRootControlledClearTest;
@@ -0,0 +1,71 @@
1
+ <script lang="ts">
2
+ import Calendar from '../index';
3
+ import type { CalendarRangeValue, CalendarSelectionMode, CalendarValue } from './context';
4
+
5
+ type Props = {
6
+ selectionMode?: CalendarSelectionMode;
7
+ visibleMonths?: number;
8
+ showOutsideDays?: boolean;
9
+ isDisabled?: boolean;
10
+ isReadOnly?: boolean;
11
+ defaultValue?: CalendarValue;
12
+ isDateUnavailable?: (date: string) => boolean;
13
+ };
14
+
15
+ let {
16
+ selectionMode = 'single',
17
+ visibleMonths = 1,
18
+ showOutsideDays = false,
19
+ isDisabled = false,
20
+ isReadOnly = false,
21
+ defaultValue,
22
+ isDateUnavailable
23
+ }: Props = $props();
24
+
25
+ const singleDefaultValue = $derived.by(() =>
26
+ typeof defaultValue === 'string' ? defaultValue : undefined
27
+ );
28
+ const rangeDefaultValue = $derived.by(() =>
29
+ typeof defaultValue === 'string' ? undefined : (defaultValue as CalendarRangeValue | undefined)
30
+ );
31
+ </script>
32
+
33
+ {#if selectionMode === 'range'}
34
+ <Calendar.Root
35
+ selectionMode="range"
36
+ {visibleMonths}
37
+ {showOutsideDays}
38
+ {isDisabled}
39
+ {isReadOnly}
40
+ defaultValue={rangeDefaultValue}
41
+ {isDateUnavailable}
42
+ aria-label="Test calendar"
43
+ >
44
+ <Calendar.TriggerPrevious>Previous</Calendar.TriggerPrevious>
45
+ <Calendar.Heading />
46
+ <Calendar.TriggerNext>Next</Calendar.TriggerNext>
47
+ <Calendar.Grid>
48
+ <Calendar.GridHeader />
49
+ <Calendar.GridBody />
50
+ </Calendar.Grid>
51
+ </Calendar.Root>
52
+ {:else}
53
+ <Calendar.Root
54
+ selectionMode="single"
55
+ {visibleMonths}
56
+ {showOutsideDays}
57
+ {isDisabled}
58
+ {isReadOnly}
59
+ defaultValue={singleDefaultValue}
60
+ {isDateUnavailable}
61
+ aria-label="Test calendar"
62
+ >
63
+ <Calendar.TriggerPrevious>Previous</Calendar.TriggerPrevious>
64
+ <Calendar.Heading />
65
+ <Calendar.TriggerNext>Next</Calendar.TriggerNext>
66
+ <Calendar.Grid>
67
+ <Calendar.GridHeader />
68
+ <Calendar.GridBody />
69
+ </Calendar.Grid>
70
+ </Calendar.Root>
71
+ {/if}
@@ -0,0 +1,13 @@
1
+ import type { CalendarSelectionMode, CalendarValue } from './context';
2
+ type Props = {
3
+ selectionMode?: CalendarSelectionMode;
4
+ visibleMonths?: number;
5
+ showOutsideDays?: boolean;
6
+ isDisabled?: boolean;
7
+ isReadOnly?: boolean;
8
+ defaultValue?: CalendarValue;
9
+ isDateUnavailable?: (date: string) => boolean;
10
+ };
11
+ declare const CalendarRootTest: import("svelte").Component<Props, {}, "">;
12
+ type CalendarRootTest = ReturnType<typeof CalendarRootTest>;
13
+ export default CalendarRootTest;
@@ -0,0 +1,143 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import {
4
+ createCalendarContext,
5
+ setCalendarContext,
6
+ type CalendarRangeValue,
7
+ type CalendarSelectionMode,
8
+ type CalendarValue
9
+ } from './context';
10
+ import { useLocaleContextOptional } from '../../locale-provider/context';
11
+ import { isValidCalendarDateValue, type CalendarDateValue } from './date-utils';
12
+
13
+ function isRangeValue(
14
+ valueToCheck: CalendarValue | undefined
15
+ ): valueToCheck is CalendarRangeValue {
16
+ if (!valueToCheck || typeof valueToCheck === 'string') return false;
17
+ return true;
18
+ }
19
+
20
+ function normalizeRangeValue(
21
+ valueToCheck: CalendarRangeValue | undefined
22
+ ): CalendarRangeValue | undefined {
23
+ if (!valueToCheck) return undefined;
24
+ const start =
25
+ valueToCheck.start && isValidCalendarDateValue(valueToCheck.start)
26
+ ? valueToCheck.start
27
+ : undefined;
28
+ const end =
29
+ valueToCheck.end && isValidCalendarDateValue(valueToCheck.end) ? valueToCheck.end : undefined;
30
+ if (!start && !end) return undefined;
31
+ return { start, end };
32
+ }
33
+
34
+ type CalendarRootProps = {
35
+ selectionMode?: CalendarSelectionMode;
36
+ visibleMonths?: number;
37
+ showOutsideDays?: boolean;
38
+ isDateUnavailable?: (date: string) => boolean;
39
+ isDisabled?: boolean;
40
+ isReadOnly?: boolean;
41
+ children?: Snippet;
42
+ class?: string;
43
+ id?: string;
44
+ 'aria-label'?: string;
45
+ };
46
+
47
+ type CalendarRootSingleProps = CalendarRootProps & {
48
+ selectionMode?: 'single';
49
+ value?: CalendarDateValue;
50
+ defaultValue?: CalendarDateValue;
51
+ onChange?: (value: CalendarDateValue) => void;
52
+ };
53
+
54
+ type CalendarRootRangeProps = CalendarRootProps & {
55
+ selectionMode: 'range';
56
+ value?: CalendarRangeValue;
57
+ defaultValue?: CalendarRangeValue;
58
+ onChange?: (value: CalendarRangeValue) => void;
59
+ };
60
+
61
+ type CalendarRootTypedProps = CalendarRootSingleProps | CalendarRootRangeProps;
62
+
63
+ let {
64
+ selectionMode = 'single',
65
+ visibleMonths = 1,
66
+ showOutsideDays = false,
67
+ isDateUnavailable,
68
+ isDisabled = false,
69
+ isReadOnly = false,
70
+ value = $bindable(),
71
+ defaultValue,
72
+ onChange,
73
+ children,
74
+ class: className = '',
75
+ id,
76
+ 'aria-label': ariaLabel
77
+ }: CalendarRootTypedProps = $props();
78
+
79
+ function isCalendarRangeValue(valueToCheck: CalendarValue): valueToCheck is CalendarRangeValue {
80
+ if (!valueToCheck || typeof valueToCheck === 'string') return false;
81
+ return true;
82
+ }
83
+
84
+ const localeContext = useLocaleContextOptional();
85
+ const localeStore = localeContext?.locale;
86
+ const localeFromContext = $derived.by(() => {
87
+ if (!localeStore) return undefined;
88
+ return $localeStore;
89
+ });
90
+ const resolvedLocale = $derived(
91
+ localeFromContext ?? Intl.DateTimeFormat().resolvedOptions().locale
92
+ );
93
+
94
+ function getSyncOptions() {
95
+ const normalizedDefaultValue =
96
+ selectionMode === 'range'
97
+ ? normalizeRangeValue(isRangeValue(defaultValue) ? defaultValue : undefined)
98
+ : typeof defaultValue === 'string' && isValidCalendarDateValue(defaultValue)
99
+ ? defaultValue
100
+ : undefined;
101
+
102
+ return {
103
+ selectionMode,
104
+ visibleMonths,
105
+ showOutsideDays,
106
+ locale: resolvedLocale,
107
+ isDateUnavailable,
108
+ isDisabled,
109
+ isReadOnly,
110
+ value,
111
+ defaultValue: normalizedDefaultValue,
112
+ onChange: (nextValue: CalendarValue) => {
113
+ if (selectionMode === 'range' && isCalendarRangeValue(nextValue)) {
114
+ (onChange as ((value: CalendarRangeValue) => void) | undefined)?.(nextValue);
115
+ } else if (selectionMode !== 'range' && typeof nextValue === 'string') {
116
+ (onChange as ((value: CalendarDateValue) => void) | undefined)?.(nextValue);
117
+ }
118
+ value = nextValue;
119
+ }
120
+ };
121
+ }
122
+
123
+ const context = createCalendarContext(getSyncOptions());
124
+
125
+ setCalendarContext(context);
126
+
127
+ $effect(() => {
128
+ context.sync(getSyncOptions());
129
+ });
130
+ </script>
131
+
132
+ <div
133
+ {id}
134
+ class={className}
135
+ data-disabled={isDisabled || undefined}
136
+ data-readonly={isReadOnly || undefined}
137
+ inert={isDisabled || undefined}
138
+ aria-label={ariaLabel}
139
+ >
140
+ {#if children}
141
+ {@render children()}
142
+ {/if}
143
+ </div>
@@ -0,0 +1,31 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { type CalendarRangeValue, type CalendarSelectionMode } from './context';
3
+ import { type CalendarDateValue } from './date-utils';
4
+ type CalendarRootProps = {
5
+ selectionMode?: CalendarSelectionMode;
6
+ visibleMonths?: number;
7
+ showOutsideDays?: boolean;
8
+ isDateUnavailable?: (date: string) => boolean;
9
+ isDisabled?: boolean;
10
+ isReadOnly?: boolean;
11
+ children?: Snippet;
12
+ class?: string;
13
+ id?: string;
14
+ 'aria-label'?: string;
15
+ };
16
+ type CalendarRootSingleProps = CalendarRootProps & {
17
+ selectionMode?: 'single';
18
+ value?: CalendarDateValue;
19
+ defaultValue?: CalendarDateValue;
20
+ onChange?: (value: CalendarDateValue) => void;
21
+ };
22
+ type CalendarRootRangeProps = CalendarRootProps & {
23
+ selectionMode: 'range';
24
+ value?: CalendarRangeValue;
25
+ defaultValue?: CalendarRangeValue;
26
+ onChange?: (value: CalendarRangeValue) => void;
27
+ };
28
+ type CalendarRootTypedProps = CalendarRootSingleProps | CalendarRootRangeProps;
29
+ declare const CalendarRoot: import("svelte").Component<CalendarRootTypedProps, {}, "value">;
30
+ type CalendarRoot = ReturnType<typeof CalendarRoot>;
31
+ export default CalendarRoot;
@@ -0,0 +1,66 @@
1
+ import { type Readable } from 'svelte/store';
2
+ import { type CalendarDateValue, type CalendarDayCell } from './date-utils';
3
+ export type CalendarSelectionMode = 'single' | 'range';
4
+ export type CalendarRangeValue = {
5
+ start?: CalendarDateValue;
6
+ end?: CalendarDateValue;
7
+ };
8
+ export type CalendarValue = CalendarDateValue | CalendarRangeValue;
9
+ export type CalendarValueBySelectionMode<TSelectionMode extends CalendarSelectionMode> = TSelectionMode extends 'range' ? CalendarRangeValue : CalendarDateValue;
10
+ export type CalendarMonth = {
11
+ monthIndex: number;
12
+ monthStart: Date;
13
+ heading: string;
14
+ weeks: CalendarDayCell[][];
15
+ };
16
+ export type CreateCalendarContextOptions<TSelectionMode extends CalendarSelectionMode = CalendarSelectionMode> = {
17
+ selectionMode?: TSelectionMode;
18
+ visibleMonths?: number;
19
+ showOutsideDays?: boolean;
20
+ locale?: string;
21
+ isDisabled?: boolean;
22
+ isReadOnly?: boolean;
23
+ value?: CalendarValueBySelectionMode<TSelectionMode>;
24
+ defaultValue?: CalendarValueBySelectionMode<TSelectionMode>;
25
+ isDateUnavailable?: (date: CalendarDateValue) => boolean;
26
+ onChange?: (value: CalendarValueBySelectionMode<TSelectionMode>) => void;
27
+ };
28
+ export type CalendarContext = {
29
+ layoutVersion: Readable<number>;
30
+ selectionVersion: Readable<number>;
31
+ locale: string;
32
+ selectionMode: CalendarSelectionMode;
33
+ firstDayOfWeek: number;
34
+ visibleMonths: number;
35
+ showOutsideDays: boolean;
36
+ isDisabled: boolean;
37
+ isReadOnly: boolean;
38
+ months: CalendarMonth[];
39
+ selectedValue: CalendarDateValue | undefined;
40
+ rangeValue: CalendarRangeValue | undefined;
41
+ focusedValue: CalendarDateValue;
42
+ focusVisible: boolean;
43
+ weekdayLabels: string[];
44
+ headingLabel: string;
45
+ isSelected: (date: CalendarDateValue) => boolean;
46
+ isRangeStart: (date: CalendarDateValue) => boolean;
47
+ isRangeEnd: (date: CalendarDateValue) => boolean;
48
+ isInRange: (date: CalendarDateValue) => boolean;
49
+ isDateUnavailable: (date: CalendarDateValue) => boolean;
50
+ isDateDisabled: (date: CalendarDateValue) => boolean;
51
+ isOutsideVisibleRange: (date: CalendarDateValue, monthIndex: number) => boolean;
52
+ setFocusedValue: (date: CalendarDateValue) => void;
53
+ setFocusVisible: (visible: boolean) => void;
54
+ setHoveredValue: (date: CalendarDateValue | undefined) => void;
55
+ selectDate: (date: CalendarDateValue) => void;
56
+ goToNextPage: () => void;
57
+ goToPreviousPage: () => void;
58
+ handleCellKeydown: (event: KeyboardEvent, date: CalendarDateValue) => void;
59
+ sync: (next: CreateCalendarContextOptions) => void;
60
+ };
61
+ export declare function createCalendarContext(options: CreateCalendarContextOptions<'single'>): CalendarContext;
62
+ export declare function createCalendarContext(options: CreateCalendarContextOptions<'range'>): CalendarContext;
63
+ export declare function createCalendarContext(options: CreateCalendarContextOptions): CalendarContext;
64
+ export declare function setCalendarContext(context: CalendarContext): void;
65
+ export declare function getCalendarContext(): CalendarContext;
66
+ export declare function useCalendarContext(): CalendarContext;