@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
@@ -24,24 +24,25 @@ import { Focus } from "../utils/calculate-active-index.js";
24
24
  import { focusFrom, Focus as FocusManagementFocus } from "../utils/focus-management.js";
25
25
  import { useElementSize } from "../hooks/use-element-size.svelte.js";
26
26
  import { setContext } from "svelte";
27
- import Hidden from "../internal/Hidden.svelte";
28
27
  import Portal from "../portal/Portal.svelte";
29
- import { stateFromSlot } from "../utils/state.js";
30
28
  import ElementOrComponent from "../utils/ElementOrComponent.svelte";
31
29
  const internalId = useId();
32
30
  let {
33
- as = DEFAULT_OPTIONS_TAG,
34
31
  ref = $bindable(),
35
32
  id = `headlessui-listbox-options-${internalId}`,
36
33
  anchor: rawAnchor,
37
34
  portal = false,
38
35
  modal = true,
39
36
  transition = false,
40
- static: isStatic = false,
41
- unmount = true,
42
37
  ...theirProps
43
38
  } = $props();
44
- const anchor = $derived(useResolvedAnchor(rawAnchor));
39
+ const resolvedAnchor = useResolvedAnchor({
40
+ get anchor() {
41
+ return rawAnchor;
42
+ }
43
+ });
44
+ const { anchor } = $derived(resolvedAnchor);
45
+ let localOptionsElement = $state();
45
46
  $effect(() => {
46
47
  if (anchor) {
47
48
  portal = true;
@@ -49,7 +50,7 @@ $effect(() => {
49
50
  });
50
51
  const data = useData("ListboxOptions");
51
52
  const actions = useActions("ListboxOptions");
52
- const ownerDocument = $derived(getOwnerDocument(data.optionsRef.current));
53
+ const ownerDocument = $derived(getOwnerDocument(data.optionsElement));
53
54
  const usesOpenClosedState = useOpenClosed();
54
55
  const show = $derived(
55
56
  usesOpenClosedState !== null ? (usesOpenClosedState.value & State.Open) === State.Open : data.listboxState === ListboxStates.Open
@@ -59,7 +60,7 @@ const _transition = useTransition({
59
60
  return transition;
60
61
  },
61
62
  get element() {
62
- return ref;
63
+ return localOptionsElement;
63
64
  },
64
65
  get show() {
65
66
  return show;
@@ -71,7 +72,7 @@ useOnDisappear({
71
72
  return visible;
72
73
  },
73
74
  get ref() {
74
- return data.buttonRef.current;
75
+ return data.buttonElement;
75
76
  },
76
77
  get ondisappear() {
77
78
  return actions.closeListbox;
@@ -93,7 +94,7 @@ useInertOthers({
93
94
  },
94
95
  elements: {
95
96
  get allowed() {
96
- return [data.buttonRef.current, data.optionsRef.current];
97
+ return [data.buttonElement, data.optionsElement];
97
98
  }
98
99
  }
99
100
  });
@@ -103,7 +104,7 @@ const didButtonMove = useDidElementMove({
103
104
  return didElementMoveEnabled;
104
105
  },
105
106
  get element() {
106
- return data.buttonRef.current;
107
+ return data.buttonElement;
107
108
  }
108
109
  });
109
110
  const panelEnabled = $derived(didButtonMove.value ? false : visible);
@@ -116,18 +117,18 @@ const frozenValue = useFrozenData({
116
117
  return data.value;
117
118
  }
118
119
  });
119
- const isSelected = (compareValue) => data.compare(frozenValue, compareValue);
120
- const selectedOptionIndex = () => {
120
+ const isSelected = (compareValue) => data.compare(frozenValue.data, compareValue);
121
+ const selectedOptionIndex = $derived.by(() => {
121
122
  if (anchor == null) return null;
122
123
  if (!anchor?.to?.includes("selection")) return null;
123
124
  let idx = data.options.findIndex((option) => isSelected(option.dataRef.current.value));
124
125
  if (idx === -1) idx = 0;
125
126
  return idx;
126
- };
127
+ });
127
128
  const anchorOptions = $derived.by(() => {
128
129
  if (anchor == null) return void 0;
129
130
  if (selectedOptionIndex === null) return { ...anchor, inner: void 0 };
130
- let elements = Array.from(data.listRef.current.values());
131
+ let elements = Array.from(data.listElements.values());
131
132
  return {
132
133
  ...anchor,
133
134
  inner: {
@@ -141,20 +142,20 @@ const floatingPanel = useFloatingPanel({
141
142
  return anchorOptions ?? null;
142
143
  }
143
144
  });
144
- const { setFloating, style } = $derived(floatingPanel);
145
+ const { setFloating, styles } = $derived(floatingPanel);
145
146
  const getFloatingPanelProps = useFloatingPanelProps();
146
147
  $effect(() => {
147
- data.optionsRef.current = ref || null;
148
- if (anchor) setFloating(ref);
148
+ localOptionsElement = ref;
149
+ data.optionsElement = ref ?? null;
150
+ if (anchor) setFloating(ref ?? null);
149
151
  });
150
152
  const searchDisposables = useDisposables();
151
- const { listboxState, optionsRef } = $derived(data);
153
+ const { listboxState, optionsElement } = $derived(data);
152
154
  $effect(() => {
153
- let container = optionsRef.current;
154
- if (!container) return;
155
+ if (!optionsElement) return;
155
156
  if (listboxState !== ListboxStates.Open) return;
156
- if (container === getOwnerDocument(container)?.activeElement) return;
157
- container?.focus({ preventScroll: true });
157
+ if (optionsElement === getOwnerDocument(optionsElement)?.activeElement) return;
158
+ optionsElement?.focus({ preventScroll: true });
158
159
  });
159
160
  const handleKeyDown = (event) => {
160
161
  searchDisposables.dispose();
@@ -174,7 +175,7 @@ const handleKeyDown = (event) => {
174
175
  }
175
176
  if (data.mode === ValueMode.Single) {
176
177
  actions.closeListbox();
177
- data.buttonRef.current?.focus({ preventScroll: true });
178
+ data.buttonElement?.focus({ preventScroll: true });
178
179
  }
179
180
  break;
180
181
  case match(data.orientation, { vertical: "ArrowDown", horizontal: "ArrowRight" }):
@@ -199,13 +200,13 @@ const handleKeyDown = (event) => {
199
200
  event.preventDefault();
200
201
  event.stopPropagation();
201
202
  actions.closeListbox();
202
- data.buttonRef.current?.focus({ preventScroll: true });
203
+ data.buttonElement?.focus({ preventScroll: true });
203
204
  return;
204
205
  case "Tab":
205
206
  event.preventDefault();
206
207
  event.stopPropagation();
207
208
  actions.closeListbox();
208
- focusFrom(data.buttonRef.current, event.shiftKey ? FocusManagementFocus.Previous : FocusManagementFocus.Next);
209
+ focusFrom(data.buttonElement, event.shiftKey ? FocusManagementFocus.Previous : FocusManagementFocus.Next);
209
210
  break;
210
211
  default:
211
212
  if (event.key.length === 1) {
@@ -215,55 +216,108 @@ const handleKeyDown = (event) => {
215
216
  break;
216
217
  }
217
218
  };
218
- const labelledby = $derived(data.buttonRef.current?.id);
219
+ const labelledby = $derived(data.buttonElement?.id);
219
220
  const slot = $derived({
220
221
  open: data.listboxState === ListboxStates.Open
221
222
  });
222
223
  const buttonSize = useElementSize({
223
224
  get element() {
224
- return data.buttonRef.current;
225
+ return data.buttonElement;
225
226
  },
226
227
  unit: true
227
228
  });
228
- const ourProps = $derived(
229
- mergeProps(anchor ? getFloatingPanelProps() : {}, {
229
+ $effect(() => {
230
+ transitionData;
231
+ });
232
+ const ourProps = $derived({
233
+ ...mergeProps(anchor ? getFloatingPanelProps() : {}, {
230
234
  id,
231
235
  "aria-activedescendant": data.activeOptionIndex === null ? void 0 : data.options[data.activeOptionIndex]?.id,
232
236
  "aria-multiselectable": data.mode === ValueMode.Multi ? true : void 0,
233
237
  "aria-labelledby": labelledby,
234
238
  "aria-orientation": data.orientation,
235
- onkeydown: handleKeyDown,
236
239
  role: "listbox",
237
240
  // When the `Listbox` is closed, it should not be focusable. This allows us
238
241
  // to skip focusing the `ListboxOptions` when pressing the tab key on an
239
242
  // open `Listbox`, and go to the next focusable element.
240
- tabIndex: data.listboxState === ListboxStates.Open ? 0 : void 0,
241
- style: [theirProps.style, style, `--button-width: ${buttonSize.width}`].filter(Boolean).join("; "),
242
- ...transitionDataAttributes(transitionData),
243
- ...stateFromSlot(slot)
244
- })
245
- );
246
- const derivedData = {
243
+ tabindex: data.listboxState === ListboxStates.Open ? 0 : void 0,
244
+ style: [theirProps.style, styles, `--button-width: ${buttonSize.width}`].filter(Boolean).join("; ")
245
+ }),
246
+ ...transitionDataAttributes(transitionData)
247
+ });
248
+ const derivedData = $derived({
247
249
  ...data,
248
250
  get isSelected() {
249
251
  return data.mode === ValueMode.Multi ? data.isSelected : isSelected;
250
252
  }
251
- };
252
- setContext("ListboxDataContext", derivedData);
253
+ });
254
+ setContext("ListboxDataContext", {
255
+ get value() {
256
+ return data.value;
257
+ },
258
+ get disabled() {
259
+ return data.disabled;
260
+ },
261
+ get invalid() {
262
+ return data.invalid;
263
+ },
264
+ get mode() {
265
+ return data.mode;
266
+ },
267
+ get orientation() {
268
+ return data.orientation;
269
+ },
270
+ get activeOptionIndex() {
271
+ return data.activeOptionIndex;
272
+ },
273
+ get closeOnSelect() {
274
+ return data.closeOnSelect;
275
+ },
276
+ get compare() {
277
+ return data.compare;
278
+ },
279
+ get isSelected() {
280
+ return data.mode === ValueMode.Multi ? data.isSelected : isSelected;
281
+ },
282
+ get optionsProps() {
283
+ return data.optionsProps;
284
+ },
285
+ get listElements() {
286
+ return data.listElements;
287
+ },
288
+ get buttonElement() {
289
+ return data.buttonElement;
290
+ },
291
+ get optionsElement() {
292
+ return data.optionsElement;
293
+ },
294
+ get listboxState() {
295
+ return data.listboxState;
296
+ },
297
+ get options() {
298
+ return data.options;
299
+ },
300
+ get searchQuery() {
301
+ return data.searchQuery;
302
+ },
303
+ get activationTrigger() {
304
+ return data.activationTrigger;
305
+ },
306
+ get __demoMode() {
307
+ return data.__demoMode;
308
+ }
309
+ });
253
310
  </script>
254
311
 
255
- <Portal enabled={portal ? isStatic || visible : false}>
256
- {#if !panelEnabled && unmount && !isStatic}
257
- <Hidden as="span" bind:ref aria-hidden="true" {...ourProps} />
258
- {:else}
259
- <ElementOrComponent
260
- {ourProps}
261
- {theirProps}
262
- slots={slot}
263
- defaultTag={DEFAULT_OPTIONS_TAG}
264
- features={OptionsRenderFeatures}
265
- name="MenuItems"
266
- bind:ref
267
- />
268
- {/if}
312
+ <Portal enabled={portal ? theirProps.static || visible : false}>
313
+ <ElementOrComponent
314
+ {ourProps}
315
+ {theirProps}
316
+ slots={slot}
317
+ defaultTag={DEFAULT_OPTIONS_TAG}
318
+ features={OptionsRenderFeatures}
319
+ visible={panelEnabled}
320
+ name="ListboxOptions"
321
+ bind:ref
322
+ />
269
323
  </Portal>
@@ -14,17 +14,18 @@ export type ListboxOptionsProps<TTag extends ElementType = typeof DEFAULT_OPTION
14
14
  modal?: boolean;
15
15
  transition?: boolean;
16
16
  } & PropsForFeatures<typeof OptionsRenderFeatures>>;
17
- export type ListboxOptionsChildren = Snippet<[OptionsRenderPropArg]>;
18
17
  import { type Snippet } from "svelte";
19
18
  declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG> {
20
19
  props(): {
21
20
  as?: TTag | undefined;
22
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "anchor" | "unmount" | "static" | "id" | "transition" | OptionsPropsWeControl | "portal" | "modal"> 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<OptionsRenderPropArg> | undefined;
21
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "anchor" | "unmount" | "static" | "id" | "transition" | OptionsPropsWeControl | "portal" | "modal"> 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: OptionsRenderPropArg;
24
+ props: Record<string, any>;
25
+ }]> | undefined;
26
+ class?: string | ((bag: OptionsRenderPropArg) => 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: OptionsRenderPropArg) => string) | undefined;
27
- } : {}) & {
28
+ } & {
28
29
  id?: string;
29
30
  anchor?: AnchorPropsWithSelection;
30
31
  portal?: boolean;
@@ -34,9 +35,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_OPTION
34
35
  static?: boolean | undefined;
35
36
  unmount?: boolean | undefined;
36
37
  };
37
- events(): {} & {
38
- [evt: string]: CustomEvent<any>;
39
- };
38
+ events(): {};
40
39
  slots(): {};
41
40
  bindings(): "ref";
42
41
  exports(): {};
@@ -45,9 +44,7 @@ interface $$IsomorphicComponent {
45
44
  new <TTag extends ElementType = typeof DEFAULT_OPTIONS_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']>> & {
46
45
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
47
46
  } & ReturnType<__sveltets_Render<TTag>['exports']>;
48
- <TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
49
- $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
50
- }): ReturnType<__sveltets_Render<TTag>['exports']>;
47
+ <TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
51
48
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
52
49
  }
53
50
  declare const ListboxOptions: $$IsomorphicComponent;
@@ -19,11 +19,9 @@ setContext("SelectedOptionContext", true);
19
19
 
20
20
  {#snippet children()}
21
21
  {#if placeholder && shouldShowPlaceholder}
22
- {@const Component = placeholder}
23
- <Component />
22
+ {@render placeholder()}
24
23
  {:else}
25
- {@const Component = options}
26
- <Component />
24
+ {@render options()}
27
25
  {/if}
28
26
  {/snippet}
29
27
 
@@ -1,27 +1,27 @@
1
1
  import type { ElementType, Props } from "../utils/types.js";
2
- import type { Component } from "svelte";
2
+ import type { Snippet } from "svelte";
3
3
  declare const DEFAULT_SELECTED_OPTION_TAG = "svelte:fragment";
4
4
  type SelectedOptionRenderPropArg = {};
5
5
  type SelectedOptionPropsWeControl = never;
6
6
  export type ListboxSelectedOptionProps<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> = Props<TTag, SelectedOptionRenderPropArg, SelectedOptionPropsWeControl, {
7
- options: Component<any, any>;
8
- placeholder?: Component<any, any>;
7
+ options: Snippet;
8
+ placeholder?: Snippet;
9
9
  }>;
10
10
  declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> {
11
11
  props(): {
12
12
  as?: TTag | undefined;
13
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "placeholder" | "options"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
14
- children?: import("../utils/types.js").Children<SelectedOptionRenderPropArg> | undefined;
13
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "placeholder" | "options"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
14
+ children?: Snippet<[{
15
+ slot: SelectedOptionRenderPropArg;
16
+ props: Record<string, any>;
17
+ }]> | undefined;
18
+ class?: string | ((bag: SelectedOptionRenderPropArg) => string) | null | undefined;
15
19
  ref?: HTMLElement;
16
- } & (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) ? {
17
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: SelectedOptionRenderPropArg) => string) | undefined;
18
- } : {}) & {
19
- options: Component<any, any>;
20
- placeholder?: Component<any, any>;
21
- };
22
- events(): {} & {
23
- [evt: string]: CustomEvent<any>;
20
+ } & {
21
+ options: Snippet;
22
+ placeholder?: Snippet;
24
23
  };
24
+ events(): {};
25
25
  slots(): {};
26
26
  bindings(): "ref";
27
27
  exports(): {};
@@ -30,9 +30,7 @@ interface $$IsomorphicComponent {
30
30
  new <TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_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']>> & {
31
31
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
32
32
  } & ReturnType<__sveltets_Render<TTag>['exports']>;
33
- <TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
34
- $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
35
- }): ReturnType<__sveltets_Render<TTag>['exports']>;
33
+ <TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
36
34
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
37
35
  }
38
36
  declare const ListboxSelectedOption: $$IsomorphicComponent;
@@ -0,0 +1,76 @@
1
+ import type { Focus } from "../utils/calculate-active-index.js";
2
+ import type { MutableRefObject } from "../utils/ref.svelte.js";
3
+ import type { SvelteMap } from "svelte/reactivity";
4
+ export declare enum ListboxStates {
5
+ Open = 0,
6
+ Closed = 1
7
+ }
8
+ export declare enum ValueMode {
9
+ Single = 0,
10
+ Multi = 1
11
+ }
12
+ export declare enum ActivationTrigger {
13
+ Pointer = 0,
14
+ Other = 1
15
+ }
16
+ export type ListboxOptionDataRef<T> = MutableRefObject<{
17
+ textValue?: string;
18
+ disabled: boolean;
19
+ value: T;
20
+ domRef: MutableRefObject<HTMLElement | null>;
21
+ }>;
22
+ export interface StateDefinition<T> {
23
+ listboxState: ListboxStates;
24
+ options: {
25
+ id: string;
26
+ dataRef: ListboxOptionDataRef<T>;
27
+ }[];
28
+ searchQuery: string;
29
+ activeOptionIndex: number | null;
30
+ activationTrigger: ActivationTrigger;
31
+ __demoMode: boolean;
32
+ }
33
+ export interface StateActions<T> {
34
+ openListbox(): void;
35
+ closeListbox(): void;
36
+ registerOption(id: string, dataRef: ListboxOptionDataRef<T>): void;
37
+ unregisterOption(id: string): void;
38
+ goToOption(action: {
39
+ focus: Focus.Specific;
40
+ id: string;
41
+ trigger?: ActivationTrigger;
42
+ } | {
43
+ focus: Exclude<Focus, Focus.Specific>;
44
+ trigger?: ActivationTrigger;
45
+ }): void;
46
+ search(query: string): void;
47
+ clearSearch(): void;
48
+ }
49
+ export type ListboxActionsContext<T = unknown> = {
50
+ registerOption(id: string, dataRef: ListboxOptionDataRef<T>): () => void;
51
+ goToOption(focus: Focus.Specific, id: string, trigger?: ActivationTrigger): void;
52
+ goToOption(focus: Focus, id?: string, trigger?: ActivationTrigger): void;
53
+ selectOption(id: string): void;
54
+ selectActiveOption(): void;
55
+ onChange(value: T): void;
56
+ } & Pick<StateActions<T>, "openListbox" | "closeListbox" | "search" | "clearSearch">;
57
+ export declare function useActions<T>(component: string): ListboxActionsContext<T>;
58
+ export type ListboxDataContext<T = unknown> = {
59
+ value: T;
60
+ disabled: boolean;
61
+ invalid: boolean;
62
+ mode: ValueMode;
63
+ orientation: "horizontal" | "vertical";
64
+ activeOptionIndex: number | null;
65
+ closeOnSelect?: boolean;
66
+ compare(a: T, z: T): boolean;
67
+ isSelected(value: T): boolean;
68
+ optionsProps: {
69
+ static: boolean;
70
+ hold: boolean;
71
+ };
72
+ listElements: SvelteMap<string, HTMLElement | null>;
73
+ buttonElement: HTMLElement | null;
74
+ optionsElement: HTMLElement | null;
75
+ } & StateDefinition<T>;
76
+ export declare function useData<T>(component: string): ListboxDataContext<T>;
@@ -0,0 +1,36 @@
1
+ import { getContext } from "svelte";
2
+ export var ListboxStates;
3
+ (function (ListboxStates) {
4
+ ListboxStates[ListboxStates["Open"] = 0] = "Open";
5
+ ListboxStates[ListboxStates["Closed"] = 1] = "Closed";
6
+ })(ListboxStates || (ListboxStates = {}));
7
+ export var ValueMode;
8
+ (function (ValueMode) {
9
+ ValueMode[ValueMode["Single"] = 0] = "Single";
10
+ ValueMode[ValueMode["Multi"] = 1] = "Multi";
11
+ })(ValueMode || (ValueMode = {}));
12
+ export var ActivationTrigger;
13
+ (function (ActivationTrigger) {
14
+ ActivationTrigger[ActivationTrigger["Pointer"] = 0] = "Pointer";
15
+ ActivationTrigger[ActivationTrigger["Other"] = 1] = "Other";
16
+ })(ActivationTrigger || (ActivationTrigger = {}));
17
+ export function useActions(component) {
18
+ const context = getContext("ListboxActionsContext");
19
+ if (!context) {
20
+ const err = new Error(`<${component} /> is missing a parent <Listbox /> component.`);
21
+ if (Error.captureStackTrace)
22
+ Error.captureStackTrace(err, useActions);
23
+ throw err;
24
+ }
25
+ return context;
26
+ }
27
+ export function useData(component) {
28
+ const context = getContext("ListboxDataContext");
29
+ if (!context) {
30
+ const err = new Error(`<${component} /> is missing a parent <Listbox /> component.`);
31
+ if (Error.captureStackTrace)
32
+ Error.captureStackTrace(err, useData);
33
+ throw err;
34
+ }
35
+ return context;
36
+ }
@@ -1,5 +1,5 @@
1
- export { default as Listbox, type ListboxProps, type ListboxChildren } from "./Listbox.svelte";
2
- export { default as ListboxButton, type ListboxButtonProps, type ListboxButtonChildren } from "./ListboxButton.svelte";
3
- export { default as ListboxOption, type ListboxOptionProps, type ListboxOptionChildren } from "./ListboxOption.svelte";
4
- export { default as ListboxOptions, type ListboxOptionsProps, type ListboxOptionsChildren, } from "./ListboxOptions.svelte";
1
+ export { default as Listbox, type ListboxProps } from "./Listbox.svelte";
2
+ export { default as ListboxButton, type ListboxButtonProps } from "./ListboxButton.svelte";
3
+ export { default as ListboxOption, type ListboxOptionProps } from "./ListboxOption.svelte";
4
+ export { default as ListboxOptions, type ListboxOptionsProps } from "./ListboxOptions.svelte";
5
5
  export { default as ListboxSelectedOption, type ListboxSelectedOptionProps } from "./ListboxSelectedOption.svelte";
@@ -1,5 +1,5 @@
1
1
  export { default as Listbox } from "./Listbox.svelte";
2
2
  export { default as ListboxButton } from "./ListboxButton.svelte";
3
3
  export { default as ListboxOption } from "./ListboxOption.svelte";
4
- export { default as ListboxOptions, } from "./ListboxOptions.svelte";
4
+ export { default as ListboxOptions } from "./ListboxOptions.svelte";
5
5
  export { default as ListboxSelectedOption } from "./ListboxSelectedOption.svelte";