@gunkin/uiify 0.0.12-alpha → 0.0.14-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 (241) hide show
  1. package/dist/components/behavior.css +9 -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/button/Button.d.ts.map +1 -1
  7. package/dist/components/button/Button.js +2 -0
  8. package/dist/components/button/Button.js.map +1 -1
  9. package/dist/components/button/index.d.ts +1 -1
  10. package/dist/components/button/index.d.ts.map +1 -1
  11. package/dist/components/button/index.js.map +1 -1
  12. package/dist/components/button/types.d.ts +2 -0
  13. package/dist/components/button/types.d.ts.map +1 -1
  14. package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
  15. package/dist/components/carousel/CarouselMarkup.js +2 -1
  16. package/dist/components/carousel/CarouselMarkup.js.map +1 -1
  17. package/dist/components/carousel/client/CarouselClientView.d.ts.map +1 -1
  18. package/dist/components/carousel/client/CarouselClientView.js +1 -0
  19. package/dist/components/carousel/client/CarouselClientView.js.map +1 -1
  20. package/dist/components/carousel/client/carousel-controller.d.ts.map +1 -1
  21. package/dist/components/carousel/client/carousel-controller.js +25 -4
  22. package/dist/components/carousel/client/carousel-controller.js.map +1 -1
  23. package/dist/components/carousel/client/carousel-observer.d.ts.map +1 -1
  24. package/dist/components/carousel/client/carousel-observer.js +40 -0
  25. package/dist/components/carousel/client/carousel-observer.js.map +1 -1
  26. package/dist/components/carousel/fade/fade-controller.d.ts.map +1 -1
  27. package/dist/components/carousel/fade/fade-controller.js +3 -0
  28. package/dist/components/carousel/fade/fade-controller.js.map +1 -1
  29. package/dist/components/carousel/types.d.ts +2 -0
  30. package/dist/components/carousel/types.d.ts.map +1 -1
  31. package/dist/components/checkbox/Checkbox.d.ts +1 -6
  32. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  33. package/dist/components/checkbox/Checkbox.js +2 -52
  34. package/dist/components/checkbox/Checkbox.js.map +1 -1
  35. package/dist/components/drawer/Drawer.d.ts +1 -1
  36. package/dist/components/drawer/Drawer.d.ts.map +1 -1
  37. package/dist/components/drawer/Drawer.js +46 -9
  38. package/dist/components/drawer/Drawer.js.map +1 -1
  39. package/dist/components/drawer/DrawerNative.d.ts +8 -16
  40. package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
  41. package/dist/components/drawer/DrawerNative.js +80 -34
  42. package/dist/components/drawer/DrawerNative.js.map +1 -1
  43. package/dist/components/drawer/drawer-store.d.ts +1 -1
  44. package/dist/components/drawer/drawer-store.d.ts.map +1 -1
  45. package/dist/components/drawer/drawer-store.js +7 -3
  46. package/dist/components/drawer/drawer-store.js.map +1 -1
  47. package/dist/components/drawer/index.d.ts +3 -3
  48. package/dist/components/drawer/index.d.ts.map +1 -1
  49. package/dist/components/drawer/index.js +9 -1
  50. package/dist/components/drawer/index.js.map +1 -1
  51. package/dist/components/drawer/types.d.ts +114 -3
  52. package/dist/components/drawer/types.d.ts.map +1 -1
  53. package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  54. package/dist/components/dropdown-menu/DropdownMenu.js +3 -0
  55. package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
  56. package/dist/components/dropdown-menu/types.d.ts +1 -0
  57. package/dist/components/dropdown-menu/types.d.ts.map +1 -1
  58. package/dist/components/enhance/dialog-dismiss.d.ts +1 -1
  59. package/dist/components/enhance/dialog-dismiss.d.ts.map +1 -1
  60. package/dist/components/enhance/dialog-dismiss.js +19 -10
  61. package/dist/components/enhance/dialog-dismiss.js.map +1 -1
  62. package/dist/components/enhance/internal/box-observer.d.ts +4 -0
  63. package/dist/components/enhance/internal/box-observer.d.ts.map +1 -0
  64. package/dist/components/enhance/internal/box-observer.js +32 -0
  65. package/dist/components/enhance/internal/box-observer.js.map +1 -0
  66. package/dist/components/enhance/sheet-swipe.d.ts.map +1 -1
  67. package/dist/components/enhance/sheet-swipe.js +42 -14
  68. package/dist/components/enhance/sheet-swipe.js.map +1 -1
  69. package/dist/components/enhance/types.d.ts +5 -0
  70. package/dist/components/enhance/types.d.ts.map +1 -0
  71. package/dist/components/field/Field.d.ts.map +1 -1
  72. package/dist/components/field/Field.js +1 -0
  73. package/dist/components/field/Field.js.map +1 -1
  74. package/dist/components/file-upload/FileUpload.d.ts +4 -7
  75. package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
  76. package/dist/components/file-upload/FileUpload.js +28 -122
  77. package/dist/components/file-upload/FileUpload.js.map +1 -1
  78. package/dist/components/file-upload/FileUploadInput.d.ts +7 -0
  79. package/dist/components/file-upload/FileUploadInput.d.ts.map +1 -0
  80. package/dist/components/file-upload/FileUploadInput.js +60 -0
  81. package/dist/components/file-upload/FileUploadInput.js.map +1 -0
  82. package/dist/components/file-upload/FileUploadRoot.d.ts +8 -0
  83. package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -0
  84. package/dist/components/file-upload/FileUploadRoot.js +70 -0
  85. package/dist/components/file-upload/FileUploadRoot.js.map +1 -0
  86. package/dist/components/file-upload/file-upload-context.d.ts +3 -0
  87. package/dist/components/file-upload/file-upload-context.d.ts.map +1 -0
  88. package/dist/components/file-upload/file-upload-context.js +8 -0
  89. package/dist/components/file-upload/file-upload-context.js.map +1 -0
  90. package/dist/components/file-upload/index.d.ts +1 -1
  91. package/dist/components/file-upload/index.d.ts.map +1 -1
  92. package/dist/components/file-upload/index.js.map +1 -1
  93. package/dist/components/file-upload/types.d.ts +8 -10
  94. package/dist/components/file-upload/types.d.ts.map +1 -1
  95. package/dist/components/form/Form.d.ts.map +1 -1
  96. package/dist/components/form/Form.js +2 -1
  97. package/dist/components/form/Form.js.map +1 -1
  98. package/dist/components/hover-card/HoverCard.js +1 -1
  99. package/dist/components/hover-card/HoverCard.js.map +1 -1
  100. package/dist/components/index.d.ts +0 -1
  101. package/dist/components/index.d.ts.map +1 -1
  102. package/dist/components/index.js +0 -1
  103. package/dist/components/index.js.map +1 -1
  104. package/dist/components/input/Input.d.ts.map +1 -1
  105. package/dist/components/input/Input.js +1 -1
  106. package/dist/components/input/Input.js.map +1 -1
  107. package/dist/components/internal/choice-family/ChoiceGroup.js +1 -1
  108. package/dist/components/internal/choice-family/ChoiceGroup.js.map +1 -1
  109. package/dist/components/internal/choice-family/types.d.ts +3 -3
  110. package/dist/components/internal/choice-family/types.d.ts.map +1 -1
  111. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts +7 -0
  112. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts.map +1 -0
  113. package/dist/components/internal/native-check-control/NativeCheckControl.js +56 -0
  114. package/dist/components/internal/native-check-control/NativeCheckControl.js.map +1 -0
  115. package/dist/components/internal/native-check-control/types.d.ts +13 -0
  116. package/dist/components/internal/native-check-control/types.d.ts.map +1 -0
  117. package/dist/components/internal/native-check-control/types.js +1 -0
  118. package/dist/components/number-field/NumberField.d.ts.map +1 -1
  119. package/dist/components/number-field/NumberField.js +11 -2
  120. package/dist/components/number-field/NumberField.js.map +1 -1
  121. package/dist/components/number-field/format.d.ts +1 -0
  122. package/dist/components/number-field/format.d.ts.map +1 -1
  123. package/dist/components/number-field/format.js +18 -6
  124. package/dist/components/number-field/format.js.map +1 -1
  125. package/dist/components/popup/PopupParts.d.ts.map +1 -1
  126. package/dist/components/popup/PopupParts.js +2 -0
  127. package/dist/components/popup/PopupParts.js.map +1 -1
  128. package/dist/components/select/Select.d.ts.map +1 -1
  129. package/dist/components/select/Select.js +1 -1
  130. package/dist/components/select/Select.js.map +1 -1
  131. package/dist/components/skeleton/Skeleton.d.ts.map +1 -1
  132. package/dist/components/skeleton/Skeleton.js +14 -35
  133. package/dist/components/skeleton/Skeleton.js.map +1 -1
  134. package/dist/components/skeleton/types.d.ts +1 -8
  135. package/dist/components/skeleton/types.d.ts.map +1 -1
  136. package/dist/components/table/Table.d.ts +1 -40
  137. package/dist/components/table/Table.d.ts.map +1 -1
  138. package/dist/components/table/Table.js +9 -259
  139. package/dist/components/table/Table.js.map +1 -1
  140. package/dist/components/table/TableShell.d.ts +5 -1
  141. package/dist/components/table/TableShell.d.ts.map +1 -1
  142. package/dist/components/table/TableShell.js +63 -9
  143. package/dist/components/table/TableShell.js.map +1 -1
  144. package/dist/components/table/client/Table.d.ts +30 -0
  145. package/dist/components/table/client/Table.d.ts.map +1 -0
  146. package/dist/components/table/client/Table.js +135 -0
  147. package/dist/components/table/client/Table.js.map +1 -0
  148. package/dist/components/table/client/TableBody.d.ts +7 -0
  149. package/dist/components/table/client/TableBody.d.ts.map +1 -0
  150. package/dist/components/table/client/TableBody.js +35 -0
  151. package/dist/components/table/client/TableBody.js.map +1 -0
  152. package/dist/components/table/client/TableColumnHeader.d.ts +7 -0
  153. package/dist/components/table/client/TableColumnHeader.d.ts.map +1 -0
  154. package/dist/components/table/client/TableColumnHeader.js +69 -0
  155. package/dist/components/table/client/TableColumnHeader.js.map +1 -0
  156. package/dist/components/table/client/TableExpansion.d.ts +11 -0
  157. package/dist/components/table/client/TableExpansion.d.ts.map +1 -0
  158. package/dist/components/table/client/TableExpansion.js +43 -0
  159. package/dist/components/table/client/TableExpansion.js.map +1 -0
  160. package/dist/components/table/client/TableRow.d.ts +7 -0
  161. package/dist/components/table/client/TableRow.d.ts.map +1 -0
  162. package/dist/components/table/client/TableRow.js +95 -0
  163. package/dist/components/table/client/TableRow.js.map +1 -0
  164. package/dist/components/table/client/TableSelection.d.ts +11 -0
  165. package/dist/components/table/client/TableSelection.d.ts.map +1 -0
  166. package/dist/components/table/client/TableSelection.js +48 -0
  167. package/dist/components/table/client/TableSelection.js.map +1 -0
  168. package/dist/components/table/client/table-context.d.ts +3 -0
  169. package/dist/components/table/client/table-context.d.ts.map +1 -0
  170. package/dist/components/table/client/table-context.js +8 -0
  171. package/dist/components/table/client/table-context.js.map +1 -0
  172. package/dist/components/table/client.d.ts +4 -0
  173. package/dist/components/table/client.d.ts.map +1 -0
  174. package/dist/components/table/client.js +30 -0
  175. package/dist/components/table/client.js.map +1 -0
  176. package/dist/components/table/index.d.ts +2 -2
  177. package/dist/components/table/index.d.ts.map +1 -1
  178. package/dist/components/table/index.js +7 -7
  179. package/dist/components/table/index.js.map +1 -1
  180. package/dist/components/table/types.d.ts +42 -15
  181. package/dist/components/table/types.d.ts.map +1 -1
  182. package/dist/components/textarea/Textarea.d.ts.map +1 -1
  183. package/dist/components/textarea/Textarea.js +1 -1
  184. package/dist/components/textarea/Textarea.js.map +1 -1
  185. package/dist/components/toggle-group/ToggleGroup.d.ts.map +1 -1
  186. package/dist/components/toggle-group/ToggleGroup.js +1 -0
  187. package/dist/components/toggle-group/ToggleGroup.js.map +1 -1
  188. package/dist/components/toggle-group/client/ToggleGroupClient.js +2 -0
  189. package/dist/components/toggle-group/client/ToggleGroupClient.js.map +1 -1
  190. package/dist/components/toggle-group/types.d.ts +1 -0
  191. package/dist/components/toggle-group/types.d.ts.map +1 -1
  192. package/dist/components/toolbar/ToolbarShell.d.ts.map +1 -1
  193. package/dist/components/toolbar/ToolbarShell.js +2 -1
  194. package/dist/components/toolbar/ToolbarShell.js.map +1 -1
  195. package/dist/components/toolbar/types.d.ts +1 -0
  196. package/dist/components/toolbar/types.d.ts.map +1 -1
  197. package/dist/components/tooltip/Tooltip.js +1 -1
  198. package/dist/components/tooltip/Tooltip.js.map +1 -1
  199. package/dist/components/virtual-scroll/VirtualScroll.d.ts.map +1 -1
  200. package/dist/components/virtual-scroll/VirtualScroll.js +54 -34
  201. package/dist/components/virtual-scroll/VirtualScroll.js.map +1 -1
  202. package/dist/components/virtual-scroll/types.d.ts +2 -2
  203. package/dist/components/virtual-scroll/types.d.ts.map +1 -1
  204. package/dist/components/virtual-scroll/types.js.map +1 -1
  205. package/dist/components/virtual-scroll/virtual-scroll-scroll.d.ts.map +1 -1
  206. package/dist/components/virtual-scroll/virtual-scroll-scroll.js +0 -1
  207. package/dist/components/virtual-scroll/virtual-scroll-scroll.js.map +1 -1
  208. package/dist/core/roving-focus.d.ts +2 -1
  209. package/dist/core/roving-focus.d.ts.map +1 -1
  210. package/dist/core/roving-focus.js.map +1 -1
  211. package/dist/core/use-popover.d.ts.map +1 -1
  212. package/dist/core/use-popover.js +6 -1
  213. package/dist/core/use-popover.js.map +1 -1
  214. package/dist/elements/choice/types.d.ts +1 -1
  215. package/dist/elements/choice/types.d.ts.map +1 -1
  216. package/dist/styles/index.css +1 -1
  217. package/dist/styles/tailwind.css +1 -0
  218. package/dist/styles/tokens.css +1 -1
  219. package/package.json +1 -1
  220. package/dist/components/drawer/client-types.d.ts +0 -99
  221. package/dist/components/drawer/client-types.d.ts.map +0 -1
  222. package/dist/components/drawer/client-types.js +0 -1
  223. package/dist/components/enhance/internal/read-box.d.ts +0 -3
  224. package/dist/components/enhance/internal/read-box.d.ts.map +0 -1
  225. package/dist/components/enhance/internal/read-box.js +0 -7
  226. package/dist/components/enhance/internal/read-box.js.map +0 -1
  227. package/dist/components/stepper/Stepper.d.ts +0 -7
  228. package/dist/components/stepper/Stepper.d.ts.map +0 -1
  229. package/dist/components/stepper/Stepper.js +0 -35
  230. package/dist/components/stepper/Stepper.js.map +0 -1
  231. package/dist/components/stepper/index.d.ts +0 -3
  232. package/dist/components/stepper/index.d.ts.map +0 -1
  233. package/dist/components/stepper/index.js +0 -5
  234. package/dist/components/stepper/index.js.map +0 -1
  235. package/dist/components/stepper/types.d.ts +0 -14
  236. package/dist/components/stepper/types.d.ts.map +0 -1
  237. package/dist/components/stepper.d.ts +0 -1
  238. package/dist/components/stepper.js +0 -1
  239. /package/dist/components/{stepper → enhance}/types.js +0 -0
  240. /package/dist/components/{stepper → enhance}/types.js.map +0 -0
  241. /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 shape,\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 ...(shape !== undefined ? { \"data-shape\": shape } : {}),\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":[]}
@@ -41,6 +41,7 @@ export type DropdownMenuRootShellOwnProps = DropdownMenuRootOwnProps;
41
41
  export type DropdownMenuRootControlledOwnProps = Pick<DropdownMenuRootOwnProps, "onOpenChange" | "open">;
42
42
  export type DropdownMenuRootShellProps = DropdownMenuRootOwnProps;
43
43
  export interface DropdownMenuTriggerOwnProps {
44
+ readonly shape?: "square" | "circle";
44
45
  readonly children?: ReactNode;
45
46
  readonly className?: string;
46
47
  readonly openOnHover?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/types.ts"],"names":[],"mappings":"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"}
@@ -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":"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","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":"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","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,