@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,16 +1,15 @@
1
1
  <script lang="ts" module>
2
2
  import { useId } from "../hooks/use-id.js"
3
- import { getIdContext } from "../utils/id.js"
4
- import type { ElementType, Props } from "../utils/types.js"
3
+ import { useProvidedId } from "../utils/id.js"
4
+ import type { Props } from "../utils/types.js"
5
5
  import { ListboxStates, useActions, useData } from "./Listbox.svelte"
6
6
  import { attemptSubmit } from "../utils/form.js"
7
7
  import { Focus } from "../utils/calculate-active-index.js"
8
8
  import { useFocusRing } from "../hooks/use-focus-ring.svelte.js"
9
9
  import { useActivePress } from "../hooks/use-active-press.svelte.js"
10
10
  import { useResolveButtonType } from "../hooks/use-resolve-button-type.svelte.js"
11
- import { useFloating } from "../internal/floating.svelte.js"
11
+ import { useFloatingReference, useFloatingReferenceProps } from "../internal/floating.svelte.js"
12
12
  import { stateFromSlot } from "../utils/state.js"
13
- import type { Snippet } from "svelte"
14
13
  import { useLabelledBy } from "../label/context.svelte.js"
15
14
  import { useDescribedBy } from "../description/context.svelte.js"
16
15
  import { useHover } from "../hooks/use-hover.svelte.js"
@@ -18,7 +17,7 @@
18
17
  import ElementOrComponent from "../utils/ElementOrComponent.svelte"
19
18
 
20
19
  const DEFAULT_BUTTON_TAG = "button" as const
21
- type ButtonRenderPropArg = {
20
+ export type ButtonRenderPropArg = {
22
21
  disabled: boolean
23
22
  invalid: boolean
24
23
  hover: boolean
@@ -30,38 +29,34 @@
30
29
  }
31
30
  type ButtonPropsWeControl = "aria-controls" | "aria-expanded" | "aria-haspopup" | "aria-labelledby" | "disabled"
32
31
 
33
- export type ListboxButtonProps<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = Props<
34
- TTag,
35
- ButtonRenderPropArg,
36
- ButtonPropsWeControl,
37
- {
38
- id?: string
39
- autofocus?: boolean
40
- disabled?: boolean
41
- }
42
- >
32
+ export type ListboxButtonOwnProps = {
33
+ element?: HTMLElement
34
+ id?: string
35
+ autofocus?: boolean
36
+ disabled?: boolean
37
+ }
43
38
 
44
- export type ListboxButtonChildren = Snippet<[ButtonRenderPropArg]>
39
+ export type ListboxButtonProps = Props<typeof DEFAULT_BUTTON_TAG, ButtonRenderPropArg, ListboxButtonOwnProps>
45
40
  </script>
46
41
 
47
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_BUTTON_TAG">
42
+ <script lang="ts">
48
43
  const data = useData("ListboxButton")
49
44
  const actions = useActions("ListboxButton")
50
45
 
51
46
  const internalId = useId()
52
- const providedId = getIdContext()
47
+ const providedId = useProvidedId()
53
48
  let {
54
- as = DEFAULT_BUTTON_TAG as TTag,
55
- ref = $bindable(),
49
+ element = $bindable(),
56
50
  id = providedId || `headlessui-listbox-button-${internalId}`,
57
51
  disabled: ownDisabled = false,
58
52
  autofocus = false,
59
53
  ...theirProps
60
- }: { as?: TTag } & ListboxButtonProps<TTag> = $props()
61
- const { setReference, getReferenceProps: getFloatingReferenceProps } = useFloating()
54
+ }: ListboxButtonProps = $props()
55
+ const { setReference } = useFloatingReference()
56
+ const { getReferenceProps: getFloatingReferenceProps } = useFloatingReferenceProps()
62
57
  $effect(() => {
63
- data.buttonRef.current = ref || null
64
- setReference(ref)
58
+ data.buttonElement = element || null
59
+ setReference(element)
65
60
  })
66
61
 
67
62
  const disabled = $derived(data.disabled || ownDisabled)
@@ -104,7 +99,7 @@
104
99
  //if (isDisabledReactIssue7711(event.currentTarget)) return event.preventDefault()
