@pzerelles/headlessui-svelte 2.1.2-next.2 → 2.1.2-next.20

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 (168) hide show
  1. package/dist/button/Button.svelte.d.ts +1 -1
  2. package/dist/checkbox/Checkbox.svelte +4 -4
  3. package/dist/checkbox/Checkbox.svelte.d.ts +5 -7
  4. package/dist/close-button/CloseButton.svelte.d.ts +2 -2
  5. package/dist/data-interactive/DataInteractive.svelte.d.ts +1 -1
  6. package/dist/description/Description.svelte.d.ts +1 -1
  7. package/dist/description/context.svelte.js +1 -1
  8. package/dist/dialog/Dialog.svelte.d.ts +1 -1
  9. package/dist/dialog/DialogBackdrop.svelte.d.ts +1 -1
  10. package/dist/dialog/DialogPanel.svelte +0 -1
  11. package/dist/dialog/DialogPanel.svelte.d.ts +1 -1
  12. package/dist/dialog/DialogTitle.svelte.d.ts +1 -1
  13. package/dist/dialog/InternalDialog.svelte.d.ts +1 -1
  14. package/dist/dialog/context.svelte.js +1 -1
  15. package/dist/field/Field.svelte +21 -3
  16. package/dist/field/Field.svelte.d.ts +1 -1
  17. package/dist/fieldset/Fieldset.svelte.d.ts +1 -1
  18. package/dist/focus-trap/FocusTrap.svelte +7 -14
  19. package/dist/focus-trap/FocusTrap.svelte.d.ts +3 -15
  20. package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
  21. package/dist/focus-trap/FocusTrapFeatures.js +15 -0
  22. package/dist/hooks/use-controllable.svelte.js +2 -1
  23. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  24. package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
  25. package/dist/hooks/use-event-listener.svelte.js +3 -1
  26. package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
  27. package/dist/hooks/use-root-containers.svelte.js +5 -5
  28. package/dist/hooks/use-tab-direction.svelte.js +1 -1
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.js +3 -0
  31. package/dist/input/Input.svelte +2 -2
  32. package/dist/input/Input.svelte.d.ts +5 -7
  33. package/dist/internal/FloatingProvider.svelte +12 -0
  34. package/dist/internal/{HoistFormFields.svelte.d.ts → FloatingProvider.svelte.d.ts} +5 -4
  35. package/dist/internal/FormFields.svelte +22 -19
  36. package/dist/internal/FormFieldsProvider.svelte +13 -0
  37. package/dist/internal/FormFieldsProvider.svelte.d.ts +21 -0
  38. package/dist/internal/Hidden.svelte +18 -8
  39. package/dist/internal/Hidden.svelte.d.ts +3 -6
  40. package/dist/internal/HiddenFeatures.d.ts +5 -0
  41. package/dist/internal/HiddenFeatures.js +9 -0
  42. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  43. package/dist/internal/floating-provider.svelte.js +206 -0
  44. package/dist/internal/floating.svelte.d.ts +48 -23
  45. package/dist/internal/floating.svelte.js +79 -260
  46. package/dist/internal/form-fields.svelte.d.ts +10 -0
  47. package/dist/internal/form-fields.svelte.js +23 -0
  48. package/dist/label/Label.svelte +5 -4
  49. package/dist/label/Label.svelte.d.ts +1 -1
  50. package/dist/label/context.svelte.js +1 -1
  51. package/dist/legend/Legend.svelte +2 -2
  52. package/dist/legend/Legend.svelte.d.ts +18 -30
  53. package/dist/listbox/Listbox.svelte +42 -66
  54. package/dist/listbox/Listbox.svelte.d.ts +6 -65
  55. package/dist/listbox/ListboxButton.svelte +10 -10
  56. package/dist/listbox/ListboxButton.svelte.d.ts +5 -7
  57. package/dist/listbox/ListboxOption.svelte +10 -6
  58. package/dist/listbox/ListboxOption.svelte.d.ts +1 -1
  59. package/dist/listbox/ListboxOptions.svelte +108 -54
  60. package/dist/listbox/ListboxOptions.svelte.d.ts +1 -1
  61. package/dist/listbox/ListboxSelectedOption.svelte +2 -4
  62. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +6 -6
  63. package/dist/listbox/context.svelte.d.ts +76 -0
  64. package/dist/listbox/context.svelte.js +36 -0
  65. package/dist/menu/Menu.svelte +5 -177
  66. package/dist/menu/Menu.svelte.d.ts +1 -1
  67. package/dist/menu/MenuButton.svelte +4 -2
  68. package/dist/menu/MenuButton.svelte.d.ts +1 -1
  69. package/dist/menu/MenuHeading.svelte.d.ts +1 -1
  70. package/dist/menu/MenuItem.svelte.d.ts +6 -5
  71. package/dist/menu/MenuItems.svelte +15 -11
  72. package/dist/menu/MenuItems.svelte.d.ts +1 -1
  73. package/dist/menu/MenuSection.svelte.d.ts +1 -1
  74. package/dist/menu/MenuSeparator.svelte.d.ts +1 -1
  75. package/dist/menu/context.svelte.d.ts +30 -1
  76. package/dist/menu/context.svelte.js +208 -0
  77. package/dist/popover/Popover.svelte +161 -0
  78. package/dist/popover/Popover.svelte.d.ts +41 -0
  79. package/dist/popover/PopoverBackdrop.svelte +56 -0
  80. package/dist/popover/PopoverBackdrop.svelte.d.ts +45 -0
  81. package/dist/popover/PopoverButton.svelte +246 -0
  82. package/dist/popover/PopoverButton.svelte.d.ts +46 -0
  83. package/dist/popover/PopoverGroup.svelte +43 -0
  84. package/dist/popover/PopoverGroup.svelte.d.ts +33 -0
  85. package/dist/popover/PopoverPanel.svelte +274 -0
  86. package/dist/popover/PopoverPanel.svelte.d.ts +53 -0
  87. package/dist/popover/context.svelte.d.ts +51 -0
  88. package/dist/popover/context.svelte.js +108 -0
  89. package/dist/popover/index.d.ts +5 -0
  90. package/dist/popover/index.js +5 -0
  91. package/dist/portal/InternalPortal.svelte.d.ts +1 -1
  92. package/dist/portal/PortalGroup.svelte.d.ts +1 -1
  93. package/dist/select/Select.svelte +74 -0
  94. package/dist/select/Select.svelte.d.ts +48 -0
  95. package/dist/select/index.d.ts +1 -0
  96. package/dist/select/index.js +1 -0
  97. package/dist/switch/Switch.svelte +30 -20
  98. package/dist/switch/Switch.svelte.d.ts +5 -5
  99. package/dist/switch/SwitchGroup.svelte.d.ts +1 -1
  100. package/dist/tabs/Tab.svelte.d.ts +1 -1
  101. package/dist/tabs/TabGroup.svelte.d.ts +2 -2
  102. package/dist/tabs/TabList.svelte.d.ts +1 -1
  103. package/dist/tabs/TabPanel.svelte.d.ts +1 -1
  104. package/dist/tabs/TabPanels.svelte.d.ts +1 -1
  105. package/dist/textarea/Textarea.svelte +67 -0
  106. package/dist/textarea/Textarea.svelte.d.ts +50 -0
  107. package/dist/textarea/index.d.ts +1 -0
  108. package/dist/textarea/index.js +1 -0
  109. package/dist/transition/InternalTransitionChild.svelte.d.ts +1 -1
  110. package/dist/transition/Transition.svelte.d.ts +1 -1
  111. package/dist/transition/TransitionChild.svelte.d.ts +1 -1
  112. package/dist/transition/context.svelte.js +2 -2
  113. package/dist/utils/ElementOrComponent.svelte +2 -2
  114. package/dist/utils/ElementOrComponent.svelte.d.ts +2 -2
  115. package/dist/utils/Generic.svelte +0 -1
  116. package/dist/utils/Generic.svelte.d.ts +1 -2
  117. package/dist/utils/alternative-types.d.ts +1 -2
  118. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +17 -0
  119. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +23 -0
  120. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
  121. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +41 -0
  122. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  123. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  124. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  125. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  126. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  127. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  128. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  129. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  130. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  131. package/dist/utils/floating-ui/svelte/index.js +5 -0
  132. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  133. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  134. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  135. package/dist/utils/floating-ui/svelte/types.js +1 -0
  136. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  137. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  138. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  139. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  140. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  141. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  142. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  143. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  144. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  145. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  146. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  147. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  148. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  149. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  150. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  151. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +182 -0
  152. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  153. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  154. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  155. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  156. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  157. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  158. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  159. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  160. package/dist/utils/id.d.ts +1 -1
  161. package/dist/utils/id.js +1 -1
  162. package/dist/utils/style.d.ts +2 -0
  163. package/dist/utils/style.js +6 -0
  164. package/dist/utils/types.d.ts +1 -2
  165. package/package.json +25 -24
  166. package/dist/internal/HoistFormFields.svelte +0 -11
  167. package/dist/internal/id.d.ts +0 -8
  168. package/dist/internal/id.js +0 -11
