@pzerelles/headlessui-svelte 2.1.2-next.31 → 2.1.2-next.33
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 +84 -55
- package/dist/button/Button.svelte.d.ts +4 -32
- package/dist/checkbox/Checkbox.svelte +177 -121
- package/dist/checkbox/Checkbox.svelte.d.ts +14 -32
- package/dist/close-button/CloseButton.svelte +10 -7
- package/dist/close-button/CloseButton.svelte.d.ts +2 -44
- package/dist/data-interactive/DataInteractive.svelte +49 -37
- package/dist/data-interactive/DataInteractive.svelte.d.ts +7 -30
- package/dist/description/Description.svelte +35 -22
- package/dist/description/Description.svelte.d.ts +7 -28
- package/dist/dialog/Dialog.svelte +326 -232
- package/dist/dialog/Dialog.svelte.d.ts +4 -42
- package/dist/dialog/DialogBackdrop.svelte +33 -16
- package/dist/dialog/DialogBackdrop.svelte.d.ts +4 -29
- package/dist/dialog/DialogPanel.svelte +60 -29
- package/dist/dialog/DialogPanel.svelte.d.ts +4 -30
- package/dist/dialog/DialogTitle.svelte +51 -24
- package/dist/dialog/DialogTitle.svelte.d.ts +6 -27
- package/dist/field/Field.svelte +44 -28
- package/dist/field/Field.svelte.d.ts +4 -30
- package/dist/fieldset/Fieldset.svelte +48 -30
- package/dist/fieldset/Fieldset.svelte.d.ts +5 -31
- package/dist/focus-trap/FocusTrap.svelte +430 -298
- package/dist/focus-trap/FocusTrap.svelte.d.ts +5 -34
- package/dist/hooks/use-inert-others.svelte.js +10 -10
- package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
- package/dist/input/Input.svelte +95 -54
- package/dist/input/Input.svelte.d.ts +13 -27
- package/dist/internal/FloatingProvider.svelte +14 -9
- package/dist/internal/FocusSentinel.svelte +49 -40
- package/dist/internal/ForcePortalRoot.svelte +7 -3
- package/dist/internal/FormFields.svelte +47 -34
- package/dist/internal/FormFieldsProvider.svelte +9 -5
- package/dist/internal/FormResolver.svelte +25 -16
- package/dist/internal/Hidden.svelte +45 -38
- package/dist/internal/Hidden.svelte.d.ts +4 -30
- package/dist/internal/MainTreeProvider.svelte +90 -37
- package/dist/internal/Portal.svelte +18 -14
- package/dist/label/Label.svelte +100 -59
- package/dist/label/Label.svelte.d.ts +7 -32
- package/dist/legend/Legend.svelte +27 -4
- package/dist/legend/Legend.svelte.d.ts +4 -3
- package/dist/listbox/Listbox.svelte +518 -391
- package/dist/listbox/Listbox.svelte.d.ts +11 -35
- package/dist/listbox/ListboxButton.svelte +175 -128
- package/dist/listbox/ListboxButton.svelte.d.ts +5 -32
- package/dist/listbox/ListboxOption.svelte +171 -130
- package/dist/listbox/ListboxOption.svelte.d.ts +12 -26
- package/dist/listbox/ListboxOptions.svelte +403 -305
- package/dist/listbox/ListboxOptions.svelte.d.ts +4 -38
- package/dist/listbox/ListboxSelectedOption.svelte +40 -19
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +8 -33
- package/dist/menu/Menu.svelte +76 -52
- package/dist/menu/Menu.svelte.d.ts +3 -31
- package/dist/menu/MenuButton.svelte +158 -118
- package/dist/menu/MenuButton.svelte.d.ts +4 -34
- package/dist/menu/MenuHeading.svelte +34 -15
- package/dist/menu/MenuHeading.svelte.d.ts +4 -31
- package/dist/menu/MenuItem.svelte +143 -108
- package/dist/menu/MenuItem.svelte.d.ts +5 -32
- package/dist/menu/MenuItems.svelte +301 -230
- package/dist/menu/MenuItems.svelte.d.ts +4 -38
- package/dist/menu/MenuSection.svelte +26 -10
- package/dist/menu/MenuSection.svelte.d.ts +5 -29
- package/dist/menu/MenuSeparator.svelte +20 -5
- package/dist/menu/MenuSeparator.svelte.d.ts +5 -28
- package/dist/popover/Popover.svelte +217 -151
- package/dist/popover/Popover.svelte.d.ts +4 -30
- package/dist/popover/PopoverBackdrop.svelte +71 -42
- package/dist/popover/PopoverBackdrop.svelte.d.ts +6 -34
- package/dist/popover/PopoverButton.svelte +302 -222
- package/dist/popover/PopoverButton.svelte.d.ts +6 -29
- package/dist/popover/PopoverGroup.svelte +64 -36
- package/dist/popover/PopoverGroup.svelte.d.ts +5 -28
- package/dist/popover/PopoverPanel.svelte +335 -248
- package/dist/popover/PopoverPanel.svelte.d.ts +5 -36
- package/dist/popover/index.d.ts +1 -1
- package/dist/portal/InternalPortal.svelte +143 -86
- package/dist/portal/InternalPortal.svelte.d.ts +4 -30
- package/dist/portal/Portal.svelte +8 -4
- package/dist/portal/Portal.svelte.d.ts +2 -18
- package/dist/portal/PortalGroup.svelte +23 -10
- package/dist/portal/PortalGroup.svelte.d.ts +3 -31
- package/dist/select/Select.svelte +100 -69
- package/dist/select/Select.svelte.d.ts +5 -32
- package/dist/switch/Switch.svelte +181 -133
- package/dist/switch/Switch.svelte.d.ts +5 -38
- package/dist/switch/SwitchGroup.svelte +45 -32
- package/dist/switch/SwitchGroup.svelte.d.ts +7 -28
- package/dist/tabs/Tab.svelte +195 -143
- package/dist/tabs/Tab.svelte.d.ts +4 -32
- package/dist/tabs/TabGroup.svelte +87 -57
- package/dist/tabs/TabGroup.svelte.d.ts +4 -34
- package/dist/tabs/TabList.svelte +31 -12
- package/dist/tabs/TabList.svelte.d.ts +5 -28
- package/dist/tabs/TabPanel.svelte +69 -44
- package/dist/tabs/TabPanel.svelte.d.ts +4 -34
- package/dist/tabs/TabPanels.svelte +19 -8
- package/dist/tabs/TabPanels.svelte.d.ts +5 -27
- package/dist/textarea/Textarea.svelte +87 -54
- package/dist/textarea/Textarea.svelte.d.ts +13 -27
- package/dist/transition/InternalTransitionChild.svelte +267 -171
- package/dist/transition/InternalTransitionChild.svelte.d.ts +3 -33
- package/dist/transition/Transition.svelte +88 -67
- package/dist/transition/Transition.svelte.d.ts +3 -36
- package/dist/transition/TransitionChild.svelte +31 -12
- package/dist/transition/TransitionChild.svelte.d.ts +8 -35
- package/dist/transition/context.svelte.js +7 -7
- package/dist/utils/DisabledProvider.svelte +7 -3
- package/dist/utils/ElementOrComponent.svelte +88 -24
- package/dist/utils/ElementOrComponent.svelte.d.ts +32 -27
- package/dist/utils/StableCollection.svelte +54 -36
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +27 -12
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +88 -44
- package/dist/utils/state.js +4 -4
- package/dist/utils/types.d.ts +14 -12
- package/package.json +12 -12
- package/dist/combobox/Combobox.svelte +0 -6
- package/dist/combobox/Combobox.svelte.d.ts +0 -50
- package/dist/utils/Generic.svelte +0 -46
- package/dist/utils/Generic.svelte.d.ts +0 -32
- package/dist/utils/alternative-types.d.ts +0 -20
- package/dist/utils/alternative-types.js +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { Props, ElementType } from "../utils/types.js";
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
3
2
|
declare const DEFAULT_BUTTON_TAG: "button";
|
|
4
3
|
type ButtonRenderPropArg = {
|
|
5
4
|
open: boolean;
|
|
@@ -9,41 +8,12 @@ type ButtonRenderPropArg = {
|
|
|
9
8
|
disabled: boolean;
|
|
10
9
|
autofocus: boolean;
|
|
11
10
|
};
|
|
12
|
-
type
|
|
13
|
-
|
|
11
|
+
export type MenuButtonProps = Props<typeof DEFAULT_BUTTON_TAG, ButtonRenderPropArg, {
|
|
12
|
+
element?: HTMLElement;
|
|
14
13
|
id?: string;
|
|
15
14
|
disabled?: boolean;
|
|
16
15
|
autofocus?: boolean;
|
|
17
16
|
type?: string;
|
|
18
17
|
}>;
|
|
19
|
-
declare
|
|
20
|
-
props(): {
|
|
21
|
-
as?: TTag | undefined;
|
|
22
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "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) & {
|
|
23
|
-
children?: Snippet<[{
|
|
24
|
-
slot: ButtonRenderPropArg;
|
|
25
|
-
props: Record<string, any>;
|
|
26
|
-
}]> | undefined;
|
|
27
|
-
class?: string | ((bag: ButtonRenderPropArg) => string) | null | undefined;
|
|
28
|
-
ref?: HTMLElement;
|
|
29
|
-
} & {
|
|
30
|
-
id?: string;
|
|
31
|
-
disabled?: boolean;
|
|
32
|
-
autofocus?: boolean;
|
|
33
|
-
type?: string;
|
|
34
|
-
};
|
|
35
|
-
events(): {};
|
|
36
|
-
slots(): {};
|
|
37
|
-
bindings(): "ref";
|
|
38
|
-
exports(): {};
|
|
39
|
-
}
|
|
40
|
-
interface $$IsomorphicComponent {
|
|
41
|
-
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']>> & {
|
|
42
|
-
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
43
|
-
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
44
|
-
<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
45
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
46
|
-
}
|
|
47
|
-
declare const MenuButton: $$IsomorphicComponent;
|
|
48
|
-
type MenuButton<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = InstanceType<typeof MenuButton<TTag>>;
|
|
18
|
+
declare const MenuButton: import("svelte").Component<MenuButtonProps, {}, "element">;
|
|
49
19
|
export default MenuButton;
|
|
@@ -1,19 +1,38 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import { onMount } from "svelte"
|
|
3
|
+
import type { SvelteHTMLElements } from "svelte/elements"
|
|
4
|
+
import type { Props } from "../utils/types.js"
|
|
5
|
+
|
|
6
|
+
const DEFAULT_HEADING_TAG = "header" as const
|
|
7
|
+
type HeadingRenderPropArg = {}
|
|
8
|
+
type HeadingPropsWeControl = "role"
|
|
9
|
+
|
|
10
|
+
export type MenuHeadingProps = Props<
|
|
11
|
+
typeof DEFAULT_HEADING_TAG,
|
|
12
|
+
HeadingRenderPropArg,
|
|
13
|
+
{
|
|
14
|
+
element?: HTMLElement
|
|
15
|
+
id?: string
|
|
16
|
+
}
|
|
17
|
+
>
|
|
3
18
|
</script>
|
|
4
19
|
|
|
5
|
-
<script lang="ts"
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
20
|
+
<script lang="ts">
|
|
21
|
+
import { useId } from "../hooks/use-id.js"
|
|
22
|
+
import { useLabelContext } from "../label/context.svelte.js"
|
|
23
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
24
|
+
|
|
25
|
+
const internalId = useId()
|
|
26
|
+
let {
|
|
27
|
+
element = $bindable(),
|
|
28
|
+
id = `headlessui-menu-heading-${internalId}`,
|
|
29
|
+
...theirProps
|
|
30
|
+
}: MenuHeadingProps = $props()
|
|
31
|
+
|
|
32
|
+
const context = useLabelContext()
|
|
33
|
+
onMount(() => context.register(id))
|
|
34
|
+
|
|
35
|
+
const ourProps = $derived({ id, role: "presentation", ...context.props })
|
|
17
36
|
</script>
|
|
18
37
|
|
|
19
|
-
<ElementOrComponent {ourProps} {theirProps} defaultTag={DEFAULT_HEADING_TAG} name="MenuItem" bind:
|
|
38
|
+
<ElementOrComponent {ourProps} {theirProps} defaultTag={DEFAULT_HEADING_TAG} name="MenuItem" bind:element />
|
|
@@ -1,36 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { ElementType, Props } from "../utils/types.js";
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
3
2
|
declare const DEFAULT_HEADING_TAG: "header";
|
|
4
3
|
type HeadingRenderPropArg = {};
|
|
5
|
-
type
|
|
6
|
-
|
|
4
|
+
export type MenuHeadingProps = Props<typeof DEFAULT_HEADING_TAG, HeadingRenderPropArg, {
|
|
5
|
+
element?: HTMLElement;
|
|
7
6
|
id?: string;
|
|
8
7
|
}>;
|
|
9
|
-
declare
|
|
10
|
-
props(): {
|
|
11
|
-
as?: TTag | undefined;
|
|
12
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "id" | "role"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
13
|
-
children?: Snippet<[{
|
|
14
|
-
slot: HeadingRenderPropArg;
|
|
15
|
-
props: Record<string, any>;
|
|
16
|
-
}]> | undefined;
|
|
17
|
-
class?: string | ((bag: HeadingRenderPropArg) => string) | null | undefined;
|
|
18
|
-
ref?: HTMLElement;
|
|
19
|
-
} & {
|
|
20
|
-
id?: string;
|
|
21
|
-
};
|
|
22
|
-
events(): {};
|
|
23
|
-
slots(): {};
|
|
24
|
-
bindings(): "ref";
|
|
25
|
-
exports(): {};
|
|
26
|
-
}
|
|
27
|
-
interface $$IsomorphicComponent {
|
|
28
|
-
new <TTag extends ElementType = typeof DEFAULT_HEADING_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']>> & {
|
|
29
|
-
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
30
|
-
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
31
|
-
<TTag extends ElementType = typeof DEFAULT_HEADING_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
32
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
33
|
-
}
|
|
34
|
-
declare const MenuHeading: $$IsomorphicComponent;
|
|
35
|
-
type MenuHeading<TTag extends ElementType = typeof DEFAULT_HEADING_TAG> = InstanceType<typeof MenuHeading<TTag>>;
|
|
8
|
+
declare const MenuHeading: import("svelte").Component<MenuHeadingProps, {}, "element">;
|
|
36
9
|
export default MenuHeading;
|
|
@@ -1,114 +1,149 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Props } from "../utils/types.js"
|
|
3
|
+
import { onMount } from "svelte"
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
14
|
-
import { mergeProps } from "../utils/render.js";
|
|
15
|
-
import { useDescriptions } from "../description/context.svelte.js";
|
|
16
|
-
const internalId = useId();
|
|
17
|
-
let {
|
|
18
|
-
ref = $bindable(),
|
|
19
|
-
id = `headlessui-menu-item-${internalId}`,
|
|
20
|
-
disabled = false,
|
|
21
|
-
...theirProps
|
|
22
|
-
} = $props();
|
|
23
|
-
const _state = useMenuContext("MenuItem");
|
|
24
|
-
const active = $derived(_state.activeItemIndex !== null ? _state.items[_state.activeItemIndex].id === id : false);
|
|
25
|
-
$effect(() => {
|
|
26
|
-
_state.activeItemIndex;
|
|
27
|
-
if (_state.__demoMode) return;
|
|
28
|
-
if (_state.menuState !== MenuStates.Open) return;
|
|
29
|
-
if (!active) return;
|
|
30
|
-
if (_state.activationTrigger === ActivationTrigger.Pointer) return;
|
|
31
|
-
return disposables().requestAnimationFrame(() => {
|
|
32
|
-
;
|
|
33
|
-
ref?.scrollIntoView?.({ block: "nearest" });
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
const getTextValue = useTextValue({
|
|
37
|
-
get element() {
|
|
38
|
-
return ref || null;
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
const bag = $derived({
|
|
42
|
-
disabled,
|
|
43
|
-
domRef: { current: ref || null },
|
|
44
|
-
get textValue() {
|
|
45
|
-
return getTextValue();
|
|
5
|
+
const DEFAULT_ITEM_TAG = "button" as const
|
|
6
|
+
type ItemRenderPropArg = {
|
|
7
|
+
/** @deprecated use `focus` instead */
|
|
8
|
+
active: boolean
|
|
9
|
+
focus: boolean
|
|
10
|
+
disabled: boolean
|
|
11
|
+
close: () => void
|
|
12
|
+
props?: Record<string, any>
|
|
46
13
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
14
|
+
type ItemPropsWeControl = "aria-describedby" | "aria-disabled" | "aria-labelledby" | "role" | "tabIndex"
|
|
15
|
+
|
|
16
|
+
export type MenuItemProps = Props<
|
|
17
|
+
typeof DEFAULT_ITEM_TAG,
|
|
18
|
+
ItemRenderPropArg,
|
|
19
|
+
{
|
|
20
|
+
element?: HTMLElement
|
|
21
|
+
id?: string
|
|
22
|
+
disabled?: boolean
|
|
52
23
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
_state
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
24
|
+
>
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<script lang="ts">
|
|
28
|
+
import { useId } from "../hooks/use-id.js"
|
|
29
|
+
import { ActivationTrigger, MenuStates, useMenuContext, type MenuItemDataRef } from "./context.svelte.js"
|
|
30
|
+
import { disposables } from "../utils/disposables.js"
|
|
31
|
+
import { useTextValue } from "../hooks/use-text-value.svelte.js"
|
|
32
|
+
import { restoreFocusIfNecessary } from "../utils/focus-management.js"
|
|
33
|
+
import { Focus } from "../utils/calculate-active-index.js"
|
|
34
|
+
import { useTrackedPointer } from "../hooks/use-tracked-pointer.js"
|
|
35
|
+
import { useLabels } from "../label/context.svelte.js"
|
|
36
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
37
|
+
import { mergeProps } from "../utils/render.js"
|
|
38
|
+
import { useDescriptions } from "../description/context.svelte.js"
|
|
39
|
+
|
|
40
|
+
const internalId = useId()
|
|
41
|
+
let {
|
|
42
|
+
element = $bindable(),
|
|
43
|
+
id = `headlessui-menu-item-${internalId}`,
|
|
44
|
+
disabled = false,
|
|
45
|
+
...theirProps
|
|
46
|
+
}: MenuItemProps = $props()
|
|
47
|
+
const _state = useMenuContext("MenuItem")
|
|
48
|
+
const active = $derived(_state.activeItemIndex !== null ? _state.items[_state.activeItemIndex].id === id : false)
|
|
49
|
+
|
|
50
|
+
$effect(() => {
|
|
51
|
+
/* We also want to trigger this when the position of the active item changes so that we can re-trigger the scrollIntoView */
|
|
52
|
+
_state.activeItemIndex
|
|
53
|
+
if (_state.__demoMode) return
|
|
54
|
+
if (_state.menuState !== MenuStates.Open) return
|
|
55
|
+
if (!active) return
|
|
56
|
+
if (_state.activationTrigger === ActivationTrigger.Pointer) return
|
|
57
|
+
return disposables().requestAnimationFrame(() => {
|
|
58
|
+
;(element as HTMLElement)?.scrollIntoView?.({ block: "nearest" })
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
const getTextValue = useTextValue({
|
|
63
|
+
get element() {
|
|
64
|
+
return element || null
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
const bag: MenuItemDataRef["current"] = $derived({
|
|
69
|
+
disabled,
|
|
70
|
+
domRef: { current: element || null },
|
|
71
|
+
get textValue() {
|
|
72
|
+
return getTextValue()
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
onMount(() => {
|
|
77
|
+
_state.registerItem(id, {
|
|
78
|
+
get current() {
|
|
79
|
+
return bag
|
|
80
|
+
},
|
|
81
|
+
})
|
|
82
|
+
return () => _state.unregisterItem(id)
|
|
110
83
|
})
|
|
111
|
-
|
|
84
|
+
|
|
85
|
+
const handleClick = (event: MouseEvent) => {
|
|
86
|
+
if (disabled) return event.preventDefault()
|
|
87
|
+
_state.closeMenu()
|
|
88
|
+
restoreFocusIfNecessary(_state.buttonElement)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const handleFocus = () => {
|
|
92
|
+
if (disabled) return _state.goToItem({ focus: Focus.Nothing })
|
|
93
|
+
_state.goToItem({ focus: Focus.Specific, id })
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const pointer = useTrackedPointer()
|
|
97
|
+
|
|
98
|
+
const handleEnter = (evt: PointerEvent) => {
|
|
99
|
+
pointer.update(evt)
|
|
100
|
+
if (disabled) return
|
|
101
|
+
if (active) return
|
|
102
|
+
_state.goToItem({ focus: Focus.Specific, id, trigger: ActivationTrigger.Pointer })
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const handleMove = (evt: PointerEvent) => {
|
|
106
|
+
if (!pointer.wasMoved(evt)) return
|
|
107
|
+
if (disabled) return
|
|
108
|
+
if (active) return
|
|
109
|
+
_state.goToItem({ focus: Focus.Specific, id, trigger: ActivationTrigger.Pointer })
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const handleLeave = (evt: PointerEvent) => {
|
|
113
|
+
if (!pointer.wasMoved(evt)) return
|
|
114
|
+
if (disabled) return
|
|
115
|
+
if (!active) return
|
|
116
|
+
_state.goToItem({ focus: Focus.Nothing })
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const labelledby = useLabels()
|
|
120
|
+
const describedby = useDescriptions()
|
|
121
|
+
|
|
122
|
+
const slot = $derived({
|
|
123
|
+
active,
|
|
124
|
+
focus: active,
|
|
125
|
+
disabled,
|
|
126
|
+
close: _state.closeMenu,
|
|
127
|
+
} satisfies ItemRenderPropArg)
|
|
128
|
+
const ourProps = $derived(
|
|
129
|
+
mergeProps({
|
|
130
|
+
id,
|
|
131
|
+
role: "menuitem",
|
|
132
|
+
tabindex: disabled === true ? undefined : -1,
|
|
133
|
+
"aria-disabled": disabled === true ? true : undefined,
|
|
134
|
+
"aria-labelledby": labelledby.value,
|
|
135
|
+
"aria-describedby": describedby.value,
|
|
136
|
+
disabled: undefined, // Never forward the `disabled` prop
|
|
137
|
+
onclick: handleClick,
|
|
138
|
+
onfocus: handleFocus,
|
|
139
|
+
onpointerenter: handleEnter,
|
|
140
|
+
onmouseenter: handleEnter,
|
|
141
|
+
onpointermove: handleMove,
|
|
142
|
+
onmousemove: handleMove,
|
|
143
|
+
onpointerleave: handleLeave,
|
|
144
|
+
onmouseleave: handleLeave,
|
|
145
|
+
})
|
|
146
|
+
)
|
|
112
147
|
</script>
|
|
113
148
|
|
|
114
|
-
<ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_ITEM_TAG} name="MenuItem" bind:
|
|
149
|
+
<ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_ITEM_TAG} name="MenuItem" bind:element />
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Props
|
|
2
|
-
declare const DEFAULT_ITEM_TAG: "
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
2
|
+
declare const DEFAULT_ITEM_TAG: "button";
|
|
3
3
|
type ItemRenderPropArg = {
|
|
4
4
|
/** @deprecated use `focus` instead */
|
|
5
5
|
active: boolean;
|
|
@@ -8,37 +8,10 @@ type ItemRenderPropArg = {
|
|
|
8
8
|
close: () => void;
|
|
9
9
|
props?: Record<string, any>;
|
|
10
10
|
};
|
|
11
|
-
type
|
|
12
|
-
|
|
11
|
+
export type MenuItemProps = Props<typeof DEFAULT_ITEM_TAG, ItemRenderPropArg, {
|
|
12
|
+
element?: HTMLElement;
|
|
13
13
|
id?: string;
|
|
14
14
|
disabled?: boolean;
|
|
15
15
|
}>;
|
|
16
|
-
declare
|
|
17
|
-
props(): {
|
|
18
|
-
as?: TTag | undefined;
|
|
19
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "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) & {
|
|
20
|
-
children?: import("svelte").Snippet<[{
|
|
21
|
-
slot: ItemRenderPropArg;
|
|
22
|
-
props: Record<string, any>;
|
|
23
|
-
}]> | undefined;
|
|
24
|
-
class?: string | ((bag: ItemRenderPropArg) => string) | null | undefined;
|
|
25
|
-
ref?: HTMLElement;
|
|
26
|
-
} & {
|
|
27
|
-
id?: string;
|
|
28
|
-
disabled?: boolean;
|
|
29
|
-
};
|
|
30
|
-
events(): {};
|
|
31
|
-
slots(): {};
|
|
32
|
-
bindings(): "ref";
|
|
33
|
-
exports(): {};
|
|
34
|
-
}
|
|
35
|
-
interface $$IsomorphicComponent {
|
|
36
|
-
new <TTag extends ElementType = typeof DEFAULT_ITEM_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']>> & {
|
|
37
|
-
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
38
|
-
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
39
|
-
<TTag extends ElementType = typeof DEFAULT_ITEM_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
40
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
41
|
-
}
|
|
42
|
-
declare const MenuItem: $$IsomorphicComponent;
|
|
43
|
-
type MenuItem<TTag extends ElementType = typeof DEFAULT_ITEM_TAG> = InstanceType<typeof MenuItem<TTag>>;
|
|
16
|
+
declare const MenuItem: import("svelte").Component<MenuItemProps, {}, "element">;
|
|
44
17
|
export default MenuItem;
|