105
100
  if (data.listboxState === ListboxStates.Open) {
106
101
  actions.closeListbox()
107
- data.buttonRef.current?.focus({ preventScroll: true })
102
+ data.buttonElement?.focus({ preventScroll: true })
108
103
  } else {
109
104
  event.preventDefault()
110
105
  actions.openListbox()
@@ -152,10 +147,10 @@
152
147
 
153
148
  const buttonType = useResolveButtonType({
154
149
  get props() {
155
- return { type: theirProps.type, as }
150
+ return { type: theirProps.type ?? undefined, as: DEFAULT_BUTTON_TAG }
156
151
  },
157
152
  get ref() {
158
- return data.buttonRef
153
+ return { current: data.buttonElement }
159
154
  },
160
155
  })
161
156
 
@@ -166,7 +161,7 @@
166
161
  id,
167
162
  type: buttonType.type,
168
163
  "aria-haspopup": "listbox",
169
- "aria-controls": data.optionsRef.current?.id,
164
+ "aria-controls": data.optionsElement?.id,
170
165
  "aria-expanded": data.listboxState === ListboxStates.Open,
171
166
  "aria-labelledby": labelledBy.value,
172
167
  "aria-describedby": describedBy.value,
@@ -185,4 +180,11 @@
185
180
  )
186
181
  </script>
187
182
 
188
- <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_BUTTON_TAG} name="ListboxButton" bind:ref />
183
+ <ElementOrComponent
184
+ {ourProps}
185
+ {theirProps}
186
+ slots={slot}
187
+ defaultTag={DEFAULT_BUTTON_TAG}
188
+ name="ListboxButton"
189
+ bind:element
190
+ />
@@ -1,7 +1,6 @@
1
- import type { ElementType, Props } from "../utils/types.js";
2
- import type { Snippet } from "svelte";
1
+ import type { Props } from "../utils/types.js";
3
2
  declare const DEFAULT_BUTTON_TAG: "button";
4
- type ButtonRenderPropArg = {
3
+ export type ButtonRenderPropArg = {
5
4
  disabled: boolean;
6
5
  invalid: boolean;
7
6
  hover: boolean;
@@ -11,42 +10,13 @@ type ButtonRenderPropArg = {
11
10
  active: boolean;
12
11
  value: any;
13
12
  };
14
- type ButtonPropsWeControl = "aria-controls" | "aria-expanded" | "aria-haspopup" | "aria-labelledby" | "disabled";
15
- export type ListboxButtonProps<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = Props<TTag, ButtonRenderPropArg, ButtonPropsWeControl, {
13
+ export type ListboxButtonOwnProps = {
14
+ element?: HTMLElement;
16
15
  id?: string;
17
16
  autofocus?: boolean;
18
17
  disabled?: boolean;
19
- }>;
20
- export type ListboxButtonChildren = Snippet<[ButtonRenderPropArg]>;
21
- declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> {
22
- props(): {
23
- as?: TTag | undefined;
24
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "autofocus" | "id" | ButtonPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
25
- children?: import("../utils/types.js").Children<ButtonRenderPropArg> | undefined;
26
- ref?: HTMLElement;
27
- } & (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) ? {
28
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: ButtonRenderPropArg) => string) | undefined;
29
- } : {}) & {
30
- id?: string;
31
- autofocus?: boolean;
32
- disabled?: boolean;
33
- };
34
- events(): {} & {
35
- [evt: string]: CustomEvent<any>;
36
- };
37
- slots(): {};
38
- bindings(): "ref";
39
- exports(): {};
40
- }
41
- interface $$IsomorphicComponent {
42
- new <TTag extends ElementType = typeof DEFAULT_BUTTON_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']>> & {
43
- $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
44
- } & ReturnType<__sveltets_Render<TTag>['exports']>;
45
- <TTag extends ElementType = typeof DEFAULT_BUTTON_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
46
- $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
47
- }): ReturnType<__sveltets_Render<TTag>['exports']>;
48
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
49
- }
50
- declare const ListboxButton: $$IsomorphicComponent;
51
- type ListboxButton<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = InstanceType<typeof ListboxButton<TTag>>;
18
+ };
19
+ export type ListboxButtonProps = Props<typeof DEFAULT_BUTTON_TAG, ButtonRenderPropArg, ListboxButtonOwnProps>;
20
+ declare const ListboxButton: import("svelte").Component<ListboxButtonProps, {}, "element">;
21
+ type ListboxButton = ReturnType<typeof ListboxButton>;
52
22
  export default ListboxButton;
@@ -1,8 +1,8 @@
1
1
  <script lang="ts" module>
2
- import type { ElementType, Props } from "../utils/types.js"
2
+ import type { Props } from "../utils/types.js"
3
3
 
4
4
  const DEFAULT_OPTION_TAG = "div" as const