@@ -0,0 +1,274 @@
1
+ <script lang="ts" module>import { RenderFeatures } from "../utils/render.js";
2
+ const DEFAULT_PANEL_TAG = "div";
3
+ const PanelRenderFeatures = RenderFeatures.RenderStrategy | RenderFeatures.Static;
4
+ </script>
5
+
6
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_PANEL_TAG">import { useId } from "../hooks/use-id.js";
7
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte";
8
+ import { mergeProps } from "../utils/render.js";
9
+ import {
10
+ useFloatingPanel,
11
+ useFloatingPanelProps,
12
+ useResolvedAnchor
13
+ } from "../internal/floating.svelte.js";
14
+ import {
15
+ PopoverStates,
16
+ usePopoverAPIContext,
17
+ usePopoverContext
18
+ } from "./context.svelte.js";
19
+ import { getOwnerDocument } from "../utils/owner.js";
20
+ import { clearOpenClosedContext, State, useOpenClosed } from "../internal/open-closed.js";
21
+ import { transitionDataAttributes, useTransition } from "../hooks/use-transition.svelte.js";
22
+ import { useOnDisappear } from "../hooks/use-on-disappear.svelte.js";
23
+ import { useScrollLock } from "../hooks/use-scroll-lock.svelte.js";
24
+ import { Focus, focusIn, FocusResult, getFocusableElements } from "../utils/focus-management.js";
25
+ import { useElementSize } from "../hooks/use-element-size.svelte.js";
26
+ import { useTabDirection, Direction as TabDirection } from "../hooks/use-tab-direction.svelte.js";
27
+ import { match } from "../utils/match.js";
28
+ import { microTask } from "../utils/microTask.js";
29
+ import { setContext, untrack } from "svelte";
30
+ import Portal from "../portal/Portal.svelte";
31
+ import Hidden, { HiddenFeatures } from "../internal/Hidden.svelte";
32
+ let internalId = useId();
33
+ let {
34
+ ref = $bindable(),
35
+ id = `headlessui-popover-panel-${internalId}`,
36
+ focus = false,
37
+ anchor: rawAnchor,
38
+ portal: theirPortal = false,
39
+ modal = false,
40
+ transition = false,
41
+ ...theirProps
42
+ } = $props();
43
+ const context = usePopoverContext("PopoverPanel");
44
+ const api = usePopoverAPIContext("PopoverPanel");
45
+ const { close, isPortalled } = $derived(api);
46
+ const beforePanelSentinelId = `headlessui-focus-sentinel-before-${internalId}`;
47
+ const afterPanelSentinelId = `headlessui-focus-sentinel-after-${internalId}`;
48
+ const resolvedAnchor = useResolvedAnchor({
49
+ get anchor() {
50
+ return rawAnchor;
51
+ }
52
+ });
53
+ const { anchor } = $derived(resolvedAnchor);
54
+ const floatingPanel = useFloatingPanel({
55
+ get placement() {
56
+ return anchor;
57
+ }
58
+ });
59
+ const { setFloating, styles } = $derived(floatingPanel);
60
+ const getFloatingPanelProps = useFloatingPanelProps();
61
+ const portal = $derived(!!anchor || theirPortal);
62
+ $effect(() => {
63
+ if (anchor) setFloating(ref ?? null);
64
+ untrack(() => context.setPanel(ref));
65
+ });
66
+ const ownerDocument = $derived(getOwnerDocument(ref));
67
+ $effect(() => {
68
+ id;
69
+ return untrack(() => {
70
+ context.setPanelId(id);
71
+ return () => {
72
+ context.setPanelId(void 0);
73
+ };
74
+ });
75
+ });
76
+ const usesOpenClosedState = useOpenClosed();
77
+ const _transition = useTransition({
78
+ get enabled() {
79
+ return transition;
80
+ },
81
+ get element() {
82
+ return ref;
83
+ },
84
+ get show() {
85
+ return usesOpenClosedState !== null ? (usesOpenClosedState.value & State.Open) === State.Open : context.popoverState === PopoverStates.Open;
86
+ }
87
+ });
88
+ const { visible, data: transitionData } = $derived(_transition);
89
+ useOnDisappear({
90
+ get enabled() {
91
+ return visible;
92
+ },
93
+ get ref() {
94
+ return context.button;
95
+ },
96
+ ondisappear: () => {
97
+ context.closePopover();
98
+ }
99
+ });
100
+ const scrollLockEnabled = $derived(context.__demoMode ? false : modal && visible);
101
+ useScrollLock({
102
+ get enabled() {
103
+ return scrollLockEnabled;
104
+ },
105
+ get ownerDocument() {
106
+ return ownerDocument;
107
+ }
108
+ });
109
+ const handleKeyDown = (event) => {
110
+ switch (event.key) {
111
+ case "Escape":
112
+ if (context.popoverState !== PopoverStates.Open) return;
113
+ if (!ref) return;
114
+ if (ownerDocument?.activeElement && !ref.contains(ownerDocument.activeElement)) {
115
+ return;
116
+ }
117
+ event.preventDefault();
118
+ event.stopPropagation();
119
+ context.closePopover();
120
+ context.button?.focus();
121
+ break;
122
+ }
123
+ };
124
+ $effect(() => {
125
+ if (theirProps.static) return;
126
+ if (context.popoverState === PopoverStates.Closed && (theirProps.unmount ?? true)) {
127
+ context.setPanel(void 0);
128
+ }
129
+ });
130
+ $effect(() => {
131
+ if (context.__demoMode) return;
132
+ if (!focus) return;
133
+ if (context.popoverState !== PopoverStates.Open) return;
134
+ if (!ref) return;
135
+ const activeElement = ownerDocument?.activeElement;
136
+ if (ref.contains(activeElement)) return;
137
+ focusIn(ref, Focus.First);
138
+ });
139
+ const slot = $derived({
140
+ open: context.popoverState === PopoverStates.Open,
141
+ close
142
+ });
143
+ const buttonSize = useElementSize({
144
+ get element() {
145
+ return context.button ?? null;
146
+ },
147
+ unit: true
148
+ });
149
+ const ourProps = $derived(
150
+ mergeProps(anchor ? getFloatingPanelProps() : {}, {
151
+ id,
152
+ onkeydown: handleKeyDown,
153
+ onblur: focus && context.popoverState === PopoverStates.Open ? (event) => {
154
+ let el = event.relatedTarget;
155
+ if (!el) return;
156
+ if (!ref) return;
157
+ if (ref.contains(el)) return;
158
+ context.closePopover();
159
+ if (context.beforePanelSentinel?.contains?.(el) || context.afterPanelSentinel?.contains?.(el)) {
160
+ el.focus({ preventScroll: true });
161
+ }
162
+ } : void 0,
163
+ tabIndex: -1,
164
+ style: [theirProps.style, styles, `--button-width: ${buttonSize.width}`].filter(Boolean).join("; "),
165
+ ...transitionDataAttributes(transitionData)
166
+ })
167
+ );
168
+ const direction = useTabDirection();
169
+ const handleBeforeFocus = () => {
170
+ let el = ref;
171
+ if (!el) return;
172
+ function run() {
173
+ match(direction.current, {
174
+ [TabDirection.Forwards]: () => {
175
+ let result = focusIn(el, Focus.First);
176
+ if (result === FocusResult.Error) {
177
+ context.afterPanelSentinel?.focus();
178
+ }
179
+ },
180
+ [TabDirection.Backwards]: () => {
181
+ context.button?.focus({ preventScroll: true });
182
+ }
183
+ });
184
+ }
185
+ if (process.env.NODE_ENV === "test") {
186
+ microTask(run);
187
+ } else {
188
+ run();
189
+ }
190
+ };
191
+ const handleAfterFocus = () => {
192
+ let el = ref;
193
+ if (!el) return;
194
+ function run() {
195
+ match(direction.current, {
196
+ [TabDirection.Forwards]: () => {
197
+ if (!context.button) return;
198
+ const elements = getFocusableElements();
199
+ const idx = elements.indexOf(context.button);
200
+ const before = elements.slice(0, idx + 1);
201
+ const after = elements.slice(idx + 1);
202
+ const combined = [...after, ...before];
203
+ for (const element of combined.slice()) {
204
+ if (element.dataset.headlessuiFocusGuard === "true" || ref?.contains(element)) {
205
+ let idx2 = combined.indexOf(element);
206
+ if (idx2 !== -1) combined.splice(idx2, 1);
207
+ }
208
+ }
209
+ focusIn(combined, Focus.First, { sorted: false });
210
+ },
211
+ [TabDirection.Backwards]: () => {
212
+ let result = focusIn(el, Focus.Previous);
213
+ if (result === FocusResult.Error) {
214
+ context.button?.focus();
215
+ }
216
+ }
217
+ });
218
+ }
219
+ if (process.env.NODE_ENV === "test") {
220
+ microTask(run);
221
+ } else {
222
+ run();
223
+ }
224
+ };
225
+ clearOpenClosedContext();
226
+ setContext("PopoverPanelContext", {
227
+ get value() {
228
+ return id;
229
+ }
230
+ });
231
+ setContext("PopoverAPIContext", {
232
+ get close() {
233
+ return close;
234
+ },
235
+ get isPortalled() {
236
+ return isPortalled;
237
+ }
238
+ });
239
+ </script>
240
+
241
+ <Portal enabled={portal ? theirProps.static || visible : false}>
242
+ {#if visible && isPortalled}
243
+ <Hidden
244
+ id={beforePanelSentinelId}
245
+ bind:ref={context.beforePanelSentinel as HTMLElement}
246
+ features={HiddenFeatures.Focusable}
247
+ data-headlessui-focus-guard
248
+ as="button"
249
+ type="button"
250
+ onfocus={handleBeforeFocus}
251
+ />
252
+ {/if}
253
+ <ElementOrComponent
254
+ {ourProps}
255
+ {theirProps}
256
+ slots={slot}
257
+ defaultTag={DEFAULT_PANEL_TAG}
258
+ features={PanelRenderFeatures}
259
+ {visible}
260
+ name="PopoverPanel"
261
+ bind:ref
262
+ />
263
+ {#if visible && isPortalled}
264
+ <Hidden
265
+ id={afterPanelSentinelId}
266
+ bind:ref={context.afterPanelSentinel as HTMLElement}
267
+ features={HiddenFeatures.Focusable}
268
+ data-headlessui-focus-guard
269
+ as="button"
270
+ type="button"
271
+ onfocus={handleAfterFocus}
272
+ />
273
+ {/if}
274
+ </Portal>
@@ -0,0 +1,53 @@
1
+ import type { ElementType, Props, PropsOf } from "../utils/types.js";
2
+ declare const DEFAULT_PANEL_TAG: "div";
3
+ type PanelRenderPropArg = {
4
+ open: boolean;
5
+ close: (focusableElement?: HTMLElement) => void;
6
+ };
7
+ type PanelPropsWeControl = "tabIndex";
8
+ export type PopoverPanelProps<TTag extends ElementType = typeof DEFAULT_PANEL_TAG> = Props<TTag, PanelRenderPropArg, PanelPropsWeControl, {
9
+ focus?: boolean;
10
+ anchor?: AnchorProps;
11
+ portal?: boolean;
12
+ modal?: boolean;
13
+ transition?: boolean;
14
+ static?: boolean;
15
+ unmount?: boolean;
16
+ }>;
17
+ import { type AnchorProps } from "../internal/floating.svelte.js";
18
+ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_PANEL_TAG> {
19
+ props(): {
20
+ as?: TTag | undefined;
21
+ } & (Exclude<keyof PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "focus" | "anchor" | "unmount" | "static" | "tabIndex" | "transition" | "portal" | "modal"> extends infer T extends keyof PropsOf<TTag> ? { [P in T]: PropsOf<TTag>[P]; } : never) & {
22
+ children?: import("svelte").Snippet<[PanelRenderPropArg, Record<string, any>]> | undefined;
23
+ ref?: HTMLElement;
24
+ } & (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) ? {
25
+ class?: PropsOf<TTag>["class"] | ((bag: PanelRenderPropArg) => string) | undefined;
26
+ } : {}) & {
27
+ focus?: boolean;
28
+ anchor?: AnchorProps;
29
+ portal?: boolean;
30
+ modal?: boolean;
31
+ transition?: boolean;
32
+ static?: boolean;
33
+ unmount?: boolean;
34
+ };
35
+ events(): {} & {
36
+ [evt: string]: CustomEvent<any>;
37
+ };
38
+ slots(): {};
39
+ bindings(): "ref";
40
+ exports(): {};
41
+ }
42
+ interface $$IsomorphicComponent {
43
+ new <TTag extends ElementType = typeof DEFAULT_PANEL_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']>> & {
44
+ $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
45
+ } & ReturnType<__sveltets_Render<TTag>['exports']>;
46
+ <TTag extends ElementType = typeof DEFAULT_PANEL_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
47
+ $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
48
+ }): ReturnType<__sveltets_Render<TTag>['exports']>;
49
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
50
+ }
51
+ declare const PopoverPanel: $$IsomorphicComponent;
52
+ type PopoverPanel<TTag extends ElementType = typeof DEFAULT_PANEL_TAG> = InstanceType<typeof PopoverPanel<TTag>>;
53
+ export default PopoverPanel;
@@ -0,0 +1,51 @@
1
+ import type { MouseEventHandler } from "svelte/elements";
2
+ export type MouseEvent<T extends EventTarget> = Parameters<MouseEventHandler<T>>[0];
3
+ export declare enum PopoverStates {
4
+ Open = 0,
5
+ Closed = 1
6
+ }
7
+ export interface StateDefinition {
8
+ popoverState: PopoverStates;
9
+ buttons: symbol[];
10
+ button?: HTMLElement;
11
+ buttonId?: string;
12
+ panel?: HTMLElement;
13
+ panelId?: string;
14
+ beforePanelSentinel?: HTMLButtonElement;
15
+ afterPanelSentinel?: HTMLButtonElement;
16
+ afterButtonSentinel?: HTMLButtonElement;
17
+ __demoMode: boolean;
18
+ }
19
+ interface ActionDefinition {
20
+ togglePopover(): void;
21
+ closePopover(): void;
22
+ setButton(button: HTMLElement): void;
23
+ setButtonId(buttonId: string | undefined): void;
24
+ setPanel(panel?: HTMLElement): void;
25
+ setPanelId(panelId?: string): void;
26
+ }
27
+ export type PopoverContext = StateDefinition & ActionDefinition;
28
+ export declare const createPopoverContext: (initialState: StateDefinition) => PopoverContext;
29
+ export declare function usePopoverContext(component: string): PopoverContext;
30
+ export type PopoverAPIContext = {
31
+ close(focusableElement?: HTMLElement | MouseEvent<HTMLElement>): void;
32
+ isPortalled: boolean;
33
+ };
34
+ export declare function usePopoverAPIContext(component: string): PopoverAPIContext;
35
+ export type PopoverGroupContext = {
36
+ registerPopover(registerBag: PopoverRegisterBag): void;
37
+ unregisterPopover(registerBag: PopoverRegisterBag): void;
38
+ isFocusWithinPopoverGroup(): boolean;
39
+ closeOthers(buttonId: string): void;
40
+ };
41
+ export declare function usePopoverGroupContext(): PopoverGroupContext | undefined;
42
+ export type PopoverPanelContext = {
43
+ value: string;
44
+ };
45
+ export declare function usePopoverPanelContext(): PopoverPanelContext | undefined;
46
+ export interface PopoverRegisterBag {
47
+ buttonId?: string;
48
+ panelId?: string;
49
+ close(): void;
50
+ }
51
+ export {};
@@ -0,0 +1,108 @@
1
+ import { getContext, setContext } from "svelte";
2
+ export var PopoverStates;
3
+ (function (PopoverStates) {
4
+ PopoverStates[PopoverStates["Open"] = 0] = "Open";
5
+ PopoverStates[PopoverStates["Closed"] = 1] = "Closed";
6
+ })(PopoverStates || (PopoverStates = {}));
7
+ export const createPopoverContext = (initialState) => {
8
+ const _state = $state(initialState);
9
+ const context = {
10
+ get popoverState() {
11
+ return _state.popoverState;
12
+ },
13
+ get buttons() {
14
+ return _state.buttons;
15
+ },
16
+ get button() {
17
+ return _state.button;
18
+ },
19
+ get buttonId() {
20
+ return _state.buttonId;
21
+ },
22
+ get panel() {
23
+ return _state.panel;
24
+ },
25
+ get panelId() {
26
+ return _state.panelId;
27
+ },
28
+ get beforePanelSentinel() {
29
+ return _state.beforePanelSentinel;
30
+ },
31
+ set beforePanelSentinel(value) {
32
+ _state.beforePanelSentinel = value;
33
+ },
34
+ get afterPanelSentinel() {
35
+ return _state.afterPanelSentinel;
36
+ },
37
+ set afterPanelSentinel(value) {
38
+ _state.afterPanelSentinel = value;
39
+ },
40
+ get afterButtonSentinel() {
41
+ return _state.afterButtonSentinel;
42
+ },
43
+ set afterButtonSentinel(value) {
44
+ _state.afterButtonSentinel = value;
45
+ },
46
+ get __demoMode() {
47
+ return _state.__demoMode;
48
+ },
49
+ togglePopover() {
50
+ _state.__demoMode = false;
51
+ _state.popoverState = _state.popoverState === PopoverStates.Closed ? PopoverStates.Open : PopoverStates.Closed;
52
+ },
53
+ closePopover() {
54
+ if (_state.popoverState === PopoverStates.Closed)
55
+ return;
56
+ _state.__demoMode = false;
57
+ _state.popoverState = PopoverStates.Closed;
58
+ },
59
+ setButton(button) {
60
+ if (_state.button === button)
61
+ return;
62
+ _state.button = button;
63
+ },
64
+ setButtonId(buttonId) {
65
+ if (_state.buttonId === buttonId)
66
+ return;
67
+ _state.buttonId = buttonId;
68
+ },
69
+ setPanel(panel) {
70
+ if (_state.panel === panel)
71
+ return;
72
+ _state.panel = panel;
73
+ },
74
+ setPanelId(panelId) {
75
+ if (_state.panelId === panelId)
76
+ return;
77
+ _state.panelId = panelId;
78
+ },
79
+ };
80
+ setContext("PopoverContext", context);
81
+ return context;
82
+ };
83
+ export function usePopoverContext(component) {
84
+ const context = getContext("PopoverContext");
85
+ if (!context) {
86
+ const err = new Error(`<${component} /> is missing a parent <Popover /> component.`);
87
+ if (Error.captureStackTrace)
88
+ Error.captureStackTrace(err, usePopoverContext);
89
+ throw err;
90
+ }
91
+ return context;
92
+ }
93
+ export function usePopoverAPIContext(component) {
94
+ const context = getContext("PopoverAPIContext");
95
+ if (!context) {
96
+ const err = new Error(`<${component} /> is missing a parent <Popover /> component.`);
97
+ if (Error.captureStackTrace)
98
+ Error.captureStackTrace(err, usePopoverAPIContext);
99
+ throw err;
100
+ }
101
+ return context;
102
+ }
103
+ export function usePopoverGroupContext() {
104
+ return getContext("PopoverGroupContext");
105
+ }
106
+ export function usePopoverPanelContext() {
107
+ return getContext("PopoverPanelContext");
108
+ }
@@ -0,0 +1,5 @@
1
+ export { default as Popover, type PopoverProps } from "./Popover.svelte";
2
+ export { default as PopoverBackdrop, type PopoverBackdropProps } from "./PopoverBackdrop.svelte";
3
+ export { default as PopoverButton, type PopoverButtonProps } from "./PopoverButton.svelte";
4
+ export { default as PopoverGroup, type PopoverGroupProps } from "./PopoverGroup.svelte";
5
+ export { default as PopoverPanel, type PopoverPanelProps } from "./PopoverPanel.svelte";
@@ -0,0 +1,5 @@
1
+ export { default as Popover } from "./Popover.svelte";
2
+ export { default as PopoverBackdrop } from "./PopoverBackdrop.svelte";
3
+ export { default as PopoverButton } from "./PopoverButton.svelte";
4
+ export { default as PopoverGroup } from "./PopoverGroup.svelte";
5
+ export { default as PopoverPanel } from "./PopoverPanel.svelte";
@@ -15,7 +15,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_PORTAL
15
15
  props(): {
16
16
  as?: TTag | undefined;
17
17
  } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "enabled"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
