@pzerelles/headlessui-svelte 2.1.2-next.4 → 2.1.2-next.41

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 (252) hide show
  1. package/dist/button/Button.svelte +15 -18
  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 +30 -26
  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 +28 -23
  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/field/Field.svelte +27 -26
  33. package/dist/field/Field.svelte.d.ts +7 -34
  34. package/dist/field/index.d.ts +1 -1
  35. package/dist/fieldset/Fieldset.svelte +14 -20
  36. package/dist/fieldset/Fieldset.svelte.d.ts +8 -35
  37. package/dist/fieldset/index.d.ts +1 -1
  38. package/dist/focus-trap/FocusTrap.svelte +30 -54
  39. package/dist/focus-trap/FocusTrap.svelte.d.ts +10 -52
  40. package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
  41. package/dist/focus-trap/FocusTrapFeatures.js +15 -0
  42. package/dist/hooks/use-controllable.svelte.js +2 -1
  43. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  44. package/dist/hooks/use-disabled.d.ts +6 -1
  45. package/dist/hooks/use-disabled.js +10 -5
  46. package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
  47. package/dist/hooks/use-event-listener.svelte.js +3 -1
  48. package/dist/hooks/use-inert-others.svelte.js +10 -10
  49. package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
  50. package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
  51. package/dist/hooks/use-root-containers.svelte.js +5 -5
  52. package/dist/hooks/use-tab-direction.svelte.js +1 -1
  53. package/dist/index.d.ts +5 -2
  54. package/dist/index.js +5 -2
  55. package/dist/input/Input.svelte +28 -21
  56. package/dist/input/Input.svelte.d.ts +16 -33
  57. package/dist/input/index.d.ts +1 -1
  58. package/dist/input/index.js +1 -1
  59. package/dist/internal/FloatingProvider.svelte +17 -0
  60. package/dist/internal/FloatingProvider.svelte.d.ts +8 -0
  61. package/dist/internal/FocusSentinel.svelte +33 -32
  62. package/dist/internal/FocusSentinel.svelte.d.ts +4 -18
  63. package/dist/internal/ForcePortalRoot.svelte.d.ts +4 -18
  64. package/dist/internal/FormFields.svelte +18 -13
  65. package/dist/internal/FormFields.svelte.d.ts +4 -18
  66. package/dist/internal/FormFieldsProvider.svelte +17 -0
  67. package/dist/internal/FormFieldsProvider.svelte.d.ts +7 -0
  68. package/dist/internal/FormResolver.svelte +6 -2
  69. package/dist/internal/FormResolver.svelte.d.ts +4 -18
  70. package/dist/internal/Hidden.svelte +10 -10
  71. package/dist/internal/Hidden.svelte.d.ts +6 -33
  72. package/dist/internal/MainTreeProvider.svelte +1 -1
  73. package/dist/internal/MainTreeProvider.svelte.d.ts +4 -18
  74. package/dist/internal/Portal.svelte.d.ts +4 -18
  75. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  76. package/dist/internal/floating-provider.svelte.js +206 -0
  77. package/dist/internal/floating.svelte.d.ts +46 -22
  78. package/dist/internal/floating.svelte.js +90 -272
  79. package/dist/internal/form-fields.svelte.d.ts +10 -0
  80. package/dist/internal/form-fields.svelte.js +23 -0
  81. package/dist/label/Label.svelte +17 -13
  82. package/dist/label/Label.svelte.d.ts +8 -33
  83. package/dist/label/context.svelte.js +1 -1
  84. package/dist/label/index.d.ts +1 -1
  85. package/dist/legend/Legend.svelte +21 -15
  86. package/dist/legend/Legend.svelte.d.ts +9 -34
  87. package/dist/listbox/Listbox.svelte +79 -163
  88. package/dist/listbox/Listbox.svelte.d.ts +16 -101
  89. package/dist/listbox/ListboxButton.svelte +24 -29
  90. package/dist/listbox/ListboxButton.svelte.d.ts +8 -38
  91. package/dist/listbox/ListboxOption.svelte +33 -27
  92. package/dist/listbox/ListboxOption.svelte.d.ts +16 -32
  93. package/dist/listbox/ListboxOptions.svelte +126 -73
  94. package/dist/listbox/ListboxOptions.svelte.d.ts +8 -43
  95. package/dist/listbox/ListboxSelectedOption.svelte +24 -26
  96. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -39
  97. package/dist/listbox/context.svelte.d.ts +76 -0
  98. package/dist/listbox/context.svelte.js +36 -0
  99. package/dist/listbox/index.d.ts +5 -5
  100. package/dist/listbox/index.js +4 -4
  101. package/dist/menu/Menu.svelte +22 -266
  102. package/dist/menu/Menu.svelte.d.ts +7 -37
  103. package/dist/menu/MenuButton.svelte +22 -24
  104. package/dist/menu/MenuButton.svelte.d.ts +8 -39
  105. package/dist/menu/MenuHeading.svelte +12 -16
  106. package/dist/menu/MenuHeading.svelte.d.ts +7 -36
  107. package/dist/menu/MenuItem.svelte +18 -23
  108. package/dist/menu/MenuItem.svelte.d.ts +9 -39
  109. package/dist/menu/MenuItems.svelte +33 -34
  110. package/dist/menu/MenuItems.svelte.d.ts +8 -43
  111. package/dist/menu/MenuSection.svelte +9 -12
  112. package/dist/menu/MenuSection.svelte.d.ts +7 -33
  113. package/dist/menu/MenuSeparator.svelte +9 -12
  114. package/dist/menu/MenuSeparator.svelte.d.ts +7 -33
  115. package/dist/menu/context.svelte.d.ts +2 -1
  116. package/dist/menu/context.svelte.js +212 -2
  117. package/dist/menu/index.d.ts +7 -7
  118. package/dist/menu/index.js +3 -3
  119. package/dist/popover/Popover.svelte +225 -0
  120. package/dist/popover/Popover.svelte.d.ts +15 -0
  121. package/dist/popover/PopoverBackdrop.svelte +83 -0
  122. package/dist/popover/PopoverBackdrop.svelte.d.ts +17 -0
  123. package/dist/popover/PopoverButton.svelte +324 -0
  124. package/dist/popover/PopoverButton.svelte.d.ts +21 -0
  125. package/dist/popover/PopoverGroup.svelte +66 -0
  126. package/dist/popover/PopoverGroup.svelte.d.ts +9 -0
  127. package/dist/popover/PopoverPanel.svelte +359 -0
  128. package/dist/popover/PopoverPanel.svelte.d.ts +22 -0
  129. package/dist/popover/context.svelte.d.ts +51 -0
  130. package/dist/popover/context.svelte.js +108 -0
  131. package/dist/popover/index.d.ts +5 -0
  132. package/dist/popover/index.js +5 -0
  133. package/dist/portal/InternalPortal.svelte +17 -17
  134. package/dist/portal/InternalPortal.svelte.d.ts +6 -33
  135. package/dist/portal/Portal.svelte +7 -6
  136. package/dist/portal/Portal.svelte.d.ts +3 -22
  137. package/dist/portal/PortalGroup.svelte +6 -14
  138. package/dist/portal/PortalGroup.svelte.d.ts +5 -34
  139. package/dist/radio-group/Radio.svelte +135 -0
  140. package/dist/radio-group/Radio.svelte.d.ts +35 -0
  141. package/dist/radio-group/RadioGroup.svelte +223 -0
  142. package/dist/radio-group/RadioGroup.svelte.d.ts +34 -0
  143. package/dist/radio-group/RadioOption.svelte +138 -0
  144. package/dist/radio-group/RadioOption.svelte.d.ts +37 -0
  145. package/dist/radio-group/contest.svelte.d.ts +30 -0
  146. package/dist/radio-group/contest.svelte.js +40 -0
  147. package/dist/radio-group/index.d.ts +3 -0
  148. package/dist/radio-group/index.js +3 -0
  149. package/dist/select/Select.svelte +112 -0
  150. package/dist/select/Select.svelte.d.ts +21 -0
  151. package/dist/select/index.d.ts +1 -0
  152. package/dist/select/index.js +1 -0
  153. package/dist/switch/Switch.svelte +27 -28
  154. package/dist/switch/Switch.svelte.d.ts +9 -42
  155. package/dist/switch/SwitchGroup.svelte +5 -5
  156. package/dist/switch/SwitchGroup.svelte.d.ts +8 -30
  157. package/dist/switch/index.d.ts +1 -1
  158. package/dist/switch/index.js +1 -1
  159. package/dist/tabs/Tab.svelte +26 -29
  160. package/dist/tabs/Tab.svelte.d.ts +8 -36
  161. package/dist/tabs/TabGroup.svelte +42 -264
  162. package/dist/tabs/TabGroup.svelte.d.ts +7 -57
  163. package/dist/tabs/TabList.svelte +13 -16
  164. package/dist/tabs/TabList.svelte.d.ts +8 -31
  165. package/dist/tabs/TabPanel.svelte +19 -19
  166. package/dist/tabs/TabPanel.svelte.d.ts +8 -38
  167. package/dist/tabs/TabPanels.svelte +11 -9
  168. package/dist/tabs/TabPanels.svelte.d.ts +8 -30
  169. package/dist/tabs/context.svelte.d.ts +31 -0
  170. package/dist/tabs/context.svelte.js +134 -0
  171. package/dist/tabs/index.d.ts +5 -5
  172. package/dist/tabs/index.js +4 -4
  173. package/dist/textarea/Textarea.svelte +23 -19
  174. package/dist/textarea/Textarea.svelte.d.ts +18 -30
  175. package/dist/textarea/index.d.ts +1 -1
  176. package/dist/textarea/index.js +1 -1
  177. package/dist/transition/InternalTransitionChild.svelte +19 -12
  178. package/dist/transition/InternalTransitionChild.svelte.d.ts +4 -35
  179. package/dist/transition/Transition.svelte +16 -17
  180. package/dist/transition/Transition.svelte.d.ts +8 -38
  181. package/dist/transition/TransitionChild.svelte +13 -12
  182. package/dist/transition/TransitionChild.svelte.d.ts +11 -38
  183. package/dist/transition/context.svelte.js +9 -9
  184. package/dist/transition/index.d.ts +2 -2
  185. package/dist/transition/index.js +2 -2
  186. package/dist/utils/DisabledProvider.svelte +10 -0
  187. package/dist/utils/DisabledProvider.svelte.d.ts +8 -0
  188. package/dist/utils/ElementOrComponent.svelte +57 -14
  189. package/dist/utils/ElementOrComponent.svelte.d.ts +19 -29
  190. package/dist/utils/StableCollection.svelte.d.ts +4 -18
  191. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +32 -0
  192. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +8 -0
  193. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +94 -0
  194. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +26 -0
  195. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  196. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  197. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  198. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  199. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  200. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  201. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  202. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  203. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  204. package/dist/utils/floating-ui/svelte/index.js +5 -0
  205. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  206. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  207. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  208. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  209. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  210. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  211. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  212. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  213. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  214. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  215. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  216. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  217. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  218. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  219. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  220. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  221. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  222. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  223. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +182 -0
  224. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  225. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  226. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  227. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  228. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  229. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  230. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  231. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  232. package/dist/utils/id.d.ts +1 -1
  233. package/dist/utils/id.js +1 -1
  234. package/dist/utils/index.d.ts +3 -0
  235. package/dist/utils/index.js +3 -0
  236. package/dist/utils/state.js +4 -4
  237. package/dist/utils/style.d.ts +2 -0
  238. package/dist/utils/style.js +6 -0
  239. package/dist/utils/types.d.ts +12 -18
  240. package/package.json +33 -32
  241. package/dist/combobox/Combobox.svelte +0 -53
  242. package/dist/combobox/Combobox.svelte.d.ts +0 -50
  243. package/dist/dialog/InternalDialog.svelte +0 -294
  244. package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
  245. package/dist/internal/HoistFormFields.svelte +0 -14
  246. package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
  247. package/dist/internal/id.d.ts +0 -8
  248. package/dist/internal/id.js +0 -11
  249. package/dist/utils/Generic.svelte +0 -56
  250. package/dist/utils/Generic.svelte.d.ts +0 -35
  251. package/dist/utils/alternative-types.d.ts +0 -21
  252. /package/dist/utils/{alternative-types.js → floating-ui/svelte/types.js} +0 -0
