@pzerelles/headlessui-svelte 2.1.2-next.3 → 2.1.2-next.30

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.
Files changed (197) hide show
  1. package/dist/button/Button.svelte +1 -1
  2. package/dist/button/Button.svelte.d.ts +9 -11
  3. package/dist/checkbox/Checkbox.svelte +4 -4
  4. package/dist/checkbox/Checkbox.svelte.d.ts +10 -14
  5. package/dist/close-button/CloseButton.svelte.d.ts +16 -18
  6. package/dist/data-interactive/DataInteractive.svelte.d.ts +8 -11
  7. package/dist/description/Description.svelte +19 -14
  8. package/dist/description/Description.svelte.d.ts +9 -11
  9. package/dist/description/context.svelte.js +14 -16
  10. package/dist/dialog/Dialog.svelte +245 -17
  11. package/dist/dialog/Dialog.svelte.d.ts +12 -14
  12. package/dist/dialog/DialogBackdrop.svelte +1 -1
  13. package/dist/dialog/DialogBackdrop.svelte.d.ts +9 -11
  14. package/dist/dialog/DialogPanel.svelte +1 -2
  15. package/dist/dialog/DialogPanel.svelte.d.ts +9 -11
  16. package/dist/dialog/DialogTitle.svelte.d.ts +8 -10
  17. package/dist/dialog/context.svelte.js +1 -1
  18. package/dist/field/Field.svelte +24 -12
  19. package/dist/field/Field.svelte.d.ts +9 -11
  20. package/dist/fieldset/Fieldset.svelte +1 -1
  21. package/dist/fieldset/Fieldset.svelte.d.ts +9 -11
  22. package/dist/focus-trap/FocusTrap.svelte +7 -14
  23. package/dist/focus-trap/FocusTrap.svelte.d.ts +11 -25
  24. package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
  25. package/dist/focus-trap/FocusTrapFeatures.js +15 -0
  26. package/dist/hooks/use-controllable.svelte.js +2 -1
  27. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  28. package/dist/hooks/use-disabled.d.ts +6 -1
  29. package/dist/hooks/use-disabled.js +10 -5
  30. package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
  31. package/dist/hooks/use-event-listener.svelte.js +3 -1
  32. package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
  33. package/dist/hooks/use-root-containers.svelte.js +5 -5
  34. package/dist/hooks/use-tab-direction.svelte.js +1 -1
  35. package/dist/index.d.ts +4 -2
  36. package/dist/index.js +4 -2
  37. package/dist/input/Input.svelte +3 -3
  38. package/dist/input/Input.svelte.d.ts +10 -14
  39. package/dist/internal/FloatingProvider.svelte +12 -0
  40. package/dist/internal/FloatingProvider.svelte.d.ts +6 -0
  41. package/dist/internal/FocusSentinel.svelte.d.ts +2 -18
  42. package/dist/internal/ForcePortalRoot.svelte.d.ts +2 -18
  43. package/dist/internal/FormFields.svelte +22 -19
  44. package/dist/internal/FormFields.svelte.d.ts +2 -18
  45. package/dist/internal/FormFieldsProvider.svelte +13 -0
  46. package/dist/internal/FormFieldsProvider.svelte.d.ts +5 -0
  47. package/dist/internal/FormResolver.svelte.d.ts +2 -18
  48. package/dist/internal/Hidden.svelte +18 -8
  49. package/dist/internal/Hidden.svelte.d.ts +11 -16
  50. package/dist/internal/HiddenFeatures.d.ts +5 -0
  51. package/dist/internal/HiddenFeatures.js +9 -0
  52. package/dist/internal/MainTreeProvider.svelte.d.ts +2 -18
  53. package/dist/internal/Portal.svelte.d.ts +2 -18
  54. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  55. package/dist/internal/floating-provider.svelte.js +206 -0
  56. package/dist/internal/floating.svelte.d.ts +48 -23
  57. package/dist/internal/floating.svelte.js +91 -272
  58. package/dist/internal/form-fields.svelte.d.ts +10 -0
  59. package/dist/internal/form-fields.svelte.js +23 -0
  60. package/dist/label/Label.svelte +6 -5
  61. package/dist/label/Label.svelte.d.ts +9 -11
  62. package/dist/label/context.svelte.js +1 -1
  63. package/dist/legend/Legend.svelte +2 -2
  64. package/dist/legend/Legend.svelte.d.ts +4 -32
  65. package/dist/listbox/Listbox.svelte +47 -68
  66. package/dist/listbox/Listbox.svelte.d.ts +18 -80
  67. package/dist/listbox/ListboxButton.svelte +10 -10
  68. package/dist/listbox/ListboxButton.svelte.d.ts +10 -15
  69. package/dist/listbox/ListboxOption.svelte +10 -6
  70. package/dist/listbox/ListboxOption.svelte.d.ts +9 -12
  71. package/dist/listbox/ListboxOptions.svelte +108 -54
  72. package/dist/listbox/ListboxOptions.svelte.d.ts +9 -12
  73. package/dist/listbox/ListboxSelectedOption.svelte +2 -4
  74. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -16
  75. package/dist/listbox/context.svelte.d.ts +76 -0
  76. package/dist/listbox/context.svelte.js +36 -0
  77. package/dist/listbox/index.d.ts +4 -4
  78. package/dist/listbox/index.js +1 -1
  79. package/dist/menu/Menu.svelte +9 -187
  80. package/dist/menu/Menu.svelte.d.ts +9 -12
  81. package/dist/menu/MenuButton.svelte +4 -2
  82. package/dist/menu/MenuButton.svelte.d.ts +9 -12
  83. package/dist/menu/MenuHeading.svelte.d.ts +9 -12
  84. package/dist/menu/MenuItem.svelte.d.ts +11 -16
  85. package/dist/menu/MenuItems.svelte +15 -11
  86. package/dist/menu/MenuItems.svelte.d.ts +9 -12
  87. package/dist/menu/MenuSection.svelte.d.ts +8 -11
  88. package/dist/menu/MenuSeparator.svelte.d.ts +8 -12
  89. package/dist/menu/context.svelte.d.ts +2 -1
  90. package/dist/menu/context.svelte.js +212 -2
  91. package/dist/menu/index.d.ts +7 -7
  92. package/dist/popover/Popover.svelte +161 -0
  93. package/dist/popover/Popover.svelte.d.ts +39 -0
  94. package/dist/popover/PopoverBackdrop.svelte +56 -0
  95. package/dist/popover/PopoverBackdrop.svelte.d.ts +43 -0
  96. package/dist/popover/PopoverButton.svelte +246 -0
  97. package/dist/popover/PopoverButton.svelte.d.ts +42 -0
  98. package/dist/popover/PopoverGroup.svelte +43 -0
  99. package/dist/popover/PopoverGroup.svelte.d.ts +31 -0
  100. package/dist/popover/PopoverPanel.svelte +274 -0
  101. package/dist/popover/PopoverPanel.svelte.d.ts +51 -0
  102. package/dist/popover/context.svelte.d.ts +51 -0
  103. package/dist/popover/context.svelte.js +108 -0
  104. package/dist/popover/index.d.ts +5 -0
  105. package/dist/popover/index.js +5 -0
  106. package/dist/portal/InternalPortal.svelte.d.ts +9 -11
  107. package/dist/portal/Portal.svelte.d.ts +2 -6
  108. package/dist/portal/PortalGroup.svelte.d.ts +9 -11
  109. package/dist/select/Select.svelte +74 -0
  110. package/dist/select/Select.svelte.d.ts +46 -0
  111. package/dist/select/index.d.ts +1 -0
  112. package/dist/select/index.js +1 -0
  113. package/dist/switch/Switch.svelte +30 -20
  114. package/dist/switch/Switch.svelte.d.ts +10 -12
  115. package/dist/switch/SwitchGroup.svelte.d.ts +8 -10
  116. package/dist/tabs/Tab.svelte +8 -9
  117. package/dist/tabs/Tab.svelte.d.ts +9 -11
  118. package/dist/tabs/TabGroup.svelte +27 -190
  119. package/dist/tabs/TabGroup.svelte.d.ts +9 -31
  120. package/dist/tabs/TabList.svelte +4 -4
  121. package/dist/tabs/TabList.svelte.d.ts +8 -10
  122. package/dist/tabs/TabPanel.svelte +4 -5
  123. package/dist/tabs/TabPanel.svelte.d.ts +9 -11
  124. package/dist/tabs/TabPanels.svelte +3 -3
  125. package/dist/tabs/TabPanels.svelte.d.ts +8 -10
  126. package/dist/tabs/context.svelte.d.ts +31 -0
  127. package/dist/tabs/context.svelte.js +134 -0
  128. package/dist/textarea/Textarea.svelte +4 -4
  129. package/dist/textarea/Textarea.svelte.d.ts +21 -20
  130. package/dist/transition/InternalTransitionChild.svelte.d.ts +9 -11
  131. package/dist/transition/Transition.svelte.d.ts +9 -11
  132. package/dist/transition/TransitionChild.svelte.d.ts +9 -11
  133. package/dist/transition/context.svelte.js +2 -2
  134. package/dist/utils/DisabledProvider.svelte +6 -0
  135. package/dist/utils/DisabledProvider.svelte.d.ts +6 -0
  136. package/dist/utils/ElementOrComponent.svelte +2 -2
  137. package/dist/utils/ElementOrComponent.svelte.d.ts +12 -11
  138. package/dist/utils/Generic.svelte +10 -8
  139. package/dist/utils/Generic.svelte.d.ts +12 -15
  140. package/dist/utils/StableCollection.svelte.d.ts +2 -18
  141. package/dist/utils/alternative-types.d.ts +1 -2
  142. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +17 -0
  143. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +7 -0
  144. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +50 -0
  145. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +25 -0
  146. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  147. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  148. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  149. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  150. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  151. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  152. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  153. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  154. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  155. package/dist/utils/floating-ui/svelte/index.js +5 -0
  156. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  157. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  158. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  159. package/dist/utils/floating-ui/svelte/types.js +1 -0
  160. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  161. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  162. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  163. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  164. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  165. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  166. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  167. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  168. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  169. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  170. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  171. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  172. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  173. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  174. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  175. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +182 -0
  176. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  177. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  178. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  179. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  180. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  181. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  182. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  183. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  184. package/dist/utils/id.d.ts +1 -1
  185. package/dist/utils/id.js +1 -1
  186. package/dist/utils/index.d.ts +3 -0
  187. package/dist/utils/index.js +3 -0
  188. package/dist/utils/style.d.ts +2 -0
  189. package/dist/utils/style.js +6 -0
  190. package/dist/utils/types.d.ts +9 -13
  191. package/package.json +27 -26
  192. package/dist/dialog/InternalDialog.svelte +0 -233
  193. package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
  194. package/dist/internal/HoistFormFields.svelte +0 -11
  195. package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
  196. package/dist/internal/id.d.ts +0 -8
  197. package/dist/internal/id.js +0 -11
