@pzerelles/headlessui-svelte 2.1.2-next.4 → 2.1.2-next.40

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 (252) hide show
  1. package/dist/button/Button.svelte +15 -18
  2. package/dist/button/Button.svelte.d.ts +8 -36
  3. package/dist/button/index.d.ts +1 -1
  4. package/dist/button/index.js +1 -1
  5. package/dist/checkbox/Checkbox.svelte +30 -26
  6. package/dist/checkbox/Checkbox.svelte.d.ts +17 -38
  7. package/dist/checkbox/index.d.ts +1 -1
  8. package/dist/checkbox/index.js +1 -1
  9. package/dist/close-button/CloseButton.svelte +4 -7
  10. package/dist/close-button/CloseButton.svelte.d.ts +3 -46
  11. package/dist/close-button/index.d.ts +1 -0
  12. package/dist/close-button/index.js +1 -0
  13. package/dist/data-interactive/DataInteractive.svelte +6 -22
  14. package/dist/data-interactive/DataInteractive.svelte.d.ts +9 -34
  15. package/dist/data-interactive/index.d.ts +1 -1
  16. package/dist/data-interactive/index.js +1 -1
  17. package/dist/description/Description.svelte +28 -23
  18. package/dist/description/Description.svelte.d.ts +9 -30
  19. package/dist/description/context.svelte.js +14 -16
  20. package/dist/description/index.d.ts +1 -1
  21. package/dist/dialog/Dialog.svelte +315 -31
  22. package/dist/dialog/Dialog.svelte.d.ts +7 -45
  23. package/dist/dialog/DialogBackdrop.svelte +11 -14
  24. package/dist/dialog/DialogBackdrop.svelte.d.ts +8 -33
  25. package/dist/dialog/DialogPanel.svelte +23 -19
  26. package/dist/dialog/DialogPanel.svelte.d.ts +8 -34
  27. package/dist/dialog/DialogTitle.svelte +17 -8
  28. package/dist/dialog/DialogTitle.svelte.d.ts +9 -30
  29. package/dist/dialog/context.svelte.js +2 -2
  30. package/dist/dialog/index.d.ts +4 -4
  31. package/dist/dialog/index.js +4 -4
  32. package/dist/field/Field.svelte +27 -26
  33. package/dist/field/Field.svelte.d.ts +7 -34
  34. package/dist/field/index.d.ts +1 -1
  35. package/dist/fieldset/Fieldset.svelte +14 -20
  36. package/dist/fieldset/Fieldset.svelte.d.ts +8 -35
  37. package/dist/fieldset/index.d.ts +1 -1
  38. package/dist/focus-trap/FocusTrap.svelte +30 -54
  39. package/dist/focus-trap/FocusTrap.svelte.d.ts +10 -52
  40. package/dist/focus-trap/FocusTrapFeatures.d.ts +14 -0
  41. package/dist/focus-trap/FocusTrapFeatures.js +15 -0
  42. package/dist/hooks/use-controllable.svelte.js +2 -1
  43. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  44. package/dist/hooks/use-disabled.d.ts +6 -1
  45. package/dist/hooks/use-disabled.js +10 -5
  46. package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
  47. package/dist/hooks/use-event-listener.svelte.js +3 -1
  48. package/dist/hooks/use-inert-others.svelte.js +10 -10
  49. package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
  50. package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
  51. package/dist/hooks/use-root-containers.svelte.js +5 -5
  52. package/dist/hooks/use-tab-direction.svelte.js +1 -1
  53. package/dist/index.d.ts +5 -2
  54. package/dist/index.js +5 -2
  55. package/dist/input/Input.svelte +28 -21
  56. package/dist/input/Input.svelte.d.ts +16 -33
  57. package/dist/input/index.d.ts +1 -1
  58. package/dist/input/index.js +1 -1
  59. package/dist/internal/FloatingProvider.svelte +17 -0
  60. package/dist/internal/FloatingProvider.svelte.d.ts +8 -0
  61. package/dist/internal/FocusSentinel.svelte +33 -32
  62. package/dist/internal/FocusSentinel.svelte.d.ts +4 -18
  63. package/dist/internal/ForcePortalRoot.svelte.d.ts +4 -18
  64. package/dist/internal/FormFields.svelte +18 -13
  65. package/dist/internal/FormFields.svelte.d.ts +4 -18
  66. package/dist/internal/FormFieldsProvider.svelte +17 -0
  67. package/dist/internal/FormFieldsProvider.svelte.d.ts +7 -0
  68. package/dist/internal/FormResolver.svelte +6 -2
  69. package/dist/internal/FormResolver.svelte.d.ts +4 -18
  70. package/dist/internal/Hidden.svelte +10 -10
  71. package/dist/internal/Hidden.svelte.d.ts +6 -33
  72. package/dist/internal/MainTreeProvider.svelte +1 -1
  73. package/dist/internal/MainTreeProvider.svelte.d.ts +4 -18
  74. package/dist/internal/Portal.svelte.d.ts +4 -18
  75. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  76. package/dist/internal/floating-provider.svelte.js +206 -0
  77. package/dist/internal/floating.svelte.d.ts +46 -22
  78. package/dist/internal/floating.svelte.js +90 -272
  79. package/dist/internal/form-fields.svelte.d.ts +10 -0
  80. package/dist/internal/form-fields.svelte.js +23 -0
  81. package/dist/label/Label.svelte +17 -13
  82. package/dist/label/Label.svelte.d.ts +8 -33
  83. package/dist/label/context.svelte.js +1 -1
  84. package/dist/label/index.d.ts +1 -1
  85. package/dist/legend/Legend.svelte +21 -15
  86. package/dist/legend/Legend.svelte.d.ts +9 -34
  87. package/dist/listbox/Listbox.svelte +79 -163
  88. package/dist/listbox/Listbox.svelte.d.ts +16 -101
  89. package/dist/listbox/ListboxButton.svelte +24 -29
  90. package/dist/listbox/ListboxButton.svelte.d.ts +8 -38
  91. package/dist/listbox/ListboxOption.svelte +33 -27
  92. package/dist/listbox/ListboxOption.svelte.d.ts +16 -32
  93. package/dist/listbox/ListboxOptions.svelte +126 -73
  94. package/dist/listbox/ListboxOptions.svelte.d.ts +8 -43
  95. package/dist/listbox/ListboxSelectedOption.svelte +24 -26
  96. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -39
  97. package/dist/listbox/context.svelte.d.ts +76 -0
  98. package/dist/listbox/context.svelte.js +36 -0
  99. package/dist/listbox/index.d.ts +5 -5
  100. package/dist/listbox/index.js +4 -4
  101. package/dist/menu/Menu.svelte +22 -266
  102. package/dist/menu/Menu.svelte.d.ts +7 -37
  103. package/dist/menu/MenuButton.svelte +22 -24
  104. package/dist/menu/MenuButton.svelte.d.ts +8 -39
  105. package/dist/menu/MenuHeading.svelte +12 -16
  106. package/dist/menu/MenuHeading.svelte.d.ts +7 -36
  107. package/dist/menu/MenuItem.svelte +18 -23
  108. package/dist/menu/MenuItem.svelte.d.ts +9 -39
  109. package/dist/menu/MenuItems.svelte +33 -34
  110. package/dist/menu/MenuItems.svelte.d.ts +8 -43
  111. package/dist/menu/MenuSection.svelte +9 -12
  112. package/dist/menu/MenuSection.svelte.d.ts +7 -33
  113. package/dist/menu/MenuSeparator.svelte +9 -12
  114. package/dist/menu/MenuSeparator.svelte.d.ts +7 -33
  115. package/dist/menu/context.svelte.d.ts +2 -1
  116. package/dist/menu/context.svelte.js +212 -2
  117. package/dist/menu/index.d.ts +7 -7
  118. package/dist/menu/index.js +3 -3
  119. package/dist/popover/Popover.svelte +225 -0
  120. package/dist/popover/Popover.svelte.d.ts +15 -0
  121. package/dist/popover/PopoverBackdrop.svelte +83 -0
  122. package/dist/popover/PopoverBackdrop.svelte.d.ts +17 -0
  123. package/dist/popover/PopoverButton.svelte +324 -0
  124. package/dist/popover/PopoverButton.svelte.d.ts +21 -0
  125. package/dist/popover/PopoverGroup.svelte +66 -0
  126. package/dist/popover/PopoverGroup.svelte.d.ts +9 -0
  127. package/dist/popover/PopoverPanel.svelte +359 -0
  128. package/dist/popover/PopoverPanel.svelte.d.ts +22 -0
  129. package/dist/popover/context.svelte.d.ts +51 -0
  130. package/dist/popover/context.svelte.js +108 -0
  131. package/dist/popover/index.d.ts +5 -0
  132. package/dist/popover/index.js +5 -0
  133. package/dist/portal/InternalPortal.svelte +17 -17
  134. package/dist/portal/InternalPortal.svelte.d.ts +6 -33
  135. package/dist/portal/Portal.svelte +7 -6
  136. package/dist/portal/Portal.svelte.d.ts +3 -22
  137. package/dist/portal/PortalGroup.svelte +6 -14
  138. package/dist/portal/PortalGroup.svelte.d.ts +5 -34
  139. package/dist/radio-group/Radio.svelte +135 -0
  140. package/dist/radio-group/Radio.svelte.d.ts +35 -0
  141. package/dist/radio-group/RadioGroup.svelte +223 -0
  142. package/dist/radio-group/RadioGroup.svelte.d.ts +34 -0
  143. package/dist/radio-group/RadioOption.svelte +138 -0
  144. package/dist/radio-group/RadioOption.svelte.d.ts +37 -0
  145. package/dist/radio-group/contest.svelte.d.ts +30 -0
  146. package/dist/radio-group/contest.svelte.js +40 -0
  147. package/dist/radio-group/index.d.ts +3 -0
  148. package/dist/radio-group/index.js +3 -0
  149. package/dist/select/Select.svelte +103 -0
  150. package/dist/select/Select.svelte.d.ts +21 -0
  151. package/dist/select/index.d.ts +1 -0
  152. package/dist/select/index.js +1 -0
  153. package/dist/switch/Switch.svelte +27 -28
  154. package/dist/switch/Switch.svelte.d.ts +9 -42
  155. package/dist/switch/SwitchGroup.svelte +5 -5
  156. package/dist/switch/SwitchGroup.svelte.d.ts +8 -30
  157. package/dist/switch/index.d.ts +1 -1
  158. package/dist/switch/index.js +1 -1
  159. package/dist/tabs/Tab.svelte +26 -29
  160. package/dist/tabs/Tab.svelte.d.ts +8 -36
  161. package/dist/tabs/TabGroup.svelte +42 -264
  162. package/dist/tabs/TabGroup.svelte.d.ts +7 -57
  163. package/dist/tabs/TabList.svelte +13 -16
  164. package/dist/tabs/TabList.svelte.d.ts +8 -31
  165. package/dist/tabs/TabPanel.svelte +19 -19
  166. package/dist/tabs/TabPanel.svelte.d.ts +8 -38
  167. package/dist/tabs/TabPanels.svelte +11 -9
  168. package/dist/tabs/TabPanels.svelte.d.ts +8 -30
  169. package/dist/tabs/context.svelte.d.ts +31 -0
  170. package/dist/tabs/context.svelte.js +134 -0
  171. package/dist/tabs/index.d.ts +5 -5
  172. package/dist/tabs/index.js +4 -4
  173. package/dist/textarea/Textarea.svelte +23 -19
  174. package/dist/textarea/Textarea.svelte.d.ts +18 -30
  175. package/dist/textarea/index.d.ts +1 -1
  176. package/dist/textarea/index.js +1 -1
  177. package/dist/transition/InternalTransitionChild.svelte +19 -12
  178. package/dist/transition/InternalTransitionChild.svelte.d.ts +4 -35
  179. package/dist/transition/Transition.svelte +16 -17
  180. package/dist/transition/Transition.svelte.d.ts +8 -38
  181. package/dist/transition/TransitionChild.svelte +13 -12
  182. package/dist/transition/TransitionChild.svelte.d.ts +11 -38
  183. package/dist/transition/context.svelte.js +9 -9
  184. package/dist/transition/index.d.ts +2 -2
  185. package/dist/transition/index.js +2 -2
  186. package/dist/utils/DisabledProvider.svelte +10 -0
  187. package/dist/utils/DisabledProvider.svelte.d.ts +8 -0
  188. package/dist/utils/ElementOrComponent.svelte +57 -14
  189. package/dist/utils/ElementOrComponent.svelte.d.ts +19 -29
  190. package/dist/utils/StableCollection.svelte.d.ts +4 -18
  191. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +32 -0
  192. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +8 -0
  193. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +94 -0
  194. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +26 -0
  195. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  196. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  197. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  198. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  199. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  200. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  201. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  202. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  203. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  204. package/dist/utils/floating-ui/svelte/index.js +5 -0
  205. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  206. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  207. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  208. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  209. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  210. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  211. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  212. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  213. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  214. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  215. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  216. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  217. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  218. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  219. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  220. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  221. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  222. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  223. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +182 -0
  224. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  225. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  226. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  227. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  228. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  229. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  230. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  231. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  232. package/dist/utils/id.d.ts +1 -1
  233. package/dist/utils/id.js +1 -1
  234. package/dist/utils/index.d.ts +3 -0
  235. package/dist/utils/index.js +3 -0
  236. package/dist/utils/state.js +4 -4
  237. package/dist/utils/style.d.ts +2 -0
  238. package/dist/utils/style.js +6 -0
  239. package/dist/utils/types.d.ts +12 -18
  240. package/package.json +33 -32
  241. package/dist/combobox/Combobox.svelte +0 -53
  242. package/dist/combobox/Combobox.svelte.d.ts +0 -50
  243. package/dist/dialog/InternalDialog.svelte +0 -294
  244. package/dist/dialog/InternalDialog.svelte.d.ts +0 -42
  245. package/dist/internal/HoistFormFields.svelte +0 -14
  246. package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
  247. package/dist/internal/id.d.ts +0 -8
  248. package/dist/internal/id.js +0 -11
  249. package/dist/utils/Generic.svelte +0 -56
  250. package/dist/utils/Generic.svelte.d.ts +0 -35
  251. package/dist/utils/alternative-types.d.ts +0 -21
  252. /package/dist/utils/{alternative-types.js → floating-ui/svelte/types.js} +0 -0
