@pzerelles/headlessui-svelte 2.1.2-next.23 → 2.1.2-next.24

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 (127) hide show
  1. package/dist/button/Button.svelte +84 -54
  2. package/dist/button/Button.svelte.d.ts +7 -4
  3. package/dist/checkbox/Checkbox.svelte +173 -120
  4. package/dist/checkbox/Checkbox.svelte.d.ts +7 -4
  5. package/dist/close-button/CloseButton.svelte +12 -6
  6. package/dist/close-button/CloseButton.svelte.d.ts +13 -10
  7. package/dist/combobox/Combobox.svelte +50 -3
  8. package/dist/data-interactive/DataInteractive.svelte +55 -29
  9. package/dist/data-interactive/DataInteractive.svelte.d.ts +7 -5
  10. package/dist/description/Description.svelte +31 -21
  11. package/dist/description/Description.svelte.d.ts +7 -4
  12. package/dist/dialog/Dialog.svelte +358 -38
  13. package/dist/dialog/Dialog.svelte.d.ts +10 -7
  14. package/dist/dialog/DialogBackdrop.svelte +30 -13
  15. package/dist/dialog/DialogBackdrop.svelte.d.ts +7 -4
  16. package/dist/dialog/DialogPanel.svelte +49 -26
  17. package/dist/dialog/DialogPanel.svelte.d.ts +7 -4
  18. package/dist/dialog/DialogTitle.svelte +38 -23
  19. package/dist/dialog/DialogTitle.svelte.d.ts +7 -4
  20. package/dist/field/Field.svelte +50 -28
  21. package/dist/field/Field.svelte.d.ts +7 -4
  22. package/dist/fieldset/Fieldset.svelte +50 -29
  23. package/dist/fieldset/Fieldset.svelte.d.ts +7 -4
  24. package/dist/focus-trap/FocusTrap.svelte +419 -283
  25. package/dist/focus-trap/FocusTrap.svelte.d.ts +7 -4
  26. package/dist/input/Input.svelte +84 -53
  27. package/dist/input/Input.svelte.d.ts +7 -4
  28. package/dist/internal/FloatingProvider.svelte +14 -9
  29. package/dist/internal/FocusSentinel.svelte +16 -8
  30. package/dist/internal/ForcePortalRoot.svelte +7 -3
  31. package/dist/internal/FormFields.svelte +47 -34
  32. package/dist/internal/FormFieldsProvider.svelte +9 -5
  33. package/dist/internal/FormResolver.svelte +20 -15
  34. package/dist/internal/Hidden.svelte +50 -29
  35. package/dist/internal/Hidden.svelte.d.ts +7 -4
  36. package/dist/internal/MainTreeProvider.svelte +89 -36
  37. package/dist/internal/Portal.svelte +18 -14
  38. package/dist/internal/floating-provider.svelte.js +1 -1
  39. package/dist/internal/floating.svelte.d.ts +5 -5
  40. package/dist/internal/floating.svelte.js +17 -17
  41. package/dist/label/Label.svelte +93 -58
  42. package/dist/label/Label.svelte.d.ts +7 -4
  43. package/dist/legend/Legend.svelte +12 -3
  44. package/dist/listbox/Listbox.svelte +525 -387
  45. package/dist/listbox/Listbox.svelte.d.ts +7 -5
  46. package/dist/listbox/ListboxButton.svelte +173 -127
  47. package/dist/listbox/ListboxButton.svelte.d.ts +7 -5
  48. package/dist/listbox/ListboxOption.svelte +170 -129
  49. package/dist/listbox/ListboxOption.svelte.d.ts +7 -5
  50. package/dist/listbox/ListboxOptions.svelte +400 -304
  51. package/dist/listbox/ListboxOptions.svelte.d.ts +7 -5
  52. package/dist/listbox/ListboxSelectedOption.svelte +38 -15
  53. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +7 -4
  54. package/dist/listbox/index.d.ts +4 -4
  55. package/dist/listbox/index.js +1 -1
  56. package/dist/menu/Menu.svelte +78 -51
  57. package/dist/menu/Menu.svelte.d.ts +7 -5
  58. package/dist/menu/MenuButton.svelte +157 -117
  59. package/dist/menu/MenuButton.svelte.d.ts +7 -5
  60. package/dist/menu/MenuHeading.svelte +32 -14
  61. package/dist/menu/MenuHeading.svelte.d.ts +7 -5
  62. package/dist/menu/MenuItem.svelte +142 -107
  63. package/dist/menu/MenuItem.svelte.d.ts +8 -8
  64. package/dist/menu/MenuItems.svelte +301 -229
  65. package/dist/menu/MenuItems.svelte.d.ts +7 -5
  66. package/dist/menu/MenuSection.svelte +24 -9
  67. package/dist/menu/MenuSection.svelte.d.ts +7 -5
  68. package/dist/menu/MenuSeparator.svelte +17 -4
  69. package/dist/menu/MenuSeparator.svelte.d.ts +7 -6
  70. package/dist/menu/index.d.ts +7 -7
  71. package/dist/popover/Popover.svelte +216 -150
  72. package/dist/popover/Popover.svelte.d.ts +7 -4
  73. package/dist/popover/PopoverBackdrop.svelte +67 -41
  74. package/dist/popover/PopoverBackdrop.svelte.d.ts +7 -4
  75. package/dist/popover/PopoverButton.svelte +292 -212
  76. package/dist/popover/PopoverButton.svelte.d.ts +7 -4
  77. package/dist/popover/PopoverGroup.svelte +62 -35
  78. package/dist/popover/PopoverGroup.svelte.d.ts +7 -4
  79. package/dist/popover/PopoverPanel.svelte +311 -229
  80. package/dist/popover/PopoverPanel.svelte.d.ts +7 -4
  81. package/dist/portal/InternalPortal.svelte +141 -85
  82. package/dist/portal/InternalPortal.svelte.d.ts +7 -4
  83. package/dist/portal/Portal.svelte +5 -2
  84. package/dist/portal/PortalGroup.svelte +30 -9
  85. package/dist/portal/PortalGroup.svelte.d.ts +7 -4
  86. package/dist/select/Select.svelte +98 -68
  87. package/dist/select/Select.svelte.d.ts +7 -4
  88. package/dist/switch/Switch.svelte +179 -132
  89. package/dist/switch/Switch.svelte.d.ts +7 -4
  90. package/dist/switch/SwitchGroup.svelte +44 -31
  91. package/dist/switch/SwitchGroup.svelte.d.ts +7 -4
  92. package/dist/tabs/Tab.svelte +194 -143
  93. package/dist/tabs/Tab.svelte.d.ts +7 -4
  94. package/dist/tabs/TabGroup.svelte +81 -214
  95. package/dist/tabs/TabGroup.svelte.d.ts +7 -24
  96. package/dist/tabs/TabList.svelte +31 -11
  97. package/dist/tabs/TabList.svelte.d.ts +7 -4
  98. package/dist/tabs/TabPanel.svelte +67 -43
  99. package/dist/tabs/TabPanel.svelte.d.ts +7 -4
  100. package/dist/tabs/TabPanels.svelte +18 -7
  101. package/dist/tabs/TabPanels.svelte.d.ts +7 -4
  102. package/dist/tabs/context.svelte.d.ts +31 -0
  103. package/dist/tabs/context.svelte.js +134 -0
  104. package/dist/textarea/Textarea.svelte +84 -53
  105. package/dist/textarea/Textarea.svelte.d.ts +7 -4
  106. package/dist/transition/InternalTransitionChild.svelte +259 -170
  107. package/dist/transition/InternalTransitionChild.svelte.d.ts +7 -4
  108. package/dist/transition/Transition.svelte +96 -66
  109. package/dist/transition/Transition.svelte.d.ts +7 -4
  110. package/dist/transition/TransitionChild.svelte +31 -11
  111. package/dist/transition/TransitionChild.svelte.d.ts +7 -4
  112. package/dist/utils/ElementOrComponent.svelte +43 -23
  113. package/dist/utils/ElementOrComponent.svelte.d.ts +10 -4
  114. package/dist/utils/Generic.svelte +36 -22
  115. package/dist/utils/Generic.svelte.d.ts +7 -4
  116. package/dist/utils/StableCollection.svelte +54 -36
  117. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +27 -12
  118. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +88 -44
  119. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +7 -7
  120. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +1 -1
  121. package/dist/utils/floating-ui/svelte/types.d.ts +4 -4
  122. package/dist/utils/floating-ui/svelte-dom/types.d.ts +2 -2
  123. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +6 -6
  124. package/dist/utils/types.d.ts +11 -4
  125. package/package.json +1 -1
  126. package/dist/dialog/InternalDialog.svelte +0 -233
  127. package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
