@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.
- package/dist/button/Button.svelte.d.ts +1 -1
- package/dist/checkbox/Checkbox.svelte +4 -4
- package/dist/checkbox/Checkbox.svelte.d.ts +5 -7
- package/dist/close-button/CloseButton.svelte.d.ts +2 -2
- package/dist/data-interactive/DataInteractive.svelte.d.ts +1 -1
- package/dist/description/Description.svelte.d.ts +1 -1
- package/dist/description/context.svelte.js +1 -1
- package/dist/dialog/Dialog.svelte.d.ts +1 -1
- package/dist/dialog/DialogBackdrop.svelte.d.ts +1 -1
- package/dist/dialog/DialogPanel.svelte +0 -1
- package/dist/dialog/DialogPanel.svelte.d.ts +1 -1
- package/dist/dialog/DialogTitle.svelte.d.ts +1 -1
- package/dist/dialog/InternalDialog.svelte.d.ts +1 -1
- package/dist/dialog/context.svelte.js +1 -1
- package/dist/field/Field.svelte +21 -3
- package/dist/field/Field.svelte.d.ts +1 -1
- package/dist/fieldset/Fieldset.svelte.d.ts +1 -1
- package/dist/focus-trap/FocusTrap.svelte +7 -14
- package/dist/focus-trap/FocusTrap.svelte.d.ts +3 -15
- 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-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 +3 -0
- package/dist/index.js +3 -0
- package/dist/input/Input.svelte +2 -2
- package/dist/input/Input.svelte.d.ts +5 -7
- package/dist/internal/FloatingProvider.svelte +12 -0
- package/dist/internal/{HoistFormFields.svelte.d.ts → FloatingProvider.svelte.d.ts} +5 -4
- package/dist/internal/FormFields.svelte +22 -19
- package/dist/internal/FormFieldsProvider.svelte +13 -0
- package/dist/internal/FormFieldsProvider.svelte.d.ts +21 -0
- package/dist/internal/Hidden.svelte +18 -8
- package/dist/internal/Hidden.svelte.d.ts +3 -6
- package/dist/internal/HiddenFeatures.d.ts +5 -0
- package/dist/internal/HiddenFeatures.js +9 -0
- 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 +48 -23
- package/dist/internal/floating.svelte.js +79 -260
- package/dist/internal/form-fields.svelte.d.ts +10 -0
- package/dist/internal/form-fields.svelte.js +23 -0
- package/dist/label/Label.svelte +5 -4
- package/dist/label/Label.svelte.d.ts +1 -1
- package/dist/label/context.svelte.js +1 -1
- package/dist/legend/Legend.svelte +2 -2
- package/dist/legend/Legend.svelte.d.ts +18 -30
- package/dist/listbox/Listbox.svelte +42 -66
- package/dist/listbox/Listbox.svelte.d.ts +6 -65
- package/dist/listbox/ListboxButton.svelte +10 -10
- package/dist/listbox/ListboxButton.svelte.d.ts +5 -7
- package/dist/listbox/ListboxOption.svelte +10 -6
- package/dist/listbox/ListboxOption.svelte.d.ts +1 -1
- package/dist/listbox/ListboxOptions.svelte +108 -54
- package/dist/listbox/ListboxOptions.svelte.d.ts +1 -1
- package/dist/listbox/ListboxSelectedOption.svelte +2 -4
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +6 -6
- package/dist/listbox/context.svelte.d.ts +76 -0
- package/dist/listbox/context.svelte.js +36 -0
- package/dist/menu/Menu.svelte +5 -177
- package/dist/menu/Menu.svelte.d.ts +1 -1
- package/dist/menu/MenuButton.svelte +4 -2
- package/dist/menu/MenuButton.svelte.d.ts +1 -1
- package/dist/menu/MenuHeading.svelte.d.ts +1 -1
- package/dist/menu/MenuItem.svelte.d.ts +6 -5
- package/dist/menu/MenuItems.svelte +15 -11
- package/dist/menu/MenuItems.svelte.d.ts +1 -1
- package/dist/menu/MenuSection.svelte.d.ts +1 -1
- package/dist/menu/MenuSeparator.svelte.d.ts +1 -1
- package/dist/menu/context.svelte.d.ts +30 -1
- package/dist/menu/context.svelte.js +208 -0
- package/dist/popover/Popover.svelte +161 -0
- package/dist/popover/Popover.svelte.d.ts +41 -0
- package/dist/popover/PopoverBackdrop.svelte +56 -0
- package/dist/popover/PopoverBackdrop.svelte.d.ts +45 -0
- package/dist/popover/PopoverButton.svelte +246 -0
- package/dist/popover/PopoverButton.svelte.d.ts +46 -0
- package/dist/popover/PopoverGroup.svelte +43 -0
- package/dist/popover/PopoverGroup.svelte.d.ts +33 -0
- package/dist/popover/PopoverPanel.svelte +274 -0
- package/dist/popover/PopoverPanel.svelte.d.ts +53 -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 +1 -1
- package/dist/portal/PortalGroup.svelte.d.ts +1 -1
- package/dist/select/Select.svelte +74 -0
- package/dist/select/Select.svelte.d.ts +48 -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 +5 -5
- package/dist/switch/SwitchGroup.svelte.d.ts +1 -1
- package/dist/tabs/Tab.svelte.d.ts +1 -1
- package/dist/tabs/TabGroup.svelte.d.ts +2 -2
- package/dist/tabs/TabList.svelte.d.ts +1 -1
- package/dist/tabs/TabPanel.svelte.d.ts +1 -1
- package/dist/tabs/TabPanels.svelte.d.ts +1 -1
- package/dist/textarea/Textarea.svelte +67 -0
- package/dist/textarea/Textarea.svelte.d.ts +50 -0
- package/dist/textarea/index.d.ts +1 -0
- package/dist/textarea/index.js +1 -0
- package/dist/transition/InternalTransitionChild.svelte.d.ts +1 -1
- package/dist/transition/Transition.svelte.d.ts +1 -1
- package/dist/transition/TransitionChild.svelte.d.ts +1 -1
- package/dist/transition/context.svelte.js +2 -2
- package/dist/utils/ElementOrComponent.svelte +2 -2
- package/dist/utils/ElementOrComponent.svelte.d.ts +2 -2
- package/dist/utils/Generic.svelte +0 -1
- package/dist/utils/Generic.svelte.d.ts +1 -2
- 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 +23 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +41 -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/style.d.ts +2 -0
- package/dist/utils/style.js +6 -0
- package/dist/utils/types.d.ts +1 -2
- package/package.json +25 -24
- package/dist/internal/HoistFormFields.svelte +0 -11
- package/dist/internal/id.d.ts +0 -8
- package/dist/internal/id.js +0 -11
|
@@ -7,7 +7,7 @@ import { Focus } from "../utils/calculate-active-index.js";
|
|
|
7
7
|
import { useFocusRing } from "../hooks/use-focus-ring.svelte.js";
|
|
8
8
|
import { useActivePress } from "../hooks/use-active-press.svelte.js";
|
|
9
9
|
import { useResolveButtonType } from "../hooks/use-resolve-button-type.svelte.js";
|
|
10
|
-
import {
|
|
10
|
+
import { useFloatingReference, useFloatingReferenceProps } from "../internal/floating.svelte.js";
|
|
11
11
|
import { useHover } from "../hooks/use-hover.svelte.js";
|
|
12
12
|
import { mergeProps } from "../utils/render.js";
|
|
13
13
|
import { MenuStates, useMenuContext } from "./context.svelte.js";
|
|
@@ -22,7 +22,9 @@ let {
|
|
|
22
22
|
...theirProps
|
|
23
23
|
} = $props();
|
|
24
24
|
const _state = useMenuContext("MenuButton");
|
|
25
|
-
const
|
|
25
|
+
const floatingReference = useFloatingReference();
|
|
26
|
+
const { setReference } = $derived(floatingReference);
|
|
27
|
+
const { getReferenceProps: getFloatingReferenceProps } = useFloatingReferenceProps();
|
|
26
28
|
$effect(() => {
|
|
27
29
|
untrack(() => _state.setButtonElement(ref ? ref : null));
|
|
28
30
|
setReference(ref);
|
|
@@ -21,7 +21,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_BUTTON
|
|
|
21
21
|
props(): {
|
|
22
22
|
as?: TTag | undefined;
|
|
23
23
|
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "disabled" | "autofocus" | "type" | "id" | ButtonPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
24
|
-
children?:
|
|
24
|
+
children?: Snippet<[ButtonRenderPropArg, Record<string, any>]> | undefined;
|
|
25
25
|
ref?: HTMLElement;
|
|
26
26
|
} & (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) ? {
|
|
27
27
|
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: ButtonRenderPropArg) => string) | undefined;
|
|
@@ -11,7 +11,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_HEADIN
|
|
|
11
11
|
props(): {
|
|
12
12
|
as?: TTag | undefined;
|
|
13
13
|
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "id" | "role"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
14
|
-
children?:
|
|
14
|
+
children?: Snippet<[HeadingRenderPropArg, Record<string, any>]> | undefined;
|
|
15
15
|
ref?: HTMLElement;
|
|
16
16
|
} & (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) ? {
|
|
17
17
|
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: HeadingRenderPropArg) => string) | undefined;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Props, ElementType
|
|
1
|
+
import type { Props, ElementType } from "../utils/types.js";
|
|
2
|
+
import { type Snippet } from "svelte";
|
|
2
3
|
declare const DEFAULT_ITEM_TAG: "svelte:fragment";
|
|
3
4
|
type ItemRenderPropArg = {
|
|
4
5
|
/** @deprecated use `focus` instead */
|
|
@@ -12,21 +13,21 @@ type ItemPropsWeControl = "aria-describedby" | "aria-disabled" | "aria-labelledb
|
|
|
12
13
|
export type MenuItemProps<TTag extends ElementType = typeof DEFAULT_ITEM_TAG> = Props<TTag, ItemRenderPropArg, ItemPropsWeControl | "children", {
|
|
13
14
|
id?: string;
|
|
14
15
|
disabled?: boolean;
|
|
15
|
-
children:
|
|
16
|
+
children: Snippet<[ItemRenderPropArg]>;
|
|
16
17
|
}>;
|
|
17
|
-
export type MenuItemChildren =
|
|
18
|
+
export type MenuItemChildren = Snippet<[ItemRenderPropArg]>;
|
|
18
19
|
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_ITEM_TAG> {
|
|
19
20
|
props(): {
|
|
20
21
|
as?: TTag | undefined;
|
|
21
22
|
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "disabled" | "id" | ItemPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
22
|
-
children?:
|
|
23
|
+
children?: Snippet<[ItemRenderPropArg, Record<string, any>]> | undefined;
|
|
23
24
|
ref?: HTMLElement;
|
|
24
25
|
} & (true extends (import("../utils/types.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../utils/types.js").PropsOf<TTag> ? T_1 extends never ? never : "class" extends infer T_2 ? T_2 extends "class" ? T_2 extends keyof T_1 ? true : never : never : never : never : never) ? {
|
|
25
26
|
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: ItemRenderPropArg) => string) | undefined;
|
|
26
27
|
} : {}) & {
|
|
27
28
|
id?: string;
|
|
28
29
|
disabled?: boolean;
|
|
29
|
-
children:
|
|
30
|
+
children: Snippet<[ItemRenderPropArg]>;
|
|
30
31
|
};
|
|
31
32
|
events(): {} & {
|
|
32
33
|
[evt: string]: CustomEvent<any>;
|
|
@@ -36,18 +36,23 @@ let {
|
|
|
36
36
|
transition = false,
|
|
37
37
|
...theirProps
|
|
38
38
|
} = $props();
|
|
39
|
-
const
|
|
39
|
+
const resolvedAnchor = useResolvedAnchor({
|
|
40
|
+
get anchor() {
|
|
41
|
+
return rawAnchor;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const { anchor } = $derived(resolvedAnchor);
|
|
40
45
|
const _state = useMenuContext("MenuOptions");
|
|
41
46
|
const floatingPanel = useFloatingPanel({
|
|
42
47
|
get placement() {
|
|
43
48
|
return anchor;
|
|
44
49
|
}
|
|
45
50
|
});
|
|
46
|
-
const { setFloating,
|
|
51
|
+
const { setFloating, styles } = $derived(floatingPanel);
|
|
47
52
|
const getFloatingPanelProps = useFloatingPanelProps();
|
|
48
53
|
$effect(() => {
|
|
49
|
-
untrack(() => _state.setItemsElement(ref
|
|
50
|
-
if (anchor) setFloating(ref);
|
|
54
|
+
untrack(() => _state.setItemsElement(ref ?? null));
|
|
55
|
+
if (anchor) setFloating(ref ?? null);
|
|
51
56
|
});
|
|
52
57
|
const ownerDocument = $derived(getOwnerDocument(_state.itemsElement));
|
|
53
58
|
$effect(() => {
|
|
@@ -211,8 +216,8 @@ const buttonSize = useElementSize({
|
|
|
211
216
|
},
|
|
212
217
|
unit: true
|
|
213
218
|
});
|
|
214
|
-
const ourProps = $derived(
|
|
215
|
-
mergeProps(anchor ? getFloatingPanelProps() : {}, {
|
|
219
|
+
const ourProps = $derived({
|
|
220
|
+
...mergeProps(anchor ? getFloatingPanelProps() : {}, {
|
|
216
221
|
"aria-activedescendant": _state.activeItemIndex === null ? void 0 : _state.items[_state.activeItemIndex]?.id,
|
|
217
222
|
"aria-labelledby": _state.buttonElement?.id,
|
|
218
223
|
id,
|
|
@@ -223,11 +228,10 @@ const ourProps = $derived(
|
|
|
223
228
|
// to skip focusing the `MenuItems` when pressing the tab key on an
|
|
224
229
|
// open `Menu`, and go to the next focusable element.
|
|
225
230
|
tabindex: _state.menuState === MenuStates.Open ? 0 : void 0,
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
);
|
|
231
|
+
style: [theirProps.style, styles, `--button-width: ${buttonSize.width}`].filter(Boolean).join("; ")
|
|
232
|
+
}),
|
|
233
|
+
...transitionDataAttributes(transitionData)
|
|
234
|
+
});
|
|
231
235
|
</script>
|
|
232
236
|
|
|
233
237
|
<Portal enabled={portal ? theirProps.static || visible : false}>
|
|
@@ -20,7 +20,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_ITEMS_
|
|
|
20
20
|
props(): {
|
|
21
21
|
as?: TTag | undefined;
|
|
22
22
|
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "anchor" | "unmount" | "static" | "id" | "transition" | "portal" | "modal" | ItemsPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
23
|
-
children?:
|
|
23
|
+
children?: Snippet<[ItemsRenderPropArg, Record<string, any>]> | undefined;
|
|
24
24
|
ref?: HTMLElement;
|
|
25
25
|
} & (true extends (import("../utils/types.js").PropsOf<TTag> extends infer T_1 ? T_1 extends import("../utils/types.js").PropsOf<TTag> ? T_1 extends never ? never : "class" extends infer T_2 ? T_2 extends "class" ? T_2 extends keyof T_1 ? true : never : never : never : never : never) ? {
|
|
26
26
|
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: ItemsRenderPropArg) => string) | undefined;
|
|
@@ -9,7 +9,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_SECTIO
|
|
|
9
9
|
props(): {
|
|
10
10
|
as?: TTag | undefined;
|
|
11
11
|
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | SectionPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
12
|
-
children?:
|
|
12
|
+
children?: Snippet<[SectionRenderPropArg, Record<string, any>]> | undefined;
|
|
13
13
|
ref?: HTMLElement;
|
|
14
14
|
} & (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) ? {
|
|
15
15
|
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: SectionRenderPropArg) => string) | undefined;
|
|
@@ -9,7 +9,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_SEPARA
|
|
|
9
9
|
props(): {
|
|
10
10
|
as?: TTag | undefined;
|
|
11
11
|
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "role"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
12
|
-
children?:
|
|
12
|
+
children?: Snippet<[SeparatorRenderPropArg, Record<string, any>]> | undefined;
|
|
13
13
|
ref?: HTMLElement;
|
|
14
14
|
} & (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) ? {
|
|
15
15
|
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: SeparatorRenderPropArg) => string) | undefined;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Focus } from "../utils/calculate-active-index.js";
|
|
2
2
|
import type { MutableRefObject } from "../utils/ref.svelte.js";
|
|
3
3
|
export declare enum MenuStates {
|
|
4
4
|
Open = 0,
|
|
@@ -45,3 +45,32 @@ export type MenuContext = StateDefinition & {
|
|
|
45
45
|
setItemsElement(element: HTMLElement | null): void;
|
|
46
46
|
};
|
|
47
47
|
export declare function useMenuContext(component: string): MenuContext;
|
|
48
|
+
export declare const stateReducer: (initialState: StateDefinition) => {
|
|
49
|
+
readonly menuState: MenuStates;
|
|
50
|
+
readonly buttonElement: HTMLButtonElement | null;
|
|
51
|
+
readonly itemsElement: HTMLElement | null;
|
|
52
|
+
readonly items: {
|
|
53
|
+
id: string;
|
|
54
|
+
dataRef: MenuItemDataRef;
|
|
55
|
+
}[];
|
|
56
|
+
readonly searchQuery: string;
|
|
57
|
+
readonly activeItemIndex: number | null;
|
|
58
|
+
readonly activationTrigger: ActivationTrigger;
|
|
59
|
+
readonly __demoMode: boolean;
|
|
60
|
+
closeMenu(): StateDefinition;
|
|
61
|
+
openMenu(): StateDefinition;
|
|
62
|
+
goToItem(action: {
|
|
63
|
+
focus: Focus.Specific;
|
|
64
|
+
id: string;
|
|
65
|
+
trigger?: ActivationTrigger;
|
|
66
|
+
} | {
|
|
67
|
+
focus: Exclude<Focus, Focus.Specific>;
|
|
68
|
+
trigger?: ActivationTrigger;
|
|
69
|
+
}): StateDefinition;
|
|
70
|
+
search(value: string): StateDefinition;
|
|
71
|
+
clearSearch(): StateDefinition;
|
|
72
|
+
registerItem(id: string, dataRef: MenuItemDataRef): StateDefinition;
|
|
73
|
+
unregisterItem(id: string): StateDefinition;
|
|
74
|
+
setButtonElement(element: HTMLButtonElement | null): StateDefinition;
|
|
75
|
+
setItemsElement(element: HTMLElement | null): StateDefinition;
|
|
76
|
+
};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { calculateActiveIndex, Focus } from "../utils/calculate-active-index.js";
|
|
2
|
+
import { sortByDomNode } from "../utils/focus-management.js";
|
|
1
3
|
import { getContext } from "svelte";
|
|
2
4
|
export var MenuStates;
|
|
3
5
|
(function (MenuStates) {
|
|
@@ -19,3 +21,209 @@ export function useMenuContext(component) {
|
|
|
19
21
|
}
|
|
20
22
|
return context;
|
|
21
23
|
}
|
|
24
|
+
function adjustOrderedState(state, adjustment = (i) => i) {
|
|
25
|
+
let currentActiveItem = state.activeItemIndex !== null ? state.items[state.activeItemIndex] : null;
|
|
26
|
+
let sortedItems = sortByDomNode(adjustment(state.items.slice()), (item) => item.dataRef.current.domRef.current);
|
|
27
|
+
// If we inserted an item before the current active item then the active item index
|
|
28
|
+
// would be wrong. To fix this, we will re-lookup the correct index.
|
|
29
|
+
let adjustedActiveItemIndex = currentActiveItem ? sortedItems.indexOf(currentActiveItem) : null;
|
|
30
|
+
// Reset to `null` in case the currentActiveItem was removed.
|
|
31
|
+
if (adjustedActiveItemIndex === -1) {
|
|
32
|
+
adjustedActiveItemIndex = null;
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
items: sortedItems,
|
|
36
|
+
activeItemIndex: adjustedActiveItemIndex,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export const stateReducer = (initialState) => {
|
|
40
|
+
let _state = $state(initialState);
|
|
41
|
+
return {
|
|
42
|
+
get menuState() {
|
|
43
|
+
return _state.menuState;
|
|
44
|
+
},
|
|
45
|
+
get buttonElement() {
|
|
46
|
+
return _state.buttonElement;
|
|
47
|
+
},
|
|
48
|
+
get itemsElement() {
|
|
49
|
+
return _state.itemsElement;
|
|
50
|
+
},
|
|
51
|
+
get items() {
|
|
52
|
+
return _state.items;
|
|
53
|
+
},
|
|
54
|
+
get searchQuery() {
|
|
55
|
+
return _state.searchQuery;
|
|
56
|
+
},
|
|
57
|
+
get activeItemIndex() {
|
|
58
|
+
return _state.activeItemIndex;
|
|
59
|
+
},
|
|
60
|
+
get activationTrigger() {
|
|
61
|
+
return _state.activationTrigger;
|
|
62
|
+
},
|
|
63
|
+
get __demoMode() {
|
|
64
|
+
return _state.__demoMode;
|
|
65
|
+
},
|
|
66
|
+
closeMenu() {
|
|
67
|
+
if (_state.menuState === MenuStates.Closed)
|
|
68
|
+
return _state;
|
|
69
|
+
_state.activeItemIndex = null;
|
|
70
|
+
_state.menuState = MenuStates.Closed;
|
|
71
|
+
return _state;
|
|
72
|
+
},
|
|
73
|
+
openMenu() {
|
|
74
|
+
if (_state.menuState === MenuStates.Open)
|
|
75
|
+
return _state;
|
|
76
|
+
/* We can turn off demo mode once we re-open the `Menu` */
|
|
77
|
+
_state.__demoMode = false;
|
|
78
|
+
_state.menuState = MenuStates.Open;
|
|
79
|
+
return _state;
|
|
80
|
+
},
|
|
81
|
+
goToItem(action) {
|
|
82
|
+
if (_state.menuState === MenuStates.Closed)
|
|
83
|
+
return _state;
|
|
84
|
+
_state.searchQuery = "";
|
|
85
|
+
_state.activationTrigger = action.trigger ?? ActivationTrigger.Other;
|
|
86
|
+
_state.__demoMode = false;
|
|
87
|
+
// Optimization:
|
|
88
|
+
//
|
|
89
|
+
// There is no need to sort the DOM nodes if we know that we don't want to focus anything
|
|
90
|
+
if (action.focus === Focus.Nothing) {
|
|
91
|
+
_state.activeItemIndex = null;
|
|
92
|
+
return _state;
|
|
93
|
+
}
|
|
94
|
+
// Optimization:
|
|
95
|
+
//
|
|
96
|
+
// There is no need to sort the DOM nodes if we know exactly where to go
|
|
97
|
+
if (action.focus === Focus.Specific) {
|
|
98
|
+
_state.activeItemIndex = _state.items.findIndex((o) => o.id === action.id);
|
|
99
|
+
return _state;
|
|
100
|
+
}
|
|
101
|
+
// Optimization:
|
|
102
|
+
//
|
|
103
|
+
// If the current DOM node and the previous DOM node are next to each other,
|
|
104
|
+
// or if the previous DOM node is already the first DOM node, then we don't
|
|
105
|
+
// have to sort all the DOM nodes.
|
|
106
|
+
else if (action.focus === Focus.Previous) {
|
|
107
|
+
let activeItemIdx = _state.activeItemIndex;
|
|
108
|
+
if (activeItemIdx !== null) {
|
|
109
|
+
let currentDom = _state.items[activeItemIdx].dataRef.current.domRef;
|
|
110
|
+
let previousItemIndex = calculateActiveIndex(action, {
|
|
111
|
+
resolveItems: () => _state.items,
|
|
112
|
+
resolveActiveIndex: () => _state.activeItemIndex,
|
|
113
|
+
resolveId: (item) => item.id,
|
|
114
|
+
resolveDisabled: (item) => item.dataRef.current.disabled,
|
|
115
|
+
});
|
|
116
|
+
if (previousItemIndex !== null) {
|
|
117
|
+
let previousDom = _state.items[previousItemIndex].dataRef.current.domRef;
|
|
118
|
+
if (
|
|
119
|
+
// Next to each other
|
|
120
|
+
currentDom.current?.previousElementSibling === previousDom.current ||
|
|
121
|
+
// Or already the first element
|
|
122
|
+
previousDom.current?.previousElementSibling === null) {
|
|
123
|
+
_state.activeItemIndex = previousItemIndex;
|
|
124
|
+
return _state;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Optimization:
|
|
130
|
+
//
|
|
131
|
+
// If the current DOM node and the next DOM node are next to each other, or
|
|
132
|
+
// if the next DOM node is already the last DOM node, then we don't have to
|
|
133
|
+
// sort all the DOM nodes.
|
|
134
|
+
else if (action.focus === Focus.Next) {
|
|
135
|
+
let activeItemIdx = _state.activeItemIndex;
|
|
136
|
+
if (activeItemIdx !== null) {
|
|
137
|
+
let currentDom = _state.items[activeItemIdx].dataRef.current.domRef;
|
|
138
|
+
let nextItemIndex = calculateActiveIndex(action, {
|
|
139
|
+
resolveItems: () => _state.items,
|
|
140
|
+
resolveActiveIndex: () => _state.activeItemIndex,
|
|
141
|
+
resolveId: (item) => item.id,
|
|
142
|
+
resolveDisabled: (item) => item.dataRef.current.disabled,
|
|
143
|
+
});
|
|
144
|
+
if (nextItemIndex !== null) {
|
|
145
|
+
let nextDom = _state.items[nextItemIndex].dataRef.current.domRef;
|
|
146
|
+
if (
|
|
147
|
+
// Next to each other
|
|
148
|
+
currentDom.current?.nextElementSibling === nextDom.current ||
|
|
149
|
+
// Or already the last element
|
|
150
|
+
nextDom.current?.nextElementSibling === null) {
|
|
151
|
+
_state.activeItemIndex = nextItemIndex;
|
|
152
|
+
return _state;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Slow path:
|
|
158
|
+
//
|
|
159
|
+
// Ensure all the items are correctly sorted according to DOM position
|
|
160
|
+
let adjustedState = adjustOrderedState(_state);
|
|
161
|
+
let activeItemIndex = calculateActiveIndex(action, {
|
|
162
|
+
resolveItems: () => adjustedState.items,
|
|
163
|
+
resolveActiveIndex: () => adjustedState.activeItemIndex,
|
|
164
|
+
resolveId: (item) => item.id,
|
|
165
|
+
resolveDisabled: (item) => item.dataRef.current.disabled,
|
|
166
|
+
});
|
|
167
|
+
_state.items = adjustedState.items;
|
|
168
|
+
_state.activeItemIndex = activeItemIndex;
|
|
169
|
+
return _state;
|
|
170
|
+
},
|
|
171
|
+
search(value) {
|
|
172
|
+
let wasAlreadySearching = _state.searchQuery !== "";
|
|
173
|
+
let offset = wasAlreadySearching ? 0 : 1;
|
|
174
|
+
let searchQuery = _state.searchQuery + value.toLowerCase();
|
|
175
|
+
let reOrderedItems = _state.activeItemIndex !== null
|
|
176
|
+
? _state.items
|
|
177
|
+
.slice(_state.activeItemIndex + offset)
|
|
178
|
+
.concat(_state.items.slice(0, _state.activeItemIndex + offset))
|
|
179
|
+
: _state.items;
|
|
180
|
+
let matchingItem = reOrderedItems.find((item) => item.dataRef.current.textValue?.startsWith(searchQuery) && !item.dataRef.current.disabled);
|
|
181
|
+
let matchIdx = matchingItem ? _state.items.indexOf(matchingItem) : -1;
|
|
182
|
+
if (matchIdx === -1 || matchIdx === _state.activeItemIndex) {
|
|
183
|
+
_state.searchQuery = searchQuery;
|
|
184
|
+
return _state;
|
|
185
|
+
}
|
|
186
|
+
_state.searchQuery = searchQuery;
|
|
187
|
+
_state.activeItemIndex = matchIdx;
|
|
188
|
+
_state.activationTrigger = ActivationTrigger.Other;
|
|
189
|
+
return _state;
|
|
190
|
+
},
|
|
191
|
+
clearSearch() {
|
|
192
|
+
if (_state.searchQuery === "")
|
|
193
|
+
return _state;
|
|
194
|
+
_state.searchQuery = "";
|
|
195
|
+
return _state;
|
|
196
|
+
},
|
|
197
|
+
registerItem(id, dataRef) {
|
|
198
|
+
let item = { id, dataRef };
|
|
199
|
+
let adjustedState = adjustOrderedState(_state, (items) => [...items, item]);
|
|
200
|
+
_state.items = adjustedState.items;
|
|
201
|
+
_state.activeItemIndex = adjustedState.activeItemIndex;
|
|
202
|
+
return _state;
|
|
203
|
+
},
|
|
204
|
+
unregisterItem(id) {
|
|
205
|
+
let adjustedState = adjustOrderedState(_state, (items) => {
|
|
206
|
+
let idx = items.findIndex((a) => a.id === id);
|
|
207
|
+
if (idx !== -1)
|
|
208
|
+
items.splice(idx, 1);
|
|
209
|
+
return items;
|
|
210
|
+
});
|
|
211
|
+
_state.items = adjustedState.items;
|
|
212
|
+
_state.activeItemIndex = adjustedState.activeItemIndex;
|
|
213
|
+
_state.activationTrigger = ActivationTrigger.Other;
|
|
214
|
+
return _state;
|
|
215
|
+
},
|
|
216
|
+
setButtonElement(element) {
|
|
217
|
+
if (_state.buttonElement === element)
|
|
218
|
+
return _state;
|
|
219
|
+
_state.buttonElement = element;
|
|
220
|
+
return _state;
|
|
221
|
+
},
|
|
222
|
+
setItemsElement(element) {
|
|
223
|
+
if (_state.itemsElement === element)
|
|
224
|
+
return _state;
|
|
225
|
+
_state.itemsElement = element;
|
|
226
|
+
return _state;
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
<script lang="ts" module>export const DEFAULT_POPOVER_TAG = "div";
|
|
2
|
+
</script>
|
|
3
|
+
|
|
4
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_POPOVER_TAG">import { getOwnerDocument } from "../utils/owner.js";
|
|
5
|
+
import { setContext, untrack } from "svelte";
|
|
6
|
+
import {
|
|
7
|
+
createPopoverContext,
|
|
8
|
+
PopoverStates,
|
|
9
|
+
usePopoverGroupContext
|
|
10
|
+
} from "./context.svelte.js";
|
|
11
|
+
import { FocusableMode, getFocusableElements, isFocusableElement } from "../utils/focus-management.js";
|
|
12
|
+
import { useNestedPortals } from "../portal/InternalPortal.svelte";
|
|
13
|
+
import MainTreeProvider, { useMainTreeNode } from "../internal/MainTreeProvider.svelte";
|
|
14
|
+
import { useRootContainers } from "../hooks/use-root-containers.svelte.js";
|
|
15
|
+
import { useEventListener } from "../hooks/use-event-listener.svelte.js";
|
|
16
|
+
import { useOutsideClick } from "../hooks/use-outside-click.svelte.js";
|
|
17
|
+
import { useFloatingProvider } from "../internal/floating-provider.svelte.js";
|
|
18
|
+
import { createCloseContext } from "../internal/close-provider.js";
|
|
19
|
+
import { createOpenClosedContext, State } from "../internal/open-closed.js";
|
|
20
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
21
|
+
let { ref = $bindable(), __demoMode = false, ...theirProps } = $props();
|
|
22
|
+
let buttons = $state([]);
|
|
23
|
+
const context = createPopoverContext({
|
|
24
|
+
__demoMode,
|
|
25
|
+
popoverState: __demoMode ? PopoverStates.Open : PopoverStates.Closed,
|
|
26
|
+
buttons
|
|
27
|
+
});
|
|
28
|
+
const {
|
|
29
|
+
popoverState,
|
|
30
|
+
button,
|
|
31
|
+
buttonId,
|
|
32
|
+
panel,
|
|
33
|
+
panelId,
|
|
34
|
+
beforePanelSentinel,
|
|
35
|
+
afterPanelSentinel,
|
|
36
|
+
afterButtonSentinel
|
|
37
|
+
} = $derived(context);
|
|
38
|
+
const ownerDocument = $derived(getOwnerDocument(ref ?? button));
|
|
39
|
+
const isPortalled = $derived.by(() => {
|
|
40
|
+
if (!button) return false;
|
|
41
|
+
if (!panel) return false;
|
|
42
|
+
return untrack(() => {
|
|
43
|
+
for (let root2 of document.querySelectorAll("body > *")) {
|
|
44
|
+
if (Number(root2?.contains(button)) ^ Number(root2?.contains(panel))) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
let elements = getFocusableElements();
|
|
49
|
+
let buttonIdx = elements.indexOf(button);
|
|
50
|
+
let beforeIdx = (buttonIdx + elements.length - 1) % elements.length;
|
|
51
|
+
let afterIdx = (buttonIdx + 1) % elements.length;
|
|
52
|
+
let beforeElement = elements[beforeIdx];
|
|
53
|
+
let afterElement = elements[afterIdx];
|
|
54
|
+
if (!panel.contains(beforeElement) && !panel.contains(afterElement)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
const registerBag = $derived({
|
|
61
|
+
buttonId,
|
|
62
|
+
panelId,
|
|
63
|
+
close: () => context.closePopover()
|
|
64
|
+
});
|
|
65
|
+
const groupContext = usePopoverGroupContext();
|
|
66
|
+
const registerPopover = $derived(groupContext?.registerPopover);
|
|
67
|
+
const isFocusWithinPopoverGroup = () => {
|
|
68
|
+
return groupContext?.isFocusWithinPopoverGroup() ?? (ownerDocument?.activeElement && (button?.contains(ownerDocument.activeElement) || panel?.contains(ownerDocument.activeElement)));
|
|
69
|
+
};
|
|
70
|
+
$effect(() => registerPopover?.(registerBag));
|
|
71
|
+
const nestedPortals = useNestedPortals();
|
|
72
|
+
const { portals } = $derived(nestedPortals);
|
|
73
|
+
const mainTreeNode = useMainTreeNode({
|
|
74
|
+
get fallbackMainTreeNode() {
|
|
75
|
+
return button;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const root = useRootContainers({
|
|
79
|
+
get mainTreeNode() {
|
|
80
|
+
return mainTreeNode.node;
|
|
81
|
+
},
|
|
82
|
+
get portals() {
|
|
83
|
+
return portals;
|
|
84
|
+
},
|
|
85
|
+
get defaultContainers() {
|
|
86
|
+
return [button, panel];
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
useEventListener({
|
|
90
|
+
get element() {
|
|
91
|
+
return ownerDocument?.defaultView;
|
|
92
|
+
},
|
|
93
|
+
type: "focus",
|
|
94
|
+
listener: (event) => {
|
|
95
|
+
if (event.target === window) return;
|
|
96
|
+
if (!(event.target instanceof HTMLElement)) return;
|
|
97
|
+
if (popoverState !== PopoverStates.Open) return;
|
|
98
|
+
if (isFocusWithinPopoverGroup()) return;
|
|
99
|
+
if (!button) return;
|
|
100
|
+
if (!panel) return;
|
|
101
|
+
if (root.contains(event.target)) return;
|
|
102
|
+
if (beforePanelSentinel?.contains?.(event.target)) return;
|
|
103
|
+
if (afterPanelSentinel?.contains?.(event.target)) return;
|
|
104
|
+
if (afterButtonSentinel?.contains?.(event.target)) return;
|
|
105
|
+
context.closePopover();
|
|
106
|
+
},
|
|
107
|
+
options: true
|
|
108
|
+
});
|
|
109
|
+
const outsideClickEnabled = $derived(popoverState === PopoverStates.Open);
|
|
110
|
+
useOutsideClick({
|
|
111
|
+
get enabled() {
|
|
112
|
+
return outsideClickEnabled;
|
|
113
|
+
},
|
|
114
|
+
get containers() {
|
|
115
|
+
return root.resolvedContainers;
|
|
116
|
+
},
|
|
117
|
+
cb: (event, target) => {
|
|
118
|
+
context.closePopover();
|
|
119
|
+
if (!isFocusableElement(target, FocusableMode.Loose)) {
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
button?.focus();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
const close = (focusableElement) => {
|
|
126
|
+
context.closePopover();
|
|
127
|
+
const restoreElement = (() => {
|
|
128
|
+
if (!focusableElement) return button;
|
|
129
|
+
if (focusableElement instanceof HTMLElement) return focusableElement;
|
|
130
|
+
return button;
|
|
131
|
+
})();
|
|
132
|
+
restoreElement?.focus();
|
|
133
|
+
};
|
|
134
|
+
const api = {
|
|
135
|
+
close,
|
|
136
|
+
get isPortalled() {
|
|
137
|
+
return isPortalled;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
setContext("PopoverAPIContext", api);
|
|
141
|
+
const slot = $derived({
|
|
142
|
+
open: popoverState === PopoverStates.Open,
|
|
143
|
+
close
|
|
144
|
+
});
|
|
145
|
+
useFloatingProvider();
|
|
146
|
+
setContext("PopoverPanelContext", void 0);
|
|
147
|
+
createCloseContext({
|
|
148
|
+
get close() {
|
|
149
|
+
return close;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
createOpenClosedContext({
|
|
153
|
+
get value() {
|
|
154
|
+
return context.popoverState === PopoverStates.Open ? State.Open : State.Closed;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
</script>
|
|
158
|
+
|
|
159
|
+
<MainTreeProvider node={mainTreeNode.node}>
|
|
160
|
+
<ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_POPOVER_TAG} name="Popover" bind:ref />
|
|
161
|
+
</MainTreeProvider>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ElementType, Props } from "../utils/types.js";
|
|
2
|
+
export declare const DEFAULT_POPOVER_TAG: "div";
|
|
3
|
+
type PopoverRenderPropArg = {
|
|
4
|
+
open: boolean;
|
|
5
|
+
close(focusableElement?: HTMLElement | MouseEvent<HTMLElement>): void;
|
|
6
|
+
};
|
|
7
|
+
type PopoverPropsWeControl = never;
|
|
8
|
+
export type PopoverProps<TTag extends ElementType = typeof DEFAULT_POPOVER_TAG> = Props<TTag, PopoverRenderPropArg, PopoverPropsWeControl, {
|
|
9
|
+
__demoMode?: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
import { type MouseEvent } from "./context.svelte.js";
|
|
12
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_POPOVER_TAG> {
|
|
13
|
+
props(): {
|
|
14
|
+
as?: TTag | undefined;
|
|
15
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "__demoMode"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
16
|
+
children?: import("svelte").Snippet<[PopoverRenderPropArg, Record<string, any>]> | undefined;
|
|
17
|
+
ref?: HTMLElement;
|
|
18
|
+
} & (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) ? {
|
|
19
|
+
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: PopoverRenderPropArg) => string) | undefined;
|
|
20
|
+
} : {}) & {
|
|
21
|
+
__demoMode?: boolean;
|
|
22
|
+
};
|
|
23
|
+
events(): {} & {
|
|
24
|
+
[evt: string]: CustomEvent<any>;
|
|
25
|
+
};
|
|
26
|
+
slots(): {};
|
|
27
|
+
bindings(): "ref";
|
|
28
|
+
exports(): {};
|
|
29
|
+
}
|
|
30
|
+
interface $$IsomorphicComponent {
|
|
31
|
+
new <TTag extends ElementType = typeof DEFAULT_POPOVER_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']>> & {
|
|
32
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
33
|
+
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
34
|
+
<TTag extends ElementType = typeof DEFAULT_POPOVER_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
35
|
+
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
36
|
+
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
37
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
38
|
+
}
|
|
39
|
+
declare const Popover: $$IsomorphicComponent;
|
|
40
|
+
type Popover<TTag extends ElementType = typeof DEFAULT_POPOVER_TAG> = InstanceType<typeof Popover<TTag>>;
|
|
41
|
+
export default Popover;
|