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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/dist/button/Button.svelte +16 -19
  2. package/dist/button/Button.svelte.d.ts +8 -36
  3. package/dist/button/index.d.ts +1 -1
  4. package/dist/button/index.js +1 -1
  5. package/dist/checkbox/Checkbox.svelte +31 -27
  6. package/dist/checkbox/Checkbox.svelte.d.ts +17 -38
  7. package/dist/checkbox/index.d.ts +1 -1
  8. package/dist/checkbox/index.js +1 -1
  9. package/dist/close-button/CloseButton.svelte +4 -7
  10. package/dist/close-button/CloseButton.svelte.d.ts +3 -46
  11. package/dist/close-button/index.d.ts +1 -0
  12. package/dist/close-button/index.js +1 -0
  13. package/dist/data-interactive/DataInteractive.svelte +6 -22
  14. package/dist/data-interactive/DataInteractive.svelte.d.ts +9 -34
  15. package/dist/data-interactive/index.d.ts +1 -1
  16. package/dist/data-interactive/index.js +1 -1
  17. package/dist/description/Description.svelte +29 -24
  18. package/dist/description/Description.svelte.d.ts +9 -30
  19. package/dist/description/context.svelte.js +14 -16
  20. package/dist/description/index.d.ts +1 -1
  21. package/dist/dialog/Dialog.svelte +315 -31
  22. package/dist/dialog/Dialog.svelte.d.ts +7 -45
  23. package/dist/dialog/DialogBackdrop.svelte +11 -14
  24. package/dist/dialog/DialogBackdrop.svelte.d.ts +8 -33
  25. package/dist/dialog/DialogPanel.svelte +23 -19
  26. package/dist/dialog/DialogPanel.svelte.d.ts +8 -34
  27. package/dist/dialog/DialogTitle.svelte +17 -8
  28. package/dist/dialog/DialogTitle.svelte.d.ts +9 -30
  29. package/dist/dialog/context.svelte.js +2 -2
  30. package/dist/dialog/index.d.ts +4 -4
  31. package/dist/dialog/index.js +4 -4
  32. package/dist/disclosure/Disclosure.svelte +61 -0
  33. package/dist/disclosure/Disclosure.svelte.d.ts +14 -0
  34. package/dist/disclosure/DisclosureButton.svelte +191 -0
  35. package/dist/disclosure/DisclosureButton.svelte.d.ts +19 -0
  36. package/dist/disclosure/DisclosurePanel.svelte +98 -0
  37. package/dist/disclosure/DisclosurePanel.svelte.d.ts +16 -0
  38. package/dist/disclosure/context.svelte.d.ts +32 -0
  39. package/dist/disclosure/context.svelte.js +94 -0
  40. package/dist/disclosure/index.d.ts +3 -0
  41. package/dist/disclosure/index.js +3 -0
  42. package/dist/field/Field.svelte +27 -26
  43. package/dist/field/Field.svelte.d.ts +7 -34
  44. package/dist/field/index.d.ts +1 -1
  45. package/dist/fieldset/Fieldset.svelte +21 -20
  46. package/dist/fieldset/Fieldset.svelte.d.ts +8 -35
  47. package/dist/fieldset/index.d.ts +1 -1
  48. package/dist/focus-trap/FocusTrap.svelte +29 -36
  49. package/dist/focus-trap/FocusTrap.svelte.d.ts +8 -38
  50. package/dist/hooks/use-controllable.svelte.js +3 -2
  51. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  52. package/dist/hooks/use-disabled.d.ts +6 -1
  53. package/dist/hooks/use-disabled.js +10 -5
  54. package/dist/hooks/use-element-size.svelte.js +1 -1
  55. package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
  56. package/dist/hooks/use-event-listener.svelte.js +3 -1
  57. package/dist/hooks/use-focus-ring.svelte.js +1 -1
  58. package/dist/hooks/use-inert-others.svelte.js +10 -10
  59. package/dist/hooks/use-is-top-layer.svelte.js +2 -2
  60. package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
  61. package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
  62. package/dist/hooks/use-root-containers.svelte.js +5 -5
  63. package/dist/hooks/use-tab-direction.svelte.js +1 -1
  64. package/dist/hooks/use-transition.svelte.js +2 -2
  65. package/dist/index.d.ts +6 -2
  66. package/dist/index.js +6 -2
  67. package/dist/input/Input.svelte +28 -21
  68. package/dist/input/Input.svelte.d.ts +16 -33
  69. package/dist/input/index.d.ts +1 -1
  70. package/dist/input/index.js +1 -1
  71. package/dist/internal/FloatingProvider.svelte +17 -0
  72. package/dist/internal/FloatingProvider.svelte.d.ts +8 -0
  73. package/dist/internal/FocusSentinel.svelte +33 -32
  74. package/dist/internal/FocusSentinel.svelte.d.ts +4 -18
  75. package/dist/internal/ForcePortalRoot.svelte.d.ts +4 -18
  76. package/dist/internal/FormFields.svelte +18 -13
  77. package/dist/internal/FormFields.svelte.d.ts +4 -18
  78. package/dist/internal/FormFieldsProvider.svelte +17 -0
  79. package/dist/internal/FormFieldsProvider.svelte.d.ts +7 -0
  80. package/dist/internal/FormResolver.svelte +6 -2
  81. package/dist/internal/FormResolver.svelte.d.ts +4 -18
  82. package/dist/internal/Hidden.svelte +10 -10
  83. package/dist/internal/Hidden.svelte.d.ts +6 -33
  84. package/dist/internal/MainTreeProvider.svelte +1 -1
  85. package/dist/internal/MainTreeProvider.svelte.d.ts +4 -18
  86. package/dist/internal/Portal.svelte.d.ts +4 -18
  87. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  88. package/dist/internal/floating-provider.svelte.js +206 -0
  89. package/dist/internal/floating.svelte.d.ts +46 -22
  90. package/dist/internal/floating.svelte.js +90 -272
  91. package/dist/internal/form-fields.svelte.d.ts +10 -0
  92. package/dist/internal/form-fields.svelte.js +23 -0
  93. package/dist/internal/frozen.svelte.js +1 -1
  94. package/dist/label/Label.svelte +17 -13
  95. package/dist/label/Label.svelte.d.ts +8 -33
  96. package/dist/label/context.svelte.js +1 -1
  97. package/dist/label/index.d.ts +1 -1
  98. package/dist/legend/Legend.svelte +22 -15
  99. package/dist/legend/Legend.svelte.d.ts +10 -34
  100. package/dist/listbox/Listbox.svelte +79 -151
  101. package/dist/listbox/Listbox.svelte.d.ts +16 -91
  102. package/dist/listbox/ListboxButton.svelte +31 -29
  103. package/dist/listbox/ListboxButton.svelte.d.ts +8 -38
  104. package/dist/listbox/ListboxOption.svelte +40 -27
  105. package/dist/listbox/ListboxOption.svelte.d.ts +16 -32
  106. package/dist/listbox/ListboxOptions.svelte +126 -72
  107. package/dist/listbox/ListboxOptions.svelte.d.ts +8 -43
  108. package/dist/listbox/ListboxSelectedOption.svelte +24 -26
  109. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -39
  110. package/dist/listbox/context.svelte.d.ts +76 -0
  111. package/dist/listbox/context.svelte.js +36 -0
  112. package/dist/listbox/index.d.ts +5 -5
  113. package/dist/listbox/index.js +4 -4
  114. package/dist/menu/Menu.svelte +22 -266
  115. package/dist/menu/Menu.svelte.d.ts +7 -37
  116. package/dist/menu/MenuButton.svelte +29 -24
  117. package/dist/menu/MenuButton.svelte.d.ts +8 -39
  118. package/dist/menu/MenuHeading.svelte +12 -16
  119. package/dist/menu/MenuHeading.svelte.d.ts +7 -36
  120. package/dist/menu/MenuItem.svelte +18 -23
  121. package/dist/menu/MenuItem.svelte.d.ts +9 -39
  122. package/dist/menu/MenuItems.svelte +33 -34
  123. package/dist/menu/MenuItems.svelte.d.ts +8 -43
  124. package/dist/menu/MenuSection.svelte +9 -12
  125. package/dist/menu/MenuSection.svelte.d.ts +7 -33
  126. package/dist/menu/MenuSeparator.svelte +9 -12
  127. package/dist/menu/MenuSeparator.svelte.d.ts +7 -33
  128. package/dist/menu/context.svelte.d.ts +2 -1
  129. package/dist/menu/context.svelte.js +212 -2
  130. package/dist/menu/index.d.ts +7 -7
  131. package/dist/menu/index.js +3 -3
  132. package/dist/popover/Popover.svelte +228 -0
  133. package/dist/popover/Popover.svelte.d.ts +15 -0
  134. package/dist/popover/PopoverBackdrop.svelte +83 -0
  135. package/dist/popover/PopoverBackdrop.svelte.d.ts +17 -0
  136. package/dist/popover/PopoverButton.svelte +324 -0
  137. package/dist/popover/PopoverButton.svelte.d.ts +21 -0
  138. package/dist/popover/PopoverGroup.svelte +66 -0
  139. package/dist/popover/PopoverGroup.svelte.d.ts +9 -0
  140. package/dist/popover/PopoverPanel.svelte +359 -0
  141. package/dist/popover/PopoverPanel.svelte.d.ts +22 -0
  142. package/dist/popover/context.svelte.d.ts +51 -0
  143. package/dist/popover/context.svelte.js +108 -0
  144. package/dist/popover/index.d.ts +5 -0
  145. package/dist/popover/index.js +5 -0
  146. package/dist/portal/InternalPortal.svelte +17 -17
  147. package/dist/portal/InternalPortal.svelte.d.ts +6 -33
  148. package/dist/portal/Portal.svelte +7 -6
  149. package/dist/portal/Portal.svelte.d.ts +3 -22
  150. package/dist/portal/PortalGroup.svelte +6 -14
  151. package/dist/portal/PortalGroup.svelte.d.ts +5 -34
  152. package/dist/radio-group/Radio.svelte +142 -0
  153. package/dist/radio-group/Radio.svelte.d.ts +35 -0
  154. package/dist/radio-group/RadioGroup.svelte +222 -0
  155. package/dist/radio-group/RadioGroup.svelte.d.ts +34 -0
  156. package/dist/radio-group/RadioOption.svelte +145 -0
  157. package/dist/radio-group/RadioOption.svelte.d.ts +37 -0
  158. package/dist/radio-group/contest.svelte.d.ts +30 -0
  159. package/dist/radio-group/contest.svelte.js +40 -0
  160. package/dist/radio-group/index.d.ts +3 -0
  161. package/dist/radio-group/index.js +3 -0
  162. package/dist/select/Select.svelte +112 -0
  163. package/dist/select/Select.svelte.d.ts +21 -0
  164. package/dist/select/index.d.ts +1 -0
  165. package/dist/select/index.js +1 -0
  166. package/dist/switch/Switch.svelte +27 -28
  167. package/dist/switch/Switch.svelte.d.ts +9 -42
  168. package/dist/switch/SwitchGroup.svelte +5 -5
  169. package/dist/switch/SwitchGroup.svelte.d.ts +8 -30
  170. package/dist/switch/index.d.ts +1 -1
  171. package/dist/switch/index.js +1 -1
  172. package/dist/tabs/Tab.svelte +28 -31
  173. package/dist/tabs/Tab.svelte.d.ts +8 -36
  174. package/dist/tabs/TabGroup.svelte +42 -264
  175. package/dist/tabs/TabGroup.svelte.d.ts +7 -57
  176. package/dist/tabs/TabList.svelte +13 -16
  177. package/dist/tabs/TabList.svelte.d.ts +8 -31
  178. package/dist/tabs/TabPanel.svelte +20 -20
  179. package/dist/tabs/TabPanel.svelte.d.ts +8 -38
  180. package/dist/tabs/TabPanels.svelte +11 -9
  181. package/dist/tabs/TabPanels.svelte.d.ts +8 -30
  182. package/dist/tabs/context.svelte.d.ts +31 -0
  183. package/dist/tabs/context.svelte.js +134 -0
  184. package/dist/tabs/index.d.ts +5 -5
  185. package/dist/tabs/index.js +4 -4
  186. package/dist/textarea/Textarea.svelte +24 -20
  187. package/dist/textarea/Textarea.svelte.d.ts +18 -30
  188. package/dist/textarea/index.d.ts +1 -1
  189. package/dist/textarea/index.js +1 -1
  190. package/dist/transition/InternalTransitionChild.svelte +36 -22
  191. package/dist/transition/InternalTransitionChild.svelte.d.ts +6 -37
  192. package/dist/transition/Transition.svelte +16 -17
  193. package/dist/transition/Transition.svelte.d.ts +8 -38
  194. package/dist/transition/TransitionChild.svelte +13 -12
  195. package/dist/transition/TransitionChild.svelte.d.ts +11 -38
  196. package/dist/transition/context.svelte.js +11 -11
  197. package/dist/transition/index.d.ts +2 -2
  198. package/dist/transition/index.js +2 -2
  199. package/dist/utils/DisabledProvider.svelte +10 -0
  200. package/dist/utils/DisabledProvider.svelte.d.ts +8 -0
  201. package/dist/utils/ElementOrComponent.svelte +58 -17
  202. package/dist/utils/ElementOrComponent.svelte.d.ts +19 -30
  203. package/dist/utils/StableCollection.svelte.d.ts +4 -18
  204. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +32 -0
  205. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +8 -0
  206. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +94 -0
  207. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +26 -0
  208. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  209. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  210. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  211. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  212. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  213. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  214. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  215. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  216. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  217. package/dist/utils/floating-ui/svelte/index.js +5 -0
  218. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  219. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  220. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  221. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  222. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  223. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  224. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  225. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  226. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  227. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  228. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  229. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  230. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  231. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  232. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  233. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  234. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  235. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  236. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +183 -0
  237. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  238. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  239. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  240. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  241. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  242. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  243. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  244. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  245. package/dist/utils/id.d.ts +1 -1
  246. package/dist/utils/id.js +1 -1
  247. package/dist/utils/index.d.ts +3 -0
  248. package/dist/utils/index.js +3 -0
  249. package/dist/utils/state.js +4 -4
  250. package/dist/utils/style.d.ts +2 -0
  251. package/dist/utils/style.js +6 -0
  252. package/dist/utils/types.d.ts +13 -19
  253. package/package.json +54 -53
  254. package/dist/combobox/Combobox.svelte +0 -53
  255. package/dist/combobox/Combobox.svelte.d.ts +0 -50
  256. package/dist/dialog/InternalDialog.svelte +0 -294
  257. package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
  258. package/dist/internal/HoistFormFields.svelte +0 -14
  259. package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
  260. package/dist/internal/id.d.ts +0 -8
  261. package/dist/internal/id.js +0 -11
  262. package/dist/listbox/ListboxStates.d.ts +0 -12
  263. package/dist/listbox/ListboxStates.js +0 -15
  264. package/dist/utils/Generic.svelte +0 -56
  265. package/dist/utils/Generic.svelte.d.ts +0 -35
  266. package/dist/utils/alternative-types.d.ts +0 -21
  267. /package/dist/utils/{alternative-types.js → floating-ui/svelte/types.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  export declare function useEventListener<TType extends keyof WindowEventMap>(params: {
2
2
  element: HTMLElement | Document | Window | EventTarget | null | undefined;
3
3
  type: TType;
4
- listener: (event: WindowEventMap[TType]) => any;
4
+ listener: (event: WindowEventMap[TType]) => unknown;
5
5
  options?: boolean | AddEventListenerOptions;
6
6
  }): void;
@@ -1,5 +1,7 @@
1
1
  export function useEventListener(params) {
2
- let { element = window, type, listener, options } = $derived(params);
2
+ if (typeof window === "undefined")
3
+ return;
4
+ const { element = window, type, listener, options } = $derived(params);
3
5
  $effect(() => {
4
6
  if (!element)
5
7
  return;
@@ -2,7 +2,7 @@ import { isFocusVisible, useFocusVisibleListener } from "../utils/focusVisible.s
2
2
  export const useFocusRing = (options = {}) => {
3
3
  const { autofocus, within } = $derived(options);
4
4
  let focused = $state(false);
5
- let _isFocusVisible = $state(autofocus || isFocusVisible());
5
+ let _isFocusVisible = $state((() => autofocus || isFocusVisible())());
6
6
  useFocusVisibleListener((isFocusVisible) => {
7
7
  _isFocusVisible = isFocusVisible;
8
8
  });
@@ -5,7 +5,7 @@ const originals = new Map();
5
5
  const counts = new Map();
6
6
  function markInert(element) {
7
7
  // Increase count
8
- let count = counts.get(element) ?? 0;
8
+ const count = counts.get(element) ?? 0;
9
9
  counts.set(element, count + 1);
10
10
  // Already marked as inert, no need to do it again
11
11
  if (count !== 0)
@@ -22,7 +22,7 @@ function markInert(element) {
22
22
  }
23
23
  function markNotInert(element) {
24
24
  // Decrease counts
25
- let count = counts.get(element) ?? 1; // Should always exist
25
+ const count = counts.get(element) ?? 1; // Should always exist
26
26
  if (count === 1)
27
27
  counts.delete(element); // We are the last one, so we can delete the count
28
28
  else
@@ -30,7 +30,7 @@ function markNotInert(element) {
30
30
  // Not the last one, so we don't restore the original values (yet)
31
31
  if (count !== 1)
32
32
  return;
33
- let original = originals.get(element);
33
+ const original = originals.get(element);
34
34
  if (!original)
35
35
  return; // Should never happen
36
36
  // Restore original values
@@ -70,7 +70,7 @@ function markNotInert(element) {
70
70
  export function useInertOthers(options) {
71
71
  const { enabled, elements } = $derived(options);
72
72
  const { allowed, disallowed } = $derived(elements ?? {});
73
- let isTopLayer = useIsTopLayer({
73
+ const isTopLayer = useIsTopLayer({
74
74
  get enabled() {
75
75
  return enabled;
76
76
  },
@@ -79,25 +79,25 @@ export function useInertOthers(options) {
79
79
  $effect(() => {
80
80
  if (!isTopLayer.value)
81
81
  return;
82
- let d = disposables();
82
+ const d = disposables();
83
83
  // Mark all disallowed elements as inert
84
- for (let element of disallowed ?? []) {
84
+ for (const element of disallowed ?? []) {
85
85
  if (!element)
86
86
  continue;
87
87
  d.add(markInert(element));
88
88
  }
89
89
  // Mark all siblings of allowed elements (and parents) as inert
90
- let allowedElements = allowed ?? [];
91
- for (let element of allowedElements) {
90
+ const allowedElements = allowed ?? [];
91
+ for (const element of allowedElements) {
92
92
  if (!element)
93
93
  continue;
94
- let ownerDocument = getOwnerDocument(element);
94
+ const ownerDocument = getOwnerDocument(element);
95
95
  if (!ownerDocument)
96
96
  continue;
97
97
  let parent = element.parentElement;
98
98
  while (parent && parent !== ownerDocument.body) {
99
99
  // Mark all siblings as inert
100
- for (let node of parent.children) {
100
+ for (const node of parent.children) {
101
101
  // If the node contains any of the elements we should not mark it as inert
102
102
  // because it would make the elements unreachable.
103
103
  if (node.tagName.toLowerCase() === "svelte:fragment" || allowedElements.some((el) => node.contains(el)))
@@ -44,9 +44,9 @@ let hierarchyStores = new DefaultMap(() => createStore(() => [], {
44
44
  */
45
45
  export function useIsTopLayer(options) {
46
46
  const { enabled, scope } = $derived(options);
47
- const hierarchyStore = hierarchyStores.get(scope);
47
+ const hierarchyStore = $derived(hierarchyStores.get(scope));
48
48
  const id = useId();
49
- let hierarchy = $state(hierarchyStore.getSnapshot());
49
+ let hierarchy = $state((() => hierarchyStore.getSnapshot())());
50
50
  $effect(() => {
51
51
  const unsubscribe = hierarchyStore.subscribe(() => {
52
52
  hierarchy = hierarchyStore.getSnapshot();
@@ -1,4 +1,3 @@
1
- import { untrack } from "svelte";
2
1
  function resolveType(props) {
3
2
  if (props.type)
4
3
  return props.type;
@@ -1,8 +1,8 @@
1
1
  export { default as MainTreeProvider, useMainTreeNode } from "../internal/MainTreeProvider.svelte";
2
2
  export declare function useRootContainers(options?: {
3
- defaultContainers?: (HTMLElement | null)[];
3
+ defaultContainers?: (HTMLElement | undefined | null)[];
4
4
  portals?: HTMLElement[];
5
- mainTreeNode?: HTMLElement | null;
5
+ mainTreeNode?: HTMLElement | undefined | null;
6
6
  }): {
7
7
  readonly resolvedContainers: HTMLElement[];
8
8
  contains: (element: HTMLElement) => boolean;
@@ -6,21 +6,21 @@ export function useRootContainers(options = {}) {
6
6
  mainTreeNode, } = $derived(options);
7
7
  const ownerDocument = $derived(getOwnerDocument(mainTreeNode));
8
8
  const resolvedContainers = $derived.by(() => {
9
- let containers = [];
9
+ const containers = [];
10
10
  // Resolve default containers
11
- for (let container of defaultContainers) {
12
- if (container === null)
11
+ for (const container of defaultContainers) {
12
+ if (!container)
13
13
  continue;
14
14
  containers.push(container);
15
15
  }
16
16
  // Resolve portal containers
17
17
  if (portals) {
18
- for (let portal of portals) {
18
+ for (const portal of portals) {
19
19
  containers.push(portal);
20
20
  }
21
21
  }
22
22
  // Resolve third party (root) containers
23
- for (let container of ownerDocument?.querySelectorAll("html > *, body > *") ?? []) {
23
+ for (const container of ownerDocument?.querySelectorAll("html > *, body > *") ?? []) {
24
24
  if (container === document.body)
25
25
  continue; // Skip `<body>`
26
26
  if (container === document.head)
@@ -6,7 +6,7 @@ export var Direction;
6
6
  })(Direction || (Direction = {}));
7
7
  export function useTabDirection() {
8
8
  let direction = $state(Direction.Forwards);
9
- let enabled = true;
9
+ const enabled = true;
10
10
  useWindowEvent({
11
11
  enabled,
12
12
  type: "keydown",
@@ -37,8 +37,8 @@ export function transitionDataAttributes(data) {
37
37
  }
38
38
  export function useTransition(options) {
39
39
  const { enabled, element, show, events } = $derived(options);
40
- let visible = $state(show);
41
- let flags = $state(enabled && visible ? TransitionState.Enter | TransitionState.Closed : TransitionState.None);
40
+ let visible = $state((() => show)());
41
+ let flags = $state((() => (enabled && visible ? TransitionState.Enter | TransitionState.Closed : TransitionState.None))());
42
42
  let inFlight = $state(false);
43
43
  let cancelled = $state(false);
44
44
  const d = useDisposables();
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from "./close-button/index.js";
4
4
  export * from "./data-interactive/index.js";
5
5
  export * from "./description/index.js";
6
6
  export * from "./dialog/index.js";
7
+ export * from "./disclosure/index.js";
7
8
  export * from "./field/index.js";
8
9
  export * from "./fieldset/index.js";
9
10
  export * from "./input/index.js";
@@ -11,10 +12,13 @@ export * from "./label/index.js";
11
12
  export * from "./legend/index.js";
12
13
  export * from "./listbox/index.js";
13
14
  export * from "./menu/index.js";
15
+ export * from "./popover/index.js";
16
+ export * from "./radio-group/index.js";
17
+ export * from "./select/index.js";
14
18
  export * from "./switch/index.js";
15
19
  export * from "./tabs/index.js";
16
20
  export * from "./textarea/index.js";
17
21
  export * from "./transition/index.js";
22
+ export * from "./utils/index.js";
18
23
  export * from "./hooks/use-id.js";
19
- export * from "./utils/types.js";
20
- export { mergeProps } from "./utils/render.js";
24
+ export * from "./hooks/use-disabled.js";
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ export * from "./close-button/index.js";
4
4
  export * from "./data-interactive/index.js";
5
5
  export * from "./description/index.js";
6
6
  export * from "./dialog/index.js";
7
+ export * from "./disclosure/index.js";
7
8
  export * from "./field/index.js";
8
9
  export * from "./fieldset/index.js";
9
10
  export * from "./input/index.js";
@@ -11,10 +12,13 @@ export * from "./label/index.js";
11
12
  export * from "./legend/index.js";
12
13
  export * from "./listbox/index.js";
13
14
  export * from "./menu/index.js";
15
+ export * from "./popover/index.js";
16
+ export * from "./radio-group/index.js";
17
+ export * from "./select/index.js";
14
18
  export * from "./switch/index.js";
15
19
  export * from "./tabs/index.js";
16
20
  export * from "./textarea/index.js";
17
21
  export * from "./transition/index.js";
22
+ export * from "./utils/index.js";
18
23
  export * from "./hooks/use-id.js";
19
- export * from "./utils/types.js";
20
- export { mergeProps } from "./utils/render.js";
24
+ export * from "./hooks/use-disabled.js";
@@ -1,9 +1,10 @@
1
1
  <script lang="ts" module>
2
- import type { ElementType, Props } from "../utils/types.js"
2
+ import type { Props } from "../utils/types.js"
3
+ import type { SvelteHTMLElements } from "svelte/elements"
3
4
 
4
5
  const DEFAULT_INPUT_TAG = "input" as const
5
6
 
6
- type InputRenderPropArg = {
7
+ export type InputRenderPropArg = {
7
8
  disabled: boolean
8
9
  hover: boolean
9
10
  focus: boolean
@@ -12,24 +13,22 @@
12
13
  }
13
14
  type InputPropsWeControl = "aria-labelledby" | "aria-describedby"
14
15
 
15
- export type InputProps<TTag extends ElementType = typeof DEFAULT_INPUT_TAG, TValue = string> = Props<
16
- TTag,
17
- InputRenderPropArg,
18
- InputPropsWeControl,
19
- {
20
- id?: string
21
- value?: TValue
22
- disabled?: boolean
23
- invalid?: boolean
24
- autofocus?: boolean
25
- }
26
- >
16
+ export type InputOwnProps<TValue = string> = {
17
+ element?: HTMLElement
18
+ id?: string
19
+ value?: TValue
20
+ disabled?: boolean
21
+ invalid?: boolean
22
+ autofocus?: boolean
23
+ }
24
+
25
+ export type InputProps<TValue = string> = Props<typeof DEFAULT_INPUT_TAG, InputRenderPropArg, InputOwnProps<TValue>>
27
26
  </script>
28
27
 
29
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_INPUT_TAG, TValue = string">
28
+ <script lang="ts" generics="TValue = string">
30
29
  import { htmlid } from "../utils/id.js"
31
30
  import { useDisabled } from "../hooks/use-disabled.js"
32
- import { useProvidedId } from "../internal/id.js"
31
+ import { useProvidedId } from "../utils/id.js"
33
32
  import { useLabelledBy } from "../label/context.svelte.js"
34
33
  import { useDescribedBy } from "../description/context.svelte.js"
35
34
  import { useHover } from "../hooks/use-hover.svelte.js"
@@ -42,15 +41,15 @@
42
41
  const providedDisabled = useDisabled()
43
42
 
44
43
  let {
45
- ref = $bindable(),
44
+ element = $bindable(),
46
45
  value = $bindable(),
47
- id = providedId?.value || `headlessui-input-${internalId}`,
46
+ id = providedId || `headlessui-input-${internalId}`,
48
47
  disabled: theirDisabled = false,
49
48
  autofocus = false,
50
49
  invalid = false,
51
50
  ...theirProps
52
- }: { as?: TTag; value?: TValue } & InputProps<TTag, TValue> = $props()
53
- const disabled = $derived(providedDisabled?.value ?? theirDisabled)
51
+ }: InputProps<TValue> = $props()
52
+ const disabled = $derived(providedDisabled.current || theirDisabled)
54
53
 
55
54
  const labelledBy = useLabelledBy()
56
55
  const describedBy = useDescribedBy()
@@ -88,4 +87,12 @@
88
87
  const slot = $derived({ disabled, invalid, hover, focus, autofocus } satisfies InputRenderPropArg)
89
88
  </script>
90
89
 
91
- <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_INPUT_TAG} name="Input" bind:ref bind:value />
90
+ <ElementOrComponent
91
+ {ourProps}
92
+ {theirProps}
93
+ slots={slot}
94
+ defaultTag={DEFAULT_INPUT_TAG}
95
+ name="Input"
96
+ bind:element
97
+ bind:value
98
+ />
@@ -1,52 +1,35 @@
1
- import type { ElementType, Props } from "../utils/types.js";
1
+ import type { Props } from "../utils/types.js";
2
2
  declare const DEFAULT_INPUT_TAG: "input";
3
- type InputRenderPropArg = {
3
+ export type InputRenderPropArg = {
4
4
  disabled: boolean;
5
5
  hover: boolean;
6
6
  focus: boolean;
7
7
  autofocus: boolean;
8
8
  invalid: boolean;
9
9
  };
10
- type InputPropsWeControl = "aria-labelledby" | "aria-describedby";
11
- export type InputProps<TTag extends ElementType = typeof DEFAULT_INPUT_TAG, TValue = string> = Props<TTag, InputRenderPropArg, InputPropsWeControl, {
10
+ export type InputOwnProps<TValue = string> = {
11
+ element?: HTMLElement;
12
12
  id?: string;
13
13
  value?: TValue;
14
14
  disabled?: boolean;
15
15
  invalid?: boolean;
16
16
  autofocus?: boolean;
17
- }>;
18
- declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_INPUT_TAG, TValue = string> {
19
- props(): {
20
- as?: TTag | undefined;
21
- value?: TValue | undefined;
22
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "invalid" | "disabled" | "autofocus" | "value" | "id" | InputPropsWeControl> 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<InputRenderPropArg> | 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: InputRenderPropArg) => string) | undefined;
27
- } : {}) & {
28
- id?: string;
29
- value?: TValue | undefined;
30
- disabled?: boolean;
31
- invalid?: boolean;
32
- autofocus?: boolean;
33
- };
34
- events(): {} & {
35
- [evt: string]: CustomEvent<any>;
36
- };
17
+ };
18
+ export type InputProps<TValue = string> = Props<typeof DEFAULT_INPUT_TAG, InputRenderPropArg, InputOwnProps<TValue>>;
19
+ declare class __sveltets_Render<TValue = string> {
20
+ props(): InputProps<TValue>;
21
+ events(): {};
37
22
  slots(): {};
38
- bindings(): "ref" | "value";
23
+ bindings(): "element" | "value";
39
24
  exports(): {};
40
25
  }
41
26
  interface $$IsomorphicComponent {
42
- new <TTag extends ElementType = typeof DEFAULT_INPUT_TAG, TValue = string>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TTag, TValue>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TTag, TValue>['props']>, ReturnType<__sveltets_Render<TTag, TValue>['events']>, ReturnType<__sveltets_Render<TTag, TValue>['slots']>> & {
43
- $$bindings?: ReturnType<__sveltets_Render<TTag, TValue>['bindings']>;
44
- } & ReturnType<__sveltets_Render<TTag, TValue>['exports']>;
45
- <TTag extends ElementType = typeof DEFAULT_INPUT_TAG, TValue = string>(internal: unknown, props: ReturnType<__sveltets_Render<TTag, TValue>['props']> & {
46
- $$events?: ReturnType<__sveltets_Render<TTag, TValue>['events']>;
47
- }): ReturnType<__sveltets_Render<TTag, TValue>['exports']>;
48
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
27
+ new <TValue = string>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TValue>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TValue>['props']>, ReturnType<__sveltets_Render<TValue>['events']>, ReturnType<__sveltets_Render<TValue>['slots']>> & {
28
+ $$bindings?: ReturnType<__sveltets_Render<TValue>['bindings']>;
29
+ } & ReturnType<__sveltets_Render<TValue>['exports']>;
30
+ <TValue = string>(internal: unknown, props: ReturnType<__sveltets_Render<TValue>['props']> & {}): ReturnType<__sveltets_Render<TValue>['exports']>;
31
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
49
32
  }
50
33
  declare const Input: $$IsomorphicComponent;
51
- type Input<TTag extends ElementType = typeof DEFAULT_INPUT_TAG, TValue = string> = InstanceType<typeof Input<TTag, TValue>>;
34
+ type Input<TValue = string> = InstanceType<typeof Input<TValue>>;
52
35
  export default Input;
@@ -1 +1 @@
1
- export { default as Input, type InputProps } from "./Input.svelte";
1
+ export { default as Input, type InputProps, type InputRenderPropArg as InputSlot, type InputOwnProps, } from "./Input.svelte";
@@ -1 +1 @@
1
- export { default as Input } from "./Input.svelte";
1
+ export { default as Input, } from "./Input.svelte";
@@ -0,0 +1,17 @@
1
+ <script lang="ts" module>
2
+ </script>
3
+
4
+ <script lang="ts">
5
+ import type { Snippet } from "svelte"
6
+ import { useFloatingProvider } from "./floating-provider.svelte.js"
7
+
8
+ const { children, enabled = true }: { children: Snippet; enabled?: boolean } = $props()
9
+
10
+ useFloatingProvider({
11
+ get enabled() {
12
+ return enabled
13
+ },
14
+ })
15
+ </script>
16
+
17
+ {#if children}{@render children()}{/if}
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ children: Snippet;
4
+ enabled?: boolean;
5
+ };
6
+ declare const FloatingProvider: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type FloatingProvider = ReturnType<typeof FloatingProvider>;
8
+ export default FloatingProvider;
@@ -14,40 +14,41 @@
14
14
  onMount(() => {
15
15
  mounted = true
16
16
  })
17
- </script>
18
17
 
19
- {#if enabled}
20
- <Hidden
21
- as="button"
22
- type="button"
23
- features={HiddenFeatures.Focusable}
24
- onfocus={(event: FocusEvent) => {
25
- event.preventDefault()
26
- let frame: ReturnType<typeof requestAnimationFrame>
27
-
28
- let tries = 50
29
- function forwardFocus() {
30
- // Prevent infinite loops
31
- if (tries-- <= 0) {
32
- if (frame) cancelAnimationFrame(frame)
33
- return
34
- }
35
-
36
- // Try to move focus to the correct element. This depends on the implementation
37
- // of `onFocus` of course since it would be different for each place we use it in.
38
- if (onfocus?.()) {
39
- cancelAnimationFrame(frame)
40
- if (!mounted) return
41
-
42
- enabled = false
43
- return
44
- }
45
-
46
- // Retry
47
- frame = requestAnimationFrame(forwardFocus)
18
+ const handleFocus = (event: FocusEvent) => {
19
+ event.preventDefault()
20
+ let frame: ReturnType<typeof requestAnimationFrame>
21
+
22
+ let tries = 50
23
+ function forwardFocus() {
24
+ // Prevent infinite loops
25
+ if (tries-- <= 0) {
26
+ if (frame) cancelAnimationFrame(frame)
27
+ return
28
+ }
29
+
30
+ // Try to move focus to the correct element. This depends on the implementation
31
+ // of `onFocus` of course since it would be different for each place we use it in.
32
+ if (onfocus?.()) {
33
+ cancelAnimationFrame(frame)
34
+ if (!mounted) return
35
+
36
+ enabled = false
37
+ return
48
38
  }
49
39
 
40
+ // Retry
50
41
  frame = requestAnimationFrame(forwardFocus)
51
- }}
52
- />
42
+ }
43
+
44
+ frame = requestAnimationFrame(forwardFocus)
45
+ }
46
+ </script>
47
+
48
+ {#if enabled}
49
+ <Hidden asChild features={HiddenFeatures.Focusable}>
50
+ {#snippet children({ props })}
51
+ <button {...props} type="button" onfocus={handleFocus}>&zwnj;</button>
52
+ {/snippet}
53
+ </Hidden>
53
54
  {/if}
@@ -1,20 +1,6 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const FocusSentinel: $$__sveltets_2_IsomorphicComponent<{
1
+ interface FocusSentinelProps {
15
2
  onfocus: () => boolean;
16
- }, {
17
- [evt: string]: CustomEvent<any>;
18
- }, {}, {}, "">;
19
- type FocusSentinel = InstanceType<typeof FocusSentinel>;
3
+ }
4
+ declare const FocusSentinel: import("svelte").Component<FocusSentinelProps, {}, "">;
5
+ type FocusSentinel = ReturnType<typeof FocusSentinel>;
20
6
  export default FocusSentinel;
@@ -1,22 +1,8 @@
1
1
  import type { Snippet } from "svelte";
2
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
- $$bindings?: Bindings;
5
- } & Exports;
6
- (internal: unknown, props: Props & {
7
- $$events?: Events;
8
- $$slots?: Slots;
9
- }): Exports & {
10
- $set?: any;
11
- $on?: any;
12
- };
13
- z_$$bindings?: Bindings;
14
- }
15
- declare const ForcePortalRoot: $$__sveltets_2_IsomorphicComponent<{
2
+ type $$ComponentProps = {
16
3
  force: boolean;
17
4
  children: Snippet;
18
- }, {
19
- [evt: string]: CustomEvent<any>;
20
- }, {}, {}, "">;
21
- type ForcePortalRoot = InstanceType<typeof ForcePortalRoot>;
5
+ };
6
+ declare const ForcePortalRoot: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type ForcePortalRoot = ReturnType<typeof ForcePortalRoot>;
22
8
  export default ForcePortalRoot;
@@ -2,7 +2,7 @@
2
2
  import { disposables } from "../utils/disposables.js"
3
3
  import { objectToFormEntries } from "../utils/form.js"
4
4
  import FormResolver from "./FormResolver.svelte"
5
- import HoistFormFields from "./HoistFormFields.svelte"
5
+ import { hoistFormFields } from "./form-fields.svelte.js"
6
6
  import Hidden, { HiddenFeatures } from "./Hidden.svelte"
7
7
  import { compact } from "../utils/object.js"
8
8
 
@@ -29,25 +29,30 @@
29
29
 
30
30
  return d.addEventListener(form, "reset", onReset)
31
31
  })
32
- </script>
33
32
 
34
- <HoistFormFields>
35
- <FormResolver setForm={(value) => (form = value)} {formId} />
36
- {#each objectToFormEntries(data) as [name, value]}
37
- <Hidden
38
- features={HiddenFeatures.Hidden}
39
- {...compact({
33
+ const fields = $derived(
34
+ objectToFormEntries(data).map(([name, value]) =>
35
+ compact({
40
36
  key: name,
41
37
  as: "input",
42
38
  type: "hidden",
43
- hidden: true,
44
- readOnly: true,
45
39
  form: formId,
46
40
  disabled,
47
41
  name,
48
42
  value,
49
43
  ...overrides,
50
- })}
51
- />
44
+ })
45
+ )
46
+ )
47
+
48
+ const hoisted = hoistFormFields(formFields)
49
+ </script>
50
+
51
+ {#snippet formFields()}
52
+ <FormResolver setForm={(value) => (form = value)} {formId} />
53
+ {#each fields as props}
54
+ <Hidden features={HiddenFeatures.Hidden} {...props} />
52
55
  {/each}
53
- </HoistFormFields>
56
+ {/snippet}
57
+
58
+ {#if !hoisted}{@render formFields()}{/if}
@@ -1,24 +1,10 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const FormFields: $$__sveltets_2_IsomorphicComponent<{
1
+ type $$ComponentProps = {
15
2
  data: Record<string, any>;
16
3
  overrides?: Record<string, any>;
17
4
  form?: string;
18
5
  disabled?: boolean;
19
6
  onReset?: (e: Event) => void;
20
- }, {
21
- [evt: string]: CustomEvent<any>;
22
- }, {}, {}, "">;
23
- type FormFields = InstanceType<typeof FormFields>;
7
+ };
8
+ declare const FormFields: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type FormFields = ReturnType<typeof FormFields>;
24
10
  export default FormFields;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte"
3
+ import Hidden, { HiddenFeatures } from "./Hidden.svelte"
4
+ import { createFormFieldsContext } from "./form-fields.svelte.js"
5
+
6
+ const { children }: { children?: Snippet } = $props()
7
+
8
+ const context = createFormFieldsContext()
9
+ const { fields } = $derived(context)
10
+ </script>
11
+
12
+ {#if children}{@render children()}{/if}
13
+ <Hidden features={HiddenFeatures.Hidden}>
14
+ {#each fields as field}
15
+ {@render field()}
16
+ {/each}
17
+ </Hidden>