@@ -1,8 +1,8 @@
1
1
  <script lang="ts" module>
2
- import type { ElementType, Props } from "../utils/types.js"
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 TabProps<TTag extends ElementType = typeof DEFAULT_TAB_TAG> = Props<
16
- TTag,
17
- TabRenderPropArg,
18
- TabPropsWeControl,
19
- {
20
- id?: string
21
- autofocus?: boolean
22
- disabled?: boolean
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" generics="TTag extends ElementType = typeof DEFAULT_TAB_TAG">
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
- ref = $bindable(),
44
+ element = $bindable(),
47
45
  id = `headlessui-tabs-tab-${internalId}`,
48
46
  disabled = false,
49
47
  autofocus = false,
50
48
  ...theirProps
51
- }: { as?: TTag } & TabProps<TTag> = $props()
49
+ }: TabProps = $props()
52
50
 
53
- const data = useData("Tab")
54
- const { orientation, activation, selectedIndex, tabs, panels } = $derived(data)
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: ref })
54
+ const tabRef = $derived<MutableRefObject<HTMLElement | undefined>>({ current: element })
58
55
 
59
- onMount(() => actions.registerTab(tabRef))
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(ref)?.activeElement
73
- let idx = data.tabs.findIndex((tab) => tab.current === newTab)
74
- if (idx !== -1) actions.change(idx)
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
- actions.change(myIndex)
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
- ref?.focus({ preventScroll: true })
132
- actions.change(myIndex)
128
+ element?.focus({ preventScroll: true })
129
+ change(myIndex)
133
130
 
