@pzerelles/headlessui-svelte 2.1.1-next.1 → 2.1.2-next.11
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 +6 -10
- package/dist/button/Button.svelte.d.ts +34 -26
- package/dist/checkbox/Checkbox.svelte +43 -25
- package/dist/checkbox/Checkbox.svelte.d.ts +42 -28
- package/dist/close-button/CloseButton.svelte +5 -4
- package/dist/close-button/CloseButton.svelte.d.ts +36 -13
- package/dist/combobox/Combobox.svelte +2 -2
- package/dist/combobox/Combobox.svelte.d.ts +9 -9
- package/dist/data-interactive/DataInteractive.svelte +41 -0
- package/dist/data-interactive/DataInteractive.svelte.d.ts +39 -0
- package/dist/data-interactive/index.d.ts +1 -0
- package/dist/data-interactive/index.js +1 -0
- package/dist/description/Description.svelte +10 -53
- package/dist/description/Description.svelte.d.ts +15 -32
- package/dist/description/context.svelte.d.ts +17 -0
- package/dist/description/context.svelte.js +51 -0
- package/dist/dialog/Dialog.svelte +51 -0
- package/dist/dialog/Dialog.svelte.d.ts +60 -0
- package/dist/dialog/DialogBackdrop.svelte +39 -0
- package/dist/dialog/DialogBackdrop.svelte.d.ts +38 -0
- package/dist/dialog/DialogPanel.svelte +46 -0
- package/dist/dialog/DialogPanel.svelte.d.ts +40 -0
- package/dist/dialog/DialogTitle.svelte +29 -0
- package/dist/dialog/DialogTitle.svelte.d.ts +34 -0
- package/dist/dialog/InternalDialog.svelte +233 -0
- package/dist/dialog/InternalDialog.svelte.d.ts +42 -0
- package/dist/dialog/context.svelte.d.ts +15 -0
- package/dist/dialog/context.svelte.js +16 -0
- package/dist/dialog/index.d.ts +4 -0
- package/dist/dialog/index.js +4 -0
- package/dist/field/Field.svelte +8 -11
- package/dist/field/Field.svelte.d.ts +21 -17
- package/dist/fieldset/Fieldset.svelte +11 -9
- package/dist/fieldset/Fieldset.svelte.d.ts +21 -17
- package/dist/focus-trap/FocusTrap.svelte +325 -0
- package/dist/focus-trap/FocusTrap.svelte.d.ts +46 -0
- package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
- package/dist/focus-trap/FocusTrapFeatures.js +15 -0
- package/dist/hooks/use-controllable.svelte.d.ts +1 -1
- package/dist/hooks/use-controllable.svelte.js +3 -3
- package/dist/hooks/use-did-element-move.svelte.js +5 -10
- package/dist/hooks/use-escape.svelte.d.ts +5 -0
- package/dist/hooks/use-escape.svelte.js +26 -0
- package/dist/hooks/use-event-listener.svelte.d.ts +6 -0
- package/dist/hooks/use-event-listener.svelte.js +12 -0
- package/dist/hooks/use-inert-others.svelte.d.ts +2 -2
- package/dist/hooks/use-inert-others.svelte.js +3 -3
- package/dist/hooks/use-is-mounted.svelte.d.ts +3 -0
- package/dist/hooks/use-is-mounted.svelte.js +14 -0
- package/dist/hooks/use-is-touch-device.svelte.d.ts +3 -0
- package/dist/hooks/use-is-touch-device.svelte.js +20 -0
- package/dist/hooks/use-root-containers.svelte.d.ts +9 -0
- package/dist/hooks/use-root-containers.svelte.js +50 -0
- package/dist/hooks/use-tab-direction.svelte.d.ts +7 -0
- package/dist/hooks/use-tab-direction.svelte.js +25 -0
- package/dist/hooks/use-transition.svelte.js +14 -13
- package/dist/hooks/use-tree-walker.svelte.d.ts +8 -0
- package/dist/hooks/use-tree-walker.svelte.js +19 -0
- package/dist/hooks/use-watch.svelte.d.ts +4 -0
- package/dist/hooks/use-watch.svelte.js +16 -0
- package/dist/hooks/use-window-event.svelte.d.ts +6 -0
- package/dist/hooks/use-window-event.svelte.js +12 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/input/Input.svelte +59 -0
- package/dist/input/Input.svelte.d.ts +50 -0
- package/dist/input/index.d.ts +1 -0
- package/dist/input/index.js +1 -0
- package/dist/internal/FloatingProvider.svelte +12 -0
- package/dist/internal/FloatingProvider.svelte.d.ts +22 -0
- package/dist/internal/FocusSentinel.svelte.d.ts +4 -1
- package/dist/internal/ForcePortalRoot.svelte +6 -0
- package/dist/internal/ForcePortalRoot.svelte.d.ts +22 -0
- package/dist/internal/FormFields.svelte.d.ts +4 -1
- package/dist/internal/FormResolver.svelte.d.ts +4 -1
- package/dist/internal/Hidden.svelte +6 -14
- package/dist/internal/Hidden.svelte.d.ts +19 -15
- package/dist/internal/HiddenFeatures.d.ts +5 -0
- package/dist/internal/HiddenFeatures.js +9 -0
- package/dist/internal/HoistFormFields.svelte.d.ts +4 -1
- package/dist/internal/MainTreeProvider.svelte +45 -0
- package/dist/internal/MainTreeProvider.svelte.d.ts +31 -0
- package/dist/internal/Portal.svelte.d.ts +4 -1
- package/dist/internal/close-provider.d.ts +7 -0
- package/dist/internal/close-provider.js +7 -0
- 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 +50 -20
- package/dist/internal/floating.svelte.js +100 -271
- package/dist/internal/inner.svelte.d.ts +91 -0
- package/dist/internal/inner.svelte.js +202 -0
- package/dist/internal/open-closed.d.ts +1 -1
- package/dist/internal/open-closed.js +1 -1
- package/dist/label/Label.svelte +17 -65
- package/dist/label/Label.svelte.d.ts +19 -32
- package/dist/label/context.svelte.d.ts +17 -0
- package/dist/label/context.svelte.js +56 -0
- package/dist/legend/Legend.svelte +4 -3
- package/dist/legend/Legend.svelte.d.ts +33 -15
- package/dist/listbox/Listbox.svelte +40 -74
- package/dist/listbox/Listbox.svelte.d.ts +30 -72
- package/dist/listbox/ListboxButton.svelte +16 -18
- package/dist/listbox/ListboxButton.svelte.d.ts +16 -7
- package/dist/listbox/ListboxOption.svelte +10 -10
- package/dist/listbox/ListboxOption.svelte.d.ts +22 -11
- package/dist/listbox/ListboxOptions.svelte +62 -60
- package/dist/listbox/ListboxOptions.svelte.d.ts +23 -7
- package/dist/listbox/ListboxSelectedOption.svelte +15 -7
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +24 -14
- package/dist/listbox/context.svelte.d.ts +75 -0
- package/dist/listbox/context.svelte.js +36 -0
- package/dist/menu/Menu.svelte +235 -0
- package/dist/menu/Menu.svelte.d.ts +42 -0
- package/dist/menu/MenuButton.svelte +129 -0
- package/dist/menu/MenuButton.svelte.d.ts +52 -0
- package/dist/menu/MenuHeading.svelte +19 -0
- package/dist/menu/MenuHeading.svelte.d.ts +39 -0
- package/dist/menu/MenuItem.svelte +114 -0
- package/dist/menu/MenuItem.svelte.d.ts +49 -0
- package/dist/menu/MenuItems.svelte +248 -0
- package/dist/menu/MenuItems.svelte.d.ts +55 -0
- package/dist/menu/MenuSection.svelte +14 -0
- package/dist/menu/MenuSection.svelte.d.ts +35 -0
- package/dist/menu/MenuSeparator.svelte +9 -0
- package/dist/menu/MenuSeparator.svelte.d.ts +35 -0
- package/dist/menu/context.svelte.d.ts +47 -0
- package/dist/menu/context.svelte.js +21 -0
- package/dist/menu/index.d.ts +7 -0
- package/dist/menu/index.js +7 -0
- package/dist/portal/InternalPortal.svelte +22 -33
- package/dist/portal/InternalPortal.svelte.d.ts +16 -7
- package/dist/portal/Portal.svelte +4 -8
- package/dist/portal/Portal.svelte.d.ts +6 -6
- package/dist/portal/PortalGroup.svelte +5 -6
- package/dist/portal/PortalGroup.svelte.d.ts +16 -7
- package/dist/switch/Switch.svelte +41 -37
- package/dist/switch/Switch.svelte.d.ts +24 -7
- package/dist/switch/SwitchGroup.svelte +7 -8
- package/dist/switch/SwitchGroup.svelte.d.ts +14 -7
- package/dist/tabs/Tab.svelte +9 -14
- package/dist/tabs/Tab.svelte.d.ts +18 -6
- package/dist/tabs/TabGroup.svelte +20 -23
- package/dist/tabs/TabGroup.svelte.d.ts +19 -6
- package/dist/tabs/TabList.svelte +5 -7
- package/dist/tabs/TabList.svelte.d.ts +13 -6
- package/dist/tabs/TabPanel.svelte +30 -32
- package/dist/tabs/TabPanel.svelte.d.ts +19 -6
- package/dist/tabs/TabPanels.svelte +5 -6
- package/dist/tabs/TabPanels.svelte.d.ts +13 -6
- package/dist/textarea/Textarea.svelte +67 -0
- package/dist/textarea/Textarea.svelte.d.ts +50 -0
- package/dist/textarea/index.d.ts +1 -0
- package/dist/textarea/index.js +1 -0
- package/dist/transition/InternalTransitionChild.svelte +178 -0
- package/dist/transition/InternalTransitionChild.svelte.d.ts +55 -0
- package/dist/transition/Transition.svelte +89 -0
- package/dist/transition/Transition.svelte.d.ts +42 -0
- package/dist/transition/TransitionChild.svelte +16 -0
- package/dist/transition/TransitionChild.svelte.d.ts +44 -0
- package/dist/transition/context.svelte.d.ts +64 -0
- package/dist/transition/context.svelte.js +120 -0
- package/dist/transition/index.d.ts +2 -0
- package/dist/transition/index.js +2 -0
- package/dist/utils/ElementOrComponent.svelte +26 -0
- package/dist/utils/ElementOrComponent.svelte.d.ts +56 -0
- package/dist/utils/Generic.svelte +44 -0
- package/dist/utils/Generic.svelte.d.ts +35 -0
- package/dist/utils/StableCollection.svelte +1 -1
- package/dist/utils/StableCollection.svelte.d.ts +4 -1
- package/dist/utils/active-element-history.d.ts +1 -0
- package/dist/utils/active-element-history.js +35 -0
- package/dist/utils/alternative-types.d.ts +21 -0
- package/dist/utils/alternative-types.js +1 -0
- package/dist/utils/class-names.d.ts +1 -0
- package/dist/utils/class-names.js +10 -0
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +17 -0
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +23 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +41 -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 +183 -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/focus-management.d.ts +2 -1
- package/dist/utils/focus-management.js +13 -13
- package/dist/utils/id.d.ts +1 -1
- package/dist/utils/id.js +1 -1
- package/dist/utils/on-document-ready.d.ts +1 -0
- package/dist/utils/on-document-ready.js +12 -0
- package/dist/utils/render.d.ts +3 -0
- package/dist/utils/render.js +63 -0
- package/dist/utils/state.d.ts +7 -1
- package/dist/utils/state.js +10 -6
- package/dist/utils/style.d.ts +2 -0
- package/dist/utils/style.js +6 -0
- package/dist/utils/types.d.ts +14 -17
- package/dist/utils/types.js +0 -5
- package/package.json +33 -31
- package/dist/internal/id.d.ts +0 -8
- package/dist/internal/id.js +0 -11
- package/dist/tabs/Button.svelte +0 -65
- package/dist/tabs/Button.svelte.d.ts +0 -39
- package/dist/utils/close.d.ts +0 -2
- package/dist/utils/close.js +0 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script lang="ts"
|
|
1
|
+
<script lang="ts" module>import { mergeProps, RenderFeatures } from "../utils/render.js";
|
|
2
2
|
import {
|
|
3
3
|
useFloatingPanel,
|
|
4
4
|
useFloatingPanelProps,
|
|
@@ -8,7 +8,7 @@ const DEFAULT_OPTIONS_TAG = "div";
|
|
|
8
8
|
let OptionsRenderFeatures = RenderFeatures.RenderStrategy | RenderFeatures.Static;
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
|
-
<script lang="ts" generics="TTag extends ElementType">import { useId } from "../hooks/use-id.js";
|
|
11
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG">import { useId } from "../hooks/use-id.js";
|
|
12
12
|
import { ListboxStates, useActions, useData, ValueMode } from "./Listbox.svelte";
|
|
13
13
|
import { getOwnerDocument } from "../utils/owner.js";
|
|
14
14
|
import { State, useOpenClosed } from "../internal/open-closed.js";
|
|
@@ -23,25 +23,26 @@ import { match } from "../utils/match.js";
|
|
|
23
23
|
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
|
-
import {
|
|
27
|
-
import Hidden from "../internal/Hidden.svelte";
|
|
26
|
+
import { setContext } from "svelte";
|
|
28
27
|
import Portal from "../portal/Portal.svelte";
|
|
29
|
-
import
|
|
28
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
30
29
|
const internalId = useId();
|
|
31
30
|
let {
|
|
32
|
-
as = DEFAULT_OPTIONS_TAG,
|
|
33
31
|
ref = $bindable(),
|
|
34
32
|
id = `headlessui-listbox-options-${internalId}`,
|
|
35
33
|
anchor: rawAnchor,
|
|
36
34
|
portal = false,
|
|
37
35
|
modal = true,
|
|
38
36
|
transition = false,
|
|
39
|
-
children,
|
|
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
|
|
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
|
-
const anchorOptions = (() => {
|
|
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: {
|
|
@@ -135,22 +136,26 @@ const anchorOptions = (() => {
|
|
|
135
136
|
index: selectedOptionIndex
|
|
136
137
|
}
|
|
137
138
|
};
|
|
138
|
-
})
|
|
139
|
-
const floatingPanel = useFloatingPanel(
|
|
140
|
-
|
|
139
|
+
});
|
|
140
|
+
const floatingPanel = useFloatingPanel({
|
|
141
|
+
get placement() {
|
|
142
|
+
return anchorOptions ?? null;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
const { setFloating, styles } = $derived(floatingPanel);
|
|
141
146
|
const getFloatingPanelProps = useFloatingPanelProps();
|
|
142
147
|
$effect(() => {
|
|
143
|
-
|
|
144
|
-
|
|
148
|
+
localOptionsElement = ref;
|
|
149
|
+
data.optionsElement = ref ?? null;
|
|
150
|
+
if (anchor) setFloating(ref ?? null);
|
|
145
151
|
});
|
|
146
152
|
const searchDisposables = useDisposables();
|
|
147
|
-
const { listboxState,
|
|
153
|
+
const { listboxState, optionsElement } = $derived(data);
|
|
148
154
|
$effect(() => {
|
|
149
|
-
|
|
150
|
-
if (!container) return;
|
|
155
|
+
if (!optionsElement) return;
|
|
151
156
|
if (listboxState !== ListboxStates.Open) return;
|
|
152
|
-
if (
|
|
153
|
-
|
|
157
|
+
if (optionsElement === getOwnerDocument(optionsElement)?.activeElement) return;
|
|
158
|
+
optionsElement?.focus({ preventScroll: true });
|
|
154
159
|
});
|
|
155
160
|
const handleKeyDown = (event) => {
|
|
156
161
|
searchDisposables.dispose();
|
|
@@ -170,7 +175,7 @@ const handleKeyDown = (event) => {
|
|
|
170
175
|
}
|
|
171
176
|
if (data.mode === ValueMode.Single) {
|
|
172
177
|
actions.closeListbox();
|
|
173
|
-
data.
|
|
178
|
+
data.buttonElement?.focus({ preventScroll: true });
|
|
174
179
|
}
|
|
175
180
|
break;
|
|
176
181
|
case match(data.orientation, { vertical: "ArrowDown", horizontal: "ArrowRight" }):
|
|
@@ -195,13 +200,13 @@ const handleKeyDown = (event) => {
|
|
|
195
200
|
event.preventDefault();
|
|
196
201
|
event.stopPropagation();
|
|
197
202
|
actions.closeListbox();
|
|
198
|
-
data.
|
|
203
|
+
data.buttonElement?.focus({ preventScroll: true });
|
|
199
204
|
return;
|
|
200
205
|
case "Tab":
|
|
201
206
|
event.preventDefault();
|
|
202
207
|
event.stopPropagation();
|
|
203
208
|
actions.closeListbox();
|
|
204
|
-
focusFrom(data.
|
|
209
|
+
focusFrom(data.buttonElement, event.shiftKey ? FocusManagementFocus.Previous : FocusManagementFocus.Next);
|
|
205
210
|
break;
|
|
206
211
|
default:
|
|
207
212
|
if (event.key.length === 1) {
|
|
@@ -211,35 +216,35 @@ const handleKeyDown = (event) => {
|
|
|
211
216
|
break;
|
|
212
217
|
}
|
|
213
218
|
};
|
|
214
|
-
const labelledby = $derived(data.
|
|
219
|
+
const labelledby = $derived(data.buttonElement?.id);
|
|
215
220
|
const slot = $derived({
|
|
216
221
|
open: data.listboxState === ListboxStates.Open
|
|
217
222
|
});
|
|
218
223
|
const buttonSize = useElementSize({
|
|
219
224
|
get element() {
|
|
220
|
-
return data.
|
|
225
|
+
return data.buttonElement;
|
|
221
226
|
},
|
|
222
227
|
unit: true
|
|
223
228
|
});
|
|
224
|
-
|
|
225
|
-
|
|
229
|
+
$effect(() => {
|
|
230
|
+
transitionData;
|
|
231
|
+
});
|
|
232
|
+
const ourProps = $derived({
|
|
233
|
+
...mergeProps(anchor ? getFloatingPanelProps() : {}, {
|
|
226
234
|
id,
|
|
227
|
-
ref: optionsRef,
|
|
228
235
|
"aria-activedescendant": data.activeOptionIndex === null ? void 0 : data.options[data.activeOptionIndex]?.id,
|
|
229
236
|
"aria-multiselectable": data.mode === ValueMode.Multi ? true : void 0,
|
|
230
237
|
"aria-labelledby": labelledby,
|
|
231
238
|
"aria-orientation": data.orientation,
|
|
232
|
-
onkeydown: handleKeyDown,
|
|
233
239
|
role: "listbox",
|
|
234
240
|
// When the `Listbox` is closed, it should not be focusable. This allows us
|
|
235
241
|
// to skip focusing the `ListboxOptions` when pressing the tab key on an
|
|
236
242
|
// open `Listbox`, and go to the next focusable element.
|
|
237
|
-
|
|
238
|
-
style: [theirProps.style,
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
);
|
|
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
|
+
});
|
|
243
248
|
const derivedData = {
|
|
244
249
|
...data,
|
|
245
250
|
get isSelected() {
|
|
@@ -247,21 +252,18 @@ const derivedData = {
|
|
|
247
252
|
}
|
|
248
253
|
};
|
|
249
254
|
setContext("ListboxDataContext", derivedData);
|
|
255
|
+
$inspect(styles);
|
|
250
256
|
</script>
|
|
251
257
|
|
|
252
|
-
<Portal enabled={portal ?
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
>
|
|
264
|
-
{#if children}{@render children(slot)}{/if}
|
|
265
|
-
</svelte:element>
|
|
266
|
-
{/if}
|
|
258
|
+
<Portal enabled={portal ? theirProps.static || visible : false}>
|
|
259
|
+
<ElementOrComponent
|
|
260
|
+
{ourProps}
|
|
261
|
+
{theirProps}
|
|
262
|
+
slots={slot}
|
|
263
|
+
defaultTag={DEFAULT_OPTIONS_TAG}
|
|
264
|
+
features={OptionsRenderFeatures}
|
|
265
|
+
visible={panelEnabled}
|
|
266
|
+
name="ListboxOptions"
|
|
267
|
+
bind:ref
|
|
268
|
+
/>
|
|
267
269
|
</Portal>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ElementType,
|
|
1
|
+
import type { ElementType, Props } from "../utils/types.js";
|
|
2
2
|
import { type PropsForFeatures } from "../utils/render.js";
|
|
3
3
|
import { type AnchorPropsWithSelection } from "../internal/floating.svelte.js";
|
|
4
4
|
declare const DEFAULT_OPTIONS_TAG: "div";
|
|
@@ -8,16 +8,32 @@ type OptionsRenderPropArg = {
|
|
|
8
8
|
type OptionsPropsWeControl = "aria-activedescendant" | "aria-labelledby" | "aria-multiselectable" | "aria-orientation" | "role" | "tabIndex";
|
|
9
9
|
declare let OptionsRenderFeatures: number;
|
|
10
10
|
export type ListboxOptionsProps<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG> = Props<TTag, OptionsRenderPropArg, OptionsPropsWeControl, {
|
|
11
|
+
id?: string;
|
|
11
12
|
anchor?: AnchorPropsWithSelection;
|
|
12
13
|
portal?: boolean;
|
|
13
14
|
modal?: boolean;
|
|
14
15
|
transition?: boolean;
|
|
15
|
-
ref?: HTMLElementType<TTag> | null;
|
|
16
16
|
} & PropsForFeatures<typeof OptionsRenderFeatures>>;
|
|
17
17
|
export type ListboxOptionsChildren = Snippet<[OptionsRenderPropArg]>;
|
|
18
18
|
import { type Snippet } from "svelte";
|
|
19
|
-
declare class __sveltets_Render<TTag extends ElementType> {
|
|
20
|
-
props():
|
|
19
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG> {
|
|
20
|
+
props(): {
|
|
21
|
+
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?: import("../utils/types.js").Children<OptionsRenderPropArg> | undefined;
|
|
24
|
+
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
|
+
} : {}) & {
|
|
28
|
+
id?: string;
|
|
29
|
+
anchor?: AnchorPropsWithSelection;
|
|
30
|
+
portal?: boolean;
|
|
31
|
+
modal?: boolean;
|
|
32
|
+
transition?: boolean;
|
|
33
|
+
} & {
|
|
34
|
+
static?: boolean | undefined;
|
|
35
|
+
unmount?: boolean | undefined;
|
|
36
|
+
};
|
|
21
37
|
events(): {} & {
|
|
22
38
|
[evt: string]: CustomEvent<any>;
|
|
23
39
|
};
|
|
@@ -26,14 +42,14 @@ declare class __sveltets_Render<TTag extends ElementType> {
|
|
|
26
42
|
exports(): {};
|
|
27
43
|
}
|
|
28
44
|
interface $$IsomorphicComponent {
|
|
29
|
-
new <TTag extends ElementType>(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']>> & {
|
|
45
|
+
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']>> & {
|
|
30
46
|
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
31
47
|
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
32
|
-
<TTag extends ElementType>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
48
|
+
<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
33
49
|
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
34
50
|
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
35
51
|
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
36
52
|
}
|
|
37
53
|
declare const ListboxOptions: $$IsomorphicComponent;
|
|
38
|
-
type ListboxOptions<TTag extends ElementType> = InstanceType<typeof ListboxOptions<TTag>>;
|
|
54
|
+
type ListboxOptions<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG> = InstanceType<typeof ListboxOptions<TTag>>;
|
|
39
55
|
export default ListboxOptions;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
<script lang="ts"
|
|
1
|
+
<script lang="ts" module>const DEFAULT_SELECTED_OPTION_TAG = "svelte:fragment";
|
|
2
2
|
</script>
|
|
3
3
|
|
|
4
|
-
<script lang="ts" generics="TTag extends ElementType
|
|
4
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG">import { useData, ValueMode } from "./Listbox.svelte";
|
|
5
5
|
import { setContext } from "svelte";
|
|
6
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte";
|
|
6
7
|
let {
|
|
7
|
-
|
|
8
|
+
ref = $bindable(),
|
|
8
9
|
options,
|
|
9
10
|
placeholder,
|
|
10
11
|
...theirProps
|
|
@@ -16,10 +17,17 @@ const shouldShowPlaceholder = $derived(
|
|
|
16
17
|
setContext("SelectedOptionContext", true);
|
|
17
18
|
</script>
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
{#snippet children()}
|
|
20
21
|
{#if placeholder && shouldShowPlaceholder}
|
|
21
|
-
|
|
22
|
+
{@render placeholder()}
|
|
22
23
|
{:else}
|
|
23
|
-
|
|
24
|
+
{@render options()}
|
|
24
25
|
{/if}
|
|
25
|
-
|
|
26
|
+
{/snippet}
|
|
27
|
+
|
|
28
|
+
<ElementOrComponent
|
|
29
|
+
theirProps={{ ...theirProps, children }}
|
|
30
|
+
defaultTag={DEFAULT_SELECTED_OPTION_TAG}
|
|
31
|
+
name="ListboxSelectedOption"
|
|
32
|
+
bind:ref
|
|
33
|
+
></ElementOrComponent>
|
|
@@ -1,30 +1,40 @@
|
|
|
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
|
-
declare class __sveltets_Render<TTag extends ElementType
|
|
11
|
-
props():
|
|
10
|
+
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> {
|
|
11
|
+
props(): {
|
|
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?: import("../utils/types.js").Children<SelectedOptionRenderPropArg> | undefined;
|
|
15
|
+
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;
|
|
18
|
+
} : {}) & {
|
|
19
|
+
options: Snippet;
|
|
20
|
+
placeholder?: Snippet;
|
|
21
|
+
};
|
|
12
22
|
events(): {} & {
|
|
13
23
|
[evt: string]: CustomEvent<any>;
|
|
14
24
|
};
|
|
15
25
|
slots(): {};
|
|
16
|
-
bindings(): "";
|
|
26
|
+
bindings(): "ref";
|
|
17
27
|
exports(): {};
|
|
18
28
|
}
|
|
19
29
|
interface $$IsomorphicComponent {
|
|
20
|
-
new <TTag extends ElementType
|
|
21
|
-
$$bindings?: ReturnType<__sveltets_Render<TTag
|
|
22
|
-
} & ReturnType<__sveltets_Render<TTag
|
|
23
|
-
<TTag extends ElementType
|
|
24
|
-
$$events?: ReturnType<__sveltets_Render<TTag
|
|
25
|
-
}): ReturnType<__sveltets_Render<TTag
|
|
26
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any
|
|
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
|
+
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
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']>;
|
|
36
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
37
|
}
|
|
28
38
|
declare const ListboxSelectedOption: $$IsomorphicComponent;
|
|
29
|
-
type ListboxSelectedOption<TTag extends ElementType
|
|
39
|
+
type ListboxSelectedOption<TTag extends ElementType = typeof DEFAULT_SELECTED_OPTION_TAG> = InstanceType<typeof ListboxSelectedOption<TTag>>;
|
|
30
40
|
export default ListboxSelectedOption;
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
compare(a: T, z: T): boolean;
|
|
66
|
+
isSelected(value: T): boolean;
|
|
67
|
+
optionsProps: {
|
|
68
|
+
static: boolean;
|
|
69
|
+
hold: boolean;
|
|
70
|
+
};
|
|
71
|
+
listElements: SvelteMap<string, HTMLElement | null>;
|
|
72
|
+
buttonElement: HTMLElement | null;
|
|
73
|
+
optionsElement: HTMLElement | null;
|
|
74
|
+
} & StateDefinition<T>;
|
|
75
|
+
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
|
+
let 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 === null) {
|
|
30
|
+
let 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
|
+
}
|