@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,232 +1,99 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
let err = new Error(`<${component} /> is missing a parent <Tab.Group /> component.`);
|
|
10
|
-
if (Error.captureStackTrace) Error.captureStackTrace(err, useData);
|
|
11
|
-
throw err;
|
|
12
|
-
}
|
|
13
|
-
return context;
|
|
14
|
-
}
|
|
15
|
-
export function useActions(component) {
|
|
16
|
-
const context = getContext("TabsActions");
|
|
17
|
-
if (!context) {
|
|
18
|
-
const err = new Error(`<${component} /> is missing a parent <Tab.Group /> component.`);
|
|
19
|
-
if (Error.captureStackTrace) Error.captureStackTrace(err, useActions);
|
|
20
|
-
throw err;
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { ElementType, Props } from "../utils/types.js"
|
|
3
|
+
import { sortByDomNode } from "../utils/focus-management.js"
|
|
4
|
+
import FocusSentinel from "../internal/FocusSentinel.svelte"
|
|
5
|
+
|
|
6
|
+
const DEFAULT_TABS_TAG = "div" as const
|
|
7
|
+
type TabsRenderPropArg = {
|
|
8
|
+
selectedIndex: number
|
|
21
9
|
}
|
|
22
|
-
|
|
23
|
-
|
|
10
|
+
type TabsPropsWeControl = never
|
|
11
|
+
|
|
12
|
+
export type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<
|
|
13
|
+
TTag,
|
|
14
|
+
TabsRenderPropArg,
|
|
15
|
+
TabsPropsWeControl,
|
|
16
|
+
{
|
|
17
|
+
defaultIndex?: number
|
|
18
|
+
onchange?: (index: number) => void
|
|
19
|
+
selectedIndex?: number
|
|
20
|
+
vertical?: boolean
|
|
21
|
+
manual?: boolean
|
|
22
|
+
}
|
|
23
|
+
>
|
|
24
24
|
</script>
|
|
25
25
|
|
|
26
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TABS_TAG">
|
|
27
|
-
import
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
get
|
|
43
|
-
return
|
|
26
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TABS_TAG">
|
|
27
|
+
import StableCollection from "../utils/StableCollection.svelte"
|
|
28
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
29
|
+
import { createTabContext } from "./context.svelte.js"
|
|
30
|
+
import { untrack } from "svelte"
|
|
31
|
+
|
|
32
|
+
let {
|
|
33
|
+
ref = $bindable(),
|
|
34
|
+
defaultIndex = 0,
|
|
35
|
+
vertical = false,
|
|
36
|
+
manual = false,
|
|
37
|
+
onchange,
|
|
38
|
+
selectedIndex = undefined,
|
|
39
|
+
...theirProps
|
|
40
|
+
}: { as?: TTag } & TabGroupProps<TTag> = $props()
|
|
41
|
+
const _state = createTabContext({
|
|
42
|
+
get vertical() {
|
|
43
|
+
return vertical
|
|
44
44
|
},
|
|
45
|
-
get
|
|
46
|
-
return
|
|
45
|
+
get manual() {
|
|
46
|
+
return manual
|
|
47
47
|
},
|
|
48
|
-
get
|
|
49
|
-
return
|
|
48
|
+
get selectedIndex() {
|
|
49
|
+
return selectedIndex
|
|
50
50
|
},
|
|
51
|
-
get
|
|
52
|
-
return
|
|
51
|
+
get defaultIndex() {
|
|
52
|
+
return defaultIndex
|
|
53
53
|
},
|
|
54
|
-
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
let panels = sortByDomNode(_state2.panels, (panel) => panel.current ?? null);
|
|
58
|
-
let focusableTabs = tabs.filter((tab) => !tab?.current?.hasAttribute("disabled"));
|
|
59
|
-
let nextState = { ..._state2, tabs, panels };
|
|
60
|
-
if (
|
|
61
|
-
// Underflow
|
|
62
|
-
index < 0 || // Overflow
|
|
63
|
-
index > tabs.length - 1
|
|
64
|
-
) {
|
|
65
|
-
let direction = match(Math.sign(index - _state2.selectedIndex), {
|
|
66
|
-
[-1 /* Less */]: () => 1 /* Backwards */,
|
|
67
|
-
[0 /* Equal */]: () => {
|
|
68
|
-
return match(Math.sign(index), {
|
|
69
|
-
[-1 /* Less */]: () => 0 /* Forwards */,
|
|
70
|
-
[0 /* Equal */]: () => 0 /* Forwards */,
|
|
71
|
-
[1 /* Greater */]: () => 1 /* Backwards */
|
|
72
|
-
});
|
|
73
|
-
},
|
|
74
|
-
[1 /* Greater */]: () => 0 /* Forwards */
|
|
75
|
-
});
|
|
76
|
-
if (focusableTabs.length === 0) {
|
|
77
|
-
_state2 = nextState;
|
|
78
|
-
return _state2;
|
|
79
|
-
}
|
|
80
|
-
let nextSelectedIndex = match(direction, {
|
|
81
|
-
[0 /* Forwards */]: () => tabs.findIndex((tab) => tab === focusableTabs[0]),
|
|
82
|
-
[1 /* Backwards */]: () => tabs.findIndex((tab) => tab === focusableTabs[focusableTabs.length - 1])
|
|
83
|
-
});
|
|
84
|
-
_state2 = {
|
|
85
|
-
...nextState,
|
|
86
|
-
selectedIndex: nextSelectedIndex === -1 ? _state2.selectedIndex : nextSelectedIndex
|
|
87
|
-
};
|
|
88
|
-
return _state2;
|
|
89
|
-
}
|
|
90
|
-
let before = tabs.slice(0, index);
|
|
91
|
-
let after = tabs.slice(index);
|
|
92
|
-
let next = [...after, ...before].find((tab) => focusableTabs.some((_tab) => _tab === tab));
|
|
93
|
-
if (!next) {
|
|
94
|
-
_state2 = nextState;
|
|
95
|
-
return _state2;
|
|
54
|
+
change: (index: number) => {
|
|
55
|
+
if (realSelectedIndex !== index) {
|
|
56
|
+
onchange?.(index)
|
|
96
57
|
}
|
|
97
|
-
|
|
98
|
-
if (
|
|
99
|
-
|
|
100
|
-
return _state2;
|
|
101
|
-
},
|
|
102
|
-
registerTab(tab) {
|
|
103
|
-
if (_state2.tabs.some((_tab) => _tab === tab)) return _state2;
|
|
104
|
-
_state2.tabs = sortByDomNode([..._state2.tabs, tab], (tab2) => tab2.current ?? null);
|
|
105
|
-
let activeTab = _state2.tabs[_state2.selectedIndex];
|
|
106
|
-
if (!_state2.info.isControlled) {
|
|
107
|
-
const selectedIndex2 = _state2.tabs.findIndex((tab2) => tab2 === activeTab);
|
|
108
|
-
if (selectedIndex2 !== _state2.selectedIndex) _state2.selectedIndex = selectedIndex2;
|
|
58
|
+
|
|
59
|
+
if (!isControlled) {
|
|
60
|
+
_state.selectedIndex = index
|
|
109
61
|
}
|
|
110
|
-
return _state2;
|
|
111
|
-
},
|
|
112
|
-
unregisterTab(tab) {
|
|
113
|
-
_state2.tabs = _state2.tabs.filter((_tab) => _tab !== tab);
|
|
114
|
-
return _state2;
|
|
115
62
|
},
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
63
|
+
})
|
|
64
|
+
const isControlled = $derived(_state.info.isControlled)
|
|
65
|
+
const realSelectedIndex = $derived(isControlled ? selectedIndex! : _state.selectedIndex)
|
|
66
|
+
|
|
67
|
+
const slot = $derived({
|
|
68
|
+
selectedIndex: _state.selectedIndex,
|
|
69
|
+
} satisfies TabsRenderPropArg)
|
|
70
|
+
const stableTabs = $derived(_state.tabs)
|
|
71
|
+
|
|
72
|
+
$effect(() => {
|
|
73
|
+
const newSelectedIndex = selectedIndex ?? defaultIndex
|
|
74
|
+
untrack(() => (_state.selectedIndex = newSelectedIndex))
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
$effect(() => {
|
|
78
|
+
if (realSelectedIndex === undefined) return
|
|
79
|
+
if (_state.tabs.length <= 0) return
|
|
80
|
+
|
|
81
|
+
// TODO: Figure out a way to detect this without the slow sort on every render. Might be fine
|
|
82
|
+
// unless you have a lot of tabs.
|
|
83
|
+
let sorted = sortByDomNode(_state.tabs, (tab) => tab.current ?? null)
|
|
84
|
+
let didOrderChange = sorted.some((tab, i) => _state.tabs[i] !== tab)
|
|
85
|
+
|
|
86
|
+
if (didOrderChange) {
|
|
87
|
+
_state.change(sorted.findIndex((tab) => tab === _state.tabs[realSelectedIndex]))
|
|
124
88
|
}
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
let {
|
|
128
|
-
ref = $bindable(),
|
|
129
|
-
defaultIndex = 0,
|
|
130
|
-
vertical = false,
|
|
131
|
-
manual = false,
|
|
132
|
-
onchange,
|
|
133
|
-
selectedIndex = void 0,
|
|
134
|
-
...theirProps
|
|
135
|
-
} = $props();
|
|
136
|
-
const orientation = $derived(vertical ? "vertical" : "horizontal");
|
|
137
|
-
const activation = $derived(manual ? "manual" : "auto");
|
|
138
|
-
const isControlled = $derived(selectedIndex !== void 0);
|
|
139
|
-
const _state = stateReducer({
|
|
140
|
-
info: { isControlled: selectedIndex !== void 0 },
|
|
141
|
-
selectedIndex: selectedIndex ?? defaultIndex,
|
|
142
|
-
tabs: [],
|
|
143
|
-
panels: []
|
|
144
|
-
});
|
|
145
|
-
$effect(() => {
|
|
146
|
-
untrack(() => _state.info).isControlled = isControlled;
|
|
147
|
-
});
|
|
148
|
-
const slot = $derived({
|
|
149
|
-
selectedIndex: _state.selectedIndex
|
|
150
|
-
});
|
|
151
|
-
const stableTabs = $derived(_state.tabs);
|
|
152
|
-
const tabsData = {
|
|
153
|
-
get orientation() {
|
|
154
|
-
return orientation;
|
|
155
|
-
},
|
|
156
|
-
get activation() {
|
|
157
|
-
return activation;
|
|
158
|
-
},
|
|
159
|
-
get info() {
|
|
160
|
-
return _state.info;
|
|
161
|
-
},
|
|
162
|
-
get selectedIndex() {
|
|
163
|
-
return _state.selectedIndex;
|
|
164
|
-
},
|
|
165
|
-
get tabs() {
|
|
166
|
-
return _state.tabs;
|
|
167
|
-
},
|
|
168
|
-
get panels() {
|
|
169
|
-
return _state.panels;
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
const realSelectedIndex = $derived(isControlled ? selectedIndex : _state.selectedIndex);
|
|
173
|
-
const registerTab = (tab) => {
|
|
174
|
-
_state.registerTab(tab);
|
|
175
|
-
return () => _state.unregisterTab(tab);
|
|
176
|
-
};
|
|
177
|
-
const registerPanel = (panel) => {
|
|
178
|
-
_state.registerPanel(panel);
|
|
179
|
-
return () => _state.unregisterPanel(panel);
|
|
180
|
-
};
|
|
181
|
-
const change = (index) => {
|
|
182
|
-
if (realSelectedIndex !== index) {
|
|
183
|
-
onchange?.(index);
|
|
184
|
-
}
|
|
185
|
-
if (!isControlled) {
|
|
186
|
-
_state.setSelectedIndex(index);
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
setContext("TabsActions", { registerTab, registerPanel, change });
|
|
190
|
-
setContext("TabsData", {
|
|
191
|
-
get orientation() {
|
|
192
|
-
return orientation;
|
|
193
|
-
},
|
|
194
|
-
get activation() {
|
|
195
|
-
return activation;
|
|
196
|
-
},
|
|
197
|
-
get info() {
|
|
198
|
-
return _state.info;
|
|
199
|
-
},
|
|
200
|
-
get selectedIndex() {
|
|
201
|
-
return _state.selectedIndex;
|
|
202
|
-
},
|
|
203
|
-
get tabs() {
|
|
204
|
-
return _state.tabs;
|
|
205
|
-
},
|
|
206
|
-
get panels() {
|
|
207
|
-
return _state.panels;
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
$effect(() => {
|
|
211
|
-
const newSelectedIndex = selectedIndex ?? defaultIndex;
|
|
212
|
-
untrack(() => _state.setSelectedIndex(newSelectedIndex));
|
|
213
|
-
});
|
|
214
|
-
$effect(() => {
|
|
215
|
-
if (realSelectedIndex === void 0) return;
|
|
216
|
-
if (_state.tabs.length <= 0) return;
|
|
217
|
-
let sorted = sortByDomNode(_state.tabs, (tab) => tab.current ?? null);
|
|
218
|
-
let didOrderChange = sorted.some((tab, i) => _state.tabs[i] !== tab);
|
|
219
|
-
if (didOrderChange) {
|
|
220
|
-
change(sorted.findIndex((tab) => tab === _state.tabs[realSelectedIndex]));
|
|
221
|
-
}
|
|
222
|
-
});
|
|
89
|
+
})
|
|
223
90
|
</script>
|
|
224
91
|
|
|
225
92
|
<StableCollection>
|
|
226
|
-
{#if
|
|
93
|
+
{#if _state.tabs.length <= 0}
|
|
227
94
|
<FocusSentinel
|
|
228
95
|
onfocus={() => {
|
|
229
|
-
for (
|
|
96
|
+
for (const tab of stableTabs) {
|
|
230
97
|
if (tab?.current?.tabIndex === 0) {
|
|
231
98
|
tab?.current?.focus()
|
|
232
99
|
return true
|
|
@@ -237,5 +104,5 @@ $effect(() => {
|
|
|
237
104
|
}}
|
|
238
105
|
/>
|
|
239
106
|
{/if}
|
|
240
|
-
<ElementOrComponent {theirProps} defaultTag={DEFAULT_TABS_TAG} name="TabGroup" bind:ref />
|
|
107
|
+
<ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_TABS_TAG} name="TabGroup" bind:ref />
|
|
241
108
|
</StableCollection>
|
|
@@ -11,34 +11,17 @@ export type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> =
|
|
|
11
11
|
vertical?: boolean;
|
|
12
12
|
manual?: boolean;
|
|
13
13
|
}>;
|
|
14
|
-
interface StateDefinition {
|
|
15
|
-
info: {
|
|
16
|
-
isControlled: boolean;
|
|
17
|
-
};
|
|
18
|
-
selectedIndex: number;
|
|
19
|
-
tabs: MutableRefObject<HTMLElement | undefined>[];
|
|
20
|
-
panels: MutableRefObject<HTMLElement | undefined>[];
|
|
21
|
-
}
|
|
22
|
-
type TabsDataContext = StateDefinition & {
|
|
23
|
-
orientation: "horizontal" | "vertical";
|
|
24
|
-
activation: "manual" | "auto";
|
|
25
|
-
};
|
|
26
|
-
export declare function useData(component: string): TabsDataContext;
|
|
27
|
-
type TabsActionsContext = {
|
|
28
|
-
registerTab: (tab: MutableRefObject<HTMLElement | undefined>) => () => void;
|
|
29
|
-
registerPanel: (panel: MutableRefObject<HTMLElement | undefined>) => () => void;
|
|
30
|
-
change: (index: number) => void;
|
|
31
|
-
};
|
|
32
|
-
export declare function useActions(component: string): TabsActionsContext;
|
|
33
|
-
import type { MutableRefObject } from "../utils/ref.svelte.js";
|
|
34
14
|
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_TABS_TAG> {
|
|
35
15
|
props(): {
|
|
36
16
|
as?: TTag | undefined;
|
|
37
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "
|
|
38
|
-
children?: import("svelte").Snippet<[
|
|
17
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "class") | "onchange" | "manual" | "vertical" | "selectedIndex" | "defaultIndex"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
18
|
+
children?: import("svelte").Snippet<[{
|
|
19
|
+
slot: TabsRenderPropArg;
|
|
20
|
+
props: Record<string, any>;
|
|
21
|
+
}]> | undefined;
|
|
39
22
|
ref?: HTMLElement;
|
|
40
|
-
} & (true extends (import("
|
|
41
|
-
class?:
|
|
23
|
+
} & (true extends (import("svelte/elements.js").SvelteHTMLElements[TTag] extends infer T_1 ? T_1 extends import("svelte/elements.js").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) ? {
|
|
24
|
+
class?: string | ((bag: TabsRenderPropArg) => string) | null | undefined;
|
|
42
25
|
} : {}) & {
|
|
43
26
|
defaultIndex?: number;
|
|
44
27
|
onchange?: (index: number) => void;
|
package/dist/tabs/TabList.svelte
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { ElementType, Props } from "../utils/types.js"
|
|
3
|
+
|
|
4
|
+
const DEFAULT_LIST_TAG = "div" as const
|
|
5
|
+
type ListRenderPropArg = {
|
|
6
|
+
selectedIndex: number
|
|
7
|
+
}
|
|
8
|
+
type ListPropsWeControl = "aria-orientation" | "role"
|
|
9
|
+
|
|
10
|
+
export type TabListProps<TTag extends ElementType = typeof DEFAULT_LIST_TAG> = Props<
|
|
11
|
+
TTag,
|
|
12
|
+
ListRenderPropArg,
|
|
13
|
+
ListPropsWeControl,
|
|
14
|
+
{
|
|
15
|
+
//
|
|
16
|
+
}
|
|
17
|
+
>
|
|
2
18
|
</script>
|
|
3
19
|
|
|
4
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LIST_TAG">
|
|
5
|
-
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
})
|
|
20
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LIST_TAG">
|
|
21
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
22
|
+
import { useTabs } from "./context.svelte.js"
|
|
23
|
+
|
|
24
|
+
const context = useTabs("TabList")
|
|
25
|
+
const { orientation, selectedIndex } = $derived(context)
|
|
26
|
+
|
|
27
|
+
const slot = $derived({ selectedIndex } satisfies ListRenderPropArg)
|
|
28
|
+
|
|
29
|
+
let { ref = $bindable(), ...theirProps }: { as?: TTag } & TabListProps<TTag> = $props()
|
|
30
|
+
const ourProps = $derived({
|
|
31
|
+
role: "tablist",
|
|
32
|
+
"aria-orientation": orientation,
|
|
33
|
+
})
|
|
14
34
|
</script>
|
|
15
35
|
|
|
16
36
|
<ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_LIST_TAG} name="TabList" bind:ref />
|
|
@@ -8,11 +8,14 @@ export type TabListProps<TTag extends ElementType = typeof DEFAULT_LIST_TAG> = P
|
|
|
8
8
|
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_LIST_TAG> {
|
|
9
9
|
props(): {
|
|
10
10
|
as?: TTag | undefined;
|
|
11
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "
|
|
12
|
-
children?: import("svelte").Snippet<[
|
|
11
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "class") | ListPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
12
|
+
children?: import("svelte").Snippet<[{
|
|
13
|
+
slot: ListRenderPropArg;
|
|
14
|
+
props: Record<string, any>;
|
|
15
|
+
}]> | undefined;
|
|
13
16
|
ref?: HTMLElement;
|
|
14
|
-
} & (true extends (import("
|
|
15
|
-
class?:
|
|
17
|
+
} & (true extends (import("svelte/elements.js").SvelteHTMLElements[TTag] extends infer T_1 ? T_1 extends import("svelte/elements.js").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) ? {
|
|
18
|
+
class?: string | ((bag: ListRenderPropArg) => string) | null | undefined;
|
|
16
19
|
} : {});
|
|
17
20
|
events(): {} & {
|
|
18
21
|
[evt: string]: CustomEvent<any>;
|
|
@@ -1,49 +1,73 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { ElementType, Props } from "../utils/types.js"
|
|
3
|
+
|
|
4
|
+
const DEFAULT_PANEL_TAG = "div" as const
|
|
5
|
+
type PanelRenderPropArg = {
|
|
6
|
+
selected: boolean
|
|
7
|
+
focus: boolean
|
|
8
|
+
}
|
|
9
|
+
type PanelPropsWeControl = "role" | "aria-labelledby"
|
|
10
|
+
const PanelRenderFeatures = RenderFeatures.RenderStrategy | RenderFeatures.Static
|
|
11
|
+
|
|
12
|
+
export type TabPanelProps<TTag extends ElementType = typeof DEFAULT_PANEL_TAG> = Props<
|
|
13
|
+
TTag,
|
|
14
|
+
PanelRenderPropArg,
|
|
15
|
+
PanelPropsWeControl,
|
|
16
|
+
PropsForFeatures<typeof PanelRenderFeatures> & { id?: string; tabIndex?: number }
|
|
17
|
+
>
|
|
3
18
|
</script>
|
|
4
19
|
|
|
5
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_PANEL_TAG">
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { useStableCollectionIndex } from "../utils/StableCollection.svelte"
|
|
9
|
-
import { useFocusRing } from "../hooks/use-focus-ring.svelte.js"
|
|
10
|
-
import Hidden from "../internal/Hidden.svelte"
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
20
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_PANEL_TAG">
|
|
21
|
+
import { useId } from "../hooks/use-id.js"
|
|
22
|
+
import { mergeProps, RenderFeatures, type PropsForFeatures } from "../utils/render.js"
|
|
23
|
+
import { useStableCollectionIndex } from "../utils/StableCollection.svelte"
|
|
24
|
+
import { useFocusRing } from "../hooks/use-focus-ring.svelte.js"
|
|
25
|
+
import Hidden from "../internal/Hidden.svelte"
|
|
26
|
+
import type { MutableRefObject } from "../utils/ref.svelte.js"
|
|
27
|
+
import { onMount } from "svelte"
|
|
28
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
29
|
+
import { useTabs } from "./context.svelte.js"
|
|
30
|
+
|
|
31
|
+
const internalId = useId()
|
|
32
|
+
let {
|
|
33
|
+
ref = $bindable(),
|
|
34
|
+
id = `headlessui-tabs-panel-${internalId}`,
|
|
35
|
+
tabIndex = 0,
|
|
36
|
+
...theirProps
|
|
37
|
+
}: { as?: TTag } & TabPanelProps<TTag> = $props()
|
|
38
|
+
const context = useTabs("TabPanel")
|
|
39
|
+
const { selectedIndex, tabs, panels, registerPanel } = $derived(context)
|
|
40
|
+
|
|
41
|
+
const panelRef = $derived<MutableRefObject<HTMLElement | undefined>>({ current: ref })
|
|
42
|
+
|
|
43
|
+
onMount(() => registerPanel(panelRef))
|
|
44
|
+
|
|
45
|
+
const mySSRIndex = useStableCollectionIndex("panels")
|
|
46
|
+
|
|
47
|
+
const myIndex = $derived.by(() => {
|
|
48
|
+
const index = tabs.findIndex((panel) => panel === panelRef)
|
|
49
|
+
return index === -1 ? mySSRIndex : index
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const selected = $derived(myIndex === selectedIndex)
|
|
53
|
+
|
|
54
|
+
const { isFocusVisible: focus, focusProps } = $derived(useFocusRing())
|
|
55
|
+
const slot = $derived({
|
|
56
|
+
selected,
|
|
57
|
+
focus,
|
|
58
|
+
} satisfies PanelRenderPropArg)
|
|
59
|
+
|
|
60
|
+
const ourProps = $derived(
|
|
61
|
+
mergeProps(
|
|
62
|
+
{
|
|
63
|
+
id,
|
|
64
|
+
role: "tabpanel",
|
|
65
|
+
"aria-labelledby": tabs[myIndex]?.current?.id,
|
|
66
|
+
tabIndex: selected ? 0 : -1,
|
|
67
|
+
},
|
|
68
|
+
focusProps
|
|
69
|
+
)
|
|
45
70
|
)
|
|
46
|
-
);
|
|
47
71
|
</script>
|
|
48
72
|
|
|
49
73
|
{#if !selected && (theirProps.unmount ?? true) && !(theirProps.static ?? false)}
|
|
@@ -14,11 +14,14 @@ import { type PropsForFeatures } from "../utils/render.js";
|
|
|
14
14
|
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_PANEL_TAG> {
|
|
15
15
|
props(): {
|
|
16
16
|
as?: TTag | undefined;
|
|
17
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "
|
|
18
|
-
children?: import("svelte").Snippet<[
|
|
17
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "class") | "unmount" | "static" | "id" | "tabIndex" | PanelPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
18
|
+
children?: import("svelte").Snippet<[{
|
|
19
|
+
slot: PanelRenderPropArg;
|
|
20
|
+
props: Record<string, any>;
|
|
21
|
+
}]> | undefined;
|
|
19
22
|
ref?: HTMLElement;
|
|
20
|
-
} & (true extends (import("
|
|
21
|
-
class?:
|
|
23
|
+
} & (true extends (import("svelte/elements.js").SvelteHTMLElements[TTag] extends infer T_1 ? T_1 extends import("svelte/elements.js").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) ? {
|
|
24
|
+
class?: string | ((bag: PanelRenderPropArg) => string) | null | undefined;
|
|
22
25
|
} : {}) & {
|
|
23
26
|
static?: boolean | undefined;
|
|
24
27
|
unmount?: boolean | undefined;
|
|
@@ -1,12 +1,23 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
3
|
+
import type { ElementType, Props } from "../utils/types.js"
|
|
4
|
+
import { useTabs } from "./context.svelte.js"
|
|
5
|
+
|
|
6
|
+
let DEFAULT_PANELS_TAG = "div" as const
|
|
7
|
+
type PanelsRenderPropArg = {
|
|
8
|
+
selectedIndex: number
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type TabPanelsProps<TTag extends ElementType = typeof DEFAULT_PANELS_TAG> = Props<TTag, PanelsRenderPropArg>
|
|
4
12
|
</script>
|
|
5
13
|
|
|
6
|
-
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_PANELS_TAG">
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
14
|
+
<script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_PANELS_TAG">
|
|
15
|
+
const context = useTabs("TabPanels")
|
|
16
|
+
const { selectedIndex } = $derived(context)
|
|
17
|
+
|
|
18
|
+
const slot = $derived({ selectedIndex } satisfies PanelsRenderPropArg)
|
|
19
|
+
|
|
20
|
+
let { ref = $bindable(), ...theirProps }: { as?: TTag } & TabPanelsProps<TTag> = $props()
|
|
10
21
|
</script>
|
|
11
22
|
|
|
12
23
|
<ElementOrComponent {theirProps} {slot} defaultTag={DEFAULT_PANELS_TAG} name="TabPanel" bind:ref />
|
|
@@ -7,11 +7,14 @@ export type TabPanelsProps<TTag extends ElementType = typeof DEFAULT_PANELS_TAG>
|
|
|
7
7
|
declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_PANELS_TAG> {
|
|
8
8
|
props(): {
|
|
9
9
|
as?: TTag | undefined;
|
|
10
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, "as" | "children" | "
|
|
11
|
-
children?: import("svelte").Snippet<[
|
|
10
|
+
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, "as" | "children" | "class"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
11
|
+
children?: import("svelte").Snippet<[{
|
|
12
|
+
slot: PanelsRenderPropArg;
|
|
13
|
+
props: Record<string, any>;
|
|
14
|
+
}]> | undefined;
|
|
12
15
|
ref?: HTMLElement;
|
|
13
|
-
} & (true extends (import("
|
|
14
|
-
class?:
|
|
16
|
+
} & (true extends (import("svelte/elements.js").SvelteHTMLElements[TTag] extends infer T_1 ? T_1 extends import("svelte/elements.js").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) ? {
|
|
17
|
+
class?: string | ((bag: PanelsRenderPropArg) => string) | null | undefined;
|
|
15
18
|
} : {});
|
|
16
19
|
events(): {} & {
|
|
17
20
|
[evt: string]: CustomEvent<any>;
|