@@ -0,0 +1,182 @@
1
+ import { computePosition } from "@floating-ui/dom";
2
+ import { deepEqual } from "./utils/deepEqual.js";
3
+ import { getDPR } from "./utils/getDPR.js";
4
+ import { roundByDPR } from "./utils/roundByDPR.js";
5
+ import { useLatestRef } from "./utils/useLatestRef.js";
6
+ import { tick, untrack } from "svelte";
7
+ import { stylePropsToString } from "../../style.js";
8
+ /**
9
+ * Provides data to position a floating element.
10
+ * @see https://floating-ui.com/docs/useFloating
11
+ */
12
+ export function useFloating(options = {}) {
13
+ const { placement = "bottom", strategy = "absolute", middleware = [], platform, elements: externalElements = {}, transform = true, whileElementsMounted, open, } = $derived(options);
14
+ const { reference: externalReference, floating: externalFloating } = $derived(externalElements);
15
+ let data = $state({
16
+ x: 0,
17
+ y: 0,
18
+ strategy,
19
+ placement,
20
+ middlewareData: {},
21
+ isPositioned: false,
22
+ });
23
+ const setData = (value) => (data = value);
24
+ let latestMiddleware = $state(middleware);
25
+ $effect(() => {
26
+ if (!deepEqual(latestMiddleware, middleware)) {
27
+ latestMiddleware = middleware;
28
+ }
29
+ });
30
+ let _reference = $state(null);
31
+ let _floating = $state(null);
32
+ const setReference = (node) => {
33
+ if ((node ?? null) !== referenceRef.current) {
34
+ referenceRef.current = node ?? null;
35
+ _reference = node ?? null;
36
+ }
37
+ };
38
+ const setFloating = (node) => {
39
+ if ((node ?? null) !== floatingRef.current) {
40
+ floatingRef.current = node ?? null;
41
+ _floating = node ?? null;
42
+ }
43
+ };
44
+ const referenceEl = $derived((externalReference || _reference));
45
+ const floatingEl = $derived(externalFloating || _floating);
46
+ const referenceRef = $state({ current: null });
47
+ const floatingRef = $state({ current: null });
48
+ const dataRef = $state({ current: data });
49
+ const hasWhileElementsMounted = whileElementsMounted != null;
50
+ const whileElementsMountedRef = useLatestRef({
51
+ get value() {
52
+ return whileElementsMounted;
53
+ },
54
+ });
55
+ const platformRef = useLatestRef({
56
+ get value() {
57
+ return platform;
58
+ },
59
+ });
60
+ const openRef = useLatestRef({
61
+ get value() {
62
+ return open;
63
+ },
64
+ });
65
+ const update = () => {
66
+ if (!referenceRef.current || !floatingRef.current) {
67
+ return;
68
+ }
69
+ const config = {
70
+ placement,
71
+ strategy,
72
+ middleware: latestMiddleware,
73
+ };
74
+ if (platformRef.current) {
75
+ config.platform = platformRef.current;
76
+ }
77
+ computePosition(referenceRef.current, floatingRef.current, config).then(async (data) => {
78
+ const fullData = {
79
+ ...data,
80
+ // The floating element's position may be recomputed while it's closed
81
+ // but still mounted (such as when transitioning out). To ensure
82
+ // `isPositioned` will be `false` initially on the next open, avoid
83
+ // setting it to `true` when `open === false` (must be specified).
84
+ isPositioned: openRef.current !== false,
85
+ };
86
+ if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {
87
+ dataRef.current = fullData;
88
+ setData(fullData);
89
+ await tick();
90
+ }
91
+ });
92
+ };
93
+ $effect(() => {
94
+ open;
95
+ untrack(() => {
96
+ if (open === false && dataRef.current.isPositioned) {
97
+ dataRef.current.isPositioned = false;
98
+ data.isPositioned = false;
99
+ }
100
+ });
101
+ });
102
+ const isMountedRef = $state({ current: false });
103
+ $effect(() => {
104
+ isMountedRef.current = true;
105
+ return () => {
106
+ isMountedRef.current = false;
107
+ };
108
+ });
109
+ $effect(() => {
110
+ if (referenceEl)
111
+ referenceRef.current = referenceEl;
112
+ if (floatingEl)
113
+ floatingRef.current = floatingEl;
114
+ if (referenceEl && floatingEl) {
115
+ if (whileElementsMountedRef.current) {
116
+ return whileElementsMountedRef.current(referenceEl, floatingEl, update);
117
+ }
118
+ update();
119
+ }
120
+ }); //, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted])
121
+ const refs = $derived({
122
+ reference: referenceRef,
123
+ floating: floatingRef,
124
+ setReference,
125
+ setFloating,
126
+ });
127
+ const elements = $derived({ reference: referenceEl, floating: floatingEl });
128
+ const floatingStyles = $derived.by(() => {
129
+ const initialStyles = {
130
+ position: strategy,
131
+ left: 0,
132
+ top: 0,
133
+ };
134
+ if (!elements.floating) {
135
+ return stylePropsToString(initialStyles);
136
+ }
137
+ const x = roundByDPR(elements.floating, data.x);
138
+ const y = roundByDPR(elements.floating, data.y);
139
+ if (transform) {
140
+ return stylePropsToString({
141
+ ...initialStyles,
142
+ transform: `translate(${x}px, ${y}px)`,
143
+ ...(getDPR(elements.floating) >= 1.5 && { "will-change": "transform" }),
144
+ });
145
+ }
146
+ return stylePropsToString({
147
+ position: strategy,
148
+ left: x,
149
+ top: y,
150
+ });
151
+ });
152
+ return {
153
+ get placement() {
154
+ return data.placement;
155
+ },
156
+ get strategy() {
157
+ return data.strategy;
158
+ },
159
+ get middlewareData() {
160
+ return data.middlewareData;
161
+ },
162
+ get x() {
163
+ return data.x;
164
+ },
165
+ get y() {
166
+ return data.y;
167
+ },
168
+ get isPositioned() {
169
+ return data.isPositioned;
170
+ },
171
+ update,
172
+ get refs() {
173
+ return refs;
174
+ },
175
+ get elements() {
176
+ return elements;
177
+ },
178
+ get floatingStyles() {
179
+ return floatingStyles;
180
+ },
181
+ };
182
+ }
@@ -0,0 +1 @@
1
+ export declare function deepEqual(a: any, b: any): boolean;
@@ -0,0 +1,50 @@
1
+ // Fork of `fast-deep-equal` that only does the comparisons we need and compares
2
+ // functions
3
+ export function deepEqual(a, b) {
4
+ if (a === b) {
5
+ return true;
6
+ }
7
+ if (typeof a !== typeof b) {
8
+ return false;
9
+ }
10
+ if (typeof a === "function" && a.toString() === b.toString()) {
11
+ return true;
12
+ }
13
+ let length;
14
+ let i;
15
+ let keys;
16
+ if (a && b && typeof a === "object") {
17
+ if (Array.isArray(a)) {
18
+ length = a.length;
19
+ if (length !== b.length)
20
+ return false;
21
+ for (i = length; i-- !== 0;) {
22
+ if (!deepEqual(a[i], b[i])) {
23
+ return false;
24
+ }
25
+ }
26
+ return true;
27
+ }
28
+ keys = Object.keys(a);
29
+ length = keys.length;
30
+ if (length !== Object.keys(b).length) {
31
+ return false;
32
+ }
33
+ for (i = length; i-- !== 0;) {
34
+ if (!{}.hasOwnProperty.call(b, keys[i])) {
35
+ return false;
36
+ }
37
+ }
38
+ for (i = length; i-- !== 0;) {
39
+ const key = keys[i];
40
+ if (key === "_owner" && a.$$typeof) {
41
+ continue;
42
+ }
43
+ if (!deepEqual(a[key], b[key])) {
44
+ return false;
45
+ }
46
+ }
47
+ return true;
48
+ }
49
+ return a !== a && b !== b;
50
+ }
@@ -0,0 +1 @@
1
+ export declare function getDPR(element: Element): number;
@@ -0,0 +1,7 @@
1
+ export function getDPR(element) {
2
+ if (typeof window === "undefined") {
3
+ return 1;
4
+ }
5
+ const win = element.ownerDocument.defaultView || window;
6
+ return win.devicePixelRatio || 1;
7
+ }
@@ -0,0 +1 @@
1
+ export declare function roundByDPR(element: Element, value: number): number;
@@ -0,0 +1,5 @@
1
+ import { getDPR } from "./getDPR.js";
2
+ export function roundByDPR(element, value) {
3
+ const dpr = getDPR(element);
4
+ return Math.round(value * dpr) / dpr;
5
+ }
@@ -0,0 +1,4 @@
1
+ import type { MutableRefObject } from "../../../ref.svelte.js";
2
+ export declare function useLatestRef<T>(options: {
3
+ value: T;
4
+ }): MutableRefObject<T>;
@@ -0,0 +1,7 @@
1
+ export function useLatestRef(options) {
2
+ return {
3
+ get current() {
4
+ return options.value;
5
+ },
6
+ };
7
+ }
@@ -1,4 +1,4 @@
1
1
  export declare const alphaid: (size?: number) => string;