@@ -17,19 +17,19 @@ export type TabProps<TTag extends ElementType = typeof DEFAULT_TAB_TAG> = Props<
17
17
  declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_TAB_TAG> {
18
18
  props(): {
19
19
  as?: TTag | undefined;
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;
20
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "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("svelte").Snippet<[{
22
+ slot: TabRenderPropArg;
23
+ props: Record<string, any>;
24
+ }]> | undefined;
25
+ class?: string | ((bag: TabRenderPropArg) => string) | null | undefined;
22
26
  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
- } : {}) & {
27
+ } & {
26
28
  id?: string;
27
29
  autofocus?: boolean;
28
30
  disabled?: boolean;
29
31
  };
30
- events(): {} & {
31
- [evt: string]: CustomEvent<any>;
32
- };
32
+ events(): {};
33
33
  slots(): {};
34
34
  bindings(): "ref";
35
35
  exports(): {};
@@ -38,9 +38,7 @@ interface $$IsomorphicComponent {
38
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
39
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
40
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']>;
41
+ <TTag extends ElementType = typeof DEFAULT_TAB_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
44
42
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
45
43
  }
46
44
  declare const Tab: $$IsomorphicComponent;
@@ -1,129 +1,12 @@
1
1
  <script lang="ts" module>import { sortByDomNode } from "../utils/focus-management.js";
