@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.
Files changed (270) hide show
  1. package/dist/button/Button.svelte +16 -19
  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 +31 -27
  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 +29 -24
  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 +25 -30
  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 +30 -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/InternalDialog.svelte +38 -34
  30. package/dist/dialog/InternalDialog.svelte.d.ts +3 -41
  31. package/dist/dialog/context.svelte.js +2 -2
  32. package/dist/dialog/index.d.ts +4 -4
  33. package/dist/dialog/index.js +4 -4
  34. package/dist/disclosure/Disclosure.svelte +61 -0
  35. package/dist/disclosure/Disclosure.svelte.d.ts +14 -0
  36. package/dist/disclosure/DisclosureButton.svelte +191 -0
  37. package/dist/disclosure/DisclosureButton.svelte.d.ts +19 -0
  38. package/dist/disclosure/DisclosurePanel.svelte +99 -0
  39. package/dist/disclosure/DisclosurePanel.svelte.d.ts +16 -0
  40. package/dist/disclosure/context.svelte.d.ts +32 -0
  41. package/dist/disclosure/context.svelte.js +94 -0
  42. package/dist/disclosure/index.d.ts +3 -0
  43. package/dist/disclosure/index.js +3 -0
  44. package/dist/field/Field.svelte +27 -26
  45. package/dist/field/Field.svelte.d.ts +7 -34
  46. package/dist/field/index.d.ts +1 -1
  47. package/dist/fieldset/Fieldset.svelte +21 -20
  48. package/dist/fieldset/Fieldset.svelte.d.ts +8 -35
  49. package/dist/fieldset/index.d.ts +1 -1
  50. package/dist/focus-trap/FocusTrap.svelte +29 -36
  51. package/dist/focus-trap/FocusTrap.svelte.d.ts +8 -38
  52. package/dist/hooks/use-controllable.svelte.js +3 -2
  53. package/dist/hooks/use-did-element-move.svelte.js +5 -10
  54. package/dist/hooks/use-disabled.d.ts +6 -1
  55. package/dist/hooks/use-disabled.js +10 -5
  56. package/dist/hooks/use-element-size.svelte.js +1 -1
  57. package/dist/hooks/use-event-listener.svelte.d.ts +1 -1
  58. package/dist/hooks/use-event-listener.svelte.js +3 -1
  59. package/dist/hooks/use-focus-ring.svelte.js +1 -1
  60. package/dist/hooks/use-inert-others.svelte.js +10 -10
  61. package/dist/hooks/use-is-top-layer.svelte.js +2 -2
  62. package/dist/hooks/use-resolve-button-type.svelte.js +0 -1
  63. package/dist/hooks/use-root-containers.svelte.d.ts +2 -2
  64. package/dist/hooks/use-root-containers.svelte.js +7 -6
  65. package/dist/hooks/use-tab-direction.svelte.js +1 -1
  66. package/dist/hooks/use-transition.svelte.d.ts +1 -0
  67. package/dist/hooks/use-transition.svelte.js +32 -7
  68. package/dist/index.d.ts +11 -2
  69. package/dist/index.js +11 -2
  70. package/dist/input/Input.svelte +28 -21
  71. package/dist/input/Input.svelte.d.ts +16 -33
  72. package/dist/input/index.d.ts +1 -1
  73. package/dist/input/index.js +1 -1
  74. package/dist/internal/FloatingProvider.svelte +17 -0
  75. package/dist/internal/FloatingProvider.svelte.d.ts +8 -0
  76. package/dist/internal/FocusSentinel.svelte +33 -32
  77. package/dist/internal/FocusSentinel.svelte.d.ts +4 -18
  78. package/dist/internal/ForcePortalRoot.svelte.d.ts +4 -18
  79. package/dist/internal/FormFields.svelte +18 -13
  80. package/dist/internal/FormFields.svelte.d.ts +4 -18
  81. package/dist/internal/FormFieldsProvider.svelte +17 -0
  82. package/dist/internal/FormFieldsProvider.svelte.d.ts +7 -0
  83. package/dist/internal/FormResolver.svelte +6 -2
  84. package/dist/internal/FormResolver.svelte.d.ts +4 -18
  85. package/dist/internal/Hidden.svelte +10 -10
  86. package/dist/internal/Hidden.svelte.d.ts +6 -33
  87. package/dist/internal/MainTreeProvider.svelte +2 -2
  88. package/dist/internal/MainTreeProvider.svelte.d.ts +4 -18
  89. package/dist/internal/Portal.svelte.d.ts +4 -18
  90. package/dist/internal/floating-provider.svelte.d.ts +3 -0
  91. package/dist/internal/floating-provider.svelte.js +206 -0
  92. package/dist/internal/floating.svelte.d.ts +47 -23
  93. package/dist/internal/floating.svelte.js +90 -272
  94. package/dist/internal/form-fields.svelte.d.ts +10 -0
  95. package/dist/internal/form-fields.svelte.js +23 -0
  96. package/dist/internal/frozen.svelte.js +1 -1
  97. package/dist/label/Label.svelte +15 -11
  98. package/dist/label/Label.svelte.d.ts +8 -33
  99. package/dist/label/context.svelte.js +1 -1
  100. package/dist/label/index.d.ts +1 -1
  101. package/dist/legend/Legend.svelte +22 -15
  102. package/dist/legend/Legend.svelte.d.ts +10 -34
  103. package/dist/listbox/Listbox.svelte +79 -151
  104. package/dist/listbox/Listbox.svelte.d.ts +16 -91
  105. package/dist/listbox/ListboxButton.svelte +31 -29
  106. package/dist/listbox/ListboxButton.svelte.d.ts +8 -38
  107. package/dist/listbox/ListboxOption.svelte +40 -27
  108. package/dist/listbox/ListboxOption.svelte.d.ts +16 -32
  109. package/dist/listbox/ListboxOptions.svelte +126 -72
  110. package/dist/listbox/ListboxOptions.svelte.d.ts +8 -43
  111. package/dist/listbox/ListboxSelectedOption.svelte +24 -26
  112. package/dist/listbox/ListboxSelectedOption.svelte.d.ts +14 -39
  113. package/dist/listbox/context.svelte.d.ts +76 -0
  114. package/dist/listbox/context.svelte.js +36 -0
  115. package/dist/listbox/index.d.ts +5 -5
  116. package/dist/listbox/index.js +4 -4
  117. package/dist/menu/Menu.svelte +22 -266
  118. package/dist/menu/Menu.svelte.d.ts +7 -37
  119. package/dist/menu/MenuButton.svelte +29 -24
  120. package/dist/menu/MenuButton.svelte.d.ts +8 -39
  121. package/dist/menu/MenuHeading.svelte +12 -16
  122. package/dist/menu/MenuHeading.svelte.d.ts +7 -36
  123. package/dist/menu/MenuItem.svelte +18 -23
  124. package/dist/menu/MenuItem.svelte.d.ts +9 -39
  125. package/dist/menu/MenuItems.svelte +33 -34
  126. package/dist/menu/MenuItems.svelte.d.ts +8 -43
  127. package/dist/menu/MenuSection.svelte +9 -12
  128. package/dist/menu/MenuSection.svelte.d.ts +7 -33
  129. package/dist/menu/MenuSeparator.svelte +9 -12
  130. package/dist/menu/MenuSeparator.svelte.d.ts +7 -33
  131. package/dist/menu/context.svelte.d.ts +2 -1
  132. package/dist/menu/context.svelte.js +212 -2
  133. package/dist/menu/index.d.ts +7 -7
  134. package/dist/menu/index.js +3 -3
  135. package/dist/popover/Popover.svelte +231 -0
  136. package/dist/popover/Popover.svelte.d.ts +15 -0
  137. package/dist/popover/PopoverBackdrop.svelte +83 -0
  138. package/dist/popover/PopoverBackdrop.svelte.d.ts +17 -0
  139. package/dist/popover/PopoverButton.svelte +324 -0
  140. package/dist/popover/PopoverButton.svelte.d.ts +21 -0
  141. package/dist/popover/PopoverGroup.svelte +66 -0
  142. package/dist/popover/PopoverGroup.svelte.d.ts +9 -0
  143. package/dist/popover/PopoverPanel.svelte +359 -0
  144. package/dist/popover/PopoverPanel.svelte.d.ts +22 -0
  145. package/dist/popover/context.svelte.d.ts +51 -0
  146. package/dist/popover/context.svelte.js +108 -0
  147. package/dist/popover/index.d.ts +5 -0
  148. package/dist/popover/index.js +5 -0
  149. package/dist/portal/InternalPortal.svelte +18 -19
  150. package/dist/portal/InternalPortal.svelte.d.ts +7 -34
  151. package/dist/portal/Portal.svelte +7 -6
  152. package/dist/portal/Portal.svelte.d.ts +3 -22
  153. package/dist/portal/PortalGroup.svelte +6 -14
  154. package/dist/portal/PortalGroup.svelte.d.ts +5 -34
  155. package/dist/portal/PortalWrapper.svelte +10 -0
  156. package/dist/portal/PortalWrapper.svelte.d.ts +9 -0
  157. package/dist/radio-group/Radio.svelte +142 -0
  158. package/dist/radio-group/Radio.svelte.d.ts +35 -0
  159. package/dist/radio-group/RadioGroup.svelte +222 -0
  160. package/dist/radio-group/RadioGroup.svelte.d.ts +34 -0
  161. package/dist/radio-group/RadioOption.svelte +145 -0
  162. package/dist/radio-group/RadioOption.svelte.d.ts +37 -0
  163. package/dist/radio-group/contest.svelte.d.ts +30 -0
  164. package/dist/radio-group/contest.svelte.js +40 -0
  165. package/dist/radio-group/index.d.ts +3 -0
  166. package/dist/radio-group/index.js +3 -0
  167. package/dist/select/Select.svelte +112 -0
  168. package/dist/select/Select.svelte.d.ts +21 -0
  169. package/dist/select/index.d.ts +1 -0
  170. package/dist/select/index.js +1 -0
  171. package/dist/switch/Switch.svelte +27 -28
  172. package/dist/switch/Switch.svelte.d.ts +9 -42
  173. package/dist/switch/SwitchGroup.svelte +5 -5
  174. package/dist/switch/SwitchGroup.svelte.d.ts +8 -30
  175. package/dist/switch/index.d.ts +1 -1
  176. package/dist/switch/index.js +1 -1
  177. package/dist/tabs/Tab.svelte +28 -31
  178. package/dist/tabs/Tab.svelte.d.ts +8 -36
  179. package/dist/tabs/TabGroup.svelte +42 -264
  180. package/dist/tabs/TabGroup.svelte.d.ts +7 -57
  181. package/dist/tabs/TabList.svelte +13 -16
  182. package/dist/tabs/TabList.svelte.d.ts +8 -31
  183. package/dist/tabs/TabPanel.svelte +20 -20
  184. package/dist/tabs/TabPanel.svelte.d.ts +8 -38
  185. package/dist/tabs/TabPanels.svelte +11 -9
  186. package/dist/tabs/TabPanels.svelte.d.ts +8 -30
  187. package/dist/tabs/context.svelte.d.ts +31 -0
  188. package/dist/tabs/context.svelte.js +134 -0
  189. package/dist/tabs/index.d.ts +5 -5
  190. package/dist/tabs/index.js +4 -4
  191. package/dist/textarea/Textarea.svelte +24 -20
  192. package/dist/textarea/Textarea.svelte.d.ts +17 -29
  193. package/dist/textarea/index.d.ts +1 -1
  194. package/dist/textarea/index.js +1 -1
  195. package/dist/transition/InternalTransitionChild.svelte +36 -22
  196. package/dist/transition/InternalTransitionChild.svelte.d.ts +6 -37
  197. package/dist/transition/Transition.svelte +16 -17
  198. package/dist/transition/Transition.svelte.d.ts +8 -38
  199. package/dist/transition/TransitionChild.svelte +13 -12
  200. package/dist/transition/TransitionChild.svelte.d.ts +11 -38
  201. package/dist/transition/context.svelte.js +11 -11
  202. package/dist/transition/index.d.ts +2 -2
  203. package/dist/transition/index.js +2 -2
  204. package/dist/utils/DisabledProvider.svelte +10 -0
  205. package/dist/utils/DisabledProvider.svelte.d.ts +8 -0
  206. package/dist/utils/ElementOrComponent.svelte +58 -17
  207. package/dist/utils/ElementOrComponent.svelte.d.ts +19 -30
  208. package/dist/utils/StableCollection.svelte.d.ts +4 -18
  209. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte +32 -0
  210. package/dist/utils/floating-ui/svelte/components/FloatingNode.svelte.d.ts +8 -0
  211. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte +94 -0
  212. package/dist/utils/floating-ui/svelte/components/FloatingTree.svelte.d.ts +26 -0
  213. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.d.ts +6 -0
  214. package/dist/utils/floating-ui/svelte/hooks/useFloating.svelte.js +158 -0
  215. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.d.ts +11 -0
  216. package/dist/utils/floating-ui/svelte/hooks/useFloatingRootContext.svelte.js +53 -0
  217. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.d.ts +9 -0
  218. package/dist/utils/floating-ui/svelte/hooks/useId.svelte.js +28 -0
  219. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.d.ts +23 -0
  220. package/dist/utils/floating-ui/svelte/hooks/useInteractions.svelte.js +72 -0
  221. package/dist/utils/floating-ui/svelte/index.d.ts +5 -0
  222. package/dist/utils/floating-ui/svelte/index.js +5 -0
  223. package/dist/utils/floating-ui/svelte/inner.svelte.d.ts +83 -0
  224. package/dist/utils/floating-ui/svelte/inner.svelte.js +178 -0
  225. package/dist/utils/floating-ui/svelte/types.d.ts +114 -0
  226. package/dist/utils/floating-ui/svelte/utils/createPubSub.d.ts +5 -0
  227. package/dist/utils/floating-ui/svelte/utils/createPubSub.js +14 -0
  228. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.d.ts +2 -0
  229. package/dist/utils/floating-ui/svelte/utils/getFloatingFocusElement.js +13 -0
  230. package/dist/utils/floating-ui/svelte/utils/log.d.ts +2 -0
  231. package/dist/utils/floating-ui/svelte/utils/log.js +19 -0
  232. package/dist/utils/floating-ui/svelte/utils.d.ts +19 -0
  233. package/dist/utils/floating-ui/svelte/utils.js +136 -0
  234. package/dist/utils/floating-ui/svelte-dom/arrow.d.ts +22 -0
  235. package/dist/utils/floating-ui/svelte-dom/arrow.js +29 -0
  236. package/dist/utils/floating-ui/svelte-dom/index.d.ts +2 -0
  237. package/dist/utils/floating-ui/svelte-dom/index.js +2 -0
  238. package/dist/utils/floating-ui/svelte-dom/types.d.ts +80 -0
  239. package/dist/utils/floating-ui/svelte-dom/types.js +3 -0
  240. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.d.ts +6 -0
  241. package/dist/utils/floating-ui/svelte-dom/useFloating.svelte.js +183 -0
  242. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.d.ts +1 -0
  243. package/dist/utils/floating-ui/svelte-dom/utils/deepEqual.js +50 -0
  244. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.d.ts +1 -0
  245. package/dist/utils/floating-ui/svelte-dom/utils/getDPR.js +7 -0
  246. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.d.ts +1 -0
  247. package/dist/utils/floating-ui/svelte-dom/utils/roundByDPR.js +5 -0
  248. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.d.ts +4 -0
  249. package/dist/utils/floating-ui/svelte-dom/utils/useLatestRef.js +7 -0
  250. package/dist/utils/id.d.ts +1 -1
  251. package/dist/utils/id.js +1 -1
  252. package/dist/utils/index.d.ts +3 -0
  253. package/dist/utils/index.js +3 -0
  254. package/dist/utils/state.js +4 -4
  255. package/dist/utils/style.d.ts +2 -0
  256. package/dist/utils/style.js +6 -0
  257. package/dist/utils/types.d.ts +13 -19
  258. package/package.json +55 -54
  259. package/dist/combobox/Combobox.svelte +0 -53
  260. package/dist/combobox/Combobox.svelte.d.ts +0 -50
  261. package/dist/internal/HoistFormFields.svelte +0 -14
  262. package/dist/internal/HoistFormFields.svelte.d.ts +0 -21
  263. package/dist/internal/id.d.ts +0 -8
  264. package/dist/internal/id.js +0 -11
  265. package/dist/listbox/ListboxStates.d.ts +0 -12
  266. package/dist/listbox/ListboxStates.js +0 -15
  267. package/dist/utils/Generic.svelte +0 -56
  268. package/dist/utils/Generic.svelte.d.ts +0 -35
  269. package/dist/utils/alternative-types.d.ts +0 -21
  270. /package/dist/utils/{alternative-types.js → floating-ui/svelte/types.js} +0 -0
