@pzerelles/headlessui-svelte 2.1.2-next.4 → 2.1.2-next.41

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 (252) hide show
  1. package/dist/button/Button.svelte +15 -18
  2. package/dist/button/Button.svelte.d.ts +8 -36
  3. package/dist/button/index.d.ts +1 -1
  4. package/dist/button/index.js +1 -1
  5. package/dist/checkbox/Checkbox.svelte +30 -26
  6. package/dist/checkbox/Checkbox.svelte.d.ts +17 -38
  7. package/dist/checkbox/index.d.ts +1 -1
  8. package/dist/checkbox/index.js +1 -1
  9. package/dist/close-button/CloseButton.svelte +4 -7
  10. package/dist/close-button/CloseButton.svelte.d.ts +3 -46
  11. package/dist/close-button/index.d.ts +1 -0
  12. package/dist/close-button/index.js +1 -0
  13. package/dist/data-interactive/DataInteractive.svelte +6 -22
  14. package/dist/data-interactive/DataInteractive.svelte.d.ts +9 -34
  15. package/dist/data-interactive/index.d.ts +1 -1
  16. package/dist/data-interactive/index.js +1 -1
  17. package/dist/description/Description.svelte +28 -23
  18. package/dist/description/Description.svelte.d.ts +9 -30
  19. package/dist/description/context.svelte.js +14 -16
  20. package/dist/description/index.d.ts +1 -1
  21. package/dist/dialog/Dialog.svelte +315 -31
  22. package/dist/dialog/Dialog.svelte.d.ts +7 -45
  23. package/dist/dialog/DialogBackdrop.svelte +11 -14
  24. package/dist/dialog/DialogBackdrop.svelte.d.ts +8 -33
  25. package/dist/dialog/DialogPanel.svelte +23 -19
  26. package/dist/dialog/DialogPanel.svelte.d.ts +8 -34
  27. package/dist/dialog/DialogTitle.svelte +17 -8
  28. package/dist/dialog/DialogTitle.svelte.d.ts +9 -30
  29. package/dist/dialog/context.svelte.js +2 -2
  30. package/dist/dialog/index.d.ts +4 -4
  31. package/dist/dialog/index.js +4 -4
  32. package/dist/field/Field.svelte +27 -26
  33. package/dist/field/Field.svelte.d.ts +7 -34
  34. package/dist/field/index.d.ts +1 -1
  35. package/dist/fieldset/Fieldset.svelte +14 -20
  36. package/dist/fieldset/Fieldset.svelte.d.ts +8 -35
  37. package/dist/fieldset/index.d.ts +1 -1
  38. package/dist/focus-trap/FocusTrap.svelte +30 -54
  39. package/dist/focus-trap/FocusTrap.svelte.d.ts +10 -52
  40. package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
  41. package/dist/focus-trap/FocusTrapFeatures.js +15 -0
  42. package/dist/hooks/use-controllable.svelte.js +2 -1
  43. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  44. package/dist/hooks/use-disabled.d.ts +6 -1
  45. package/dist/hooks/use-disabled.js +10 -5
  46. package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
  47. package/dist/hooks/use-event-listener.svelte.js +3 -1
  48. package/dist/hooks/use-inert-others.svelte.js +10 -10
  49. package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
  50. package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
  51. package/dist/hooks/use-root-containers.svelte.js +5 -5
  52. package/dist/hooks/use-tab-direction.svelte.js +1 -1
  53. package/dist/index.d.ts +5 -2
  54. package/dist/index.js +5 -2
  55. package/dist/input/Input.svelte +28 -21
  56. package/dist/input/Input.svelte.d.ts +16 -33
  57. package/dist/input/index.d.ts +1 -1
  58. package/dist/input/index.js +1 -1
  59. package/dist/internal/FloatingProvider.svelte +17 -0
  60. package/dist/internal/FloatingProvider.svelte.d.ts +8 -0
  61. package/dist/internal/FocusSentinel.svelte +33 -32
  62. package/dist/internal/FocusSentinel.svelte.d.ts +4 -18
  63. package/dist/internal/ForcePortalRoot.svelte.d.ts +4 -18
  64. package/dist/internal/FormFields.svelte +18 -13
  65. package/dist/internal/FormFields.svelte.d.ts +4 -18
  66. package/dist/internal/FormFieldsProvider.svelte +17 -0
  67. package/dist/internal/FormFieldsProvider.svelte.d.ts +7 -0
  68. package/dist/internal/FormResolver.svelte +6 -2
  69. package/dist/internal/FormResolver.svelte.d.ts +4 -18
  70. package/dist/internal/Hidden.svelte +10 -10
  71. package/dist/internal/Hidden.svelte.d.ts +6 -33
  72. package/dist/internal/MainTreeProvider.svelte +1 -1
  73. package/dist/internal/MainTreeProvider.svelte.d.ts +4 -18
  74. package/dist/internal/Portal.svelte.d.ts +4 -18
  75. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  76. package/dist/internal/floating-provider.svelte.js +206 -0
  77. package/dist/internal/floating.svelte.d.ts +46 -22
  78. package/dist/internal/floating.svelte.js +90 -272
  79. package/dist/internal/form-fields.svelte.d.ts +10 -0
  80. package/dist/internal/form-fields.svelte.js +23 -0
  81. package/dist/label/Label.svelte +17 -13
  82. package/dist/label/Label.svelte.d.ts +8 -33
  83. package/dist/label/context.svelte.js +1 -1
  84. package/dist/label/index.d.ts +1 -1
  85. package/dist/legend/Legend.svelte +21 -15
  86. package/dist/legend/Legend.svelte.d.ts +9 -34
  87. package/dist/listbox/Listbox.svelte +79 -163
  88. package/dist/listbox/Listbox.svelte.d.ts +16 -101
  89. package/dist/listbox/ListboxButton.svelte +24 -29
  90. package/dist/listbox/ListboxButton.svelte.d.ts +8 -38
  91. package/dist/listbox/ListboxOption.svelte +33 -27
  92. package/dist/listbox/ListboxOption.svelte.d.ts +16 -32
  93. package/dist/listbox/ListboxOptions.svelte +126 -73
  94. package/dist/listbox/ListboxOptions.svelte.d.ts +8 -43
  95. package/dist/listbox/ListboxSelectedOption.svelte +24 -26
  96. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -39
  97. package/dist/listbox/context.svelte.d.ts +76 -0
  98. package/dist/listbox/context.svelte.js +36 -0
  99. package/dist/listbox/index.d.ts +5 -5
  100. package/dist/listbox/index.js +4 -4
  101. package/dist/menu/Menu.svelte +22 -266
  102. package/dist/menu/Menu.svelte.d.ts +7 -37
  103. package/dist/menu/MenuButton.svelte +22 -24
  104. package/dist/menu/MenuButton.svelte.d.ts +8 -39
  105. package/dist/menu/MenuHeading.svelte +12 -16
  106. package/dist/menu/MenuHeading.svelte.d.ts +7 -36
  107. package/dist/menu/MenuItem.svelte +18 -23
  108. package/dist/menu/MenuItem.svelte.d.ts +9 -39
  109. package/dist/menu/MenuItems.svelte +33 -34
  110. package/dist/menu/MenuItems.svelte.d.ts +8 -43
  111. package/dist/menu/MenuSection.svelte +9 -12
  112. package/dist/menu/MenuSection.svelte.d.ts +7 -33
  113. package/dist/menu/MenuSeparator.svelte +9 -12
  114. package/dist/menu/MenuSeparator.svelte.d.ts +7 -33
  115. package/dist/menu/context.svelte.d.ts +2 -1
  116. package/dist/menu/context.svelte.js +212 -2
  117. package/dist/menu/index.d.ts +7 -7
  118. package/dist/menu/index.js +3 -3
  119. package/dist/popover/Popover.svelte +225 -0
  120. package/dist/popover/Popover.svelte.d.ts +15 -0
  121. package/dist/popover/PopoverBackdrop.svelte +83 -0
  122. package/dist/popover/PopoverBackdrop.svelte.d.ts +17 -0
  123. package/dist/popover/PopoverButton.svelte +324 -0
  124. package/dist/popover/PopoverButton.svelte.d.ts +21 -0
  125. package/dist/popover/PopoverGroup.svelte +66 -0
  126. package/dist/popover/PopoverGroup.svelte.d.ts +9 -0
  127. package/dist/popover/PopoverPanel.svelte +359 -0
  128. package/dist/popover/PopoverPanel.svelte.d.ts +22 -0
  129. package/dist/popover/context.svelte.d.ts +51 -0
  130. package/dist/popover/context.svelte.js +108 -0
  131. package/dist/popover/index.d.ts +5 -0
  132. package/dist/popover/index.js +5 -0
  133. package/dist/portal/InternalPortal.svelte +17 -17
  134. package/dist/portal/InternalPortal.svelte.d.ts +6 -33
  135. package/dist/portal/Portal.svelte +7 -6
  136. package/dist/portal/Portal.svelte.d.ts +3 -22
  137. package/dist/portal/PortalGroup.svelte +6 -14
  138. package/dist/portal/PortalGroup.svelte.d.ts +5 -34
  139. package/dist/radio-group/Radio.svelte +135 -0
  140. package/dist/radio-group/Radio.svelte.d.ts +35 -0
  141. package/dist/radio-group/RadioGroup.svelte +223 -0
  142. package/dist/radio-group/RadioGroup.svelte.d.ts +34 -0
  143. package/dist/radio-group/RadioOption.svelte +138 -0
  144. package/dist/radio-group/RadioOption.svelte.d.ts +37 -0
  145. package/dist/radio-group/contest.svelte.d.ts +30 -0
  146. package/dist/radio-group/contest.svelte.js +40 -0
  147. package/dist/radio-group/index.d.ts +3 -0
  148. package/dist/radio-group/index.js +3 -0
  149. package/dist/select/Select.svelte +112 -0
  150. package/dist/select/Select.svelte.d.ts +21 -0
  151. package/dist/select/index.d.ts +1 -0
  152. package/dist/select/index.js +1 -0
  153. package/dist/switch/Switch.svelte +27 -28
  154. package/dist/switch/Switch.svelte.d.ts +9 -42
  155. package/dist/switch/SwitchGroup.svelte +5 -5
  156. package/dist/switch/SwitchGroup.svelte.d.ts +8 -30
  157. package/dist/switch/index.d.ts +1 -1
  158. package/dist/switch/index.js +1 -1
  159. package/dist/tabs/Tab.svelte +26 -29
  160. package/dist/tabs/Tab.svelte.d.ts +8 -36
  161. package/dist/tabs/TabGroup.svelte +42 -264
  162. package/dist/tabs/TabGroup.svelte.d.ts +7 -57
  163. package/dist/tabs/TabList.svelte +13 -16
  164. package/dist/tabs/TabList.svelte.d.ts +8 -31
  165. package/dist/tabs/TabPanel.svelte +19 -19
  166. package/dist/tabs/TabPanel.svelte.d.ts +8 -38
  167. package/dist/tabs/TabPanels.svelte +11 -9
  168. package/dist/tabs/TabPanels.svelte.d.ts +8 -30
  169. package/dist/tabs/context.svelte.d.ts +31 -0
  170. package/dist/tabs/context.svelte.js +134 -0
  171. package/dist/tabs/index.d.ts +5 -5
  172. package/dist/tabs/index.js +4 -4
  173. package/dist/textarea/Textarea.svelte +23 -19
  174. package/dist/textarea/Textarea.svelte.d.ts +18 -30
  175. package/dist/textarea/index.d.ts +1 -1
  176. package/dist/textarea/index.js +1 -1
  177. package/dist/transition/InternalTransitionChild.svelte +19 -12
  178. package/dist/transition/InternalTransitionChild.svelte.d.ts +4 -35
  179. package/dist/transition/Transition.svelte +16 -17
  180. package/dist/transition/Transition.svelte.d.ts +8 -38
  181. package/dist/transition/TransitionChild.svelte +13 -12
  182. package/dist/transition/TransitionChild.svelte.d.ts +11 -38
  183. package/dist/transition/context.svelte.js +9 -9
  184. package/dist/transition/index.d.ts +2 -2
  185. package/dist/transition/index.js +2 -2
  186. package/dist/utils/DisabledProvider.svelte +10 -0
  187. package/dist/utils/DisabledProvider.svelte.d.ts +8 -0
  188. package/dist/utils/ElementOrComponent.svelte +57 -14
  189. package/dist/utils/ElementOrComponent.svelte.d.ts +19 -29
  190. package/dist/utils/StableCollection.svelte.d.ts +4 -18
  191. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +32 -0
  192. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +8 -0
  193. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +94 -0
  194. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +26 -0
  195. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  196. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  197. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  198. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  199. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  200. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  201. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  202. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  203. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  204. package/dist/utils/floating-ui/svelte/index.js +5 -0
  205. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  206. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  207. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  208. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  209. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  210. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  211. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  212. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  213. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  214. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  215. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  216. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  217. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  218. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  219. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  220. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  221. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  222. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  223. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +182 -0
  224. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  225. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  226. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  227. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  228. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  229. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  230. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  231. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  232. package/dist/utils/id.d.ts +1 -1
  233. package/dist/utils/id.js +1 -1
  234. package/dist/utils/index.d.ts +3 -0
  235. package/dist/utils/index.js +3 -0
  236. package/dist/utils/state.js +4 -4
  237. package/dist/utils/style.d.ts +2 -0
  238. package/dist/utils/style.js +6 -0
  239. package/dist/utils/types.d.ts +12 -18
  240. package/package.json +33 -32
  241. package/dist/combobox/Combobox.svelte +0 -53
  242. package/dist/combobox/Combobox.svelte.d.ts +0 -50
  243. package/dist/dialog/InternalDialog.svelte +0 -294
  244. package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
  245. package/dist/internal/HoistFormFields.svelte +0 -14
  246. package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
  247. package/dist/internal/id.d.ts +0 -8
  248. package/dist/internal/id.js +0 -11
  249. package/dist/utils/Generic.svelte +0 -56
  250. package/dist/utils/Generic.svelte.d.ts +0 -35
  251. package/dist/utils/alternative-types.d.ts +0 -21
  252. /package/dist/utils/{alternative-types.js → floating-ui/svelte/types.js} +0 -0
