@pzerelles/headlessui-svelte 2.1.2-next.3 → 2.1.2-next.31

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 (197) hide show
  1. package/dist/button/Button.svelte +1 -1
  2. package/dist/button/Button.svelte.d.ts +9 -11
  3. package/dist/checkbox/Checkbox.svelte +4 -4
  4. package/dist/checkbox/Checkbox.svelte.d.ts +10 -14
  5. package/dist/close-button/CloseButton.svelte.d.ts +16 -18
  6. package/dist/data-interactive/DataInteractive.svelte.d.ts +8 -11
  7. package/dist/description/Description.svelte +19 -14
  8. package/dist/description/Description.svelte.d.ts +9 -11
  9. package/dist/description/context.svelte.js +14 -16
  10. package/dist/dialog/Dialog.svelte +245 -17
  11. package/dist/dialog/Dialog.svelte.d.ts +12 -14
  12. package/dist/dialog/DialogBackdrop.svelte +1 -1
  13. package/dist/dialog/DialogBackdrop.svelte.d.ts +9 -11
  14. package/dist/dialog/DialogPanel.svelte +1 -2
  15. package/dist/dialog/DialogPanel.svelte.d.ts +9 -11
  16. package/dist/dialog/DialogTitle.svelte.d.ts +8 -10
  17. package/dist/dialog/context.svelte.js +1 -1
  18. package/dist/field/Field.svelte +24 -12
  19. package/dist/field/Field.svelte.d.ts +9 -11
  20. package/dist/fieldset/Fieldset.svelte +1 -1
  21. package/dist/fieldset/Fieldset.svelte.d.ts +9 -11
  22. package/dist/focus-trap/FocusTrap.svelte +7 -14
  23. package/dist/focus-trap/FocusTrap.svelte.d.ts +11 -25
  24. package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
  25. package/dist/focus-trap/FocusTrapFeatures.js +15 -0
  26. package/dist/hooks/use-controllable.svelte.js +2 -1
  27. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  28. package/dist/hooks/use-disabled.d.ts +6 -1
  29. package/dist/hooks/use-disabled.js +10 -5
  30. package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
  31. package/dist/hooks/use-event-listener.svelte.js +3 -1
  32. package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
  33. package/dist/hooks/use-root-containers.svelte.js +5 -5
  34. package/dist/hooks/use-tab-direction.svelte.js +1 -1
  35. package/dist/index.d.ts +4 -2
  36. package/dist/index.js +4 -2
  37. package/dist/input/Input.svelte +3 -3
  38. package/dist/input/Input.svelte.d.ts +10 -14
  39. package/dist/internal/FloatingProvider.svelte +12 -0
  40. package/dist/internal/FloatingProvider.svelte.d.ts +6 -0
  41. package/dist/internal/FocusSentinel.svelte.d.ts +2 -18
  42. package/dist/internal/ForcePortalRoot.svelte.d.ts +2 -18
  43. package/dist/internal/FormFields.svelte +22 -19
  44. package/dist/internal/FormFields.svelte.d.ts +2 -18
  45. package/dist/internal/FormFieldsProvider.svelte +13 -0
  46. package/dist/internal/FormFieldsProvider.svelte.d.ts +5 -0
  47. package/dist/internal/FormResolver.svelte.d.ts +2 -18
  48. package/dist/internal/Hidden.svelte +18 -8
  49. package/dist/internal/Hidden.svelte.d.ts +11 -16
  50. package/dist/internal/HiddenFeatures.d.ts +5 -0
  51. package/dist/internal/HiddenFeatures.js +9 -0
  52. package/dist/internal/MainTreeProvider.svelte.d.ts +2 -18
  53. package/dist/internal/Portal.svelte.d.ts +2 -18
  54. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  55. package/dist/internal/floating-provider.svelte.js +206 -0
  56. package/dist/internal/floating.svelte.d.ts +46 -22
  57. package/dist/internal/floating.svelte.js +90 -272
  58. package/dist/internal/form-fields.svelte.d.ts +10 -0
  59. package/dist/internal/form-fields.svelte.js +23 -0
  60. package/dist/label/Label.svelte +6 -5
  61. package/dist/label/Label.svelte.d.ts +9 -11
  62. package/dist/label/context.svelte.js +1 -1
  63. package/dist/legend/Legend.svelte +2 -2
  64. package/dist/legend/Legend.svelte.d.ts +4 -32
  65. package/dist/listbox/Listbox.svelte +47 -68
  66. package/dist/listbox/Listbox.svelte.d.ts +18 -80
  67. package/dist/listbox/ListboxButton.svelte +10 -10
  68. package/dist/listbox/ListboxButton.svelte.d.ts +10 -15
  69. package/dist/listbox/ListboxOption.svelte +10 -6
  70. package/dist/listbox/ListboxOption.svelte.d.ts +9 -12
  71. package/dist/listbox/ListboxOptions.svelte +108 -54
  72. package/dist/listbox/ListboxOptions.svelte.d.ts +9 -12
  73. package/dist/listbox/ListboxSelectedOption.svelte +2 -4
  74. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -16
  75. package/dist/listbox/context.svelte.d.ts +76 -0
  76. package/dist/listbox/context.svelte.js +36 -0
  77. package/dist/listbox/index.d.ts +4 -4
  78. package/dist/listbox/index.js +1 -1
  79. package/dist/menu/Menu.svelte +13 -191
  80. package/dist/menu/Menu.svelte.d.ts +9 -13
  81. package/dist/menu/MenuButton.svelte +4 -2
  82. package/dist/menu/MenuButton.svelte.d.ts +9 -12
  83. package/dist/menu/MenuHeading.svelte.d.ts +9 -12
  84. package/dist/menu/MenuItem.svelte.d.ts +11 -16
  85. package/dist/menu/MenuItems.svelte +15 -11
  86. package/dist/menu/MenuItems.svelte.d.ts +9 -12
  87. package/dist/menu/MenuSection.svelte.d.ts +8 -11
  88. package/dist/menu/MenuSeparator.svelte.d.ts +8 -12
  89. package/dist/menu/context.svelte.d.ts +2 -1
  90. package/dist/menu/context.svelte.js +212 -2
  91. package/dist/menu/index.d.ts +7 -7
  92. package/dist/popover/Popover.svelte +161 -0
  93. package/dist/popover/Popover.svelte.d.ts +39 -0
  94. package/dist/popover/PopoverBackdrop.svelte +56 -0
  95. package/dist/popover/PopoverBackdrop.svelte.d.ts +43 -0
  96. package/dist/popover/PopoverButton.svelte +246 -0
  97. package/dist/popover/PopoverButton.svelte.d.ts +42 -0
  98. package/dist/popover/PopoverGroup.svelte +43 -0
  99. package/dist/popover/PopoverGroup.svelte.d.ts +31 -0
  100. package/dist/popover/PopoverPanel.svelte +274 -0
  101. package/dist/popover/PopoverPanel.svelte.d.ts +51 -0
  102. package/dist/popover/context.svelte.d.ts +51 -0
  103. package/dist/popover/context.svelte.js +108 -0
  104. package/dist/popover/index.d.ts +5 -0
  105. package/dist/popover/index.js +5 -0
  106. package/dist/portal/InternalPortal.svelte.d.ts +9 -11
  107. package/dist/portal/Portal.svelte.d.ts +2 -6
  108. package/dist/portal/PortalGroup.svelte.d.ts +9 -11
  109. package/dist/select/Select.svelte +74 -0
  110. package/dist/select/Select.svelte.d.ts +46 -0
  111. package/dist/select/index.d.ts +1 -0
  112. package/dist/select/index.js +1 -0
  113. package/dist/switch/Switch.svelte +30 -20
  114. package/dist/switch/Switch.svelte.d.ts +10 -12
  115. package/dist/switch/SwitchGroup.svelte.d.ts +8 -10
  116. package/dist/tabs/Tab.svelte +8 -9
  117. package/dist/tabs/Tab.svelte.d.ts +9 -11
  118. package/dist/tabs/TabGroup.svelte +27 -190
  119. package/dist/tabs/TabGroup.svelte.d.ts +9 -31
  120. package/dist/tabs/TabList.svelte +4 -4
  121. package/dist/tabs/TabList.svelte.d.ts +8 -10
  122. package/dist/tabs/TabPanel.svelte +4 -5
  123. package/dist/tabs/TabPanel.svelte.d.ts +9 -11
  124. package/dist/tabs/TabPanels.svelte +3 -3
  125. package/dist/tabs/TabPanels.svelte.d.ts +8 -10
  126. package/dist/tabs/context.svelte.d.ts +31 -0
  127. package/dist/tabs/context.svelte.js +134 -0
  128. package/dist/textarea/Textarea.svelte +4 -4
  129. package/dist/textarea/Textarea.svelte.d.ts +21 -20
  130. package/dist/transition/InternalTransitionChild.svelte.d.ts +9 -11
  131. package/dist/transition/Transition.svelte.d.ts +9 -11
  132. package/dist/transition/TransitionChild.svelte.d.ts +9 -11
  133. package/dist/transition/context.svelte.js +2 -2
  134. package/dist/utils/DisabledProvider.svelte +6 -0
  135. package/dist/utils/DisabledProvider.svelte.d.ts +6 -0
  136. package/dist/utils/ElementOrComponent.svelte +2 -2
  137. package/dist/utils/ElementOrComponent.svelte.d.ts +12 -11
  138. package/dist/utils/Generic.svelte +10 -8
  139. package/dist/utils/Generic.svelte.d.ts +12 -15
  140. package/dist/utils/StableCollection.svelte.d.ts +2 -18
  141. package/dist/utils/alternative-types.d.ts +1 -2
  142. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +17 -0
  143. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +7 -0
  144. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
  145. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +25 -0
  146. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  147. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  148. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  149. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  150. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  151. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  152. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  153. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  154. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  155. package/dist/utils/floating-ui/svelte/index.js +5 -0
  156. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  157. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  158. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  159. package/dist/utils/floating-ui/svelte/types.js +1 -0
  160. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  161. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  162. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  163. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  164. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  165. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  166. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  167. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  168. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  169. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  170. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  171. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  172. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  173. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  174. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  175. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +182 -0
  176. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  177. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  178. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  179. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  180. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  181. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  182. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  183. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  184. package/dist/utils/id.d.ts +1 -1
  185. package/dist/utils/id.js +1 -1
  186. package/dist/utils/index.d.ts +3 -0
  187. package/dist/utils/index.js +3 -0
  188. package/dist/utils/style.d.ts +2 -0
  189. package/dist/utils/style.js +6 -0
  190. package/dist/utils/types.d.ts +9 -13
  191. package/package.json +27 -26
  192. package/dist/dialog/InternalDialog.svelte +0 -233
  193. package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
  194. package/dist/internal/HoistFormFields.svelte +0 -11
  195. package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
  196. package/dist/internal/id.d.ts +0 -8
  197. package/dist/internal/id.js +0 -11
