@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
@@ -0,0 +1,202 @@
1
+ import { evaluate, max, min, round } from "@floating-ui/utils";
2
+ import { DEV } from "esm-env";
3
+ import { detectOverflow, offset, } from "@floating-ui/dom";
4
+ import { tick, untrack } from "svelte";
5
+ let devMessageSet;
6
+ if (DEV) {
7
+ devMessageSet = new Set();
8
+ }
9
+ export function warn(...messages) {
10
+ const message = `Floating UI: ${messages.join(" ")}`;
11
+ if (!devMessageSet?.has(message)) {
12
+ devMessageSet?.add(message);
13
+ console.warn(message);
14
+ }
15
+ }
16
+ export function error(...messages) {
17
+ const message = `Floating UI: ${messages.join(" ")}`;
18
+ if (!devMessageSet?.has(message)) {
19
+ devMessageSet?.add(message);
20
+ console.error(message);
21
+ }
22
+ }
23
+ export function getUserAgent() {
24
+ const uaData = navigator.userAgentData;
25
+ if (uaData && Array.isArray(uaData.brands)) {
26
+ return uaData.brands.map(({ brand, version }) => `${brand}/${version}`).join(" ");
27
+ }
28
+ return navigator.userAgent;
29
+ }
30
+ // ------
31
+ function getArgsWithCustomFloatingHeight(state, height) {
32
+ return {
33
+ ...state,
34
+ rects: {
35
+ ...state.rects,
36
+ floating: {
37
+ ...state.rects.floating,
38
+ height,
39
+ },
40
+ },
41
+ };
42
+ }
43
+ /**
44
+ * Positions the floating element such that an inner element inside of it is
45
+ * anchored to the reference element.
46
+ * @see https://floating-ui.com/docs/inner
47
+ */
48
+ export const inner = (props) => ({
49
+ name: "inner",
50
+ options: props,
51
+ async fn(state) {
52
+ const { listRef, overflowRef, onFallbackChange, offset: innerOffset = 0, index = 0, minItemsVisible = 4, referenceOverflowThreshold = 0, scrollRef, ...detectOverflowOptions } = evaluate(props, state);
53
+ const { rects, elements: { floating }, } = state;
54
+ const item = listRef.current[index];
55
+ const scrollEl = scrollRef?.current || floating;
56
+ // Valid combinations:
57
+ // 1. Floating element is the scrollRef and has a border (default)
58
+ // 2. Floating element is not the scrollRef, floating element has a border
59
+ // 3. Floating element is not the scrollRef, scrollRef has a border
60
+ // Floating > {...getFloatingProps()} wrapper > scrollRef > items is not
61
+ // allowed as VoiceOver doesn't work.
62
+ const clientTop = floating.clientTop || scrollEl.clientTop;
63
+ const floatingIsBordered = floating.clientTop !== 0;
64
+ const scrollElIsBordered = scrollEl.clientTop !== 0;
65
+ const floatingIsScrollEl = floating === scrollEl;
66
+ if (DEV) {
67
+ if (!state.placement.startsWith("bottom")) {
68
+ warn('`placement` side must be "bottom" when using the `inner`', "middleware.");
69
+ }
70
+ }
71
+ if (!item) {
72
+ return {};
73
+ }
74
+ const nextArgs = {
75
+ ...state,
76
+ ...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state)),
77
+ };
78
+ const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, scrollEl.scrollHeight + clientTop + floating.clientTop), detectOverflowOptions);
79
+ const refOverflow = await detectOverflow(nextArgs, {
80
+ ...detectOverflowOptions,
81
+ elementContext: "reference",
82
+ });
83
+ const diffY = max(0, overflow.top);
84
+ const nextY = nextArgs.y + diffY;
85
+ const maxHeight = round(max(0, scrollEl.scrollHeight +
86
+ ((floatingIsBordered && floatingIsScrollEl) || scrollElIsBordered ? clientTop * 2 : 0) -
87
+ diffY -
88
+ max(0, overflow.bottom)));
89
+ scrollEl.style.maxHeight = `${maxHeight}px`;
90
+ scrollEl.scrollTop = diffY;
91
+ // There is not enough space, fallback to standard anchored positioning
92
+ if (onFallbackChange) {
93
+ const shouldFallback = (scrollEl.scrollHeight > scrollEl.offsetHeight &&
94
+ scrollEl.offsetHeight < item.offsetHeight * minItemsVisible - 1) ||
95
+ refOverflow.top >= -referenceOverflowThreshold ||
96
+ refOverflow.bottom >= -referenceOverflowThreshold;
97
+ onFallbackChange(shouldFallback);
98
+ await tick();
99
+ }
100
+ if (overflowRef) {
101
+ overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({ ...nextArgs, y: nextY }, scrollEl.offsetHeight + clientTop + floating.clientTop), detectOverflowOptions);
102
+ }
103
+ return {
104
+ y: nextY,
105
+ };
106
+ },
107
+ });
108
+ /**
109
+ * Changes the `inner` middleware's `offset` upon a `wheel` event to
110
+ * expand the floating element's height, revealing more list items.
111
+ * @see https://floating-ui.com/docs/inner
112
+ */
113
+ export function useInnerOffset(options) {
114
+ const { context, props } = $derived(options);
115
+ const { open, elements } = $derived(context);
116
+ const { enabled = true, overflowRef, scrollRef, onChange: unstable_onChange } = $derived(props);
117
+ const onChange = unstable_onChange;
118
+ let controlledScrollingRef = $state(false);
119
+ let prevScrollTopRef = $state(null);
120
+ let initialOverflowRef = $state(null);
121
+ $effect(() => {
122
+ if (!enabled)
123
+ return;
124
+ [open, elements.floating, overflowRef, scrollRef, onChange];
125
+ untrack(() => {
126
+ function onWheel(e) {
127
+ if (e.ctrlKey || !el || overflowRef.current == null) {
128
+ return;
129
+ }
130
+ const dY = e.deltaY;
131
+ const isAtTop = overflowRef.current.top >= -0.5;
132
+ const isAtBottom = overflowRef.current.bottom >= -0.5;
133
+ const remainingScroll = el.scrollHeight - el.clientHeight;
134
+ const sign = dY < 0 ? -1 : 1;
135
+ const method = dY < 0 ? "max" : "min";
136
+ if (el.scrollHeight <= el.clientHeight) {
137
+ return;
138
+ }
139
+ if ((!isAtTop && dY > 0) || (!isAtBottom && dY < 0)) {
140
+ e.preventDefault();
141
+ onChange((d) => d + Math[method](dY, remainingScroll * sign));
142
+ tick();
143
+ }
144
+ else if (/firefox/i.test(getUserAgent())) {
145
+ // Needed to propagate scrolling during momentum scrolling phase once
146
+ // it gets limited by the boundary. UX improvement, not critical.
147
+ el.scrollTop += dY;
148
+ }
149
+ }
150
+ const el = scrollRef?.current || elements.floating;
151
+ if (open && el) {
152
+ el.addEventListener("wheel", onWheel);
153
+ // Wait for the position to be ready.
154
+ requestAnimationFrame(() => {
155
+ prevScrollTopRef = el.scrollTop;
156
+ if (overflowRef.current != null) {
157
+ initialOverflowRef = { ...overflowRef.current };
158
+ }
159
+ });
160
+ return () => {
161
+ prevScrollTopRef = null;
162
+ initialOverflowRef = null;
163
+ el.removeEventListener("wheel", onWheel);
164
+ };
165
+ }
166
+ });
167
+ });
168
+ const floating = $derived({
169
+ onKeyDown() {
170
+ controlledScrollingRef = true;
171
+ },
172
+ onWheel() {
173
+ controlledScrollingRef = false;
174
+ },
175
+ onPointerMove() {
176
+ controlledScrollingRef = false;
177
+ },
178
+ async onScroll() {
179
+ const el = scrollRef?.current || elements.floating;
180
+ if (!overflowRef.current || !el || !controlledScrollingRef) {
181
+ return;
182
+ }
183
+ if (prevScrollTopRef !== null) {
184
+ const scrollDiff = el.scrollTop - prevScrollTopRef;
185
+ if ((overflowRef.current.bottom < -0.5 && scrollDiff < -1) ||
186
+ (overflowRef.current.top < -0.5 && scrollDiff > 1)) {
187
+ onChange((d) => d + scrollDiff);
188
+ await tick();
189
+ }
190
+ }
191
+ // [Firefox] Wait for the height change to have been applied.
192
+ requestAnimationFrame(() => {
193
+ prevScrollTopRef = el.scrollTop;
194
+ });
195
+ },
196
+ });
197
+ return {
198
+ get floating() {
199
+ return enabled ? floating : undefined;
200
+ },
201
+ };
202
+ }
@@ -7,7 +7,7 @@ export declare enum State {
7
7
  export type OpenClosedContext = {
8
8
  readonly value: State;
9
9
  };
10
- export declare function useOpenClosed(): OpenClosedContext;
10
+ export declare function useOpenClosed(): OpenClosedContext | null;
11
11
  export declare function createOpenClosedContext(options: {
12
12
  readonly value: State;
13
13
  }): void;
@@ -7,7 +7,7 @@ export var State;
7
7
  State[State["Opening"] = 8] = "Opening";
8
8
  })(State || (State = {}));
