@pzerelles/headlessui-svelte 2.1.2-next.29 → 2.1.2-next.30
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 +54 -84
- package/dist/checkbox/Checkbox.svelte +120 -173
- package/dist/checkbox/Checkbox.svelte.d.ts +1 -1
- package/dist/close-button/CloseButton.svelte +6 -12
- package/dist/combobox/Combobox.svelte +3 -50
- package/dist/data-interactive/DataInteractive.svelte +29 -55
- package/dist/description/Description.svelte +21 -31
- package/dist/dialog/Dialog.svelte +228 -320
- package/dist/dialog/DialogBackdrop.svelte +12 -29
- package/dist/dialog/DialogPanel.svelte +25 -48
- package/dist/dialog/DialogTitle.svelte +23 -38
- package/dist/field/Field.svelte +25 -47
- package/dist/fieldset/Fieldset.svelte +29 -50
- package/dist/focus-trap/FocusTrap.svelte +283 -419
- package/dist/input/Input.svelte +53 -84
- package/dist/internal/FloatingProvider.svelte +9 -14
- package/dist/internal/FocusSentinel.svelte +8 -16
- package/dist/internal/ForcePortalRoot.svelte +3 -7
- package/dist/internal/FormFields.svelte +34 -47
- package/dist/internal/FormFieldsProvider.svelte +5 -9
- package/dist/internal/FormResolver.svelte +15 -20
- package/dist/internal/Hidden.svelte +29 -50
- package/dist/internal/MainTreeProvider.svelte +36 -89
- package/dist/internal/Portal.svelte +14 -18
- package/dist/label/Label.svelte +58 -93
- package/dist/legend/Legend.svelte +3 -12
- package/dist/listbox/Listbox.svelte +387 -525
- package/dist/listbox/Listbox.svelte.d.ts +1 -1
- package/dist/listbox/ListboxButton.svelte +127 -173
- package/dist/listbox/ListboxOption.svelte +129 -170
- package/dist/listbox/ListboxOptions.svelte +304 -400
- package/dist/listbox/ListboxSelectedOption.svelte +15 -38
- package/dist/menu/Menu.svelte +51 -78
- package/dist/menu/MenuButton.svelte +117 -157
- package/dist/menu/MenuHeading.svelte +14 -32
- package/dist/menu/MenuItem.svelte +107 -142
- package/dist/menu/MenuItems.svelte +229 -301
- package/dist/menu/MenuSection.svelte +9 -24
- package/dist/menu/MenuSeparator.svelte +4 -17
- package/dist/popover/Popover.svelte +150 -216
- package/dist/popover/PopoverBackdrop.svelte +41 -67
- package/dist/popover/PopoverButton.svelte +212 -292
- package/dist/popover/PopoverGroup.svelte +35 -62
- package/dist/popover/PopoverPanel.svelte +229 -311
- package/dist/portal/InternalPortal.svelte +85 -141
- package/dist/portal/Portal.svelte +2 -5
- package/dist/portal/PortalGroup.svelte +9 -30
- package/dist/select/Select.svelte +68 -98
- package/dist/switch/Switch.svelte +132 -179
- package/dist/switch/SwitchGroup.svelte +31 -44
- package/dist/tabs/Tab.svelte +142 -194
- package/dist/tabs/TabGroup.svelte +56 -86
- package/dist/tabs/TabGroup.svelte.d.ts +1 -1
- package/dist/tabs/TabList.svelte +11 -31
- package/dist/tabs/TabPanel.svelte +42 -67
- package/dist/tabs/TabPanels.svelte +7 -18
- package/dist/textarea/Textarea.svelte +53 -84
- package/dist/transition/InternalTransitionChild.svelte +170 -259
- package/dist/transition/Transition.svelte +66 -96
- package/dist/transition/TransitionChild.svelte +11 -31
- package/dist/utils/DisabledProvider.svelte +3 -7
- package/dist/utils/ElementOrComponent.svelte +23 -43
- package/dist/utils/Generic.svelte +16 -27
- package/dist/utils/StableCollection.svelte +36 -54
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +12 -27
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +44 -88
- package/package.json +4 -4
|
@@ -1,43 +1,20 @@
|
|
|
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
|
-
>
|
|
1
|
+
<script lang="ts" module>const DEFAULT_SELECTED_OPTION_TAG = "svelte:fragment";
|
|
18
2
|
</script>
|
|
19
3
|
|
|
20
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG">
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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)
|
|
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);
|
|
41
18
|
</script>
|
|
42
19
|
|
|
43
20
|
{#snippet children()}
|
package/dist/menu/Menu.svelte
CHANGED
|
@@ -1,84 +1,57 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import type { ElementType, Props } from "../utils/types.js"
|
|
9
|
-
import type { Snippet } from "svelte"
|
|
10
|
-
|
|
11
|
-
let DEFAULT_MENU_TAG = "svelte:fragment"
|
|
12
|
-
type MenuRenderPropArg = {
|
|
13
|
-
open: boolean
|
|
14
|
-
close: () => void
|
|
15
|
-
}
|
|
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
|
-
>
|
|
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";
|
|
26
8
|
</script>
|
|
27
9
|
|
|
28
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_MENU_TAG">
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
},
|
|
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
|
+
}
|
|
37
|
+
}
|
|
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
|
|
81
48
|
})
|
|
49
|
+
);
|
|
50
|
+
createOpenClosedContext({
|
|
51
|
+
get value() {
|
|
52
|
+
return openClosed;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
82
55
|
</script>
|
|
83
56
|
|
|
84
57
|
<ElementOrComponent {theirProps} {slot} defaultTag={DEFAULT_MENU_TAG} name="Menu" bind:ref />
|
|
@@ -1,169 +1,129 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
<script lang="ts" module>import { tick } from "svelte";
|
|
2
|
+
const DEFAULT_BUTTON_TAG = "button";
|
|
3
|
+
</script>
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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;
|
|
13
50
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
51
|
+
};
|
|
52
|
+
const handleKeyUp = (event) => {
|
|
53
|
+
switch (event.key) {
|
|
54
|
+
case " ":
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
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;
|
|
25
74
|
}
|
|
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)
|
|
57
75
|
})
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
80
|
-
}
|
|
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
|
|
76
|
+
);
|
|
77
|
+
const { isHovered: hover, hoverProps } = $derived(
|
|
78
|
+
useHover({
|
|
79
|
+
get disabled() {
|
|
80
|
+
return disabled;
|
|
91
81
|
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
_state.closeMenu()
|
|
99
|
-
await tick()
|
|
100
|
-
_state.buttonElement?.focus({ preventScroll: true })
|
|
101
|
-
} else {
|
|
102
|
-
event.preventDefault()
|
|
103
|
-
_state.openMenu()
|
|
82
|
+
})
|
|
83
|
+
);
|
|
84
|
+
const { pressed: active, pressProps } = $derived(
|
|
85
|
+
useActivePress({
|
|
86
|
+
get disabled() {
|
|
87
|
+
return disabled;
|
|
104
88
|
}
|
|
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
105
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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 }
|
|
141
|
-
},
|
|
142
|
-
get ref() {
|
|
143
|
-
return { current: _state.buttonElement }
|
|
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
|
|
144
121
|
},
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
)
|
|
122
|
+
focusProps,
|
|
123
|
+
hoverProps,
|
|
124
|
+
pressProps
|
|
166
125
|
)
|
|
126
|
+
);
|
|
167
127
|
</script>
|
|
168
128
|
|
|
169
129
|
<ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_BUTTON_TAG} name="MenuButton" bind:ref />
|
|
@@ -1,37 +1,19 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
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
|
-
>
|
|
1
|
+
<script lang="ts" module>import { onMount } from "svelte";
|
|
2
|
+
const DEFAULT_HEADING_TAG = "header";
|
|
17
3
|
</script>
|
|
18
4
|
|
|
19
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_HEADING_TAG">
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const context = useLabelContext()
|
|
32
|
-
onMount(() => context.register(id))
|
|
33
|
-
|
|
34
|
-
const ourProps = $derived({ id, role: "presentation", ...context.props })
|
|
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 });
|
|
35
17
|
</script>
|
|
36
18
|
|
|
37
19
|
<ElementOrComponent {ourProps} {theirProps} defaultTag={DEFAULT_HEADING_TAG} name="MenuItem" bind:ref />
|