@@ -4,51 +4,23 @@ import { useDisabled } from "../hooks/use-disabled.js";
4
4
  import { calculateActiveIndex, Focus } from "../utils/calculate-active-index.js";
5
5
  import { FocusableMode, isFocusableElement, sortByDomNode } from "../utils/focus-management.js";
6
6
  import { match } from "../utils/match.js";
7
- import { useRef } from "../utils/ref.svelte.js";
8
- import { getContext, setContext } from "svelte";
7
+ import { setContext } from "svelte";
8
+ import { ActivationTrigger, ListboxStates, ValueMode } from "./context.svelte.js";
9
9
  let DEFAULT_LISTBOX_TAG = "svelte:fragment";
10
- export var ListboxStates = /* @__PURE__ */ ((ListboxStates2) => {
11
- ListboxStates2[ListboxStates2["Open"] = 0] = "Open";
12
- ListboxStates2[ListboxStates2["Closed"] = 1] = "Closed";
13
- return ListboxStates2;
14
- })(ListboxStates || {});
15
- export var ValueMode = /* @__PURE__ */ ((ValueMode2) => {
16
- ValueMode2[ValueMode2["Single"] = 0] = "Single";
17
- ValueMode2[ValueMode2["Multi"] = 1] = "Multi";
18
- return ValueMode2;
19
- })(ValueMode || {});
20
- export var ActivationTrigger = /* @__PURE__ */ ((ActivationTrigger2) => {
21
- ActivationTrigger2[ActivationTrigger2["Pointer"] = 0] = "Pointer";
22
- ActivationTrigger2[ActivationTrigger2["Other"] = 1] = "Other";
23
- return ActivationTrigger2;
24
- })(ActivationTrigger || {});
25
- export function useActions(component) {
26
- const context = getContext("ListboxActionsContext");
27
- if (!context) {
28
- let err = new Error(`<${component} /> is missing a parent <Listbox /> component.`);
29
- if (Error.captureStackTrace) Error.captureStackTrace(err, useActions);
30
- throw err;
31
- }
32
- return context;
33
- }
34
- export function useData(component) {
35
- const context = getContext("ListboxData");
36
- if (context === null) {
37
- let err = new Error(`<${component} /> is missing a parent <Listbox /> component.`);
38
- if (Error.captureStackTrace) Error.captureStackTrace(err, useData);
39
- throw err;
40
- }
41
- return context;
42
- }
10
+ export * from "./context.svelte.js";
43
11
  </script>