@@ -1,23 +1,29 @@
1
1
  <script lang="ts" module>
2
- import { Label, type LabelProps } from "../index.js"
3
- import type { ElementType, Props } from "../utils/types.js"
4
- import type { Component } from "svelte"
2
+ import { Label } from "../index.js"
3
+ import type { Props } from "../utils/types.js"
5
4
 
6
- const DEFAULT_LEGEND_TAG = Label as Component<LabelProps, any>
5
+ const DEFAULT_LEGEND_TAG = "div" as const
7
6
 
8
- type LegendRenderPropArg = {}
9
- type LegendPropsWeControl = never
7
+ export type LegendOwnProps = {
8
+ element?: HTMLElement
9
+ class?: string
10
+ }
10
11
 
11
- export type LegendProps<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> = Props<
12
- TTag,
13
- LegendRenderPropArg,
14
- LegendPropsWeControl,
15
- {}
16
- >
12
+ export type LegendProps = Props<typeof DEFAULT_LEGEND_TAG, {}, LegendOwnProps>
17
13
  </script>
18
14
 
19
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LEGEND_TAG">
20
- let { ...props }: { as?: TTag } & LegendProps<TTag> = $props()
15
+ <script lang="ts">
16
+ let { asChild, children: theirChildren, ...props }: LegendProps = $props()
21
17
  </script>
