@pzerelles/headlessui-svelte 2.1.2-next.6 → 2.1.2-next.61
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 +16 -19
- package/dist/button/Button.svelte.d.ts +8 -36
- package/dist/button/index.d.ts +1 -1
- package/dist/button/index.js +1 -1
- package/dist/checkbox/Checkbox.svelte +31 -27
- package/dist/checkbox/Checkbox.svelte.d.ts +17 -38
- package/dist/checkbox/index.d.ts +1 -1
- package/dist/checkbox/index.js +1 -1
- package/dist/close-button/CloseButton.svelte +4 -7
- package/dist/close-button/CloseButton.svelte.d.ts +3 -46
- package/dist/close-button/index.d.ts +1 -0
- package/dist/close-button/index.js +1 -0
- package/dist/data-interactive/DataInteractive.svelte +6 -22
- package/dist/data-interactive/DataInteractive.svelte.d.ts +9 -34
- package/dist/data-interactive/index.d.ts +1 -1
- package/dist/data-interactive/index.js +1 -1
- package/dist/description/Description.svelte +29 -24
- package/dist/description/Description.svelte.d.ts +9 -30
- package/dist/description/context.svelte.js +14 -16
- package/dist/description/index.d.ts +1 -1
- package/dist/dialog/Dialog.svelte +25 -30
- package/dist/dialog/Dialog.svelte.d.ts +7 -45
- package/dist/dialog/DialogBackdrop.svelte +11 -14
- package/dist/dialog/DialogBackdrop.svelte.d.ts +8 -33
- package/dist/dialog/DialogPanel.svelte +30 -19
- package/dist/dialog/DialogPanel.svelte.d.ts +8 -34
- package/dist/dialog/DialogTitle.svelte +17 -8
- package/dist/dialog/DialogTitle.svelte.d.ts +9 -30
- package/dist/dialog/InternalDialog.svelte +38 -34
- package/dist/dialog/InternalDialog.svelte.d.ts +3 -41
- package/dist/dialog/context.svelte.js +2 -2
- package/dist/dialog/index.d.ts +4 -4
- package/dist/dialog/index.js +4 -4
- package/dist/disclosure/Disclosure.svelte +61 -0
- package/dist/disclosure/Disclosure.svelte.d.ts +14 -0
- package/dist/disclosure/DisclosureButton.svelte +191 -0
- package/dist/disclosure/DisclosureButton.svelte.d.ts +19 -0
- package/dist/disclosure/DisclosurePanel.svelte +99 -0
- package/dist/disclosure/DisclosurePanel.svelte.d.ts +16 -0
- package/dist/disclosure/context.svelte.d.ts +32 -0
- package/dist/disclosure/context.svelte.js +94 -0
- package/dist/disclosure/index.d.ts +3 -0
- package/dist/disclosure/index.js +3 -0
- package/dist/field/Field.svelte +27 -26
- package/dist/field/Field.svelte.d.ts +7 -34
- package/dist/field/index.d.ts +1 -1
- package/dist/fieldset/Fieldset.svelte +21 -20
- package/dist/fieldset/Fieldset.svelte.d.ts +8 -35
- package/dist/fieldset/index.d.ts +1 -1
- package/dist/focus-trap/FocusTrap.svelte +29 -36
- package/dist/focus-trap/FocusTrap.svelte.d.ts +8 -38
- package/dist/hooks/use-controllable.svelte.js +3 -2
- 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-element-size.svelte.js +1 -1
- 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-focus-ring.svelte.js +1 -1
- package/dist/hooks/use-inert-others.svelte.js +10 -10
- package/dist/hooks/use-is-top-layer.svelte.js +2 -2
- package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
- package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
- package/dist/hooks/use-root-containers.svelte.js +7 -6
- package/dist/hooks/use-tab-direction.svelte.js +1 -1
- package/dist/hooks/use-transition.svelte.d.ts +1 -0
- package/dist/hooks/use-transition.svelte.js +32 -7
- package/dist/index.d.ts +11 -2
- package/dist/index.js +11 -2
- package/dist/input/Input.svelte +28 -21
- package/dist/input/Input.svelte.d.ts +16 -33
- package/dist/input/index.d.ts +1 -1
- package/dist/input/index.js +1 -1
- package/dist/internal/FloatingProvider.svelte +17 -0
- package/dist/internal/FloatingProvider.svelte.d.ts +8 -0
- package/dist/internal/FocusSentinel.svelte +33 -32
- package/dist/internal/FocusSentinel.svelte.d.ts +4 -18
- package/dist/internal/ForcePortalRoot.svelte.d.ts +4 -18
- package/dist/internal/FormFields.svelte +18 -13
- package/dist/internal/FormFields.svelte.d.ts +4 -18
- package/dist/internal/FormFieldsProvider.svelte +17 -0
- package/dist/internal/FormFieldsProvider.svelte.d.ts +7 -0
- package/dist/internal/FormResolver.svelte +6 -2
- package/dist/internal/FormResolver.svelte.d.ts +4 -18
- package/dist/internal/Hidden.svelte +10 -10
- package/dist/internal/Hidden.svelte.d.ts +6 -33
- package/dist/internal/MainTreeProvider.svelte +2 -2
- package/dist/internal/MainTreeProvider.svelte.d.ts +4 -18
- package/dist/internal/Portal.svelte.d.ts +4 -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 +47 -23
- 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/internal/frozen.svelte.js +1 -1
- package/dist/label/Label.svelte +15 -11
- package/dist/label/Label.svelte.d.ts +8 -33
- package/dist/label/context.svelte.js +1 -1
- package/dist/label/index.d.ts +1 -1
- package/dist/legend/Legend.svelte +22 -15
- package/dist/legend/Legend.svelte.d.ts +10 -34
- package/dist/listbox/Listbox.svelte +79 -151
- package/dist/listbox/Listbox.svelte.d.ts +16 -91
- package/dist/listbox/ListboxButton.svelte +31 -29
- package/dist/listbox/ListboxButton.svelte.d.ts +8 -38
- package/dist/listbox/ListboxOption.svelte +40 -27
- package/dist/listbox/ListboxOption.svelte.d.ts +16 -32
- package/dist/listbox/ListboxOptions.svelte +126 -72
- package/dist/listbox/ListboxOptions.svelte.d.ts +8 -43
- package/dist/listbox/ListboxSelectedOption.svelte +24 -26
- package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -39
- package/dist/listbox/context.svelte.d.ts +76 -0
- package/dist/listbox/context.svelte.js +36 -0
- package/dist/listbox/index.d.ts +5 -5
- package/dist/listbox/index.js +4 -4
- package/dist/menu/Menu.svelte +22 -266
- package/dist/menu/Menu.svelte.d.ts +7 -37
- package/dist/menu/MenuButton.svelte +29 -24
- package/dist/menu/MenuButton.svelte.d.ts +8 -39
- package/dist/menu/MenuHeading.svelte +12 -16
- package/dist/menu/MenuHeading.svelte.d.ts +7 -36
- package/dist/menu/MenuItem.svelte +18 -23
- package/dist/menu/MenuItem.svelte.d.ts +9 -39
- package/dist/menu/MenuItems.svelte +33 -34
- package/dist/menu/MenuItems.svelte.d.ts +8 -43
- package/dist/menu/MenuSection.svelte +9 -12
- package/dist/menu/MenuSection.svelte.d.ts +7 -33
- package/dist/menu/MenuSeparator.svelte +9 -12
- package/dist/menu/MenuSeparator.svelte.d.ts +7 -33
- 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/menu/index.js +3 -3
- package/dist/popover/Popover.svelte +231 -0
- package/dist/popover/Popover.svelte.d.ts +15 -0
- package/dist/popover/PopoverBackdrop.svelte +83 -0
- package/dist/popover/PopoverBackdrop.svelte.d.ts +17 -0
- package/dist/popover/PopoverButton.svelte +324 -0
- package/dist/popover/PopoverButton.svelte.d.ts +21 -0
- package/dist/popover/PopoverGroup.svelte +66 -0
- package/dist/popover/PopoverGroup.svelte.d.ts +9 -0
- package/dist/popover/PopoverPanel.svelte +359 -0
- package/dist/popover/PopoverPanel.svelte.d.ts +22 -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 +18 -19
- package/dist/portal/InternalPortal.svelte.d.ts +7 -34
- package/dist/portal/Portal.svelte +7 -6
- package/dist/portal/Portal.svelte.d.ts +3 -22
- package/dist/portal/PortalGroup.svelte +6 -14
- package/dist/portal/PortalGroup.svelte.d.ts +5 -34
- package/dist/portal/PortalWrapper.svelte +10 -0
- package/dist/portal/PortalWrapper.svelte.d.ts +9 -0
- package/dist/radio-group/Radio.svelte +142 -0
- package/dist/radio-group/Radio.svelte.d.ts +35 -0
- package/dist/radio-group/RadioGroup.svelte +222 -0
- package/dist/radio-group/RadioGroup.svelte.d.ts +34 -0
- package/dist/radio-group/RadioOption.svelte +145 -0
- package/dist/radio-group/RadioOption.svelte.d.ts +37 -0
- package/dist/radio-group/contest.svelte.d.ts +30 -0
- package/dist/radio-group/contest.svelte.js +40 -0
- package/dist/radio-group/index.d.ts +3 -0
- package/dist/radio-group/index.js +3 -0
- package/dist/select/Select.svelte +112 -0
- package/dist/select/Select.svelte.d.ts +21 -0
- package/dist/select/index.d.ts +1 -0
- package/dist/select/index.js +1 -0
- package/dist/switch/Switch.svelte +27 -28
- package/dist/switch/Switch.svelte.d.ts +9 -42
- package/dist/switch/SwitchGroup.svelte +5 -5
- package/dist/switch/SwitchGroup.svelte.d.ts +8 -30
- package/dist/switch/index.d.ts +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/tabs/Tab.svelte +28 -31
- package/dist/tabs/Tab.svelte.d.ts +8 -36
- package/dist/tabs/TabGroup.svelte +42 -264
- package/dist/tabs/TabGroup.svelte.d.ts +7 -57
- package/dist/tabs/TabList.svelte +13 -16
- package/dist/tabs/TabList.svelte.d.ts +8 -31
- package/dist/tabs/TabPanel.svelte +20 -20
- package/dist/tabs/TabPanel.svelte.d.ts +8 -38
- package/dist/tabs/TabPanels.svelte +11 -9
- package/dist/tabs/TabPanels.svelte.d.ts +8 -30
- package/dist/tabs/context.svelte.d.ts +31 -0
- package/dist/tabs/context.svelte.js +134 -0
- package/dist/tabs/index.d.ts +5 -5
- package/dist/tabs/index.js +4 -4
- package/dist/textarea/Textarea.svelte +24 -20
- package/dist/textarea/Textarea.svelte.d.ts +17 -29
- package/dist/textarea/index.d.ts +1 -1
- package/dist/textarea/index.js +1 -1
- package/dist/transition/InternalTransitionChild.svelte +36 -22
- package/dist/transition/InternalTransitionChild.svelte.d.ts +6 -37
- package/dist/transition/Transition.svelte +16 -17
- package/dist/transition/Transition.svelte.d.ts +8 -38
- package/dist/transition/TransitionChild.svelte +13 -12
- package/dist/transition/TransitionChild.svelte.d.ts +11 -38
- package/dist/transition/context.svelte.js +11 -11
- package/dist/transition/index.d.ts +2 -2
- package/dist/transition/index.js +2 -2
- package/dist/utils/DisabledProvider.svelte +10 -0
- package/dist/utils/DisabledProvider.svelte.d.ts +8 -0
- package/dist/utils/ElementOrComponent.svelte +58 -17
- package/dist/utils/ElementOrComponent.svelte.d.ts +19 -30
- package/dist/utils/StableCollection.svelte.d.ts +4 -18
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +32 -0
- package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +8 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +94 -0
- package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +26 -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/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/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/state.js +4 -4
- package/dist/utils/style.d.ts +2 -0
- package/dist/utils/style.js +6 -0
- package/dist/utils/types.d.ts +13 -19
- package/package.json +55 -54
- package/dist/combobox/Combobox.svelte +0 -53
- package/dist/combobox/Combobox.svelte.d.ts +0 -50
- package/dist/internal/HoistFormFields.svelte +0 -14
- package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
- package/dist/internal/id.d.ts +0 -8
- package/dist/internal/id.js +0 -11
- package/dist/listbox/ListboxStates.d.ts +0 -12
- package/dist/listbox/ListboxStates.js +0 -15
- package/dist/utils/Generic.svelte +0 -56
- package/dist/utils/Generic.svelte.d.ts +0 -35
- package/dist/utils/alternative-types.d.ts +0 -21
- /package/dist/utils/{alternative-types.js → floating-ui/svelte/types.js} +0 -0
package/dist/tabs/Tab.svelte
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script lang="ts" module>
|
|
2
|
-
import type {
|
|
2
|
+
import type { Props } from "../utils/types.js"
|
|
3
3
|
|
|
4
4
|
const DEFAULT_TAB_TAG = "button" as const
|
|
5
|
-
type TabRenderPropArg = {
|
|
5
|
+
export type TabRenderPropArg = {
|
|
6
6
|
hover: boolean
|
|
7
7
|
focus: boolean
|
|
8
8
|
active: boolean
|
|
@@ -12,21 +12,18 @@
|
|
|
12
12
|
}
|
|
13
13
|
type TabPropsWeControl = "aria-controls" | "aria-selected" | "role" | "tabIndex"
|
|
14
14
|
|
|
15
|
-
export type
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
>
|
|
15
|
+
export type TabOwnProps = {
|
|
16
|
+
element?: HTMLElement
|
|
17
|
+
id?: string
|
|
18
|
+
autofocus?: boolean
|
|
19
|
+
disabled?: boolean
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type TabProps = Props<typeof DEFAULT_TAB_TAG, TabRenderPropArg, TabOwnProps>
|
|
25
23
|
</script>
|
|
26
24
|
|
|
27
|
-
<script lang="ts"
|
|
25
|
+
<script lang="ts">
|
|
28
26
|
import { useId } from "../hooks/use-id.js"
|
|
29
|
-
import { useActions, useData } from "./TabGroup.svelte"
|
|
30
27
|
import { useStableCollectionIndex } from "../utils/StableCollection.svelte"
|
|
31
28
|
import { Focus, focusIn, FocusResult } from "../utils/focus-management.js"
|
|
32
29
|
import { getOwnerDocument } from "../utils/owner.js"
|
|
@@ -40,23 +37,23 @@
|
|
|
40
37
|
import { useHover } from "../hooks/use-hover.svelte.js"
|
|
41
38
|
import { mergeProps } from "../utils/render.js"
|
|
42
39
|
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
40
|
+
import { useTabs } from "./context.svelte.js"
|
|
43
41
|
|
|
44
42
|
const internalId = useId()
|
|
45
43
|
let {
|
|
46
|
-
|
|
44
|
+
element = $bindable(),
|
|
47
45
|
id = `headlessui-tabs-tab-${internalId}`,
|
|
48
46
|
disabled = false,
|
|
49
47
|
autofocus = false,
|
|
50
48
|
...theirProps
|
|
51
|
-
}:
|
|
49
|
+
}: TabProps = $props()
|
|
52
50
|
|
|
53
|
-
const
|
|
54
|
-
const { orientation, activation, selectedIndex, tabs, panels } = $derived(
|
|
55
|
-
const actions = useActions("Tab")
|
|
51
|
+
const context = useTabs("Tab")
|
|
52
|
+
const { orientation, activation, selectedIndex, tabs, panels, registerTab, change } = $derived(context)
|
|
56
53
|
|
|
57
|
-
const tabRef = $derived<MutableRefObject<HTMLElement | undefined>>({ current:
|
|
54
|
+
const tabRef = $derived<MutableRefObject<HTMLElement | undefined>>({ current: element })
|
|
58
55
|
|
|
59
|
-
onMount(() =>
|
|
56
|
+
onMount(() => registerTab(tabRef))
|
|
60
57
|
|
|
61
58
|
const mySSRIndex = useStableCollectionIndex("tabs")
|
|
62
59
|
|
|
@@ -69,9 +66,9 @@
|
|
|
69
66
|
const activateUsing = $derived((cb: () => FocusResult) => {
|
|
70
67
|
let result = cb()
|
|
71
68
|
if (result === FocusResult.Success && activation === "auto") {
|
|
72
|
-
let newTab = getOwnerDocument(
|
|
73
|
-
let idx =
|
|
74
|
-
if (idx !== -1)
|
|
69
|
+
let newTab = getOwnerDocument(element)?.activeElement
|
|
70
|
+
let idx = context.tabs.findIndex((tab) => tab.current === newTab)
|
|
71
|
+
if (idx !== -1) change(idx)
|
|
75
72
|
}
|
|
76
73
|
return result
|
|
77
74
|
})
|
|
@@ -83,7 +80,7 @@
|
|
|
83
80
|
event.preventDefault()
|
|
84
81
|
event.stopPropagation()
|
|
85
82
|
|
|
86
|
-
|
|
83
|
+
change(myIndex)
|
|
87
84
|
return
|
|
88
85
|
}
|
|
89
86
|
|
|
@@ -128,8 +125,8 @@
|
|
|
128
125
|
if (ready) return
|
|
129
126
|
ready = true
|
|
130
127
|
|
|
131
|
-
|
|
132
|
-
|
|
128
|
+
element?.focus({ preventScroll: true })
|
|
129
|
+
change(myIndex)
|
|
133
130
|
|
|
134
131
|
microTask(() => {
|
|
135
132
|
ready = false
|
|
@@ -174,9 +171,9 @@
|
|
|
174
171
|
disabled,
|
|
175
172
|
} satisfies TabRenderPropArg)
|
|
176
173
|
|
|
177
|
-
const
|
|
174
|
+
const buttonType = useResolveButtonType({
|
|
178
175
|
get props() {
|
|
179
|
-
return { type: theirProps.type, as:
|
|
176
|
+
return { type: theirProps.type ?? undefined, as: element ? element.tagName.toLowerCase() : DEFAULT_TAB_TAG }
|
|
180
177
|
},
|
|
181
178
|
get ref() {
|
|
182
179
|
return tabRef
|
|
@@ -191,7 +188,7 @@
|
|
|
191
188
|
onclick: handleSelection,
|
|
192
189
|
id,
|
|
193
190
|
role: "tab",
|
|
194
|
-
type:
|
|
191
|
+
type: buttonType.type,
|
|
195
192
|
"aria-controls": panels[myIndex]?.current?.id,
|
|
196
193
|
"aria-selected": selected,
|
|
197
194
|
tabIndex: selected ? 0 : -1,
|
|
@@ -205,4 +202,4 @@
|
|
|
205
202
|
)
|
|
206
203
|
</script>
|
|
207
204
|
|
|
208
|
-
<ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_TAB_TAG} name="Tab" bind:
|
|
205
|
+
<ElementOrComponent {ourProps} {theirProps} slots={slot} defaultTag={DEFAULT_TAB_TAG} name="Tab" bind:element />
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
2
2
|
declare const DEFAULT_TAB_TAG: "button";
|
|
3
|
-
type TabRenderPropArg = {
|
|
3
|
+
export type TabRenderPropArg = {
|
|
4
4
|
hover: boolean;
|
|
5
5
|
focus: boolean;
|
|
6
6
|
active: boolean;
|
|
@@ -8,41 +8,13 @@ type TabRenderPropArg = {
|
|
|
8
8
|
selected: boolean;
|
|
9
9
|
disabled: boolean;
|
|
10
10
|
};
|
|
11
|
-
type
|
|
12
|
-
|
|
11
|
+
export type TabOwnProps = {
|
|
12
|
+
element?: HTMLElement;
|
|
13
13
|
id?: string;
|
|
14
14
|
autofocus?: boolean;
|
|
15
15
|
disabled?: boolean;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "disabled" | "autofocus" | "id" | TabPropsWeControl> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
21
|
-
children?: import("../utils/types.js").Children<TabRenderPropArg> | undefined;
|
|
22
|
-
ref?: HTMLElement;
|
|
23
|
-
} & (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) ? {
|
|
24
|
-
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: TabRenderPropArg) => string) | undefined;
|
|
25
|
-
} : {}) & {
|
|
26
|
-
id?: string;
|
|
27
|
-
autofocus?: boolean;
|
|
28
|
-
disabled?: boolean;
|
|
29
|
-
};
|
|
30
|
-
events(): {} & {
|
|
31
|
-
[evt: string]: CustomEvent<any>;
|
|
32
|
-
};
|
|
33
|
-
slots(): {};
|
|
34
|
-
bindings(): "ref";
|
|
35
|
-
exports(): {};
|
|
36
|
-
}
|
|
37
|
-
interface $$IsomorphicComponent {
|
|
38
|
-
new <TTag extends ElementType = typeof DEFAULT_TAB_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']>> & {
|
|
39
|
-
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
40
|
-
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
41
|
-
<TTag extends ElementType = typeof DEFAULT_TAB_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
42
|
-
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
43
|
-
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
44
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
45
|
-
}
|
|
46
|
-
declare const Tab: $$IsomorphicComponent;
|
|
47
|
-
type Tab<TTag extends ElementType = typeof DEFAULT_TAB_TAG> = InstanceType<typeof Tab<TTag>>;
|
|
16
|
+
};
|
|
17
|
+
export type TabProps = Props<typeof DEFAULT_TAB_TAG, TabRenderPropArg, TabOwnProps>;
|
|
18
|
+
declare const Tab: import("svelte").Component<TabProps, {}, "element">;
|
|
19
|
+
type Tab = ReturnType<typeof Tab>;
|
|
48
20
|
export default Tab;
|
|
@@ -1,297 +1,75 @@
|
|
|
1
1
|
<script lang="ts" module>
|
|
2
|
-
import type {
|
|
2
|
+
import type { Props } from "../utils/types.js"
|
|
3
3
|
import { sortByDomNode } from "../utils/focus-management.js"
|
|
4
|
-
import { match } from "../utils/match.js"
|
|
5
4
|
import FocusSentinel from "../internal/FocusSentinel.svelte"
|
|
6
|
-
import { setContext, getContext, untrack } from "svelte"
|
|
7
5
|
|
|
8
6
|
const DEFAULT_TABS_TAG = "div" as const
|
|
9
|
-
type TabsRenderPropArg = {
|
|
7
|
+
export type TabsRenderPropArg = {
|
|
10
8
|
selectedIndex: number
|
|
11
9
|
}
|
|
12
10
|
type TabsPropsWeControl = never
|
|
13
11
|
|
|
14
|
-
export type
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
selectedIndex?: number
|
|
22
|
-
vertical?: boolean
|
|
23
|
-
manual?: boolean
|
|
24
|
-
}
|
|
25
|
-
>
|
|
26
|
-
|
|
27
|
-
interface StateDefinition {
|
|
28
|
-
info: { isControlled: boolean }
|
|
29
|
-
selectedIndex: number
|
|
30
|
-
|
|
31
|
-
tabs: MutableRefObject<HTMLElement | undefined>[]
|
|
32
|
-
panels: MutableRefObject<HTMLElement | undefined>[]
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
type TabsDataContext = StateDefinition & {
|
|
36
|
-
orientation: "horizontal" | "vertical"
|
|
37
|
-
activation: "manual" | "auto"
|
|
12
|
+
export type TabGroupOwnProps = {
|
|
13
|
+
element?: HTMLElement
|
|
14
|
+
defaultIndex?: number
|
|
15
|
+
onchange?: (index: number) => void
|
|
16
|
+
selectedIndex?: number
|
|
17
|
+
vertical?: boolean
|
|
18
|
+
manual?: boolean
|
|
38
19
|
}
|
|
39
20
|
|
|
40
|
-
export
|
|
41
|
-
const context = getContext<TabsDataContext>("TabsData")
|
|
42
|
-
if (!context) {
|
|
43
|
-
let err = new Error(`<${component} /> is missing a parent <Tab.Group /> component.`)
|
|
44
|
-
if (Error.captureStackTrace) Error.captureStackTrace(err, useData)
|
|
45
|
-
throw err
|
|
46
|
-
}
|
|
47
|
-
return context
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
type TabsActionsContext = {
|
|
51
|
-
registerTab: (tab: MutableRefObject<HTMLElement | undefined>) => () => void
|
|
52
|
-
registerPanel: (panel: MutableRefObject<HTMLElement | undefined>) => () => void
|
|
53
|
-
change: (index: number) => void
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function useActions(component: string) {
|
|
57
|
-
const context = getContext<TabsActionsContext>("TabsActions")
|
|
58
|
-
if (!context) {
|
|
59
|
-
const err = new Error(`<${component} /> is missing a parent <Tab.Group /> component.`)
|
|
60
|
-
if (Error.captureStackTrace) Error.captureStackTrace(err, useActions)
|
|
61
|
-
throw err
|
|
62
|
-
}
|
|
63
|
-
return context
|
|
64
|
-
}
|
|
21
|
+
export type TabGroupProps = Props<typeof DEFAULT_TABS_TAG, TabsRenderPropArg, TabGroupOwnProps>
|
|
65
22
|
</script>
|
|
66
23
|
|
|
67
|
-
<script lang="ts"
|
|
24
|
+
<script lang="ts">
|
|
68
25
|
import StableCollection from "../utils/StableCollection.svelte"
|
|
69
|
-
import type { MutableRefObject } from "../utils/ref.svelte.js"
|
|
70
26
|
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Forwards,
|
|
74
|
-
Backwards,
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
enum Ordering {
|
|
78
|
-
Less = -1,
|
|
79
|
-
Equal = 0,
|
|
80
|
-
Greater = 1,
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const stateReducer = (initialState: StateDefinition) => {
|
|
84
|
-
let _state = $state(initialState)
|
|
85
|
-
return {
|
|
86
|
-
get info() {
|
|
87
|
-
return _state.info
|
|
88
|
-
},
|
|
89
|
-
get selectedIndex() {
|
|
90
|
-
return _state.selectedIndex
|
|
91
|
-
},
|
|
92
|
-
get tabs() {
|
|
93
|
-
return _state.tabs
|
|
94
|
-
},
|
|
95
|
-
get panels() {
|
|
96
|
-
return _state.panels
|
|
97
|
-
},
|
|
98
|
-
setSelectedIndex(index: number) {
|
|
99
|
-
if (index === _state.selectedIndex) return _state
|
|
100
|
-
let tabs = sortByDomNode(_state.tabs, (tab) => tab.current ?? null)
|
|
101
|
-
let panels = sortByDomNode(_state.panels, (panel) => panel.current ?? null)
|
|
102
|
-
|
|
103
|
-
let focusableTabs = tabs.filter((tab) => !tab?.current?.hasAttribute("disabled"))
|
|
104
|
-
|
|
105
|
-
let nextState = { ..._state, tabs, panels }
|
|
106
|
-
|
|
107
|
-
if (
|
|
108
|
-
// Underflow
|
|
109
|
-
index < 0 ||
|
|
110
|
-
// Overflow
|
|
111
|
-
index > tabs.length - 1
|
|
112
|
-
) {
|
|
113
|
-
let direction = match(Math.sign(index - _state.selectedIndex), {
|
|
114
|
-
[Ordering.Less]: () => Direction.Backwards,
|
|
115
|
-
[Ordering.Equal]: () => {
|
|
116
|
-
return match(Math.sign(index), {
|
|
117
|
-
[Ordering.Less]: () => Direction.Forwards,
|
|
118
|
-
[Ordering.Equal]: () => Direction.Forwards,
|
|
119
|
-
[Ordering.Greater]: () => Direction.Backwards,
|
|
120
|
-
})
|
|
121
|
-
},
|
|
122
|
-
[Ordering.Greater]: () => Direction.Forwards,
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
// If there are no focusable tabs then.
|
|
126
|
-
// We won't change the selected index
|
|
127
|
-
// because it's likely the user is
|
|
128
|
-
// lazy loading tabs and there's
|
|
129
|
-
// nothing to focus on yet
|
|
130
|
-
if (focusableTabs.length === 0) {
|
|
131
|
-
_state = nextState
|
|
132
|
-
return _state
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
let nextSelectedIndex = match(direction, {
|
|
136
|
-
[Direction.Forwards]: () => tabs.findIndex((tab) => tab === focusableTabs[0]),
|
|
137
|
-
[Direction.Backwards]: () => tabs.findIndex((tab) => tab === focusableTabs[focusableTabs.length - 1]),
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
_state = {
|
|
141
|
-
...nextState,
|
|
142
|
-
selectedIndex: nextSelectedIndex === -1 ? _state.selectedIndex : nextSelectedIndex,
|
|
143
|
-
}
|
|
144
|
-
return _state
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Middle
|
|
148
|
-
let before = tabs.slice(0, index)
|
|
149
|
-
let after = tabs.slice(index)
|
|
150
|
-
|
|
151
|
-
let next = [...after, ...before].find((tab) => focusableTabs.some((_tab) => _tab === tab))
|
|
152
|
-
if (!next) {
|
|
153
|
-
_state = nextState
|
|
154
|
-
return _state
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
let selectedIndex = tabs.findIndex((tab) => tab === next) ?? _state.selectedIndex
|
|
158
|
-
if (selectedIndex === -1) selectedIndex = _state.selectedIndex
|
|
159
|
-
|
|
160
|
-
_state = { ...nextState, selectedIndex }
|
|
161
|
-
return _state
|
|
162
|
-
},
|
|
163
|
-
registerTab(tab: MutableRefObject<HTMLElement | undefined>) {
|
|
164
|
-
if (_state.tabs.some((_tab) => _tab === tab)) return _state
|
|
165
|
-
|
|
166
|
-
_state.tabs = sortByDomNode([..._state.tabs, tab], (tab) => tab.current ?? null)
|
|
167
|
-
let activeTab = _state.tabs[_state.selectedIndex]
|
|
168
|
-
|
|
169
|
-
// When the component is uncontrolled, then we want to maintain the actively
|
|
170
|
-
// selected tab even if new tabs are inserted or removed before the active
|
|
171
|
-
// tab.
|
|
172
|
-
//
|
|
173
|
-
// When the component is controlled, then we don't want to do this and
|
|
174
|
-
// instead we want to select the tab based on the `selectedIndex` prop.
|
|
175
|
-
if (!_state.info.isControlled) {
|
|
176
|
-
const selectedIndex = _state.tabs.findIndex((tab) => tab === activeTab)
|
|
177
|
-
if (selectedIndex !== _state.selectedIndex) _state.selectedIndex = selectedIndex
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return _state
|
|
181
|
-
},
|
|
182
|
-
unregisterTab(tab: MutableRefObject<HTMLElement | undefined>) {
|
|
183
|
-
_state.tabs = _state.tabs.filter((_tab) => _tab !== tab)
|
|
184
|
-
return _state
|
|
185
|
-
},
|
|
186
|
-
registerPanel(panel: MutableRefObject<HTMLElement | undefined>) {
|
|
187
|
-
if (_state.panels.some((_panel) => _panel === panel)) return _state
|
|
188
|
-
_state.panels = sortByDomNode([..._state.panels, panel], (panel) => panel.current ?? null)
|
|
189
|
-
return _state
|
|
190
|
-
},
|
|
191
|
-
unregisterPanel(panel: MutableRefObject<HTMLElement | undefined>) {
|
|
192
|
-
_state.panels = _state.panels.filter((_panel) => _panel !== panel)
|
|
193
|
-
return _state
|
|
194
|
-
},
|
|
195
|
-
}
|
|
196
|
-
}
|
|
27
|
+
import { createTabContext } from "./context.svelte.js"
|
|
28
|
+
import { untrack } from "svelte"
|
|
197
29
|
|
|
198
30
|
let {
|
|
199
|
-
|
|
31
|
+
element = $bindable(),
|
|
200
32
|
defaultIndex = 0,
|
|
201
33
|
vertical = false,
|
|
202
34
|
manual = false,
|
|
203
35
|
onchange,
|
|
204
36
|
selectedIndex = undefined,
|
|
205
37
|
...theirProps
|
|
206
|
-
}:
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const isControlled = $derived(selectedIndex !== undefined)
|
|
211
|
-
|
|
212
|
-
const _state = stateReducer({
|
|
213
|
-
info: { isControlled: selectedIndex !== undefined },
|
|
214
|
-
selectedIndex: selectedIndex ?? defaultIndex,
|
|
215
|
-
tabs: [],
|
|
216
|
-
panels: [],
|
|
217
|
-
})
|
|
218
|
-
$effect(() => {
|
|
219
|
-
untrack(() => _state.info).isControlled = isControlled
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
const slot = $derived({
|
|
223
|
-
selectedIndex: _state.selectedIndex,
|
|
224
|
-
} satisfies TabsRenderPropArg)
|
|
225
|
-
const stableTabs = $derived(_state.tabs)
|
|
226
|
-
|
|
227
|
-
const tabsData = {
|
|
228
|
-
get orientation() {
|
|
229
|
-
return orientation
|
|
230
|
-
},
|
|
231
|
-
get activation() {
|
|
232
|
-
return activation
|
|
38
|
+
}: TabGroupProps = $props()
|
|
39
|
+
const _state = createTabContext({
|
|
40
|
+
get vertical() {
|
|
41
|
+
return vertical
|
|
233
42
|
},
|
|
234
|
-
get
|
|
235
|
-
return
|
|
43
|
+
get manual() {
|
|
44
|
+
return manual
|
|
236
45
|
},
|
|
237
46
|
get selectedIndex() {
|
|
238
|
-
return
|
|
47
|
+
return selectedIndex
|
|
239
48
|
},
|
|
240
|
-
get
|
|
241
|
-
return
|
|
49
|
+
get defaultIndex() {
|
|
50
|
+
return defaultIndex
|
|
242
51
|
},
|
|
243
|
-
|
|
244
|
-
|
|
52
|
+
change: (index: number) => {
|
|
53
|
+
if (realSelectedIndex !== index) {
|
|
54
|
+
onchange?.(index)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!isControlled) {
|
|
58
|
+
_state.selectedIndex = index
|
|
59
|
+
}
|
|
245
60
|
},
|
|
246
|
-
}
|
|
247
|
-
|
|
61
|
+
})
|
|
62
|
+
const isControlled = $derived(_state.info.isControlled)
|
|
248
63
|
const realSelectedIndex = $derived(isControlled ? selectedIndex! : _state.selectedIndex)
|
|
249
64
|
|
|
250
|
-
const
|
|
251
|
-
_state.
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const registerPanel = (panel: MutableRefObject<HTMLElement | undefined>) => {
|
|
256
|
-
_state.registerPanel(panel)
|
|
257
|
-
return () => _state.unregisterPanel(panel)
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
const change = (index: number) => {
|
|
261
|
-
if (realSelectedIndex !== index) {
|
|
262
|
-
onchange?.(index)
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (!isControlled) {
|
|
266
|
-
_state.setSelectedIndex(index)
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
setContext<TabsActionsContext>("TabsActions", { registerTab, registerPanel, change })
|
|
271
|
-
setContext<TabsDataContext>("TabsData", {
|
|
272
|
-
get orientation() {
|
|
273
|
-
return orientation
|
|
274
|
-
},
|
|
275
|
-
get activation() {
|
|
276
|
-
return activation
|
|
277
|
-
},
|
|
278
|
-
get info() {
|
|
279
|
-
return _state.info
|
|
280
|
-
},
|
|
281
|
-
get selectedIndex() {
|
|
282
|
-
return _state.selectedIndex
|
|
283
|
-
},
|
|
284
|
-
get tabs() {
|
|
285
|
-
return _state.tabs
|
|
286
|
-
},
|
|
287
|
-
get panels() {
|
|
288
|
-
return _state.panels
|
|
289
|
-
},
|
|
290
|
-
})
|
|
65
|
+
const slot = $derived({
|
|
66
|
+
selectedIndex: _state.selectedIndex,
|
|
67
|
+
} satisfies TabsRenderPropArg)
|
|
68
|
+
const stableTabs = $derived(_state.tabs)
|
|
291
69
|
|
|
292
70
|
$effect(() => {
|
|
293
71
|
const newSelectedIndex = selectedIndex ?? defaultIndex
|
|
294
|
-
untrack(() => _state.
|
|
72
|
+
untrack(() => (_state.selectedIndex = newSelectedIndex))
|
|
295
73
|
})
|
|
296
74
|
|
|
297
75
|
$effect(() => {
|
|
@@ -304,16 +82,16 @@
|
|
|
304
82
|
let didOrderChange = sorted.some((tab, i) => _state.tabs[i] !== tab)
|
|
305
83
|
|
|
306
84
|
if (didOrderChange) {
|
|
307
|
-
change(sorted.findIndex((tab) => tab === _state.tabs[realSelectedIndex]))
|
|
85
|
+
_state.change(sorted.findIndex((tab) => tab === _state.tabs[realSelectedIndex]))
|
|
308
86
|
}
|
|
309
87
|
})
|
|
310
88
|
</script>
|
|
311
89
|
|
|
312
90
|
<StableCollection>
|
|
313
|
-
{#if
|
|
91
|
+
{#if _state.tabs.length <= 0}
|
|
314
92
|
<FocusSentinel
|
|
315
93
|
onfocus={() => {
|
|
316
|
-
for (
|
|
94
|
+
for (const tab of stableTabs) {
|
|
317
95
|
if (tab?.current?.tabIndex === 0) {
|
|
318
96
|
tab?.current?.focus()
|
|
319
97
|
return true
|
|
@@ -324,5 +102,5 @@
|
|
|
324
102
|
}}
|
|
325
103
|
/>
|
|
326
104
|
{/if}
|
|
327
|
-
<ElementOrComponent {theirProps} defaultTag={DEFAULT_TABS_TAG} name="TabGroup" bind:
|
|
105
|
+
<ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_TABS_TAG} name="TabGroup" bind:element />
|
|
328
106
|
</StableCollection>
|
|
@@ -1,67 +1,17 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Props } from "../utils/types.js";
|
|
2
2
|
declare const DEFAULT_TABS_TAG: "div";
|
|
3
|
-
type TabsRenderPropArg = {
|
|
3
|
+
export type TabsRenderPropArg = {
|
|
4
4
|
selectedIndex: number;
|
|
5
5
|
};
|
|
6
|
-
type
|
|
7
|
-
|
|
6
|
+
export type TabGroupOwnProps = {
|
|
7
|
+
element?: HTMLElement;
|
|
8
8
|
defaultIndex?: number;
|
|
9
9
|
onchange?: (index: number) => void;
|
|
10
10
|
selectedIndex?: number;
|
|
11
11
|
vertical?: boolean;
|
|
12
12
|
manual?: boolean;
|
|
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
13
|
};
|
|
32
|
-
export
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
props(): {
|
|
36
|
-
as?: TTag | undefined;
|
|
37
|
-
} & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "onchange" | "vertical" | "defaultIndex" | "selectedIndex" | "manual"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
|
|
38
|
-
children?: import("../utils/types.js").Children<TabsRenderPropArg> | undefined;
|
|
39
|
-
ref?: HTMLElement;
|
|
40
|
-
} & (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) ? {
|
|
41
|
-
class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: TabsRenderPropArg) => string) | undefined;
|
|
42
|
-
} : {}) & {
|
|
43
|
-
defaultIndex?: number;
|
|
44
|
-
onchange?: (index: number) => void;
|
|
45
|
-
selectedIndex?: number;
|
|
46
|
-
vertical?: boolean;
|
|
47
|
-
manual?: boolean;
|
|
48
|
-
};
|
|
49
|
-
events(): {} & {
|
|
50
|
-
[evt: string]: CustomEvent<any>;
|
|
51
|
-
};
|
|
52
|
-
slots(): {};
|
|
53
|
-
bindings(): "ref";
|
|
54
|
-
exports(): {};
|
|
55
|
-
}
|
|
56
|
-
interface $$IsomorphicComponent {
|
|
57
|
-
new <TTag extends ElementType = typeof DEFAULT_TABS_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']>> & {
|
|
58
|
-
$$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
|
|
59
|
-
} & ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
60
|
-
<TTag extends ElementType = typeof DEFAULT_TABS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
|
|
61
|
-
$$events?: ReturnType<__sveltets_Render<TTag>['events']>;
|
|
62
|
-
}): ReturnType<__sveltets_Render<TTag>['exports']>;
|
|
63
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
64
|
-
}
|
|
65
|
-
declare const TabGroup: $$IsomorphicComponent;
|
|
66
|
-
type TabGroup<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = InstanceType<typeof TabGroup<TTag>>;
|
|
14
|
+
export type TabGroupProps = Props<typeof DEFAULT_TABS_TAG, TabsRenderPropArg, TabGroupOwnProps>;
|
|
15
|
+
declare const TabGroup: import("svelte").Component<TabGroupProps, {}, "element">;
|
|
16
|
+
type TabGroup = ReturnType<typeof TabGroup>;
|
|
67
17
|
export default TabGroup;
|
package/dist/tabs/TabList.svelte
CHANGED
|
@@ -1,36 +1,33 @@
|
|
|
1
1
|
<script lang="ts" module>
|
|
2
|
-
import type {
|
|
2
|
+
import type { Props } from "../utils/types.js"
|
|
3
3
|
|
|
4
4
|
const DEFAULT_LIST_TAG = "div" as const
|
|
5
|
-
type ListRenderPropArg = {
|
|
5
|
+
export type ListRenderPropArg = {
|
|
6
6
|
selectedIndex: number
|
|
7
7
|
}
|
|
8
8
|
type ListPropsWeControl = "aria-orientation" | "role"
|
|
9
9
|
|
|
10
|
-
export type
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
//
|
|
16
|
-
}
|
|
17
|
-
>
|
|
10
|
+
export type TabListOwnProps = {
|
|
11
|
+
element?: HTMLElement
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type TabListProps = Props<typeof DEFAULT_LIST_TAG, ListRenderPropArg, TabListOwnProps>
|
|
18
15
|
</script>
|
|
19
16
|
|
|
20
|
-
<script lang="ts"
|
|
21
|
-
import { useData } from "./TabGroup.svelte"
|
|
17
|
+
<script lang="ts">
|
|
22
18
|
import ElementOrComponent from "../utils/ElementOrComponent.svelte"
|
|
19
|
+
import { useTabs } from "./context.svelte.js"
|
|
23
20
|
|
|
24
|
-
const
|
|
25
|
-
const { orientation, selectedIndex } = $derived(
|
|
21
|
+
const context = useTabs("TabList")
|
|
22
|
+
const { orientation, selectedIndex } = $derived(context)
|
|
26
23
|
|
|
27
24
|
const slot = $derived({ selectedIndex } satisfies ListRenderPropArg)
|
|
28
25
|
|
|
29
|
-
let {
|
|
26
|
+
let { element = $bindable(), ...theirProps }: TabListProps = $props()
|
|
30
27
|
const ourProps = $derived({
|
|
31
28
|
role: "tablist",
|
|
32
29
|
"aria-orientation": orientation,
|
|
33
30
|
})
|
|
34
31
|
</script>
|
|
35
32
|
|
|
36
|
-
<ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_LIST_TAG} name="TabList" bind:
|
|
33
|
+
<ElementOrComponent {ourProps} {theirProps} slots={slot} defaultTag={DEFAULT_LIST_TAG} name="TabList" bind:element />
|