@@ -1,10 +1,9 @@
1
- <script lang="ts" generics="TTag extends ElementType = typeof DEFAULT_DIALOG_TAG">
1
+ <script lang="ts">
2
2
  import { useId } from "../hooks/use-id.js"
3
3
  import { useMainTreeNode, useRootContainers } from "../hooks/use-root-containers.svelte.js"
4
4
  import { clearOpenClosedContext, State, useOpenClosed } from "../internal/open-closed.js"
5
5
  import { useNestedPortals } from "../portal/InternalPortal.svelte"
6
6
  import { getOwnerDocument } from "../utils/owner.js"
7
- import { DEFAULT_DIALOG_TAG, DialogRenderFeatures, type DialogProps, type DialogRenderPropArg } from "./Dialog.svelte"
8
7
  import { useInertOthers } from "../hooks/use-inert-others.svelte.js"
9
8
  import { useOutsideClick } from "../hooks/use-outside-click.svelte.js"
10
9
  import { useEscape } from "../hooks/use-escape.svelte.js"
@@ -18,13 +17,15 @@
18
17
  import ForcePortalRoot from "../internal/ForcePortalRoot.svelte"
19
18
  import { createCloseContext } from "../internal/close-provider.js"
20
19
  import ElementOrComponent from "../utils/ElementOrComponent.svelte"