22
18
 
23
- <Label as="div" {...props} />
19
+ <Label asChild>
20
+ {#snippet children({ props: childProps })}
21
+ {#if asChild}
22
+ {@render theirChildren?.({ props: { ...props, ...childProps } })}
23
+ {:else}
24
+ <div {...props} {...childProps}>
25
+ {@render theirChildren?.({ props: {} })}
26
+ </div>
27
+ {/if}
28
+ {/snippet}
29
+ </Label>
@@ -1,35 +1,10 @@
1
- import { type LabelProps } from "../index.js";
2
- import type { ElementType, Props } from "../utils/types.js";
3
- import type { Component } from "svelte";
4
- declare const DEFAULT_LEGEND_TAG: Component<LabelProps, any>;
5
- type LegendRenderPropArg = {};
6
- type LegendPropsWeControl = never;
7
- export type LegendProps<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> = Props<TTag, LegendRenderPropArg, LegendPropsWeControl, {}>;
8
- declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> {
9
- props(): {
10
- as?: TTag | undefined;
11
- } & (Exclude<keyof import("../index.js").PropsOf<TTag>, "as" | "children" | "refName" | "class"> extends infer T extends keyof import("../index.js").PropsOf<TTag> ? { [P in T]: import("../index.js").PropsOf<TTag>[P]; } : never) & {
12
- children?: import("../index.js").Children<LegendRenderPropArg> | undefined;
13
- ref?: HTMLElement;
14
- } & (true extends (import("../index.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../index.js").PropsOf<TTag> ? T_1 extends never ? never : "class" extends infer T_2 ? T_2 extends "class" ? T_2 extends keyof T_1 ? true : never : never : never : never : never) ? {
15
- class?: import("../index.js").PropsOf<TTag>["class"] | ((bag: LegendRenderPropArg) => string) | undefined;
16
- } : {});
17
- events(): {} & {
18
- [evt: string]: CustomEvent<any>;
19
- };
20
- slots(): {};
21
- bindings(): "";
22
- exports(): {};
23
- }
24
- interface $$IsomorphicComponent {
25
- new <TTag extends ElementType = typeof DEFAULT_LEGEND_TAG>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag>['props']>, ReturnType<__sveltets_Render<TTag>['events']>, ReturnType<__sveltets_Render<TTag>['slots']>> & {
26
- $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
27
- } & ReturnType<__sveltets_Render<TTag>['exports']>;
28
- <TTag extends ElementType = typeof DEFAULT_LEGEND_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
29
- $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
30
- }): ReturnType<__sveltets_Render<TTag>['exports']>;
31
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
32
- }
33
- declare const Legend: $$IsomorphicComponent;
34
- type Legend<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> = InstanceType<typeof Legend<TTag>>;
1
+ import type { Props } from "../utils/types.js";
2
+ declare const DEFAULT_LEGEND_TAG: "div";
3
+ export type LegendOwnProps = {
4
+ element?: HTMLElement;
5
+ class?: string;
6
+ };
7
+ export type LegendProps = Props<typeof DEFAULT_LEGEND_TAG, {}, LegendOwnProps>;
8
+ declare const Legend: import("svelte").Component<LegendProps, {}, "">;
9
+ type Legend = ReturnType<typeof Legend>;
35
10
  export default Legend;
