@pzerelles/headlessui-svelte 2.1.2-next.3 → 2.1.2-next.31
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.
- package/dist/button/Button.svelte +1 -1
- package/dist/button/Button.svelte.d.ts +9 -11
- package/dist/checkbox/Checkbox.svelte +4 -4
- package/dist/checkbox/Checkbox.svelte.d.ts +10 -14
- package/dist/close-button/CloseButton.svelte.d.ts +16 -18
- package/dist/data-interactive/DataInteractive.svelte.d.ts +8 -11
- package/dist/description/Description.svelte +19 -14
- package/dist/description/Description.svelte.d.ts +9 -11
- package/dist/description/context.svelte.js +14 -16
- package/dist/dialog/Dialog.svelte +245 -17
- package/dist/dialog/Dialog.svelte.d.ts +12 -14
- package/dist/dialog/DialogBackdrop.svelte +1 -1
- package/dist/dialog/DialogBackdrop.svelte.d.ts +9 -11
- package/dist/dialog/DialogPanel.svelte +1 -2
- package/dist/dialog/DialogPanel.svelte.d.ts +9 -11
- package/dist/dialog/DialogTitle.svelte.d.ts +8 -10
- package/dist/dialog/context.svelte.js +1 -1
- package/dist/field/Field.svelte +24 -12
- package/dist/field/Field.svelte.d.ts +9 -11
- package/dist/fieldset/Fieldset.svelte +1 -1
- package/dist/fieldset/Fieldset.svelte.d.ts +9 -11
- package/dist/focus-trap/FocusTrap.svelte +7 -14
- package/dist/focus-trap/FocusTrap.svelte.d.ts +11 -25
- package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
- package/dist/focus-trap/FocusTrapFeatures.js +15 -0
- package/dist/hooks/use-controllable.svelte.js +2 -1
- package/dist/hooks/use-did-element-move.svelte.js +5 -10
- package/dist/hooks/use-disabled.d.ts +6 -1
- package/dist/hooks/use-disabled.js +10 -5
- package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
- package/dist/hooks/use-event-listener.svelte.js +3 -1
- package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
- package/dist/hooks/use-root-containers.svelte.js +5 -5
- package/dist/hooks/use-tab-direction.svelte.js +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/input/Input.svelte +3 -3
- package/dist/input/Input.svelte.d.ts +10 -14
- package/dist/internal/FloatingProvider.svelte +12 -0
- package/dist/internal/FloatingProvider.svelte.d.ts +6 -0
- package/dist/internal/FocusSentinel.svelte.d.ts +2 -18
- package/dist/internal/ForcePortalRoot.svelte.d.ts +2 -18
- package/dist/internal/FormFields.svelte +22 -19
- package/dist/internal/FormFields.svelte.d.ts +2 -18
- package/dist/internal/FormFieldsProvider.svelte +13 -0
- package/dist/internal/FormFieldsProvider.svelte.d.ts +5 -0
- package/dist/internal/FormResolver.svelte.d.ts +2 -18
- package/dist/internal/Hidden.svelte +18 -8
- package/dist/internal/Hidden.svelte.d.ts +11 -16
- package/dist/internal/HiddenFeatures.d.ts +5 -0
- package/dist/internal/HiddenFeatures.js +9 -0
- package/dist/internal/MainTreeProvider.svelte.d.ts +2 -18
- package/dist/internal/Portal.svelte.d.ts +2 -18
- package/dist/internal/floating-provider.svelte.d.ts +3 -0
- package/dist/internal/floating-provider.svelte.js +206 -0
- package/dist/internal/floating.svelte.d.ts +46 -22
- package/dist/internal/floating.svelte.js +90 -272
- package/dist/internal/form-fields.svelte.d.ts +10 -0
- package/dist/internal/form-fields.svelte.js +23 -0
- package/dist/label/Label.svelte +6 -5
- package/dist/label/Label.svelte.d.ts +9 -11
- package/dist/label/context.svelte.js +1 -1
- package/dist/legend/Legend.svelte +2 -2
- package/dist/legend/Legend.svelte.d.ts +4 -32
- package/dist/listbox/Listbox.svelte +47 -68
- package/dist/listbox/Listbox.svelte.d.ts +18 -80
- package/dist/listbox/ListboxButton.svelte +10 -10
- package/dist/listbox/ListboxButton.svelte.d.ts +10 -15
- package/dist/listbox/ListboxOption.svelte +10 -6
- package/dist/listbox/ListboxOption.svelte.d.ts +9 -12
- package/dist/listbox/ListboxOptions.svelte +108 -54
- package/dist/listbox/ListboxOptions.svelte.d.ts +9 -12
- package/dist/listbox/ListboxSelectedOption.svelte +2 -4
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -16
- package/dist/listbox/context.svelte.d.ts +76 -0
- package/dist/listbox/context.svelte.js +36 -0
- package/dist/listbox/index.d.ts +4 -4
- package/dist/listbox/index.js +1 -1
- package/dist/menu/Menu.svelte +13 -191
- package/dist/menu/Menu.svelte.d.ts +9 -13
- package/dist/menu/MenuButton.svelte +4 -2
- package/dist/menu/MenuButton.svelte.d.ts +9 -12
- package/dist/menu/MenuHeading.svelte.d.ts +9 -12
- package/dist/menu/MenuItem.svelte.d.ts +11 -16
- package/dist/menu/MenuItems.svelte +15 -11
- package/dist/menu/MenuItems.svelte.d.ts +9 -12
- package/dist/menu/MenuSection.svelte.d.ts +8 -11
- package/dist/menu/MenuSeparator.svelte.d.ts +8 -12
- package/dist/menu/context.svelte.d.ts +2 -1
- package/dist/menu/context.svelte.js +212 -2
- package/dist/menu/index.d.ts +7 -7
- package/dist/popover/Popover.svelte +161 -0
- package/dist/popover/Popover.svelte.d.ts +39 -0
- package/dist/popover/PopoverBackdrop.svelte +56 -0
- package/dist/popover/PopoverBackdrop.svelte.d.ts +43 -0
- package/dist/popover/PopoverButton.svelte +246 -0
- package/dist/popover/PopoverButton.svelte.d.ts +42 -0
- package/dist/popover/PopoverGroup.svelte +43 -0
- package/dist/popover/PopoverGroup.svelte.d.ts +31 -0
- package/dist/popover/PopoverPanel.svelte +274 -0
- package/dist/popover/PopoverPanel.svelte.d.ts +51 -0
- package/dist/popover/context.svelte.d.ts +51 -0
- package/dist/popover/context.svelte.js +108 -0
- package/dist/popover/index.d.ts +5 -0
- package/dist/popover/index.js +5 -0
- package/dist/portal/InternalPortal.svelte.d.ts +9 -11
- package/dist/portal/Portal.svelte.d.ts +2 -6
- package/dist/portal/PortalGroup.svelte.d.ts +9 -11
- package/dist/select/Select.svelte +74 -0
- package/dist/select/Select.svelte.d.ts +46 -0
- package/dist/select/index.d.ts +1 -0
- package/dist/select/index.js +1 -0
- package/dist/switch/Switch.svelte +30 -20
- package/dist/switch/Switch.svelte.d.ts +10 -12
- package/dist/switch/SwitchGroup.svelte.d.ts +8 -10
- package/dist/tabs/Tab.svelte +8 -9
- package/dist/tabs/Tab.svelte.d.ts +9 -11
- package/dist/tabs/TabGroup.svelte +27 -190
- package/dist/tabs/TabGroup.svelte.d.ts +9 -31
- package/dist/tabs/TabList.svelte +4 -4
- package/dist/tabs/TabList.svelte.d.ts +8 -10
- package/dist/tabs/TabPanel.svelte +4 -5
- package/dist/tabs/TabPanel.svelte.d.ts +9 -11
- package/dist/tabs/TabPanels.svelte +3 -3
- package/dist/tabs/TabPanels.svelte.d.ts +8 -10
- package/dist/tabs/context.svelte.d.ts +31 -0
- package/dist/tabs/context.svelte.js +134 -0
- package/dist/textarea/Textarea.svelte +4 -4
- package/dist/textarea/Textarea.svelte.d.ts +21 -20
- package/dist/transition/InternalTransitionChild.svelte.d.ts +9 -11
- package/dist/transition/Transition.svelte.d.ts +9 -11
- package/dist/transition/TransitionChild.svelte.d.ts +9 -11
- package/dist/transition/context.svelte.js +2 -2
- package/dist/utils/DisabledProvider.svelte +6 -0
- package/dist/utils/DisabledProvider.svelte.d.ts +6 -0
- package/dist/utils/ElementOrComponent.svelte +2 -2
- package/dist/utils/ElementOrComponent.svelte.d.ts +12 -11
- package/dist/utils/Generic.svelte +10 -8
- package/dist/utils/Generic.svelte.d.ts +12 -15
- package/dist/utils/StableCollection.svelte.d.ts +2 -18
- package/dist/utils/alternative-types.d.ts +1 -2
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +17 -0
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +7 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +25 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
- package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
- package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
- package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
- package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
- package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
- package/dist/utils/floating-ui/svelte/index.js +5 -0
- package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
- package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
- package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
- package/dist/utils/floating-ui/svelte/types.js +1 -0
- package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
- package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
- package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
- package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
- package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
- package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
- package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
- package/dist/utils/floating-ui/svelte/utils.js +136 -0
- package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
- package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
- package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
- package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
- package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
- package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
- package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
- package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +182 -0
- package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
- package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
- package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
- package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
- package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
- package/dist/utils/id.d.ts +1 -1
- package/dist/utils/id.js +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/style.d.ts +2 -0
- package/dist/utils/style.js +6 -0
- package/dist/utils/types.d.ts +9 -13
- package/package.json +27 -26
- package/dist/dialog/InternalDialog.svelte +0 -233
- package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
- package/dist/internal/HoistFormFields.svelte +0 -11
- package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
- package/dist/internal/id.d.ts +0 -8
- package/dist/internal/id.js +0 -11
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
<script lang="ts" module>const DEFAULT_BUTTON_TAG = "button";
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_BUTTON_TAG">import { useId } from "../hooks/use-id.js";
|
|
5
|
+
import {
|
|
6
|
+
PopoverStates,
|
|
7
|
+
usePopoverAPIContext,
|
|
8
|
+
usePopoverContext,
|
|
9
|
+
usePopoverGroupContext,
|
|
10
|
+
usePopoverPanelContext
|
|
11
|
+
} from "./context.svelte.js";
|
|
12
|
+
import { useFloatingReference } from "../internal/floating.svelte.js";
|
|
13
|
+
import { untrack } from "svelte";
|
|
14
|
+
import { getOwnerDocument } from "../utils/owner.js";
|
|
15
|
+
import { useFocusRing } from "../hooks/use-focus-ring.svelte.js";
|
|
16
|
+
import { useHover } from "../hooks/use-hover.svelte.js";
|
|
17
|
+
import { useActivePress } from "../hooks/use-active-press.svelte.js";
|
|
18
|
+
import { useResolveButtonType } from "../hooks/use-resolve-button-type.svelte.js";
|
|
19
|
+
import { mergeProps } from "../utils/render.js";
|
|
20
|
+
import { useTabDirection, Direction as TabDirection } from "../hooks/use-tab-direction.svelte.js";
|
|
21
|
+
import { match } from "../utils/match.js";
|
|
22
|
+
import { Focus, focusIn, FocusResult, getFocusableElements } from "../utils/focus-management.js";
|
|
23
|
+
import { microTask } from "../utils/microTask.js";
|
|
24
|
+
import Hidden, { HiddenFeatures } from "../internal/Hidden.svelte";
|
|
25
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
26
|
+
const internalId = useId();
|
|
27
|
+
let {
|
|
28
|
+
ref = $bindable(),
|
|
29
|
+
id = `headlessui-popover-button-${internalId}`,
|
|
30
|
+
disabled = false,
|
|
31
|
+
autofocus = false,
|
|
32
|
+
...theirProps
|
|
33
|
+
} = $props();
|
|
34
|
+
const context = usePopoverContext("PopoverButton");
|
|
35
|
+
const api = usePopoverAPIContext("PopoverButton");
|
|
36
|
+
const { isPortalled } = $derived(api);
|
|
37
|
+
const sentinelId = `headlessui-focus-sentinel-${useId()}`;
|
|
38
|
+
const groupContext = usePopoverGroupContext();
|
|
39
|
+
const closeOthers = $derived(groupContext?.closeOthers);
|
|
40
|
+
const panelContext = usePopoverPanelContext();
|
|
41
|
+
const isWithinPanel = panelContext !== void 0;
|
|
42
|
+
$effect(() => {
|
|
43
|
+
if (isWithinPanel) return;
|
|
44
|
+
id;
|
|
45
|
+
return untrack(() => {
|
|
46
|
+
context.setButtonId(id);
|
|
47
|
+
return () => {
|
|
48
|
+
context.setButtonId(void 0);
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
const uniqueIdentifier = Symbol();
|
|
53
|
+
const floatingReference = useFloatingReference();
|
|
54
|
+
const { setReference } = $derived(floatingReference);
|
|
55
|
+
$effect(() => {
|
|
56
|
+
setReference(ref);
|
|
57
|
+
});
|
|
58
|
+
$effect(() => {
|
|
59
|
+
if (isWithinPanel) return;
|
|
60
|
+
ref;
|
|
61
|
+
untrack(() => {
|
|
62
|
+
if (ref) {
|
|
63
|
+
context.buttons.push(uniqueIdentifier);
|
|
64
|
+
} else {
|
|
65
|
+
let idx = context.buttons.indexOf(uniqueIdentifier);
|
|
66
|
+
if (idx !== -1) context.buttons.splice(idx, 1);
|
|
67
|
+
}
|
|
68
|
+
if (context.buttons.length > 1) {
|
|
69
|
+
console.warn("You are already using a <PopoverButton /> but only 1 <PopoverButton /> is supported.");
|
|
70
|
+
}
|
|
71
|
+
if (ref) context.setButton(ref);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
const ownerDocument = $derived(getOwnerDocument(ref));
|
|
75
|
+
const handleKeyDown = (event) => {
|
|
76
|
+
if (isWithinPanel) {
|
|
77
|
+
if (context.popoverState === PopoverStates.Closed) return;
|
|
78
|
+
switch (event.key) {
|
|
79
|
+
case "Space":
|
|
80
|
+
case "Enter":
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
event.target.click?.();
|
|
83
|
+
context.closePopover();
|
|
84
|
+
context.button?.focus();
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
switch (event.key) {
|
|
89
|
+
case "Space":
|
|
90
|
+
case "Enter":
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
event.stopPropagation();
|
|
93
|
+
if (context.popoverState === PopoverStates.Closed) closeOthers?.(context.buttonId);
|
|
94
|
+
context.togglePopover();
|
|
95
|
+
break;
|
|
96
|
+
case "Escape":
|
|
97
|
+
if (context.popoverState !== PopoverStates.Open) return closeOthers?.(context.buttonId);
|
|
98
|
+
if (!ref) return;
|
|
99
|
+
if (ownerDocument?.activeElement && !ref.contains(ownerDocument.activeElement)) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
event.stopPropagation();
|
|
104
|
+
context.closePopover();
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const handleKeyUp = (event) => {
|
|
110
|
+
if (isWithinPanel) return;
|
|
111
|
+
if (event.key === "Space") {
|
|
112
|
+
event.preventDefault();
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const handleClick = (event) => {
|
|
116
|
+
if (disabled) return;
|
|
117
|
+
if (isWithinPanel) {
|
|
118
|
+
context.closePopover();
|
|
119
|
+
context.button?.focus();
|
|
120
|
+
} else {
|
|
121
|
+
event.preventDefault();
|
|
122
|
+
event.stopPropagation();
|
|
123
|
+
if (context.popoverState === PopoverStates.Closed) closeOthers?.(context.buttonId);
|
|
124
|
+
context.togglePopover();
|
|
125
|
+
context.button?.focus();
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const handleMouseDown = (event) => {
|
|
129
|
+
event.preventDefault();
|
|
130
|
+
event.stopPropagation();
|
|
131
|
+
};
|
|
132
|
+
const { isFocusVisible: focus, focusProps } = $derived(
|
|
133
|
+
useFocusRing({
|
|
134
|
+
get autofocus() {
|
|
135
|
+
return autofocus;
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
);
|
|
139
|
+
const { isHovered: hover, hoverProps } = $derived(
|
|
140
|
+
useHover({
|
|
141
|
+
get disabled() {
|
|
142
|
+
return disabled;
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
);
|
|
146
|
+
const { pressed: active, pressProps } = $derived(
|
|
147
|
+
useActivePress({
|
|
148
|
+
get disabled() {
|
|
149
|
+
return disabled;
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
);
|
|
153
|
+
const visible = $derived(context.popoverState === PopoverStates.Open);
|
|
154
|
+
const slot = $derived({
|
|
155
|
+
open: visible,
|
|
156
|
+
active: active || visible,
|
|
157
|
+
disabled,
|
|
158
|
+
hover,
|
|
159
|
+
focus,
|
|
160
|
+
autofocus
|
|
161
|
+
});
|
|
162
|
+
const type = useResolveButtonType({
|
|
163
|
+
get props() {
|
|
164
|
+
return { type: theirProps.type, as: theirProps.as };
|
|
165
|
+
},
|
|
166
|
+
get ref() {
|
|
167
|
+
return { current: context.button };
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
const ourProps = $derived(
|
|
171
|
+
isWithinPanel ? mergeProps(
|
|
172
|
+
{
|
|
173
|
+
type,
|
|
174
|
+
onkeydown: handleKeyDown,
|
|
175
|
+
onclick: handleClick,
|
|
176
|
+
disabled: disabled || void 0,
|
|
177
|
+
autofocus
|
|
178
|
+
},
|
|
179
|
+
focusProps,
|
|
180
|
+
hoverProps,
|
|
181
|
+
pressProps
|
|
182
|
+
) : mergeProps(
|
|
183
|
+
{
|
|
184
|
+
id: context.buttonId,
|
|
185
|
+
type,
|
|
186
|
+
"aria-expanded": context.popoverState === PopoverStates.Open,
|
|
187
|
+
"aria-controls": context.panel ? context.panelId : void 0,
|
|
188
|
+
disabled: disabled || void 0,
|
|
189
|
+
autofocus,
|
|
190
|
+
onkeydown: handleKeyDown,
|
|
191
|
+
onkeyup: handleKeyUp,
|
|
192
|
+
onclick: handleClick,
|
|
193
|
+
onmousedown: handleMouseDown
|
|
194
|
+
},
|
|
195
|
+
focusProps,
|
|
196
|
+
hoverProps,
|
|
197
|
+
pressProps
|
|
198
|
+
)
|
|
199
|
+
);
|
|
200
|
+
const direction = useTabDirection();
|
|
201
|
+
const handleFocus = () => {
|
|
202
|
+
const el = context.panel;
|
|
203
|
+
if (!el) return;
|
|
204
|
+
function run() {
|
|
205
|
+
let result = match(direction.current, {
|
|
206
|
+
[TabDirection.Forwards]: () => focusIn(el, Focus.First),
|
|
207
|
+
[TabDirection.Backwards]: () => focusIn(el, Focus.Last)
|
|
208
|
+
});
|
|
209
|
+
if (result === FocusResult.Error) {
|
|
210
|
+
focusIn(
|
|
211
|
+
getFocusableElements().filter((el2) => el2.dataset.headlessuiFocusGuard !== "true"),
|
|
212
|
+
match(direction.current, {
|
|
213
|
+
[TabDirection.Forwards]: Focus.Next,
|
|
214
|
+
[TabDirection.Backwards]: Focus.Previous
|
|
215
|
+
}),
|
|
216
|
+
{ relativeTo: context.button }
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (process.env.NODE_ENV === "test") {
|
|
221
|
+
microTask(run);
|
|
222
|
+
} else {
|
|
223
|
+
run();
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
</script>
|
|
227
|
+
|
|
228
|
+
<ElementOrComponent
|
|
229
|
+
{ourProps}
|
|
230
|
+
{theirProps}
|
|
231
|
+
slots={slot}
|
|
232
|
+
defaultTag={DEFAULT_BUTTON_TAG}
|
|
233
|
+
name="PopoverButton"
|
|
234
|
+
bind:ref
|
|
235
|
+
/>
|
|
236
|
+
{#if visible && !isWithinPanel && isPortalled}
|
|
237
|
+
<Hidden
|
|
238
|
+
id={sentinelId}
|
|
239
|
+
bind:ref={context.afterButtonSentinel as HTMLElement}
|
|
240
|
+
features={HiddenFeatures.Focusable}
|
|
241
|
+
data-headlessui-focus-guard
|
|
242
|
+
as="button"
|
|
243
|
+
type="button"
|
|
244
|
+
onfocus={handleFocus}
|
|
245
|
+
/>
|
|
246
|
+
{/if}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ElementType, Props, PropsOf } from "../utils/types.js";
|
|
2
|
+
declare const DEFAULT_BUTTON_TAG: "button";
|
|
3
|
+
export type PopoverButtonSlot = {
|
|
4
|
+
open: boolean;
|
|
5
|
+
active: boolean;
|
|
6
|
+
hover: boolean;
|
|
7
|
+
focus: boolean;
|
|
8
|
+
disabled: boolean;
|
|
9
|
+
autofocus: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type PopoverButtonPropsWeControl = "aria-controls" | "aria-expanded";
|
|
12
|
+
export type PopoverButtonComponentProps = {
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
autofocus?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type PopoverButtonProps<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = Props<TTag, PopoverButtonSlot, PopoverButtonPropsWeControl, PopoverButtonComponentProps>;
|
|
17
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> {
|
|
18
|
+
props(): {
|
|
19
|
+
as?: TTag | undefined;
|
|
20
|
+
} & (Exclude<keyof PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | PopoverButtonPropsWeControl | keyof PopoverButtonComponentProps> extends infer T extends keyof PropsOf<TTag> ? { [P in T]: PropsOf<TTag>[P]; } : never) & {
|
|
21
|
+
children?: import("svelte").Snippet<[{
|
|
22
|
+
slot: PopoverButtonSlot;
|
|
23
|
+
props: Record<string, any>;
|
|
24
|
+
}]> | undefined;
|
|
25
|
+
class?: string | ((bag: PopoverButtonSlot) => string) | null | undefined;
|
|
26
|
+
ref?: HTMLElement;
|
|
27
|
+
} & PopoverButtonComponentProps;
|
|
28
|
+
events(): {};
|
|
29
|
+
slots(): {};
|
|
30
|
+
bindings(): "ref";
|
|
31
|
+
exports(): {};
|
|
32
|
+
}
|
|
33
|
+
interface $$IsomorphicComponent {
|
|
34
|
+
new <TTag extends ElementType = typeof DEFAULT_BUTTON_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']>> & {
|
|
35
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
36
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
37
|
+
<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
38
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
39
|
+
}
|
|
40
|
+
declare const PopoverButton: $$IsomorphicComponent;
|
|
41
|
+
type PopoverButton<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = InstanceType<typeof PopoverButton<TTag>>;
|
|
42
|
+
export default PopoverButton;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script lang="ts" module>import { setContext } from "svelte";
|
|
2
|
+
const DEFAULT_GROUP_TAG = "div";
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_GROUP_TAG">import MainTreeProvider from "../internal/MainTreeProvider.svelte";
|
|
6
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
7
|
+
import { getOwnerDocument } from "../utils/owner.js";
|
|
8
|
+
let { ref = $bindable(), ...theirProps } = $props();
|
|
9
|
+
const popovers = $state([]);
|
|
10
|
+
const unregisterPopover = (registerBag) => {
|
|
11
|
+
const idx = popovers.indexOf(registerBag);
|
|
12
|
+
if (idx !== -1) popovers.splice(idx, 1);
|
|
13
|
+
};
|
|
14
|
+
const registerPopover = (registerBag) => {
|
|
15
|
+
popovers.push(registerBag);
|
|
16
|
+
return () => unregisterPopover(registerBag);
|
|
17
|
+
};
|
|
18
|
+
const isFocusWithinPopoverGroup = () => {
|
|
19
|
+
const ownerDocument = getOwnerDocument(ref);
|
|
20
|
+
if (!ownerDocument) return false;
|
|
21
|
+
let element = ownerDocument.activeElement;
|
|
22
|
+
if (ref?.contains(element)) return true;
|
|
23
|
+
return popovers.some((bag) => {
|
|
24
|
+
return ownerDocument.getElementById(bag.buttonId)?.contains(element) || ownerDocument.getElementById(bag.panelId)?.contains(element);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
const closeOthers = (buttonId) => {
|
|
28
|
+
for (const popover of popovers) {
|
|
29
|
+
if (popover.buttonId !== buttonId) popover.close();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
setContext("PopoverGroupContext", {
|
|
33
|
+
registerPopover,
|
|
34
|
+
unregisterPopover,
|
|
35
|
+
isFocusWithinPopoverGroup,
|
|
36
|
+
closeOthers
|
|
37
|
+
});
|
|
38
|
+
const slot = {};
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<MainTreeProvider>
|
|
42
|
+
<ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_GROUP_TAG} name="PopoverGroup" bind:ref />
|
|
43
|
+
</MainTreeProvider>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ElementType, Props } from "../utils/types.js";
|
|
2
|
+
declare const DEFAULT_GROUP_TAG: "div";
|
|
3
|
+
type GroupRenderPropArg = {};
|
|
4
|
+
type GroupPropsWeControl = never;
|
|
5
|
+
export type PopoverGroupProps<TTag extends ElementType = typeof DEFAULT_GROUP_TAG> = Props<TTag, GroupRenderPropArg, GroupPropsWeControl>;
|
|
6
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_GROUP_TAG> {
|
|
7
|
+
props(): {
|
|
8
|
+
as?: TTag | undefined;
|
|
9
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, "slot" | "as" | "children" | "class" | "ref"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
10
|
+
children?: import("svelte").Snippet<[{
|
|
11
|
+
slot: GroupRenderPropArg;
|
|
12
|
+
props: Record<string, any>;
|
|
13
|
+
}]> | undefined;
|
|
14
|
+
class?: string | ((bag: GroupRenderPropArg) => string) | null | undefined;
|
|
15
|
+
ref?: HTMLElement;
|
|
16
|
+
};
|
|
17
|
+
events(): {};
|
|
18
|
+
slots(): {};
|
|
19
|
+
bindings(): "ref";
|
|
20
|
+
exports(): {};
|
|
21
|
+
}
|
|
22
|
+
interface $$IsomorphicComponent {
|
|
23
|
+
new <TTag extends ElementType = typeof DEFAULT_GROUP_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']>> & {
|
|
24
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
25
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
26
|
+
<TTag extends ElementType = typeof DEFAULT_GROUP_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
27
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
28
|
+
}
|
|
29
|
+
declare const PopoverGroup: $$IsomorphicComponent;
|
|
30
|
+
type PopoverGroup<TTag extends ElementType = typeof DEFAULT_GROUP_TAG> = InstanceType<typeof PopoverGroup<TTag>>;
|
|
31
|
+
export default PopoverGroup;
|
|
@@ -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,51 @@
|
|
|
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>, ("slot" | "as" | "children" | "class" | "ref") | "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<[{
|
|
23
|
+
slot: PanelRenderPropArg;
|
|
24
|
+
props: Record<string, any>;
|
|
25
|
+
}]> | undefined;
|
|
26
|
+
class?: string | ((bag: PanelRenderPropArg) => string) | null | undefined;
|
|
27
|
+
ref?: HTMLElement;
|
|
28
|
+
} & {
|
|
29
|
+
focus?: boolean;
|
|
30
|
+
anchor?: AnchorProps;
|
|
31
|
+
portal?: boolean;
|
|
32
|
+
modal?: boolean;
|
|
33
|
+
transition?: boolean;
|
|
34
|
+
static?: boolean;
|
|
35
|
+
unmount?: boolean;
|
|
36
|
+
};
|
|
37
|
+
events(): {};
|
|
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']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
47
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
48
|
+
}
|
|
49
|
+
declare const PopoverPanel: $$IsomorphicComponent;
|
|
50
|
+
type PopoverPanel<TTag extends ElementType = typeof DEFAULT_PANEL_TAG> = InstanceType<typeof PopoverPanel<TTag>>;
|
|
51
|
+
export default PopoverPanel;
|