@@ -14,16 +14,18 @@ export type ListboxOptionsProps<TTag extends ElementType = typeof DEFAULT_OPTION
14
14
  modal?: boolean;
15
15
  transition?: boolean;
16
16
  } & PropsForFeatures<typeof OptionsRenderFeatures>>;
17
- export type ListboxOptionsChildren = Snippet<[OptionsRenderPropArg]>;
18
17
  import { type Snippet } from "svelte";
19
18
  declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG> {
20
19
  props(): {
21
20
  as?: TTag | undefined;
22
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "anchor" | "unmount" | "static" | "id" | "transition" | OptionsPropsWeControl | "portal" | "modal"> 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<[OptionsRenderPropArg, Record<string, any>]> | undefined;
21
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "class") | "anchor" | "unmount" | "static" | "id" | "transition" | OptionsPropsWeControl | "portal" | "modal"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
22
+ children?: Snippet<[{
23
+ slot: OptionsRenderPropArg;
24
+ props: Record<string, any>;
25
+ }]> | undefined;
24
26
  ref?: HTMLElement;
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
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: OptionsRenderPropArg) => string) | undefined;
27
+ } & (true extends (import("svelte/elements").SvelteHTMLElements[TTag] extends infer T_1 ? T_1 extends import("svelte/elements").SvelteHTMLElements[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) ? {
28
+ class?: string | ((bag: OptionsRenderPropArg) => string) | null | undefined;
27
29
  } : {}) & {
28
30
  id?: string;
29
31
  anchor?: AnchorPropsWithSelection;
@@ -1,20 +1,43 @@
1
- <script lang="ts" module>const DEFAULT_SELECTED_OPTION_TAG = "svelte:fragment";
1
+ <script lang="ts" module>
2
+ import type { ElementType, Props } from "../utils/types.js"
3
+ import type { Snippet } from "svelte"
4
+
5
+ const DEFAULT_SELECTED_OPTION_TAG = "svelte:fragment"
6
+ type SelectedOptionRenderPropArg = {}
7
+ type SelectedOptionPropsWeControl = never
8
+
9
+ export type ListboxSelectedOptionProps<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> = Props<
10
+ TTag,
11
+ SelectedOptionRenderPropArg,
12
+ SelectedOptionPropsWeControl,
13
+ {
14
+ options: Snippet
15
+ placeholder?: Snippet
16
+ }
17
+ >
2
18
  </script>
3
19
 
4
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG">import { useData, ValueMode } from "./Listbox.svelte";
5
- import { setContext } from "svelte";
6
- import ElementOrComponent from "../utils/ElementOrComponent.svelte";
7
- let {
8
- ref = $bindable(),
9
- options,
10
- placeholder,
11
- ...theirProps
12
- } = $props();
13
- const data = useData("ListboxSelectedOption");
14
- const shouldShowPlaceholder = $derived(
15
- data.value === void 0 || data.value === null || data.mode === ValueMode.Multi && Array.isArray(data.value) && data.value.length === 0
16
- );
17
- setContext("SelectedOptionContext", true);
20
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG">
21
+ import { useData, ValueMode } from "./Listbox.svelte"
22
+ import { setContext } from "svelte"
23
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte"
24
+
25
+ let {
26
+ ref = $bindable(),
27
+ options,
28
+ placeholder,
29
+ ...theirProps
30
+ }: { as?: TTag } & ListboxSelectedOptionProps<TTag> = $props()
31
+
32
+ const data = useData("ListboxSelectedOption")
33
+
34
+ const shouldShowPlaceholder = $derived(
35
+ data.value === undefined ||
36
+ data.value === null ||
37
+ (data.mode === ValueMode.Multi && Array.isArray(data.value) && data.value.length === 0)
38
+ )
39
+
40
+ setContext("SelectedOptionContext", true)
18
41
  </script>
19
42
 
20
43
  {#snippet children()}
@@ -10,11 +10,14 @@ export type ListboxSelectedOptionProps<TTag extends ElementType = typeof DEFAULT
10
10
  declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> {
11
11
  props(): {
12
12
  as?: TTag | undefined;
13
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "placeholder" | "options"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
14
- children?: Snippet<[SelectedOptionRenderPropArg, Record<string, any>]> | undefined;
13
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "class") | "placeholder" | "options"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
14
+ children?: Snippet<[{
15
+ slot: SelectedOptionRenderPropArg;
16
+ props: Record<string, any>;
17
+ }]> | undefined;
15
18
  ref?: HTMLElement;
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
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: SelectedOptionRenderPropArg) => string) | undefined;
19
+ } & (true extends (import("svelte/elements").SvelteHTMLElements[TTag] extends infer T_1 ? T_1 extends import("svelte/elements").SvelteHTMLElements[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) ? {
20
+ class?: string | ((bag: SelectedOptionRenderPropArg) => string) | null | undefined;
18
21
  } : {}) & {
19
22
  options: Snippet;
20
23
  placeholder?: Snippet;
@@ -1,5 +1,5 @@
1
- export { default as Listbox, type ListboxProps, type ListboxChildren } from "./Listbox.svelte";
2
- export { default as ListboxButton, type ListboxButtonProps, type ListboxButtonChildren } from "./ListboxButton.svelte";
3
- export { default as ListboxOption, type ListboxOptionProps, type ListboxOptionChildren } from "./ListboxOption.svelte";
4
- export { default as ListboxOptions, type ListboxOptionsProps, type ListboxOptionsChildren, } from "./ListboxOptions.svelte";
1
+ export { default as Listbox, type ListboxProps } from "./Listbox.svelte";
2
+ export { default as ListboxButton, type ListboxButtonProps } from "./ListboxButton.svelte";
3
+ export { default as ListboxOption, type ListboxOptionProps } from "./ListboxOption.svelte";
4
+ export { default as ListboxOptions, type ListboxOptionsProps } from "./ListboxOptions.svelte";
5
5
  export { default as ListboxSelectedOption, type ListboxSelectedOptionProps } from "./ListboxSelectedOption.svelte";
@@ -1,5 +1,5 @@
1
1
  export { default as Listbox } from "./Listbox.svelte";
2
2
  export { default as ListboxButton } from "./ListboxButton.svelte";
3
3
  export { default as ListboxOption } from "./ListboxOption.svelte";
4
- export { default as ListboxOptions, } from "./ListboxOptions.svelte";
4
+ export { default as ListboxOptions } from "./ListboxOptions.svelte";
5
5
  export { default as ListboxSelectedOption } from "./ListboxSelectedOption.svelte";
@@ -1,57 +1,84 @@
1
- <script lang="ts" module>import { useOutsideClick } from "../hooks/use-outside-click.svelte.js";
2
- import { useFloatingProvider } from "../internal/floating.svelte.js";
3
- import { createOpenClosedContext, State } from "../internal/open-closed.js";
4
- import ElementOrComponent from "../utils/ElementOrComponent.svelte";
5
- import { FocusableMode, isFocusableElement } from "../utils/focus-management.js";
6
- import { match } from "../utils/match.js";
7
- let DEFAULT_MENU_TAG = "svelte:fragment";
8
- </script>
1
+ <script lang="ts" module>
2
+ import { useOutsideClick } from "../hooks/use-outside-click.svelte.js"
3
+ import { useFloatingProvider } from "../internal/floating.svelte.js"
4
+ import { createOpenClosedContext, State } from "../internal/open-closed.js"
5
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte"
6
+ import { FocusableMode, isFocusableElement } from "../utils/focus-management.js"
7
+ import { match } from "../utils/match.js"
8
+ import type { ElementType, Props } from "../utils/types.js"
9
+ import type { Snippet } from "svelte"
9
10
 
10
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_MENU_TAG">import { ActivationTrigger, createMenuContext, MenuStates } from "./context.svelte.js";
11
- let { ref = $bindable(), __demoMode = false, ...theirProps } = $props();
12
- const context = createMenuContext({
13
- __demoMode,
14
- menuState: __demoMode ? MenuStates.Open : MenuStates.Closed,
15
- buttonElement: null,
16
- itemsElement: null,
17
- items: [],
18
- searchQuery: "",
19
- activeItemIndex: null,
20
- activationTrigger: ActivationTrigger.Other
21
- });
22
- const { menuState, itemsElement, buttonElement } = $derived(context);
23
- const outsideClickEnabled = $derived(menuState === MenuStates.Open);
24
- useOutsideClick({
25
- get enabled() {
26
- return outsideClickEnabled;
27
- },
28
- get containers() {
29
- return [buttonElement, itemsElement];
30
- },
31
- cb: (event, target) => {
32
- context.closeMenu();
33
- if (!isFocusableElement(target, FocusableMode.Loose)) {
34
- event.preventDefault();
35
- buttonElement?.focus();
36
- }
11
+ let DEFAULT_MENU_TAG = "svelte:fragment"
12
+ type MenuRenderPropArg = {
13
+ open: boolean
14
+ close: () => void
37
15
  }
38
- });
39
- const slot = $derived({
40
- open: context.menuState === MenuStates.Open,
41
- close: context.closeMenu
42
- });
43
- useFloatingProvider();
44
- const openClosed = $derived(
45
- match(menuState, {
46
- [MenuStates.Open]: State.Open,
47
- [MenuStates.Closed]: State.Closed
16
+ type MenuPropsWeControl = never
17
+
18
+ export type MenuProps<TTag extends ElementType = typeof DEFAULT_MENU_TAG> = Props<
19
+ TTag,
20
+ MenuRenderPropArg,
21
+ MenuPropsWeControl,
22
+ {
23
+ __demoMode?: boolean
24
+ }
25
+ >
26
+ </script>
27
+
28
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_MENU_TAG">
29
+ import { ActivationTrigger, createMenuContext, MenuStates, type StateDefinition } from "./context.svelte.js"
30
+
31
+ let { ref = $bindable(), __demoMode = false, ...theirProps }: { as?: TTag } & MenuProps<TTag> = $props()
32
+
33
+ const context = createMenuContext({
34
+ __demoMode,
35
+ menuState: __demoMode ? MenuStates.Open : MenuStates.Closed,
36
+ buttonElement: null,
37
+ itemsElement: null,
38
+ items: [],
39
+ searchQuery: "",
40
+ activeItemIndex: null,
41
+ activationTrigger: ActivationTrigger.Other,
42
+ } as StateDefinition)
43
+ const { menuState, itemsElement, buttonElement } = $derived(context)
44
+
45
+ // Handle outside click
46
+ const outsideClickEnabled = $derived(menuState === MenuStates.Open)
47
+ useOutsideClick({
48
+ get enabled() {
49
+ return outsideClickEnabled
50
+ },
51
+ get containers() {
52
+ return [buttonElement, itemsElement]
53
+ },
54
+ cb: (event, target) => {
55
+ context.closeMenu()
56
+
57
+ if (!isFocusableElement(target, FocusableMode.Loose)) {
58
+ event.preventDefault()
59
+ buttonElement?.focus()
60
+ }
61
+ },
62
+ })
63
+
64
+ const slot = $derived({
65
+ open: context.menuState === MenuStates.Open,
66
+ close: context.closeMenu,
67
+ } satisfies MenuRenderPropArg)
68
+
69
+ useFloatingProvider()
70
+
71
+ const openClosed = $derived(
72
+ match(menuState, {
73
+ [MenuStates.Open]: State.Open,
74
+ [MenuStates.Closed]: State.Closed,
75
+ })
76
+ )
77
+ createOpenClosedContext({
78
+ get value() {
79
+ return openClosed
80
+ },
48
81
  })
49
- );
50
- createOpenClosedContext({
51
- get value() {
52
- return openClosed;
53
- }
54
- });
55
82
  </script>
56
83
 
57
84
  <ElementOrComponent {theirProps} {slot} defaultTag={DEFAULT_MENU_TAG} name="Menu" bind:ref />
@@ -9,15 +9,17 @@ type MenuPropsWeControl = never;
9
9
  export type MenuProps<TTag extends ElementType = typeof DEFAULT_MENU_TAG> = Props<TTag, MenuRenderPropArg, MenuPropsWeControl, {
10
10
  __demoMode?: boolean;
11
11
  }>;
12
- export type MenuChildren<T> = Snippet<[MenuRenderPropArg]>;
13
12
  declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_MENU_TAG> {
14
13
  props(): {
15
14
  as?: TTag | undefined;
16
- } & (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) & {
17
- children?: Snippet<[MenuRenderPropArg, Record<string, any>]> | undefined;
15
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "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?: Snippet<[{
17
+ slot: MenuRenderPropArg;
18
+ props: Record<string, any>;
19
+ }]> | undefined;
18
20
  ref?: HTMLElement;
19
- } & (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) ? {
20
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: MenuRenderPropArg) => string) | undefined;
21
+ } & (true extends (import("svelte/elements.js").SvelteHTMLElements[TTag] extends infer T_1 ? T_1 extends import("svelte/elements.js").SvelteHTMLElements[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) ? {
22
+ class?: string | ((bag: MenuRenderPropArg) => string) | null | undefined;
21
23
  } : {}) & {
22
24
  __demoMode?: boolean;
23
25
  };
@@ -1,129 +1,169 @@
1
- <script lang="ts" module>import { tick } from "svelte";
2
- const DEFAULT_BUTTON_TAG = "button";
3
- </script>
1
+ <script lang="ts" module>
2
+ import { tick, type Snippet } from "svelte"
3
+ import type { Props, ElementType } from "../utils/types.js"
4
4
 
5
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_BUTTON_TAG">import { useId } from "../hooks/use-id.js";
6
- import { Focus } from "../utils/calculate-active-index.js";
7
- import { useFocusRing } from "../hooks/use-focus-ring.svelte.js";
8
- import { useActivePress } from "../hooks/use-active-press.svelte.js";
9
- import { useResolveButtonType } from "../hooks/use-resolve-button-type.svelte.js";
10
- import { useFloatingReference, useFloatingReferenceProps } from "../internal/floating.svelte.js";
11
- import { useHover } from "../hooks/use-hover.svelte.js";
12
- import { mergeProps } from "../utils/render.js";
13
- import { MenuStates, useMenuContext } from "./context.svelte.js";
14
- import { untrack } from "svelte";
15
- import ElementOrComponent from "../utils/ElementOrComponent.svelte";
16
- const internalId = useId();
17
- let {
18
- ref = $bindable(),
19
- id = `headlessui-menu-button-${internalId}`,
20
- disabled = false,
21
- autofocus = false,
22
- ...theirProps
23
- } = $props();
24
- const _state = useMenuContext("MenuButton");
25
- const floatingReference = useFloatingReference();
26
- const { setReference } = $derived(floatingReference);
27
- const { getReferenceProps: getFloatingReferenceProps } = useFloatingReferenceProps();
28
- $effect(() => {
29
- untrack(() => _state.setButtonElement(ref ? ref : null));
30
- setReference(ref);
31
- });
32
- const handleKeyDown = async (event) => {
33
- switch (event.key) {
34
- case " ":
35
- case "Enter":
36
- case "ArrowDown":
37
- event.preventDefault();
38
- event.stopPropagation();
39
- _state.openMenu();
40
- await tick();
41
- _state.goToItem({ focus: Focus.First });
42
- break;
43
- case "ArrowUp":
44
- event.preventDefault();
45
- event.stopPropagation();
46
- _state.openMenu();
47
- await tick();
48
- _state.goToItem({ focus: Focus.Last });
49
- break;
50
- }
51
- };
52
- const handleKeyUp = (event) => {
53
- switch (event.key) {
54
- case " ":
55
- event.preventDefault();
56
- break;
5
+ const DEFAULT_BUTTON_TAG = "button" as const
6
+ type ButtonRenderPropArg = {
7
+ open: boolean
8
+ active: boolean
9
+ hover: boolean
10
+ focus: boolean
11
+ disabled: boolean
12
+ autofocus: boolean
57
13
  }
58
- };
59
- const handleClick = async (event) => {
60
- if (disabled) return;
61
- if (_state.menuState === MenuStates.Open) {
62
- _state.closeMenu();
63
- await tick();
64
- _state.buttonElement?.focus({ preventScroll: true });
65
- } else {
66
- event.preventDefault();
67
- _state.openMenu();
68
- }
69
- };
70
- const { isFocusVisible: focus, focusProps } = $derived(
71
- useFocusRing({
72
- get autofocus() {
73
- return autofocus;
14
+ type ButtonPropsWeControl = "aria-controls" | "aria-expanded" | "aria-haspopup"
15
+
16
+ export type MenuButtonProps<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> = Props<
17
+ TTag,
18
+ ButtonRenderPropArg,
19
+ ButtonPropsWeControl,
20
+ {
21
+ id?: string
22
+ disabled?: boolean
23
+ autofocus?: boolean
24
+ type?: string
74
25
  }
26
+ >
27
+ </script>
28
+
29
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_BUTTON_TAG">
30
+ import { useId } from "../hooks/use-id.js"
31
+ import { Focus } from "../utils/calculate-active-index.js"
32
+ import { useFocusRing } from "../hooks/use-focus-ring.svelte.js"
33
+ import { useActivePress } from "../hooks/use-active-press.svelte.js"
34
+ import { useResolveButtonType } from "../hooks/use-resolve-button-type.svelte.js"
35
+ import { useFloatingReference, useFloatingReferenceProps } from "../internal/floating.svelte.js"
36
+ import { useHover } from "../hooks/use-hover.svelte.js"
37
+ import { mergeProps } from "../utils/render.js"
38
+ import { MenuStates, useMenuContext } from "./context.svelte.js"
39
+ import { untrack } from "svelte"
40
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte"
41
+
42
+ const internalId = useId()
43
+ let {
44
+ ref = $bindable(),
45
+ id = `headlessui-menu-button-${internalId}`,
46
+ disabled = false,
47
+ autofocus = false,
48
+ ...theirProps
49
+ }: { as?: TTag } & MenuButtonProps<TTag> = $props()
50
+ const _state = useMenuContext("MenuButton")
51
+ const floatingReference = useFloatingReference()
52
+ const { setReference } = $derived(floatingReference)
53
+ const { getReferenceProps: getFloatingReferenceProps } = useFloatingReferenceProps()
54
+ $effect(() => {
55
+ untrack(() => _state.setButtonElement(ref ? (ref as HTMLButtonElement) : null))
56
+ setReference(ref)
75
57
  })
76
- );
77
- const { isHovered: hover, hoverProps } = $derived(
78
- useHover({
79
- get disabled() {
80
- return disabled;
58
+
59
+ const handleKeyDown = async (event: KeyboardEvent) => {
60
+ switch (event.key) {
61
+ // Ref: https://www.w3.org/WAI/ARIA/apg/patterns/menubutton/#keyboard-interaction-13
62
+
63
+ case " ":
64
+ case "Enter":
65
+ case "ArrowDown":
66
+ event.preventDefault()
67
+ event.stopPropagation()
68
+ _state.openMenu()
69
+ await tick()
70
+ _state.goToItem({ focus: Focus.First })
71
+ break
72
+
73
+ case "ArrowUp":
74
+ event.preventDefault()
75
+ event.stopPropagation()
76
+ _state.openMenu()
77
+ await tick()
78
+ _state.goToItem({ focus: Focus.Last })
79
+ break
81
80
  }
82
- })
83
- );
84
- const { pressed: active, pressProps } = $derived(
85
- useActivePress({
86
- get disabled() {
87
- return disabled;
81
+ }
82
+
83
+ const handleKeyUp = (event: KeyboardEvent) => {
84
+ switch (event.key) {
85
+ case " ":
86
+ // Required for firefox, event.preventDefault() in handleKeyDown for
87
+ // the Space key doesn't cancel the handleKeyUp, which in turn
88
+ // triggers a *click*.
89
+ event.preventDefault()
90
+ break
88
91
  }
89
- })
90
- );
91
- const slot = $derived({
92
- open: _state.menuState === MenuStates.Open,
93
- active: active || _state.menuState === MenuStates.Open,
94
- disabled,
95
- hover,
96
- focus,
97
- autofocus: autofocus ?? false
98
- });
99
- const buttonType = useResolveButtonType({
100
- get props() {
101
- return { type: theirProps.type, as: theirProps.as };
102
- },
103
- get ref() {
104
- return { current: _state.buttonElement };
105
92
  }
106
- });
107
- const ourProps = $derived(
108
- mergeProps(
109
- {
110
- ...getFloatingReferenceProps(),
111
- id,
112
- type: buttonType.type,
113
- "aria-haspopup": "menu",
114
- "aria-controls": _state.itemsElement?.id,
115
- "aria-expanded": _state.menuState === MenuStates.Open,
116
- disabled: disabled || void 0,
117
- autofocus,
118
- onkeydown: handleKeyDown,
119
- onkeyup: handleKeyUp,
120
- onclick: handleClick
93
+
94
+ const handleClick = async (event: MouseEvent) => {
95
+ //if (isDisabledReactIssue7711(event.currentTarget)) return event.preventDefault()
96
+ if (disabled) return
97
+ if (_state.menuState === MenuStates.Open) {
98
+ _state.closeMenu()
99
+ await tick()
100
+ _state.buttonElement?.focus({ preventScroll: true })
101
+ } else {
102
+ event.preventDefault()
103
+ _state.openMenu()
104
+ }
105
+ }
106
+
107
+ const { isFocusVisible: focus, focusProps } = $derived(
108
+ useFocusRing({
109
+ get autofocus() {
110
+ return autofocus
111
+ },
112
+ })
113
+ )
114
+ const { isHovered: hover, hoverProps } = $derived(
115
+ useHover({
116
+ get disabled() {
117
+ return disabled
118
+ },
119
+ })
120
+ )
121
+ const { pressed: active, pressProps } = $derived(
122
+ useActivePress({
123
+ get disabled() {
124
+ return disabled
125
+ },
126
+ })
127
+ )
128
+
129
+ const slot = $derived({
130
+ open: _state.menuState === MenuStates.Open,
131
+ active: active || _state.menuState === MenuStates.Open,
132
+ disabled,
133
+ hover,
134
+ focus,
135
+ autofocus: autofocus ?? false,
136
+ } satisfies ButtonRenderPropArg)
137
+
138
+ const buttonType = useResolveButtonType({
139
+ get props() {
140
+ return { type: theirProps.type, as: theirProps.as }
121
141
  },
122
- focusProps,
123
- hoverProps,
124
- pressProps
142
+ get ref() {
143
+ return { current: _state.buttonElement }
144
+ },
145
+ })
146
+
147
+ const ourProps = $derived(
148
+ mergeProps(
149
+ {
150
+ ...getFloatingReferenceProps(),
151
+ id,
152
+ type: buttonType.type,
153
+ "aria-haspopup": "menu",
154
+ "aria-controls": _state.itemsElement?.id,
155
+ "aria-expanded": _state.menuState === MenuStates.Open,
156
+ disabled: disabled || undefined,
157
+ autofocus,
158
+ onkeydown: handleKeyDown,
159
+ onkeyup: handleKeyUp,
160
+ onclick: handleClick,
161
+ },
162
+ focusProps,
163
+ hoverProps,
164
+ pressProps
165
+ )
125
166
  )
126
- );
127
167
  </script>
128
168
 
129
169
  <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_BUTTON_TAG} name="MenuButton" bind:ref />
@@ -16,15 +16,17 @@ export type MenuButtonProps<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG
16
16
  autofocus?: boolean;
17
17
  type?: string;
18
18
  }>;
19
- export type MenuButtonChildren = Snippet<[ButtonRenderPropArg]>;
20
19
  declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG> {
21
20
  props(): {
22
21
  as?: TTag | undefined;
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?: Snippet<[ButtonRenderPropArg, Record<string, any>]> | undefined;
22
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "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) & {
23
+ children?: Snippet<[{
24
+ slot: ButtonRenderPropArg;
25
+ props: Record<string, any>;
26
+ }]> | undefined;
25
27
  ref?: HTMLElement;
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
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: ButtonRenderPropArg) => string) | undefined;
28
+ } & (true extends (import("svelte/elements.js").SvelteHTMLElements[TTag] extends infer T_1 ? T_1 extends import("svelte/elements.js").SvelteHTMLElements[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) ? {
29
+ class?: string | ((bag: ButtonRenderPropArg) => string) | null | undefined;
28
30
  } : {}) & {
29
31
  id?: string;
30
32
  disabled?: boolean;
@@ -1,19 +1,37 @@
1
- <script lang="ts" module>import { onMount } from "svelte";
2
- const DEFAULT_HEADING_TAG = "header";
1
+ <script lang="ts" module>
2
+ import { onMount, type Snippet } from "svelte"
3
+ import type { ElementType, Props } from "../utils/types.js"
4
+
5
+ const DEFAULT_HEADING_TAG = "header" as const
6
+ type HeadingRenderPropArg = {}
7
+ type HeadingPropsWeControl = "role"
8
+
9
+ export type MenuHeadingProps<TTag extends ElementType = typeof DEFAULT_HEADING_TAG> = Props<
10
+ TTag,
11
+ HeadingRenderPropArg,
12
+ HeadingPropsWeControl,
13
+ {
14
+ id?: string
15
+ }
16
+ >
3
17
  </script>
4
18
 
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 });
19
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_HEADING_TAG">
20
+ import { useId } from "../hooks/use-id.js"
21
+ import { useLabelContext } from "../label/context.svelte.js"
22
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte"
23
+
24
+ const internalId = useId()
25
+ let {
26
+ ref = $bindable(),
27
+ id = `headlessui-menu-heading-${internalId}`,
28
+ ...theirProps
29
+ }: { as?: TTag } & MenuHeadingProps<TTag> = $props()
30
+
31
+ const context = useLabelContext()
32
+ onMount(() => context.register(id))
33
+
34
+ const ourProps = $derived({ id, role: "presentation", ...context.props })
17
35
  </script>
18
36
 
19
37
  <ElementOrComponent {ourProps} {theirProps} defaultTag={DEFAULT_HEADING_TAG} name="MenuItem" bind:ref />