@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.
Files changed (123) hide show
  1. package/dist/button/Button.svelte +84 -55
  2. package/dist/button/Button.svelte.d.ts +4 -32
  3. package/dist/checkbox/Checkbox.svelte +177 -121
  4. package/dist/checkbox/Checkbox.svelte.d.ts +14 -32
  5. package/dist/close-button/CloseButton.svelte +10 -7
  6. package/dist/close-button/CloseButton.svelte.d.ts +2 -44
  7. package/dist/data-interactive/DataInteractive.svelte +49 -37
  8. package/dist/data-interactive/DataInteractive.svelte.d.ts +7 -30
  9. package/dist/description/Description.svelte +35 -22
  10. package/dist/description/Description.svelte.d.ts +7 -28
  11. package/dist/dialog/Dialog.svelte +326 -232
  12. package/dist/dialog/Dialog.svelte.d.ts +4 -42
  13. package/dist/dialog/DialogBackdrop.svelte +33 -16
  14. package/dist/dialog/DialogBackdrop.svelte.d.ts +4 -29
  15. package/dist/dialog/DialogPanel.svelte +60 -29
  16. package/dist/dialog/DialogPanel.svelte.d.ts +4 -30
  17. package/dist/dialog/DialogTitle.svelte +51 -24
  18. package/dist/dialog/DialogTitle.svelte.d.ts +6 -27
  19. package/dist/field/Field.svelte +44 -28
  20. package/dist/field/Field.svelte.d.ts +4 -30
  21. package/dist/fieldset/Fieldset.svelte +48 -30
  22. package/dist/fieldset/Fieldset.svelte.d.ts +5 -31
  23. package/dist/focus-trap/FocusTrap.svelte +430 -298
  24. package/dist/focus-trap/FocusTrap.svelte.d.ts +5 -34
  25. package/dist/hooks/use-inert-others.svelte.js +10 -10
  26. package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
  27. package/dist/input/Input.svelte +95 -54
  28. package/dist/input/Input.svelte.d.ts +13 -27
  29. package/dist/internal/FloatingProvider.svelte +14 -9
  30. package/dist/internal/FocusSentinel.svelte +49 -40
  31. package/dist/internal/ForcePortalRoot.svelte +7 -3
  32. package/dist/internal/FormFields.svelte +47 -34
  33. package/dist/internal/FormFieldsProvider.svelte +9 -5
  34. package/dist/internal/FormResolver.svelte +25 -16
  35. package/dist/internal/Hidden.svelte +45 -38
  36. package/dist/internal/Hidden.svelte.d.ts +4 -30
  37. package/dist/internal/MainTreeProvider.svelte +90 -37
  38. package/dist/internal/Portal.svelte +18 -14
  39. package/dist/label/Label.svelte +100 -59
  40. package/dist/label/Label.svelte.d.ts +7 -32
  41. package/dist/legend/Legend.svelte +27 -4
  42. package/dist/legend/Legend.svelte.d.ts +4 -3
  43. package/dist/listbox/Listbox.svelte +518 -391
  44. package/dist/listbox/Listbox.svelte.d.ts +11 -35
  45. package/dist/listbox/ListboxButton.svelte +175 -128
  46. package/dist/listbox/ListboxButton.svelte.d.ts +5 -32
  47. package/dist/listbox/ListboxOption.svelte +171 -130
  48. package/dist/listbox/ListboxOption.svelte.d.ts +12 -26
  49. package/dist/listbox/ListboxOptions.svelte +403 -305
  50. package/dist/listbox/ListboxOptions.svelte.d.ts +4 -38
  51. package/dist/listbox/ListboxSelectedOption.svelte +40 -19
  52. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +8 -33
  53. package/dist/menu/Menu.svelte +76 -52
  54. package/dist/menu/Menu.svelte.d.ts +3 -31
  55. package/dist/menu/MenuButton.svelte +158 -118
  56. package/dist/menu/MenuButton.svelte.d.ts +4 -34
  57. package/dist/menu/MenuHeading.svelte +34 -15
  58. package/dist/menu/MenuHeading.svelte.d.ts +4 -31
  59. package/dist/menu/MenuItem.svelte +143 -108
  60. package/dist/menu/MenuItem.svelte.d.ts +5 -32
  61. package/dist/menu/MenuItems.svelte +301 -230
  62. package/dist/menu/MenuItems.svelte.d.ts +4 -38
  63. package/dist/menu/MenuSection.svelte +26 -10
  64. package/dist/menu/MenuSection.svelte.d.ts +5 -29
  65. package/dist/menu/MenuSeparator.svelte +20 -5
  66. package/dist/menu/MenuSeparator.svelte.d.ts +5 -28
  67. package/dist/popover/Popover.svelte +217 -151
  68. package/dist/popover/Popover.svelte.d.ts +4 -30
  69. package/dist/popover/PopoverBackdrop.svelte +71 -42
  70. package/dist/popover/PopoverBackdrop.svelte.d.ts +6 -34
  71. package/dist/popover/PopoverButton.svelte +302 -222
  72. package/dist/popover/PopoverButton.svelte.d.ts +6 -29
  73. package/dist/popover/PopoverGroup.svelte +64 -36
  74. package/dist/popover/PopoverGroup.svelte.d.ts +5 -28
  75. package/dist/popover/PopoverPanel.svelte +335 -248
  76. package/dist/popover/PopoverPanel.svelte.d.ts +5 -36
  77. package/dist/popover/index.d.ts +1 -1
  78. package/dist/portal/InternalPortal.svelte +143 -86
  79. package/dist/portal/InternalPortal.svelte.d.ts +4 -30
  80. package/dist/portal/Portal.svelte +8 -4
  81. package/dist/portal/Portal.svelte.d.ts +2 -18
  82. package/dist/portal/PortalGroup.svelte +23 -10
  83. package/dist/portal/PortalGroup.svelte.d.ts +3 -31
  84. package/dist/select/Select.svelte +100 -69
  85. package/dist/select/Select.svelte.d.ts +5 -32
  86. package/dist/switch/Switch.svelte +181 -133
  87. package/dist/switch/Switch.svelte.d.ts +5 -38
  88. package/dist/switch/SwitchGroup.svelte +45 -32
  89. package/dist/switch/SwitchGroup.svelte.d.ts +7 -28
  90. package/dist/tabs/Tab.svelte +195 -143
  91. package/dist/tabs/Tab.svelte.d.ts +4 -32
  92. package/dist/tabs/TabGroup.svelte +87 -57
  93. package/dist/tabs/TabGroup.svelte.d.ts +4 -34
  94. package/dist/tabs/TabList.svelte +31 -12
  95. package/dist/tabs/TabList.svelte.d.ts +5 -28
  96. package/dist/tabs/TabPanel.svelte +69 -44
  97. package/dist/tabs/TabPanel.svelte.d.ts +4 -34
  98. package/dist/tabs/TabPanels.svelte +19 -8
  99. package/dist/tabs/TabPanels.svelte.d.ts +5 -27
  100. package/dist/textarea/Textarea.svelte +87 -54
  101. package/dist/textarea/Textarea.svelte.d.ts +13 -27
  102. package/dist/transition/InternalTransitionChild.svelte +267 -171
  103. package/dist/transition/InternalTransitionChild.svelte.d.ts +3 -33
  104. package/dist/transition/Transition.svelte +88 -67
  105. package/dist/transition/Transition.svelte.d.ts +3 -36
  106. package/dist/transition/TransitionChild.svelte +31 -12
  107. package/dist/transition/TransitionChild.svelte.d.ts +8 -35
  108. package/dist/transition/context.svelte.js +7 -7
  109. package/dist/utils/DisabledProvider.svelte +7 -3
  110. package/dist/utils/ElementOrComponent.svelte +88 -24
  111. package/dist/utils/ElementOrComponent.svelte.d.ts +32 -27
  112. package/dist/utils/StableCollection.svelte +54 -36
  113. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +27 -12
  114. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +88 -44
  115. package/dist/utils/state.js +4 -4
  116. package/dist/utils/types.d.ts +14 -12
  117. package/package.json +12 -12
  118. package/dist/combobox/Combobox.svelte +0 -6
  119. package/dist/combobox/Combobox.svelte.d.ts +0 -50
  120. package/dist/utils/Generic.svelte +0 -46
  121. package/dist/utils/Generic.svelte.d.ts +0 -32
  122. package/dist/utils/alternative-types.d.ts +0 -20
  123. package/dist/utils/alternative-types.js +0 -1