2
2
  export declare const htmlid: (size?: number) => string;
3
- export declare const getIdContext: () => string | undefined;
3
+ export declare const useProvidedId: () => string | undefined;
4
4
  export declare const createIdContext: (id: string) => string | undefined;
package/dist/utils/id.js CHANGED
@@ -2,5 +2,5 @@ import { nanoid, customAlphabet } from "nanoid";
2
2
  import { getContext, setContext } from "svelte";
3
3
  export const alphaid = customAlphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
4
4
  export const htmlid = (size = 10) => alphaid(1) + nanoid(size - 1);
5
- export const getIdContext = () => getContext("Id");
5
+ export const useProvidedId = () => getContext("Id");
6
6
  export const createIdContext = (id) => setContext("Id", id);
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export { mergeProps } from "./render.js";
3
+ export { default as DisabledProvider } from "./DisabledProvider.svelte";
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export { mergeProps } from "./render.js";
3
+ export { default as DisabledProvider } from "./DisabledProvider.svelte";
@@ -1,10 +1,10 @@
1
1
  export const stateFromSlot = (slot = {}) => {
2
2
  if (typeof slot !== "object")
3
3
  return {};
4
- let dataAttributes = {};
4
+ const dataAttributes = {};
5
5
  let exposeState = false;
6
- let states = [];
7
- for (let [k, v] of Object.entries(slot)) {
6
+ const states = [];
7
+ for (const [k, v] of Object.entries(slot)) {
8
8
  if (typeof v === "boolean") {
9
9
  exposeState = true;
10
10
  }
@@ -14,7 +14,7 @@ export const stateFromSlot = (slot = {}) => {
14
14
  }
15
15
  if (!exposeState)
16
16
  return {};
17
- for (let s of states) {
17
+ for (const s of states) {
18
18
  dataAttributes[`data-${s}`] = "";
19
19
  }
20
20
  return {
@@ -0,0 +1,2 @@
1
+ export declare const camelToKebab: (s: string) => string;
2
+ export declare const stylePropsToString: (props: Record<string, unknown>) => string;
@@ -0,0 +1,6 @@
1
+ export const camelToKebab = (s) => s.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
2
+ export const stylePropsToString = (props) => {
3
+ return Object.entries(props)
4
+ .map(([key, value]) => `${camelToKebab(key)}: ${typeof value === "number" ? `${value}px` : value}`)
5
+ .join(";");
6
+ };
@@ -1,24 +1,18 @@
1
1
  import type { Snippet } from "svelte";
2
2
  import type { SvelteHTMLElements } from "svelte/elements";
3
- export interface SvelteHTMLProps extends SvelteHTMLElements {
4
- "svelte:fragment": {};
5
- }
6
- export type ElementType = keyof SvelteHTMLProps;
7
3
  export type Expand<T> = T extends infer O ? {
8
4
  [K in keyof O]: O[K];
9
5
  } : never;
10
- export type PropsOf<TTag extends ElementType> = SvelteHTMLProps[TTag];
11
- export type Children<TSlot> = Snippet | Snippet<[TSlot, Record<string, any>]>;
12
- type PropsWeControl = "as" | "children" | "refName" | "class";
13
- type CleanProps<TTag extends ElementType, TOmittableProps extends PropertyKey = never> = Omit<PropsOf<TTag>, TOmittableProps | PropsWeControl>;
14
- type OurProps<TSlot> = {
15
- children?: Children<TSlot>;
16
- ref?: HTMLElement;
17
- };
18
- type HasProperty<T extends object, K extends PropertyKey> = T extends never ? never : K extends keyof T ? true : never;
19
- type ClassNameOverride<TTag extends ElementType, TSlot = {}> = true extends HasProperty<PropsOf<TTag>, "class"> ? {
20
- class?: PropsOf<TTag>["class"] | ((bag: TSlot) => string);
21
- } : {};
22
- export type Props<TTag extends ElementType, TSlot = {}, TOmittableProps extends PropertyKey = never, Overrides = {}> = CleanProps<TTag, TOmittableProps | keyof Overrides> & OurProps<TSlot> & ClassNameOverride<TTag, TSlot> & Overrides;
6
+ export type Props<TTag extends string | Record<string, any>, TSlot extends Record<string, any> = {}, Overrides = {}> = Omit<TTag extends string ? SvelteHTMLElements[TTag] : TTag, "asChild" | "children" | "class" | keyof Overrides> & {
7
+ asChild?: boolean;
8
+ children?: Snippet<[TSlot & {
9
+ props?: Record<string, any>;
10
+ }]>;
11
+ class?: string | null | ((bag: TSlot) => string);
12
+ } & Overrides;
13
+ export type PropsAsChild<TSlot extends Record<string, any> = {}, Overrides = {}> = {
14
+ children?: Snippet<[TSlot & {
15
+ props?: Record<string, any>;
16
+ }]>;
17
+ } & Overrides;
23
18
  export type EnsureArray<T> = T extends any[] ? T : Expand<T>[];
24
- export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pzerelles/headlessui-svelte",
3
- "version": "2.1.2-next.4",
3
+ "version": "2.1.2-next.41",
4
4
  "exports": {
5
5
  ".": {
6
6
  "types": "./dist/index.d.ts",
@@ -13,48 +13,49 @@
13
13
  "!dist/**/*.spec.*"
14
14
  ],
15
15
  "peerDependencies": {
16
- "svelte": "^5.0.0-next.242"
16
+ "svelte": "^5.0.0"
17
17
  },
18
18
  "devDependencies": {
19
- "@changesets/cli": "^2.27.7",
19
+ "@changesets/cli": "^2.27.11",
20
20
  "@changesets/types": "^6.0.0",
21
- "@playwright/test": "^1.46.1",
21
+ "@playwright/test": "^1.49.1",
22
22
  "@pzerelles/heroicons-svelte": "^2.1.5",
23
- "@sveltejs/adapter-auto": "^3.2.4",
24
- "@sveltejs/kit": "^2.5.25",
25
- "@sveltejs/package": "^2.3.4",
26
- "@sveltejs/vite-plugin-svelte": "4.0.0-next.6",
27
- "@testing-library/jest-dom": "^6.5.0",
28
- "@testing-library/svelte": "^5.2.1",
23
+ "@sveltejs/adapter-auto": "^3.3.1",
24
+ "@sveltejs/kit": "^2.15.3",
25
+ "@sveltejs/package": "^2.3.7",
26
+ "@sveltejs/vite-plugin-svelte": "^4.0.4",
27
+ "@testing-library/jest-dom": "^6.6.3",
28
+ "@testing-library/svelte": "^5.2.6",
29
29
  "@types/eslint": "^9.6.1",
30
- "@types/node": "^20.16.1",
30
+ "@types/node": "^20.17.13",
31
31
  "autoprefixer": "^10.4.20",
32
- "eslint": "^9.9.1",
32
+ "eslint": "^9.18.0",
33
33
  "eslint-config-prettier": "^9.1.0",
34
- "eslint-plugin-svelte": "^2.43.0",
35
- "globals": "^15.9.0",
36
- "jsdom": "^24.1.3",
34
+ "eslint-plugin-svelte": "^2.46.1",
35
+ "globals": "^15.14.0",
36
+ "jsdom": "^25.0.1",
37
37
  "outdent": "^0.8.0",
38
- "postcss": "^8.4.41",
39
- "prettier": "^3.3.3",
40
- "prettier-plugin-svelte": "^3.2.6",
41
- "prettier-plugin-tailwindcss": "^0.6.6",
42
- "publint": "^0.2.10",
43
- "svelte": "^5.0.0-next.242",
44
- "svelte-check": "^3.8.6",
45
- "tailwindcss": "^3.4.10",
46
- "tslib": "^2.7.0",
47
- "typescript": "^5.5.4",
48
- "typescript-eslint": "^8.3.0",
49
- "vite": "^5.4.2",
50
- "vitest": "^2.0.5"
38
+ "postcss": "^8.5.1",
39
+ "prettier": "^3.4.2",
40
+ "prettier-plugin-svelte": "^3.3.3",
41
+ "prettier-plugin-tailwindcss": "^0.6.9",
42
+ "publint": "^0.3.2",
43
+ "svelte": "^5.18.0",
44
+ "svelte-check": "^4.1.4",
45
+ "tailwindcss": "^3.4.17",
46
+ "tslib": "^2.8.1",
47
+ "typescript": "^5.7.3",
48
+ "typescript-eslint": "^8.20.0",
49
+ "vite": "^5.4.11",
50
+ "vitest": "^2.1.8"
51
51
  },
52
52
  "dependencies": {
53
- "@floating-ui/core": "^1.6.7",
54
- "@floating-ui/dom": "^1.6.10",
53
+ "@floating-ui/core": "^1.6.9",
54
+ "@floating-ui/dom": "^1.6.13",
55
+ "@floating-ui/utils": "^0.2.9",
55
56
  "clsx": "^2.1.1",
56
- "esm-env": "^1.0.0",
57
- "nanoid": "^5.0.7"
57
+ "esm-env": "^1.2.2",
58
+ "nanoid": "^5.0.9"
58
59
  },
59
60
  "svelte": "./dist/index.js",
60
61
  "types": "./dist/index.d.ts",
@@ -1,53 +0,0 @@
1
- <script lang="ts" module>
2
- import type { ElementType, EnsureArray, Props } from "../utils/types.js"
3
- import type { ByComparator } from "../hooks/use-by-comparator.js"
4
-
5
- const DEFAULT_COMBOBOX_TAG = "svelte:fragment" as const
6
- type ComboboxRenderPropArg<TValue, TActive = TValue> = {
7
- open: boolean
8
- disabled: boolean
9
- activeIndex: number | null
10
- activeOption: TActive | null
11
- value: TValue
12
- }
13
-
14
- export type CheckboxProps<
15
- TValue,
16
- TMultiple extends boolean | undefined,
17
- TTag extends ElementType = typeof DEFAULT_COMBOBOX_TAG,
18
- > = Props<
19
- TTag,
20
- ComboboxRenderPropArg<NoInfer<TValue>>,
21
- "value" | "defaultValue" | "multiple" | "onChange" | "by",
22
- {
23
- value?: TMultiple extends true ? EnsureArray<TValue> : TValue
24
- defaultValue?: TMultiple extends true ? EnsureArray<NoInfer<TValue>> : NoInfer<TValue>
25
-
26
- onChange?(value: TMultiple extends true ? EnsureArray<NoInfer<TValue>> : NoInfer<TValue> | null): void
27
- by?: ByComparator<TMultiple extends true ? EnsureArray<NoInfer<TValue>>[number] : NoInfer<TValue>>
28
-
29
- /** @deprecated The `<Combobox />` is now nullable default */
30
- nullable?: boolean
31
-
32
- multiple?: TMultiple
33
- disabled?: boolean
34
- form?: string
35
- name?: string
36
- immediate?: boolean
37
- virtual?: {
38
- options: NoInfer<TValue>[]
39
- disabled?: (value: NoInfer<TValue>) => boolean
40
- } | null
41
-
42
- onclose?(): void
43
-
44
- __demoMode?: boolean
45
- }
46
- >
47
- </script>
48
-
49
- <script lang="ts" generics="TType, TTag extends ElementType = typeof DEFAULT_COMBOBOX_TAG">
50
- import { useDisabled } from "../hooks/use-disabled.js"
51
-
52
- const providedDisabled = useDisabled()
53
- </script>
@@ -1,50 +0,0 @@
1
- import type { ElementType, EnsureArray, Props } from "../utils/types.js";
2
- import type { ByComparator } from "../hooks/use-by-comparator.js";
3
- declare const DEFAULT_COMBOBOX_TAG: "svelte:fragment";
4
- type ComboboxRenderPropArg<TValue, TActive = TValue> = {
5
- open: boolean;
6
- disabled: boolean;
7
- activeIndex: number | null;
8
- activeOption: TActive | null;
9
- value: TValue;
10
- };
11
- export type CheckboxProps<TValue, TMultiple extends boolean | undefined, TTag extends ElementType = typeof DEFAULT_COMBOBOX_TAG> = Props<TTag, ComboboxRenderPropArg<NoInfer<TValue>>, "value" | "defaultValue" | "multiple" | "onChange" | "by", {
12
- value?: TMultiple extends true ? EnsureArray<TValue> : TValue;
13
- defaultValue?: TMultiple extends true ? EnsureArray<NoInfer<TValue>> : NoInfer<TValue>;
14
- onChange?(value: TMultiple extends true ? EnsureArray<NoInfer<TValue>> : NoInfer<TValue> | null): void;
15
- by?: ByComparator<TMultiple extends true ? EnsureArray<NoInfer<TValue>>[number] : NoInfer<TValue>>;
16
- /** @deprecated The `<Combobox />` is now nullable default */
17
- nullable?: boolean;
18
- multiple?: TMultiple;
19
- disabled?: boolean;
20
- form?: string;
21
- name?: string;
22
- immediate?: boolean;
23
- virtual?: {
24
- options: NoInfer<TValue>[];
25
- disabled?: (value: NoInfer<TValue>) => boolean;
26
- } | null;
27
- onclose?(): void;
28
- __demoMode?: boolean;
29
- }>;
30
- declare class __sveltets_Render<TType, TTag extends ElementType = typeof DEFAULT_COMBOBOX_TAG> {
31
- props(): Record<string, never>;
32
- events(): {} & {
33
- [evt: string]: CustomEvent<any>;
34
- };
35
- slots(): {};
36
- bindings(): string;
37
- exports(): {};
38
- }
39
- interface $$IsomorphicComponent {
40
- new <TType, TTag extends ElementType = typeof DEFAULT_COMBOBOX_TAG>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TType, TTag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TType, TTag>['props']>, ReturnType<__sveltets_Render<TType, TTag>['events']>, ReturnType<__sveltets_Render<TType, TTag>['slots']>> & {
41
- $$bindings?: ReturnType<__sveltets_Render<TType, TTag>['bindings']>;
42
- } & ReturnType<__sveltets_Render<TType, TTag>['exports']>;
43
- <TType, TTag extends ElementType = typeof DEFAULT_COMBOBOX_TAG>(internal: unknown, props: {
44
- $$events?: ReturnType<__sveltets_Render<TType, TTag>['events']>;
45
- }): ReturnType<__sveltets_Render<TType, TTag>['exports']>;
46
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
47
- }
48
- declare const Combobox: $$IsomorphicComponent;
49
- type Combobox<TType, TTag extends ElementType = typeof DEFAULT_COMBOBOX_TAG> = InstanceType<typeof Combobox<TType, TTag>>;
50
- export default Combobox;