@pzerelles/headlessui-svelte 2.1.1-next.1 → 2.1.2-next.11

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 (238) hide show
  1. package/dist/button/Button.svelte +6 -10
  2. package/dist/button/Button.svelte.d.ts +34 -26
  3. package/dist/checkbox/Checkbox.svelte +43 -25
  4. package/dist/checkbox/Checkbox.svelte.d.ts +42 -28
  5. package/dist/close-button/CloseButton.svelte +5 -4
  6. package/dist/close-button/CloseButton.svelte.d.ts +36 -13
  7. package/dist/combobox/Combobox.svelte +2 -2
  8. package/dist/combobox/Combobox.svelte.d.ts +9 -9
  9. package/dist/data-interactive/DataInteractive.svelte +41 -0
  10. package/dist/data-interactive/DataInteractive.svelte.d.ts +39 -0
  11. package/dist/data-interactive/index.d.ts +1 -0
  12. package/dist/data-interactive/index.js +1 -0
  13. package/dist/description/Description.svelte +10 -53
  14. package/dist/description/Description.svelte.d.ts +15 -32
  15. package/dist/description/context.svelte.d.ts +17 -0
  16. package/dist/description/context.svelte.js +51 -0
  17. package/dist/dialog/Dialog.svelte +51 -0
  18. package/dist/dialog/Dialog.svelte.d.ts +60 -0
  19. package/dist/dialog/DialogBackdrop.svelte +39 -0
  20. package/dist/dialog/DialogBackdrop.svelte.d.ts +38 -0
  21. package/dist/dialog/DialogPanel.svelte +46 -0
  22. package/dist/dialog/DialogPanel.svelte.d.ts +40 -0
  23. package/dist/dialog/DialogTitle.svelte +29 -0
  24. package/dist/dialog/DialogTitle.svelte.d.ts +34 -0
  25. package/dist/dialog/InternalDialog.svelte +233 -0
  26. package/dist/dialog/InternalDialog.svelte.d.ts +42 -0
  27. package/dist/dialog/context.svelte.d.ts +15 -0
  28. package/dist/dialog/context.svelte.js +16 -0
  29. package/dist/dialog/index.d.ts +4 -0
  30. package/dist/dialog/index.js +4 -0
  31. package/dist/field/Field.svelte +8 -11
  32. package/dist/field/Field.svelte.d.ts +21 -17
  33. package/dist/fieldset/Fieldset.svelte +11 -9
  34. package/dist/fieldset/Fieldset.svelte.d.ts +21 -17
  35. package/dist/focus-trap/FocusTrap.svelte +325 -0
  36. package/dist/focus-trap/FocusTrap.svelte.d.ts +46 -0
  37. package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
  38. package/dist/focus-trap/FocusTrapFeatures.js +15 -0
  39. package/dist/hooks/use-controllable.svelte.d.ts +1 -1
  40. package/dist/hooks/use-controllable.svelte.js +3 -3
  41. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  42. package/dist/hooks/use-escape.svelte.d.ts +5 -0
  43. package/dist/hooks/use-escape.svelte.js +26 -0
  44. package/dist/hooks/use-event-listener.svelte.d.ts +6 -0
  45. package/dist/hooks/use-event-listener.svelte.js +12 -0
  46. package/dist/hooks/use-inert-others.svelte.d.ts +2 -2
  47. package/dist/hooks/use-inert-others.svelte.js +3 -3
  48. package/dist/hooks/use-is-mounted.svelte.d.ts +3 -0
  49. package/dist/hooks/use-is-mounted.svelte.js +14 -0
  50. package/dist/hooks/use-is-touch-device.svelte.d.ts +3 -0
  51. package/dist/hooks/use-is-touch-device.svelte.js +20 -0
  52. package/dist/hooks/use-root-containers.svelte.d.ts +9 -0
  53. package/dist/hooks/use-root-containers.svelte.js +50 -0
  54. package/dist/hooks/use-tab-direction.svelte.d.ts +7 -0
  55. package/dist/hooks/use-tab-direction.svelte.js +25 -0
  56. package/dist/hooks/use-transition.svelte.js +14 -13
  57. package/dist/hooks/use-tree-walker.svelte.d.ts +8 -0
  58. package/dist/hooks/use-tree-walker.svelte.js +19 -0
  59. package/dist/hooks/use-watch.svelte.d.ts +4 -0
  60. package/dist/hooks/use-watch.svelte.js +16 -0
  61. package/dist/hooks/use-window-event.svelte.d.ts +6 -0
  62. package/dist/hooks/use-window-event.svelte.js +12 -0
  63. package/dist/index.d.ts +10 -0
  64. package/dist/index.js +10 -0
  65. package/dist/input/Input.svelte +59 -0
  66. package/dist/input/Input.svelte.d.ts +50 -0
  67. package/dist/input/index.d.ts +1 -0
  68. package/dist/input/index.js +1 -0
  69. package/dist/internal/FloatingProvider.svelte +12 -0
  70. package/dist/internal/FloatingProvider.svelte.d.ts +22 -0
  71. package/dist/internal/FocusSentinel.svelte.d.ts +4 -1
  72. package/dist/internal/ForcePortalRoot.svelte +6 -0
  73. package/dist/internal/ForcePortalRoot.svelte.d.ts +22 -0
  74. package/dist/internal/FormFields.svelte.d.ts +4 -1
  75. package/dist/internal/FormResolver.svelte.d.ts +4 -1
  76. package/dist/internal/Hidden.svelte +6 -14
  77. package/dist/internal/Hidden.svelte.d.ts +19 -15
  78. package/dist/internal/HiddenFeatures.d.ts +5 -0
  79. package/dist/internal/HiddenFeatures.js +9 -0
  80. package/dist/internal/HoistFormFields.svelte.d.ts +4 -1
  81. package/dist/internal/MainTreeProvider.svelte +45 -0
  82. package/dist/internal/MainTreeProvider.svelte.d.ts +31 -0
  83. package/dist/internal/Portal.svelte.d.ts +4 -1
  84. package/dist/internal/close-provider.d.ts +7 -0
  85. package/dist/internal/close-provider.js +7 -0
  86. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  87. package/dist/internal/floating-provider.svelte.js +206 -0
  88. package/dist/internal/floating.svelte.d.ts +50 -20
  89. package/dist/internal/floating.svelte.js +100 -271
  90. package/dist/internal/inner.svelte.d.ts +91 -0
  91. package/dist/internal/inner.svelte.js +202 -0
  92. package/dist/internal/open-closed.d.ts +1 -1
  93. package/dist/internal/open-closed.js +1 -1
  94. package/dist/label/Label.svelte +17 -65
  95. package/dist/label/Label.svelte.d.ts +19 -32
  96. package/dist/label/context.svelte.d.ts +17 -0
  97. package/dist/label/context.svelte.js +56 -0
  98. package/dist/legend/Legend.svelte +4 -3
  99. package/dist/legend/Legend.svelte.d.ts +33 -15
  100. package/dist/listbox/Listbox.svelte +40 -74
  101. package/dist/listbox/Listbox.svelte.d.ts +30 -72
  102. package/dist/listbox/ListboxButton.svelte +16 -18
  103. package/dist/listbox/ListboxButton.svelte.d.ts +16 -7
  104. package/dist/listbox/ListboxOption.svelte +10 -10
  105. package/dist/listbox/ListboxOption.svelte.d.ts +22 -11
  106. package/dist/listbox/ListboxOptions.svelte +62 -60
  107. package/dist/listbox/ListboxOptions.svelte.d.ts +23 -7
  108. package/dist/listbox/ListboxSelectedOption.svelte +15 -7
  109. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +24 -14
  110. package/dist/listbox/context.svelte.d.ts +75 -0
  111. package/dist/listbox/context.svelte.js +36 -0
  112. package/dist/menu/Menu.svelte +235 -0
  113. package/dist/menu/Menu.svelte.d.ts +42 -0
  114. package/dist/menu/MenuButton.svelte +129 -0
  115. package/dist/menu/MenuButton.svelte.d.ts +52 -0
  116. package/dist/menu/MenuHeading.svelte +19 -0
  117. package/dist/menu/MenuHeading.svelte.d.ts +39 -0
  118. package/dist/menu/MenuItem.svelte +114 -0
  119. package/dist/menu/MenuItem.svelte.d.ts +49 -0
  120. package/dist/menu/MenuItems.svelte +248 -0
  121. package/dist/menu/MenuItems.svelte.d.ts +55 -0
  122. package/dist/menu/MenuSection.svelte +14 -0
  123. package/dist/menu/MenuSection.svelte.d.ts +35 -0
  124. package/dist/menu/MenuSeparator.svelte +9 -0
  125. package/dist/menu/MenuSeparator.svelte.d.ts +35 -0
  126. package/dist/menu/context.svelte.d.ts +47 -0
  127. package/dist/menu/context.svelte.js +21 -0
  128. package/dist/menu/index.d.ts +7 -0
  129. package/dist/menu/index.js +7 -0
  130. package/dist/portal/InternalPortal.svelte +22 -33
  131. package/dist/portal/InternalPortal.svelte.d.ts +16 -7
  132. package/dist/portal/Portal.svelte +4 -8
  133. package/dist/portal/Portal.svelte.d.ts +6 -6
  134. package/dist/portal/PortalGroup.svelte +5 -6
  135. package/dist/portal/PortalGroup.svelte.d.ts +16 -7
  136. package/dist/switch/Switch.svelte +41 -37
  137. package/dist/switch/Switch.svelte.d.ts +24 -7
  138. package/dist/switch/SwitchGroup.svelte +7 -8
  139. package/dist/switch/SwitchGroup.svelte.d.ts +14 -7
  140. package/dist/tabs/Tab.svelte +9 -14
  141. package/dist/tabs/Tab.svelte.d.ts +18 -6
  142. package/dist/tabs/TabGroup.svelte +20 -23
  143. package/dist/tabs/TabGroup.svelte.d.ts +19 -6
  144. package/dist/tabs/TabList.svelte +5 -7
  145. package/dist/tabs/TabList.svelte.d.ts +13 -6
  146. package/dist/tabs/TabPanel.svelte +30 -32
  147. package/dist/tabs/TabPanel.svelte.d.ts +19 -6
  148. package/dist/tabs/TabPanels.svelte +5 -6
  149. package/dist/tabs/TabPanels.svelte.d.ts +13 -6
  150. package/dist/textarea/Textarea.svelte +67 -0
  151. package/dist/textarea/Textarea.svelte.d.ts +50 -0
  152. package/dist/textarea/index.d.ts +1 -0
  153. package/dist/textarea/index.js +1 -0
  154. package/dist/transition/InternalTransitionChild.svelte +178 -0
  155. package/dist/transition/InternalTransitionChild.svelte.d.ts +55 -0
  156. package/dist/transition/Transition.svelte +89 -0
  157. package/dist/transition/Transition.svelte.d.ts +42 -0
  158. package/dist/transition/TransitionChild.svelte +16 -0
  159. package/dist/transition/TransitionChild.svelte.d.ts +44 -0
  160. package/dist/transition/context.svelte.d.ts +64 -0
  161. package/dist/transition/context.svelte.js +120 -0
  162. package/dist/transition/index.d.ts +2 -0
  163. package/dist/transition/index.js +2 -0
  164. package/dist/utils/ElementOrComponent.svelte +26 -0
  165. package/dist/utils/ElementOrComponent.svelte.d.ts +56 -0
  166. package/dist/utils/Generic.svelte +44 -0
  167. package/dist/utils/Generic.svelte.d.ts +35 -0
  168. package/dist/utils/StableCollection.svelte +1 -1
  169. package/dist/utils/StableCollection.svelte.d.ts +4 -1
  170. package/dist/utils/active-element-history.d.ts +1 -0
  171. package/dist/utils/active-element-history.js +35 -0
  172. package/dist/utils/alternative-types.d.ts +21 -0
  173. package/dist/utils/alternative-types.js +1 -0
  174. package/dist/utils/class-names.d.ts +1 -0
  175. package/dist/utils/class-names.js +10 -0
  176. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +17 -0
  177. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +23 -0
  178. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
  179. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +41 -0
  180. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  181. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  182. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  183. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  184. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  185. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  186. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  187. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  188. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  189. package/dist/utils/floating-ui/svelte/index.js +5 -0
  190. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  191. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  192. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  193. package/dist/utils/floating-ui/svelte/types.js +1 -0
  194. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  195. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  196. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  197. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  198. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  199. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  200. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  201. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  202. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  203. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  204. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  205. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  206. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  207. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  208. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  209. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +183 -0
  210. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  211. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  212. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  213. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  214. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  215. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  216. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  217. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  218. package/dist/utils/focus-management.d.ts +2 -1
  219. package/dist/utils/focus-management.js +13 -13
  220. package/dist/utils/id.d.ts +1 -1
  221. package/dist/utils/id.js +1 -1
  222. package/dist/utils/on-document-ready.d.ts +1 -0
  223. package/dist/utils/on-document-ready.js +12 -0
  224. package/dist/utils/render.d.ts +3 -0
  225. package/dist/utils/render.js +63 -0
  226. package/dist/utils/state.d.ts +7 -1
  227. package/dist/utils/state.js +10 -6
  228. package/dist/utils/style.d.ts +2 -0
  229. package/dist/utils/style.js +6 -0
  230. package/dist/utils/types.d.ts +14 -17
  231. package/dist/utils/types.js +0 -5
  232. package/package.json +33 -31
  233. package/dist/internal/id.d.ts +0 -8
  234. package/dist/internal/id.js +0 -11
  235. package/dist/tabs/Button.svelte +0 -65
  236. package/dist/tabs/Button.svelte.d.ts +0 -39
  237. package/dist/utils/close.d.ts +0 -2
  238. package/dist/utils/close.js +0 -3
