@gunkin/uiify 0.0.11-alpha → 0.0.13-alpha

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 (247) hide show
  1. package/dist/components/behavior.css +21 -6
  2. package/dist/components/behavior.css.map +1 -1
  3. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
  4. package/dist/components/breadcrumb/Breadcrumb.js +5 -4
  5. package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
  6. package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
  7. package/dist/components/carousel/CarouselMarkup.js +2 -1
  8. package/dist/components/carousel/CarouselMarkup.js.map +1 -1
  9. package/dist/components/carousel/client/CarouselClientView.d.ts.map +1 -1
  10. package/dist/components/carousel/client/CarouselClientView.js +1 -0
  11. package/dist/components/carousel/client/CarouselClientView.js.map +1 -1
  12. package/dist/components/carousel/client/carousel-controller.d.ts.map +1 -1
  13. package/dist/components/carousel/client/carousel-controller.js +25 -4
  14. package/dist/components/carousel/client/carousel-controller.js.map +1 -1
  15. package/dist/components/carousel/client/carousel-observer.d.ts.map +1 -1
  16. package/dist/components/carousel/client/carousel-observer.js +40 -0
  17. package/dist/components/carousel/client/carousel-observer.js.map +1 -1
  18. package/dist/components/carousel/fade/fade-controller.d.ts.map +1 -1
  19. package/dist/components/carousel/fade/fade-controller.js +3 -0
  20. package/dist/components/carousel/fade/fade-controller.js.map +1 -1
  21. package/dist/components/carousel/types.d.ts +2 -0
  22. package/dist/components/carousel/types.d.ts.map +1 -1
  23. package/dist/components/checkbox/Checkbox.d.ts +1 -6
  24. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  25. package/dist/components/checkbox/Checkbox.js +2 -52
  26. package/dist/components/checkbox/Checkbox.js.map +1 -1
  27. package/dist/components/drawer/Drawer.d.ts +1 -1
  28. package/dist/components/drawer/Drawer.d.ts.map +1 -1
  29. package/dist/components/drawer/Drawer.js +46 -9
  30. package/dist/components/drawer/Drawer.js.map +1 -1
  31. package/dist/components/drawer/DrawerNative.d.ts +8 -16
  32. package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
  33. package/dist/components/drawer/DrawerNative.js +80 -34
  34. package/dist/components/drawer/DrawerNative.js.map +1 -1
  35. package/dist/components/drawer/drawer-store.d.ts +1 -1
  36. package/dist/components/drawer/drawer-store.d.ts.map +1 -1
  37. package/dist/components/drawer/drawer-store.js +7 -3
  38. package/dist/components/drawer/drawer-store.js.map +1 -1
  39. package/dist/components/drawer/index.d.ts +3 -3
  40. package/dist/components/drawer/index.d.ts.map +1 -1
  41. package/dist/components/drawer/index.js +9 -1
  42. package/dist/components/drawer/index.js.map +1 -1
  43. package/dist/components/drawer/types.d.ts +114 -3
  44. package/dist/components/drawer/types.d.ts.map +1 -1
  45. package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  46. package/dist/components/dropdown-menu/DropdownMenu.js +1 -0
  47. package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
  48. package/dist/components/enhance/dialog-dismiss.d.ts +1 -1
  49. package/dist/components/enhance/dialog-dismiss.d.ts.map +1 -1
  50. package/dist/components/enhance/dialog-dismiss.js +19 -10
  51. package/dist/components/enhance/dialog-dismiss.js.map +1 -1
  52. package/dist/components/enhance/internal/box-observer.d.ts +4 -0
  53. package/dist/components/enhance/internal/box-observer.d.ts.map +1 -0
  54. package/dist/components/enhance/internal/box-observer.js +32 -0
  55. package/dist/components/enhance/internal/box-observer.js.map +1 -0
  56. package/dist/components/enhance/sheet-swipe.d.ts.map +1 -1
  57. package/dist/components/enhance/sheet-swipe.js +42 -14
  58. package/dist/components/enhance/sheet-swipe.js.map +1 -1
  59. package/dist/components/enhance/types.d.ts +5 -0
  60. package/dist/components/enhance/types.d.ts.map +1 -0
  61. package/dist/components/field/Field.d.ts.map +1 -1
  62. package/dist/components/field/Field.js +1 -0
  63. package/dist/components/field/Field.js.map +1 -1
  64. package/dist/components/file-upload/FileUpload.d.ts +4 -7
  65. package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
  66. package/dist/components/file-upload/FileUpload.js +28 -122
  67. package/dist/components/file-upload/FileUpload.js.map +1 -1
  68. package/dist/components/file-upload/FileUploadInput.d.ts +7 -0
  69. package/dist/components/file-upload/FileUploadInput.d.ts.map +1 -0
  70. package/dist/components/file-upload/FileUploadInput.js +60 -0
  71. package/dist/components/file-upload/FileUploadInput.js.map +1 -0
  72. package/dist/components/file-upload/FileUploadRoot.d.ts +8 -0
  73. package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -0
  74. package/dist/components/file-upload/FileUploadRoot.js +70 -0
  75. package/dist/components/file-upload/FileUploadRoot.js.map +1 -0
  76. package/dist/components/file-upload/file-upload-context.d.ts +3 -0
  77. package/dist/components/file-upload/file-upload-context.d.ts.map +1 -0
  78. package/dist/components/file-upload/file-upload-context.js +8 -0
  79. package/dist/components/file-upload/file-upload-context.js.map +1 -0
  80. package/dist/components/file-upload/index.d.ts +1 -1
  81. package/dist/components/file-upload/index.d.ts.map +1 -1
  82. package/dist/components/file-upload/index.js.map +1 -1
  83. package/dist/components/file-upload/types.d.ts +8 -10
  84. package/dist/components/file-upload/types.d.ts.map +1 -1
  85. package/dist/components/form/Form.d.ts.map +1 -1
  86. package/dist/components/form/Form.js +2 -1
  87. package/dist/components/form/Form.js.map +1 -1
  88. package/dist/components/header/Header.d.ts +3 -19
  89. package/dist/components/header/Header.d.ts.map +1 -1
  90. package/dist/components/header/Header.js +4 -253
  91. package/dist/components/header/Header.js.map +1 -1
  92. package/dist/components/header/client/HeaderClient.d.ts +7 -0
  93. package/dist/components/header/client/HeaderClient.d.ts.map +1 -0
  94. package/dist/components/header/client/HeaderClient.js +93 -0
  95. package/dist/components/header/client/HeaderClient.js.map +1 -0
  96. package/dist/components/header/client/index.d.ts +3 -0
  97. package/dist/components/header/client/index.d.ts.map +1 -0
  98. package/dist/components/header/client/index.js +6 -0
  99. package/dist/components/header/client/index.js.map +1 -0
  100. package/dist/components/header/client.d.ts +1 -0
  101. package/dist/components/header/client.js +1 -0
  102. package/dist/components/header/index.d.ts +2 -3
  103. package/dist/components/header/index.d.ts.map +1 -1
  104. package/dist/components/header/index.js +2 -15
  105. package/dist/components/header/index.js.map +1 -1
  106. package/dist/components/header/types.d.ts +7 -63
  107. package/dist/components/header/types.d.ts.map +1 -1
  108. package/dist/components/hover-card/HoverCard.js +1 -1
  109. package/dist/components/hover-card/HoverCard.js.map +1 -1
  110. package/dist/components/index.d.ts +0 -1
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/components/index.js +0 -1
  113. package/dist/components/index.js.map +1 -1
  114. package/dist/components/input/Input.d.ts.map +1 -1
  115. package/dist/components/input/Input.js +1 -1
  116. package/dist/components/input/Input.js.map +1 -1
  117. package/dist/components/internal/choice-family/ChoiceGroup.js +1 -1
  118. package/dist/components/internal/choice-family/ChoiceGroup.js.map +1 -1
  119. package/dist/components/internal/choice-family/types.d.ts +3 -3
  120. package/dist/components/internal/choice-family/types.d.ts.map +1 -1
  121. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts +7 -0
  122. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts.map +1 -0
  123. package/dist/components/internal/native-check-control/NativeCheckControl.js +56 -0
  124. package/dist/components/internal/native-check-control/NativeCheckControl.js.map +1 -0
  125. package/dist/components/internal/native-check-control/types.d.ts +13 -0
  126. package/dist/components/internal/native-check-control/types.d.ts.map +1 -0
  127. package/dist/components/internal/native-check-control/types.js +1 -0
  128. package/dist/components/number-field/NumberField.d.ts.map +1 -1
  129. package/dist/components/number-field/NumberField.js +11 -2
  130. package/dist/components/number-field/NumberField.js.map +1 -1
  131. package/dist/components/number-field/format.d.ts +1 -0
  132. package/dist/components/number-field/format.d.ts.map +1 -1
  133. package/dist/components/number-field/format.js +18 -6
  134. package/dist/components/number-field/format.js.map +1 -1
  135. package/dist/components/popup/PopupParts.d.ts.map +1 -1
  136. package/dist/components/popup/PopupParts.js +2 -0
  137. package/dist/components/popup/PopupParts.js.map +1 -1
  138. package/dist/components/select/Select.d.ts.map +1 -1
  139. package/dist/components/select/Select.js +1 -1
  140. package/dist/components/select/Select.js.map +1 -1
  141. package/dist/components/skeleton/Skeleton.d.ts.map +1 -1
  142. package/dist/components/skeleton/Skeleton.js +14 -35
  143. package/dist/components/skeleton/Skeleton.js.map +1 -1
  144. package/dist/components/skeleton/types.d.ts +1 -8
  145. package/dist/components/skeleton/types.d.ts.map +1 -1
  146. package/dist/components/table/Table.d.ts +1 -40
  147. package/dist/components/table/Table.d.ts.map +1 -1
  148. package/dist/components/table/Table.js +9 -259
  149. package/dist/components/table/Table.js.map +1 -1
  150. package/dist/components/table/TableShell.d.ts +5 -1
  151. package/dist/components/table/TableShell.d.ts.map +1 -1
  152. package/dist/components/table/TableShell.js +63 -9
  153. package/dist/components/table/TableShell.js.map +1 -1
  154. package/dist/components/table/client/Table.d.ts +30 -0
  155. package/dist/components/table/client/Table.d.ts.map +1 -0
  156. package/dist/components/table/client/Table.js +135 -0
  157. package/dist/components/table/client/Table.js.map +1 -0
  158. package/dist/components/table/client/TableBody.d.ts +7 -0
  159. package/dist/components/table/client/TableBody.d.ts.map +1 -0
  160. package/dist/components/table/client/TableBody.js +35 -0
  161. package/dist/components/table/client/TableBody.js.map +1 -0
  162. package/dist/components/table/client/TableColumnHeader.d.ts +7 -0
  163. package/dist/components/table/client/TableColumnHeader.d.ts.map +1 -0
  164. package/dist/components/table/client/TableColumnHeader.js +69 -0
  165. package/dist/components/table/client/TableColumnHeader.js.map +1 -0
  166. package/dist/components/table/client/TableExpansion.d.ts +11 -0
  167. package/dist/components/table/client/TableExpansion.d.ts.map +1 -0
  168. package/dist/components/table/client/TableExpansion.js +43 -0
  169. package/dist/components/table/client/TableExpansion.js.map +1 -0
  170. package/dist/components/table/client/TableRow.d.ts +7 -0
  171. package/dist/components/table/client/TableRow.d.ts.map +1 -0
  172. package/dist/components/table/client/TableRow.js +95 -0
  173. package/dist/components/table/client/TableRow.js.map +1 -0
  174. package/dist/components/table/client/TableSelection.d.ts +11 -0
  175. package/dist/components/table/client/TableSelection.d.ts.map +1 -0
  176. package/dist/components/table/client/TableSelection.js +48 -0
  177. package/dist/components/table/client/TableSelection.js.map +1 -0
  178. package/dist/components/table/client/table-context.d.ts +3 -0
  179. package/dist/components/table/client/table-context.d.ts.map +1 -0
  180. package/dist/components/table/client/table-context.js +8 -0
  181. package/dist/components/table/client/table-context.js.map +1 -0
  182. package/dist/components/table/client.d.ts +4 -0
  183. package/dist/components/table/client.d.ts.map +1 -0
  184. package/dist/components/table/client.js +30 -0
  185. package/dist/components/table/client.js.map +1 -0
  186. package/dist/components/table/index.d.ts +2 -2
  187. package/dist/components/table/index.d.ts.map +1 -1
  188. package/dist/components/table/index.js +7 -7
  189. package/dist/components/table/index.js.map +1 -1
  190. package/dist/components/table/types.d.ts +42 -15
  191. package/dist/components/table/types.d.ts.map +1 -1
  192. package/dist/components/textarea/Textarea.d.ts.map +1 -1
  193. package/dist/components/textarea/Textarea.js +1 -1
  194. package/dist/components/textarea/Textarea.js.map +1 -1
  195. package/dist/components/tooltip/Tooltip.js +1 -1
  196. package/dist/components/tooltip/Tooltip.js.map +1 -1
  197. package/dist/components/virtual-scroll/VirtualScroll.d.ts.map +1 -1
  198. package/dist/components/virtual-scroll/VirtualScroll.js +54 -34
  199. package/dist/components/virtual-scroll/VirtualScroll.js.map +1 -1
  200. package/dist/components/virtual-scroll/types.d.ts +2 -2
  201. package/dist/components/virtual-scroll/types.d.ts.map +1 -1
  202. package/dist/components/virtual-scroll/types.js.map +1 -1
  203. package/dist/components/virtual-scroll/virtual-scroll-scroll.d.ts.map +1 -1
  204. package/dist/components/virtual-scroll/virtual-scroll-scroll.js +0 -1
  205. package/dist/components/virtual-scroll/virtual-scroll-scroll.js.map +1 -1
  206. package/dist/core/roving-focus.d.ts +2 -1
  207. package/dist/core/roving-focus.d.ts.map +1 -1
  208. package/dist/core/roving-focus.js.map +1 -1
  209. package/dist/core/use-popover.d.ts.map +1 -1
  210. package/dist/core/use-popover.js +6 -1
  211. package/dist/core/use-popover.js.map +1 -1
  212. package/dist/elements/choice/types.d.ts +1 -1
  213. package/dist/elements/choice/types.d.ts.map +1 -1
  214. package/dist/styles/index.css +1 -1
  215. package/dist/styles/tailwind.css +1 -0
  216. package/dist/styles/tokens.css +1 -1
  217. package/package.json +1 -1
  218. package/dist/components/drawer/client-types.d.ts +0 -99
  219. package/dist/components/drawer/client-types.d.ts.map +0 -1
  220. package/dist/components/drawer/client-types.js +0 -1
  221. package/dist/components/enhance/internal/read-box.d.ts +0 -3
  222. package/dist/components/enhance/internal/read-box.d.ts.map +0 -1
  223. package/dist/components/enhance/internal/read-box.js +0 -7
  224. package/dist/components/enhance/internal/read-box.js.map +0 -1
  225. package/dist/components/header/use-header-scroll-state.d.ts +0 -4
  226. package/dist/components/header/use-header-scroll-state.d.ts.map +0 -1
  227. package/dist/components/header/use-header-scroll-state.js +0 -83
  228. package/dist/components/header/use-header-scroll-state.js.map +0 -1
  229. package/dist/components/header/use-header.d.ts +0 -4
  230. package/dist/components/header/use-header.d.ts.map +0 -1
  231. package/dist/components/header/use-header.js +0 -80
  232. package/dist/components/header/use-header.js.map +0 -1
  233. package/dist/components/stepper/Stepper.d.ts +0 -7
  234. package/dist/components/stepper/Stepper.d.ts.map +0 -1
  235. package/dist/components/stepper/Stepper.js +0 -35
  236. package/dist/components/stepper/Stepper.js.map +0 -1
  237. package/dist/components/stepper/index.d.ts +0 -3
  238. package/dist/components/stepper/index.d.ts.map +0 -1
  239. package/dist/components/stepper/index.js +0 -5
  240. package/dist/components/stepper/index.js.map +0 -1
  241. package/dist/components/stepper/types.d.ts +0 -14
  242. package/dist/components/stepper/types.d.ts.map +0 -1
  243. package/dist/components/stepper.d.ts +0 -1
  244. package/dist/components/stepper.js +0 -1
  245. /package/dist/components/{stepper → enhance}/types.js +0 -0
  246. /package/dist/components/{stepper → enhance}/types.js.map +0 -0
  247. /package/dist/components/{drawer/client-types.js.map → internal/native-check-control/types.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/dropdown-menu/DropdownMenu.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef } from \"react\";\nimport type {\n ElementType,\n KeyboardEvent,\n MouseEvent,\n PointerEvent,\n ReactElement,\n RefObject,\n SyntheticEvent,\n} from \"react\";\nimport { useControllableState, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport { createPartContext, splitRef } from \"@gunkin/uiify/core\";\nimport { useAnchorPosition } from \"@gunkin/uiify/core/anchor-position\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useDirection } from \"@gunkin/uiify/core/direction\";\nimport { createHoverIntentStore } from \"@gunkin/uiify/core/hover-intent-store\";\nimport type { HoverIntentStore } from \"@gunkin/uiify/core/hover-intent-store\";\nimport type { OpenChangeDetails } from \"@gunkin/uiify/core/open-change-details\";\nimport { usePopover } from \"@gunkin/uiify/core/popover\";\nimport { RovingFocusItem, RovingFocusRoot } from \"@gunkin/uiify/core/roving-focus\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { createMenuSelectEvent } from \"../internal/menu/menu-utils.js\";\nimport { focusMenuItem } from \"../internal/menu/focus-menu-item.js\";\nimport { MenuGroup, MenuLabel, MenuSeparator } from \"../internal/menu/menu-parts.js\";\nimport { useMenuSurface } from \"../internal/menu/use-menu-surface.js\";\nimport { DropdownMenuBar } from \"./DropdownMenuBar.js\";\nimport type {\n DropdownMenuCheckedState,\n DropdownMenuCheckboxItemProps,\n DropdownMenuContentProps,\n DropdownMenuContextValue,\n DropdownMenuGroupProps,\n DropdownMenuItemDescriptionProps,\n DropdownMenuItemIconProps,\n DropdownMenuItemIndicatorProps,\n DropdownMenuItemProps,\n DropdownMenuItemTextProps,\n DropdownMenuLabelProps,\n DropdownMenuOpenChangeReason,\n DropdownMenuPartProps,\n DropdownMenuRadioGroupProps,\n DropdownMenuRadioItemProps,\n DropdownMenuRootProps,\n DropdownMenuSeparatorProps,\n DropdownMenuShortcutProps,\n DropdownMenuSubContentProps,\n DropdownMenuSubProps,\n DropdownMenuSubTriggerProps,\n DropdownMenuTriggerProps,\n} from \"./types.js\";\n\nexport type { MenuSelectEvent } from \"./types.js\";\n\nfunction mapReason(reason: OpenChangeDetails[\"reason\"]): DropdownMenuOpenChangeReason {\n if (reason === \"escape-key\") return \"escape\";\n if (reason === \"focus-outside\") return \"focus-out\";\n if (reason === \"native-toggle\") return \"trigger-press\";\n return reason;\n}\n\nconst [DropdownMenuProvider, useDropdownMenuContext] =\n createPartContext<DropdownMenuContextValue>(\"DropdownMenu\");\n\nexport function DropdownMenuRoot(props: DropdownMenuRootProps): ReactElement | null {\n const {\n children,\n className,\n defaultOpen,\n dir: localDir,\n disabled = false,\n loop = true,\n onOpenChange,\n open,\n } = props;\n const dir = useDirection(localDir);\n const surface = useMenuSurface({\n mode: \"auto\",\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(open !== undefined ? { open } : {}),\n ...(onOpenChange\n ? {\n onOpenChange: (next, details) =>\n onOpenChange(next, { event: details.event, reason: mapReason(details.reason) }),\n }\n : {}),\n });\n const intentRef = useRef<HoverIntentStore | null>(null);\n intentRef.current ??= createHoverIntentStore({ closeDelay: 150, openDelay: 0 });\n const intent = intentRef.current;\n const hoverEnabledRef = useRef(false);\n // Read by the scheduled close so a timer from a menu that already closed\n // cannot emit onOpenChange(false) over a sibling that opened since.\n const openRef = useRef(surface.open);\n openRef.current = surface.open;\n\n const cancelHoverClose = useCallback(() => intent.clearCloseTimer(), [intent]);\n const scheduleHoverClose = useCallback(() => {\n intent.scheduleClose(() => {\n if (openRef.current) surface.close();\n });\n }, [intent, surface]);\n\n const value = useMemo(\n () => ({\n ...surface,\n cancelHoverClose,\n dir,\n disabled,\n hoverEnabledRef,\n loop,\n scheduleHoverClose,\n }),\n [cancelHoverClose, surface, dir, disabled, loop, scheduleHoverClose],\n );\n return (\n <div className={className} data-uiify-menu=\"\">\n <DropdownMenuProvider value={value}>{children}</DropdownMenuProvider>\n </div>\n );\n}\n\nexport function DropdownMenuTrigger<TAs extends ElementType = \"button\">(\n props: DropdownMenuTriggerProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n className,\n openOnHover = false,\n ...consumerProps\n } = props as DropdownMenuTriggerProps<\"button\"> & { openOnHover?: boolean };\n const {\n anchorProps,\n cancelHoverClose,\n close,\n disabled,\n focusTrigger,\n hoverEnabledRef,\n open,\n openPopover,\n openToItem,\n scheduleHoverClose,\n setTriggerElement,\n triggerProps,\n } = useDropdownMenuContext(\"Trigger\");\n hoverEnabledRef.current = openOnHover;\n const [consumerRef, withoutRef] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const mergedRef = useMergedRefs(setTriggerElement, consumerRef);\n const nativeButton = !as || as === \"button\";\n const {\n onClick: consumerOnClick,\n onKeyDown: consumerOnKeyDown,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = withoutRef as {\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLButtonElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n const internalOnClick = triggerProps.onClick as (event: MouseEvent<HTMLButtonElement>) => void;\n const handlePointerEnter = () => {\n if (disabled) return;\n cancelHoverClose();\n if (!open) openPopover();\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (disabled) return;\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (open) close();\n else openToItem(false);\n } else if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n openToItem(event.key === \"ArrowUp\");\n } else if (event.key === \"Escape\" && open) {\n event.preventDefault();\n close();\n focusTrigger();\n }\n };\n return useRenderElement({\n as,\n defaultTag: \"button\",\n render,\n props: {\n ...withoutRef,\n ...triggerProps,\n ...anchorProps,\n ref: mergedRef,\n \"aria-haspopup\": \"menu\",\n \"data-part\": \"trigger\",\n \"data-state\": open ? \"open\" : \"closed\",\n \"data-disabled\": disabled ? \"\" : undefined,\n disabled: nativeButton && disabled ? true : undefined,\n ...(nativeButton && !triggerProps.type ? { type: \"button\" } : {}),\n ...(className ? { className } : {}),\n onClick: disabled ? consumerOnClick : composeEventHandlers(consumerOnClick, internalOnClick),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ...(openOnHover && !disabled\n ? {\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, handlePointerEnter),\n onPointerLeave: composeEventHandlers(consumerOnPointerLeave, scheduleHoverClose),\n }\n : {}),\n },\n state: { open },\n });\n}\n\nexport function DropdownMenuContent<TAs extends ElementType = \"div\">(\n props: DropdownMenuContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"start\",\n as,\n className,\n side = \"bottom\",\n children,\n render,\n ...consumerProps\n } = props as DropdownMenuContentProps<\"div\">;\n const {\n cancelHoverClose,\n close,\n contentRef,\n dir,\n focusTrigger,\n hoverEnabledRef,\n loop,\n open,\n popupProps,\n popupRef,\n positionerProps,\n scheduleHoverClose,\n } = useDropdownMenuContext(\"Content\");\n const [consumerRef, withoutRef] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const mergedRef = useMergedRefs(popupRef, contentRef, consumerRef);\n const {\n onKeyDown: consumerOnKeyDown,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = withoutRef as {\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n focusTrigger();\n }\n };\n const contentProps = {\n ...withoutRef,\n ...popupProps,\n ...positionerProps,\n ref: mergedRef,\n role: \"menu\",\n \"data-part\": \"content\",\n \"data-align\": align,\n \"data-side\": side,\n \"data-state\": open ? \"open\" : \"closed\",\n ...(className ? { className } : {}),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ...(hoverEnabledRef.current\n ? {\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, cancelHoverClose),\n onPointerLeave: composeEventHandlers(consumerOnPointerLeave, scheduleHoverClose),\n }\n : {}),\n children,\n };\n if (render)\n return (\n <RovingFocusRoot\n direction={dir}\n loop={loop}\n orientation=\"vertical\"\n {...contentProps}\n render={(p) => render(p, { open })}\n />\n );\n return (\n <RovingFocusRoot\n as={as ?? \"div\"}\n direction={dir}\n loop={loop}\n orientation=\"vertical\"\n {...contentProps}\n />\n );\n}\n\ninterface ItemActivationOptions {\n closeOnSelect: boolean;\n disabled: boolean;\n onSelect?: DropdownMenuItemProps[\"onSelect\"];\n onStateChange?: () => void;\n}\nfunction useItemActivation({\n closeOnSelect,\n disabled,\n onSelect,\n onStateChange,\n}: ItemActivationOptions) {\n const { close, focusTrigger } = useDropdownMenuContext(\"Item\");\n const select = (event: SyntheticEvent<HTMLElement>) => {\n if (disabled) return;\n const selectEvent = createMenuSelectEvent();\n onSelect?.(selectEvent);\n if (!selectEvent.defaultPrevented) {\n onStateChange?.();\n if (closeOnSelect) {\n close();\n focusTrigger();\n }\n }\n event.preventDefault();\n };\n return {\n select,\n keyDown: (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") select(event);\n },\n };\n}\n\nfunction MenuItem<TAs extends ElementType>(\n props: DropdownMenuItemProps<TAs> & {\n roleName: string;\n checked?: boolean | \"mixed\";\n state?: string;\n onStateChange?: () => void;\n defaultClose: boolean;\n },\n): ReactElement | null {\n const {\n as,\n render,\n children,\n className,\n closeOnSelect,\n disabled = false,\n onSelect,\n textValue,\n roleName,\n checked,\n state,\n onStateChange,\n defaultClose,\n ...consumerProps\n } = props as DropdownMenuItemProps<\"div\"> & {\n roleName: string;\n checked?: boolean | \"mixed\";\n state?: string;\n onStateChange?: () => void;\n defaultClose: boolean;\n };\n const { onClick: consumerOnClick, onKeyDown: consumerOnKeyDown } = consumerProps as {\n onClick?: (event: SyntheticEvent<HTMLElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n };\n const activation = useItemActivation({\n closeOnSelect: closeOnSelect ?? defaultClose,\n disabled,\n onSelect,\n ...(onStateChange ? { onStateChange } : {}),\n });\n const itemProps = {\n ...consumerProps,\n role: roleName,\n \"aria-checked\": checked,\n \"data-part\": roleName === \"menuitem\" ? \"item\" : roleName.replace(\"menuitem\", \"\") + \"-item\",\n \"data-state\": state,\n ...(className ? { className } : {}),\n onClick: composeEventHandlers(consumerOnClick, activation.select),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, activation.keyDown),\n children,\n };\n if (render)\n return (\n <RovingFocusItem\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n {...(itemProps as object)}\n render={(p) => render(p, { disabled })}\n />\n );\n return (\n <RovingFocusItem\n as={as ?? \"div\"}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n {...(itemProps as object)}\n />\n );\n}\n\nexport function DropdownMenuItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuItemProps<TAs>,\n): ReactElement | null {\n return <MenuItem {...props} roleName=\"menuitem\" defaultClose />;\n}\n\ninterface SelectionContextValue {\n checked: DropdownMenuCheckedState;\n kind: \"checkbox\" | \"radio\";\n}\nconst [SelectionProvider, useSelectionContext] = createPartContext<SelectionContextValue>(\n \"DropdownMenu\",\n \"ItemIndicator\",\n);\n\nexport function DropdownMenuCheckboxItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuCheckboxItemProps<TAs>,\n): ReactElement | null {\n const { checked: controlled, defaultChecked = false, onCheckedChange, ...itemProps } = props;\n const [checked, setChecked] = useControllableState<DropdownMenuCheckedState>({\n value: controlled,\n defaultValue: defaultChecked,\n });\n const next = checked === \"indeterminate\" ? true : !checked;\n return (\n <SelectionProvider value={{ checked, kind: \"checkbox\" }}>\n <MenuItem\n {...(itemProps as DropdownMenuItemProps<ElementType>)}\n roleName=\"menuitemcheckbox\"\n checked={checked === \"indeterminate\" ? \"mixed\" : checked}\n state={checked === \"indeterminate\" ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\"}\n defaultClose={false}\n onStateChange={() => {\n setChecked(next);\n onCheckedChange?.(next);\n }}\n />\n </SelectionProvider>\n );\n}\n\ninterface RadioContextValue {\n setValue: (value: string) => void;\n value: string | undefined;\n}\nconst [RadioProvider, useRadioContext] = createPartContext<RadioContextValue>(\n \"DropdownMenu\",\n \"RadioGroup\",\n);\nexport function DropdownMenuRadioGroup<TAs extends ElementType = \"div\">(\n props: DropdownMenuRadioGroupProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n defaultValue,\n onValueChange,\n value: controlled,\n ...consumerProps\n } = props as DropdownMenuRadioGroupProps<\"div\">;\n const [value, setValue] = useControllableState<string | undefined>({\n value: controlled,\n defaultValue,\n ...(onValueChange\n ? {\n onChange: (next) => {\n if (next !== undefined) onValueChange(next);\n },\n }\n : {}),\n });\n return (\n <RadioProvider value={{ value, setValue }}>\n {useRenderElement({\n as,\n defaultTag: \"div\",\n render,\n props: { ...consumerProps, role: \"group\", \"data-part\": \"radio-group\", children },\n state: { value },\n })}\n </RadioProvider>\n );\n}\nexport function DropdownMenuRadioItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuRadioItemProps<TAs>,\n): ReactElement | null {\n const { value, ...itemProps } = props;\n const radio = useRadioContext(\"RadioItem\");\n const checked = radio.value === value;\n return (\n <SelectionProvider value={{ checked, kind: \"radio\" }}>\n <MenuItem\n {...(itemProps as DropdownMenuItemProps<ElementType>)}\n roleName=\"menuitemradio\"\n checked={checked}\n state={checked ? \"checked\" : \"unchecked\"}\n defaultClose={false}\n onStateChange={() => radio.setValue(value)}\n />\n </SelectionProvider>\n );\n}\n\nfunction Part<TAs extends ElementType = \"span\">({\n part,\n defaultTag,\n ...props\n}: DropdownMenuPartProps<TAs> & { part: string; defaultTag: ElementType }): ReactElement | null {\n const { as, render, children, className, ...consumerProps } =\n props as DropdownMenuPartProps<\"span\">;\n return useRenderElement({\n as,\n defaultTag,\n render,\n props: { ...consumerProps, \"data-part\": part, ...(className ? { className } : {}), children },\n state: {},\n });\n}\nexport const DropdownMenuItemIcon = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemIconProps<TAs>,\n) => <Part {...p} part=\"item-icon\" defaultTag=\"span\" />;\nexport const DropdownMenuItemText = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemTextProps<TAs>,\n) => <Part {...p} part=\"item-text\" defaultTag=\"span\" />;\nexport const DropdownMenuItemDescription = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemDescriptionProps<TAs>,\n) => <Part {...p} part=\"item-description\" defaultTag=\"span\" />;\nexport const DropdownMenuShortcut = <TAs extends ElementType = \"span\">(\n p: DropdownMenuShortcutProps<TAs>,\n) => <Part {...p} part=\"shortcut\" defaultTag=\"kbd\" />;\nexport function DropdownMenuItemIndicator<TAs extends ElementType = \"span\">(\n p: DropdownMenuItemIndicatorProps<TAs>,\n): ReactElement | null {\n const s = useSelectionContext(\"ItemIndicator\");\n return (\n <Part\n {...p}\n part=\"item-indicator\"\n defaultTag=\"span\"\n data-state={\n s.checked === \"indeterminate\" ? \"indeterminate\" : s.checked ? \"checked\" : \"unchecked\"\n }\n />\n );\n}\nexport function DropdownMenuGroup<TAs extends ElementType = \"div\">(\n p: DropdownMenuGroupProps<TAs>,\n): ReactElement | null {\n return <MenuGroup {...p} />;\n}\nexport function DropdownMenuLabel<TAs extends ElementType = \"div\">(\n p: DropdownMenuLabelProps<TAs>,\n): ReactElement | null {\n return <MenuLabel {...p} />;\n}\nexport function DropdownMenuSeparator<TAs extends ElementType = \"div\">(\n p: DropdownMenuSeparatorProps<TAs>,\n): ReactElement | null {\n return <MenuSeparator {...p} />;\n}\n\ninterface SubValue {\n clickedRef: RefObject<boolean>;\n contentRef: React.RefObject<HTMLElement | null>;\n open: boolean;\n popover: ReturnType<typeof usePopover>;\n anchor: ReturnType<typeof useAnchorPosition>;\n triggerRef: React.RefObject<HTMLElement | null>;\n}\nconst [SubProvider, useSubContext] = createPartContext<SubValue>(\"DropdownMenu\", \"Sub\");\nexport function DropdownMenuSub(props: DropdownMenuSubProps): ReactElement | null {\n const { children, defaultOpen, onOpenChange, open } = props;\n const contentRef = useRef<HTMLElement | null>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const popover = usePopover({\n mode: \"auto\",\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(open !== undefined ? { open } : {}),\n ...(onOpenChange\n ? {\n onOpenChange: (next, details) =>\n onOpenChange(next, { event: details.event, reason: mapReason(details.reason) }),\n }\n : {}),\n });\n const anchor = useAnchorPosition();\n const clickedRef = useRef(false);\n const value = useMemo(\n () => ({ anchor, clickedRef, contentRef, open: popover.open, popover, triggerRef }),\n [anchor, popover, clickedRef],\n );\n return <SubProvider value={value}>{children}</SubProvider>;\n}\nexport function DropdownMenuSubTrigger<TAs extends ElementType = \"button\">(\n props: DropdownMenuSubTriggerProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n disabled = false,\n textValue,\n ...consumerProps\n } = props as DropdownMenuSubTriggerProps<\"div\">;\n const sub = useSubContext(\"SubTrigger\");\n const root = useDropdownMenuContext(\"SubTrigger\");\n const { clickedRef } = sub;\n const { onClick, onKeyDown, onPointerEnter, ...withoutEvents } =\n consumerProps as typeof consumerProps & {\n onClick?: (event: MouseEvent<HTMLElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const openKey = root.dir === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n if (event.key === openKey || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n clickedRef.current = true;\n sub.popover.openPopover();\n queueMicrotask(() => focusMenuItem(sub.contentRef.current));\n }\n };\n const handlePointerEnter = () => {\n clickedRef.current = false;\n sub.popover.openPopover();\n };\n const handlePointerLeave = (event: PointerEvent<HTMLElement>) => {\n if (clickedRef.current) return;\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && sub.contentRef.current?.contains(nextTarget)) return;\n sub.popover.close();\n };\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n clickedRef.current = true;\n if (!sub.open) {\n (sub.popover.triggerProps.onClick as (event: MouseEvent<HTMLElement>) => void)(event);\n }\n };\n const triggerProps = {\n ...(withoutEvents as object),\n ...sub.popover.triggerProps,\n ...sub.anchor.anchorProps,\n command: \"show-popover\",\n ref: sub.triggerRef,\n role: \"menuitem\",\n \"aria-haspopup\": \"menu\" as const,\n \"aria-expanded\": sub.open,\n \"data-part\": \"sub-trigger\",\n \"data-state\": sub.open ? \"open\" : \"closed\",\n onClick: composeEventHandlers(onClick, handleClick),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyDown),\n onPointerEnter: composeEventHandlers(onPointerEnter, handlePointerEnter),\n onPointerLeave: handlePointerLeave,\n children,\n };\n if (render)\n return (\n <RovingFocusItem\n {...(triggerProps as object)}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n render={(p) => render(p, { disabled, open: sub.open })}\n />\n );\n return (\n <RovingFocusItem\n as={as ?? \"button\"}\n {...(triggerProps as object)}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n />\n );\n}\nexport function DropdownMenuSubContent<TAs extends ElementType = \"div\">(\n props: DropdownMenuSubContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"start\",\n as,\n render,\n side = \"right\",\n children,\n ...consumerProps\n } = props as DropdownMenuSubContentProps<\"div\">;\n const sub = useSubContext(\"SubContent\");\n const root = useDropdownMenuContext(\"SubContent\");\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const closeKey = root.dir === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n if (event.key === closeKey || event.key === \"Escape\") {\n event.preventDefault();\n sub.popover.close();\n sub.triggerRef.current?.focus();\n }\n };\n const contentProps = {\n ...consumerProps,\n ...sub.popover.popupProps,\n ...sub.anchor.positionerProps,\n ref: useMergedRefs(sub.popover.popupRef, sub.contentRef),\n role: \"menu\",\n \"data-part\": \"sub-content\",\n \"data-state\": sub.open ? \"open\" : \"closed\",\n \"data-side\": side,\n \"data-align\": align,\n onKeyDown: handleKeyDown,\n onPointerLeave: (event: PointerEvent<HTMLElement>) => {\n if (sub.clickedRef.current) return;\n const nextTarget = event.relatedTarget;\n if (!(nextTarget instanceof Node) || !sub.triggerRef.current?.contains(nextTarget)) {\n sub.popover.close();\n }\n },\n children,\n };\n if (render)\n return (\n <RovingFocusRoot\n direction={root.dir}\n loop={root.loop}\n orientation=\"vertical\"\n {...contentProps}\n render={(p) => render(p, { open: sub.open })}\n />\n );\n return (\n <RovingFocusRoot\n as={as ?? \"div\"}\n direction={root.dir}\n loop={root.loop}\n orientation=\"vertical\"\n {...contentProps}\n />\n );\n}\n\nDropdownMenuRoot.displayName = \"DropdownMenuRoot\";\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\nMenuItem.displayName = \"DropdownMenuItemBase\";\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\nDropdownMenuCheckboxItem.displayName = \"DropdownMenuCheckboxItem\";\nDropdownMenuRadioGroup.displayName = \"DropdownMenuRadioGroup\";\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\";\nPart.displayName = \"DropdownMenuPart\";\nDropdownMenuItemIcon.displayName = \"DropdownMenuItemIcon\";\nDropdownMenuItemText.displayName = \"DropdownMenuItemText\";\nDropdownMenuItemDescription.displayName = \"DropdownMenuItemDescription\";\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\nDropdownMenuItemIndicator.displayName = \"DropdownMenuItemIndicator\";\nDropdownMenuGroup.displayName = \"DropdownMenuGroup\";\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\";\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\";\nDropdownMenuSub.displayName = \"DropdownMenuSub\";\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\";\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\";\n\nexport const DropdownMenu = {\n Bar: DropdownMenuBar,\n Root: DropdownMenuRoot,\n Trigger: DropdownMenuTrigger,\n Content: DropdownMenuContent,\n Group: DropdownMenuGroup,\n Label: DropdownMenuLabel,\n Item: DropdownMenuItem,\n ItemIcon: DropdownMenuItemIcon,\n ItemText: DropdownMenuItemText,\n ItemDescription: DropdownMenuItemDescription,\n Shortcut: DropdownMenuShortcut,\n Separator: DropdownMenuSeparator,\n CheckboxItem: DropdownMenuCheckboxItem,\n ItemIndicator: DropdownMenuItemIndicator,\n RadioGroup: DropdownMenuRadioGroup,\n RadioItem: DropdownMenuRadioItem,\n Sub: DropdownMenuSub,\n SubTrigger: DropdownMenuSubTrigger,\n SubContent: DropdownMenuSubContent,\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/dropdown-menu/DropdownMenu.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef } from \"react\";\nimport type {\n ElementType,\n KeyboardEvent,\n MouseEvent,\n PointerEvent,\n ReactElement,\n RefObject,\n SyntheticEvent,\n} from \"react\";\nimport { useControllableState, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport { createPartContext, splitRef } from \"@gunkin/uiify/core\";\nimport { useAnchorPosition } from \"@gunkin/uiify/core/anchor-position\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useDirection } from \"@gunkin/uiify/core/direction\";\nimport { createHoverIntentStore } from \"@gunkin/uiify/core/hover-intent-store\";\nimport type { HoverIntentStore } from \"@gunkin/uiify/core/hover-intent-store\";\nimport type { OpenChangeDetails } from \"@gunkin/uiify/core/open-change-details\";\nimport { usePopover } from \"@gunkin/uiify/core/popover\";\nimport { RovingFocusItem, RovingFocusRoot } from \"@gunkin/uiify/core/roving-focus\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { createMenuSelectEvent } from \"../internal/menu/menu-utils.js\";\nimport { focusMenuItem } from \"../internal/menu/focus-menu-item.js\";\nimport { MenuGroup, MenuLabel, MenuSeparator } from \"../internal/menu/menu-parts.js\";\nimport { useMenuSurface } from \"../internal/menu/use-menu-surface.js\";\nimport { DropdownMenuBar } from \"./DropdownMenuBar.js\";\nimport type {\n DropdownMenuCheckedState,\n DropdownMenuCheckboxItemProps,\n DropdownMenuContentProps,\n DropdownMenuContextValue,\n DropdownMenuGroupProps,\n DropdownMenuItemDescriptionProps,\n DropdownMenuItemIconProps,\n DropdownMenuItemIndicatorProps,\n DropdownMenuItemProps,\n DropdownMenuItemTextProps,\n DropdownMenuLabelProps,\n DropdownMenuOpenChangeReason,\n DropdownMenuPartProps,\n DropdownMenuRadioGroupProps,\n DropdownMenuRadioItemProps,\n DropdownMenuRootProps,\n DropdownMenuSeparatorProps,\n DropdownMenuShortcutProps,\n DropdownMenuSubContentProps,\n DropdownMenuSubProps,\n DropdownMenuSubTriggerProps,\n DropdownMenuTriggerProps,\n} from \"./types.js\";\n\nexport type { MenuSelectEvent } from \"./types.js\";\n\nfunction mapReason(reason: OpenChangeDetails[\"reason\"]): DropdownMenuOpenChangeReason {\n if (reason === \"escape-key\") return \"escape\";\n if (reason === \"focus-outside\") return \"focus-out\";\n if (reason === \"native-toggle\") return \"trigger-press\";\n return reason;\n}\n\nconst [DropdownMenuProvider, useDropdownMenuContext] =\n createPartContext<DropdownMenuContextValue>(\"DropdownMenu\");\n\nexport function DropdownMenuRoot(props: DropdownMenuRootProps): ReactElement | null {\n const {\n children,\n className,\n defaultOpen,\n dir: localDir,\n disabled = false,\n loop = true,\n onOpenChange,\n open,\n } = props;\n const dir = useDirection(localDir);\n const surface = useMenuSurface({\n mode: \"auto\",\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(open !== undefined ? { open } : {}),\n ...(onOpenChange\n ? {\n onOpenChange: (next, details) =>\n onOpenChange(next, { event: details.event, reason: mapReason(details.reason) }),\n }\n : {}),\n });\n const intentRef = useRef<HoverIntentStore | null>(null);\n intentRef.current ??= createHoverIntentStore({ closeDelay: 150, openDelay: 0 });\n const intent = intentRef.current;\n const hoverEnabledRef = useRef(false);\n // Read by the scheduled close so a timer from a menu that already closed\n // cannot emit onOpenChange(false) over a sibling that opened since.\n const openRef = useRef(surface.open);\n openRef.current = surface.open;\n\n const cancelHoverClose = useCallback(() => intent.clearCloseTimer(), [intent]);\n const scheduleHoverClose = useCallback(() => {\n intent.scheduleClose(() => {\n if (openRef.current) surface.close();\n });\n }, [intent, surface]);\n\n const value = useMemo(\n () => ({\n ...surface,\n cancelHoverClose,\n dir,\n disabled,\n hoverEnabledRef,\n loop,\n scheduleHoverClose,\n }),\n [cancelHoverClose, surface, dir, disabled, loop, scheduleHoverClose],\n );\n return (\n <div className={className} data-uiify-menu=\"\">\n <DropdownMenuProvider value={value}>{children}</DropdownMenuProvider>\n </div>\n );\n}\n\nexport function DropdownMenuTrigger<TAs extends ElementType = \"button\">(\n props: DropdownMenuTriggerProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n className,\n openOnHover = false,\n ...consumerProps\n } = props as DropdownMenuTriggerProps<\"button\"> & { openOnHover?: boolean };\n const {\n anchorProps,\n cancelHoverClose,\n close,\n disabled,\n focusTrigger,\n hoverEnabledRef,\n open,\n openPopover,\n openToItem,\n scheduleHoverClose,\n setTriggerElement,\n triggerProps,\n } = useDropdownMenuContext(\"Trigger\");\n hoverEnabledRef.current = openOnHover;\n const [consumerRef, withoutRef] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const mergedRef = useMergedRefs(setTriggerElement, consumerRef);\n const nativeButton = !as || as === \"button\";\n const {\n onClick: consumerOnClick,\n onKeyDown: consumerOnKeyDown,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = withoutRef as {\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLButtonElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n const internalOnClick = triggerProps.onClick as (event: MouseEvent<HTMLButtonElement>) => void;\n const handlePointerEnter = () => {\n if (disabled) return;\n cancelHoverClose();\n if (!open) openPopover();\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (disabled) return;\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (open) close();\n else openToItem(false);\n } else if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n openToItem(event.key === \"ArrowUp\");\n } else if (event.key === \"Escape\" && open) {\n event.preventDefault();\n close();\n focusTrigger();\n }\n };\n return useRenderElement({\n as,\n defaultTag: \"button\",\n render,\n props: {\n ...withoutRef,\n ...triggerProps,\n ...anchorProps,\n ref: mergedRef,\n ...(nativeButton ? { \"data-uiify-button\": \"\" } : {}),\n \"aria-haspopup\": \"menu\",\n \"data-part\": \"trigger\",\n \"data-state\": open ? \"open\" : \"closed\",\n \"data-disabled\": disabled ? \"\" : undefined,\n disabled: nativeButton && disabled ? true : undefined,\n ...(nativeButton && !triggerProps.type ? { type: \"button\" } : {}),\n ...(className ? { className } : {}),\n onClick: disabled ? consumerOnClick : composeEventHandlers(consumerOnClick, internalOnClick),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ...(openOnHover && !disabled\n ? {\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, handlePointerEnter),\n onPointerLeave: composeEventHandlers(consumerOnPointerLeave, scheduleHoverClose),\n }\n : {}),\n },\n state: { open },\n });\n}\n\nexport function DropdownMenuContent<TAs extends ElementType = \"div\">(\n props: DropdownMenuContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"start\",\n as,\n className,\n side = \"bottom\",\n children,\n render,\n ...consumerProps\n } = props as DropdownMenuContentProps<\"div\">;\n const {\n cancelHoverClose,\n close,\n contentRef,\n dir,\n focusTrigger,\n hoverEnabledRef,\n loop,\n open,\n popupProps,\n popupRef,\n positionerProps,\n scheduleHoverClose,\n } = useDropdownMenuContext(\"Content\");\n const [consumerRef, withoutRef] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const mergedRef = useMergedRefs(popupRef, contentRef, consumerRef);\n const {\n onKeyDown: consumerOnKeyDown,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = withoutRef as {\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n focusTrigger();\n }\n };\n const contentProps = {\n ...withoutRef,\n ...popupProps,\n ...positionerProps,\n ref: mergedRef,\n role: \"menu\",\n \"data-part\": \"content\",\n \"data-align\": align,\n \"data-side\": side,\n \"data-state\": open ? \"open\" : \"closed\",\n ...(className ? { className } : {}),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ...(hoverEnabledRef.current\n ? {\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, cancelHoverClose),\n onPointerLeave: composeEventHandlers(consumerOnPointerLeave, scheduleHoverClose),\n }\n : {}),\n children,\n };\n if (render)\n return (\n <RovingFocusRoot\n direction={dir}\n loop={loop}\n orientation=\"vertical\"\n {...contentProps}\n render={(p) => render(p, { open })}\n />\n );\n return (\n <RovingFocusRoot\n as={as ?? \"div\"}\n direction={dir}\n loop={loop}\n orientation=\"vertical\"\n {...contentProps}\n />\n );\n}\n\ninterface ItemActivationOptions {\n closeOnSelect: boolean;\n disabled: boolean;\n onSelect?: DropdownMenuItemProps[\"onSelect\"];\n onStateChange?: () => void;\n}\nfunction useItemActivation({\n closeOnSelect,\n disabled,\n onSelect,\n onStateChange,\n}: ItemActivationOptions) {\n const { close, focusTrigger } = useDropdownMenuContext(\"Item\");\n const select = (event: SyntheticEvent<HTMLElement>) => {\n if (disabled) return;\n const selectEvent = createMenuSelectEvent();\n onSelect?.(selectEvent);\n if (!selectEvent.defaultPrevented) {\n onStateChange?.();\n if (closeOnSelect) {\n close();\n focusTrigger();\n }\n }\n event.preventDefault();\n };\n return {\n select,\n keyDown: (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") select(event);\n },\n };\n}\n\nfunction MenuItem<TAs extends ElementType>(\n props: DropdownMenuItemProps<TAs> & {\n roleName: string;\n checked?: boolean | \"mixed\";\n state?: string;\n onStateChange?: () => void;\n defaultClose: boolean;\n },\n): ReactElement | null {\n const {\n as,\n render,\n children,\n className,\n closeOnSelect,\n disabled = false,\n onSelect,\n textValue,\n roleName,\n checked,\n state,\n onStateChange,\n defaultClose,\n ...consumerProps\n } = props as DropdownMenuItemProps<\"div\"> & {\n roleName: string;\n checked?: boolean | \"mixed\";\n state?: string;\n onStateChange?: () => void;\n defaultClose: boolean;\n };\n const { onClick: consumerOnClick, onKeyDown: consumerOnKeyDown } = consumerProps as {\n onClick?: (event: SyntheticEvent<HTMLElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n };\n const activation = useItemActivation({\n closeOnSelect: closeOnSelect ?? defaultClose,\n disabled,\n onSelect,\n ...(onStateChange ? { onStateChange } : {}),\n });\n const itemProps = {\n ...consumerProps,\n role: roleName,\n \"aria-checked\": checked,\n \"data-part\": roleName === \"menuitem\" ? \"item\" : roleName.replace(\"menuitem\", \"\") + \"-item\",\n \"data-state\": state,\n ...(className ? { className } : {}),\n onClick: composeEventHandlers(consumerOnClick, activation.select),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, activation.keyDown),\n children,\n };\n if (render)\n return (\n <RovingFocusItem\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n {...(itemProps as object)}\n render={(p) => render(p, { disabled })}\n />\n );\n return (\n <RovingFocusItem\n as={as ?? \"div\"}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n {...(itemProps as object)}\n />\n );\n}\n\nexport function DropdownMenuItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuItemProps<TAs>,\n): ReactElement | null {\n return <MenuItem {...props} roleName=\"menuitem\" defaultClose />;\n}\n\ninterface SelectionContextValue {\n checked: DropdownMenuCheckedState;\n kind: \"checkbox\" | \"radio\";\n}\nconst [SelectionProvider, useSelectionContext] = createPartContext<SelectionContextValue>(\n \"DropdownMenu\",\n \"ItemIndicator\",\n);\n\nexport function DropdownMenuCheckboxItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuCheckboxItemProps<TAs>,\n): ReactElement | null {\n const { checked: controlled, defaultChecked = false, onCheckedChange, ...itemProps } = props;\n const [checked, setChecked] = useControllableState<DropdownMenuCheckedState>({\n value: controlled,\n defaultValue: defaultChecked,\n });\n const next = checked === \"indeterminate\" ? true : !checked;\n return (\n <SelectionProvider value={{ checked, kind: \"checkbox\" }}>\n <MenuItem\n {...(itemProps as DropdownMenuItemProps<ElementType>)}\n roleName=\"menuitemcheckbox\"\n checked={checked === \"indeterminate\" ? \"mixed\" : checked}\n state={checked === \"indeterminate\" ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\"}\n defaultClose={false}\n onStateChange={() => {\n setChecked(next);\n onCheckedChange?.(next);\n }}\n />\n </SelectionProvider>\n );\n}\n\ninterface RadioContextValue {\n setValue: (value: string) => void;\n value: string | undefined;\n}\nconst [RadioProvider, useRadioContext] = createPartContext<RadioContextValue>(\n \"DropdownMenu\",\n \"RadioGroup\",\n);\nexport function DropdownMenuRadioGroup<TAs extends ElementType = \"div\">(\n props: DropdownMenuRadioGroupProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n defaultValue,\n onValueChange,\n value: controlled,\n ...consumerProps\n } = props as DropdownMenuRadioGroupProps<\"div\">;\n const [value, setValue] = useControllableState<string | undefined>({\n value: controlled,\n defaultValue,\n ...(onValueChange\n ? {\n onChange: (next) => {\n if (next !== undefined) onValueChange(next);\n },\n }\n : {}),\n });\n return (\n <RadioProvider value={{ value, setValue }}>\n {useRenderElement({\n as,\n defaultTag: \"div\",\n render,\n props: { ...consumerProps, role: \"group\", \"data-part\": \"radio-group\", children },\n state: { value },\n })}\n </RadioProvider>\n );\n}\nexport function DropdownMenuRadioItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuRadioItemProps<TAs>,\n): ReactElement | null {\n const { value, ...itemProps } = props;\n const radio = useRadioContext(\"RadioItem\");\n const checked = radio.value === value;\n return (\n <SelectionProvider value={{ checked, kind: \"radio\" }}>\n <MenuItem\n {...(itemProps as DropdownMenuItemProps<ElementType>)}\n roleName=\"menuitemradio\"\n checked={checked}\n state={checked ? \"checked\" : \"unchecked\"}\n defaultClose={false}\n onStateChange={() => radio.setValue(value)}\n />\n </SelectionProvider>\n );\n}\n\nfunction Part<TAs extends ElementType = \"span\">({\n part,\n defaultTag,\n ...props\n}: DropdownMenuPartProps<TAs> & { part: string; defaultTag: ElementType }): ReactElement | null {\n const { as, render, children, className, ...consumerProps } =\n props as DropdownMenuPartProps<\"span\">;\n return useRenderElement({\n as,\n defaultTag,\n render,\n props: { ...consumerProps, \"data-part\": part, ...(className ? { className } : {}), children },\n state: {},\n });\n}\nexport const DropdownMenuItemIcon = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemIconProps<TAs>,\n) => <Part {...p} part=\"item-icon\" defaultTag=\"span\" />;\nexport const DropdownMenuItemText = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemTextProps<TAs>,\n) => <Part {...p} part=\"item-text\" defaultTag=\"span\" />;\nexport const DropdownMenuItemDescription = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemDescriptionProps<TAs>,\n) => <Part {...p} part=\"item-description\" defaultTag=\"span\" />;\nexport const DropdownMenuShortcut = <TAs extends ElementType = \"span\">(\n p: DropdownMenuShortcutProps<TAs>,\n) => <Part {...p} part=\"shortcut\" defaultTag=\"kbd\" />;\nexport function DropdownMenuItemIndicator<TAs extends ElementType = \"span\">(\n p: DropdownMenuItemIndicatorProps<TAs>,\n): ReactElement | null {\n const s = useSelectionContext(\"ItemIndicator\");\n return (\n <Part\n {...p}\n part=\"item-indicator\"\n defaultTag=\"span\"\n data-state={\n s.checked === \"indeterminate\" ? \"indeterminate\" : s.checked ? \"checked\" : \"unchecked\"\n }\n />\n );\n}\nexport function DropdownMenuGroup<TAs extends ElementType = \"div\">(\n p: DropdownMenuGroupProps<TAs>,\n): ReactElement | null {\n return <MenuGroup {...p} />;\n}\nexport function DropdownMenuLabel<TAs extends ElementType = \"div\">(\n p: DropdownMenuLabelProps<TAs>,\n): ReactElement | null {\n return <MenuLabel {...p} />;\n}\nexport function DropdownMenuSeparator<TAs extends ElementType = \"div\">(\n p: DropdownMenuSeparatorProps<TAs>,\n): ReactElement | null {\n return <MenuSeparator {...p} />;\n}\n\ninterface SubValue {\n clickedRef: RefObject<boolean>;\n contentRef: React.RefObject<HTMLElement | null>;\n open: boolean;\n popover: ReturnType<typeof usePopover>;\n anchor: ReturnType<typeof useAnchorPosition>;\n triggerRef: React.RefObject<HTMLElement | null>;\n}\nconst [SubProvider, useSubContext] = createPartContext<SubValue>(\"DropdownMenu\", \"Sub\");\nexport function DropdownMenuSub(props: DropdownMenuSubProps): ReactElement | null {\n const { children, defaultOpen, onOpenChange, open } = props;\n const contentRef = useRef<HTMLElement | null>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const popover = usePopover({\n mode: \"auto\",\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(open !== undefined ? { open } : {}),\n ...(onOpenChange\n ? {\n onOpenChange: (next, details) =>\n onOpenChange(next, { event: details.event, reason: mapReason(details.reason) }),\n }\n : {}),\n });\n const anchor = useAnchorPosition();\n const clickedRef = useRef(false);\n const value = useMemo(\n () => ({ anchor, clickedRef, contentRef, open: popover.open, popover, triggerRef }),\n [anchor, popover, clickedRef],\n );\n return <SubProvider value={value}>{children}</SubProvider>;\n}\nexport function DropdownMenuSubTrigger<TAs extends ElementType = \"button\">(\n props: DropdownMenuSubTriggerProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n disabled = false,\n textValue,\n ...consumerProps\n } = props as DropdownMenuSubTriggerProps<\"div\">;\n const sub = useSubContext(\"SubTrigger\");\n const root = useDropdownMenuContext(\"SubTrigger\");\n const { clickedRef } = sub;\n const { onClick, onKeyDown, onPointerEnter, ...withoutEvents } =\n consumerProps as typeof consumerProps & {\n onClick?: (event: MouseEvent<HTMLElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const openKey = root.dir === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n if (event.key === openKey || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n clickedRef.current = true;\n sub.popover.openPopover();\n queueMicrotask(() => focusMenuItem(sub.contentRef.current));\n }\n };\n const handlePointerEnter = () => {\n clickedRef.current = false;\n sub.popover.openPopover();\n };\n const handlePointerLeave = (event: PointerEvent<HTMLElement>) => {\n if (clickedRef.current) return;\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && sub.contentRef.current?.contains(nextTarget)) return;\n sub.popover.close();\n };\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n clickedRef.current = true;\n if (!sub.open) {\n (sub.popover.triggerProps.onClick as (event: MouseEvent<HTMLElement>) => void)(event);\n }\n };\n const triggerProps = {\n ...(withoutEvents as object),\n ...sub.popover.triggerProps,\n ...sub.anchor.anchorProps,\n command: \"show-popover\",\n ref: sub.triggerRef,\n role: \"menuitem\",\n \"aria-haspopup\": \"menu\" as const,\n \"aria-expanded\": sub.open,\n \"data-part\": \"sub-trigger\",\n \"data-state\": sub.open ? \"open\" : \"closed\",\n onClick: composeEventHandlers(onClick, handleClick),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyDown),\n onPointerEnter: composeEventHandlers(onPointerEnter, handlePointerEnter),\n onPointerLeave: handlePointerLeave,\n children,\n };\n if (render)\n return (\n <RovingFocusItem\n {...(triggerProps as object)}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n render={(p) => render(p, { disabled, open: sub.open })}\n />\n );\n return (\n <RovingFocusItem\n as={as ?? \"button\"}\n {...(triggerProps as object)}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n />\n );\n}\nexport function DropdownMenuSubContent<TAs extends ElementType = \"div\">(\n props: DropdownMenuSubContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"start\",\n as,\n render,\n side = \"right\",\n children,\n ...consumerProps\n } = props as DropdownMenuSubContentProps<\"div\">;\n const sub = useSubContext(\"SubContent\");\n const root = useDropdownMenuContext(\"SubContent\");\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const closeKey = root.dir === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n if (event.key === closeKey || event.key === \"Escape\") {\n event.preventDefault();\n sub.popover.close();\n sub.triggerRef.current?.focus();\n }\n };\n const contentProps = {\n ...consumerProps,\n ...sub.popover.popupProps,\n ...sub.anchor.positionerProps,\n ref: useMergedRefs(sub.popover.popupRef, sub.contentRef),\n role: \"menu\",\n \"data-part\": \"sub-content\",\n \"data-state\": sub.open ? \"open\" : \"closed\",\n \"data-side\": side,\n \"data-align\": align,\n onKeyDown: handleKeyDown,\n onPointerLeave: (event: PointerEvent<HTMLElement>) => {\n if (sub.clickedRef.current) return;\n const nextTarget = event.relatedTarget;\n if (!(nextTarget instanceof Node) || !sub.triggerRef.current?.contains(nextTarget)) {\n sub.popover.close();\n }\n },\n children,\n };\n if (render)\n return (\n <RovingFocusRoot\n direction={root.dir}\n loop={root.loop}\n orientation=\"vertical\"\n {...contentProps}\n render={(p) => render(p, { open: sub.open })}\n />\n );\n return (\n <RovingFocusRoot\n as={as ?? \"div\"}\n direction={root.dir}\n loop={root.loop}\n orientation=\"vertical\"\n {...contentProps}\n />\n );\n}\n\nDropdownMenuRoot.displayName = \"DropdownMenuRoot\";\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\nMenuItem.displayName = \"DropdownMenuItemBase\";\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\nDropdownMenuCheckboxItem.displayName = \"DropdownMenuCheckboxItem\";\nDropdownMenuRadioGroup.displayName = \"DropdownMenuRadioGroup\";\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\";\nPart.displayName = \"DropdownMenuPart\";\nDropdownMenuItemIcon.displayName = \"DropdownMenuItemIcon\";\nDropdownMenuItemText.displayName = \"DropdownMenuItemText\";\nDropdownMenuItemDescription.displayName = \"DropdownMenuItemDescription\";\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\nDropdownMenuItemIndicator.displayName = \"DropdownMenuItemIndicator\";\nDropdownMenuGroup.displayName = \"DropdownMenuGroup\";\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\";\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\";\nDropdownMenuSub.displayName = \"DropdownMenuSub\";\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\";\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\";\n\nexport const DropdownMenu = {\n Bar: DropdownMenuBar,\n Root: DropdownMenuRoot,\n Trigger: DropdownMenuTrigger,\n Content: DropdownMenuContent,\n Group: DropdownMenuGroup,\n Label: DropdownMenuLabel,\n Item: DropdownMenuItem,\n ItemIcon: DropdownMenuItemIcon,\n ItemText: DropdownMenuItemText,\n ItemDescription: DropdownMenuItemDescription,\n Shortcut: DropdownMenuShortcut,\n Separator: DropdownMenuSeparator,\n CheckboxItem: DropdownMenuCheckboxItem,\n ItemIndicator: DropdownMenuItemIndicator,\n RadioGroup: DropdownMenuRadioGroup,\n RadioItem: DropdownMenuRadioItem,\n Sub: DropdownMenuSub,\n SubTrigger: DropdownMenuSubTrigger,\n SubContent: DropdownMenuSubContent,\n};\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  /** The modal dialog surface `ModalContent` renders. */
2
- export declare const MODAL_DIALOG = "dialog[data-uiify-modal][data-part=\"content\"]";
2
+ export declare const SHEET_DIALOG = "dialog:is([data-uiify-modal], [data-uiify-drawer])[data-part=\"content\"]";
3
3
  interface Box {
4
4
  readonly left: number;
5
5
  readonly right: number;
@@ -1 +1 @@
1
- {"version":3,"file":"dialog-dismiss.d.ts","sourceRoot":"","sources":["../../../src/components/enhance/dialog-dismiss.ts"],"names":[],"mappings":"AAEA,uDAAuD;AACvD,eAAO,MAAM,YAAY,oDAAkD,CAAC;AAE5E,UAAU,GAAG;IACX,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAMxF;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAe,GAAG,OAAO,CAG/D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,QAAmB,GAAG,MAAM,IAAI,CA8BxE"}
1
+ {"version":3,"file":"dialog-dismiss.d.ts","sourceRoot":"","sources":["../../../src/components/enhance/dialog-dismiss.ts"],"names":[],"mappings":"AAEA,uDAAuD;AACvD,eAAO,MAAM,YAAY,8EACkD,CAAC;AAE5E,UAAU,GAAG;IACX,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAMxF;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAe,GAAG,OAAO,CAG/D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,QAAmB,GAAG,MAAM,IAAI,CA2CxE"}
@@ -1,5 +1,5 @@
1
- import { readBox } from "./internal/read-box.js";
2
- const MODAL_DIALOG = 'dialog[data-uiify-modal][data-part="content"]';
1
+ import { createBoxObserver } from "./internal/box-observer.js";
2
+ const SHEET_DIALOG = 'dialog:is([data-uiify-modal], [data-uiify-drawer])[data-part="content"]';
3
3
  function isOutside(box, x, y) {
4
4
  return x < box.left || x > box.right || y < box.top || y > box.bottom;
5
5
  }
@@ -15,32 +15,41 @@ function supportsClosedBy(view = window) {
15
15
  function attachBackdropClose(doc = document) {
16
16
  if (supportsClosedBy(doc.defaultView ?? window)) return () => {
17
17
  };
18
+ const boxes = createBoxObserver(doc);
18
19
  let pressed = null;
19
20
  const backdropTarget = (event) => {
20
21
  const dialog = event.target;
21
- if (!(dialog instanceof HTMLDialogElement) || !dialog.matches(MODAL_DIALOG)) return null;
22
- if (dialog.getAttribute("closedby") !== "any") return null;
23
- const box = readBox(dialog);
24
- return isOutside(box, event.clientX, event.clientY) ? dialog : null;
22
+ return dialog instanceof HTMLDialogElement && dialog.matches(SHEET_DIALOG) && dialog.getAttribute("closedby") === "any" ? dialog : null;
25
23
  };
26
24
  const onPointerDown = (event) => {
27
- pressed = backdropTarget(event);
25
+ const dialog = backdropTarget(event);
26
+ pressed = dialog ? { dialog, outside: null } : null;
27
+ const start = pressed;
28
+ if (start)
29
+ boxes.read(start.dialog, (box) => {
30
+ start.outside = isOutside(box, event.clientX, event.clientY);
31
+ });
28
32
  };
29
33
  const onClick = (event) => {
30
34
  const start = pressed;
31
35
  pressed = null;
32
- if (event.defaultPrevented || !start || backdropTarget(event) !== start) return;
33
- requestCloseDialog(start);
36
+ if (event.defaultPrevented || !start || backdropTarget(event) !== start.dialog) return;
37
+ boxes.read(start.dialog, (box) => {
38
+ if (start.dialog.open && start.outside && isOutside(box, event.clientX, event.clientY)) {
39
+ requestCloseDialog(start.dialog);
40
+ }
41
+ });
34
42
  };
35
43
  doc.addEventListener("pointerdown", onPointerDown);
36
44
  doc.addEventListener("click", onClick);
37
45
  return () => {
38
46
  doc.removeEventListener("pointerdown", onPointerDown);
39
47
  doc.removeEventListener("click", onClick);
48
+ boxes.disconnect();
40
49
  };
41
50
  }
42
51
  export {
43
- MODAL_DIALOG,
52
+ SHEET_DIALOG,
44
53
  attachBackdropClose,
45
54
  isOutside,
46
55
  requestCloseDialog,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/enhance/dialog-dismiss.ts"],"sourcesContent":["import { readBox } from \"./internal/read-box.js\";\n\n/** The modal dialog surface `ModalContent` renders. */\nexport const MODAL_DIALOG = 'dialog[data-uiify-modal][data-part=\"content\"]';\n\ninterface Box {\n readonly left: number;\n readonly right: number;\n readonly top: number;\n readonly bottom: number;\n}\n\n/** True when the point lies outside the border box, that is on the dialog's `::backdrop`. */\nexport function isOutside(box: Box, x: number, y: number): boolean {\n return x < box.left || x > box.right || y < box.top || y > box.bottom;\n}\n\n/** `requestClose()` lets a `cancel` handler veto; engines without it get a plain `close()`. */\nexport function requestCloseDialog(dialog: HTMLDialogElement, returnValue?: string): void {\n const { requestClose } = dialog as HTMLDialogElement & {\n requestClose?: (value?: string) => void;\n };\n if (typeof requestClose === \"function\") requestClose.call(dialog, returnValue);\n else dialog.close(returnValue);\n}\n\n/** Chrome 134+ and Firefox 141+ implement `closedby`; Safari does not (iOS 27). */\nexport function supportsClosedBy(view: Window = window): boolean {\n const { HTMLDialogElement: DialogCtor } = view as unknown as typeof globalThis;\n return \"closedBy\" in DialogCtor.prototype;\n}\n\n/**\n * Backdrop-tap dismissal for engines without `closedby`. The markup already says\n * `closedby=\"any\"`; where the browser cannot act on it, this closes the dialog when a press\n * and its click both land on the backdrop. Attaches nothing where `closedBy` exists.\n */\nexport function attachBackdropClose(doc: Document = document): () => void {\n if (supportsClosedBy(doc.defaultView ?? window)) return () => {};\n\n let pressed: HTMLDialogElement | null = null;\n\n const backdropTarget = (event: MouseEvent): HTMLDialogElement | null => {\n const dialog = event.target;\n if (!(dialog instanceof HTMLDialogElement) || !dialog.matches(MODAL_DIALOG)) return null;\n if (dialog.getAttribute(\"closedby\") !== \"any\") return null;\n const box = readBox(dialog);\n return isOutside(box, event.clientX, event.clientY) ? dialog : null;\n };\n\n const onPointerDown = (event: PointerEvent): void => {\n pressed = backdropTarget(event);\n };\n\n const onClick = (event: MouseEvent): void => {\n const start = pressed;\n pressed = null;\n if (event.defaultPrevented || !start || backdropTarget(event) !== start) return;\n requestCloseDialog(start);\n };\n\n doc.addEventListener(\"pointerdown\", onPointerDown);\n doc.addEventListener(\"click\", onClick);\n return () => {\n doc.removeEventListener(\"pointerdown\", onPointerDown);\n doc.removeEventListener(\"click\", onClick);\n };\n}\n"],"mappings":"AAAA,SAAS,eAAe;AAGjB,MAAM,eAAe;AAUrB,SAAS,UAAU,KAAU,GAAW,GAAoB;AACjE,SAAO,IAAI,IAAI,QAAQ,IAAI,IAAI,SAAS,IAAI,IAAI,OAAO,IAAI,IAAI;AACjE;AAGO,SAAS,mBAAmB,QAA2B,aAA4B;AACxF,QAAM,EAAE,aAAa,IAAI;AAGzB,MAAI,OAAO,iBAAiB,WAAY,cAAa,KAAK,QAAQ,WAAW;AAAA,MACxE,QAAO,MAAM,WAAW;AAC/B;AAGO,SAAS,iBAAiB,OAAe,QAAiB;AAC/D,QAAM,EAAE,mBAAmB,WAAW,IAAI;AAC1C,SAAO,cAAc,WAAW;AAClC;AAOO,SAAS,oBAAoB,MAAgB,UAAsB;AACxE,MAAI,iBAAiB,IAAI,eAAe,MAAM,EAAG,QAAO,MAAM;AAAA,EAAC;AAE/D,MAAI,UAAoC;AAExC,QAAM,iBAAiB,CAAC,UAAgD;AACtE,UAAM,SAAS,MAAM;AACrB,QAAI,EAAE,kBAAkB,sBAAsB,CAAC,OAAO,QAAQ,YAAY,EAAG,QAAO;AACpF,QAAI,OAAO,aAAa,UAAU,MAAM,MAAO,QAAO;AACtD,UAAM,MAAM,QAAQ,MAAM;AAC1B,WAAO,UAAU,KAAK,MAAM,SAAS,MAAM,OAAO,IAAI,SAAS;AAAA,EACjE;AAEA,QAAM,gBAAgB,CAAC,UAA8B;AACnD,cAAU,eAAe,KAAK;AAAA,EAChC;AAEA,QAAM,UAAU,CAAC,UAA4B;AAC3C,UAAM,QAAQ;AACd,cAAU;AACV,QAAI,MAAM,oBAAoB,CAAC,SAAS,eAAe,KAAK,MAAM,MAAO;AACzE,uBAAmB,KAAK;AAAA,EAC1B;AAEA,MAAI,iBAAiB,eAAe,aAAa;AACjD,MAAI,iBAAiB,SAAS,OAAO;AACrC,SAAO,MAAM;AACX,QAAI,oBAAoB,eAAe,aAAa;AACpD,QAAI,oBAAoB,SAAS,OAAO;AAAA,EAC1C;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/enhance/dialog-dismiss.ts"],"sourcesContent":["import { createBoxObserver } from \"./internal/box-observer.js\";\n\n/** The modal dialog surface `ModalContent` renders. */\nexport const SHEET_DIALOG =\n 'dialog:is([data-uiify-modal], [data-uiify-drawer])[data-part=\"content\"]';\n\ninterface Box {\n readonly left: number;\n readonly right: number;\n readonly top: number;\n readonly bottom: number;\n}\n\n/** True when the point lies outside the border box, that is on the dialog's `::backdrop`. */\nexport function isOutside(box: Box, x: number, y: number): boolean {\n return x < box.left || x > box.right || y < box.top || y > box.bottom;\n}\n\n/** `requestClose()` lets a `cancel` handler veto; engines without it get a plain `close()`. */\nexport function requestCloseDialog(dialog: HTMLDialogElement, returnValue?: string): void {\n const { requestClose } = dialog as HTMLDialogElement & {\n requestClose?: (value?: string) => void;\n };\n if (typeof requestClose === \"function\") requestClose.call(dialog, returnValue);\n else dialog.close(returnValue);\n}\n\n/** Chrome 134+ and Firefox 141+ implement `closedby`; Safari does not (iOS 27). */\nexport function supportsClosedBy(view: Window = window): boolean {\n const { HTMLDialogElement: DialogCtor } = view as unknown as typeof globalThis;\n return \"closedBy\" in DialogCtor.prototype;\n}\n\n/**\n * Backdrop-tap dismissal for engines without `closedby`. The markup already says\n * `closedby=\"any\"`; where the browser cannot act on it, this closes the dialog when a press\n * and its click both land on the backdrop. Attaches nothing where `closedBy` exists.\n */\nexport function attachBackdropClose(doc: Document = document): () => void {\n if (supportsClosedBy(doc.defaultView ?? window)) return () => {};\n\n const boxes = createBoxObserver(doc);\n let pressed: { dialog: HTMLDialogElement; outside: boolean | null } | null = null;\n\n const backdropTarget = (event: MouseEvent): HTMLDialogElement | null => {\n const dialog = event.target;\n return dialog instanceof HTMLDialogElement &&\n dialog.matches(SHEET_DIALOG) &&\n dialog.getAttribute(\"closedby\") === \"any\"\n ? dialog\n : null;\n };\n\n const onPointerDown = (event: PointerEvent): void => {\n const dialog = backdropTarget(event);\n pressed = dialog ? { dialog, outside: null } : null;\n const start = pressed;\n if (start)\n boxes.read(start.dialog, (box) => {\n start.outside = isOutside(box, event.clientX, event.clientY);\n });\n };\n\n const onClick = (event: MouseEvent): void => {\n const start = pressed;\n pressed = null;\n if (event.defaultPrevented || !start || backdropTarget(event) !== start.dialog) return;\n boxes.read(start.dialog, (box) => {\n if (start.dialog.open && start.outside && isOutside(box, event.clientX, event.clientY)) {\n requestCloseDialog(start.dialog);\n }\n });\n };\n\n doc.addEventListener(\"pointerdown\", onPointerDown);\n doc.addEventListener(\"click\", onClick);\n return () => {\n doc.removeEventListener(\"pointerdown\", onPointerDown);\n doc.removeEventListener(\"click\", onClick);\n boxes.disconnect();\n };\n}\n"],"mappings":"AAAA,SAAS,yBAAyB;AAG3B,MAAM,eACX;AAUK,SAAS,UAAU,KAAU,GAAW,GAAoB;AACjE,SAAO,IAAI,IAAI,QAAQ,IAAI,IAAI,SAAS,IAAI,IAAI,OAAO,IAAI,IAAI;AACjE;AAGO,SAAS,mBAAmB,QAA2B,aAA4B;AACxF,QAAM,EAAE,aAAa,IAAI;AAGzB,MAAI,OAAO,iBAAiB,WAAY,cAAa,KAAK,QAAQ,WAAW;AAAA,MACxE,QAAO,MAAM,WAAW;AAC/B;AAGO,SAAS,iBAAiB,OAAe,QAAiB;AAC/D,QAAM,EAAE,mBAAmB,WAAW,IAAI;AAC1C,SAAO,cAAc,WAAW;AAClC;AAOO,SAAS,oBAAoB,MAAgB,UAAsB;AACxE,MAAI,iBAAiB,IAAI,eAAe,MAAM,EAAG,QAAO,MAAM;AAAA,EAAC;AAE/D,QAAM,QAAQ,kBAAkB,GAAG;AACnC,MAAI,UAAyE;AAE7E,QAAM,iBAAiB,CAAC,UAAgD;AACtE,UAAM,SAAS,MAAM;AACrB,WAAO,kBAAkB,qBACvB,OAAO,QAAQ,YAAY,KAC3B,OAAO,aAAa,UAAU,MAAM,QAClC,SACA;AAAA,EACN;AAEA,QAAM,gBAAgB,CAAC,UAA8B;AACnD,UAAM,SAAS,eAAe,KAAK;AACnC,cAAU,SAAS,EAAE,QAAQ,SAAS,KAAK,IAAI;AAC/C,UAAM,QAAQ;AACd,QAAI;AACF,YAAM,KAAK,MAAM,QAAQ,CAAC,QAAQ;AAChC,cAAM,UAAU,UAAU,KAAK,MAAM,SAAS,MAAM,OAAO;AAAA,MAC7D,CAAC;AAAA,EACL;AAEA,QAAM,UAAU,CAAC,UAA4B;AAC3C,UAAM,QAAQ;AACd,cAAU;AACV,QAAI,MAAM,oBAAoB,CAAC,SAAS,eAAe,KAAK,MAAM,MAAM,OAAQ;AAChF,UAAM,KAAK,MAAM,QAAQ,CAAC,QAAQ;AAChC,UAAI,MAAM,OAAO,QAAQ,MAAM,WAAW,UAAU,KAAK,MAAM,SAAS,MAAM,OAAO,GAAG;AACtF,2BAAmB,MAAM,MAAM;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,iBAAiB,eAAe,aAAa;AACjD,MAAI,iBAAiB,SAAS,OAAO;AACrC,SAAO,MAAM;AACX,QAAI,oBAAoB,eAAe,aAAa;AACpD,QAAI,oBAAoB,SAAS,OAAO;AACxC,UAAM,WAAW;AAAA,EACnB;AACF;","names":[]}
@@ -0,0 +1,4 @@
1
+ import type { BoxObserver } from "../types.js";
2
+ /** Snapshot geometry after the browser's layout phase, without synchronously flushing it. */
3
+ export declare function createBoxObserver(doc: Document): BoxObserver;
4
+ //# sourceMappingURL=box-observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box-observer.d.ts","sourceRoot":"","sources":["../../../../src/components/enhance/internal/box-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,CA2B5D"}
@@ -0,0 +1,32 @@
1
+ function createBoxObserver(doc) {
2
+ const pending = /* @__PURE__ */ new Map();
3
+ const view = doc.defaultView ?? window;
4
+ let observer;
5
+ return {
6
+ read(element, callback) {
7
+ const callbacks = pending.get(element);
8
+ if (callbacks) callbacks.push(callback);
9
+ else {
10
+ pending.set(element, [callback]);
11
+ observer ??= new view.IntersectionObserver((entries) => {
12
+ for (const entry of entries) {
13
+ const callbacks2 = pending.get(entry.target);
14
+ if (!callbacks2) continue;
15
+ pending.delete(entry.target);
16
+ observer?.unobserve(entry.target);
17
+ for (const callback2 of callbacks2) callback2(entry.boundingClientRect);
18
+ }
19
+ });
20
+ observer.observe(element);
21
+ }
22
+ },
23
+ disconnect() {
24
+ pending.clear();
25
+ observer?.disconnect();
26
+ }
27
+ };
28
+ }
29
+ export {
30
+ createBoxObserver
31
+ };
32
+ //# sourceMappingURL=box-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/enhance/internal/box-observer.ts"],"sourcesContent":["import type { BoxObserver } from \"../types.js\";\n\n/** Snapshot geometry after the browser's layout phase, without synchronously flushing it. */\nexport function createBoxObserver(doc: Document): BoxObserver {\n const pending = new Map<Element, ((box: DOMRectReadOnly) => void)[]>();\n const view = doc.defaultView ?? window;\n let observer: IntersectionObserver | undefined;\n return {\n read(element, callback) {\n const callbacks = pending.get(element);\n if (callbacks) callbacks.push(callback);\n else {\n pending.set(element, [callback]);\n observer ??= new view.IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callbacks = pending.get(entry.target);\n if (!callbacks) continue;\n pending.delete(entry.target);\n observer?.unobserve(entry.target);\n for (const callback of callbacks) callback(entry.boundingClientRect);\n }\n });\n observer.observe(element);\n }\n },\n disconnect() {\n pending.clear();\n observer?.disconnect();\n },\n };\n}\n"],"mappings":"AAGO,SAAS,kBAAkB,KAA4B;AAC5D,QAAM,UAAU,oBAAI,IAAiD;AACrE,QAAM,OAAO,IAAI,eAAe;AAChC,MAAI;AACJ,SAAO;AAAA,IACL,KAAK,SAAS,UAAU;AACtB,YAAM,YAAY,QAAQ,IAAI,OAAO;AACrC,UAAI,UAAW,WAAU,KAAK,QAAQ;AAAA,WACjC;AACH,gBAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC;AAC/B,qBAAa,IAAI,KAAK,qBAAqB,CAAC,YAAY;AACtD,qBAAW,SAAS,SAAS;AAC3B,kBAAMA,aAAY,QAAQ,IAAI,MAAM,MAAM;AAC1C,gBAAI,CAACA,WAAW;AAChB,oBAAQ,OAAO,MAAM,MAAM;AAC3B,sBAAU,UAAU,MAAM,MAAM;AAChC,uBAAWC,aAAYD,WAAW,CAAAC,UAAS,MAAM,kBAAkB;AAAA,UACrE;AAAA,QACF,CAAC;AACD,iBAAS,QAAQ,OAAO;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,aAAa;AACX,cAAQ,MAAM;AACd,gBAAU,WAAW;AAAA,IACvB;AAAA,EACF;AACF;","names":["callbacks","callback"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sheet-swipe.d.ts","sourceRoot":"","sources":["../../../src/components/enhance/sheet-swipe.ts"],"names":[],"mappings":"AAGA,iGAAiG;AACjG,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAyC7C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,QAAmB,GAAG,MAAM,IAAI,CAgGrE"}
1
+ {"version":3,"file":"sheet-swipe.d.ts","sourceRoot":"","sources":["../../../src/components/enhance/sheet-swipe.ts"],"names":[],"mappings":"AAGA,iGAAiG;AACjG,eAAO,MAAM,WAAW,oBAAoB,CAAC;AA4C7C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,QAAmB,GAAG,MAAM,IAAI,CAiIrE"}
@@ -1,7 +1,7 @@
1
- import { MODAL_DIALOG, isOutside, requestCloseDialog } from "./dialog-dismiss.js";
2
- import { readBox } from "./internal/read-box.js";
1
+ import { SHEET_DIALOG, isOutside, requestCloseDialog } from "./dialog-dismiss.js";
2
+ import { createBoxObserver } from "./internal/box-observer.js";
3
3
  const SHEET_QUERY = "(width < 40rem)";
4
- const HANDLE = '[data-uiify-modal][data-part="header"], [data-uiify-modal][data-part="grabber"]';
4
+ const HANDLE = ':is([data-uiify-modal], [data-uiify-drawer]):is([data-part="header"], [data-part="grabber"], [data-part="handle"])';
5
5
  const INTERACTIVE = "a, button, input, select, textarea, [contenteditable], [data-no-swipe]";
6
6
  const SLOP = 6;
7
7
  const DISMISS_RATIO = 0.25;
@@ -22,22 +22,21 @@ function swallowNextClick(doc) {
22
22
  }
23
23
  function attachSheetSwipe(doc = document) {
24
24
  const view = doc.defaultView ?? window;
25
+ const boxes = createBoxObserver(doc);
25
26
  let press = null;
26
27
  let cancelSwallow = null;
27
28
  const startOf = (event) => {
28
29
  const origin = event.target instanceof Element ? event.target : null;
29
- const dialog = origin?.closest(MODAL_DIALOG);
30
- if (!origin || !dialog || !dialog.open) return null;
30
+ const dialog = origin?.closest(SHEET_DIALOG);
31
+ if (!origin || !dialog || !dialog.open || dialog.hasAttribute("data-snap-enabled")) return null;
31
32
  if (dialog.getAttribute("closedby") === "none" || dialog.getAttribute("data-size") === "full") {
32
33
  return null;
33
34
  }
34
35
  const handle = origin === dialog ? null : origin.closest(HANDLE);
35
- const onHandle = handle !== null && handle.closest(MODAL_DIALOG) === dialog && !origin.closest(INTERACTIVE);
36
+ const onHandle = handle !== null && handle.closest(SHEET_DIALOG) === dialog && !origin.closest(INTERACTIVE);
36
37
  if (origin !== dialog && !onHandle) return null;
37
38
  if (!view.matchMedia(SHEET_QUERY).matches) return null;
38
- const box = readBox(dialog);
39
- const onBackdrop = origin === dialog && isOutside(box, event.clientX, event.clientY);
40
- return onBackdrop || onHandle ? { dialog, height: box.height } : null;
39
+ return dialog;
41
40
  };
42
41
  const onDown = (event) => {
43
42
  if (press || !event.isPrimary) return;
@@ -45,7 +44,10 @@ function attachSheetSwipe(doc = document) {
45
44
  const start = startOf(event);
46
45
  if (!start) return;
47
46
  press = {
48
- ...start,
47
+ dialog: start,
48
+ height: 0,
49
+ pendingMove: null,
50
+ pendingEnd: null,
49
51
  dragging: false,
50
52
  lastTime: event.timeStamp,
51
53
  lastY: event.clientY,
@@ -53,9 +55,30 @@ function attachSheetSwipe(doc = document) {
53
55
  startY: event.clientY,
54
56
  velocity: 0
55
57
  };
58
+ const candidate = press;
59
+ boxes.read(start, (box) => {
60
+ if (press !== candidate) return;
61
+ if (box.height <= 0 || !start.open || event.target === start && !isOutside(box, event.clientX, event.clientY)) {
62
+ press = null;
63
+ return;
64
+ }
65
+ candidate.height = box.height;
66
+ if (candidate.pendingEnd) {
67
+ candidate.dragging = (candidate.pendingMove?.clientY ?? event.clientY) - candidate.startY >= SLOP;
68
+ onEnd(candidate.pendingEnd);
69
+ } else if (candidate.pendingMove) onMove(candidate.pendingMove);
70
+ });
56
71
  };
57
72
  const onMove = (event) => {
58
73
  if (!press || event.pointerId !== press.pointerId) return;
74
+ const elapsed = event.timeStamp - press.lastTime;
75
+ if (elapsed > 0) press.velocity = (event.clientY - press.lastY) / elapsed;
76
+ press.lastY = event.clientY;
77
+ press.lastTime = event.timeStamp;
78
+ if (press.height === 0) {
79
+ press.pendingMove = event;
80
+ return;
81
+ }
59
82
  const dy = event.clientY - press.startY;
60
83
  if (!press.dragging) {
61
84
  if (dy < SLOP) return;
@@ -63,14 +86,18 @@ function attachSheetSwipe(doc = document) {
63
86
  press.dialog.setPointerCapture(event.pointerId);
64
87
  press.dialog.setAttribute("data-dragging", "");
65
88
  }
66
- const elapsed = event.timeStamp - press.lastTime;
67
- if (elapsed > 0) press.velocity = (event.clientY - press.lastY) / elapsed;
68
- press.lastY = event.clientY;
69
- press.lastTime = event.timeStamp;
70
89
  press.dialog.style.setProperty("--uiify-sheet-offset", `${Math.max(0, dy)}px`);
71
90
  };
72
91
  const onEnd = (event) => {
73
92
  if (!press || event.pointerId !== press.pointerId) return;
93
+ if (press.height === 0) {
94
+ press.pendingEnd = event;
95
+ if ((press.pendingMove?.clientY ?? press.startY) - press.startY >= SLOP) {
96
+ cancelSwallow?.();
97
+ cancelSwallow = swallowNextClick(doc);
98
+ }
99
+ return;
100
+ }
74
101
  const { dialog, dragging, height, lastTime, startY, velocity: lastVelocity } = press;
75
102
  press = null;
76
103
  if (!dragging) return;
@@ -98,6 +125,7 @@ function attachSheetSwipe(doc = document) {
98
125
  doc.removeEventListener("pointerup", onEnd);
99
126
  doc.removeEventListener("pointercancel", onEnd);
100
127
  cancelSwallow?.();
128
+ boxes.disconnect();
101
129
  if (press) {
102
130
  press.dialog.removeAttribute("data-dragging");
103
131
  press.dialog.style.removeProperty("--uiify-sheet-offset");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/enhance/sheet-swipe.ts"],"sourcesContent":["import { MODAL_DIALOG, isOutside, requestCloseDialog } from \"./dialog-dismiss.js\";\nimport { readBox } from \"./internal/read-box.js\";\n\n/** Below this width the modal is a bottom sheet. Keep in sync with the `@media` in modal.css. */\nexport const SHEET_QUERY = \"(width < 40rem)\";\n/** Where a press may start a swipe, besides the backdrop: the modal's own parts only. */\nconst HANDLE = '[data-uiify-modal][data-part=\"header\"], [data-uiify-modal][data-part=\"grabber\"]';\n/** Never start a swipe from these: the press is meant for them. */\nconst INTERACTIVE = \"a, button, input, select, textarea, [contenteditable], [data-no-swipe]\";\n/** Pixels a press must travel down before it becomes a drag; below it the tap reaches `click`. */\nconst SLOP = 6;\n/** Fraction of the sheet height that dismisses on release. */\nconst DISMISS_RATIO = 0.25;\n/** Downward release speed (px per ms) that dismisses regardless of distance. */\nconst DISMISS_VELOCITY = 0.5;\n/** A release this long after the last move is a pause, not a fling: its speed counts as zero. */\nconst FLING_WINDOW_MS = 80;\n/** How long the click that follows a drag is swallowed if it never arrives. */\nconst SWALLOW_MS = 300;\n\ninterface Press {\n readonly dialog: HTMLDialogElement;\n readonly height: number;\n readonly pointerId: number;\n readonly startY: number;\n dragging: boolean;\n lastY: number;\n lastTime: number;\n velocity: number;\n}\n\n/** Swallows the click that ends a drag; returns a function that removes the trap. */\nfunction swallowNextClick(doc: Document): () => void {\n const swallow = (event: Event): void => {\n event.stopPropagation();\n event.preventDefault();\n };\n doc.addEventListener(\"click\", swallow, { capture: true, once: true });\n const timer = setTimeout(() => doc.removeEventListener(\"click\", swallow, true), SWALLOW_MS);\n return () => {\n clearTimeout(timer);\n doc.removeEventListener(\"click\", swallow, true);\n };\n}\n\n/**\n * Swipe-down-to-close for the mobile sheet, driven by pointer events. It only moves the sheet\n * with `data-dragging` and `--uiify-sheet-offset`; the transition back or out is the CSS in\n * modal.css. Optional: without it the sheet still closes by icon, Escape and backdrop tap.\n */\nexport function attachSheetSwipe(doc: Document = document): () => void {\n const view = doc.defaultView ?? window;\n let press: Press | null = null;\n let cancelSwallow: (() => void) | null = null;\n\n const startOf = (event: PointerEvent): { dialog: HTMLDialogElement; height: number } | null => {\n const origin = event.target instanceof Element ? event.target : null;\n const dialog = origin?.closest<HTMLDialogElement>(MODAL_DIALOG);\n if (!origin || !dialog || !dialog.open) return null;\n if (dialog.getAttribute(\"closedby\") === \"none\" || dialog.getAttribute(\"data-size\") === \"full\") {\n return null;\n }\n const handle = origin === dialog ? null : origin.closest(HANDLE);\n const onHandle =\n handle !== null && handle.closest(MODAL_DIALOG) === dialog && !origin.closest(INTERACTIVE);\n // A press in the body or on a control never starts a swipe: skip the layout read for it.\n if (origin !== dialog && !onHandle) return null;\n if (!view.matchMedia(SHEET_QUERY).matches) return null;\n const box = readBox(dialog);\n const onBackdrop = origin === dialog && isOutside(box, event.clientX, event.clientY);\n return onBackdrop || onHandle ? { dialog, height: box.height } : null;\n };\n\n const onDown = (event: PointerEvent): void => {\n if (press || !event.isPrimary) return;\n if (event.pointerType === \"mouse\" && event.button !== 0) return;\n const start = startOf(event);\n if (!start) return;\n press = {\n ...start,\n dragging: false,\n lastTime: event.timeStamp,\n lastY: event.clientY,\n pointerId: event.pointerId,\n startY: event.clientY,\n velocity: 0,\n };\n };\n\n const onMove = (event: PointerEvent): void => {\n if (!press || event.pointerId !== press.pointerId) return;\n const dy = event.clientY - press.startY;\n if (!press.dragging) {\n if (dy < SLOP) return;\n press.dragging = true;\n press.dialog.setPointerCapture(event.pointerId);\n press.dialog.setAttribute(\"data-dragging\", \"\");\n }\n const elapsed = event.timeStamp - press.lastTime;\n if (elapsed > 0) press.velocity = (event.clientY - press.lastY) / elapsed;\n press.lastY = event.clientY;\n press.lastTime = event.timeStamp;\n press.dialog.style.setProperty(\"--uiify-sheet-offset\", `${Math.max(0, dy)}px`);\n };\n\n const onEnd = (event: PointerEvent): void => {\n if (!press || event.pointerId !== press.pointerId) return;\n const { dialog, dragging, height, lastTime, startY, velocity: lastVelocity } = press;\n press = null;\n if (!dragging) return;\n cancelSwallow?.();\n cancelSwallow = swallowNextClick(doc);\n if (!dialog.open) {\n // Closed by other means mid-drag (Escape, a programmatic close): just reset the drag state.\n dialog.removeAttribute(\"data-dragging\");\n dialog.style.removeProperty(\"--uiify-sheet-offset\");\n return;\n }\n const velocity = event.timeStamp - lastTime > FLING_WINDOW_MS ? 0 : lastVelocity;\n const distance = event.clientY - startY;\n const dismiss =\n event.type === \"pointerup\" &&\n (distance > height * DISMISS_RATIO || velocity > DISMISS_VELOCITY);\n // Hand the position back to CSS first: if the dialog closes it slides out from where the\n // finger left it, if a cancel handler vetoes it springs back to the resting position.\n dialog.removeAttribute(\"data-dragging\");\n dialog.style.removeProperty(\"--uiify-sheet-offset\");\n if (dismiss) requestCloseDialog(dialog);\n };\n\n doc.addEventListener(\"pointerdown\", onDown);\n doc.addEventListener(\"pointermove\", onMove);\n doc.addEventListener(\"pointerup\", onEnd);\n doc.addEventListener(\"pointercancel\", onEnd);\n return () => {\n doc.removeEventListener(\"pointerdown\", onDown);\n doc.removeEventListener(\"pointermove\", onMove);\n doc.removeEventListener(\"pointerup\", onEnd);\n doc.removeEventListener(\"pointercancel\", onEnd);\n cancelSwallow?.();\n if (press) {\n press.dialog.removeAttribute(\"data-dragging\");\n press.dialog.style.removeProperty(\"--uiify-sheet-offset\");\n press = null;\n }\n };\n}\n"],"mappings":"AAAA,SAAS,cAAc,WAAW,0BAA0B;AAC5D,SAAS,eAAe;AAGjB,MAAM,cAAc;AAE3B,MAAM,SAAS;AAEf,MAAM,cAAc;AAEpB,MAAM,OAAO;AAEb,MAAM,gBAAgB;AAEtB,MAAM,mBAAmB;AAEzB,MAAM,kBAAkB;AAExB,MAAM,aAAa;AAcnB,SAAS,iBAAiB,KAA2B;AACnD,QAAM,UAAU,CAAC,UAAuB;AACtC,UAAM,gBAAgB;AACtB,UAAM,eAAe;AAAA,EACvB;AACA,MAAI,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,MAAM,KAAK,CAAC;AACpE,QAAM,QAAQ,WAAW,MAAM,IAAI,oBAAoB,SAAS,SAAS,IAAI,GAAG,UAAU;AAC1F,SAAO,MAAM;AACX,iBAAa,KAAK;AAClB,QAAI,oBAAoB,SAAS,SAAS,IAAI;AAAA,EAChD;AACF;AAOO,SAAS,iBAAiB,MAAgB,UAAsB;AACrE,QAAM,OAAO,IAAI,eAAe;AAChC,MAAI,QAAsB;AAC1B,MAAI,gBAAqC;AAEzC,QAAM,UAAU,CAAC,UAA8E;AAC7F,UAAM,SAAS,MAAM,kBAAkB,UAAU,MAAM,SAAS;AAChE,UAAM,SAAS,QAAQ,QAA2B,YAAY;AAC9D,QAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,KAAM,QAAO;AAC/C,QAAI,OAAO,aAAa,UAAU,MAAM,UAAU,OAAO,aAAa,WAAW,MAAM,QAAQ;AAC7F,aAAO;AAAA,IACT;AACA,UAAM,SAAS,WAAW,SAAS,OAAO,OAAO,QAAQ,MAAM;AAC/D,UAAM,WACJ,WAAW,QAAQ,OAAO,QAAQ,YAAY,MAAM,UAAU,CAAC,OAAO,QAAQ,WAAW;AAE3F,QAAI,WAAW,UAAU,CAAC,SAAU,QAAO;AAC3C,QAAI,CAAC,KAAK,WAAW,WAAW,EAAE,QAAS,QAAO;AAClD,UAAM,MAAM,QAAQ,MAAM;AAC1B,UAAM,aAAa,WAAW,UAAU,UAAU,KAAK,MAAM,SAAS,MAAM,OAAO;AACnF,WAAO,cAAc,WAAW,EAAE,QAAQ,QAAQ,IAAI,OAAO,IAAI;AAAA,EACnE;AAEA,QAAM,SAAS,CAAC,UAA8B;AAC5C,QAAI,SAAS,CAAC,MAAM,UAAW;AAC/B,QAAI,MAAM,gBAAgB,WAAW,MAAM,WAAW,EAAG;AACzD,UAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAI,CAAC,MAAO;AACZ,YAAQ;AAAA,MACN,GAAG;AAAA,MACH,UAAU;AAAA,MACV,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,UAA8B;AAC5C,QAAI,CAAC,SAAS,MAAM,cAAc,MAAM,UAAW;AACnD,UAAM,KAAK,MAAM,UAAU,MAAM;AACjC,QAAI,CAAC,MAAM,UAAU;AACnB,UAAI,KAAK,KAAM;AACf,YAAM,WAAW;AACjB,YAAM,OAAO,kBAAkB,MAAM,SAAS;AAC9C,YAAM,OAAO,aAAa,iBAAiB,EAAE;AAAA,IAC/C;AACA,UAAM,UAAU,MAAM,YAAY,MAAM;AACxC,QAAI,UAAU,EAAG,OAAM,YAAY,MAAM,UAAU,MAAM,SAAS;AAClE,UAAM,QAAQ,MAAM;AACpB,UAAM,WAAW,MAAM;AACvB,UAAM,OAAO,MAAM,YAAY,wBAAwB,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI;AAAA,EAC/E;AAEA,QAAM,QAAQ,CAAC,UAA8B;AAC3C,QAAI,CAAC,SAAS,MAAM,cAAc,MAAM,UAAW;AACnD,UAAM,EAAE,QAAQ,UAAU,QAAQ,UAAU,QAAQ,UAAU,aAAa,IAAI;AAC/E,YAAQ;AACR,QAAI,CAAC,SAAU;AACf,oBAAgB;AAChB,oBAAgB,iBAAiB,GAAG;AACpC,QAAI,CAAC,OAAO,MAAM;AAEhB,aAAO,gBAAgB,eAAe;AACtC,aAAO,MAAM,eAAe,sBAAsB;AAClD;AAAA,IACF;AACA,UAAM,WAAW,MAAM,YAAY,WAAW,kBAAkB,IAAI;AACpE,UAAM,WAAW,MAAM,UAAU;AACjC,UAAM,UACJ,MAAM,SAAS,gBACd,WAAW,SAAS,iBAAiB,WAAW;AAGnD,WAAO,gBAAgB,eAAe;AACtC,WAAO,MAAM,eAAe,sBAAsB;AAClD,QAAI,QAAS,oBAAmB,MAAM;AAAA,EACxC;AAEA,MAAI,iBAAiB,eAAe,MAAM;AAC1C,MAAI,iBAAiB,eAAe,MAAM;AAC1C,MAAI,iBAAiB,aAAa,KAAK;AACvC,MAAI,iBAAiB,iBAAiB,KAAK;AAC3C,SAAO,MAAM;AACX,QAAI,oBAAoB,eAAe,MAAM;AAC7C,QAAI,oBAAoB,eAAe,MAAM;AAC7C,QAAI,oBAAoB,aAAa,KAAK;AAC1C,QAAI,oBAAoB,iBAAiB,KAAK;AAC9C,oBAAgB;AAChB,QAAI,OAAO;AACT,YAAM,OAAO,gBAAgB,eAAe;AAC5C,YAAM,OAAO,MAAM,eAAe,sBAAsB;AACxD,cAAQ;AAAA,IACV;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/enhance/sheet-swipe.ts"],"sourcesContent":["import { SHEET_DIALOG, isOutside, requestCloseDialog } from \"./dialog-dismiss.js\";\nimport { createBoxObserver } from \"./internal/box-observer.js\";\n\n/** Below this width the modal is a bottom sheet. Keep in sync with the `@media` in modal.css. */\nexport const SHEET_QUERY = \"(width < 40rem)\";\n/** Where a press may start a swipe, besides the backdrop: the modal's own parts only. */\nconst HANDLE =\n ':is([data-uiify-modal], [data-uiify-drawer]):is([data-part=\"header\"], [data-part=\"grabber\"], [data-part=\"handle\"])';\n/** Never start a swipe from these: the press is meant for them. */\nconst INTERACTIVE = \"a, button, input, select, textarea, [contenteditable], [data-no-swipe]\";\n/** Pixels a press must travel down before it becomes a drag; below it the tap reaches `click`. */\nconst SLOP = 6;\n/** Fraction of the sheet height that dismisses on release. */\nconst DISMISS_RATIO = 0.25;\n/** Downward release speed (px per ms) that dismisses regardless of distance. */\nconst DISMISS_VELOCITY = 0.5;\n/** A release this long after the last move is a pause, not a fling: its speed counts as zero. */\nconst FLING_WINDOW_MS = 80;\n/** How long the click that follows a drag is swallowed if it never arrives. */\nconst SWALLOW_MS = 300;\n\ninterface Press {\n readonly dialog: HTMLDialogElement;\n height: number;\n pendingMove: PointerEvent | null;\n pendingEnd: PointerEvent | null;\n readonly pointerId: number;\n readonly startY: number;\n dragging: boolean;\n lastY: number;\n lastTime: number;\n velocity: number;\n}\n\n/** Swallows the click that ends a drag; returns a function that removes the trap. */\nfunction swallowNextClick(doc: Document): () => void {\n const swallow = (event: Event): void => {\n event.stopPropagation();\n event.preventDefault();\n };\n doc.addEventListener(\"click\", swallow, { capture: true, once: true });\n const timer = setTimeout(() => doc.removeEventListener(\"click\", swallow, true), SWALLOW_MS);\n return () => {\n clearTimeout(timer);\n doc.removeEventListener(\"click\", swallow, true);\n };\n}\n\n/**\n * Swipe-down-to-close for the mobile sheet, driven by pointer events. It only moves the sheet\n * with `data-dragging` and `--uiify-sheet-offset`; the transition back or out is the CSS in\n * modal.css. Optional: without it the sheet still closes by icon, Escape and backdrop tap.\n */\nexport function attachSheetSwipe(doc: Document = document): () => void {\n const view = doc.defaultView ?? window;\n const boxes = createBoxObserver(doc);\n let press: Press | null = null;\n let cancelSwallow: (() => void) | null = null;\n\n const startOf = (event: PointerEvent): HTMLDialogElement | null => {\n const origin = event.target instanceof Element ? event.target : null;\n const dialog = origin?.closest<HTMLDialogElement>(SHEET_DIALOG);\n if (!origin || !dialog || !dialog.open || dialog.hasAttribute(\"data-snap-enabled\")) return null;\n if (dialog.getAttribute(\"closedby\") === \"none\" || dialog.getAttribute(\"data-size\") === \"full\") {\n return null;\n }\n const handle = origin === dialog ? null : origin.closest(HANDLE);\n const onHandle =\n handle !== null && handle.closest(SHEET_DIALOG) === dialog && !origin.closest(INTERACTIVE);\n // A press in the body or on a control never starts a swipe.\n if (origin !== dialog && !onHandle) return null;\n if (!view.matchMedia(SHEET_QUERY).matches) return null;\n return dialog;\n };\n\n const onDown = (event: PointerEvent): void => {\n if (press || !event.isPrimary) return;\n if (event.pointerType === \"mouse\" && event.button !== 0) return;\n const start = startOf(event);\n if (!start) return;\n press = {\n dialog: start,\n height: 0,\n pendingMove: null,\n pendingEnd: null,\n dragging: false,\n lastTime: event.timeStamp,\n lastY: event.clientY,\n pointerId: event.pointerId,\n startY: event.clientY,\n velocity: 0,\n };\n const candidate = press;\n boxes.read(start, (box) => {\n if (press !== candidate) return;\n if (\n box.height <= 0 ||\n !start.open ||\n (event.target === start && !isOutside(box, event.clientX, event.clientY))\n ) {\n press = null;\n return;\n }\n candidate.height = box.height;\n if (candidate.pendingEnd) {\n candidate.dragging =\n (candidate.pendingMove?.clientY ?? event.clientY) - candidate.startY >= SLOP;\n onEnd(candidate.pendingEnd);\n } else if (candidate.pendingMove) onMove(candidate.pendingMove);\n });\n };\n\n const onMove = (event: PointerEvent): void => {\n if (!press || event.pointerId !== press.pointerId) return;\n const elapsed = event.timeStamp - press.lastTime;\n if (elapsed > 0) press.velocity = (event.clientY - press.lastY) / elapsed;\n press.lastY = event.clientY;\n press.lastTime = event.timeStamp;\n if (press.height === 0) {\n press.pendingMove = event;\n return;\n }\n const dy = event.clientY - press.startY;\n if (!press.dragging) {\n if (dy < SLOP) return;\n press.dragging = true;\n press.dialog.setPointerCapture(event.pointerId);\n press.dialog.setAttribute(\"data-dragging\", \"\");\n }\n press.dialog.style.setProperty(\"--uiify-sheet-offset\", `${Math.max(0, dy)}px`);\n };\n\n const onEnd = (event: PointerEvent): void => {\n if (!press || event.pointerId !== press.pointerId) return;\n if (press.height === 0) {\n press.pendingEnd = event;\n if ((press.pendingMove?.clientY ?? press.startY) - press.startY >= SLOP) {\n cancelSwallow?.();\n cancelSwallow = swallowNextClick(doc);\n }\n return;\n }\n const { dialog, dragging, height, lastTime, startY, velocity: lastVelocity } = press;\n press = null;\n if (!dragging) return;\n cancelSwallow?.();\n cancelSwallow = swallowNextClick(doc);\n if (!dialog.open) {\n // Closed by other means mid-drag (Escape, a programmatic close): just reset the drag state.\n dialog.removeAttribute(\"data-dragging\");\n dialog.style.removeProperty(\"--uiify-sheet-offset\");\n return;\n }\n const velocity = event.timeStamp - lastTime > FLING_WINDOW_MS ? 0 : lastVelocity;\n const distance = event.clientY - startY;\n const dismiss =\n event.type === \"pointerup\" &&\n (distance > height * DISMISS_RATIO || velocity > DISMISS_VELOCITY);\n // Hand the position back to CSS first: if the dialog closes it slides out from where the\n // finger left it, if a cancel handler vetoes it springs back to the resting position.\n dialog.removeAttribute(\"data-dragging\");\n dialog.style.removeProperty(\"--uiify-sheet-offset\");\n if (dismiss) requestCloseDialog(dialog);\n };\n\n doc.addEventListener(\"pointerdown\", onDown);\n doc.addEventListener(\"pointermove\", onMove);\n doc.addEventListener(\"pointerup\", onEnd);\n doc.addEventListener(\"pointercancel\", onEnd);\n return () => {\n doc.removeEventListener(\"pointerdown\", onDown);\n doc.removeEventListener(\"pointermove\", onMove);\n doc.removeEventListener(\"pointerup\", onEnd);\n doc.removeEventListener(\"pointercancel\", onEnd);\n cancelSwallow?.();\n boxes.disconnect();\n if (press) {\n press.dialog.removeAttribute(\"data-dragging\");\n press.dialog.style.removeProperty(\"--uiify-sheet-offset\");\n press = null;\n }\n };\n}\n"],"mappings":"AAAA,SAAS,cAAc,WAAW,0BAA0B;AAC5D,SAAS,yBAAyB;AAG3B,MAAM,cAAc;AAE3B,MAAM,SACJ;AAEF,MAAM,cAAc;AAEpB,MAAM,OAAO;AAEb,MAAM,gBAAgB;AAEtB,MAAM,mBAAmB;AAEzB,MAAM,kBAAkB;AAExB,MAAM,aAAa;AAgBnB,SAAS,iBAAiB,KAA2B;AACnD,QAAM,UAAU,CAAC,UAAuB;AACtC,UAAM,gBAAgB;AACtB,UAAM,eAAe;AAAA,EACvB;AACA,MAAI,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,MAAM,KAAK,CAAC;AACpE,QAAM,QAAQ,WAAW,MAAM,IAAI,oBAAoB,SAAS,SAAS,IAAI,GAAG,UAAU;AAC1F,SAAO,MAAM;AACX,iBAAa,KAAK;AAClB,QAAI,oBAAoB,SAAS,SAAS,IAAI;AAAA,EAChD;AACF;AAOO,SAAS,iBAAiB,MAAgB,UAAsB;AACrE,QAAM,OAAO,IAAI,eAAe;AAChC,QAAM,QAAQ,kBAAkB,GAAG;AACnC,MAAI,QAAsB;AAC1B,MAAI,gBAAqC;AAEzC,QAAM,UAAU,CAAC,UAAkD;AACjE,UAAM,SAAS,MAAM,kBAAkB,UAAU,MAAM,SAAS;AAChE,UAAM,SAAS,QAAQ,QAA2B,YAAY;AAC9D,QAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,QAAQ,OAAO,aAAa,mBAAmB,EAAG,QAAO;AAC3F,QAAI,OAAO,aAAa,UAAU,MAAM,UAAU,OAAO,aAAa,WAAW,MAAM,QAAQ;AAC7F,aAAO;AAAA,IACT;AACA,UAAM,SAAS,WAAW,SAAS,OAAO,OAAO,QAAQ,MAAM;AAC/D,UAAM,WACJ,WAAW,QAAQ,OAAO,QAAQ,YAAY,MAAM,UAAU,CAAC,OAAO,QAAQ,WAAW;AAE3F,QAAI,WAAW,UAAU,CAAC,SAAU,QAAO;AAC3C,QAAI,CAAC,KAAK,WAAW,WAAW,EAAE,QAAS,QAAO;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAC,UAA8B;AAC5C,QAAI,SAAS,CAAC,MAAM,UAAW;AAC/B,QAAI,MAAM,gBAAgB,WAAW,MAAM,WAAW,EAAG;AACzD,UAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAI,CAAC,MAAO;AACZ,YAAQ;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,UAAU;AAAA,IACZ;AACA,UAAM,YAAY;AAClB,UAAM,KAAK,OAAO,CAAC,QAAQ;AACzB,UAAI,UAAU,UAAW;AACzB,UACE,IAAI,UAAU,KACd,CAAC,MAAM,QACN,MAAM,WAAW,SAAS,CAAC,UAAU,KAAK,MAAM,SAAS,MAAM,OAAO,GACvE;AACA,gBAAQ;AACR;AAAA,MACF;AACA,gBAAU,SAAS,IAAI;AACvB,UAAI,UAAU,YAAY;AACxB,kBAAU,YACP,UAAU,aAAa,WAAW,MAAM,WAAW,UAAU,UAAU;AAC1E,cAAM,UAAU,UAAU;AAAA,MAC5B,WAAW,UAAU,YAAa,QAAO,UAAU,WAAW;AAAA,IAChE,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,CAAC,UAA8B;AAC5C,QAAI,CAAC,SAAS,MAAM,cAAc,MAAM,UAAW;AACnD,UAAM,UAAU,MAAM,YAAY,MAAM;AACxC,QAAI,UAAU,EAAG,OAAM,YAAY,MAAM,UAAU,MAAM,SAAS;AAClE,UAAM,QAAQ,MAAM;AACpB,UAAM,WAAW,MAAM;AACvB,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,cAAc;AACpB;AAAA,IACF;AACA,UAAM,KAAK,MAAM,UAAU,MAAM;AACjC,QAAI,CAAC,MAAM,UAAU;AACnB,UAAI,KAAK,KAAM;AACf,YAAM,WAAW;AACjB,YAAM,OAAO,kBAAkB,MAAM,SAAS;AAC9C,YAAM,OAAO,aAAa,iBAAiB,EAAE;AAAA,IAC/C;AACA,UAAM,OAAO,MAAM,YAAY,wBAAwB,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI;AAAA,EAC/E;AAEA,QAAM,QAAQ,CAAC,UAA8B;AAC3C,QAAI,CAAC,SAAS,MAAM,cAAc,MAAM,UAAW;AACnD,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,aAAa;AACnB,WAAK,MAAM,aAAa,WAAW,MAAM,UAAU,MAAM,UAAU,MAAM;AACvE,wBAAgB;AAChB,wBAAgB,iBAAiB,GAAG;AAAA,MACtC;AACA;AAAA,IACF;AACA,UAAM,EAAE,QAAQ,UAAU,QAAQ,UAAU,QAAQ,UAAU,aAAa,IAAI;AAC/E,YAAQ;AACR,QAAI,CAAC,SAAU;AACf,oBAAgB;AAChB,oBAAgB,iBAAiB,GAAG;AACpC,QAAI,CAAC,OAAO,MAAM;AAEhB,aAAO,gBAAgB,eAAe;AACtC,aAAO,MAAM,eAAe,sBAAsB;AAClD;AAAA,IACF;AACA,UAAM,WAAW,MAAM,YAAY,WAAW,kBAAkB,IAAI;AACpE,UAAM,WAAW,MAAM,UAAU;AACjC,UAAM,UACJ,MAAM,SAAS,gBACd,WAAW,SAAS,iBAAiB,WAAW;AAGnD,WAAO,gBAAgB,eAAe;AACtC,WAAO,MAAM,eAAe,sBAAsB;AAClD,QAAI,QAAS,oBAAmB,MAAM;AAAA,EACxC;AAEA,MAAI,iBAAiB,eAAe,MAAM;AAC1C,MAAI,iBAAiB,eAAe,MAAM;AAC1C,MAAI,iBAAiB,aAAa,KAAK;AACvC,MAAI,iBAAiB,iBAAiB,KAAK;AAC3C,SAAO,MAAM;AACX,QAAI,oBAAoB,eAAe,MAAM;AAC7C,QAAI,oBAAoB,eAAe,MAAM;AAC7C,QAAI,oBAAoB,aAAa,KAAK;AAC1C,QAAI,oBAAoB,iBAAiB,KAAK;AAC9C,oBAAgB;AAChB,UAAM,WAAW;AACjB,QAAI,OAAO;AACT,YAAM,OAAO,gBAAgB,eAAe;AAC5C,YAAM,OAAO,MAAM,eAAe,sBAAsB;AACxD,cAAQ;AAAA,IACV;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,5 @@
1
+ export interface BoxObserver {
2
+ readonly read: (element: Element, callback: (box: DOMRectReadOnly) => void) => void;
3
+ readonly disconnect: () => void;
4
+ }
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/enhance/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,KAAK,IAAI,CAAC;IACpF,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/components/field/Field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,SAAS,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EACvD,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,GACzB,YAAY,GAAG,IAAI,CA4BrB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAyBtE;AAED,wBAAgB,YAAY,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC1D,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,GAC5B,YAAY,GAAG,IAAI,CAsCrB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CAgBlF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAqBtE;AAED,eAAO,MAAM,KAAK;;;;;;CAMjB,CAAC"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/components/field/Field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,SAAS,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EACvD,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,GACzB,YAAY,GAAG,IAAI,CA4BrB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAyBtE;AAED,wBAAgB,YAAY,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC1D,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,GAC5B,YAAY,GAAG,IAAI,CA2CrB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CAgBlF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAqBtE;AAED,eAAO,MAAM,KAAK;;;;;;CAMjB,CAAC"}
@@ -72,6 +72,7 @@ function FieldControl(props) {
72
72
  props: {
73
73
  ...consumerProps,
74
74
  ...controlIdentity,
75
+ ...as === "input" || as === "textarea" || as === "select" ? { disabled: disabled || void 0, required: required || void 0 } : as !== void 0 && typeof as !== "string" || render ? { disabled, required } : {},
75
76
  id: controlId,
76
77
  "data-part": "control",
77
78
  "aria-labelledby": labelId,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/field/Field.tsx"],"sourcesContent":["import type { ElementType, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { getFieldIds } from \"./field-ids.js\";\nimport type {\n FieldRootProps,\n FieldControlProps,\n FieldLabelProps,\n FieldDescriptionProps,\n FieldErrorProps,\n} from \"./types.js\";\n\nexport function FieldRoot<TAs extends ElementType = \"div\">(\n props: FieldRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n id,\n invalid = false,\n required = false,\n disabled = false,\n // Accepted for API compatibility but not rendered — a bare `name` isn't\n // meaningful on the wrapper element itself, only on the actual control.\n name: _name,\n ...consumerProps\n } = props as FieldRootProps<ElementType>;\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n \"data-uiify-field\": \"\",\n id,\n },\n render,\n state: { disabled, invalid, required, id },\n });\n}\n\nexport function FieldLabel(props: FieldLabelProps): ReactElement | null {\n const {\n className,\n children,\n fieldId,\n disabled = false,\n required = false,\n ...consumerProps\n } = props;\n const { controlId, labelId } = getFieldIds(fieldId);\n\n return useRenderElement({\n defaultTag: \"label\",\n props: {\n ...consumerProps,\n id: labelId,\n htmlFor: controlId,\n \"data-part\": \"label\",\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n ...(className ? { className } : {}),\n children,\n },\n state: { disabled, required },\n });\n}\n\nexport function FieldControl<TAs extends ElementType = \"div\">(\n props: FieldControlProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n fieldId,\n disabled = false,\n invalid = false,\n required = false,\n ...consumerProps\n } = props as FieldControlProps<ElementType>;\n const { controlId, descriptionId, errorId, labelId } = getFieldIds(fieldId);\n const describedBy = [descriptionId, invalid ? errorId : undefined].filter(Boolean).join(\" \");\n const controlIdentity =\n as === \"input\"\n ? { \"data-uiify-input\": \"\" }\n : as === \"textarea\"\n ? { \"data-uiify-textarea\": \"\" }\n : {};\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n ...controlIdentity,\n id: controlId,\n \"data-part\": \"control\",\n \"aria-labelledby\": labelId,\n \"aria-describedby\": describedBy || undefined,\n \"aria-invalid\": invalid || undefined,\n \"aria-required\": required || undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n },\n render,\n state: { disabled, invalid, required },\n });\n}\n\nexport function FieldDescription(props: FieldDescriptionProps): ReactElement | null {\n const { className, children, fieldId, disabled = false, ...consumerProps } = props;\n const { descriptionId } = getFieldIds(fieldId);\n\n return useRenderElement({\n defaultTag: \"p\",\n props: {\n ...consumerProps,\n id: descriptionId,\n \"data-part\": \"description\",\n \"data-disabled\": disabled ? \"\" : undefined,\n ...(className ? { className } : {}),\n children,\n },\n state: { disabled },\n });\n}\n\nexport function FieldError(props: FieldErrorProps): ReactElement | null {\n const { className, children, fieldId, invalid = false, ...consumerProps } = props;\n const { errorId } = getFieldIds(fieldId);\n\n const element = useRenderElement({\n defaultTag: \"p\",\n props: {\n ...consumerProps,\n id: errorId,\n \"data-part\": \"error\",\n role: \"alert\",\n \"data-invalid\": \"\",\n ...(className ? { className } : {}),\n children,\n },\n state: { invalid },\n });\n\n if (!invalid) return null;\n\n return element;\n}\n\nexport const Field = {\n Root: FieldRoot,\n Label: FieldLabel,\n Control: FieldControl,\n Description: FieldDescription,\n Error: FieldError,\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/field/Field.tsx"],"sourcesContent":["import type { ElementType, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { getFieldIds } from \"./field-ids.js\";\nimport type {\n FieldRootProps,\n FieldControlProps,\n FieldLabelProps,\n FieldDescriptionProps,\n FieldErrorProps,\n} from \"./types.js\";\n\nexport function FieldRoot<TAs extends ElementType = \"div\">(\n props: FieldRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n id,\n invalid = false,\n required = false,\n disabled = false,\n // Accepted for API compatibility but not rendered — a bare `name` isn't\n // meaningful on the wrapper element itself, only on the actual control.\n name: _name,\n ...consumerProps\n } = props as FieldRootProps<ElementType>;\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n \"data-uiify-field\": \"\",\n id,\n },\n render,\n state: { disabled, invalid, required, id },\n });\n}\n\nexport function FieldLabel(props: FieldLabelProps): ReactElement | null {\n const {\n className,\n children,\n fieldId,\n disabled = false,\n required = false,\n ...consumerProps\n } = props;\n const { controlId, labelId } = getFieldIds(fieldId);\n\n return useRenderElement({\n defaultTag: \"label\",\n props: {\n ...consumerProps,\n id: labelId,\n htmlFor: controlId,\n \"data-part\": \"label\",\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n ...(className ? { className } : {}),\n children,\n },\n state: { disabled, required },\n });\n}\n\nexport function FieldControl<TAs extends ElementType = \"div\">(\n props: FieldControlProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n fieldId,\n disabled = false,\n invalid = false,\n required = false,\n ...consumerProps\n } = props as FieldControlProps<ElementType>;\n const { controlId, descriptionId, errorId, labelId } = getFieldIds(fieldId);\n const describedBy = [descriptionId, invalid ? errorId : undefined].filter(Boolean).join(\" \");\n const controlIdentity =\n as === \"input\"\n ? { \"data-uiify-input\": \"\" }\n : as === \"textarea\"\n ? { \"data-uiify-textarea\": \"\" }\n : {};\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n ...controlIdentity,\n ...(as === \"input\" || as === \"textarea\" || as === \"select\"\n ? { disabled: disabled || undefined, required: required || undefined }\n : (as !== undefined && typeof as !== \"string\") || render\n ? { disabled, required }\n : {}),\n id: controlId,\n \"data-part\": \"control\",\n \"aria-labelledby\": labelId,\n \"aria-describedby\": describedBy || undefined,\n \"aria-invalid\": invalid || undefined,\n \"aria-required\": required || undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n },\n render,\n state: { disabled, invalid, required },\n });\n}\n\nexport function FieldDescription(props: FieldDescriptionProps): ReactElement | null {\n const { className, children, fieldId, disabled = false, ...consumerProps } = props;\n const { descriptionId } = getFieldIds(fieldId);\n\n return useRenderElement({\n defaultTag: \"p\",\n props: {\n ...consumerProps,\n id: descriptionId,\n \"data-part\": \"description\",\n \"data-disabled\": disabled ? \"\" : undefined,\n ...(className ? { className } : {}),\n children,\n },\n state: { disabled },\n });\n}\n\nexport function FieldError(props: FieldErrorProps): ReactElement | null {\n const { className, children, fieldId, invalid = false, ...consumerProps } = props;\n const { errorId } = getFieldIds(fieldId);\n\n const element = useRenderElement({\n defaultTag: \"p\",\n props: {\n ...consumerProps,\n id: errorId,\n \"data-part\": \"error\",\n role: \"alert\",\n \"data-invalid\": \"\",\n ...(className ? { className } : {}),\n children,\n },\n state: { invalid },\n });\n\n if (!invalid) return null;\n\n return element;\n}\n\nexport const Field = {\n Root: FieldRoot,\n Label: FieldLabel,\n Control: FieldControl,\n Description: FieldDescription,\n Error: FieldError,\n};\n"],"mappings":"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","names":[]}
@@ -1,11 +1,8 @@
1
1
  import type { ElementType, ReactElement } from "react";
2
- import type { FileUploadRootProps, FileUploadHiddenInputOwnProps, FileUploadTriggerProps, FileUploadDropzoneProps, FileUploadListOwnProps, FileUploadItemProps, FileUploadItemRemoveOwnProps } from "./types.js";
3
- export declare function FileUploadRootClient(props: FileUploadRootProps): ReactElement | null;
4
- export declare namespace FileUploadRootClient {
5
- var displayName: string;
6
- }
7
- export declare const FileUploadRoot: typeof FileUploadRootClient;
8
- export declare function FileUploadHiddenInput(props: FileUploadHiddenInputOwnProps): ReactElement | null;
2
+ import { FileUploadRoot, FileUploadRootClient } from "./FileUploadRoot.js";
3
+ import { FileUploadHiddenInput } from "./FileUploadInput.js";
4
+ import type { FileUploadTriggerProps, FileUploadDropzoneProps, FileUploadListOwnProps, FileUploadItemProps, FileUploadItemRemoveOwnProps } from "./types.js";
5
+ export { FileUploadRoot, FileUploadRootClient, FileUploadHiddenInput };
9
6
  export declare function FileUploadTrigger<TAs extends ElementType = "label">(props: FileUploadTriggerProps<TAs>): ReactElement | null;
10
7
  export declare function FileUploadDropzone<TAs extends ElementType = "div">(props: FileUploadDropzoneProps<TAs>): ReactElement | null;
11
8
  export declare function FileUploadList(props: FileUploadListOwnProps): ReactElement | null;