21
- import type { ElementType } from "../utils/types.js"
22
20
  import { DialogStates, type DialogContext, type StateDefinition } from "./context.svelte.js"
23
21
  import { useDescriptions } from "../description/context.svelte.js"
22
+ import { BROWSER } from "esm-env"
23
+ import { DEFAULT_DIALOG_TAG, DialogRenderFeatures, type DialogProps, type DialogRenderPropArg } from "./Dialog.svelte"
24
+ import PortalWrapper from "../portal/PortalWrapper.svelte"
24
25
 
25
26
  const internalId = useId()
26
27
  let {
27
- ref = $bindable(),
28
+ element = $bindable(),
28
29
  id = `headlessui-dialog-${internalId}`,
29
30
  open: theirOpen,
30
31
  onclose,
@@ -34,7 +35,7 @@
34
35
  __demoMode = false,
35
36
  unmount = false,
36
37
  ...theirProps
37
- }: { as?: TTag } & DialogProps<TTag> = $props()
38
+ }: DialogProps = $props()
38
39
 
39
40
  let didWarnOnRole = $state(false)
40
41
 
@@ -53,15 +54,15 @@
53
54
  return "dialog"
54
55
  })
55
56
 
56
- const usesOpenClosedState = useOpenClosed()
57
57
  // Update the `open` prop based on the open closed state