18
- children?: import("../utils/types.js").Children<PortalRenderPropArg> | undefined;
18
+ children?: import("svelte").Snippet<[PortalRenderPropArg, Record<string, any>]> | undefined;
19
19
  ref?: HTMLElement;
20
20
  } & (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) ? {
21
21
  class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: PortalRenderPropArg) => string) | undefined;
@@ -12,7 +12,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_GROUP_
12
12
  props(): {
13
13
  as?: TTag | undefined;
14
14
  } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "target"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
15
- children?: import("../utils/types.js").Children<GroupRenderPropArg> | undefined;
15
+ children?: import("svelte").Snippet<[GroupRenderPropArg, Record<string, any>]> | undefined;
16
16
  ref?: HTMLElement;
17
17
  } & (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) ? {
18
18
  class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: GroupRenderPropArg) => string) | undefined;
@@ -0,0 +1,74 @@
1
+ <script lang="ts" module>let DEFAULT_SELECT_TAG = "select";
2
+ </script>
3
+
4
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_SELECT_TAG">import { useId } from "../hooks/use-id.js";
5
+ import { useProvidedId } from "../utils/id.js";
6
+ import { useDisabled } from "../hooks/use-disabled.js";
7
+ import { useFocusRing } from "../hooks/use-focus-ring.svelte.js";
8
+ import { useHover } from "../hooks/use-hover.svelte.js";
9
+ import { useActivePress } from "../hooks/use-active-press.svelte.js";
10
+ import { useLabelledBy } from "../label/context.svelte.js";
11
+ import { useDescribedBy } from "../description/context.svelte.js";
12
+ import { mergeProps } from "../utils/render.js";
13
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte";
14
+ const internalId = useId();
15
+ const providedId = useProvidedId();
16
+ const providedDisabled = useDisabled();
17
+ let {
18
+ ref = $bindable(),
19
+ id = providedId || `headlessui-select-${internalId}`,
20
+ disabled: theirDisabled = false,
21
+ invalid = false,
22
+ autofocus = false,
23
+ ...theirProps
24
+ } = $props();
25
+ const disabled = $derived(providedDisabled?.value ?? theirDisabled);
26
+ const labelledBy = useLabelledBy();
27
+ const describedBy = useDescribedBy();
28
+ const { isFocusVisible: focus, focusProps } = $derived(
29
+ useFocusRing({
30
+ get autofocus() {
31
+ return autofocus;
32
+ }
33
+ })
34
+ );
35
+ const { isHovered: hover, hoverProps } = $derived(
36
+ useHover({
37
+ get disabled() {
38
+ return disabled;
39
+ }
40
+ })
41
+ );
42
+ const { pressed: active, pressProps } = $derived(
43
+ useActivePress({
44
+ get disabled() {
45
+ return disabled;
46
+ }
47
+ })
48
+ );
49
+ const ourProps = $derived(
50
+ mergeProps(
51
+ {
52
+ id,
53
+ "aria-labelledby": labelledBy.value,
54
+ "aria-describedby": describedBy.value,
55
+ "aria-invalid": invalid ? "" : void 0,
56
+ disabled: disabled || void 0,
57
+ autofocus
58
+ },
59
+ focusProps,
60
+ hoverProps,
61
+ pressProps
62
+ )
63
+ );
64
+ const slot = $derived({
65
+ disabled,
66
+ invalid,
67
+ hover,
68
+ focus,
69
+ active,
70
+ autofocus
71
+ });
72
+ </script>
73
+
74
+ <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_SELECT_TAG} name="Select" bind:ref />
@@ -0,0 +1,48 @@
1
+ import type { ElementType, Props, PropsOf } from "../utils/types.js";
2
+ declare let DEFAULT_SELECT_TAG: "select";
3
+ type SelectRenderPropArg = {
4
+ disabled: boolean;
5
+ hover: boolean;
6
+ focus: boolean;
7
+ active: boolean;
8
+ autofocus: boolean;
9
+ invalid: boolean;
10
+ };
11
+ type SelectPropsWeControl = "aria-labelledby" | "aria-describedby";
12
+ export type SelectProps<TTag extends ElementType = typeof DEFAULT_SELECT_TAG> = Props<TTag, SelectRenderPropArg, SelectPropsWeControl, {
13
+ disabled?: boolean;
14
+ invalid?: boolean;
15
+ autofocus?: boolean;
16
+ }>;
17
+ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_SELECT_TAG> {
18
+ props(): {
19
+ as?: TTag | undefined;
20
+ } & (Exclude<keyof PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "invalid" | "disabled" | "autofocus" | SelectPropsWeControl> extends infer T extends keyof PropsOf<TTag> ? { [P in T]: PropsOf<TTag>[P]; } : never) & {
21
+ children?: import("svelte").Snippet<[SelectRenderPropArg, Record<string, any>]> | undefined;
22
+ ref?: HTMLElement;
23
+ } & (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) ? {
24
+ class?: PropsOf<TTag>["class"] | ((bag: SelectRenderPropArg) => string) | undefined;
25
+ } : {}) & {
26
+ disabled?: boolean;
27
+ invalid?: boolean;
28
+ autofocus?: boolean;
29
+ };
30
+ events(): {} & {
31
+ [evt: string]: CustomEvent<any>;
32
+ };
33
+ slots(): {};
34
+ bindings(): "ref";
35
+ exports(): {};
36
+ }
37
+ interface $$IsomorphicComponent {
38
+ new <TTag extends ElementType = typeof DEFAULT_SELECT_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']>> & {
39
+ $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
40
+ } & ReturnType<__sveltets_Render<TTag>['exports']>;
41
+ <TTag extends ElementType = typeof DEFAULT_SELECT_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
42
+ $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
43
+ }): ReturnType<__sveltets_Render<TTag>['exports']>;
44
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
45
+ }
46
+ declare const Select: $$IsomorphicComponent;
47
+ type Select<TTag extends ElementType = typeof DEFAULT_SELECT_TAG> = InstanceType<typeof Select<TTag>>;
48
+ export default Select;
@@ -0,0 +1 @@
1
+ export { default as Select, type SelectProps } from "./Select.svelte";
@@ -0,0 +1 @@
1
+ export { default as Select } from "./Select.svelte";