@pzerelles/headlessui-svelte 2.1.2-next.3 → 2.1.2-next.31
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 +1 -1
- package/dist/button/Button.svelte.d.ts +9 -11
- package/dist/checkbox/Checkbox.svelte +4 -4
- package/dist/checkbox/Checkbox.svelte.d.ts +10 -14
- package/dist/close-button/CloseButton.svelte.d.ts +16 -18
- package/dist/data-interactive/DataInteractive.svelte.d.ts +8 -11
- package/dist/description/Description.svelte +19 -14
- package/dist/description/Description.svelte.d.ts +9 -11
- package/dist/description/context.svelte.js +14 -16
- package/dist/dialog/Dialog.svelte +245 -17
- package/dist/dialog/Dialog.svelte.d.ts +12 -14
- package/dist/dialog/DialogBackdrop.svelte +1 -1
- package/dist/dialog/DialogBackdrop.svelte.d.ts +9 -11
- package/dist/dialog/DialogPanel.svelte +1 -2
- package/dist/dialog/DialogPanel.svelte.d.ts +9 -11
- package/dist/dialog/DialogTitle.svelte.d.ts +8 -10
- package/dist/dialog/context.svelte.js +1 -1
- package/dist/field/Field.svelte +24 -12
- package/dist/field/Field.svelte.d.ts +9 -11
- package/dist/fieldset/Fieldset.svelte +1 -1
- package/dist/fieldset/Fieldset.svelte.d.ts +9 -11
- package/dist/focus-trap/FocusTrap.svelte +7 -14
- package/dist/focus-trap/FocusTrap.svelte.d.ts +11 -25
- package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
- package/dist/focus-trap/FocusTrapFeatures.js +15 -0
- package/dist/hooks/use-controllable.svelte.js +2 -1
- package/dist/hooks/use-did-element-move.svelte.js +5 -10
- package/dist/hooks/use-disabled.d.ts +6 -1
- package/dist/hooks/use-disabled.js +10 -5
- package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
- package/dist/hooks/use-event-listener.svelte.js +3 -1
- package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
- package/dist/hooks/use-root-containers.svelte.js +5 -5
- package/dist/hooks/use-tab-direction.svelte.js +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/dist/input/Input.svelte +3 -3
- package/dist/input/Input.svelte.d.ts +10 -14
- package/dist/internal/FloatingProvider.svelte +12 -0
- package/dist/internal/FloatingProvider.svelte.d.ts +6 -0
- package/dist/internal/FocusSentinel.svelte.d.ts +2 -18
- package/dist/internal/ForcePortalRoot.svelte.d.ts +2 -18
- package/dist/internal/FormFields.svelte +22 -19
- package/dist/internal/FormFields.svelte.d.ts +2 -18
- package/dist/internal/FormFieldsProvider.svelte +13 -0
- package/dist/internal/FormFieldsProvider.svelte.d.ts +5 -0
- package/dist/internal/FormResolver.svelte.d.ts +2 -18
- package/dist/internal/Hidden.svelte +18 -8
- package/dist/internal/Hidden.svelte.d.ts +11 -16
- package/dist/internal/HiddenFeatures.d.ts +5 -0
- package/dist/internal/HiddenFeatures.js +9 -0
- package/dist/internal/MainTreeProvider.svelte.d.ts +2 -18
- package/dist/internal/Portal.svelte.d.ts +2 -18
- package/dist/internal/floating-provider.svelte.d.ts +3 -0
- package/dist/internal/floating-provider.svelte.js +206 -0
- package/dist/internal/floating.svelte.d.ts +46 -22
- package/dist/internal/floating.svelte.js +90 -272
- package/dist/internal/form-fields.svelte.d.ts +10 -0
- package/dist/internal/form-fields.svelte.js +23 -0
- package/dist/label/Label.svelte +6 -5
- package/dist/label/Label.svelte.d.ts +9 -11
- package/dist/label/context.svelte.js +1 -1
- package/dist/legend/Legend.svelte +2 -2
- package/dist/legend/Legend.svelte.d.ts +4 -32
- package/dist/listbox/Listbox.svelte +47 -68
- package/dist/listbox/Listbox.svelte.d.ts +18 -80
- package/dist/listbox/ListboxButton.svelte +10 -10
- package/dist/listbox/ListboxButton.svelte.d.ts +10 -15
- package/dist/listbox/ListboxOption.svelte +10 -6
- package/dist/listbox/ListboxOption.svelte.d.ts +9 -12
- package/dist/listbox/ListboxOptions.svelte +108 -54
- package/dist/listbox/ListboxOptions.svelte.d.ts +9 -12
- package/dist/listbox/ListboxSelectedOption.svelte +2 -4
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -16
- package/dist/listbox/context.svelte.d.ts +76 -0
- package/dist/listbox/context.svelte.js +36 -0
- package/dist/listbox/index.d.ts +4 -4
- package/dist/listbox/index.js +1 -1
- package/dist/menu/Menu.svelte +13 -191
- package/dist/menu/Menu.svelte.d.ts +9 -13
- package/dist/menu/MenuButton.svelte +4 -2
- package/dist/menu/MenuButton.svelte.d.ts +9 -12
- package/dist/menu/MenuHeading.svelte.d.ts +9 -12
- package/dist/menu/MenuItem.svelte.d.ts +11 -16
- package/dist/menu/MenuItems.svelte +15 -11
- package/dist/menu/MenuItems.svelte.d.ts +9 -12
- package/dist/menu/MenuSection.svelte.d.ts +8 -11
- package/dist/menu/MenuSeparator.svelte.d.ts +8 -12
- package/dist/menu/context.svelte.d.ts +2 -1
- package/dist/menu/context.svelte.js +212 -2
- package/dist/menu/index.d.ts +7 -7
- package/dist/popover/Popover.svelte +161 -0
- package/dist/popover/Popover.svelte.d.ts +39 -0
- package/dist/popover/PopoverBackdrop.svelte +56 -0
- package/dist/popover/PopoverBackdrop.svelte.d.ts +43 -0
- package/dist/popover/PopoverButton.svelte +246 -0
- package/dist/popover/PopoverButton.svelte.d.ts +42 -0
- package/dist/popover/PopoverGroup.svelte +43 -0
- package/dist/popover/PopoverGroup.svelte.d.ts +31 -0
- package/dist/popover/PopoverPanel.svelte +274 -0
- package/dist/popover/PopoverPanel.svelte.d.ts +51 -0
- package/dist/popover/context.svelte.d.ts +51 -0
- package/dist/popover/context.svelte.js +108 -0
- package/dist/popover/index.d.ts +5 -0
- package/dist/popover/index.js +5 -0
- package/dist/portal/InternalPortal.svelte.d.ts +9 -11
- package/dist/portal/Portal.svelte.d.ts +2 -6
- package/dist/portal/PortalGroup.svelte.d.ts +9 -11
- package/dist/select/Select.svelte +74 -0
- package/dist/select/Select.svelte.d.ts +46 -0
- package/dist/select/index.d.ts +1 -0
- package/dist/select/index.js +1 -0
- package/dist/switch/Switch.svelte +30 -20
- package/dist/switch/Switch.svelte.d.ts +10 -12
- package/dist/switch/SwitchGroup.svelte.d.ts +8 -10
- package/dist/tabs/Tab.svelte +8 -9
- package/dist/tabs/Tab.svelte.d.ts +9 -11
- package/dist/tabs/TabGroup.svelte +27 -190
- package/dist/tabs/TabGroup.svelte.d.ts +9 -31
- package/dist/tabs/TabList.svelte +4 -4
- package/dist/tabs/TabList.svelte.d.ts +8 -10
- package/dist/tabs/TabPanel.svelte +4 -5
- package/dist/tabs/TabPanel.svelte.d.ts +9 -11
- package/dist/tabs/TabPanels.svelte +3 -3
- package/dist/tabs/TabPanels.svelte.d.ts +8 -10
- package/dist/tabs/context.svelte.d.ts +31 -0
- package/dist/tabs/context.svelte.js +134 -0
- package/dist/textarea/Textarea.svelte +4 -4
- package/dist/textarea/Textarea.svelte.d.ts +21 -20
- package/dist/transition/InternalTransitionChild.svelte.d.ts +9 -11
- package/dist/transition/Transition.svelte.d.ts +9 -11
- package/dist/transition/TransitionChild.svelte.d.ts +9 -11
- package/dist/transition/context.svelte.js +2 -2
- package/dist/utils/DisabledProvider.svelte +6 -0
- package/dist/utils/DisabledProvider.svelte.d.ts +6 -0
- package/dist/utils/ElementOrComponent.svelte +2 -2
- package/dist/utils/ElementOrComponent.svelte.d.ts +12 -11
- package/dist/utils/Generic.svelte +10 -8
- package/dist/utils/Generic.svelte.d.ts +12 -15
- package/dist/utils/StableCollection.svelte.d.ts +2 -18
- package/dist/utils/alternative-types.d.ts +1 -2
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +17 -0
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +7 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +25 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
- package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
- package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
- package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
- package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
- package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
- package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
- package/dist/utils/floating-ui/svelte/index.js +5 -0
- package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
- package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
- package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
- package/dist/utils/floating-ui/svelte/types.js +1 -0
- package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
- package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
- package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
- package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
- package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
- package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
- package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
- package/dist/utils/floating-ui/svelte/utils.js +136 -0
- package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
- package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
- package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
- package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
- package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
- package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
- package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
- package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +182 -0
- package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
- package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
- package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
- package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
- package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
- package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
- package/dist/utils/id.d.ts +1 -1
- package/dist/utils/id.js +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/style.d.ts +2 -0
- package/dist/utils/style.js +6 -0
- package/dist/utils/types.d.ts +9 -13
- package/package.json +27 -26
- package/dist/dialog/InternalDialog.svelte +0 -233
- package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
- package/dist/internal/HoistFormFields.svelte +0 -11
- package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
- package/dist/internal/id.d.ts +0 -8
- package/dist/internal/id.js +0 -11
|
@@ -24,24 +24,25 @@ import { Focus } from "../utils/calculate-active-index.js";
|
|
|
24
24
|
import { focusFrom, Focus as FocusManagementFocus } from "../utils/focus-management.js";
|
|
25
25
|
import { useElementSize } from "../hooks/use-element-size.svelte.js";
|
|
26
26
|
import { setContext } from "svelte";
|
|
27
|
-
import Hidden from "../internal/Hidden.svelte";
|
|
28
27
|
import Portal from "../portal/Portal.svelte";
|
|
29
|
-
import { stateFromSlot } from "../utils/state.js";
|
|
30
28
|
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
31
29
|
const internalId = useId();
|
|
32
30
|
let {
|
|
33
|
-
as = DEFAULT_OPTIONS_TAG,
|
|
34
31
|
ref = $bindable(),
|
|
35
32
|
id = `headlessui-listbox-options-${internalId}`,
|
|
36
33
|
anchor: rawAnchor,
|
|
37
34
|
portal = false,
|
|
38
35
|
modal = true,
|
|
39
36
|
transition = false,
|
|
40
|
-
static: isStatic = false,
|
|
41
|
-
unmount = true,
|
|
42
37
|
...theirProps
|
|
43
38
|
} = $props();
|
|
44
|
-
const
|
|
39
|
+
const resolvedAnchor = useResolvedAnchor({
|
|
40
|
+
get anchor() {
|
|
41
|
+
return rawAnchor;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const { anchor } = $derived(resolvedAnchor);
|
|
45
|
+
let localOptionsElement = $state();
|
|
45
46
|
$effect(() => {
|
|
46
47
|
if (anchor) {
|
|
47
48
|
portal = true;
|
|
@@ -49,7 +50,7 @@ $effect(() => {
|
|
|
49
50
|
});
|
|
50
51
|
const data = useData("ListboxOptions");
|
|
51
52
|
const actions = useActions("ListboxOptions");
|
|
52
|
-
const ownerDocument = $derived(getOwnerDocument(data.
|
|
53
|
+
const ownerDocument = $derived(getOwnerDocument(data.optionsElement));
|
|
53
54
|
const usesOpenClosedState = useOpenClosed();
|
|
54
55
|
const show = $derived(
|
|
55
56
|
usesOpenClosedState !== null ? (usesOpenClosedState.value & State.Open) === State.Open : data.listboxState === ListboxStates.Open
|
|
@@ -59,7 +60,7 @@ const _transition = useTransition({
|
|
|
59
60
|
return transition;
|
|
60
61
|
},
|
|
61
62
|
get element() {
|
|
62
|
-
return
|
|
63
|
+
return localOptionsElement;
|
|
63
64
|
},
|
|
64
65
|
get show() {
|
|
65
66
|
return show;
|
|
@@ -71,7 +72,7 @@ useOnDisappear({
|
|
|
71
72
|
return visible;
|
|
72
73
|
},
|
|
73
74
|
get ref() {
|
|
74
|
-
return data.
|
|
75
|
+
return data.buttonElement;
|
|
75
76
|
},
|
|
76
77
|
get ondisappear() {
|
|
77
78
|
return actions.closeListbox;
|
|
@@ -93,7 +94,7 @@ useInertOthers({
|
|
|
93
94
|
},
|
|
94
95
|
elements: {
|
|
95
96
|
get allowed() {
|
|
96
|
-
return [data.
|
|
97
|
+
return [data.buttonElement, data.optionsElement];
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
100
|
});
|
|
@@ -103,7 +104,7 @@ const didButtonMove = useDidElementMove({
|
|
|
103
104
|
return didElementMoveEnabled;
|
|
104
105
|
},
|
|
105
106
|
get element() {
|
|
106
|
-
return data.
|
|
107
|
+
return data.buttonElement;
|
|
107
108
|
}
|
|
108
109
|
});
|
|
109
110
|
const panelEnabled = $derived(didButtonMove.value ? false : visible);
|
|
@@ -116,18 +117,18 @@ const frozenValue = useFrozenData({
|
|
|
116
117
|
return data.value;
|
|
117
118
|
}
|
|
118
119
|
});
|
|
119
|
-
const isSelected = (compareValue) => data.compare(frozenValue, compareValue);
|
|
120
|
-
const selectedOptionIndex = () => {
|
|
120
|
+
const isSelected = (compareValue) => data.compare(frozenValue.data, compareValue);
|
|
121
|
+
const selectedOptionIndex = $derived.by(() => {
|
|
121
122
|
if (anchor == null) return null;
|
|
122
123
|
if (!anchor?.to?.includes("selection")) return null;
|
|
123
124
|
let idx = data.options.findIndex((option) => isSelected(option.dataRef.current.value));
|
|
124
125
|
if (idx === -1) idx = 0;
|
|
125
126
|
return idx;
|
|
126
|
-
};
|
|
127
|
+
});
|
|
127
128
|
const anchorOptions = $derived.by(() => {
|
|
128
129
|
if (anchor == null) return void 0;
|
|
129
130
|
if (selectedOptionIndex === null) return { ...anchor, inner: void 0 };
|
|
130
|
-
let elements = Array.from(data.
|
|
131
|
+
let elements = Array.from(data.listElements.values());
|
|
131
132
|
return {
|
|
132
133
|
...anchor,
|
|
133
134
|
inner: {
|
|
@@ -141,20 +142,20 @@ const floatingPanel = useFloatingPanel({
|
|
|
141
142
|
return anchorOptions ?? null;
|
|
142
143
|
}
|
|
143
144
|
});
|
|
144
|
-
const { setFloating,
|
|
145
|
+
const { setFloating, styles } = $derived(floatingPanel);
|
|
145
146
|
const getFloatingPanelProps = useFloatingPanelProps();
|
|
146
147
|
$effect(() => {
|
|
147
|
-
|
|
148
|
-
|
|
148
|
+
localOptionsElement = ref;
|
|
149
|
+
data.optionsElement = ref ?? null;
|
|
150
|
+
if (anchor) setFloating(ref ?? null);
|
|
149
151
|
});
|
|
150
152
|
const searchDisposables = useDisposables();
|
|
151
|
-
const { listboxState,
|
|
153
|
+
const { listboxState, optionsElement } = $derived(data);
|
|
152
154
|
$effect(() => {
|
|
153
|
-
|
|
154
|
-
if (!container) return;
|
|
155
|
+
if (!optionsElement) return;
|
|
155
156
|
if (listboxState !== ListboxStates.Open) return;
|
|
156
|
-
if (
|
|
157
|
-
|
|
157
|
+
if (optionsElement === getOwnerDocument(optionsElement)?.activeElement) return;
|
|
158
|
+
optionsElement?.focus({ preventScroll: true });
|
|
158
159
|
});
|
|
159
160
|
const handleKeyDown = (event) => {
|
|
160
161
|
searchDisposables.dispose();
|
|
@@ -174,7 +175,7 @@ const handleKeyDown = (event) => {
|
|
|
174
175
|
}
|
|
175
176
|
if (data.mode === ValueMode.Single) {
|
|
176
177
|
actions.closeListbox();
|
|
177
|
-
data.
|
|
178
|
+
data.buttonElement?.focus({ preventScroll: true });
|
|
178
179
|
}
|
|
179
180
|
break;
|
|
180
181
|
case match(data.orientation, { vertical: "ArrowDown", horizontal: "ArrowRight" }):
|
|
@@ -199,13 +200,13 @@ const handleKeyDown = (event) => {
|
|
|
199
200
|
event.preventDefault();
|
|
200
201
|
event.stopPropagation();
|
|
201
202
|
actions.closeListbox();
|
|
202
|
-
data.
|
|
203
|
+
data.buttonElement?.focus({ preventScroll: true });
|
|
203
204
|
return;
|
|
204
205
|
case "Tab":
|
|
205
206
|
event.preventDefault();
|
|
206
207
|
event.stopPropagation();
|
|
207
208
|
actions.closeListbox();
|
|
208
|
-
focusFrom(data.
|
|
209
|
+
focusFrom(data.buttonElement, event.shiftKey ? FocusManagementFocus.Previous : FocusManagementFocus.Next);
|
|
209
210
|
break;
|
|
210
211
|
default:
|
|
211
212
|
if (event.key.length === 1) {
|
|
@@ -215,55 +216,108 @@ const handleKeyDown = (event) => {
|
|
|
215
216
|
break;
|
|
216
217
|
}
|
|
217
218
|
};
|
|
218
|
-
const labelledby = $derived(data.
|
|
219
|
+
const labelledby = $derived(data.buttonElement?.id);
|
|
219
220
|
const slot = $derived({
|
|
220
221
|
open: data.listboxState === ListboxStates.Open
|
|
221
222
|
});
|
|
222
223
|
const buttonSize = useElementSize({
|
|
223
224
|
get element() {
|
|
224
|
-
return data.
|
|
225
|
+
return data.buttonElement;
|
|
225
226
|
},
|
|
226
227
|
unit: true
|
|
227
228
|
});
|
|
228
|
-
|
|
229
|
-
|
|
229
|
+
$effect(() => {
|
|
230
|
+
transitionData;
|
|
231
|
+
});
|
|
232
|
+
const ourProps = $derived({
|
|
233
|
+
...mergeProps(anchor ? getFloatingPanelProps() : {}, {
|
|
230
234
|
id,
|
|
231
235
|
"aria-activedescendant": data.activeOptionIndex === null ? void 0 : data.options[data.activeOptionIndex]?.id,
|
|
232
236
|
"aria-multiselectable": data.mode === ValueMode.Multi ? true : void 0,
|
|
233
237
|
"aria-labelledby": labelledby,
|
|
234
238
|
"aria-orientation": data.orientation,
|
|
235
|
-
onkeydown: handleKeyDown,
|
|
236
239
|
role: "listbox",
|
|
237
240
|
// When the `Listbox` is closed, it should not be focusable. This allows us
|
|
238
241
|
// to skip focusing the `ListboxOptions` when pressing the tab key on an
|
|
239
242
|
// open `Listbox`, and go to the next focusable element.
|
|
240
|
-
|
|
241
|
-
style: [theirProps.style,
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
const derivedData = {
|
|
243
|
+
tabindex: data.listboxState === ListboxStates.Open ? 0 : void 0,
|
|
244
|
+
style: [theirProps.style, styles, `--button-width: ${buttonSize.width}`].filter(Boolean).join("; ")
|
|
245
|
+
}),
|
|
246
|
+
...transitionDataAttributes(transitionData)
|
|
247
|
+
});
|
|
248
|
+
const derivedData = $derived({
|
|
247
249
|
...data,
|
|
248
250
|
get isSelected() {
|
|
249
251
|
return data.mode === ValueMode.Multi ? data.isSelected : isSelected;
|
|
250
252
|
}
|
|
251
|
-
};
|
|
252
|
-
setContext("ListboxDataContext",
|
|
253
|
+
});
|
|
254
|
+
setContext("ListboxDataContext", {
|
|
255
|
+
get value() {
|
|
256
|
+
return data.value;
|
|
257
|
+
},
|
|
258
|
+
get disabled() {
|
|
259
|
+
return data.disabled;
|
|
260
|
+
},
|
|
261
|
+
get invalid() {
|
|
262
|
+
return data.invalid;
|
|
263
|
+
},
|
|
264
|
+
get mode() {
|
|
265
|
+
return data.mode;
|
|
266
|
+
},
|
|
267
|
+
get orientation() {
|
|
268
|
+
return data.orientation;
|
|
269
|
+
},
|
|
270
|
+
get activeOptionIndex() {
|
|
271
|
+
return data.activeOptionIndex;
|
|
272
|
+
},
|
|
273
|
+
get closeOnSelect() {
|
|
274
|
+
return data.closeOnSelect;
|
|
275
|
+
},
|
|
276
|
+
get compare() {
|
|
277
|
+
return data.compare;
|
|
278
|
+
},
|
|
279
|
+
get isSelected() {
|
|
280
|
+
return data.mode === ValueMode.Multi ? data.isSelected : isSelected;
|
|
281
|
+
},
|
|
282
|
+
get optionsProps() {
|
|
283
|
+
return data.optionsProps;
|
|
284
|
+
},
|
|
285
|
+
get listElements() {
|
|
286
|
+
return data.listElements;
|
|
287
|
+
},
|
|
288
|
+
get buttonElement() {
|
|
289
|
+
return data.buttonElement;
|
|
290
|
+
},
|
|
291
|
+
get optionsElement() {
|
|
292
|
+
return data.optionsElement;
|
|
293
|
+
},
|
|
294
|
+
get listboxState() {
|
|
295
|
+
return data.listboxState;
|
|
296
|
+
},
|
|
297
|
+
get options() {
|
|
298
|
+
return data.options;
|
|
299
|
+
},
|
|
300
|
+
get searchQuery() {
|
|
301
|
+
return data.searchQuery;
|
|
302
|
+
},
|
|
303
|
+
get activationTrigger() {
|
|
304
|
+
return data.activationTrigger;
|
|
305
|
+
},
|
|
306
|
+
get __demoMode() {
|
|
307
|
+
return data.__demoMode;
|
|
308
|
+
}
|
|
309
|
+
});
|
|
253
310
|
</script>
|
|
254
311
|
|
|
255
|
-
<Portal enabled={portal ?
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
bind:ref
|
|
267
|
-
/>
|
|
268
|
-
{/if}
|
|
312
|
+
<Portal enabled={portal ? theirProps.static || visible : false}>
|
|
313
|
+
<ElementOrComponent
|
|
314
|
+
{ourProps}
|
|
315
|
+
{theirProps}
|
|
316
|
+
slots={slot}
|
|
317
|
+
defaultTag={DEFAULT_OPTIONS_TAG}
|
|
318
|
+
features={OptionsRenderFeatures}
|
|
319
|
+
visible={panelEnabled}
|
|
320
|
+
name="ListboxOptions"
|
|
321
|
+
bind:ref
|
|
322
|
+
/>
|
|
269
323
|
</Portal>
|
|
@@ -14,17 +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" | "
|
|
23
|
-
children?:
|
|
21
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "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;
|
|
26
|
+
class?: string | ((bag: OptionsRenderPropArg) => string) | null | undefined;
|
|
24
27
|
ref?: HTMLElement;
|
|
25
|
-
} &
|
|
26
|
-
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: OptionsRenderPropArg) => string) | undefined;
|
|
27
|
-
} : {}) & {
|
|
28
|
+
} & {
|
|
28
29
|
id?: string;
|
|
29
30
|
anchor?: AnchorPropsWithSelection;
|
|
30
31
|
portal?: boolean;
|
|
@@ -34,9 +35,7 @@ declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_OPTION
|
|
|
34
35
|
static?: boolean | undefined;
|
|
35
36
|
unmount?: boolean | undefined;
|
|
36
37
|
};
|
|
37
|
-
events(): {}
|
|
38
|
-
[evt: string]: CustomEvent<any>;
|
|
39
|
-
};
|
|
38
|
+
events(): {};
|
|
40
39
|
slots(): {};
|
|
41
40
|
bindings(): "ref";
|
|
42
41
|
exports(): {};
|
|
@@ -45,9 +44,7 @@ interface $$IsomorphicComponent {
|
|
|
45
44
|
new <TTag extends ElementType = typeof DEFAULT_OPTIONS_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']>> & {
|
|
46
45
|
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
47
46
|
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
48
|
-
<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
49
|
-
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
50
|
-
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
47
|
+
<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
51
48
|
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
52
49
|
}
|
|
53
50
|
declare const ListboxOptions: $$IsomorphicComponent;
|
|
@@ -19,11 +19,9 @@ setContext("SelectedOptionContext", true);
|
|
|
19
19
|
|
|
20
20
|
{#snippet children()}
|
|
21
21
|
{#if placeholder && shouldShowPlaceholder}
|
|
22
|
-
{@
|
|
23
|
-
<Component />
|
|
22
|
+
{@render placeholder()}
|
|
24
23
|
{:else}
|
|
25
|
-
{@
|
|
26
|
-
<Component />
|
|
24
|
+
{@render options()}
|
|
27
25
|
{/if}
|
|
28
26
|
{/snippet}
|
|
29
27
|
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import type { ElementType, Props } from "../utils/types.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
3
|
declare const DEFAULT_SELECTED_OPTION_TAG = "svelte:fragment";
|
|
4
4
|
type SelectedOptionRenderPropArg = {};
|
|
5
5
|
type SelectedOptionPropsWeControl = never;
|
|
6
6
|
export type ListboxSelectedOptionProps<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> = Props<TTag, SelectedOptionRenderPropArg, SelectedOptionPropsWeControl, {
|
|
7
|
-
options:
|
|
8
|
-
placeholder?:
|
|
7
|
+
options: Snippet;
|
|
8
|
+
placeholder?: Snippet;
|
|
9
9
|
}>;
|
|
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" | "
|
|
14
|
-
children?:
|
|
13
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "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;
|
|
18
|
+
class?: string | ((bag: SelectedOptionRenderPropArg) => string) | null | undefined;
|
|
15
19
|
ref?: HTMLElement;
|
|
16
|
-
} &
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
options: Component<any, any>;
|
|
20
|
-
placeholder?: Component<any, any>;
|
|
21
|
-
};
|
|
22
|
-
events(): {} & {
|
|
23
|
-
[evt: string]: CustomEvent<any>;
|
|
20
|
+
} & {
|
|
21
|
+
options: Snippet;
|
|
22
|
+
placeholder?: Snippet;
|
|
24
23
|
};
|
|
24
|
+
events(): {};
|
|
25
25
|
slots(): {};
|
|
26
26
|
bindings(): "ref";
|
|
27
27
|
exports(): {};
|
|
@@ -30,9 +30,7 @@ interface $$IsomorphicComponent {
|
|
|
30
30
|
new <TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_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']>> & {
|
|
31
31
|
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
32
32
|
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
33
|
-
<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
34
|
-
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
35
|
-
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
33
|
+
<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
36
34
|
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
37
35
|
}
|
|
38
36
|
declare const ListboxSelectedOption: $$IsomorphicComponent;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Focus } from "../utils/calculate-active-index.js";
|
|
2
|
+
import type { MutableRefObject } from "../utils/ref.svelte.js";
|
|
3
|
+
import type { SvelteMap } from "svelte/reactivity";
|
|
4
|
+
export declare enum ListboxStates {
|
|
5
|
+
Open = 0,
|
|
6
|
+
Closed = 1
|
|
7
|
+
}
|
|
8
|
+
export declare enum ValueMode {
|
|
9
|
+
Single = 0,
|
|
10
|
+
Multi = 1
|
|
11
|
+
}
|
|
12
|
+
export declare enum ActivationTrigger {
|
|
13
|
+
Pointer = 0,
|
|
14
|
+
Other = 1
|
|
15
|
+
}
|
|
16
|
+
export type ListboxOptionDataRef<T> = MutableRefObject<{
|
|
17
|
+
textValue?: string;
|
|
18
|
+
disabled: boolean;
|
|
19
|
+
value: T;
|
|
20
|
+
domRef: MutableRefObject<HTMLElement | null>;
|
|
21
|
+
}>;
|
|
22
|
+
export interface StateDefinition<T> {
|
|
23
|
+
listboxState: ListboxStates;
|
|
24
|
+
options: {
|
|
25
|
+
id: string;
|
|
26
|
+
dataRef: ListboxOptionDataRef<T>;
|
|
27
|
+
}[];
|
|
28
|
+
searchQuery: string;
|
|
29
|
+
activeOptionIndex: number | null;
|
|
30
|
+
activationTrigger: ActivationTrigger;
|
|
31
|
+
__demoMode: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface StateActions<T> {
|
|
34
|
+
openListbox(): void;
|
|
35
|
+
closeListbox(): void;
|
|
36
|
+
registerOption(id: string, dataRef: ListboxOptionDataRef<T>): void;
|
|
37
|
+
unregisterOption(id: string): void;
|
|
38
|
+
goToOption(action: {
|
|
39
|
+
focus: Focus.Specific;
|
|
40
|
+
id: string;
|
|
41
|
+
trigger?: ActivationTrigger;
|
|
42
|
+
} | {
|
|
43
|
+
focus: Exclude<Focus, Focus.Specific>;
|
|
44
|
+
trigger?: ActivationTrigger;
|
|
45
|
+
}): void;
|
|
46
|
+
search(query: string): void;
|
|
47
|
+
clearSearch(): void;
|
|
48
|
+
}
|
|
49
|
+
export type ListboxActionsContext<T = unknown> = {
|
|
50
|
+
registerOption(id: string, dataRef: ListboxOptionDataRef<T>): () => void;
|
|
51
|
+
goToOption(focus: Focus.Specific, id: string, trigger?: ActivationTrigger): void;
|
|
52
|
+
goToOption(focus: Focus, id?: string, trigger?: ActivationTrigger): void;
|
|
53
|
+
selectOption(id: string): void;
|
|
54
|
+
selectActiveOption(): void;
|
|
55
|
+
onChange(value: T): void;
|
|
56
|
+
} & Pick<StateActions<T>, "openListbox" | "closeListbox" | "search" | "clearSearch">;
|
|
57
|
+
export declare function useActions<T>(component: string): ListboxActionsContext<T>;
|
|
58
|
+
export type ListboxDataContext<T = unknown> = {
|
|
59
|
+
value: T;
|
|
60
|
+
disabled: boolean;
|
|
61
|
+
invalid: boolean;
|
|
62
|
+
mode: ValueMode;
|
|
63
|
+
orientation: "horizontal" | "vertical";
|
|
64
|
+
activeOptionIndex: number | null;
|
|
65
|
+
closeOnSelect?: boolean;
|
|
66
|
+
compare(a: T, z: T): boolean;
|
|
67
|
+
isSelected(value: T): boolean;
|
|
68
|
+
optionsProps: {
|
|
69
|
+
static: boolean;
|
|
70
|
+
hold: boolean;
|
|
71
|
+
};
|
|
72
|
+
listElements: SvelteMap<string, HTMLElement | null>;
|
|
73
|
+
buttonElement: HTMLElement | null;
|
|
74
|
+
optionsElement: HTMLElement | null;
|
|
75
|
+
} & StateDefinition<T>;
|
|
76
|
+
export declare function useData<T>(component: string): ListboxDataContext<T>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getContext } from "svelte";
|
|
2
|
+
export var ListboxStates;
|
|
3
|
+
(function (ListboxStates) {
|
|
4
|
+
ListboxStates[ListboxStates["Open"] = 0] = "Open";
|
|
5
|
+
ListboxStates[ListboxStates["Closed"] = 1] = "Closed";
|
|
6
|
+
})(ListboxStates || (ListboxStates = {}));
|
|
7
|
+
export var ValueMode;
|
|
8
|
+
(function (ValueMode) {
|
|
9
|
+
ValueMode[ValueMode["Single"] = 0] = "Single";
|
|
10
|
+
ValueMode[ValueMode["Multi"] = 1] = "Multi";
|
|
11
|
+
})(ValueMode || (ValueMode = {}));
|
|
12
|
+
export var ActivationTrigger;
|
|
13
|
+
(function (ActivationTrigger) {
|
|
14
|
+
ActivationTrigger[ActivationTrigger["Pointer"] = 0] = "Pointer";
|
|
15
|
+
ActivationTrigger[ActivationTrigger["Other"] = 1] = "Other";
|
|
16
|
+
})(ActivationTrigger || (ActivationTrigger = {}));
|
|
17
|
+
export function useActions(component) {
|
|
18
|
+
const context = getContext("ListboxActionsContext");
|
|
19
|
+
if (!context) {
|
|
20
|
+
const err = new Error(`<${component} /> is missing a parent <Listbox /> component.`);
|
|
21
|
+
if (Error.captureStackTrace)
|
|
22
|
+
Error.captureStackTrace(err, useActions);
|
|
23
|
+
throw err;
|
|
24
|
+
}
|
|
25
|
+
return context;
|
|
26
|
+
}
|
|
27
|
+
export function useData(component) {
|
|
28
|
+
const context = getContext("ListboxDataContext");
|
|
29
|
+
if (!context) {
|
|
30
|
+
const err = new Error(`<${component} /> is missing a parent <Listbox /> component.`);
|
|
31
|
+
if (Error.captureStackTrace)
|
|
32
|
+
Error.captureStackTrace(err, useData);
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
return context;
|
|
36
|
+
}
|
package/dist/listbox/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { default as Listbox, type ListboxProps
|
|
2
|
-
export { default as ListboxButton, type ListboxButtonProps
|
|
3
|
-
export { default as ListboxOption, type ListboxOptionProps
|
|
4
|
-
export { default as ListboxOptions, type ListboxOptionsProps
|
|
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";
|
package/dist/listbox/index.js
CHANGED
|
@@ -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
|
|
4
|
+
export { default as ListboxOptions } from "./ListboxOptions.svelte";
|
|
5
5
|
export { default as ListboxSelectedOption } from "./ListboxSelectedOption.svelte";
|