@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.
- package/dist/button/Button.svelte +84 -54
- package/dist/button/Button.svelte.d.ts +7 -4
- package/dist/checkbox/Checkbox.svelte +173 -120
- package/dist/checkbox/Checkbox.svelte.d.ts +7 -4
- package/dist/close-button/CloseButton.svelte +12 -6
- package/dist/close-button/CloseButton.svelte.d.ts +13 -10
- package/dist/combobox/Combobox.svelte +50 -3
- package/dist/data-interactive/DataInteractive.svelte +55 -29
- package/dist/data-interactive/DataInteractive.svelte.d.ts +7 -5
- package/dist/description/Description.svelte +31 -21
- package/dist/description/Description.svelte.d.ts +7 -4
- package/dist/dialog/Dialog.svelte +358 -38
- package/dist/dialog/Dialog.svelte.d.ts +10 -7
- package/dist/dialog/DialogBackdrop.svelte +30 -13
- package/dist/dialog/DialogBackdrop.svelte.d.ts +7 -4
- package/dist/dialog/DialogPanel.svelte +49 -26
- package/dist/dialog/DialogPanel.svelte.d.ts +7 -4
- package/dist/dialog/DialogTitle.svelte +38 -23
- package/dist/dialog/DialogTitle.svelte.d.ts +7 -4
- package/dist/field/Field.svelte +50 -28
- package/dist/field/Field.svelte.d.ts +7 -4
- package/dist/fieldset/Fieldset.svelte +50 -29
- package/dist/fieldset/Fieldset.svelte.d.ts +7 -4
- package/dist/focus-trap/FocusTrap.svelte +419 -283
- package/dist/focus-trap/FocusTrap.svelte.d.ts +7 -4
- package/dist/input/Input.svelte +84 -53
- package/dist/input/Input.svelte.d.ts +7 -4
- package/dist/internal/FloatingProvider.svelte +14 -9
- package/dist/internal/FocusSentinel.svelte +16 -8
- package/dist/internal/ForcePortalRoot.svelte +7 -3
- package/dist/internal/FormFields.svelte +47 -34
- package/dist/internal/FormFieldsProvider.svelte +9 -5
- package/dist/internal/FormResolver.svelte +20 -15
- package/dist/internal/Hidden.svelte +50 -29
- package/dist/internal/Hidden.svelte.d.ts +7 -4
- package/dist/internal/MainTreeProvider.svelte +89 -36
- package/dist/internal/Portal.svelte +18 -14
- package/dist/internal/floating-provider.svelte.js +1 -1
- package/dist/internal/floating.svelte.d.ts +5 -5
- package/dist/internal/floating.svelte.js +17 -17
- package/dist/label/Label.svelte +93 -58
- package/dist/label/Label.svelte.d.ts +7 -4
- package/dist/legend/Legend.svelte +12 -3
- package/dist/listbox/Listbox.svelte +525 -387
- package/dist/listbox/Listbox.svelte.d.ts +7 -5
- package/dist/listbox/ListboxButton.svelte +173 -127
- package/dist/listbox/ListboxButton.svelte.d.ts +7 -5
- package/dist/listbox/ListboxOption.svelte +170 -129
- package/dist/listbox/ListboxOption.svelte.d.ts +7 -5
- package/dist/listbox/ListboxOptions.svelte +400 -304
- package/dist/listbox/ListboxOptions.svelte.d.ts +7 -5
- package/dist/listbox/ListboxSelectedOption.svelte +38 -15
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +7 -4
- package/dist/listbox/index.d.ts +4 -4
- package/dist/listbox/index.js +1 -1
- package/dist/menu/Menu.svelte +78 -51
- package/dist/menu/Menu.svelte.d.ts +7 -5
- package/dist/menu/MenuButton.svelte +157 -117
- package/dist/menu/MenuButton.svelte.d.ts +7 -5
- package/dist/menu/MenuHeading.svelte +32 -14
- package/dist/menu/MenuHeading.svelte.d.ts +7 -5
- package/dist/menu/MenuItem.svelte +142 -107
- package/dist/menu/MenuItem.svelte.d.ts +8 -8
- package/dist/menu/MenuItems.svelte +301 -229
- package/dist/menu/MenuItems.svelte.d.ts +7 -5
- package/dist/menu/MenuSection.svelte +24 -9
- package/dist/menu/MenuSection.svelte.d.ts +7 -5
- package/dist/menu/MenuSeparator.svelte +17 -4
- package/dist/menu/MenuSeparator.svelte.d.ts +7 -6
- package/dist/menu/index.d.ts +7 -7
- package/dist/popover/Popover.svelte +216 -150
- package/dist/popover/Popover.svelte.d.ts +7 -4
- package/dist/popover/PopoverBackdrop.svelte +67 -41
- package/dist/popover/PopoverBackdrop.svelte.d.ts +7 -4
- package/dist/popover/PopoverButton.svelte +292 -212
- package/dist/popover/PopoverButton.svelte.d.ts +7 -4
- package/dist/popover/PopoverGroup.svelte +62 -35
- package/dist/popover/PopoverGroup.svelte.d.ts +7 -4
- package/dist/popover/PopoverPanel.svelte +311 -229
- package/dist/popover/PopoverPanel.svelte.d.ts +7 -4
- package/dist/portal/InternalPortal.svelte +141 -85
- package/dist/portal/InternalPortal.svelte.d.ts +7 -4
- package/dist/portal/Portal.svelte +5 -2
- package/dist/portal/PortalGroup.svelte +30 -9
- package/dist/portal/PortalGroup.svelte.d.ts +7 -4
- package/dist/select/Select.svelte +98 -68
- package/dist/select/Select.svelte.d.ts +7 -4
- package/dist/switch/Switch.svelte +179 -132
- package/dist/switch/Switch.svelte.d.ts +7 -4
- package/dist/switch/SwitchGroup.svelte +44 -31
- package/dist/switch/SwitchGroup.svelte.d.ts +7 -4
- package/dist/tabs/Tab.svelte +194 -143
- package/dist/tabs/Tab.svelte.d.ts +7 -4
- package/dist/tabs/TabGroup.svelte +81 -214
- package/dist/tabs/TabGroup.svelte.d.ts +7 -24
- package/dist/tabs/TabList.svelte +31 -11
- package/dist/tabs/TabList.svelte.d.ts +7 -4
- package/dist/tabs/TabPanel.svelte +67 -43
- package/dist/tabs/TabPanel.svelte.d.ts +7 -4
- package/dist/tabs/TabPanels.svelte +18 -7
- package/dist/tabs/TabPanels.svelte.d.ts +7 -4
- package/dist/tabs/context.svelte.d.ts +31 -0
- package/dist/tabs/context.svelte.js +134 -0
- package/dist/textarea/Textarea.svelte +84 -53
- package/dist/textarea/Textarea.svelte.d.ts +7 -4
- package/dist/transition/InternalTransitionChild.svelte +259 -170
- package/dist/transition/InternalTransitionChild.svelte.d.ts +7 -4
- package/dist/transition/Transition.svelte +96 -66
- package/dist/transition/Transition.svelte.d.ts +7 -4
- package/dist/transition/TransitionChild.svelte +31 -11
- package/dist/transition/TransitionChild.svelte.d.ts +7 -4
- package/dist/utils/ElementOrComponent.svelte +43 -23
- package/dist/utils/ElementOrComponent.svelte.d.ts +10 -4
- package/dist/utils/Generic.svelte +36 -22
- package/dist/utils/Generic.svelte.d.ts +7 -4
- package/dist/utils/StableCollection.svelte +54 -36
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +27 -12
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +88 -44
- package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +7 -7
- package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +1 -1
- package/dist/utils/floating-ui/svelte/types.d.ts +4 -4
- package/dist/utils/floating-ui/svelte-dom/types.d.ts +2 -2
- package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +6 -6
- package/dist/utils/types.d.ts +11 -4
- package/package.json +1 -1
- package/dist/dialog/InternalDialog.svelte +0 -233
- package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
|
@@ -1,138 +1,179 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { ElementType, Props } from "../utils/types.js"
|
|
3
|
+
|
|
4
|
+
const DEFAULT_OPTION_TAG = "div" as const
|
|
5
|
+
type OptionRenderPropArg = {
|
|
6
|
+
/** @deprecated use `focus` instead */
|
|
7
|
+
active: boolean
|
|
8
|
+
focus: boolean
|
|
9
|
+
selected: boolean
|
|
10
|
+
disabled: boolean
|
|
11
|
+
|
|
12
|
+
selectedOption: boolean
|
|
13
|
+
}
|
|
14
|
+
type OptionPropsWeControl = "aria-disabled" | "aria-selected" | "role" | "tabIndex"
|
|
15
|
+
|
|
16
|
+
export type ListboxOptionProps<TTag extends ElementType = typeof DEFAULT_OPTION_TAG, TType = string> = Props<
|
|
17
|
+
TTag,
|
|
18
|
+
OptionRenderPropArg,
|
|
19
|
+
OptionPropsWeControl,
|
|
20
|
+
{
|
|
21
|
+
id?: string
|
|
22
|
+
disabled?: boolean
|
|
23
|
+
value: TType
|
|
24
|
+
}
|
|
25
|
+
>
|
|
2
26
|
</script>
|
|
3
27
|
|
|
4
|
-
<script lang="ts" generics="TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG">
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
<script lang="ts" generics="TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG">
|
|
29
|
+
import { useId } from "../hooks/use-id.js"
|
|
30
|
+
import {
|
|
31
|
+
ActivationTrigger,
|
|
32
|
+
ListboxStates,
|
|
33
|
+
useActions,
|
|
34
|
+
useData,
|
|
35
|
+
ValueMode,
|
|
36
|
+
type ListboxOptionDataRef,
|
|
37
|
+
} from "./Listbox.svelte"
|
|
38
|
+
import { disposables } from "../utils/disposables.js"
|
|
39
|
+
import { Focus } from "../utils/calculate-active-index.js"
|
|
40
|
+
import { getContext, onMount, type Snippet } from "svelte"
|
|
41
|
+
import { useTextValue } from "../hooks/use-text-value.svelte.js"
|
|
42
|
+
import { useTrackedPointer } from "../hooks/use-tracked-pointer.js"
|
|
43
|
+
import { stateFromSlot } from "../utils/state.js"
|
|
44
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
45
|
+
|
|
46
|
+
const internalId = useId()
|
|
47
|
+
let {
|
|
48
|
+
ref = $bindable(),
|
|
49
|
+
id = `headlessui-listbox-option-${internalId}`,
|
|
50
|
+
disabled = false,
|
|
51
|
+
value,
|
|
52
|
+
...theirProps
|
|
53
|
+
}: { as?: TTag } & ListboxOptionProps<TTag, TType> = $props()
|
|
54
|
+
const usedInSelectedOption = getContext<boolean>("SelectedOptionContext") === true
|
|
55
|
+
const data = useData("ListboxOption")
|
|
56
|
+
const actions = useActions("ListboxOption")
|
|
57
|
+
|
|
58
|
+
const { activeOptionIndex, options } = $derived(data)
|
|
59
|
+
|
|
60
|
+
const active = $derived(activeOptionIndex !== null ? options[activeOptionIndex].id === id : false)
|
|
61
|
+
|
|
62
|
+
const selected = $derived(data.isSelected(value))
|
|
63
|
+
const getTextValue = useTextValue({
|
|
64
|
+
get element() {
|
|
65
|
+
return ref as HTMLElement
|
|
66
|
+
},
|
|
67
|
+
})
|
|
68
|
+
const bag: ListboxOptionDataRef<TType>["current"] = $derived({
|
|
69
|
+
disabled,
|
|
70
|
+
value,
|
|
71
|
+
domRef: { current: ref || null },
|
|
72
|
+
get textValue() {
|
|
73
|
+
return getTextValue()
|
|
74
|
+
},
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
$effect(() => {
|
|
78
|
+
if (usedInSelectedOption) return
|
|
79
|
+
if (!ref) {
|
|
80
|
+
data.listElements.delete(id)
|
|
81
|
+
} else {
|
|
82
|
+
data.listElements.set(id, ref)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return () => {
|
|
86
|
+
if (ref) data.listElements.delete(id)
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
$effect(() => {
|
|
91
|
+
if (data.__demoMode) return
|
|
92
|
+
if (data.listboxState !== ListboxStates.Open) return
|
|
93
|
+
if (!active) return
|
|
94
|
+
if (data.activationTrigger === ActivationTrigger.Pointer) return
|
|
95
|
+
return disposables().requestAnimationFrame(() => {
|
|
96
|
+
;(ref as HTMLElement)?.scrollIntoView?.({ block: "nearest" })
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
onMount(() => {
|
|
101
|
+
if (usedInSelectedOption) return
|
|
102
|
+
return actions.registerOption(id, {
|
|
103
|
+
get current() {
|
|
104
|
+
return bag
|
|
105
|
+
},
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
const handleClick = (event: { preventDefault: Function }) => {
|
|
110
|
+
if (disabled) return event.preventDefault()
|
|
111
|
+
actions.onChange(value)
|
|
112
|
+
if (data.closeOnSelect === true || (data.closeOnSelect === undefined && data.mode === ValueMode.Single)) {
|
|
113
|
+
actions.closeListbox()
|
|
114
|
+
data.buttonElement?.focus({ preventScroll: true })
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const handleFocus = () => {
|
|
119
|
+
if (disabled) return actions.goToOption(Focus.Nothing)
|
|
120
|
+
actions.goToOption(Focus.Specific, id)
|
|
36
121
|
}
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
122
|
+
|
|
123
|
+
const pointer = useTrackedPointer()
|
|
124
|
+
|
|
125
|
+
const handleEnter = (evt: PointerEvent) => {
|
|
126
|
+
pointer.update(evt)
|
|
127
|
+
if (disabled) return
|
|
128
|
+
if (active) return
|
|
129
|
+
actions.goToOption(Focus.Specific, id, ActivationTrigger.Pointer)
|
|
44
130
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
data.listElements.set(id, ref);
|
|
131
|
+
|
|
132
|
+
const handleMove = (evt: PointerEvent) => {
|
|
133
|
+
if (!pointer.wasMoved(evt)) return
|
|
134
|
+
if (disabled) return
|
|
135
|
+
if (active) return
|
|
136
|
+
actions.goToOption(Focus.Specific, id, ActivationTrigger.Pointer)
|
|
52
137
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (data.listboxState !== ListboxStates.Open) return;
|
|
60
|
-
if (!active) return;
|
|
61
|
-
if (data.activationTrigger === ActivationTrigger.Pointer) return;
|
|
62
|
-
return disposables().requestAnimationFrame(() => {
|
|
63
|
-
;
|
|
64
|
-
ref?.scrollIntoView?.({ block: "nearest" });
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
onMount(() => {
|
|
68
|
-
if (usedInSelectedOption) return;
|
|
69
|
-
return actions.registerOption(id, {
|
|
70
|
-
get current() {
|
|
71
|
-
return bag;
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
const handleClick = (event) => {
|
|
76
|
-
if (disabled) return event.preventDefault();
|
|
77
|
-
actions.onChange(value);
|
|
78
|
-
if (data.closeOnSelect === true || data.closeOnSelect === void 0 && data.mode === ValueMode.Single) {
|
|
79
|
-
actions.closeListbox();
|
|
80
|
-
data.buttonElement?.focus({ preventScroll: true });
|
|
138
|
+
|
|
139
|
+
const handleLeave = (evt: PointerEvent) => {
|
|
140
|
+
if (!pointer.wasMoved(evt)) return
|
|
141
|
+
if (disabled) return
|
|
142
|
+
if (!active) return
|
|
143
|
+
actions.goToOption(Focus.Nothing)
|
|
81
144
|
}
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
!usedInSelectedOption ? {
|
|
115
|
-
id,
|
|
116
|
-
role: "option",
|
|
117
|
-
tabIndex: disabled === true ? void 0 : -1,
|
|
118
|
-
"aria-disabled": disabled === true ? true : void 0,
|
|
119
|
-
// According to the WAI-ARIA best practices, we should use aria-checked for
|
|
120
|
-
// multi-select,but Voice-Over disagrees. So we use aria-checked instead for
|
|
121
|
-
// both single and multi-select.
|
|
122
|
-
"aria-selected": selected,
|
|
123
|
-
disabled: void 0,
|
|
124
|
-
// Never forward the `disabled` prop
|
|
125
|
-
onclick: handleClick,
|
|
126
|
-
onfocus: handleFocus,
|
|
127
|
-
onpointerenter: handleEnter,
|
|
128
|
-
onmouseenter: handleEnter,
|
|
129
|
-
onpointermove: handleMove,
|
|
130
|
-
onmousemove: handleMove,
|
|
131
|
-
onpointerleave: handleLeave,
|
|
132
|
-
onmouseleave: handleLeave,
|
|
133
|
-
...stateFromSlot(slot)
|
|
134
|
-
} : {}
|
|
135
|
-
);
|
|
145
|
+
|
|
146
|
+
const slot = $derived({
|
|
147
|
+
active,
|
|
148
|
+
focus: active,
|
|
149
|
+
selected,
|
|
150
|
+
disabled,
|
|
151
|
+
selectedOption: selected && usedInSelectedOption,
|
|
152
|
+
} satisfies OptionRenderPropArg)
|
|
153
|
+
const ourProps = $derived(
|
|
154
|
+
!usedInSelectedOption
|
|
155
|
+
? {
|
|
156
|
+
id,
|
|
157
|
+
role: "option",
|
|
158
|
+
tabIndex: disabled === true ? undefined : -1,
|
|
159
|
+
"aria-disabled": disabled === true ? true : undefined,
|
|
160
|
+
// According to the WAI-ARIA best practices, we should use aria-checked for
|
|
161
|
+
// multi-select,but Voice-Over disagrees. So we use aria-checked instead for
|
|
162
|
+
// both single and multi-select.
|
|
163
|
+
"aria-selected": selected,
|
|
164
|
+
disabled: undefined, // Never forward the `disabled` prop
|
|
165
|
+
onclick: handleClick,
|
|
166
|
+
onfocus: handleFocus,
|
|
167
|
+
onpointerenter: handleEnter,
|
|
168
|
+
onmouseenter: handleEnter,
|
|
169
|
+
onpointermove: handleMove,
|
|
170
|
+
onmousemove: handleMove,
|
|
171
|
+
onpointerleave: handleLeave,
|
|
172
|
+
onmouseleave: handleLeave,
|
|
173
|
+
...stateFromSlot(slot),
|
|
174
|
+
}
|
|
175
|
+
: {}
|
|
176
|
+
)
|
|
136
177
|
</script>
|
|
137
178
|
|
|
138
179
|
{#if selected || !usedInSelectedOption}
|
|
@@ -14,16 +14,18 @@ export type ListboxOptionProps<TTag extends ElementType = typeof DEFAULT_OPTION_
|
|
|
14
14
|
disabled?: boolean;
|
|
15
15
|
value: TType;
|
|
16
16
|
}>;
|
|
17
|
-
export type ListboxOptionChildren = Snippet<[OptionRenderPropArg]>;
|
|
18
17
|
import { type Snippet } from "svelte";
|
|
19
18
|
declare class __sveltets_Render<TType, TTag extends ElementType = typeof DEFAULT_OPTION_TAG> {
|
|
20
19
|
props(): {
|
|
21
20
|
as?: TTag | undefined;
|
|
22
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "
|
|
23
|
-
children?: Snippet<[
|
|
21
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "class") | "disabled" | "value" | "id" | OptionPropsWeControl> 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: OptionRenderPropArg;
|
|
24
|
+
props: Record<string, any>;
|
|
25
|
+
}]> | undefined;
|
|
24
26
|
ref?: HTMLElement;
|
|
25
|
-
} & (true extends (import("
|
|
26
|
-
class?:
|
|
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: OptionRenderPropArg) => string) | null | undefined;
|
|
27
29
|
} : {}) & {
|
|
28
30
|
id?: string;
|
|
29
31
|
disabled?: boolean;
|