@pzerelles/headlessui-svelte 2.1.2-next.5 → 2.1.2-next.50

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