@@ -1,5 +1,4 @@
1
- import { type Snippet } from "svelte";
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 ButtonPropsWeControl = "aria-controls" | "aria-expanded" | "aria-haspopup";
13
- export type MenuButtonProps<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = Props<TTag, ButtonRenderPropArg, ButtonPropsWeControl, {
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 class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> {
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>import { onMount } from "svelte";
2
- const DEFAULT_HEADING_TAG = "header";
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" generics="TTag extends ElementType = typeof DEFAULT_HEADING_TAG">import { useId } from "../hooks/use-id.js";
6
- import { useLabelContext } from "../label/context.svelte.js";
7
- import ElementOrComponent from "../utils/ElementOrComponent.svelte";
8
- const internalId = useId();
9
- let {
10
- ref = $bindable(),
11
- id = `headlessui-menu-heading-${internalId}`,
12
- ...theirProps
13
- } = $props();
14
- const context = useLabelContext();
15
- onMount(() => context.register(id));
16
- const ourProps = $derived({ id, role: "presentation", ...context.props });
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:ref />
38
+ <ElementOrComponent {ourProps} {theirProps} defaultTag={DEFAULT_HEADING_TAG} name="MenuItem" bind:element />
@@ -1,36 +1,9 @@
1
- import { type Snippet } from "svelte";
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 HeadingPropsWeControl = "role";
6
- export type MenuHeadingProps<TTag extends ElementType = typeof DEFAULT_HEADING_TAG> = Props<TTag, HeadingRenderPropArg, HeadingPropsWeControl, {
4
+ export type MenuHeadingProps = Props<typeof DEFAULT_HEADING_TAG, HeadingRenderPropArg, {
5
+ element?: HTMLElement;
7
6
  id?: string;
8
7
  }>;
9
- declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_HEADING_TAG> {
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>import { onMount } from "svelte";
2
- const DEFAULT_ITEM_TAG = "svelte:fragment";
3
- </script>
1
+ <script lang="ts" module>
2
+ import type { Props } from "../utils/types.js"
3
+ import { onMount } from "svelte"
4
4
 
5
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_ITEM_TAG">import { useId } from "../hooks/use-id.js";
6
- import { ActivationTrigger, MenuStates, useMenuContext } from "./context.svelte.js";
7
- import { disposables } from "../utils/disposables.js";
8
- import { useTextValue } from "../hooks/use-text-value.svelte.js";
9
- import { restoreFocusIfNecessary } from "../utils/focus-management.js";
10
- import { Focus } from "../utils/calculate-active-index.js";
11
- import { useTrackedPointer } from "../hooks/use-tracked-pointer.js";
12
- import { useLabels } from "../label/context.svelte.js";
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
- onMount(() => {
49
- _state.registerItem(id, {
50
- get current() {
51
- return bag;
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
- return () => _state.unregisterItem(id);
55
- });
56
- const handleClick = (event) => {
57
- if (disabled) return event.preventDefault();
58
- _state.closeMenu();
59
- restoreFocusIfNecessary(_state.buttonElement);
60
- };
61
- const handleFocus = () => {
62
- if (disabled) return _state.goToItem({ focus: Focus.Nothing });
63
- _state.goToItem({ focus: Focus.Specific, id });
64
- };
65
- const pointer = useTrackedPointer();
66
- const handleEnter = (evt) => {
67
- pointer.update(evt);
68
- if (disabled) return;
69
- if (active) return;
70
- _state.goToItem({ focus: Focus.Specific, id, trigger: ActivationTrigger.Pointer });
71
- };
72
- const handleMove = (evt) => {
73
- if (!pointer.wasMoved(evt)) return;
74
- if (disabled) return;
75
- if (active) return;
76
- _state.goToItem({ focus: Focus.Specific, id, trigger: ActivationTrigger.Pointer });
77
- };
78
- const handleLeave = (evt) => {
79
- if (!pointer.wasMoved(evt)) return;
80
- if (disabled) return;
81
- if (!active) return;
82
- _state.goToItem({ focus: Focus.Nothing });
83
- };
84
- const labelledby = useLabels();
85
- const describedby = useDescriptions();
86
- const slot = $derived({
87
- active,
88
- focus: active,
89
- disabled,
90
- close: _state.closeMenu
91
- });
92
- const ourProps = $derived(
93
- mergeProps({
94
- id,
95
- role: "menuitem",
96
- tabindex: disabled === true ? void 0 : -1,
97
- "aria-disabled": disabled === true ? true : void 0,
98
- "aria-labelledby": labelledby.value,
99
- "aria-describedby": describedby.value,
100
- disabled: void 0,
101
- // Never forward the `disabled` prop
102
- onclick: handleClick,
103
- onfocus: handleFocus,
104
- onpointerenter: handleEnter,
105
- onmouseenter: handleEnter,
106
- onpointermove: handleMove,
107
- onmousemove: handleMove,
108
- onpointerleave: handleLeave,
109
- onmouseleave: handleLeave
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:ref />
149
+ <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_ITEM_TAG} name="MenuItem" bind:element />
@@ -1,5 +1,5 @@
1
- import type { Props, ElementType } from "../utils/types.js";
2
- declare const DEFAULT_ITEM_TAG: "svelte:fragment";
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 ItemPropsWeControl = "aria-describedby" | "aria-disabled" | "aria-labelledby" | "role" | "tabIndex";
12
- export type MenuItemProps<TTag extends ElementType = typeof DEFAULT_ITEM_TAG> = Props<TTag, ItemRenderPropArg, ItemPropsWeControl, {
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 class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_ITEM_TAG> {
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;