2
- import { match } from "../utils/match.js";
3
2
  import FocusSentinel from "../internal/FocusSentinel.svelte";
4
- import { setContext, getContext, untrack } from "svelte";
5
3
  const DEFAULT_TABS_TAG = "div";
6
- export function useData(component) {
7
- const context = getContext("TabsData");
8
- if (!context) {
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;
21
- }
22
- return context;
23
- }
24
4
  </script>
25
5
 
26
6
  <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_TABS_TAG">import StableCollection from "../utils/StableCollection.svelte";
27
7
  import ElementOrComponent from "../utils/ElementOrComponent.svelte";
28
- var Direction = /* @__PURE__ */ ((Direction2) => {
29
- Direction2[Direction2["Forwards"] = 0] = "Forwards";
30
- Direction2[Direction2["Backwards"] = 1] = "Backwards";
31
- return Direction2;
32
- })(Direction || {});
33
- var Ordering = /* @__PURE__ */ ((Ordering2) => {
34
- Ordering2[Ordering2["Less"] = -1] = "Less";
35
- Ordering2[Ordering2["Equal"] = 0] = "Equal";
36
- Ordering2[Ordering2["Greater"] = 1] = "Greater";
37
- return Ordering2;
38
- })(Ordering || {});
39
- const stateReducer = (initialState) => {
40
- let _state2 = $state(initialState);
41
- return {
42
- get info() {
43
- return _state2.info;
44
- },
45
- get selectedIndex() {
46
- return _state2.selectedIndex;
47
- },
48
- get tabs() {
49
- return _state2.tabs;
50
- },
51
- get panels() {
52
- return _state2.panels;
53
- },
54
- setSelectedIndex(index) {
55
- if (index === _state2.selectedIndex) return _state2;
56
- let tabs = sortByDomNode(_state2.tabs, (tab) => tab.current ?? null);
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;
96
- }
97
- let selectedIndex2 = tabs.findIndex((tab) => tab === next) ?? _state2.selectedIndex;
98
- if (selectedIndex2 === -1) selectedIndex2 = _state2.selectedIndex;
99
- _state2 = { ...nextState, selectedIndex: selectedIndex2 };
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;
109
- }
110
- return _state2;
111
- },
112
- unregisterTab(tab) {
113
- _state2.tabs = _state2.tabs.filter((_tab) => _tab !== tab);
114
- return _state2;
115
- },
116
- registerPanel(panel) {
117
- if (_state2.panels.some((_panel) => _panel === panel)) return _state2;
118
- _state2.panels = sortByDomNode([..._state2.panels, panel], (panel2) => panel2.current ?? null);
119
- return _state2;
120
- },
121
- unregisterPanel(panel) {
122
- _state2.panels = _state2.panels.filter((_panel) => _panel !== panel);
123
- return _state2;
124
- }
125
- };
126
- };
8
+ import { createTabContext } from "./context.svelte.js";
9
+ import { untrack } from "svelte";
127
10
  let {
128
11
  ref = $bindable(),
129
12
  defaultIndex = 0,
@@ -133,83 +16,37 @@ let {
133
16
  selectedIndex = void 0,
134
17
  ...theirProps
135
18
  } = $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;
19
+ const _state = createTabContext({
20
+ get vertical() {
21
+ return vertical;
155
22
  },
156
- get activation() {
157
- return activation;
158
- },
159
- get info() {
160
- return _state.info;
23
+ get manual() {
24
+ return manual;
161
25
  },
162
26
  get selectedIndex() {
163
- return _state.selectedIndex;
27
+ return selectedIndex;
164
28
  },
165
- get tabs() {
166
- return _state.tabs;
29
+ get defaultIndex() {
30
+ return defaultIndex;
167
31
  },
168
- get panels() {
169
- return _state.panels;
32
+ change: (index) => {
33
+ if (realSelectedIndex !== index) {
34
+ onchange?.(index);
35
+ }
36
+ if (!isControlled) {
37
+ _state.selectedIndex = index;
38
+ }
170
39
  }
171
- };
40
+ });
41
+ const isControlled = $derived(_state.info.isControlled);
172
42
  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
- }
43
+ const slot = $derived({
44
+ selectedIndex: _state.selectedIndex
209
45
  });
46
+ const stableTabs = $derived(_state.tabs);
210
47
  $effect(() => {
211
48
  const newSelectedIndex = selectedIndex ?? defaultIndex;
212
- untrack(() => _state.setSelectedIndex(newSelectedIndex));
49
+ untrack(() => _state.selectedIndex = newSelectedIndex);
213
50
  });
214
51
  $effect(() => {
215
52
  if (realSelectedIndex === void 0) return;
@@ -217,16 +54,16 @@ $effect(() => {
217
54
  let sorted = sortByDomNode(_state.tabs, (tab) => tab.current ?? null);
218
55
  let didOrderChange = sorted.some((tab, i) => _state.tabs[i] !== tab);
219
56
  if (didOrderChange) {
220
- change(sorted.findIndex((tab) => tab === _state.tabs[realSelectedIndex]));
57
+ _state.change(sorted.findIndex((tab) => tab === _state.tabs[realSelectedIndex]));
221
58
  }
222
59
  });
223
60
  </script>
224
61
 
225
62
  <StableCollection>
226
- {#if tabsData.tabs.length <= 0}
63
+ {#if _state.tabs.length <= 0}
227
64
  <FocusSentinel
228
65
  onfocus={() => {
229
- for (let tab of stableTabs) {
66
+ for (const tab of stableTabs) {
230
67
  if (tab?.current?.tabIndex === 0) {
231
68
  tab?.current?.focus()
232
69
  return true
@@ -237,5 +74,5 @@ $effect(() => {
237
74
  }}
238
75
  />
239
76
  {/if}
240
- <ElementOrComponent {theirProps} defaultTag={DEFAULT_TABS_TAG} name="TabGroup" bind:ref />
77
+ <ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_TABS_TAG} name="TabGroup" bind:ref />
241
78
  </StableCollection>
@@ -11,44 +11,24 @@ 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" | "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;
17
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "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;
22
+ class?: string | ((bag: TabsRenderPropArg) => string) | null | undefined;
39
23
  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
- } : {}) & {
24
+ } & {
43
25
  defaultIndex?: number;
44
26
  onchange?: (index: number) => void;
45
27
  selectedIndex?: number;
46
28
  vertical?: boolean;
47
29
  manual?: boolean;
48
30
  };
49
- events(): {} & {
50
- [evt: string]: CustomEvent<any>;
51
- };
31
+ events(): {};
52
32
  slots(): {};
53
33
  bindings(): "ref";
54
34
  exports(): {};
@@ -57,9 +37,7 @@ interface $$IsomorphicComponent {
57
37
  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
38
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
59
39
  } & 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']>;
40
+ <TTag extends ElementType = typeof DEFAULT_TABS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
63
41
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
64
42
  }
65
43
  declare const TabGroup: $$IsomorphicComponent;
@@ -1,10 +1,10 @@
1
1
  <script lang="ts" module>const DEFAULT_LIST_TAG = "div";
2
2
  </script>
3
3
 
4
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LIST_TAG">import { useData } from "./TabGroup.svelte";
5
- import ElementOrComponent from "../utils/ElementOrComponent.svelte";
6
- const data = useData("Tab.List");
7
- const { orientation, selectedIndex } = $derived(data);
4
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_LIST_TAG">import ElementOrComponent from "../utils/ElementOrComponent.svelte";
5
+ import { useTabs } from "./context.svelte.js";
6
+ const context = useTabs("TabList");
7
+ const { orientation, selectedIndex } = $derived(context);
8
8
  const slot = $derived({ selectedIndex });
9
9
  let { ref = $bindable(), ...theirProps } = $props();
10
10
  const ourProps = $derived({
@@ -8,15 +8,15 @@ 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" | "refName" | "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("../utils/types.js").Children<ListRenderPropArg> | undefined;
11
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | 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;
16
+ class?: string | ((bag: ListRenderPropArg) => string) | null | undefined;
13
17
  ref?: HTMLElement;
14
- } & (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) ? {
15
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: ListRenderPropArg) => string) | undefined;
16
- } : {});
17
- events(): {} & {
18
- [evt: string]: CustomEvent<any>;
19
18
  };
19
+ events(): {};
20
20
  slots(): {};
21
21
  bindings(): "ref";
22
22
  exports(): {};
@@ -25,9 +25,7 @@ interface $$IsomorphicComponent {
25
25
  new <TTag extends ElementType = typeof DEFAULT_LIST_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']>> & {
26
26
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
27
27
  } & ReturnType<__sveltets_Render<TTag>['exports']>;
28
- <TTag extends ElementType = typeof DEFAULT_LIST_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
29
- $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
30
- }): ReturnType<__sveltets_Render<TTag>['exports']>;
28
+ <TTag extends ElementType = typeof DEFAULT_LIST_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
31
29
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
32
30
  }
33
31
  declare const TabList: $$IsomorphicComponent;
@@ -4,12 +4,12 @@ const PanelRenderFeatures = RenderFeatures.RenderStrategy | RenderFeatures.Stati
4
4
 
5
5
  <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_PANEL_TAG">import { useId } from "../hooks/use-id.js";
6
6
  import { mergeProps, RenderFeatures } from "../utils/render.js";
7
- import { useActions, useData } from "./TabGroup.svelte";
8
7
  import { useStableCollectionIndex } from "../utils/StableCollection.svelte";
9
8
  import { useFocusRing } from "../hooks/use-focus-ring.svelte.js";
10
9
  import Hidden from "../internal/Hidden.svelte";
11
10
  import { onMount } from "svelte";
12
11
  import ElementOrComponent from "../utils/ElementOrComponent.svelte";
12
+ import { useTabs } from "./context.svelte.js";
13
13
  const internalId = useId();
14
14
  let {
15
15
  ref = $bindable(),
@@ -17,11 +17,10 @@ let {
17
17
  tabIndex = 0,
18
18
  ...theirProps
19
19
  } = $props();
20
- const data = useData("Tab.Panel");
21
- const { selectedIndex, tabs, panels } = $derived(data);
22
- const actions = useActions("Tab.Panel");
20
+ const context = useTabs("TabPanel");
21
+ const { selectedIndex, tabs, panels, registerPanel } = $derived(context);
23
22
  const panelRef = $derived({ current: ref });
24
- onMount(() => actions.registerPanel(panelRef));
23
+ onMount(() => registerPanel(panelRef));
25
24
  const mySSRIndex = useStableCollectionIndex("panels");
26
25
  const myIndex = $derived.by(() => {
27
26
  const index = tabs.findIndex((panel) => panel === panelRef);
@@ -14,21 +14,21 @@ 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" | "refName" | "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("../utils/types.js").Children<PanelRenderPropArg> | undefined;
17
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("slot" | "as" | "children" | "class" | "ref") | "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;
22
+ class?: string | ((bag: PanelRenderPropArg) => string) | null | undefined;
19
23
  ref?: HTMLElement;
20
- } & (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) ? {
21
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: PanelRenderPropArg) => string) | undefined;
22
- } : {}) & {
24
+ } & {
23
25
  static?: boolean | undefined;
24
26
  unmount?: boolean | undefined;
25
27
  } & {
26
28
  id?: string;
27
29
  tabIndex?: number;
28
30
  };
29
- events(): {} & {
30
- [evt: string]: CustomEvent<any>;
31
- };
31
+ events(): {};
32
32
  slots(): {};
33
33
  bindings(): "ref";
34
34
  exports(): {};
@@ -37,9 +37,7 @@ interface $$IsomorphicComponent {
37
37
  new <TTag extends ElementType = typeof DEFAULT_PANEL_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']>> & {
38
38
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
39
39
  } & ReturnType<__sveltets_Render<TTag>['exports']>;
40
- <TTag extends ElementType = typeof DEFAULT_PANEL_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
41
- $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
42
- }): ReturnType<__sveltets_Render<TTag>['exports']>;
40
+ <TTag extends ElementType = typeof DEFAULT_PANEL_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
43
41
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
44
42
  }