@@ -5,140 +5,56 @@
5
5
  import { calculateActiveIndex, Focus } from "../utils/calculate-active-index.js"
6
6
  import { FocusableMode, isFocusableElement, sortByDomNode } from "../utils/focus-management.js"
7
7
  import { match } from "../utils/match.js"
8
- import { useRef, type MutableRefObject } from "../utils/ref.svelte.js"
9
- import type { ElementType, EnsureArray, Props } from "../utils/types.js"
10
- import { getContext, setContext, type Snippet } from "svelte"
8
+ import type { EnsureArray, PropsAsChild } from "../utils/types.js"
9
+ import { setContext } from "svelte"
10
+ import { ActivationTrigger, ListboxStates, ValueMode } from "./context.svelte.js"
11
11
 
12
- let DEFAULT_LISTBOX_TAG = "svelte:fragment"
13
- type ListboxRenderPropArg<T> = {
12
+ export type ListboxRenderPropArg<T> = {
14
13
  open: boolean
15
14
  disabled: boolean
16
15
  invalid: boolean
17
16
  value: T
18
17
  }
19
18
 
20
- export type ListboxProps<
21
- TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG,
22
- TType = string,
23
- TActualType = TType extends (infer U)[] ? U : TType,
24
- > = Props<
25
- TTag,
26
- ListboxRenderPropArg<TType>,
27
- "value" | "defaultValue" | "onchange" | "by" | "disabled" | "horizontal" | "name" | "multiple",
28
- {
29
- value?: TType
30
- defaultValue?: TType
31
- onchange?: (value: TType) => void
32
- by?: ByComparator<TActualType>
33
- disabled?: boolean
34
- invalid?: boolean
35
- horizontal?: boolean
36
- form?: string
37
- name?: string
38
- multiple?: boolean
39
-
40
- __demoMode?: boolean
41
- }
42
- >
43
-
44
- export type ListboxChildren<T> = Snippet<[ListboxRenderPropArg<T>]>
45
-
46
- export enum ListboxStates {
47
- Open,
48
- Closed,
49
- }
50
-
51
- export enum ValueMode {
52
- Single,
53
- Multi,
54
- }
55
-
56
- export enum ActivationTrigger {
57
- Pointer,
58
- Other,
59
- }
60
-
61
- export type ListboxOptionDataRef<T> = MutableRefObject<{
62
- textValue?: string
63
- disabled: boolean
64
- value: T
65
- domRef: MutableRefObject<HTMLElement | null>
66
- }>
67
-
68
- interface StateDefinition<T> {
69
- listboxState: ListboxStates
70
-
71
- options: { id: string; dataRef: ListboxOptionDataRef<T> }[]
72
- searchQuery: string
73
- activeOptionIndex: number | null
74
- activationTrigger: ActivationTrigger
75
-
76
- __demoMode: boolean
19
+ export type ListboxOwnProps<TType = string, TActualType = TType extends (infer U)[] ? U : TType> = {
20
+ value?: TType
21
+ defaultValue?: TType
22
+ onchange?: (value: TType) => void
23
+ by?: ByComparator<TActualType>
24
+ disabled?: boolean
25
+ invalid?: boolean
26
+ horizontal?: boolean
27
+ form?: string
28
+ name?: string
29
+ multiple?: boolean
30
+ closeOnSelect?: boolean
31
+ __demoMode?: boolean
77
32
  }
78
33
 
79
- type ListboxActionsContext = {
80
- openListbox(): void
81
- closeListbox(): void
82
- registerOption(id: string, dataRef: ListboxOptionDataRef<unknown>): () => void
83
- goToOption(focus: Focus.Specific, id: string, trigger?: ActivationTrigger): void
84
- goToOption(focus: Focus, id?: string, trigger?: ActivationTrigger): void
85
- selectOption(id: string): void
86
- selectActiveOption(): void
87
- onChange(value: unknown): void
88
- search(query: string): void
89
- clearSearch(): void
90
- }
91
-
92
- export function useActions(component: string) {
93
- const context = getContext<ListboxActionsContext>("ListboxActionsContext")
94
- if (!context) {
95
- let err = new Error(`<${component} /> is missing a parent <Listbox /> component.`)
96
- if (Error.captureStackTrace) Error.captureStackTrace(err, useActions)
97
- throw err
98
- }
99
- return context
100
- }
34
+ export type ListboxProps<TType = string, TActualType = TType extends (infer U)[] ? U : TType> = PropsAsChild<
35
+ ListboxRenderPropArg<TType>,
36
+ ListboxOwnProps<TType, TActualType>
37
+ >
101
38
 
102
- export type ListboxDataContext = {
103
- value: unknown
104
- disabled: boolean
105
- invalid: boolean
106
- mode: ValueMode
107
- orientation: "horizontal" | "vertical"
108
- activeOptionIndex: number | null
109
- compare(a: unknown, z: unknown): boolean
110
- isSelected(value: unknown): boolean
111
-
112
- optionsPropsRef: MutableRefObject<{
113
- static: boolean
114
- hold: boolean
115
- }>
116
-
117
- listRef: MutableRefObject<Map<string, HTMLElement | null>>
118
-
119
- buttonRef: MutableRefObject<HTMLElement | null>
120
- optionsRef: MutableRefObject<HTMLElement | null>
121
- } & Omit<StateDefinition<unknown>, "dataRef">
122
-
123
- export function useData(component: string) {
124
- const context = getContext<ListboxDataContext>("ListboxData")
125
- if (context === null) {
126
- let err = new Error(`<${component} /> is missing a parent <Listbox /> component.`)
127
- if (Error.captureStackTrace) Error.captureStackTrace(err, useData)
128
- throw err
129
- }
130
- return context
131
- }
39
+ export * from "./context.svelte.js"
132
40
  </script>
133
41
 
134
- <script lang="ts" generics="TType, TActualType, TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG">
42
+ <script lang="ts" generics="TType = string, TActualType = TType extends (infer U)[] ? U : TType">
135
43
  import { disposables } from "../utils/disposables.js"
136
44
  import FormFields from "../internal/FormFields.svelte"
137
- import { createFloatingContext } from "../internal/floating.svelte.js"
45
+ import { useFloatingProvider } from "../internal/floating-provider.svelte.js"
138
46
  import { createOpenClosedContext, State } from "../internal/open-closed.js"
139
47
  import { useLabels } from "../label/context.svelte.js"
140
48
  import { useOutsideClick } from "../hooks/use-outside-click.svelte.js"
141
49
  import ElementOrComponent from "../utils/ElementOrComponent.svelte"
50
+ import type {
51
+ ListboxActionsContext,
52
+ ListboxDataContext,
53
+ ListboxOptionDataRef,
54
+ StateActions,
55
+ StateDefinition,
56
+ } from "./context.svelte.js"
57
+ import { SvelteMap } from "svelte/reactivity"
142
58
 
143
59
  function adjustOrderedState<T>(
144
60
  state: StateDefinition<T>,
@@ -211,11 +127,7 @@
211
127
  _state.__demoMode = false
212
128
  return _state
213
129
  },
214
- goToOption(
215
- action:
216
- | { focus: Focus.Specific; id: string; trigger?: ActivationTrigger }
217
- | { focus: Exclude<Focus, Focus.Specific>; trigger?: ActivationTrigger }
218
- ) {
130
+ goToOption(action) {
219
131
  if (disabled) return _state
220
132
  if (_state.listboxState === ListboxStates.Closed) return _state
221
133
 
@@ -314,7 +226,7 @@
314
226
  _state.activeOptionIndex = activeOptionIndex
315
227
  return _state
316
228
  },
317
- search(value: string) {
229
+ search(value) {
318
230
  if (disabled) return _state
319
231
  if (_state.listboxState === ListboxStates.Closed) return _state
320
232
 
@@ -352,13 +264,13 @@
352
264
  _state.searchQuery = ""
353
265
  return _state
354
266
  },
355
- registerOption(action: { id: string; dataRef: ListboxOptionDataRef<TActualType> }) {
356
- let option = { id: action.id, dataRef: action.dataRef }
267
+ registerOption(id, dataRef) {
268
+ let option = { id, dataRef }
357
269
  let adjustedState = adjustOrderedState(_state, (options) => [...options, option])
358
270
 
359
271
  // Check if we need to make the newly registered option active.
360
272
  if (_state.activeOptionIndex === null) {
361
- if (isSelected(action.dataRef.current.value as any)) {
273
+ if (isSelected(dataRef.current.value as any)) {
362
274
  adjustedState.activeOptionIndex = adjustedState.options.indexOf(option)
363
275
  }
364
276
  }
@@ -367,9 +279,9 @@
367
279
  _state.activeOptionIndex = adjustedState.activeOptionIndex
368
280
  return _state
369
281
  },
370
- unregisterOption(action: { id: string }) {
282
+ unregisterOption(id) {
371
283
  let adjustedState = adjustOrderedState(_state, (options) => {
372
- let idx = options.findIndex((a) => a.id === action.id)
284
+ let idx = options.findIndex((a) => a.id === id)
373
285
  if (idx !== -1) options.splice(idx, 1)
374
286
  return options
375
287
  })
@@ -379,19 +291,11 @@
379
291
  _state.activationTrigger = ActivationTrigger.Other
380
292
  return _state
381
293
  },
382
- }
294
+ } satisfies StateDefinition<TActualType> & StateActions<TActualType>
383
295
  }
384
296
 
385
- const listboxActionsContext: ListboxActionsContext | null = null
386
- setContext("ListboxActionsContext", listboxActionsContext)
387
-
388
- const listboxDataContext: ListboxDataContext | null = null
389
- setContext("ListboxDataContext", listboxDataContext)
390
-
391
297
  let {
392
- ref = $bindable(),
393
- as,
394
- value: controlledValue,
298
+ value: controlledValue = $bindable(),
395
299
  defaultValue,
396
300
  form,
397
301
  name,
@@ -401,12 +305,13 @@
401
305
  disabled: ownDisabled = false,
402
306
  horizontal = false,
403
307
  multiple = false,
308
+ closeOnSelect,
404
309
  __demoMode = false,
405
310
  ...theirProps
406
- }: { as?: TTag } & ListboxProps<TTag, TType, TActualType> = $props()
311
+ }: ListboxProps<TType, TActualType> = $props()
407
312
 
408
313
  const providedDisabled = useDisabled()
409
- const disabled = $derived(providedDisabled.value || ownDisabled)
314
+ const disabled = $derived(providedDisabled.current || ownDisabled)
410
315
 
411
316
  const orientation = horizontal ? "horizontal" : "vertical"
412
317
  const controllable = useControllable<any>(
@@ -414,6 +319,9 @@
414
319
  get controlledValue() {
415
320
  return controlledValue
416
321
  },
322
+ set controlledValue(value) {
323
+ controlledValue = value
324
+ },
417
325
  },
418
326
  controlledOnChange,
419
327
  defaultValue
@@ -430,13 +338,13 @@
430
338
  __demoMode,
431
339
  } as StateDefinition<TActualType>)
432
340
 
433
- type _Data = ListboxDataContext
341
+ type _Data = ListboxDataContext<TActualType>
434
342
 
435
- const optionsPropsRef = useRef<_Data["optionsPropsRef"]["current"]>({ static: false, hold: false })
343
+ const optionsProps = $state<_Data["optionsProps"]>({ static: false, hold: false })
436
344
 
437
- const buttonRef = useRef<_Data["buttonRef"]["current"]>(null)
438
- const optionsRef = useRef<_Data["optionsRef"]["current"]>(null)
439
- const listRef = useRef<_Data["listRef"]["current"]>(new Map())
345
+ let buttonElement = $state<_Data["buttonElement"]>(null)
346
+ let optionsElement = $state<_Data["optionsElement"]>(null)
347
+ const listElements = new SvelteMap<string, HTMLElement | null>()
440
348
 
441
349
  const compare = useByComparator(by)
442
350
 
@@ -450,7 +358,7 @@
450
358
  },