5
- type OptionRenderPropArg = {
5
+ export type OptionRenderPropArg = {
6
6
  /** @deprecated use `focus` instead */
7
7
  active: boolean
8
8
  focus: boolean
@@ -13,21 +13,21 @@
13
13
  }
14
14
  type OptionPropsWeControl = "aria-disabled" | "aria-selected" | "role" | "tabIndex"
15
15
 
16
- export type ListboxOptionProps<TTag extends ElementType = typeof DEFAULT_OPTION_TAG, TType = string> = Props<
17
- TTag,
16
+ export type ListboxOptionOwnProps<TType = string> = {
17
+ element?: HTMLElement
18
+ id?: string
19
+ disabled?: boolean
20
+ value: TType
21
+ }
22
+
23
+ export type ListboxOptionProps<TType = string> = Props<
24
+ typeof DEFAULT_OPTION_TAG,
18
25
  OptionRenderPropArg,
19
- OptionPropsWeControl,
20
- {
21
- id?: string
22
- disabled?: boolean
23
- value: TType
24
- }
26
+ ListboxOptionOwnProps<TType>
25
27
  >
26
-
27
- export type ListboxOptionChildren = Snippet<[OptionRenderPropArg]>
28
28
  </script>
29
29
 
30
- <script lang="ts" generics="TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG">
30
+ <script lang="ts" generics="TType">
31
31
  import { useId } from "../hooks/use-id.js"
32
32
  import {
33
33
  ActivationTrigger,
@@ -39,7 +39,7 @@
39
39
  } from "./Listbox.svelte"
40
40
  import { disposables } from "../utils/disposables.js"
41
41
  import { Focus } from "../utils/calculate-active-index.js"
42
- import { getContext, onMount, type Snippet } from "svelte"
42
+ import { getContext, onMount } from "svelte"
43
43
  import { useTextValue } from "../hooks/use-text-value.svelte.js"
44
44
  import { useTrackedPointer } from "../hooks/use-tracked-pointer.js"
45
45
  import { stateFromSlot } from "../utils/state.js"
@@ -47,39 +47,45 @@
47
47
 
48
48
  const internalId = useId()
49
49
  let {
50
- as = DEFAULT_OPTION_TAG as TTag,
51
- ref = $bindable(),
50
+ element = $bindable(),
52
51
  id = `headlessui-listbox-option-${internalId}`,
53
52
  disabled = false,
54
53
  value,
55
54
  ...theirProps
56
- }: { as?: TTag } & ListboxOptionProps<TTag, TType> = $props()
55
+ }: ListboxOptionProps<TType> = $props()
57
56
  const usedInSelectedOption = getContext<boolean>("SelectedOptionContext") === true
58
57
  const data = useData("ListboxOption")
59
58
  const actions = useActions("ListboxOption")
60
59
 
61
- const active = $derived(data.activeOptionIndex !== null ? data.options[data.activeOptionIndex].id === id : false)
60
+ const { activeOptionIndex, options } = $derived(data)
61
+
62
+ const active = $derived(activeOptionIndex !== null ? options[activeOptionIndex].id === id : false)
62
63
 
63
64
  const selected = $derived(data.isSelected(value))
64
65
  const getTextValue = useTextValue({
65
66
  get element() {
66
- return ref as HTMLElement
67
+ return element as HTMLElement
67
68
  },
68
69
  })
69
70
  const bag: ListboxOptionDataRef<TType>["current"] = $derived({
70
71
  disabled,
71
72
  value,
72
- domRef: { current: ref || null },
73
+ domRef: { current: element || null },
73
74
  get textValue() {
74
75
  return getTextValue()
75
76
  },
76
77
  })
77
78
 
78
79
  $effect(() => {
79
- if (!ref) {
80
- data.listRef.current.delete(id)
80
+ if (usedInSelectedOption) return
81
+ if (!element) {
82
+ data.listElements.delete(id)
81
83
  } else {
82
- data.listRef.current.set(id, ref)
84
+ data.listElements.set(id, element)
85
+ }
86
+
87
+ return () => {
88
+ if (element) data.listElements.delete(id)
83
89
  }
84
90
  })
85
91
 
@@ -89,7 +95,7 @@
89
95
  if (!active) return
90
96
  if (data.activationTrigger === ActivationTrigger.Pointer) return
91
97
  return disposables().requestAnimationFrame(() => {
92
- ;(ref as HTMLElement)?.scrollIntoView?.({ block: "nearest" })
98
+ ;(element as HTMLElement)?.scrollIntoView?.({ block: "nearest" })
93
99
  })
94
100
  })
95
101
 