45
43
  declare const TabPanel: $$IsomorphicComponent;
@@ -1,10 +1,10 @@
1
1
  <script lang="ts" module>import ElementOrComponent from "../utils/ElementOrComponent.svelte";
2
- import { useData } from "./TabGroup.svelte";
2
+ import { useTabs } from "./context.svelte.js";
3
3
  let DEFAULT_PANELS_TAG = "div";
4
4
  </script>
5
5
 
6
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_PANELS_TAG">const data = useData("Tab.Panels");
7
- const { selectedIndex } = $derived(data);
6
+ <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_PANELS_TAG">const context = useTabs("TabPanels");
7
+ const { selectedIndex } = $derived(context);
8
8
  const slot = $derived({ selectedIndex });
9
9
  let { ref = $bindable(), ...theirProps } = $props();
10
10
  </script>
@@ -7,15 +7,15 @@ 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" | "refName" | "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("../utils/types.js").Children<PanelsRenderPropArg> | undefined;
10
+ } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, "slot" | "as" | "children" | "class" | "ref"> 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;
15
+ class?: string | ((bag: PanelsRenderPropArg) => string) | null | undefined;
12
16
  ref?: HTMLElement;
13
- } & (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) ? {
14
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: PanelsRenderPropArg) => string) | undefined;
15
- } : {});
16
- events(): {} & {
17
- [evt: string]: CustomEvent<any>;
18
17
  };