44
12
 
45
- <script lang="ts" generics="TType, TActualType, TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG">import { disposables } from "../utils/disposables.js";
13
+ <script
14
+ lang="ts"
15
+ generics="TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG, TType = string, TActualType = TType extends (infer U)[] ? U : TType"
16
+ >import { disposables } from "../utils/disposables.js";
46
17
  import FormFields from "../internal/FormFields.svelte";
47
- import { createFloatingContext } from "../internal/floating.svelte.js";
18
+ import { useFloatingProvider } from "../internal/floating-provider.svelte.js";
48
19
  import { createOpenClosedContext, State } from "../internal/open-closed.js";
49
20
  import { useLabels } from "../label/context.svelte.js";
50
21
  import { useOutsideClick } from "../hooks/use-outside-click.svelte.js";
51
22
  import ElementOrComponent from "../utils/ElementOrComponent.svelte";
23
+ import { SvelteMap } from "svelte/reactivity";
52
24
  function adjustOrderedState(state, adjustment = (i) => i) {
53
25
  let currentActiveOption = state.activeOptionIndex !== null ? state.options[state.activeOptionIndex] : null;
54
26
  let sortedOptions = sortByDomNode(
@@ -202,11 +174,11 @@ const stateReducer = (initialState) => {
202
174
  _state2.searchQuery = "";
203
175
  return _state2;
204
176
  },
205
- registerOption(action) {
206
- let option = { id: action.id, dataRef: action.dataRef };
177
+ registerOption(id, dataRef) {
178
+ let option = { id, dataRef };
207
179
  let adjustedState = adjustOrderedState(_state2, (options) => [...options, option]);
208
180
  if (_state2.activeOptionIndex === null) {
209
- if (isSelected(action.dataRef.current.value)) {
181
+ if (isSelected(dataRef.current.value)) {
210
182
  adjustedState.activeOptionIndex = adjustedState.options.indexOf(option);
211
183
  }
212
184
  }
@@ -214,9 +186,9 @@ const stateReducer = (initialState) => {
214
186
  _state2.activeOptionIndex = adjustedState.activeOptionIndex;
215
187
  return _state2;
216
188
  },
217
- unregisterOption(action) {
189
+ unregisterOption(id) {
218
190
  let adjustedState = adjustOrderedState(_state2, (options) => {
219
- let idx = options.findIndex((a) => a.id === action.id);
191
+ let idx = options.findIndex((a) => a.id === id);
220
192
  if (idx !== -1) options.splice(idx, 1);
221
193
  return options;
222
194
  });
@@ -227,14 +199,9 @@ const stateReducer = (initialState) => {
227
199
  }
228
200
  };
229
201
  };
230
- const listboxActionsContext = null;
231
- setContext("ListboxActionsContext", listboxActionsContext);
232
- const listboxDataContext = null;
233
- setContext("ListboxDataContext", listboxDataContext);
234
202
  let {
235
203
  ref = $bindable(),
236
- as,
237
- value: controlledValue,
204
+ value: controlledValue = $bindable(),
238
205
  defaultValue,
239
206
  form,
240
207
  name,
@@ -244,16 +211,20 @@ let {
244
211
  disabled: ownDisabled = false,
245
212
  horizontal = false,
246
213
  multiple = false,
214
+ closeOnSelect,
247
215
  __demoMode = false,
248
216
  ...theirProps
249
217
  } = $props();
250
218
  const providedDisabled = useDisabled();
251
- const disabled = $derived(providedDisabled.value || ownDisabled);
219
+ const disabled = $derived(providedDisabled.current || ownDisabled);
252
220
  const orientation = horizontal ? "horizontal" : "vertical";
253
221
  const controllable = useControllable(
254
222
  {
255
223
  get controlledValue() {
256
224
  return controlledValue;
225
+ },
226
+ set controlledValue(value2) {
227
+ controlledValue = value2;
257
228
  }
258
229
  },
259
230
  controlledOnChange,
@@ -269,10 +240,10 @@ const _state = stateReducer({
269
240
  optionsVisible: false,
270
241
  __demoMode
271
242
  });
272
- const optionsPropsRef = useRef({ static: false, hold: false });
273
- const buttonRef = useRef(null);
274
- const optionsRef = useRef(null);
275
- const listRef = useRef(/* @__PURE__ */ new Map());
243
+ const optionsProps = $state({ static: false, hold: false });
244
+ let buttonElement = $state(null);
245
+ let optionsElement = $state(null);
246
+ const listElements = new SvelteMap();
276
247
  const compare = useByComparator(by);
277
248
  const isSelected = (compareValue) => match(data.mode, {
278
249
  [ValueMode.Multi]: () => {
@@ -316,36 +287,44 @@ const data = {
316
287
  get orientation() {
317
288
  return orientation;
318
289
  },
290
+ get closeOnSelect() {
291
+ return closeOnSelect;
292
+ },
319
293
  compare,
320
294
  isSelected,
321
- get optionsPropsRef() {
322
- return optionsPropsRef;
295
+ get optionsProps() {
296
+ return optionsProps;
297
+ },
298
+ get buttonElement() {
299
+ return buttonElement;
300
+ },
301
+ set buttonElement(value2) {
302
+ buttonElement = value2;
323
303
  },
324
- get buttonRef() {
325
- return buttonRef;
304
+ get optionsElement() {
305
+ return optionsElement;
326
306
  },
327
- get optionsRef() {
328
- return optionsRef;
307
+ set optionsElement(value2) {
308
+ optionsElement = value2;
329
309
  },
330
- get listRef() {
331
- return listRef;
310
+ get listElements() {
311
+ return listElements;
332
312
  }
333
313
  };
334
314
  setContext("ListboxDataContext", data);
335
- setContext("ListboxData", data);
336
315
  const outsideClickEnabled = $derived(data.listboxState === ListboxStates.Open);
337
316
  useOutsideClick({
338
317
  get enabled() {
339
318
  return outsideClickEnabled;
340
319
  },
341
320
  get containers() {
342
- return [data.buttonRef, data.optionsRef];
321
+ return [data.buttonElement, data.optionsElement];
343
322
  },
344
323
  cb: (event, target) => {
345
324
  _state.closeListbox();
346
325
  if (!isFocusableElement(target, FocusableMode.Loose)) {
347
326
  event.preventDefault();
348
- data.buttonRef.current?.focus();
327
+ data.buttonElement?.focus();
349
328
  }
350
329
  }
351
330
  });
@@ -377,8 +356,8 @@ const goToOption = (focus, id, trigger) => {
377
356
  });
378
357
  };
379
358
  const registerOption = (id, dataRef) => {
380
- _state.registerOption({ id, dataRef });
381
- return () => _state.unregisterOption({ id });
359
+ _state.registerOption(id, dataRef);
360
+ return () => _state.unregisterOption(id);
382
361
  };
383
362
  const onChange = (value2) => {
384
363
  return match(data.mode, {
@@ -408,7 +387,7 @@ setContext("ListboxActionsContext", {
408
387
  search: _state.search,
409
388
  clearSearch: _state.clearSearch
410
389
  });
411
- createFloatingContext();
390
+ useFloatingProvider();
412
391
  const openClosed = $derived(
413
392
  match(data.listboxState, {
414
393
  [ListboxStates.Open]: State.Open,
@@ -424,7 +403,7 @@ useLabels({
424
403
  inherit: true,
425
404
  props: {
426
405
  get htmlFor() {
427
- return data.buttonRef.current?.id;
406
+ return data.buttonElement?.id;
428
407
  }
429
408
  },
430
409
  slot: {
@@ -1,6 +1,4 @@
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
2
  import type { ElementType, Props } from "../utils/types.js";
5
3
  import { type Snippet } from "svelte";
6
4
  declare let DEFAULT_LISTBOX_TAG: string;
@@ -21,78 +19,21 @@ export type ListboxProps<TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG,
21
19
  form?: string;
22
20
  name?: string;
23
21
  multiple?: boolean;
22
+ closeOnSelect?: boolean;
24
23
  __demoMode?: boolean;
25
24
  }>;
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
- };
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> {
25
+ export * from "./context.svelte.js";
26
+ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG, TType = string, TActualType = TType extends (infer U)[] ? U : TType> {
88
27
  props(): {
89
28
  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;
29
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, "form" | ("slot" | "as" | "children" | "class" | "ref") | "invalid" | "disabled" | "value" | "name" | "onchange" | "multiple" | "__demoMode" | "horizontal" | "defaultValue" | "by" | "closeOnSelect"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
30
+ children?: Snippet<[{
31
+ slot: ListboxRenderPropArg<TType>;
32
+ props: Record<string, any>;
33
+ }]> | undefined;
34
+ class?: string | ((bag: ListboxRenderPropArg<TType>) => string) | null | undefined;
92
35
  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
- } : {}) & {
36
+ } & {
96
37
  value?: TType | undefined;
97
38
  defaultValue?: TType | undefined;
98
39
  onchange?: ((value: TType) => void) | undefined;
@@ -103,24 +44,21 @@ declare class __sveltets_Render<TType, TActualType, TTag extends ElementType = t
103
44
  form?: string;
104
45
  name?: string;
105
46
  multiple?: boolean;
47
+ closeOnSelect?: boolean;
106
48
  __demoMode?: boolean;
107
49
  };
108
- events(): {} & {
109
- [evt: string]: CustomEvent<any>;
110
- };
50
+ events(): {};
111
51
  slots(): {};
112
- bindings(): "ref";
52
+ bindings(): "ref" | "value";
113
53
  exports(): {};
114
54
  }
115
55
  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']>;
56
+ new <TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG, TType = string, TActualType = TType extends (infer U)[] ? U : TType>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag, TType, TActualType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag, TType, TActualType>['props']>, ReturnType<__sveltets_Render<TTag, TType, TActualType>['events']>, ReturnType<__sveltets_Render<TTag, TType, TActualType>['slots']>> & {
57
+ $$bindings?: ReturnType<__sveltets_Render<TTag, TType, TActualType>['bindings']>;
58
+ } & ReturnType<__sveltets_Render<TTag, TType, TActualType>['exports']>;
59
+ <TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG, TType = string, TActualType = TType extends (infer U)[] ? U : TType>(internal: unknown, props: ReturnType<__sveltets_Render<TTag, TType, TActualType>['props']> & {}): ReturnType<__sveltets_Render<TTag, TType, TActualType>['exports']>;
122
60
  z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
123
61
  }
124
62
  declare const Listbox: $$IsomorphicComponent;
125
- type Listbox<TType, TActualType, TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG> = InstanceType<typeof Listbox<TType, TActualType, TTag>>;
63
+ type Listbox<TTag extends ElementType = typeof DEFAULT_LISTBOX_TAG, TType = string, TActualType = TType extends (infer U)[] ? U : TType> = InstanceType<typeof Listbox<TTag, TType, TActualType>>;
126
64
  export default Listbox;
@@ -1,12 +1,12 @@
1
1
  <script lang="ts" module>import { useId } from "../hooks/use-id.js";
2
- import { getIdContext } from "../utils/id.js";
2
+ import { useProvidedId } from "../utils/id.js";
3
3
  import { ListboxStates, useActions, useData } from "./Listbox.svelte";
4
4
  import { attemptSubmit } from "../utils/form.js";
5
5
  import { Focus } from "../utils/calculate-active-index.js";
6
6
  import { useFocusRing } from "../hooks/use-focus-ring.svelte.js";
7
7
  import { useActivePress } from "../hooks/use-active-press.svelte.js";
8
8
  import { useResolveButtonType } from "../hooks/use-resolve-button-type.svelte.js";
9
- import { useFloating } from "../internal/floating.svelte.js";
9
+ import { useFloatingReference, useFloatingReferenceProps } from "../internal/floating.svelte.js";
10
10
  import { stateFromSlot } from "../utils/state.js";
11
11
  import { useLabelledBy } from "../label/context.svelte.js";
12
12
  import { useDescribedBy } from "../description/context.svelte.js";
@@ -19,18 +19,18 @@ const DEFAULT_BUTTON_TAG = "button";
19
19
  <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_BUTTON_TAG">const data = useData("ListboxButton");
20
20
  const actions = useActions("ListboxButton");
21
21
  const internalId = useId();
22
- const providedId = getIdContext();
22
+ const providedId = useProvidedId();
23
23
  let {
24
- as = DEFAULT_BUTTON_TAG,
25
24
  ref = $bindable(),
26
25
  id = providedId || `headlessui-listbox-button-${internalId}`,
27
26
  disabled: ownDisabled = false,
28
27
  autofocus = false,
29
28
  ...theirProps
30
29
  } = $props();
31
- const { setReference, getReferenceProps: getFloatingReferenceProps } = useFloating();
30
+ const { setReference } = useFloatingReference();
31
+ const { getReferenceProps: getFloatingReferenceProps } = useFloatingReferenceProps();
32
32
  $effect(() => {
33
- data.buttonRef.current = ref || null;
33
+ data.buttonElement = ref || null;
34
34
  setReference(ref);
35
35
  });
36
36
  const disabled = $derived(data.disabled || ownDisabled);
@@ -62,7 +62,7 @@ const handleKeyUp = (event) => {
62
62
  const handleClick = (event) => {
63
63
  if (data.listboxState === ListboxStates.Open) {
64
64
  actions.closeListbox();
65
- data.buttonRef.current?.focus({ preventScroll: true });
65
+ data.buttonElement?.focus({ preventScroll: true });
66
66
  } else {
67
67
  event.preventDefault();
68
68
  actions.openListbox();
@@ -104,10 +104,10 @@ const slot = $derived({
104
104
  });
105
105
  const buttonType = useResolveButtonType({
106
106
  get props() {
107
- return { type: theirProps.type, as };
107
+ return { type: theirProps.type, as: theirProps.as };
108
108
  },
109
109
  get ref() {
110
- return data.buttonRef;
110
+ return { current: data.buttonElement };
111
111
  }
112
112
  });
113
113
  const ourProps = $derived(
@@ -117,7 +117,7 @@ const ourProps = $derived(
117
117
  id,
118
118
  type: buttonType.type,
119
119
  "aria-haspopup": "listbox",
120
- "aria-controls": data.optionsRef.current?.id,
120
+ "aria-controls": data.optionsElement?.id,
121
121
  "aria-expanded": data.listboxState === ListboxStates.Open,
122
122
  "aria-labelledby": labelledBy.value,
123
123
  "aria-describedby": describedBy.value,
@@ -1,4 +1,4 @@
1
- import type { ElementType, Props } from "../utils/types.js";
1
+ import type { ElementType, Props, PropsOf } from "../utils/types.js";
2
2
  import type { Snippet } from "svelte";
3
3
  declare const DEFAULT_BUTTON_TAG: "button";
4
4
  type ButtonRenderPropArg = {
@@ -13,27 +13,24 @@ type ButtonRenderPropArg = {
13
13
  };
14
14
  type ButtonPropsWeControl = "aria-controls" | "aria-expanded" | "aria-haspopup" | "aria-labelledby" | "disabled";
15
15
  export type ListboxButtonProps<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = Props<TTag, ButtonRenderPropArg, ButtonPropsWeControl, {
16
- id?: string;
17
16
  autofocus?: boolean;
18
17
  disabled?: boolean;
19
18
  }>;
20
- export type ListboxButtonChildren = Snippet<[ButtonRenderPropArg]>;
21
19
  declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> {
22
20
  props(): {
23
21
  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;
22
+ } & (Exclude<keyof PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "autofocus" | ButtonPropsWeControl> extends infer T extends keyof PropsOf<TTag> ? { [P in T]: PropsOf<TTag>[P]; } : never) & {
23
+ children?: Snippet<[{
24
+ slot: ButtonRenderPropArg;
25
+ props: Record<string, any>;
26
+ }]> | undefined;
27
+ class?: string | ((bag: ButtonRenderPropArg) => string) | null | undefined;
26
28
  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;
29
+ } & {
31
30
  autofocus?: boolean;
32
31
  disabled?: boolean;
33
32
  };
34
- events(): {} & {
35
- [evt: string]: CustomEvent<any>;
36
- };
33
+ events(): {};
37
34
  slots(): {};
38
35
  bindings(): "ref";
39
36
  exports(): {};
@@ -42,9 +39,7 @@ interface $$IsomorphicComponent {
42
39
  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
40
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
44
41
  } & 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']>;
42
+ <TTag extends ElementType = typeof DEFAULT_BUTTON_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
48
43
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
49
44
  }
50
45
  declare const ListboxButton: $$IsomorphicComponent;
@@ -18,7 +18,6 @@ import { stateFromSlot } from "../utils/state.js";
18
18
  import ElementOrComponent from "../utils/ElementOrComponent.svelte";
19
19
  const internalId = useId();
20
20
  let {
21
- as = DEFAULT_OPTION_TAG,
22
21
  ref = $bindable(),
23
22
  id = `headlessui-listbox-option-${internalId}`,
24
23
  disabled = false,
@@ -28,7 +27,8 @@ let {
28
27
  const usedInSelectedOption = getContext("SelectedOptionContext") === true;
29
28
  const data = useData("ListboxOption");
30
29
  const actions = useActions("ListboxOption");
31
- const active = $derived(data.activeOptionIndex !== null ? data.options[data.activeOptionIndex].id === id : false);
30
+ const { activeOptionIndex, options } = $derived(data);
31
+ const active = $derived(activeOptionIndex !== null ? options[activeOptionIndex].id === id : false);
32
32
  const selected = $derived(data.isSelected(value));
33
33
  const getTextValue = useTextValue({
34
34
  get element() {
@@ -44,11 +44,15 @@ const bag = $derived({
44
44
  }
45
45
  });
46
46
  $effect(() => {
47
+ if (usedInSelectedOption) return;
47
48
  if (!ref) {
48
- data.listRef.current.delete(id);
49
+ data.listElements.delete(id);
49
50
  } else {
50
- data.listRef.current.set(id, ref);
51
+ data.listElements.set(id, ref);
51
52
  }
53
+ return () => {
54
+ if (ref) data.listElements.delete(id);
55
+ };
52
56
  });
53
57
  $effect(() => {
54
58
  if (data.__demoMode) return;
@@ -71,9 +75,9 @@ onMount(() => {
71
75
  const handleClick = (event) => {
72
76
  if (disabled) return event.preventDefault();
73
77
  actions.onChange(value);
74
- if (data.mode === ValueMode.Single) {
78
+ if (data.closeOnSelect === true || data.closeOnSelect === void 0 && data.mode === ValueMode.Single) {
75
79
  actions.closeListbox();
76
- data.buttonRef.current?.focus({ preventScroll: true });
80
+ data.buttonElement?.focus({ preventScroll: true });
77
81
  }
78
82
  };
79
83
  const handleFocus = () => {
@@ -14,24 +14,23 @@ export type ListboxOptionProps<TTag extends ElementType = typeof DEFAULT_OPTION_
14
14
  disabled?: boolean;
15
15
  value: TType;
16
16
  }>;
17
- export type ListboxOptionChildren = Snippet<[OptionRenderPropArg]>;
18
17
  import { type Snippet } from "svelte";
19
18
  declare class __sveltets_Render<TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG> {
20
19
  props(): {
21
20
  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;
21
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "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) & {
22
+ children?: Snippet<[{
23
+ slot: OptionRenderPropArg;
24
+ props: Record<string, any>;
25
+ }]> | undefined;
26
+ class?: string | ((bag: OptionRenderPropArg) => string) | null | undefined;
24
27
  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
+ } & {
28
29
  id?: string;
29
30
  disabled?: boolean;
30
31
  value: TType;
31
32
  };
32
- events(): {} & {
33
- [evt: string]: CustomEvent<any>;
34
- };
33
+ events(): {};
35
34
  slots(): {};
36
35
  bindings(): "ref";
37
36
  exports(): {};
@@ -40,9 +39,7 @@ interface $$IsomorphicComponent {
40
39
  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
40
  $$bindings?: ReturnType<__sveltets_Render<TType, TTag>['bindings']>;
42
41
  } & 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']>;
42
+ <TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TType, TTag>['props']> & {}): ReturnType<__sveltets_Render<TType, TTag>['exports']>;
46
43
  z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
47
44
  }
48
45
  declare const ListboxOption: $$IsomorphicComponent;