58
+ const usesOpenClosedState = useOpenClosed()
58
59
  const open = $derived(
59
60
  theirOpen === undefined && usesOpenClosedState !== null
60
61
  ? (usesOpenClosedState.value & State.Open) === State.Open
61
62
  : theirOpen
62
63
  )
63
64
 
64
- const ownerDocument = $derived(getOwnerDocument(ref))
65
+ const ownerDocument = $derived(getOwnerDocument(element))
65
66
 
66
67
  const dialogState = $derived(open ? DialogStates.Open : DialogStates.Closed)
67
68
 
@@ -74,7 +75,8 @@
74
75
 
75
76
  const setTitleId = (id: string | null) => (_state.titleId = id)
76
77
 
77
- const enabled = $derived(dialogState === DialogStates.Open)
78
+ const ready = BROWSER
79
+ const enabled = $derived(ready ? dialogState === DialogStates.Open : false)
78
80
  const nestedPortals = useNestedPortals()
79
81
  const { portals } = $derived(nestedPortals)
80
82
 
@@ -82,11 +84,7 @@
82
84
  // can result in `null` rather then the actual elements
83
85
  // This doesn't happen when using certain components like a
84
86
  // `<Dialog.Title>` because they cause the parent to re-render
85
- const defaultContainer: { readonly current: HTMLElement | undefined } = {
86
- get current() {
87
- return _state.panelRef ?? ref
88
- },
89
- }
87
+ const defaultContainer = $derived(_state.panelRef ?? element)
90
88
 
91
89
  const mainTreeNode = useMainTreeNode()
92
90
  let { resolvedContainers: resolvedRootContainers } = $derived(
@@ -98,7 +96,7 @@
98
96
  return portals
99
97
  },
100
98
  get defaultContainers() {
101
- return defaultContainer.current ? [defaultContainer.current] : []
99
+ return defaultContainer ? [defaultContainer] : []
102
100
  },
103
101
  })
104
102
  )
@@ -123,7 +121,7 @@
123
121
  return [
124
122
  // Allow the headlessui-portal of the Dialog to be interactive. This
125
123
  // contains the current dialog and the necessary focus guard elements.
126
- ref?.closest<HTMLElement>("[data-headlessui-portal]") ?? null,
124
+ element?.closest<HTMLElement>("[data-headlessui-portal]") ?? null,
127
125
  ]
128
126
  },
129
127
  get disallowed() {
@@ -144,6 +142,7 @@
144
142
  return resolvedRootContainers
145
143
  },
146
144
  cb(event) {
145
+ console.log("close")
147
146
  event.preventDefault()
148
147
  close()
149
148
  },
@@ -199,7 +198,7 @@
199
198
  return enabled
200
199
  },
201
200
  get ref() {
202
- return ref
201
+ return element
203
202
  },