18
+ events(): {};
19
19
  slots(): {};
20
20
  bindings(): "ref";
21
21
  exports(): {};
@@ -24,9 +24,7 @@ interface $$IsomorphicComponent {
24
24
  new <TTag extends ElementType = typeof DEFAULT_PANELS_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']>> & {
25
25
  $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
26
26
  } & ReturnType<__sveltets_Render<TTag>['exports']>;
27
- <TTag extends ElementType = typeof DEFAULT_PANELS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
28
- $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
29
- }): ReturnType<__sveltets_Render<TTag>['exports']>;
27
+ <TTag extends ElementType = typeof DEFAULT_PANELS_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {}): ReturnType<__sveltets_Render<TTag>['exports']>;
30
28
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
31
29
  }
32
30
  declare const TabPanels: $$IsomorphicComponent;
@@ -0,0 +1,31 @@
1
+ import type { MutableRefObject } from "../utils/ref.svelte.js";
2
+ export declare enum Direction {
3
+ Forwards = 0,
4
+ Backwards = 1
5
+ }
6
+ export declare enum Ordering {
7
+ Less = -1,
8
+ Equal = 0,
9
+ Greater = 1
10
+ }
11
+ export type TabsContext = {
12
+ info: {
13
+ isControlled: boolean;
14
+ };
15
+ selectedIndex: number;
16
+ orientation: "horizontal" | "vertical";
17
+ activation: "manual" | "auto";
18
+ tabs: MutableRefObject<HTMLElement | undefined>[];
19
+ panels: MutableRefObject<HTMLElement | undefined>[];
20
+ registerTab: (tab: MutableRefObject<HTMLElement | undefined>) => () => void;
21
+ registerPanel: (panel: MutableRefObject<HTMLElement | undefined>) => () => void;
22
+ change: (index: number) => void;
23
+ };
24
+ export declare function useTabs(component: string): TabsContext;
25
+ export declare const createTabContext: (props: {
26
+ vertical: boolean;
27
+ manual: boolean;
28
+ selectedIndex: number | undefined;
29
+ defaultIndex: number;
30
+ change: (index: number) => void;
31
+ }) => TabsContext;