9
9
  export function useOpenClosed() {
10
- return getContext("OpenClosedContext");
10
+ return getContext("OpenClosedContext") ?? null;
11
11
  }
12
12
  export function createOpenClosedContext(options) {
13
13
  setContext("OpenClosedContext", options);
@@ -1,74 +1,21 @@
1
- <script lang="ts" context="module">import { setContext } from "svelte";
2
- const DEFAULT_LABEL_TAG = "label";
3
- export function useLabelContext() {
4
- let context = getContext("LabelContext");
5
- if (context === null) {
6
- let err = new Error("You used a <Label /> component, but it is not inside a relevant parent.");
7
- if (Error.captureStackTrace) Error.captureStackTrace(err, useLabelContext);
8
- throw err;
9
- }
10
- return context;
11
- }
12
- export function useLabelledBy(alwaysAvailableIds) {
13
- const context = getContext("LabelContext");
14
- const value = $derived(
15
- (alwaysAvailableIds?.length ?? 0) > 0 ? [context?.value, ...alwaysAvailableIds].filter(Boolean).join(" ") : context?.value
16
- );
17
- return {
18
- get value() {
19
- return value;
20
- }
21
- };
22
- }
23
- export const useLabels = (options = {}) => {
24
- const { slot, name, props, inherit } = $derived(options);
25
- const parentLabelledBy = useLabelledBy();
26
- let labelIds = $state([]);
27
- const allLabelIds = $derived(inherit && parentLabelledBy.value ? [parentLabelledBy.value, ...labelIds] : labelIds);
28
- const value = $derived(allLabelIds.length > 0 ? allLabelIds.join(" ") : void 0);
29
- const context = {
30
- get slot() {
31
- return slot;
32
- },
33
- get name() {
34
- return name;
35
- },
36
- get props() {
37
- return props;
38
- },
39
- get value() {
40
- return value;
41
- },
42
- register(value2) {
43
- labelIds.push(value2);
44
- return () => {
45
- const clone = labelIds.slice();
46
- const idx = clone.indexOf(value2);
47
- if (idx !== -1) clone.splice(idx, 1);
48
- labelIds = clone;
49
- return labelIds;
50
- };
51
- }
52
- };
53
- setContext("LabelContext", context);
54
- return context;
55
- };
1
+ <script lang="ts" module>let DEFAULT_LABEL_TAG = "label";
56
2
  </script>
57
3
 
58
- <script lang="ts" generics="TTag extends keyof SvelteHTMLElements">import { getContext, onMount } from "svelte";
59
- import { getIdContext, htmlid } from "../utils/id.js";
4
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LABEL_TAG">import { onMount } from "svelte";
5
+ import { useProvidedId, htmlid } from "../utils/id.js";
60
6
  import { useDisabled } from "../hooks/use-disabled.js";
61
7
  import { stateFromSlot } from "../utils/state.js";
8
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte";
9
+ import { useLabelContext } from "./context.svelte.js";
62
10
  const internalId = htmlid();
63
11
  const context = useLabelContext();
64
- const providedHtmlFor = getIdContext();
12
+ const providedHtmlFor = useProvidedId();
65
13
  const providedDisabled = useDisabled();
66
14
  let {
67
- as,
15
+ ref = $bindable(),
68
16
  id = `headlessui-label-${internalId}`,
69
17
  htmlFor = providedHtmlFor,
70
18
  passive = false,
71
- children,
72
19
  ...theirOriginalProps
73
20
  } = $props();
74
21
  onMount(() => {
@@ -79,8 +26,9 @@ let handleClick = (e) => {
79
26
  if (current instanceof HTMLLabelElement) {
80
27
  e.preventDefault();
81
28
  }
29
+ console.log("click", providedHtmlFor);
82
30
  if (current instanceof HTMLLabelElement) {
83
- let target = document.getElementById(current.getAttribute("htmlFor") ?? "");
31
+ let target = document.getElementById(current.getAttribute("for") ?? "");
84
32
  if (target) {
85
33
  let actuallyDisabled = target.getAttribute("disabled");
86
34
  if (actuallyDisabled === "true" || actuallyDisabled === "") {
@@ -101,7 +49,7 @@ const disabled = $derived(providedDisabled.value ?? false);
101
49
  const slot = $derived({ disabled });
102
50
  const ourProps = $derived({
103
51
  id,
104
- htmlFor: passive ? void 0 : htmlFor,
52
+ for: passive ? void 0 : htmlFor,
105
53
  onclick: passive ? void 0 : handleClick,
106
54
  ...stateFromSlot(slot)
107
55
  });
@@ -115,6 +63,10 @@ const theirProps = $derived.by(() => {
115
63
  });
116
64
  </script>
117
65
 
118
- <svelte:element this={as ?? (htmlFor ? DEFAULT_LABEL_TAG : "div")} {...ourProps} {...theirProps}>
119
- {#if children}{@render children(slot)}{/if}
120
- </svelte:element>
66
+ <ElementOrComponent
67
+ {ourProps}
68
+ {theirProps}
69
+ defaultTag={htmlFor ? DEFAULT_LABEL_TAG : "div"}
70
+ name={context.name || "Label"}
71
+ bind:ref
72
+ />
@@ -1,50 +1,37 @@
1
- import type { SvelteHTMLElements } from "svelte/elements";
2
- export type LabelProps<TTag extends keyof SvelteHTMLElements = typeof DEFAULT_LABEL_TAG> = SvelteHTMLElements[TTag] & {
3
- as?: TTag;
1
+ import type { ElementType, Props, PropsOf } from "../utils/types.js";
2
+ declare let DEFAULT_LABEL_TAG: "label";
3
+ export type LabelProps<TTag extends ElementType = typeof DEFAULT_LABEL_TAG> = Props<TTag> & {
4
4
  passive?: boolean;
5
5
  htmlFor?: string;
6
- children?: Snippet<[
7
- {
8
- disabled: boolean;
9
- }
10
- ]>;
11
6
  };
12
- declare const DEFAULT_LABEL_TAG: "label";
13
- interface SharedData {
14
- slot?: {};
15
- name?: string;
16
- props?: Record<string, any>;
17
- }
18
- export type LabelContext = {
19
- value: string | undefined;
20
- register(value: string): () => void;
21
- } & SharedData;
22
- export declare function useLabelContext(): LabelContext;
23
- export declare function useLabelledBy(alwaysAvailableIds?: (string | undefined | null)[]): {
24
- readonly value: string | undefined;
25
- };
26
- export declare const useLabels: (options?: SharedData & {
27
- inherit?: boolean;
28
- }) => LabelContext;
29
- import { type Snippet } from "svelte";
30
- declare class __sveltets_Render<TTag extends keyof SvelteHTMLElements> {
31
- props(): LabelProps<TTag>;
7
+ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_LABEL_TAG> {
8
+ props(): {
9
+ as?: TTag | undefined;
10
+ } & (Exclude<keyof PropsOf<TTag>, "as" | "children" | "refName" | "class"> extends infer T extends keyof PropsOf<TTag> ? { [P in T]: PropsOf<TTag>[P]; } : never) & {
11
+ children?: import("../utils/types.js").Children<{}> | undefined;
12
+ ref?: HTMLElement;
13
+ } & (true extends (PropsOf<TTag> extends infer T_1 ? T_1 extends 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) ? {
14
+ class?: PropsOf<TTag>["class"] | ((bag: {}) => string) | undefined;
15
+ } : {}) & {
16
+ passive?: boolean;
17
+ htmlFor?: string;
18
+ };
32
19
  events(): {} & {
33
20
  [evt: string]: CustomEvent<any>;
34
21
  };
35
22
  slots(): {};
36
- bindings(): "";
23
+ bindings(): "ref";
37
24
  exports(): {};
38
25
  }
39
26
  interface $$IsomorphicComponent {
40
- new <TTag extends keyof SvelteHTMLElements>(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']>> & {
27
+ new <TTag extends ElementType = typeof DEFAULT_LABEL_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']>> & {
41
28
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
42
29
  } & ReturnType<__sveltets_Render<TTag>['exports']>;
43
- <TTag extends keyof SvelteHTMLElements>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
30
+ <TTag extends ElementType = typeof DEFAULT_LABEL_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
44
31
  $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
45
32
  }): ReturnType<__sveltets_Render<TTag>['exports']>;
46
33
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
47
34
  }
48
35
  declare const Label: $$IsomorphicComponent;
49
- type Label<TTag extends keyof SvelteHTMLElements> = InstanceType<typeof Label<TTag>>;
36
+ type Label<TTag extends ElementType = typeof DEFAULT_LABEL_TAG> = InstanceType<typeof Label<TTag>>;
50
37
  export default Label;
@@ -0,0 +1,17 @@
1
+ interface SharedData {
2
+ slot?: {};
3
+ name?: string;
4
+ props?: Record<string, any>;
5
+ }
6
+ export type LabelContext = {
7
+ value: string | undefined;
8
+ register(value: string): () => void;
9
+ } & SharedData;
10
+ export declare function useLabelContext(): LabelContext;
11
+ export declare function useLabelledBy(alwaysAvailableIds?: (string | undefined | null)[]): {
12
+ readonly value: string | undefined;
13
+ };
14
+ export declare const useLabels: (options?: SharedData & {
15
+ inherit?: boolean;
16
+ }) => LabelContext;
17
+ export {};
@@ -0,0 +1,56 @@
1
+ import { getContext, setContext } from "svelte";
2
+ export function useLabelContext() {
3
+ let context = getContext("LabelContext");
4
+ if (context === null) {
5
+ let err = new Error("You used a <Label /> component, but it is not inside a relevant parent.");
6
+ if (Error.captureStackTrace)
7
+ Error.captureStackTrace(err, useLabelContext);
8
+ throw err;
9
+ }
10
+ return context;
11
+ }
12
+ export function useLabelledBy(alwaysAvailableIds) {
13
+ const context = getContext("LabelContext");
14
+ const value = $derived((alwaysAvailableIds?.length ?? 0) > 0
15
+ ? [context?.value, ...alwaysAvailableIds].filter(Boolean).join(" ")
16
+ : context?.value);
17
+ return {
18
+ get value() {
19
+ return value;
20
+ },
21
+ };
22
+ }
23
+ export const useLabels = (options = {}) => {
24
+ const { slot, name, props, inherit } = $derived(options);
25
+ const parentLabelledBy = useLabelledBy();
26
+ let labelIds = $state([]);
27
+ const allLabelIds = $derived(inherit && parentLabelledBy.value ? [parentLabelledBy.value, ...labelIds] : labelIds);
28
+ const value = $derived(allLabelIds.length > 0 ? allLabelIds.join(" ") : undefined);
29
+ const context = {
30
+ get slot() {
31
+ return slot;
32
+ },
33
+ get name() {
34
+ return name;
35
+ },
36
+ get props() {
37
+ return props;
38
+ },
39
+ get value() {
40
+ return value;
41
+ },
42
+ register(value) {
43
+ labelIds.push(value);
44
+ return () => {
45
+ const clone = labelIds.slice();
46
+ const idx = clone.indexOf(value);
47
+ if (idx !== -1)
48
+ clone.splice(idx, 1);
49
+ labelIds = clone;
50
+ return labelIds;
51
+ };
52
+ },
53
+ };
54
+ setContext("LabelContext", context);
55
+ return context;
56
+ };
@@ -1,7 +1,8 @@
1
- <script lang="ts" context="module"></script>
1
+ <script lang="ts" module>import { Label } from "../index.js";
2
+ const DEFAULT_LEGEND_TAG = Label;
3
+ </script>
2
4
 
3
- <script lang="ts">import Label from "../label/Label.svelte";
4
- let { ...props } = $props();
5
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LEGEND_TAG">let { ...props } = $props();
5
6
  </script>
6
7
 
7
8
  <Label as="div" {...props} />
@@ -1,17 +1,35 @@
1
- export type LegendProps = SvelteHTMLElements["div"];
2
- import type { SvelteHTMLElements } from "svelte/elements";
3
- 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> {
4
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
- $$bindings?: Bindings;
6
- } & Exports;
7
- (internal: unknown, props: Props & {
8
- $$events?: Events;
9
- $$slots?: Slots;
10
- }): Exports;
11
- z_$$bindings?: Bindings;
1
+ import { type LabelProps } from "../index.js";
2
+ import type { ElementType, Props } from "../utils/types.js";
3
+ import type { Component } from "svelte";
4
+ declare const DEFAULT_LEGEND_TAG: Component<LabelProps, any>;
5
+ type LegendRenderPropArg = {};
6
+ type LegendPropsWeControl = never;
7
+ export type LegendProps<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> = Props<TTag, LegendRenderPropArg, LegendPropsWeControl, {}>;
8
+ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> {
9
+ props(): {
10
+ as?: TTag | undefined;
11
+ } & (Exclude<keyof import("../index.js").PropsOf<TTag>, "as" | "children" | "refName" | "class"> extends infer T extends keyof import("../index.js").PropsOf<TTag> ? { [P in T]: import("../index.js").PropsOf<TTag>[P]; } : never) & {
12
+ children?: import("../index.js").Children<LegendRenderPropArg> | undefined;
13
+ ref?: HTMLElement;
14
+ } & (true extends (import("../index.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../index.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) ? {
15
+ class?: import("../index.js").PropsOf<TTag>["class"] | ((bag: LegendRenderPropArg) => string) | undefined;
16
+ } : {});
17
+ events(): {} & {
18
+ [evt: string]: CustomEvent<any>;
19
+ };
20
+ slots(): {};
21
+ bindings(): "";
22
+ exports(): {};
12
23
  }
13
- declare const Legend: $$__sveltets_2_IsomorphicComponent<import("svelte/elements").HTMLAttributes<HTMLDivElement>, {
14
- [evt: string]: CustomEvent<any>;
15
- }, {}, {}, "">;
16
- type Legend = InstanceType<typeof Legend>;
24
+ interface $$IsomorphicComponent {
25
+ new <TTag extends ElementType = typeof DEFAULT_LEGEND_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']>> & {
26
+ $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
27
+ } & ReturnType<__sveltets_Render<TTag>['exports']>;
28
+ <TTag extends ElementType = typeof DEFAULT_LEGEND_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
29
+ $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
30
+ }): ReturnType<__sveltets_Render<TTag>['exports']>;
31
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
32
+ }
33
+ declare const Legend: $$IsomorphicComponent;
34
+ type Legend<TTag extends ElementType = typeof DEFAULT_LEGEND_TAG> = InstanceType<typeof Legend<TTag>>;
17
35
  export default Legend;