134
131
  microTask(() => {
135
132
  ready = false
@@ -176,7 +173,7 @@
176
173
 
177
174
  const resolvedType = useResolveButtonType({
178
175
  get props() {
179
- return { type: theirProps.type, as: theirProps.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
@@ -205,4 +202,4 @@
205
202
  )
206
203
  </script>
207
204
 
208
- <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_TAB_TAG} name="Tab" bind:ref />
205
+ <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_TAB_TAG} name="Tab" bind:element />
@@ -1,6 +1,6 @@
1
- import type { ElementType, Props } from "../utils/types.js";
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 TabPropsWeControl = "aria-controls" | "aria-selected" | "role" | "tabIndex";
12
- export type TabProps<TTag extends ElementType = typeof DEFAULT_TAB_TAG> = Props<TTag, TabRenderPropArg, TabPropsWeControl, {
11
+ export type TabOwnProps = {
12
+ element?: HTMLElement;
13
13
  id?: string;
14
14
  autofocus?: boolean;
15
15
  disabled?: boolean;
16
- }>;
17
- declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_TAB_TAG> {
18
- props(): {
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;
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 { ElementType, Props } from "../utils/types.js"
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 TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<
15
- TTag,
16
- TabsRenderPropArg,
17
- TabsPropsWeControl,
18
- {
19
- defaultIndex?: number
20
- onchange?: (index: number) => void
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 function useData(component: string) {
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" generics="TTag extends ElementType = typeof DEFAULT_TABS_TAG">
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
- enum Direction {
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
- ref = $bindable(),
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
- }: { as?: TTag } & TabGroupProps<TTag> = $props()
207
- const orientation = $derived(vertical ? "vertical" : "horizontal")
208
- const activation = $derived(manual ? "manual" : "auto")
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 info() {
235
- return _state.info
43
+ get manual() {
44
+ return manual
236
45
  },
237
46
  get selectedIndex() {
238
- return _state.selectedIndex
47
+ return selectedIndex
239
48
  },
240
- get tabs() {
241
- return _state.tabs
49
+ get defaultIndex() {
50
+ return defaultIndex
242
51
  },
243
- get panels() {
244
- return _state.panels
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 registerTab = (tab: MutableRefObject<HTMLElement | undefined>) => {
251
- _state.registerTab(tab)
252
- return () => _state.unregisterTab(tab)
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.setSelectedIndex(newSelectedIndex))
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 tabsData.tabs.length <= 0}
91
+ {#if _state.tabs.length <= 0}
314
92
  <FocusSentinel
315
93
  onfocus={() => {
316
- for (let tab of stableTabs) {
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:ref />
105
+ <ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_TABS_TAG} name="TabGroup" bind:element />
328
106
  </StableCollection>
@@ -1,67 +1,17 @@
1
- import type { ElementType, Props } from "../utils/types.js";
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 TabsPropsWeControl = never;
7
- export type TabGroupProps<TTag extends ElementType = typeof DEFAULT_TABS_TAG> = Props<TTag, TabsRenderPropArg, TabsPropsWeControl, {
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 declare function useActions(component: string): TabsActionsContext;
33
- import type { MutableRefObject } from "../utils/ref.svelte.js";
34
- declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_TABS_TAG> {
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;
@@ -1,36 +1,33 @@
1
1
  <script lang="ts" module>
2
- import type { ElementType, Props } from "../utils/types.js"
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 TabListProps<TTag extends ElementType = typeof DEFAULT_LIST_TAG> = Props<
11
- TTag,
12
- ListRenderPropArg,
13
- ListPropsWeControl,
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" generics="TTag extends ElementType = typeof DEFAULT_LIST_TAG">
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 data = useData("Tab.List")
25
- const { orientation, selectedIndex } = $derived(data)
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 { ref = $bindable(), ...theirProps }: { as?: TTag } & TabListProps<TTag> = $props()
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:ref />
33
+ <ElementOrComponent {ourProps} {theirProps} {slot} defaultTag={DEFAULT_LIST_TAG} name="TabList" bind:element />