@@ -1,4 +1,4 @@
1
- <script lang="ts" context="module">import { mergeProps, RenderFeatures } from "../utils/render.js";
1
+ <script lang="ts" module>import { mergeProps, RenderFeatures } from "../utils/render.js";
2
2
  import {
3
3
  useFloatingPanel,
4
4
  useFloatingPanelProps,
@@ -8,7 +8,7 @@ const DEFAULT_OPTIONS_TAG = "div";
8
8
  let OptionsRenderFeatures = RenderFeatures.RenderStrategy | RenderFeatures.Static;
9
9
  </script>
10
10
 
11
- <script lang="ts" generics="TTag extends ElementType">import { useId } from "../hooks/use-id.js";
11
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG">import { useId } from "../hooks/use-id.js";
12
12
  import { ListboxStates, useActions, useData, ValueMode } from "./Listbox.svelte";
13
13
  import { getOwnerDocument } from "../utils/owner.js";
14
14
  import { State, useOpenClosed } from "../internal/open-closed.js";
@@ -23,25 +23,26 @@ import { match } from "../utils/match.js";
23
23
  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
- import { getContext, setContext } from "svelte";
27
- import Hidden from "../internal/Hidden.svelte";
26
+ import { setContext } from "svelte";
28
27
  import Portal from "../portal/Portal.svelte";
29
- import { stateFromSlot } from "../utils/state.js";
28
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte";
30
29
  const internalId = useId();
31
30
  let {
32
- as = DEFAULT_OPTIONS_TAG,
33
31
  ref = $bindable(),
34
32
  id = `headlessui-listbox-options-${internalId}`,
35
33
  anchor: rawAnchor,
36
34
  portal = false,
37
35
  modal = true,
38
36
  transition = false,
39
- children,
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
- const anchorOptions = (() => {
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: {
@@ -135,22 +136,26 @@ const anchorOptions = (() => {
135
136
  index: selectedOptionIndex
136
137
  }
137
138
  };
138
- })();
139
- const floatingPanel = useFloatingPanel(anchorOptions);
140
- const { setFloating, style } = $derived(floatingPanel);
139
+ });
140
+ const floatingPanel = useFloatingPanel({
141
+ get placement() {
142
+ return anchorOptions ?? null;
143
+ }
144
+ });
145
+ const { setFloating, styles } = $derived(floatingPanel);
141
146
  const getFloatingPanelProps = useFloatingPanelProps();
142
147
  $effect(() => {
143
- data.optionsRef.current = ref || null;
144
- if (anchor) setFloating(ref);
148
+ localOptionsElement = ref;
149
+ data.optionsElement = ref ?? null;
150
+ if (anchor) setFloating(ref ?? null);
145
151
  });
146
152
  const searchDisposables = useDisposables();
147
- const { listboxState, optionsRef } = $derived(data);
153
+ const { listboxState, optionsElement } = $derived(data);
148
154
  $effect(() => {
149
- let container = optionsRef.current;
150
- if (!container) return;
155
+ if (!optionsElement) return;
151
156
  if (listboxState !== ListboxStates.Open) return;
152
- if (container === getOwnerDocument(container)?.activeElement) return;
153
- container?.focus({ preventScroll: true });
157
+ if (optionsElement === getOwnerDocument(optionsElement)?.activeElement) return;
158
+ optionsElement?.focus({ preventScroll: true });
154
159
  });
155
160
  const handleKeyDown = (event) => {
156
161
  searchDisposables.dispose();
@@ -170,7 +175,7 @@ const handleKeyDown = (event) => {
170
175
  }
171
176
  if (data.mode === ValueMode.Single) {
172
177
  actions.closeListbox();
173
- data.buttonRef.current?.focus({ preventScroll: true });
178
+ data.buttonElement?.focus({ preventScroll: true });
174
179
  }
175
180
  break;
176
181
  case match(data.orientation, { vertical: "ArrowDown", horizontal: "ArrowRight" }):
@@ -195,13 +200,13 @@ const handleKeyDown = (event) => {
195
200
  event.preventDefault();
196
201
  event.stopPropagation();
197
202
  actions.closeListbox();
198
- data.buttonRef.current?.focus({ preventScroll: true });
203
+ data.buttonElement?.focus({ preventScroll: true });
199
204
  return;
200
205
  case "Tab":
201
206
  event.preventDefault();
202
207
  event.stopPropagation();
203
208
  actions.closeListbox();
204
- focusFrom(data.buttonRef.current, event.shiftKey ? FocusManagementFocus.Previous : FocusManagementFocus.Next);
209
+ focusFrom(data.buttonElement, event.shiftKey ? FocusManagementFocus.Previous : FocusManagementFocus.Next);
205
210
  break;
206
211
  default:
207
212
  if (event.key.length === 1) {
@@ -211,35 +216,35 @@ const handleKeyDown = (event) => {
211
216
  break;
212
217
  }
213
218
  };
214
- const labelledby = $derived(data.buttonRef.current?.id);
219
+ const labelledby = $derived(data.buttonElement?.id);
215
220
  const slot = $derived({
216
221
  open: data.listboxState === ListboxStates.Open
217
222
  });
218
223
  const buttonSize = useElementSize({
219
224
  get element() {
220
- return data.buttonRef.current;
225
+ return data.buttonElement;
221
226
  },
222
227
  unit: true
223
228
  });
224
- const ourProps = $derived(
225
- mergeProps(anchor ? getFloatingPanelProps() : {}, {
229
+ $effect(() => {
230
+ transitionData;
231
+ });
232
+ const ourProps = $derived({
233
+ ...mergeProps(anchor ? getFloatingPanelProps() : {}, {
226
234
  id,
227
- ref: optionsRef,
228
235
  "aria-activedescendant": data.activeOptionIndex === null ? void 0 : data.options[data.activeOptionIndex]?.id,
229
236
  "aria-multiselectable": data.mode === ValueMode.Multi ? true : void 0,
230
237
  "aria-labelledby": labelledby,
231
238
  "aria-orientation": data.orientation,
232
- onkeydown: handleKeyDown,
233
239
  role: "listbox",
234
240
  // When the `Listbox` is closed, it should not be focusable. This allows us
235
241
  // to skip focusing the `ListboxOptions` when pressing the tab key on an
236
242
  // open `Listbox`, and go to the next focusable element.
237
- tabIndex: data.listboxState === ListboxStates.Open ? 0 : void 0,
238
- style: [theirProps.style, style, `--button-width: ${buttonSize.width}`].filter(Boolean).join("; "),
239
- ...transitionDataAttributes(transitionData),
240
- ...stateFromSlot(slot)
241
- })
242
- );
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
+ });
243
248
  const derivedData = {
244
249
  ...data,
245
250
  get isSelected() {
@@ -247,21 +252,18 @@ const derivedData = {
247
252
  }
248
253
  };
249
254
  setContext("ListboxDataContext", derivedData);
255
+ $inspect(styles);
250
256
  </script>
251
257
 
252
- <Portal enabled={portal ? isStatic || visible : false}>
253
- {#if !panelEnabled && unmount && !isStatic}
254
- <Hidden as="span" bind:ref aria-hidden="true" {...ourProps} />
255
- {:else}
256
- <svelte:element
257
- this={as}
258
- bind:this={ref}
259
- {...ourProps}
260
- {...theirProps}
261
- hidden={isStatic || panelEnabled ? undefined : true}
262
- style={isStatic || panelEnabled ? theirProps.style : "display: none;"}
263
- >
264
- {#if children}{@render children(slot)}{/if}
265
- </svelte:element>
266
- {/if}
258
+ <Portal enabled={portal ? theirProps.static || visible : false}>
259
+ <ElementOrComponent
260
+ {ourProps}
261
+ {theirProps}
262
+ slots={slot}
263
+ defaultTag={DEFAULT_OPTIONS_TAG}
264
+ features={OptionsRenderFeatures}
265
+ visible={panelEnabled}
266
+ name="ListboxOptions"
267
+ bind:ref
268
+ />
267
269
  </Portal>
@@ -1,4 +1,4 @@
1
- import type { ElementType, HTMLElementType, Props } from "../utils/types.js";
1
+ import type { ElementType, Props } from "../utils/types.js";
2
2
  import { type PropsForFeatures } from "../utils/render.js";
3
3
  import { type AnchorPropsWithSelection } from "../internal/floating.svelte.js";
4
4
  declare const DEFAULT_OPTIONS_TAG: "div";
@@ -8,16 +8,32 @@ type OptionsRenderPropArg = {
8
8
  type OptionsPropsWeControl = "aria-activedescendant" | "aria-labelledby" | "aria-multiselectable" | "aria-orientation" | "role" | "tabIndex";
9
9
  declare let OptionsRenderFeatures: number;
10
10
  export type ListboxOptionsProps<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG> = Props<TTag, OptionsRenderPropArg, OptionsPropsWeControl, {
11
+ id?: string;
11
12
  anchor?: AnchorPropsWithSelection;
12
13
  portal?: boolean;
13
14
  modal?: boolean;
14
15
  transition?: boolean;
15
- ref?: HTMLElementType<TTag> | null;
16
16
  } & PropsForFeatures<typeof OptionsRenderFeatures>>;
17
17
  export type ListboxOptionsChildren = Snippet<[OptionsRenderPropArg]>;
18
18
  import { type Snippet } from "svelte";
19
- declare class __sveltets_Render<TTag extends ElementType> {
20
- props(): ListboxOptionsProps<TTag>;
19
+ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG> {
20
+ props(): {
21
+ 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;
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: OptionsRenderPropArg) => string) | undefined;
27
+ } : {}) & {
28
+ id?: string;
29
+ anchor?: AnchorPropsWithSelection;
30
+ portal?: boolean;
31
+ modal?: boolean;
32
+ transition?: boolean;
33
+ } & {
34
+ static?: boolean | undefined;
35
+ unmount?: boolean | undefined;
36
+ };
21
37
  events(): {} & {
22
38
  [evt: string]: CustomEvent<any>;
23
39
  };
@@ -26,14 +42,14 @@ declare class __sveltets_Render<TTag extends ElementType> {
26
42
  exports(): {};
27
43
  }
28
44
  interface $$IsomorphicComponent {
29
- new <TTag extends ElementType>(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']>> & {
45
+ 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']>> & {
30
46
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
31
47
  } & ReturnType<__sveltets_Render<TTag>['exports']>;
32
- <TTag extends ElementType>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
48
+ <TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
33
49
  $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
34
50
  }): ReturnType<__sveltets_Render<TTag>['exports']>;
35
51
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
36
52
  }
37
53
  declare const ListboxOptions: $$IsomorphicComponent;
38
- type ListboxOptions<TTag extends ElementType> = InstanceType<typeof ListboxOptions<TTag>>;
54
+ type ListboxOptions<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG> = InstanceType<typeof ListboxOptions<TTag>>;
39
55
  export default ListboxOptions;
@@ -1,10 +1,11 @@
1
- <script lang="ts" context="module">const DEFAULT_SELECTED_OPTION_TAG = "svelte:fragment";
1
+ <script lang="ts" module>const DEFAULT_SELECTED_OPTION_TAG = "svelte:fragment";
2
2
  </script>
3
3
 
4
- <script lang="ts" generics="TTag extends ElementType, TType">import { useData, ValueMode } from "./Listbox.svelte";
4
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG">import { useData, ValueMode } from "./Listbox.svelte";
5
5
  import { setContext } from "svelte";
6
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte";
6
7
  let {
7
- as = DEFAULT_SELECTED_OPTION_TAG,
8
+ ref = $bindable(),
8
9
  options,
9
10
  placeholder,
10
11
  ...theirProps
@@ -16,10 +17,17 @@ const shouldShowPlaceholder = $derived(
16
17
  setContext("SelectedOptionContext", true);
17
18
  </script>
18
19
 
19
- <svelte:element this={as} {...theirProps}>
20
+ {#snippet children()}
20
21
  {#if placeholder && shouldShowPlaceholder}
21
- <svelte:component this={placeholder} />
22
+ {@render placeholder()}
22
23
  {:else}
23
- <svelte:component this={options} />
24
+ {@render options()}
24
25
  {/if}
25
- </svelte:element>
26
+ {/snippet}
27
+
28
+ <ElementOrComponent
29
+ theirProps={{ ...theirProps, children }}
30
+ defaultTag={DEFAULT_SELECTED_OPTION_TAG}
31
+ name="ListboxSelectedOption"
32
+ bind:ref
33
+ ></ElementOrComponent>
@@ -1,30 +1,40 @@
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;
8
- placeholder?: Component;
7
+ options: Snippet;
8
+ placeholder?: Snippet;
9
9
  }>;
10
- declare class __sveltets_Render<TTag extends ElementType, TType> {
11
- props(): ListboxSelectedOptionProps<TTag>;
10
+ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> {
11
+ props(): {
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;
15
+ 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: Snippet;
20
+ placeholder?: Snippet;
21
+ };
12
22
  events(): {} & {
13
23
  [evt: string]: CustomEvent<any>;
14
24
  };
15
25
  slots(): {};
16
- bindings(): "";
26
+ bindings(): "ref";
17
27
  exports(): {};
18
28
  }
19
29
  interface $$IsomorphicComponent {
20
- new <TTag extends ElementType, TType>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag, TType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag, TType>['props']>, ReturnType<__sveltets_Render<TTag, TType>['events']>, ReturnType<__sveltets_Render<TTag, TType>['slots']>> & {
21
- $$bindings?: ReturnType<__sveltets_Render<TTag, TType>['bindings']>;
22
- } & ReturnType<__sveltets_Render<TTag, TType>['exports']>;
23
- <TTag extends ElementType, TType>(internal: unknown, props: ReturnType<__sveltets_Render<TTag, TType>['props']> & {
24
- $$events?: ReturnType<__sveltets_Render<TTag, TType>['events']>;
25
- }): ReturnType<__sveltets_Render<TTag, TType>['exports']>;
26
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
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
+ $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
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']>;
36
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
27
37
  }
28
38
  declare const ListboxSelectedOption: $$IsomorphicComponent;
29
- type ListboxSelectedOption<TTag extends ElementType, TType> = InstanceType<typeof ListboxSelectedOption<TTag, TType>>;
39
+ type ListboxSelectedOption<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> = InstanceType<typeof ListboxSelectedOption<TTag>>;
30
40
  export default ListboxSelectedOption;
@@ -0,0 +1,75 @@
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
+ compare(a: T, z: T): boolean;
66
+ isSelected(value: T): boolean;
67
+ optionsProps: {
68
+ static: boolean;
69
+ hold: boolean;
70
+ };
71
+ listElements: SvelteMap<string, HTMLElement | null>;
72
+ buttonElement: HTMLElement | null;
73
+ optionsElement: HTMLElement | null;
74
+ } & StateDefinition<T>;
75
+ 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
+ let 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 === null) {
30
+ let 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
+ }