204
203
  get ondisappear() {
205
204
  return close
@@ -215,6 +214,9 @@
215
214
  get panelRef() {
216
215
  return _state.panelRef
217
216
  },
217
+ set panelRef(value) {
218
+ _state.panelRef = value
219
+ },
218
220
  get dialogState() {
219
221
  return dialogState
220
222
  },
@@ -269,25 +271,27 @@
269
271
 
270
272
  <ForcePortalRoot force={true}>
271
273
  <Portal>
272
- <PortalGroup target={ref ?? null}>
274
+ <PortalGroup target={element ?? null}>
273
275
  <ForcePortalRoot force={false}>
274
- <FocusTrap
275
- {initialFocus}
276
- initialFocusFallback={ref}
277
- containers={resolvedRootContainers}
278
- features={focusTrapFeatures}
279
- >
280
- <ElementOrComponent
281
- {ourProps}
282
- {theirProps}
283
- slots={slot}
284
- defaultTag={DEFAULT_DIALOG_TAG}
285
- features={DialogRenderFeatures}
286
- visible={dialogState === DialogStates.Open}
287
- name="Dialog"
288
- bind:ref
289
- />
290
- </FocusTrap>
276
+ <PortalWrapper context={nestedPortals}>
277
+ <FocusTrap
278
+ {initialFocus}
279
+ initialFocusFallback={element}
280
+ containers={resolvedRootContainers}
281
+ features={focusTrapFeatures}
282
+ >
283
+ <ElementOrComponent
284
+ {ourProps}
285
+ theirProps={{ ...theirProps }}
286
+ slots={slot}
287
+ defaultTag={DEFAULT_DIALOG_TAG}
288
+ features={DialogRenderFeatures}
289
+ visible={dialogState === DialogStates.Open}
290
+ name="Dialog"
291
+ bind:element
292
+ />
293
+ </FocusTrap>
294
+ </PortalWrapper>
291
295
  </ForcePortalRoot>
292
296
  </PortalGroup>
293
297
  </Portal>
@@ -1,42 +1,4 @@
1
- import { DEFAULT_DIALOG_TAG, type DialogRenderPropArg } from "./Dialog.svelte";
2
- import type { ElementType } from "../utils/types.js";
3
- declare class __sveltets_Render<TTag extends ElementType = typeof DEFAULT_DIALOG_TAG> {
4
- props(): {
5
- as?: TTag | undefined;
6
- } & (Exclude<keyof import("../utils/types.js").PropsOf<TTag>, ("as" | "children" | "refName" | "class") | "autofocus" | "unmount" | "static" | "id" | "role" | "onclose" | "initialFocus" | ("aria-describedby" | "aria-labelledby" | "aria-modal") | "open" | "transition" | "__demoMode"> extends infer T extends keyof import("../utils/types.js").PropsOf<TTag> ? { [P in T]: import("../utils/types.js").PropsOf<TTag>[P]; } : never) & {
7
- children?: import("../utils/types.js").Children<DialogRenderPropArg> | undefined;
8
- ref?: HTMLElement;
9
- } & (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) ? {
10
- class?: import("../utils/types.js").PropsOf<TTag>["class"] | ((bag: DialogRenderPropArg) => string) | undefined;
11
- } : {}) & {
12
- static?: boolean | undefined;
13
- unmount?: boolean | undefined;
14
- } & {
15
- id?: string;
16
- open?: boolean;
17
- onclose(value: boolean): void;
18
- initialFocus?: HTMLElement;
19
- role?: "dialog" | "alertdialog";
20
- autofocus?: boolean;
21
- transition?: boolean;
22
- __demoMode?: boolean;
23
- };
24
- events(): {} & {
25
- [evt: string]: CustomEvent<any>;
26
- };
27
- slots(): {};
28
- bindings(): "ref";
29
- exports(): {};
30
- }
31
- interface $$IsomorphicComponent {
32
- new <TTag extends ElementType = typeof DEFAULT_DIALOG_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']>> & {
33
- $$bindings?: ReturnType<__sveltets_Render<TTag>['bindings']>;
34
- } & ReturnType<__sveltets_Render<TTag>['exports']>;
35
- <TTag extends ElementType = typeof DEFAULT_DIALOG_TAG>(internal: unknown, props: ReturnType<__sveltets_Render<TTag>['props']> & {
36
- $$events?: ReturnType<__sveltets_Render<TTag>['events']>;
37
- }): ReturnType<__sveltets_Render<TTag>['exports']>;
38
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
39
- }
40
- declare const InternalDialog: $$IsomorphicComponent;
41
- type InternalDialog<TTag extends ElementType = typeof DEFAULT_DIALOG_TAG> = InstanceType<typeof InternalDialog<TTag>>;
1
+ import { type DialogProps } from "./Dialog.svelte";
2
+ declare const InternalDialog: import("svelte").Component<DialogProps, {}, "element">;
3
+ type InternalDialog = ReturnType<typeof InternalDialog>;
42
4
  export default InternalDialog;
@@ -6,8 +6,8 @@ export var DialogStates;
6
6
  })(DialogStates || (DialogStates = {}));