451
359
  })
452
360
 
453
- const data = {
361
+ const data: ListboxDataContext<TActualType> = {
454
362
  get listboxState() {
455
363
  return _state.listboxState
456
364
  },
@@ -484,23 +392,31 @@
484
392
  get orientation() {
485
393
  return orientation
486
394
  },
395
+ get closeOnSelect() {
396
+ return closeOnSelect
397
+ },
487
398
  compare,
488
399
  isSelected,
489
- get optionsPropsRef() {
490
- return optionsPropsRef
400
+ get optionsProps() {
401
+ return optionsProps
402
+ },
403
+ get buttonElement() {
404
+ return buttonElement
405
+ },
406
+ set buttonElement(value) {
407
+ buttonElement = value
491
408
  },
492
- get buttonRef() {
493
- return buttonRef
409
+ get optionsElement() {
410
+ return optionsElement
494
411
  },
495
- get optionsRef() {
496
- return optionsRef
412
+ set optionsElement(value) {
413
+ optionsElement = value
497
414
  },
498
- get listRef() {
499
- return listRef
415
+ get listElements() {
416
+ return listElements
500
417
  },
501
418
  }
502
- setContext<ListboxDataContext>("ListboxDataContext", data)
503
- setContext("ListboxData", data)
419
+ setContext<ListboxDataContext<TActualType>>("ListboxDataContext", data)
504
420
 
505
421
  // Handle outside click
506
422
  const outsideClickEnabled = $derived(data.listboxState === ListboxStates.Open)
@@ -509,14 +425,14 @@
509
425
  return outsideClickEnabled
510
426
  },
511
427
  get containers() {
512
- return [data.buttonRef, data.optionsRef]
428
+ return [data.buttonElement, data.optionsElement]
513
429
  },
514
430
  cb: (event, target) => {
515
431
  _state.closeListbox()
516
432
 
517
433
  if (!isFocusableElement(target, FocusableMode.Loose)) {
518
434
  event.preventDefault()
519
- data.buttonRef.current?.focus()
435
+ data.buttonElement?.focus()
520
436
  }
521
437
  },
522
438
  })
@@ -560,8 +476,8 @@
560
476
  }
561
477
 
562
478
  const registerOption = (id: string, dataRef: ListboxOptionDataRef<TActualType>) => {
563
- _state.registerOption({ id, dataRef })
564
- return () => _state.unregisterOption({ id })
479
+ _state.registerOption(id, dataRef)
480
+ return () => _state.unregisterOption(id)
565
481
  }
566
482
 
567
483
  const onChange = (value: unknown) => {
@@ -584,7 +500,7 @@
584
500
  })
