@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,149 +1,114 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
3
|
-
import { onMount } from "svelte"
|
|
4
|
-
|
|
5
|
-
const DEFAULT_ITEM_TAG = "svelte:fragment" 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>
|
|
13
|
-
}
|
|
14
|
-
type ItemPropsWeControl = "aria-describedby" | "aria-disabled" | "aria-labelledby" | "role" | "tabIndex"
|
|
15
|
-
|
|
16
|
-
export type MenuItemProps<TTag extends ElementType = typeof DEFAULT_ITEM_TAG> = Props<
|
|
17
|
-
TTag,
|
|
18
|
-
ItemRenderPropArg,
|
|
19
|
-
ItemPropsWeControl,
|
|
20
|
-
{
|
|
21
|
-
id?: string
|
|
22
|
-
disabled?: boolean
|
|
23
|
-
}
|
|
24
|
-
>
|
|
1
|
+
<script lang="ts" module>import { onMount } from "svelte";
|
|
2
|
+
const DEFAULT_ITEM_TAG = "svelte:fragment";
|
|
25
3
|
</script>
|
|
26
4
|
|
|
27
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_ITEM_TAG">
|
|
28
|
-
|
|
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
|
-
const getTextValue = useTextValue({
|
|
63
|
-
get element() {
|
|
64
|
-
return ref || null
|
|
65
|
-
},
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
const bag: MenuItemDataRef["current"] = $derived({
|
|
69
|
-
disabled,
|
|
70
|
-
domRef: { current: ref || 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)
|
|
83
|
-
})
|
|
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 })
|
|
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;
|
|
94
39
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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 })
|
|
40
|
+
});
|
|
41
|
+
const bag = $derived({
|
|
42
|
+
disabled,
|
|
43
|
+
domRef: { current: ref || null },
|
|
44
|
+
get textValue() {
|
|
45
|
+
return getTextValue();
|
|
110
46
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
)
|
|
47
|
+
});
|
|
48
|
+
onMount(() => {
|
|
49
|
+
_state.registerItem(id, {
|
|
50
|
+
get current() {
|
|
51
|
+
return bag;
|
|
52
|
+
}
|
|
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
|
|
110
|
+
})
|
|
111
|
+
);
|
|
147
112
|
</script>
|
|
148
113
|
|
|
149
114
|
<ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_ITEM_TAG} name="MenuItem" bind:ref />
|