7
7
  export function useDialogContext(component) {
8
8
  const context = getContext("DialogContext");
9
- if (context === null) {
10
- let err = new Error(`<${component} /> is missing a parent <Dialog /> component.`);
9
+ if (!context) {
10
+ const err = new Error(`<${component} /> is missing a parent <Dialog /> component.`);
11
11
  if (Error.captureStackTrace)
12
12
  Error.captureStackTrace(err, useDialogContext);
13
13
  throw err;
@@ -1,4 +1,4 @@
1
- export { default as Dialog, type DialogProps } from "./Dialog.svelte";
2
- export { default as DialogBackdrop, type DialogBackdropProps } from "./DialogBackdrop.svelte";
3
- export { default as DialogPanel, type DialogPanelProps } from "./DialogPanel.svelte";
4
- export { default as DialogTitle, type DialogTitleProps } from "./DialogTitle.svelte";
1
+ export { default as Dialog, type DialogProps, type DialogRenderPropArg as DialogSlot, type DialogOwnProps, } from "./Dialog.svelte";
2
+ export { default as DialogBackdrop, type DialogBackdropProps, type BackdropRenderPropArg as DialogBackdropSlot, type DialogBackdropOwnProps, } from "./DialogBackdrop.svelte";
3
+ export { default as DialogPanel, type DialogPanelProps, type PanelRenderPropArg as DialogPanelSlot, type DialogPanelOwnProps, } from "./DialogPanel.svelte";
4
+ export { default as DialogTitle, type DialogTitleProps, type TitleRenderPropArg as DialogTitleSlot, type DialogTitleOwnProps, } from "./DialogTitle.svelte";
@@ -1,4 +1,4 @@
1
- export { default as Dialog } from "./Dialog.svelte";
2
- export { default as DialogBackdrop } from "./DialogBackdrop.svelte";
3
- export { default as DialogPanel } from "./DialogPanel.svelte";
4
- export { default as DialogTitle } from "./DialogTitle.svelte";
1
+ export { default as Dialog, } from "./Dialog.svelte";
2
+ export { default as DialogBackdrop, } from "./DialogBackdrop.svelte";
3
+ export { default as DialogPanel, } from "./DialogPanel.svelte";
4
+ export { default as DialogTitle, } from "./DialogTitle.svelte";
@@ -0,0 +1,61 @@
1
+ <script lang="ts" module>
2
+ import type { Props } from "../utils/types.js"
3
+
4
+ const DEFAULT_DISCLOSURE_TAG = "div" as const
5
+ export type DisclosureRenderPropArg = {
6
+ open: boolean
7
+ close: (focusableElement?: HTMLElement) => void
8
+ }
9
+
10
+ export type DisclosureOwnProps = {
11
+ defaultOpen?: boolean
12
+ }
13
+
14
+ export type DisclosureProps = Props<typeof DEFAULT_DISCLOSURE_TAG, DisclosureRenderPropArg, DisclosureOwnProps>
15
+
16
+ export * from "./context.svelte.js"
17
+ </script>
18
+
19
+ <script lang="ts">
20
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte"
21
+ import { createDisclosureAPIContext, createDisclosureContext, DisclosureStates } from "./context.svelte.js"
22
+ import { getOwnerDocument } from "../utils/owner.js"
23
+ import { createOpenClosedContext, State } from "../internal/open-closed.js"
24
+ import { createCloseContext } from "../internal/close-provider.js"
25
+
26
+ let { defaultOpen = false, ...theirProps }: DisclosureProps = $props()
27
+
28
+ const context = createDisclosureContext(defaultOpen)
29
+ const { buttonId, disclosureState } = $derived(context)
30
+
31
+ const close = (focusableElement?: HTMLElement) => {
32
+ context.closeDisclosure()
33
+ const ownerDocument = getOwnerDocument(undefined)
34
+ if (!ownerDocument) return
35
+ if (!buttonId) return
36
+
37
+ const restoreElement = (() => {
38
+ if (!focusableElement) return ownerDocument.getElementById(buttonId)
39
+ return focusableElement
40
+ })()
41
+
42
+ restoreElement?.focus()
43
+ }
44
+
45
+ createDisclosureAPIContext(close)
46
+
47
+ const slot = $derived({
48
+ open: disclosureState === DisclosureStates.Open,
49
+ close,
50
+ } satisfies DisclosureRenderPropArg)
51
+
52
+ createOpenClosedContext({
53
+ get value() {
54
+ return disclosureState === DisclosureStates.Open ? State.Open : State.Closed
55
+ },
56
+ })
57
+
58
+ createCloseContext({ close })
59
+ </script>
60
+
61
+ <ElementOrComponent {theirProps} slots={slot} defaultTag={DEFAULT_DISCLOSURE_TAG} name="Disclosure" />
@@ -0,0 +1,14 @@
1
+ import type { Props } from "../utils/types.js";
2
+ declare const DEFAULT_DISCLOSURE_TAG: "div";
3
+ export type DisclosureRenderPropArg = {
4
+ open: boolean;
5
+ close: (focusableElement?: HTMLElement) => void;
6
+ };
7
+ export type DisclosureOwnProps = {
8
+ defaultOpen?: boolean;
9
+ };
10
+ export type DisclosureProps = Props<typeof DEFAULT_DISCLOSURE_TAG, DisclosureRenderPropArg, DisclosureOwnProps>;
11
+ export * from "./context.svelte.js";
12
+ declare const Disclosure: import("svelte").Component<DisclosureProps, {}, "">;
13
+ type Disclosure = ReturnType<typeof Disclosure>;
14
+ export default Disclosure;
@@ -0,0 +1,191 @@
1
+ <script lang="ts" module>
2
+ import type { Props } from "../utils/types.js"
3
+
4
+ const DEFAULT_BUTTON_TAG = "button" as const
5
+ export type ButtonRenderPropArg = {
6
+ open: boolean
7
+ hover: boolean
8
+ active: boolean
9
+ disabled: boolean
10
+ focus: boolean
11
+ autofocus: boolean
12
+ }
13
+ type ButtonPropsWeControl = "aria-controls" | "aria-expanded"
14
+
15
+ export type DisclosureButtonOwnProps = {
16
+ element?: HTMLButtonElement
17
+ disabled?: boolean
18
+ autofocus?: boolean
19
+ }
20
+
21
+ export type DisclosureButtonProps = Props<typeof DEFAULT_BUTTON_TAG, ButtonRenderPropArg, DisclosureButtonOwnProps>
22
+ </script>
23
+
24
+ <script lang="ts">
25
+ import { useId } from "../hooks/use-id.js"
26
+ import { DisclosureStates, useDisclosureContext, useDisclosurePanelContext } from "./context.svelte.js"
27
+ import { onMount, untrack } from "svelte"
28
+ import { useHover } from "../hooks/use-hover.svelte.js"
29
+ import { useActivePress } from "../hooks/use-active-press.svelte.js"
30
+ import { useFocusRing } from "../hooks/use-focus-ring.svelte.js"
31
+ import { useResolveButtonType } from "../hooks/use-resolve-button-type.svelte.js"
32
+ import { mergeProps } from "../utils/render.js"
33
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte"
34
+
35
+ const internalId = useId()
36
+ let {
37
+ element = $bindable(),
38
+ id = `headlessui-disclosure-button-${internalId}`,
39
+ disabled = false,
40
+ autofocus = false,
41
+ ...theirProps
42
+ }: DisclosureButtonProps = $props()
43
+
44
+ const context = useDisclosureContext("DisclosureButton")
45
+ const panelContext = useDisclosurePanelContext()
46
+ const isWithinPanel = $derived(!panelContext ? false : panelContext.panelId === context.panelId)
47
+
48
+ onMount(() => {
49
+ context.setButtonElement(element)
50
+ })
51
+
52
+ $effect(() => {
53
+ if (isWithinPanel) return
54
+ ;[id]
55
+ return untrack(() => {
56
+ context.setButtonId(id ?? undefined)
57
+ return () => {
58
+ context.setButtonId(undefined)
59
+ }
60
+ })
61
+ })
62
+
63
+ const handleKeyDown = (event: KeyboardEvent) => {
64
+ if (isWithinPanel) {
65
+ if (context.disclosureState === DisclosureStates.Closed) return
66
+
67
+ switch (event.key) {
68
+ case " ":
69
+ case "Enter":
70
+ event.preventDefault()
71
+ event.stopPropagation()
72
+ context.toggleDisclosure()
73
+ context.buttonElement?.focus()
74
+ break
75
+ }
76
+ } else {
77
+ switch (event.key) {
78
+ case " ":
79
+ case "Enter":
80
+ event.preventDefault()
81
+ event.stopPropagation()
82
+ context.toggleDisclosure()
83
+ break
84
+ }
85
+ }
86
+ }
87
+
88
+ const handleKeyUp = (event: KeyboardEvent) => {
89
+ switch (event.key) {
90
+ case " ":
91
+ // Required for firefox, event.preventDefault() in handleKeyDown for
92
+ // the Space key doesn't cancel the handleKeyUp, which in turn
93
+ // triggers a *click*.
94
+ event.preventDefault()
95
+ break
96
+ }
97
+ }
98
+
99
+ const handleClick = (event: MouseEvent) => {
100
+ //if (isDisabledReactIssue7711(event.currentTarget)) return
101
+ if (disabled) return
102
+
103
+ if (isWithinPanel) {
104
+ context.toggleDisclosure()
105
+ context.buttonElement?.focus()
106
+ } else {
107
+ context.toggleDisclosure()
108
+ }
109
+ }
110
+
111
+ const { isHovered: hover, hoverProps } = $derived(
112
+ useHover({
113
+ get disabled() {
114
+ return disabled
115
+ },
116
+ })
117
+ )
118
+ const { pressed: active, pressProps } = $derived(
119
+ useActivePress({
120
+ get disabled() {
121
+ return disabled
122
+ },
123
+ })
124
+ )
125
+ const { isFocusVisible: focus, focusProps } = $derived(
126
+ useFocusRing({
127
+ get autofocus() {
128
+ return autofocus
129
+ },
130
+ })
131
+ )
132
+
133
+ const slot = $derived({
134
+ open: context.disclosureState === DisclosureStates.Open,
135
+ hover,
136
+ active,
137
+ disabled,
138
+ focus,
139
+ autofocus,
140
+ } satisfies ButtonRenderPropArg)
141
+
142
+ const buttonType = useResolveButtonType({
143
+ get props() {
144
+ return { type: theirProps.type ?? undefined, as: DEFAULT_BUTTON_TAG }
145
+ },
146
+ get ref() {
147
+ return { current: context.buttonElement }
148
+ },
149
+ })
150
+
151
+ const ourProps = $derived(
152
+ isWithinPanel
153
+ ? mergeProps(
154
+ {
155
+ type: buttonType.type,
156
+ disabled: disabled || undefined,
157
+ autofocus,
158
+ onkeydown: handleKeyDown,
159
+ onclick: handleClick,
160
+ },
161
+ focusProps,
162
+ hoverProps,
163
+ pressProps
164
+ )
165
+ : mergeProps(
166
+ {
167
+ id,
168
+ type: buttonType.type,
169
+ "aria-expanded": context.disclosureState === DisclosureStates.Open,
170
+ "aria-controls": context.panelElement ? context.panelId : undefined,
171
+ disabled: disabled || undefined,
172
+ autofocus,
173
+ onkeydown: handleKeyDown,
174
+ onkeyup: handleKeyUp,
175
+ onclick: handleClick,
176
+ },
177
+ focusProps,
178
+ hoverProps,
179
+ pressProps
180
+ )
181
+ )
182
+ </script>
183
+
184
+ <ElementOrComponent
185
+ {ourProps}
186
+ {theirProps}
187
+ slots={slot}
188
+ defaultTag={DEFAULT_BUTTON_TAG}
189
+ name="DisclosureButton"
190
+ bind:element
191
+ />
@@ -0,0 +1,19 @@
1
+ import type { Props } from "../utils/types.js";
2
+ declare const DEFAULT_BUTTON_TAG: "button";
3
+ export type ButtonRenderPropArg = {
4
+ open: boolean;
5
+ hover: boolean;
6
+ active: boolean;
7
+ disabled: boolean;
8
+ focus: boolean;
9
+ autofocus: boolean;
10
+ };
11
+ export type DisclosureButtonOwnProps = {
12
+ element?: HTMLButtonElement;
13
+ disabled?: boolean;
14
+ autofocus?: boolean;
15
+ };
16
+ export type DisclosureButtonProps = Props<typeof DEFAULT_BUTTON_TAG, ButtonRenderPropArg, DisclosureButtonOwnProps>;
17
+ declare const DisclosureButton: import("svelte").Component<DisclosureButtonProps, {}, "element">;
18
+ type DisclosureButton = ReturnType<typeof DisclosureButton>;
19
+ export default DisclosureButton;
@@ -0,0 +1,99 @@
1
+ <script lang="ts" module>
2
+ import { RenderFeatures, type PropsForFeatures } from "../utils/render.js"
3
+ import type { Props } from "../utils/types.js"
4
+
5
+ const DEFAULT_PANEL_TAG = "div" as const
6
+ export type PanelRenderPropArg = {
7
+ open: boolean
8
+ close: (focusableElement?: HTMLElement) => void
9
+ }
10
+
11
+ let PanelRenderFeatures = RenderFeatures.RenderStrategy | RenderFeatures.Static
12
+
13
+ export type DisclosurePanelOwnProps = {
14
+ element?: HTMLElement
15
+ transition?: boolean
16
+ } & PropsForFeatures<typeof PanelRenderFeatures>
17
+
18
+ export type DisclosurePanelProps = Props<typeof DEFAULT_PANEL_TAG, PanelRenderPropArg, DisclosurePanelOwnProps>
19
+ </script>
20
+
21
+ <script lang="ts">
22
+ import { useId } from "../hooks/use-id.js"
23
+ import ElementOrComponent from "../utils/ElementOrComponent.svelte"
24
+ import {
25
+ createDisclosurePanelContext,
26
+ DisclosureStates,
27
+ useDisclosureAPIContext,
28
+ useDisclosureContext,
29
+ } from "./context.svelte.js"
30
+ import { onMount, untrack } from "svelte"
31
+ import { clearOpenClosedContext, State, useOpenClosed } from "../internal/open-closed.js"
32
+ import { transitionDataAttributes, useTransition } from "../hooks/use-transition.svelte.js"
33
+
34
+ const internalId = useId()
35
+ let {
36
+ element = $bindable(),
37
+ id = `headlessui-disclosure-panel-${internalId}`,
38
+ transition = false,
39
+ ...theirProps
40
+ }: DisclosurePanelProps = $props()
41
+ const context = useDisclosureContext("DisclosurePanel")
42
+ const { close } = useDisclosureAPIContext("DisclosurePanel")
43
+
44
+ onMount(() => {
45
+ context.setPanelElement(element)
46
+ })
47
+
48
+ $effect(() => {
49
+ ;[id]
50
+ return untrack(() => {
51
+ context.setPanelId(id ?? undefined)
52
+ return () => {
53
+ context.setPanelId(undefined)
54
+ }
55
+ })
56
+ })
57
+
58
+ const usesOpenClosedState = useOpenClosed()
59
+ const _transition = useTransition({
60
+ get enabled() {
61
+ return transition
62
+ },
63
+ get element() {
64
+ return element
65
+ },
66
+ get show() {
67
+ return usesOpenClosedState !== null
68
+ ? (usesOpenClosedState.value & State.Open) === State.Open
69
+ : context.disclosureState === DisclosureStates.Open
70
+ },
71
+ get asChild() {
72
+ return theirProps.asChild
73
+ },
74
+ })
75
+
76
+ const slot = $derived({
77
+ open: context.disclosureState === DisclosureStates.Open,
78
+ close,
79
+ } satisfies PanelRenderPropArg)
80
+
81
+ const ourProps = $derived({
82
+ id,
83
+ ...transitionDataAttributes(_transition.data),
84
+ })
85
+
86
+ createDisclosurePanelContext(() => context.panelId)
87
+ clearOpenClosedContext()
88
+ </script>
89
+
90
+ <ElementOrComponent
91
+ {ourProps}
92
+ {theirProps}
93
+ slots={slot}
94
+ defaultTag={DEFAULT_PANEL_TAG}
95
+ features={PanelRenderFeatures}
96
+ visible={_transition.visible}
97
+ name="DisclosurePanel"
98
+ bind:element
99
+ />
@@ -0,0 +1,16 @@
1
+ import { type PropsForFeatures } from "../utils/render.js";
2
+ import type { Props } from "../utils/types.js";
3
+ declare const DEFAULT_PANEL_TAG: "div";
4
+ export type PanelRenderPropArg = {
5
+ open: boolean;
6
+ close: (focusableElement?: HTMLElement) => void;
7
+ };
8
+ declare let PanelRenderFeatures: number;
9
+ export type DisclosurePanelOwnProps = {
10
+ element?: HTMLElement;
11
+ transition?: boolean;
12
+ } & PropsForFeatures<typeof PanelRenderFeatures>;
13
+ export type DisclosurePanelProps = Props<typeof DEFAULT_PANEL_TAG, PanelRenderPropArg, DisclosurePanelOwnProps>;
14
+ declare const DisclosurePanel: import("svelte").Component<DisclosurePanelProps, {}, "element">;
15
+ type DisclosurePanel = ReturnType<typeof DisclosurePanel>;
16
+ export default DisclosurePanel;