585
501
  }
586
502
 
587
- setContext<ListboxActionsContext>("ListboxActionsContext", {
503
+ setContext<ListboxActionsContext<TActualType>>("ListboxActionsContext", {
588
504
  onChange,
589
505
  registerOption,
590
506
  goToOption,
@@ -596,7 +512,7 @@
596
512
  clearSearch: _state.clearSearch,
597
513
  })
598
514
 
599
- createFloatingContext()
515
+ useFloatingProvider()
600
516
 
601
517
  const openClosed = $derived(
602
518
  match(data.listboxState, {
@@ -614,7 +530,7 @@
614
530
  inherit: true,
615
531
  props: {
616
532
  get htmlFor() {
617
- return data.buttonRef.current?.id
533
+ return data.buttonElement?.id
618
534
  },
619
535
  },
620
536
  slot: {
@@ -636,4 +552,4 @@
636
552
  {#if name && value}
637
553
  <FormFields {disabled} data={{ [name]: value }} {form} onReset={reset} />
638
554
  {/if}
639
- <ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_LISTBOX_TAG} name="Listbox" bind:ref />
555
+ <ElementOrComponent {theirProps} slots={slot} name="Listbox" />
@@ -1,16 +1,12 @@
1
1
  import { type ByComparator } from "../hooks/use-by-comparator.js";
2
- import { Focus } from "../utils/calculate-active-index.js";
3
- import { type MutableRefObject } from "../utils/ref.svelte.js";
4
- import type { ElementType, Props } from "../utils/types.js";
5
- import { type Snippet } from "svelte";
6
- declare let DEFAULT_LISTBOX_TAG: string;
7
- type ListboxRenderPropArg<T> = {
2
+ import type { PropsAsChild } from "../utils/types.js";
3
+ export type ListboxRenderPropArg<T> = {
8
4
  open: boolean;
9
5
  disabled: boolean;
10
6
  invalid: boolean;
11
7
  value: T;
12
8
  };
13
- export type ListboxProps<TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG, TType = string, TActualType = TType extends (infer U)[] ? U : TType> = Props<TTag, ListboxRenderPropArg<TType>, "value" | "defaultValue" | "onchange" | "by" | "disabled" | "horizontal" | "name" | "multiple", {
9
+ export type ListboxOwnProps<TType = string, TActualType = TType extends (infer U)[] ? U : TType> = {
14
10
  value?: TType;
15
11
  defaultValue?: TType;
16
12
  onchange?: (value: TType) => void;
@@ -21,106 +17,25 @@ export type ListboxProps<TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG,
21
17
  form?: string;
22
18
  name?: string;
23
19
  multiple?: boolean;
20
+ closeOnSelect?: boolean;
24
21
  __demoMode?: boolean;
25
- }>;
26
- export type ListboxChildren<T> = Snippet<[ListboxRenderPropArg<T>]>;
27
- export declare enum ListboxStates {
28
- Open = 0,
29
- Closed = 1
30
- }
31
- export declare enum ValueMode {
32
- Single = 0,
33
- Multi = 1
34
- }
35
- export declare enum ActivationTrigger {
36
- Pointer = 0,
37
- Other = 1
38
- }
39
- export type ListboxOptionDataRef<T> = MutableRefObject<{
40
- textValue?: string;
41
- disabled: boolean;
42
- value: T;
43
- domRef: MutableRefObject<HTMLElement | null>;
44
- }>;
45
- interface StateDefinition<T> {
46
- listboxState: ListboxStates;
47
- options: {
48
- id: string;
49
- dataRef: ListboxOptionDataRef<T>;
50
- }[];
51
- searchQuery: string;
52
- activeOptionIndex: number | null;
53
- activationTrigger: ActivationTrigger;
54
- __demoMode: boolean;
55
- }
56
- type ListboxActionsContext = {
57
- openListbox(): void;
58
- closeListbox(): void;
59
- registerOption(id: string, dataRef: ListboxOptionDataRef<unknown>): () => void;
60
- goToOption(focus: Focus.Specific, id: string, trigger?: ActivationTrigger): void;
61
- goToOption(focus: Focus, id?: string, trigger?: ActivationTrigger): void;
62
- selectOption(id: string): void;
63
- selectActiveOption(): void;
64
- onChange(value: unknown): void;
65
- search(query: string): void;
66
- clearSearch(): void;
67
22
  };
68
- export declare function useActions(component: string): ListboxActionsContext;
69
- export type ListboxDataContext = {
70
- value: unknown;
71
- disabled: boolean;
72
- invalid: boolean;
73
- mode: ValueMode;
74
- orientation: "horizontal" | "vertical";
75
- activeOptionIndex: number | null;
76
- compare(a: unknown, z: unknown): boolean;
77
- isSelected(value: unknown): boolean;
78
- optionsPropsRef: MutableRefObject<{
79
- static: boolean;
80
- hold: boolean;
81
- }>;
82
- listRef: MutableRefObject<Map<string, HTMLElement | null>>;
83
- buttonRef: MutableRefObject<HTMLElement | null>;
84
- optionsRef: MutableRefObject<HTMLElement | null>;
85
- } & Omit<StateDefinition<unknown>, "dataRef">;
86
- export declare function useData(component: string): ListboxDataContext;
87
- declare class __sveltets_Render<TType, TActualType, TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG> {
88
- props(): {
89
- as?: TTag | undefined;
90
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, "form" | ("as" | "children" | "refName" | "class") | "invalid" | "disabled" | "name" | "value" | "onchange" | "multiple" | "__demoMode" | "defaultValue" | "by" | "horizontal"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
91
- children?: import("../utils/types.js").Children<ListboxRenderPropArg<TType>> | undefined;
92
- ref?: HTMLElement;
93
- } & (true extends (import("../utils/types.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../utils/types.js").PropsOf<TTag> ? T_1 extends never ? never : "class" extends infer T_2 ? T_2 extends "class" ? T_2 extends keyof T_1 ? true : never : never : never : never : never) ? {
94
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: ListboxRenderPropArg<TType>) => string) | undefined;
95
- } : {}) & {
96
- value?: TType | undefined;
97
- defaultValue?: TType | undefined;
98
- onchange?: ((value: TType) => void) | undefined;
99
- by?: ByComparator<TActualType> | undefined;
100
- disabled?: boolean;
101
- invalid?: boolean;
102
- horizontal?: boolean;
103
- form?: string;
104
- name?: string;
105
- multiple?: boolean;
106
- __demoMode?: boolean;
107
- };
108
- events(): {} & {
109
- [evt: string]: CustomEvent<any>;
110
- };
23
+ export type ListboxProps<TType = string, TActualType = TType extends (infer U)[] ? U : TType> = PropsAsChild<ListboxRenderPropArg<TType>, ListboxOwnProps<TType, TActualType>>;
24
+ export * from "./context.svelte.js";
25
+ declare class __sveltets_Render<TType = string, TActualType = TType extends (infer U)[] ? U : TType> {
26
+ props(): ListboxProps<TType, TActualType>;
27
+ events(): {};
111
28
  slots(): {};
112
- bindings(): "ref";
29
+ bindings(): "value";
113
30
  exports(): {};
114
31
  }
115
32
  interface $$IsomorphicComponent {
116
- new <TType, TActualType, TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TType, TActualType, TTag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TType, TActualType, TTag>['props']>, ReturnType<__sveltets_Render<TType, TActualType, TTag>['events']>, ReturnType<__sveltets_Render<TType, TActualType, TTag>['slots']>> & {
117
- $$bindings?: ReturnType<__sveltets_Render<TType, TActualType, TTag>['bindings']>;
118
- } & ReturnType<__sveltets_Render<TType, TActualType, TTag>['exports']>;
119
- <TType, TActualType, TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TType, TActualType, TTag>['props']> & {
120
- $$events?: ReturnType<__sveltets_Render<TType, TActualType, TTag>['events']>;
121
- }): ReturnType<__sveltets_Render<TType, TActualType, TTag>['exports']>;
122
- z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
33
+ new <TType = string, TActualType = TType extends (infer U)[] ? U : TType>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TType, TActualType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TType, TActualType>['props']>, ReturnType<__sveltets_Render<TType, TActualType>['events']>, ReturnType<__sveltets_Render<TType, TActualType>['slots']>> & {
34
+ $$bindings?: ReturnType<__sveltets_Render<TType, TActualType>['bindings']>;
35
+ } & ReturnType<__sveltets_Render<TType, TActualType>['exports']>;
36
+ <TType = string, TActualType = TType extends (infer U)[] ? U : TType>(internal: unknown, props: ReturnType<__sveltets_Render<TType, TActualType>['props']> & {}): ReturnType<__sveltets_Render<TType, TActualType>['exports']>;
37
+ z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
123
38
  }
124
39
  declare const Listbox: $$IsomorphicComponent;
125
- type Listbox<TType, TActualType, TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG> = InstanceType<typeof Listbox<TType, TActualType, TTag>>;
40
+ type Listbox<TType = string, TActualType = TType extends (infer U)[] ? U : TType> = InstanceType<typeof Listbox<TType, TActualType>>;
126
41
  export default Listbox;