@@ -105,9 +111,9 @@
105
111
  const handleClick = (event: { preventDefault: Function }) => {
106
112
  if (disabled) return event.preventDefault()
107
113
  actions.onChange(value)
108
- if (data.mode === ValueMode.Single) {
114
+ if (data.closeOnSelect === true || (data.closeOnSelect === undefined && data.mode === ValueMode.Single)) {
109
115
  actions.closeListbox()
110
- data.buttonRef.current?.focus({ preventScroll: true })
116
+ data.buttonElement?.focus({ preventScroll: true })
111
117
  }
112
118
  }
113
119
 
@@ -173,5 +179,12 @@
173
179
  </script>
174
180
 
175
181
  {#if selected || !usedInSelectedOption}
176
- <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_OPTION_TAG} name="Listbox" bind:ref />
182
+ <ElementOrComponent
183
+ {ourProps}
184
+ {theirProps}
185
+ slots={slot}
186
+ defaultTag={DEFAULT_OPTION_TAG}
187
+ name="Listbox"
188
+ bind:element
189
+ />
177
190
  {/if}
@@ -1,6 +1,6 @@
1
- import type { ElementType, Props } from "../utils/types.js";
1
+ import type { Props } from "../utils/types.js";
2
2
  declare const DEFAULT_OPTION_TAG: "div";
3
- type OptionRenderPropArg = {
3
+ export type OptionRenderPropArg = {
4
4
  /** @deprecated use `focus` instead */
5
5
  active: boolean;
6
6
  focus: boolean;
@@ -8,43 +8,27 @@ type OptionRenderPropArg = {
8
8
  disabled: boolean;
9
9
  selectedOption: boolean;
10
10
  };
11
- type OptionPropsWeControl = "aria-disabled" | "aria-selected" | "role" | "tabIndex";
12
- export type ListboxOptionProps<TTag extends ElementType = typeof DEFAULT_OPTION_TAG, TType = string> = Props<TTag, OptionRenderPropArg, OptionPropsWeControl, {
11
+ export type ListboxOptionOwnProps<TType = string> = {
12
+ element?: HTMLElement;
13
13
  id?: string;
14
14
  disabled?: boolean;
15
15
  value: TType;
16
- }>;
17
- export type ListboxOptionChildren = Snippet<[OptionRenderPropArg]>;
18
- import { type Snippet } from "svelte";
19
- declare class __sveltets_Render<TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG> {
20
- props(): {
21
- as?: TTag | undefined;
22
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "disabled" | "value" | "id" | OptionPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
23
- children?: import("../utils/types.js").Children<OptionRenderPropArg> | undefined;
24
- ref?: HTMLElement;
25
- } & (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) ? {
26
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: OptionRenderPropArg) => string) | undefined;
27
- } : {}) & {
28
- id?: string;
29
- disabled?: boolean;
30
- value: TType;
31
- };
32
- events(): {} & {
33
- [evt: string]: CustomEvent<any>;
34
- };
16
+ };
17
+ export type ListboxOptionProps<TType = string> = Props<typeof DEFAULT_OPTION_TAG, OptionRenderPropArg, ListboxOptionOwnProps<TType>>;
18
+ declare class __sveltets_Render<TType> {
19
+ props(): ListboxOptionProps<TType>;
20
+ events(): {};
35
21
  slots(): {};
36
- bindings(): "ref";
22
+ bindings(): "element";
37
23
  exports(): {};
38
24
  }
39
25
  interface $$IsomorphicComponent {
40
- new <TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TType, TTag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TType, TTag>['props']>, ReturnType<__sveltets_Render<TType, TTag>['events']>, ReturnType<__sveltets_Render<TType, TTag>['slots']>> & {
41
- $$bindings?: ReturnType<__sveltets_Render<TType, TTag>['bindings']>;
42
- } & ReturnType<__sveltets_Render<TType, TTag>['exports']>;
43
- <TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TType, TTag>['props']> & {
44
- $$events?: ReturnType<__sveltets_Render<TType, TTag>['events']>;
45
- }): ReturnType<__sveltets_Render<TType, TTag>['exports']>;
46
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
26
+ new <TType>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TType>['props']>, ReturnType<__sveltets_Render<TType>['events']>, ReturnType<__sveltets_Render<TType>['slots']>> & {
27
+ $$bindings?: ReturnType<__sveltets_Render<TType>['bindings']>;
28
+ } & ReturnType<__sveltets_Render<TType>['exports']>;
29
+ <TType>(internal: unknown, props: ReturnType<__sveltets_Render<TType>['props']> & {}): ReturnType<__sveltets_Render<TType>['exports']>;
30
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
47
31
  }
48
32
  declare const ListboxOption: $$IsomorphicComponent;
49
- type ListboxOption<TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG> = InstanceType<typeof ListboxOption<TType, TTag>>;
33
+ type ListboxOption<TType> = InstanceType<typeof ListboxOption<TType>>;
50
34
  export default ListboxOption;