@gunkin/uiify 0.0.17-alpha → 0.0.20-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.
- package/agents/components.md +1 -1
- package/agents/index.md +1 -0
- package/agents/reference/components/breadcrumb.md +11 -1
- package/agents/reference/components/button.md +4 -4
- package/agents/reference/components/candle-chart.md +20 -1
- package/agents/reference/components/carousel.md +3 -2
- package/agents/reference/components/combobox.md +2 -1
- package/agents/reference/components/drawer.md +8 -1
- package/agents/reference/components/dropdown-menu.md +1 -1
- package/agents/reference/components/file-upload.md +12 -1
- package/agents/reference/components/line-chart.md +1 -0
- package/agents/reference/components/modal.md +8 -1
- package/agents/reference/components/number-field.md +14 -3
- package/agents/reference/components/pagination.md +22 -1
- package/agents/reference/components/slider.md +9 -1
- package/agents/reference/components/spinner.md +8 -1
- package/agents/reference/components/toast.md +14 -1
- package/dist/components/behavior.css +9 -9
- package/dist/components/behavior.css.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.js +21 -4
- package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/breadcrumb/index.d.ts +1 -1
- package/dist/components/breadcrumb/index.d.ts.map +1 -1
- package/dist/components/breadcrumb/index.js.map +1 -1
- package/dist/components/breadcrumb/types.d.ts +7 -0
- package/dist/components/breadcrumb/types.d.ts.map +1 -1
- package/dist/components/button/types.d.ts +4 -0
- package/dist/components/button/types.d.ts.map +1 -1
- package/dist/components/candle-chart/CandleChart.d.ts +1 -1
- package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
- package/dist/components/candle-chart/CandleChart.js +81 -46
- package/dist/components/candle-chart/CandleChart.js.map +1 -1
- package/dist/components/candle-chart/client/CandleChartClient.d.ts.map +1 -1
- package/dist/components/candle-chart/client/CandleChartClient.js +5 -0
- package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
- package/dist/components/candle-chart/index.d.ts +1 -1
- package/dist/components/candle-chart/index.d.ts.map +1 -1
- package/dist/components/candle-chart/index.js.map +1 -1
- package/dist/components/candle-chart/types.d.ts +17 -0
- package/dist/components/candle-chart/types.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.js +20 -3
- package/dist/components/carousel/CarouselMarkup.js.map +1 -1
- package/dist/components/carousel/carousel-markup.js +2 -2
- package/dist/components/carousel/carousel-markup.js.map +1 -1
- package/dist/components/carousel/types.d.ts +3 -2
- package/dist/components/carousel/types.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.js +37 -23
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/combobox-store.d.ts.map +1 -1
- package/dist/components/combobox/combobox-store.js +5 -2
- package/dist/components/combobox/combobox-store.js.map +1 -1
- package/dist/components/combobox/types.d.ts +2 -3
- package/dist/components/combobox/types.d.ts.map +1 -1
- package/dist/components/context-menu/ContextMenu.d.ts.map +1 -1
- package/dist/components/context-menu/ContextMenu.js +25 -5
- package/dist/components/context-menu/ContextMenu.js.map +1 -1
- package/dist/components/drawer/DrawerNative.d.ts +1 -1
- package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
- package/dist/components/drawer/DrawerNative.js +5 -2
- package/dist/components/drawer/DrawerNative.js.map +1 -1
- package/dist/components/drawer/index.d.ts +1 -1
- package/dist/components/drawer/index.d.ts.map +1 -1
- package/dist/components/drawer/index.js.map +1 -1
- package/dist/components/drawer/types.d.ts +4 -0
- package/dist/components/drawer/types.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenu.js +31 -15
- package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.js +7 -5
- package/dist/components/dropdown-menu/DropdownMenuBar.js.map +1 -1
- package/dist/components/dropdown-menu/types.d.ts +1 -1
- package/dist/components/dropdown-menu/types.d.ts.map +1 -1
- package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
- package/dist/components/file-upload/FileUpload.js +11 -4
- package/dist/components/file-upload/FileUpload.js.map +1 -1
- package/dist/components/file-upload/FileUploadRoot.d.ts +1 -1
- package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -1
- package/dist/components/file-upload/FileUploadRoot.js +9 -0
- package/dist/components/file-upload/FileUploadRoot.js.map +1 -1
- package/dist/components/file-upload/index.d.ts +1 -1
- package/dist/components/file-upload/index.d.ts.map +1 -1
- package/dist/components/file-upload/index.js.map +1 -1
- package/dist/components/file-upload/types.d.ts +8 -0
- package/dist/components/file-upload/types.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.js +3 -2
- package/dist/components/line-chart/LineChart.js.map +1 -1
- package/dist/components/line-chart/line-chart-geometry.d.ts +2 -2
- package/dist/components/line-chart/line-chart-geometry.d.ts.map +1 -1
- package/dist/components/line-chart/line-chart-geometry.js +6 -6
- package/dist/components/line-chart/line-chart-geometry.js.map +1 -1
- package/dist/components/line-chart/types.d.ts +2 -0
- package/dist/components/line-chart/types.d.ts.map +1 -1
- package/dist/components/modal/Modal.d.ts +1 -1
- package/dist/components/modal/Modal.d.ts.map +1 -1
- package/dist/components/modal/Modal.js +5 -2
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/modal/index.d.ts +1 -1
- package/dist/components/modal/index.d.ts.map +1 -1
- package/dist/components/modal/index.js.map +1 -1
- package/dist/components/modal/types.d.ts +4 -0
- package/dist/components/modal/types.d.ts.map +1 -1
- package/dist/components/number-field/NumberField.d.ts +1 -1
- package/dist/components/number-field/NumberField.d.ts.map +1 -1
- package/dist/components/number-field/NumberField.js +25 -5
- package/dist/components/number-field/NumberField.js.map +1 -1
- package/dist/components/number-field/format.d.ts +1 -1
- package/dist/components/number-field/format.d.ts.map +1 -1
- package/dist/components/number-field/format.js +32 -7
- package/dist/components/number-field/format.js.map +1 -1
- package/dist/components/number-field/index.d.ts +1 -1
- package/dist/components/number-field/index.d.ts.map +1 -1
- package/dist/components/number-field/index.js.map +1 -1
- package/dist/components/number-field/types.d.ts +11 -2
- package/dist/components/number-field/types.d.ts.map +1 -1
- package/dist/components/otp-input/OtpInput.d.ts.map +1 -1
- package/dist/components/otp-input/OtpInput.js +2 -0
- package/dist/components/otp-input/OtpInput.js.map +1 -1
- package/dist/components/pagination/Pagination.d.ts.map +1 -1
- package/dist/components/pagination/Pagination.js +93 -29
- package/dist/components/pagination/Pagination.js.map +1 -1
- package/dist/components/pagination/PaginationShell.d.ts +2 -1
- package/dist/components/pagination/PaginationShell.d.ts.map +1 -1
- package/dist/components/pagination/PaginationShell.js +44 -9
- package/dist/components/pagination/PaginationShell.js.map +1 -1
- package/dist/components/pagination/index.d.ts +1 -1
- package/dist/components/pagination/index.d.ts.map +1 -1
- package/dist/components/pagination/index.js.map +1 -1
- package/dist/components/pagination/types.d.ts +18 -0
- package/dist/components/pagination/types.d.ts.map +1 -1
- package/dist/components/slider/client/SliderClient.d.ts.map +1 -1
- package/dist/components/slider/client/SliderClient.js +11 -2
- package/dist/components/slider/client/SliderClient.js.map +1 -1
- package/dist/components/slider/index.d.ts +1 -1
- package/dist/components/slider/index.d.ts.map +1 -1
- package/dist/components/slider/index.js.map +1 -1
- package/dist/components/slider/types.d.ts +5 -0
- package/dist/components/slider/types.d.ts.map +1 -1
- package/dist/components/spinner/Spinner.d.ts.map +1 -1
- package/dist/components/spinner/Spinner.js +6 -3
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/spinner/index.d.ts +1 -1
- package/dist/components/spinner/index.d.ts.map +1 -1
- package/dist/components/spinner/index.js.map +1 -1
- package/dist/components/spinner/types.d.ts +4 -0
- package/dist/components/spinner/types.d.ts.map +1 -1
- package/dist/components/tags-input/TagsInput.d.ts.map +1 -1
- package/dist/components/tags-input/TagsInput.js +2 -0
- package/dist/components/tags-input/TagsInput.js.map +1 -1
- package/dist/components/toast/Toast.d.ts +1 -1
- package/dist/components/toast/Toast.d.ts.map +1 -1
- package/dist/components/toast/Toast.js +33 -29
- package/dist/components/toast/Toast.js.map +1 -1
- package/dist/components/toast/ToastElements.d.ts.map +1 -1
- package/dist/components/toast/ToastElements.js +24 -12
- package/dist/components/toast/ToastElements.js.map +1 -1
- package/dist/components/toast/index.d.ts +1 -1
- package/dist/components/toast/index.d.ts.map +1 -1
- package/dist/components/toast/index.js.map +1 -1
- package/dist/components/toast/types.d.ts +10 -0
- package/dist/components/toast/types.d.ts.map +1 -1
- package/dist/components/toolbar/Toolbar.d.ts +2 -2
- package/dist/components/toolbar/Toolbar.d.ts.map +1 -1
- package/dist/components/toolbar/Toolbar.js +8 -4
- package/dist/components/toolbar/Toolbar.js.map +1 -1
- package/dist/core/direction.d.ts +2 -0
- package/dist/core/direction.d.ts.map +1 -1
- package/dist/core/direction.js +8 -3
- package/dist/core/direction.js.map +1 -1
- package/dist/core/dismissable-layer-registry.d.ts.map +1 -1
- package/dist/core/dismissable-layer-registry.js +3 -1
- package/dist/core/dismissable-layer-registry.js.map +1 -1
- package/dist/core/format-label.d.ts +2 -0
- package/dist/core/format-label.d.ts.map +1 -0
- package/dist/core/format-label.js +13 -0
- package/dist/core/format-label.js.map +1 -0
- package/dist/core/ime.d.ts +16 -0
- package/dist/core/ime.d.ts.map +1 -0
- package/dist/core/ime.js +7 -0
- package/dist/core/ime.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/roving-focus-store.d.ts +3 -2
- package/dist/core/roving-focus-store.d.ts.map +1 -1
- package/dist/core/roving-focus-store.js +5 -3
- package/dist/core/roving-focus-store.js.map +1 -1
- package/dist/core/roving-focus.d.ts.map +1 -1
- package/dist/core/roving-focus.js +10 -5
- package/dist/core/roving-focus.js.map +1 -1
- package/dist/core/text-direction.d.ts +7 -0
- package/dist/core/text-direction.d.ts.map +1 -0
- package/dist/core/text-direction.js +7 -0
- package/dist/core/text-direction.js.map +1 -0
- package/dist/styles/index.css +1 -1
- package/package.json +2 -1
- package/skills/uiify/SKILL.md +58 -33
- package/skills/uiify/references/compositions/card-rhythm.md +0 -2
- package/skills/uiify/references/compositions/destructive-confirmation.md +1 -3
- package/skills/uiify/references/compositions/form-grouping.md +0 -2
- package/skills/uiify/references/compositions/hero-actions.md +3 -5
- package/skills/uiify/references/compositions/page-frame.md +0 -2
- package/skills/uiify/references/compositions/pricing-actions.md +0 -2
- package/skills/uiify/references/compositions/save-feedback.md +1 -3
- package/skills/uiify/references/compositions/table-controls.md +1 -3
- package/skills/uiify/references/elements/accordion.md +38 -0
- package/skills/uiify/references/elements/alert-modal.md +32 -5
- package/skills/uiify/references/elements/avatar.md +31 -2
- package/skills/uiify/references/elements/badge.md +32 -3
- package/skills/uiify/references/elements/bar-chart.md +39 -7
- package/skills/uiify/references/elements/breadcrumb.md +38 -0
- package/skills/uiify/references/elements/button.md +38 -3
- package/skills/uiify/references/elements/candle-chart.md +40 -0
- package/skills/uiify/references/elements/card.md +38 -1
- package/skills/uiify/references/elements/carousel.md +40 -0
- package/skills/uiify/references/elements/checkbox.md +39 -0
- package/skills/uiify/references/elements/code-block.md +31 -2
- package/skills/uiify/references/elements/collapsible.md +38 -0
- package/skills/uiify/references/elements/color-picker.md +39 -0
- package/skills/uiify/references/elements/combobox.md +37 -0
- package/skills/uiify/references/elements/command-palette.md +33 -12
- package/skills/uiify/references/elements/context-menu.md +38 -0
- package/skills/uiify/references/elements/cookie-banner.md +30 -2
- package/skills/uiify/references/elements/date-picker.md +33 -9
- package/skills/uiify/references/elements/divider.md +30 -2
- package/skills/uiify/references/elements/drawer.md +38 -0
- package/skills/uiify/references/elements/dropdown-menu.md +38 -0
- package/skills/uiify/references/elements/empty-state.md +30 -2
- package/skills/uiify/references/elements/feature-grid.md +41 -1
- package/skills/uiify/references/elements/field.md +33 -3
- package/skills/uiify/references/elements/file-upload.md +40 -0
- package/skills/uiify/references/elements/footer.md +35 -4
- package/skills/uiify/references/elements/form.md +31 -4
- package/skills/uiify/references/elements/header.md +31 -3
- package/skills/uiify/references/elements/hero.md +43 -3
- package/skills/uiify/references/elements/hover-card.md +38 -0
- package/skills/uiify/references/elements/image-gallery.md +36 -4
- package/skills/uiify/references/elements/inline-alert.md +30 -2
- package/skills/uiify/references/elements/input.md +31 -4
- package/skills/uiify/references/elements/line-chart.md +38 -0
- package/skills/uiify/references/elements/logo-wall.md +31 -2
- package/skills/uiify/references/elements/modal.md +38 -0
- package/skills/uiify/references/elements/number-field.md +41 -0
- package/skills/uiify/references/elements/otp-input.md +39 -0
- package/skills/uiify/references/elements/pagination.md +33 -4
- package/skills/uiify/references/elements/password-input.md +33 -9
- package/skills/uiify/references/elements/popup.md +38 -0
- package/skills/uiify/references/elements/pricing-table.md +55 -2
- package/skills/uiify/references/elements/progress-bar.md +32 -4
- package/skills/uiify/references/elements/radio-group.md +39 -0
- package/skills/uiify/references/elements/rating.md +39 -0
- package/skills/uiify/references/elements/search-input.md +35 -4
- package/skills/uiify/references/elements/segmented-control.md +39 -0
- package/skills/uiify/references/elements/select.md +29 -1
- package/skills/uiify/references/elements/sidebar.md +33 -10
- package/skills/uiify/references/elements/skeleton.md +38 -0
- package/skills/uiify/references/elements/slider.md +39 -0
- package/skills/uiify/references/elements/spinner.md +38 -0
- package/skills/uiify/references/elements/stats-bar.md +30 -2
- package/skills/uiify/references/elements/stepper.md +32 -9
- package/skills/uiify/references/elements/switch.md +31 -4
- package/skills/uiify/references/elements/table-of-contents.md +39 -0
- package/skills/uiify/references/elements/table.md +32 -3
- package/skills/uiify/references/elements/tabs.md +38 -0
- package/skills/uiify/references/elements/tags-input.md +39 -0
- package/skills/uiify/references/elements/testimonial.md +35 -4
- package/skills/uiify/references/elements/textarea.md +30 -3
- package/skills/uiify/references/elements/timeline.md +31 -3
- package/skills/uiify/references/elements/toast.md +27 -1
- package/skills/uiify/references/elements/toggle-group.md +39 -0
- package/skills/uiify/references/elements/toggle.md +39 -0
- package/skills/uiify/references/elements/toolbar.md +39 -0
- package/skills/uiify/references/elements/tooltip.md +38 -0
- package/skills/uiify/references/elements/virtual-scroll.md +39 -0
- package/skills/uiify/references/examples/alert-confirmation.md +34 -0
- package/skills/uiify/references/examples/field-validation.md +37 -0
- package/skills/uiify/references/examples/select-basic.md +35 -0
- package/skills/uiify/references/examples/table-controls.md +40 -0
- package/skills/uiify/references/guides/assets.md +14 -0
- package/skills/uiify/references/guides/content.md +11 -0
- package/skills/uiify/references/guides/hierarchy.md +14 -0
- package/skills/uiify/references/guides/i18n.md +21 -0
- package/skills/uiify/references/guides/reference.md +9 -0
- package/skills/uiify/references/guides/states.md +12 -0
- package/skills/uiify/references/guides/surface.md +27 -0
- package/skills/uiify/scripts/lint.mjs +1 -1
- package/skills/uiify/scripts/static.mjs +150 -14
|
@@ -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 ...(nativeButton ? { \"data-uiify-button\": \"\" } : {}),\n \"aria-haspopup\": \"menu\",\n \"data-part\": \"trigger\",\n \"data-state\": open ? \"open\" : \"closed\",\n \"data-disabled\": disabled ? \"\" : undefined,\n disabled: nativeButton && disabled ? true : undefined,\n ...(nativeButton && !triggerProps.type ? { type: \"button\" } : {}),\n ...(className ? { className } : {}),\n onClick: disabled ? consumerOnClick : composeEventHandlers(consumerOnClick, internalOnClick),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ...(openOnHover && !disabled\n ? {\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, handlePointerEnter),\n onPointerLeave: composeEventHandlers(consumerOnPointerLeave, scheduleHoverClose),\n }\n : {}),\n },\n state: { open },\n });\n}\n\nexport function DropdownMenuContent<TAs extends ElementType = \"div\">(\n props: DropdownMenuContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"start\",\n as,\n className,\n side = \"bottom\",\n children,\n render,\n ...consumerProps\n } = props as DropdownMenuContentProps<\"div\">;\n const {\n cancelHoverClose,\n close,\n contentRef,\n dir,\n focusTrigger,\n hoverEnabledRef,\n loop,\n open,\n popupProps,\n popupRef,\n positionerProps,\n scheduleHoverClose,\n } = useDropdownMenuContext(\"Content\");\n const [consumerRef, withoutRef] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const mergedRef = useMergedRefs(popupRef, contentRef, consumerRef);\n const {\n onKeyDown: consumerOnKeyDown,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = withoutRef as {\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n focusTrigger();\n }\n };\n const contentProps = {\n ...withoutRef,\n ...popupProps,\n ...positionerProps,\n ref: mergedRef,\n role: \"menu\",\n \"data-part\": \"content\",\n \"data-align\": align,\n \"data-side\": side,\n \"data-state\": open ? \"open\" : \"closed\",\n ...(className ? { className } : {}),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ...(hoverEnabledRef.current\n ? {\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, cancelHoverClose),\n onPointerLeave: composeEventHandlers(consumerOnPointerLeave, scheduleHoverClose),\n }\n : {}),\n children,\n };\n if (render)\n return (\n <RovingFocusRoot\n direction={dir}\n loop={loop}\n orientation=\"vertical\"\n {...contentProps}\n render={(p) => render(p, { open })}\n />\n );\n return (\n <RovingFocusRoot\n as={as ?? \"div\"}\n direction={dir}\n loop={loop}\n orientation=\"vertical\"\n {...contentProps}\n />\n );\n}\n\ninterface ItemActivationOptions {\n closeOnSelect: boolean;\n disabled: boolean;\n onSelect?: DropdownMenuItemProps[\"onSelect\"];\n onStateChange?: () => void;\n}\nfunction useItemActivation({\n closeOnSelect,\n disabled,\n onSelect,\n onStateChange,\n}: ItemActivationOptions) {\n const { close, focusTrigger } = useDropdownMenuContext(\"Item\");\n const select = (event: SyntheticEvent<HTMLElement>) => {\n if (disabled) return;\n const selectEvent = createMenuSelectEvent();\n onSelect?.(selectEvent);\n if (!selectEvent.defaultPrevented) {\n onStateChange?.();\n if (closeOnSelect) {\n close();\n focusTrigger();\n }\n }\n event.preventDefault();\n };\n return {\n select,\n keyDown: (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") select(event);\n },\n };\n}\n\nfunction MenuItem<TAs extends ElementType>(\n props: DropdownMenuItemProps<TAs> & {\n roleName: string;\n checked?: boolean | \"mixed\";\n state?: string;\n onStateChange?: () => void;\n defaultClose: boolean;\n },\n): ReactElement | null {\n const {\n as,\n render,\n children,\n className,\n closeOnSelect,\n disabled = false,\n onSelect,\n textValue,\n roleName,\n checked,\n state,\n onStateChange,\n defaultClose,\n ...consumerProps\n } = props as DropdownMenuItemProps<\"div\"> & {\n roleName: string;\n checked?: boolean | \"mixed\";\n state?: string;\n onStateChange?: () => void;\n defaultClose: boolean;\n };\n const { onClick: consumerOnClick, onKeyDown: consumerOnKeyDown } = consumerProps as {\n onClick?: (event: SyntheticEvent<HTMLElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n };\n const activation = useItemActivation({\n closeOnSelect: closeOnSelect ?? defaultClose,\n disabled,\n onSelect,\n ...(onStateChange ? { onStateChange } : {}),\n });\n const itemProps = {\n ...consumerProps,\n role: roleName,\n \"aria-checked\": checked,\n \"data-part\": roleName === \"menuitem\" ? \"item\" : roleName.replace(\"menuitem\", \"\") + \"-item\",\n \"data-state\": state,\n ...(className ? { className } : {}),\n onClick: composeEventHandlers(consumerOnClick, activation.select),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, activation.keyDown),\n children,\n };\n if (render)\n return (\n <RovingFocusItem\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n {...(itemProps as object)}\n render={(p) => render(p, { disabled })}\n />\n );\n return (\n <RovingFocusItem\n as={as ?? \"div\"}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n {...(itemProps as object)}\n />\n );\n}\n\nexport function DropdownMenuItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuItemProps<TAs>,\n): ReactElement | null {\n return <MenuItem {...props} roleName=\"menuitem\" defaultClose />;\n}\n\ninterface SelectionContextValue {\n checked: DropdownMenuCheckedState;\n kind: \"checkbox\" | \"radio\";\n}\nconst [SelectionProvider, useSelectionContext] = createPartContext<SelectionContextValue>(\n \"DropdownMenu\",\n \"ItemIndicator\",\n);\n\nexport function DropdownMenuCheckboxItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuCheckboxItemProps<TAs>,\n): ReactElement | null {\n const { checked: controlled, defaultChecked = false, onCheckedChange, ...itemProps } = props;\n const [checked, setChecked] = useControllableState<DropdownMenuCheckedState>({\n value: controlled,\n defaultValue: defaultChecked,\n });\n const next = checked === \"indeterminate\" ? true : !checked;\n return (\n <SelectionProvider value={{ checked, kind: \"checkbox\" }}>\n <MenuItem\n {...(itemProps as DropdownMenuItemProps<ElementType>)}\n roleName=\"menuitemcheckbox\"\n checked={checked === \"indeterminate\" ? \"mixed\" : checked}\n state={checked === \"indeterminate\" ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\"}\n defaultClose={false}\n onStateChange={() => {\n setChecked(next);\n onCheckedChange?.(next);\n }}\n />\n </SelectionProvider>\n );\n}\n\ninterface RadioContextValue {\n setValue: (value: string) => void;\n value: string | undefined;\n}\nconst [RadioProvider, useRadioContext] = createPartContext<RadioContextValue>(\n \"DropdownMenu\",\n \"RadioGroup\",\n);\nexport function DropdownMenuRadioGroup<TAs extends ElementType = \"div\">(\n props: DropdownMenuRadioGroupProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n defaultValue,\n onValueChange,\n value: controlled,\n ...consumerProps\n } = props as DropdownMenuRadioGroupProps<\"div\">;\n const [value, setValue] = useControllableState<string | undefined>({\n value: controlled,\n defaultValue,\n ...(onValueChange\n ? {\n onChange: (next) => {\n if (next !== undefined) onValueChange(next);\n },\n }\n : {}),\n });\n return (\n <RadioProvider value={{ value, setValue }}>\n {useRenderElement({\n as,\n defaultTag: \"div\",\n render,\n props: { ...consumerProps, role: \"group\", \"data-part\": \"radio-group\", children },\n state: { value },\n })}\n </RadioProvider>\n );\n}\nexport function DropdownMenuRadioItem<TAs extends ElementType = \"div\">(\n props: DropdownMenuRadioItemProps<TAs>,\n): ReactElement | null {\n const { value, ...itemProps } = props;\n const radio = useRadioContext(\"RadioItem\");\n const checked = radio.value === value;\n return (\n <SelectionProvider value={{ checked, kind: \"radio\" }}>\n <MenuItem\n {...(itemProps as DropdownMenuItemProps<ElementType>)}\n roleName=\"menuitemradio\"\n checked={checked}\n state={checked ? \"checked\" : \"unchecked\"}\n defaultClose={false}\n onStateChange={() => radio.setValue(value)}\n />\n </SelectionProvider>\n );\n}\n\nfunction Part<TAs extends ElementType = \"span\">({\n part,\n defaultTag,\n ...props\n}: DropdownMenuPartProps<TAs> & { part: string; defaultTag: ElementType }): ReactElement | null {\n const { as, render, children, className, ...consumerProps } =\n props as DropdownMenuPartProps<\"span\">;\n return useRenderElement({\n as,\n defaultTag,\n render,\n props: { ...consumerProps, \"data-part\": part, ...(className ? { className } : {}), children },\n state: {},\n });\n}\nexport const DropdownMenuItemIcon = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemIconProps<TAs>,\n) => <Part {...p} part=\"item-icon\" defaultTag=\"span\" />;\nexport const DropdownMenuItemText = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemTextProps<TAs>,\n) => <Part {...p} part=\"item-text\" defaultTag=\"span\" />;\nexport const DropdownMenuItemDescription = <TAs extends ElementType = \"span\">(\n p: DropdownMenuItemDescriptionProps<TAs>,\n) => <Part {...p} part=\"item-description\" defaultTag=\"span\" />;\nexport const DropdownMenuShortcut = <TAs extends ElementType = \"span\">(\n p: DropdownMenuShortcutProps<TAs>,\n) => <Part {...p} part=\"shortcut\" defaultTag=\"kbd\" />;\nexport function DropdownMenuItemIndicator<TAs extends ElementType = \"span\">(\n p: DropdownMenuItemIndicatorProps<TAs>,\n): ReactElement | null {\n const s = useSelectionContext(\"ItemIndicator\");\n return (\n <Part\n {...p}\n part=\"item-indicator\"\n defaultTag=\"span\"\n data-state={\n s.checked === \"indeterminate\" ? \"indeterminate\" : s.checked ? \"checked\" : \"unchecked\"\n }\n />\n );\n}\nexport function DropdownMenuGroup<TAs extends ElementType = \"div\">(\n p: DropdownMenuGroupProps<TAs>,\n): ReactElement | null {\n return <MenuGroup {...p} />;\n}\nexport function DropdownMenuLabel<TAs extends ElementType = \"div\">(\n p: DropdownMenuLabelProps<TAs>,\n): ReactElement | null {\n return <MenuLabel {...p} />;\n}\nexport function DropdownMenuSeparator<TAs extends ElementType = \"div\">(\n p: DropdownMenuSeparatorProps<TAs>,\n): ReactElement | null {\n return <MenuSeparator {...p} />;\n}\n\ninterface SubValue {\n clickedRef: RefObject<boolean>;\n contentRef: React.RefObject<HTMLElement | null>;\n open: boolean;\n popover: ReturnType<typeof usePopover>;\n anchor: ReturnType<typeof useAnchorPosition>;\n triggerRef: React.RefObject<HTMLElement | null>;\n}\nconst [SubProvider, useSubContext] = createPartContext<SubValue>(\"DropdownMenu\", \"Sub\");\nexport function DropdownMenuSub(props: DropdownMenuSubProps): ReactElement | null {\n const { children, defaultOpen, onOpenChange, open } = props;\n const contentRef = useRef<HTMLElement | null>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const popover = usePopover({\n mode: \"auto\",\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(open !== undefined ? { open } : {}),\n ...(onOpenChange\n ? {\n onOpenChange: (next, details) =>\n onOpenChange(next, { event: details.event, reason: mapReason(details.reason) }),\n }\n : {}),\n });\n const anchor = useAnchorPosition();\n const clickedRef = useRef(false);\n const value = useMemo(\n () => ({ anchor, clickedRef, contentRef, open: popover.open, popover, triggerRef }),\n [anchor, popover, clickedRef],\n );\n return <SubProvider value={value}>{children}</SubProvider>;\n}\nexport function DropdownMenuSubTrigger<TAs extends ElementType = \"button\">(\n props: DropdownMenuSubTriggerProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n disabled = false,\n textValue,\n ...consumerProps\n } = props as DropdownMenuSubTriggerProps<\"div\">;\n const sub = useSubContext(\"SubTrigger\");\n const root = useDropdownMenuContext(\"SubTrigger\");\n const { clickedRef } = sub;\n const { onClick, onKeyDown, onPointerEnter, ...withoutEvents } =\n consumerProps as typeof consumerProps & {\n onClick?: (event: MouseEvent<HTMLElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const openKey = root.dir === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n if (event.key === openKey || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n clickedRef.current = true;\n sub.popover.openPopover();\n queueMicrotask(() => focusMenuItem(sub.contentRef.current));\n }\n };\n const handlePointerEnter = () => {\n clickedRef.current = false;\n sub.popover.openPopover();\n };\n const handlePointerLeave = (event: PointerEvent<HTMLElement>) => {\n if (clickedRef.current) return;\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && sub.contentRef.current?.contains(nextTarget)) return;\n sub.popover.close();\n };\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n clickedRef.current = true;\n if (!sub.open) {\n (sub.popover.triggerProps.onClick as (event: MouseEvent<HTMLElement>) => void)(event);\n }\n };\n const triggerProps = {\n ...(withoutEvents as object),\n ...sub.popover.triggerProps,\n ...sub.anchor.anchorProps,\n command: \"show-popover\",\n ref: sub.triggerRef,\n role: \"menuitem\",\n \"aria-haspopup\": \"menu\" as const,\n \"aria-expanded\": sub.open,\n \"data-part\": \"sub-trigger\",\n \"data-state\": sub.open ? \"open\" : \"closed\",\n onClick: composeEventHandlers(onClick, handleClick),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyDown),\n onPointerEnter: composeEventHandlers(onPointerEnter, handlePointerEnter),\n onPointerLeave: handlePointerLeave,\n children,\n };\n if (render)\n return (\n <RovingFocusItem\n {...(triggerProps as object)}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n render={(p) => render(p, { disabled, open: sub.open })}\n />\n );\n return (\n <RovingFocusItem\n as={as ?? \"button\"}\n {...(triggerProps as object)}\n disabled={disabled}\n {...(textValue !== undefined ? { textValue } : {})}\n />\n );\n}\nexport function DropdownMenuSubContent<TAs extends ElementType = \"div\">(\n props: DropdownMenuSubContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"start\",\n as,\n render,\n side = \"right\",\n children,\n ...consumerProps\n } = props as DropdownMenuSubContentProps<\"div\">;\n const sub = useSubContext(\"SubContent\");\n const root = useDropdownMenuContext(\"SubContent\");\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const closeKey = root.dir === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n if (event.key === closeKey || event.key === \"Escape\") {\n event.preventDefault();\n sub.popover.close();\n sub.triggerRef.current?.focus();\n }\n };\n const contentProps = {\n ...consumerProps,\n ...sub.popover.popupProps,\n ...sub.anchor.positionerProps,\n ref: useMergedRefs(sub.popover.popupRef, sub.contentRef),\n role: \"menu\",\n \"data-part\": \"sub-content\",\n \"data-state\": sub.open ? \"open\" : \"closed\",\n \"data-side\": side,\n \"data-align\": align,\n onKeyDown: handleKeyDown,\n onPointerLeave: (event: PointerEvent<HTMLElement>) => {\n if (sub.clickedRef.current) return;\n const nextTarget = event.relatedTarget;\n if (!(nextTarget instanceof Node) || !sub.triggerRef.current?.contains(nextTarget)) {\n sub.popover.close();\n }\n },\n children,\n };\n if (render)\n return (\n <RovingFocusRoot\n direction={root.dir}\n loop={root.loop}\n orientation=\"vertical\"\n {...contentProps}\n render={(p) => render(p, { open: sub.open })}\n />\n );\n return (\n <RovingFocusRoot\n as={as ?? \"div\"}\n direction={root.dir}\n loop={root.loop}\n orientation=\"vertical\"\n {...contentProps}\n />\n );\n}\n\nDropdownMenuRoot.displayName = \"DropdownMenuRoot\";\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\nMenuItem.displayName = \"DropdownMenuItemBase\";\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\nDropdownMenuCheckboxItem.displayName = \"DropdownMenuCheckboxItem\";\nDropdownMenuRadioGroup.displayName = \"DropdownMenuRadioGroup\";\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\";\nPart.displayName = \"DropdownMenuPart\";\nDropdownMenuItemIcon.displayName = \"DropdownMenuItemIcon\";\nDropdownMenuItemText.displayName = \"DropdownMenuItemText\";\nDropdownMenuItemDescription.displayName = \"DropdownMenuItemDescription\";\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\nDropdownMenuItemIndicator.displayName = \"DropdownMenuItemIndicator\";\nDropdownMenuGroup.displayName = \"DropdownMenuGroup\";\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\";\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\";\nDropdownMenuSub.displayName = \"DropdownMenuSub\";\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\";\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\";\n\nexport const DropdownMenu = {\n Bar: DropdownMenuBar,\n Root: DropdownMenuRoot,\n Trigger: DropdownMenuTrigger,\n Content: DropdownMenuContent,\n Group: DropdownMenuGroup,\n Label: DropdownMenuLabel,\n Item: DropdownMenuItem,\n ItemIcon: DropdownMenuItemIcon,\n ItemText: DropdownMenuItemText,\n ItemDescription: DropdownMenuItemDescription,\n Shortcut: DropdownMenuShortcut,\n Separator: DropdownMenuSeparator,\n CheckboxItem: DropdownMenuCheckboxItem,\n ItemIndicator: DropdownMenuItemIndicator,\n RadioGroup: DropdownMenuRadioGroup,\n RadioItem: DropdownMenuRadioItem,\n Sub: DropdownMenuSub,\n SubTrigger: DropdownMenuSubTrigger,\n SubContent: DropdownMenuSubContent,\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/dropdown-menu/DropdownMenu.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, useState } 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 { useDirectionOverride } from \"@gunkin/uiify/core/direction\";\nimport { resolveDirection } from \"@gunkin/uiify/core/text-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 = useDirectionOverride(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 ? { dir } : {}),\n disabled,\n hoverEnabledRef,\n loop,\n scheduleHoverClose,\n }),\n [cancelHoverClose, surface, dir, disabled, loop, scheduleHoverClose],\n );\n return (\n <div className={className} data-uiify-menu=\"\">\n <DropdownMenuProvider value={value}>{children}</DropdownMenuProvider>\n </div>\n );\n}\n\nexport function DropdownMenuTrigger<TAs extends ElementType = \"button\">(\n props: DropdownMenuTriggerProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n className,\n openOnHover = false,\n ...consumerProps\n } = props as DropdownMenuTriggerProps<\"button\"> & { openOnHover?: boolean };\n const {\n anchorProps,\n cancelHoverClose,\n close,\n disabled,\n focusTrigger,\n hoverEnabledRef,\n open,\n openPopover,\n openToItem,\n scheduleHoverClose,\n setTriggerElement,\n triggerProps,\n } = useDropdownMenuContext(\"Trigger\");\n hoverEnabledRef.current = openOnHover;\n const [consumerRef, withoutRef] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const mergedRef = useMergedRefs(setTriggerElement, consumerRef);\n const nativeButton = !as || as === \"button\";\n const {\n onClick: consumerOnClick,\n onKeyDown: consumerOnKeyDown,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = withoutRef as {\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLButtonElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n const internalOnClick = triggerProps.onClick as (event: MouseEvent<HTMLButtonElement>) => void;\n const handlePointerEnter = () => {\n if (disabled) return;\n cancelHoverClose();\n if (!open) openPopover();\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (disabled) return;\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (open) close();\n else openToItem(false);\n } else if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n openToItem(event.key === \"ArrowUp\");\n } else if (event.key === \"Escape\" && open) {\n event.preventDefault();\n close();\n focusTrigger();\n }\n };\n return useRenderElement({\n as,\n defaultTag: \"button\",\n render,\n props: {\n ...withoutRef,\n ...triggerProps,\n ...anchorProps,\n ref: mergedRef,\n ...(nativeButton ? { \"data-uiify-button\": \"\" } : {}),\n \"aria-haspopup\": \"menu\",\n \"data-part\": \"trigger\",\n \"data-state\": open ? \"open\" : \"closed\",\n \"data-disabled\": disabled ? \"\" : undefined,\n disabled: nativeButton && disabled ? true : undefined,\n ...(nativeButton && !triggerProps.type ? { type: \"button\" } : {}),\n ...(className ? { className } : {}),\n onClick: disabled ? consumerOnClick : composeEventHandlers(consumerOnClick, internalOnClick),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ...(openOnHover && !disabled\n ? {\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, handlePointerEnter),\n onPointerLeave: composeEventHandlers(consumerOnPointerLeave, scheduleHoverClose),\n }\n : {}),\n },\n state: { open },\n });\n}\n\nexport function DropdownMenuContent<TAs extends ElementType = \"div\">(\n props: DropdownMenuContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"start\",\n as,\n className,\n side = \"bottom\",\n children,\n render,\n ...consumerProps\n } = props as DropdownMenuContentProps<\"div\">;\n const {\n cancelHoverClose,\n close,\n contentRef,\n dir,\n focusTrigger,\n hoverEnabledRef,\n loop,\n open,\n popupProps,\n popupRef,\n positionerProps,\n scheduleHoverClose,\n } = useDropdownMenuContext(\"Content\");\n const [consumerRef, withoutRef] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const mergedRef = useMergedRefs(popupRef, contentRef, consumerRef);\n const {\n onKeyDown: consumerOnKeyDown,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = withoutRef as {\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n focusTrigger();\n }\n };\n const contentProps = {\n ...withoutRef,\n ...popupProps,\n ...positionerProps,\n ref: mergedRef,\n role: \"menu\",\n \"data-part\": \"content\",\n \"data-align\": align,\n \"data-side\": side,\n \"data-state\": open ? \"open\" : \"closed\",\n ...(className ? { className } : {}),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n ...(hoverEnabledRef.current\n ? {\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, cancelHoverClose),\n onPointerLeave: composeEventHandlers(consumerOnPointerLeave, scheduleHoverClose),\n }\n : {}),\n children,\n };\n if (render)\n return (\n <RovingFocusRoot\n {...(dir ? { 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 {...(dir ? { 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 resolvedSide: \"left\" | \"right\";\n setResolvedSide: (side: \"left\" | \"right\") => void;\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 [resolvedSide, setResolvedSide] = useState<\"left\" | \"right\">(\"right\");\n const value = useMemo(\n () => ({\n anchor,\n clickedRef,\n contentRef,\n open: popover.open,\n popover,\n resolvedSide,\n setResolvedSide,\n triggerRef,\n }),\n [anchor, popover, clickedRef, resolvedSide],\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 rtl = resolveDirection(event.currentTarget, root.dir) === \"rtl\";\n const openKey = rtl ? \"ArrowLeft\" : \"ArrowRight\";\n if (event.key === openKey || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n clickedRef.current = true;\n sub.setResolvedSide(rtl ? \"left\" : \"right\");\n sub.popover.openPopover();\n queueMicrotask(() => focusMenuItem(sub.contentRef.current));\n }\n };\n const handlePointerEnter = (event: PointerEvent<HTMLElement>) => {\n clickedRef.current = false;\n sub.setResolvedSide(\n resolveDirection(event.currentTarget, root.dir) === \"rtl\" ? \"left\" : \"right\",\n );\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,\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 =\n resolveDirection(event.currentTarget, 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 ?? sub.resolvedSide,\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 {...(root.dir ? { 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 {...(root.dir ? { 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenuBar.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/DropdownMenuBar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DropdownMenuBar.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/DropdownMenuBar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAgCvD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,CAwEzE;yBAxEe,eAAe"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useRef } from "react";
|
|
4
|
-
import {
|
|
4
|
+
import { useDirectionOverride } from "@gunkin/uiify/core/direction";
|
|
5
|
+
import { resolveDirection } from "@gunkin/uiify/core/text-direction";
|
|
5
6
|
const ITEM_SELECTOR = '[data-uiify-menu] [data-part="trigger"]';
|
|
6
7
|
function getItems(root) {
|
|
7
8
|
return Array.from(root.querySelectorAll(ITEM_SELECTOR));
|
|
@@ -24,7 +25,7 @@ function moveIndex(currentIndex, offset, length, loop) {
|
|
|
24
25
|
}
|
|
25
26
|
function DropdownMenuBar(props) {
|
|
26
27
|
const { children, className, dir: localDir, loop = true } = props;
|
|
27
|
-
const dir =
|
|
28
|
+
const dir = useDirectionOverride(localDir);
|
|
28
29
|
const rootRef = useRef(null);
|
|
29
30
|
const currentRef = useRef(null);
|
|
30
31
|
useEffect(() => {
|
|
@@ -53,11 +54,12 @@ function DropdownMenuBar(props) {
|
|
|
53
54
|
let nextIndex = null;
|
|
54
55
|
if (event.key === "Home") nextIndex = 0;
|
|
55
56
|
if (event.key === "End") nextIndex = enabled.length - 1;
|
|
57
|
+
const rtl = resolveDirection(item, dir) === "rtl";
|
|
56
58
|
if (event.key === "ArrowRight") {
|
|
57
|
-
nextIndex = moveIndex(currentIndex,
|
|
59
|
+
nextIndex = moveIndex(currentIndex, rtl ? -1 : 1, enabled.length, loop);
|
|
58
60
|
}
|
|
59
61
|
if (event.key === "ArrowLeft") {
|
|
60
|
-
nextIndex = moveIndex(currentIndex,
|
|
62
|
+
nextIndex = moveIndex(currentIndex, rtl ? 1 : -1, enabled.length, loop);
|
|
61
63
|
}
|
|
62
64
|
if (nextIndex === null) return;
|
|
63
65
|
event.preventDefault();
|
|
@@ -78,7 +80,7 @@ function DropdownMenuBar(props) {
|
|
|
78
80
|
{
|
|
79
81
|
...className ? { className } : {},
|
|
80
82
|
"data-uiify-menu-bar": "",
|
|
81
|
-
dir,
|
|
83
|
+
...dir ? { dir } : {},
|
|
82
84
|
ref: rootRef,
|
|
83
85
|
role: "menubar",
|
|
84
86
|
children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/dropdown-menu/DropdownMenuBar.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport type { ReactElement } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/components/dropdown-menu/DropdownMenuBar.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { useDirectionOverride } from \"@gunkin/uiify/core/direction\";\nimport { resolveDirection } from \"@gunkin/uiify/core/text-direction\";\nimport type { DropdownMenuBarProps } from \"./types.js\";\n\nconst ITEM_SELECTOR = '[data-uiify-menu] [data-part=\"trigger\"]';\n\nfunction getItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(ITEM_SELECTOR));\n}\n\nfunction isDisabledItem(item: HTMLElement): boolean {\n return item.getAttribute(\"aria-disabled\") === \"true\" || item.hasAttribute(\"disabled\");\n}\n\nfunction syncTabStops(root: HTMLElement, current: HTMLElement | null): HTMLElement | null {\n const items = getItems(root);\n const enabled = items.filter((item) => !isDisabledItem(item));\n const next = current && enabled.includes(current) ? current : (enabled[0] ?? null);\n for (const item of items) item.tabIndex = next === item ? 0 : -1;\n return next;\n}\n\nfunction moveIndex(\n currentIndex: number,\n offset: number,\n length: number,\n loop: boolean,\n): number | null {\n if (length === 0) return null;\n if (loop) return (currentIndex + offset + length) % length;\n const nextIndex = currentIndex + offset;\n return nextIndex < 0 || nextIndex >= length ? null : nextIndex;\n}\n\n/**\n * Roving focus and ArrowLeft/ArrowRight/Home/End across menu trigger descendants.\n * Modeled on Toolbar's own delegated-listener pattern but scoped to one axis and addressed by its\n * own marker: DropdownMenu.Trigger does not participate in @gunkin/uiify/core/roving-focus, and\n * Toolbar.Button drops any prop it does not itself destructure, so neither can host this directly.\n */\nexport function DropdownMenuBar(props: DropdownMenuBarProps): ReactElement {\n const { children, className, dir: localDir, loop = true } = props;\n const dir = useDirectionOverride(localDir);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const currentRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n currentRef.current = syncTabStops(root, currentRef.current);\n });\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n\n const handleFocusIn = (event: FocusEvent) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n const item = target.closest<HTMLElement>(ITEM_SELECTOR);\n if (!item || !root.contains(item) || isDisabledItem(item)) return;\n currentRef.current = syncTabStops(root, item);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n const item = target.closest<HTMLElement>(ITEM_SELECTOR);\n if (!item || !root.contains(item)) return;\n\n const enabled = getItems(root).filter((entry) => !isDisabledItem(entry));\n const currentIndex = enabled.indexOf(item);\n if (currentIndex === -1) return;\n\n let nextIndex: number | null = null;\n if (event.key === \"Home\") nextIndex = 0;\n if (event.key === \"End\") nextIndex = enabled.length - 1;\n const rtl = resolveDirection(item, dir) === \"rtl\";\n if (event.key === \"ArrowRight\") {\n nextIndex = moveIndex(currentIndex, rtl ? -1 : 1, enabled.length, loop);\n }\n if (event.key === \"ArrowLeft\") {\n nextIndex = moveIndex(currentIndex, rtl ? 1 : -1, enabled.length, loop);\n }\n\n if (nextIndex === null) return;\n event.preventDefault();\n const nextItem = enabled[nextIndex];\n if (!nextItem) return;\n currentRef.current = syncTabStops(root, nextItem);\n nextItem.focus();\n };\n\n root.addEventListener(\"focusin\", handleFocusIn);\n root.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n root.removeEventListener(\"focusin\", handleFocusIn);\n root.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [dir, loop]);\n\n return (\n <div\n {...(className ? { className } : {})}\n data-uiify-menu-bar=\"\"\n {...(dir ? { dir } : {})}\n ref={rootRef}\n role=\"menubar\"\n >\n {children}\n </div>\n );\n}\nDropdownMenuBar.displayName = \"DropdownMenuBar\";\n"],"mappings":"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","names":[]}
|
|
@@ -12,7 +12,7 @@ export interface DropdownMenuOpenChangeDetails {
|
|
|
12
12
|
}
|
|
13
13
|
export interface DropdownMenuContextValue extends UseMenuSurfaceReturn {
|
|
14
14
|
readonly cancelHoverClose: () => void;
|
|
15
|
-
readonly dir
|
|
15
|
+
readonly dir?: Direction;
|
|
16
16
|
readonly disabled: boolean;
|
|
17
17
|
readonly hoverEnabledRef: RefObject<boolean>;
|
|
18
18
|
readonly loop: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,eAAe,CAAC;AACjE,MAAM,MAAM,4BAA4B,GACpC,eAAe,GACf,aAAa,GACb,QAAQ,GACR,WAAW,GACX,eAAe,GACf,cAAc,CAAC;AAEnB,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;CAC/C;AAED,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IACpE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUpload.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/FileUpload.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAa,YAAY,EAAkB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FileUpload.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/FileUpload.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAa,YAAY,EAAkB,MAAM,OAAO,CAAC;AAIlF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC;AAEvE,wBAAgB,iBAAiB,CAAC,GAAG,SAAS,WAAW,GAAG,OAAO,EACjE,KAAK,EAAE,sBAAsB,CAAC,GAAG,CAAC,GACjC,YAAY,GAAG,IAAI,CAmCrB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAChE,KAAK,EAAE,uBAAuB,CAAC,GAAG,CAAC,GAClC,YAAY,GAAG,IAAI,CAgCrB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,GAAG,IAAI,CAajF;AAED,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,IAAI,EAC3D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAuBrB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,4BAA4B,GAAG,YAAY,GAAG,IAAI,CAoC7F;AAED,eAAO,MAAM,UAAU;;;;;;;;CAQtB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { composeEventHandlers } from "@gunkin/uiify/core/compose-event-handlers";
|
|
3
3
|
import { useRenderElement } from "@gunkin/uiify/core/render";
|
|
4
|
+
import { formatLabel } from "@gunkin/uiify/core/format-label";
|
|
4
5
|
import { FileUploadRoot, FileUploadRootClient } from "./FileUploadRoot.js";
|
|
5
6
|
import { FileUploadHiddenInput } from "./FileUploadInput.js";
|
|
6
7
|
import { useFileUploadContext } from "./file-upload-context.js";
|
|
@@ -35,7 +36,7 @@ function FileUploadTrigger(props) {
|
|
|
35
36
|
}
|
|
36
37
|
function FileUploadDropzone(props) {
|
|
37
38
|
const { as, render, className, children, ...consumerProps } = props;
|
|
38
|
-
const { disabled, processFiles } = useFileUploadContext("Dropzone");
|
|
39
|
+
const { disabled, labels, processFiles } = useFileUploadContext("Dropzone");
|
|
39
40
|
const { onDragOver: consumerOnDragOver, onDrop: consumerOnDrop } = consumerProps;
|
|
40
41
|
return useRenderElement({
|
|
41
42
|
as,
|
|
@@ -44,7 +45,7 @@ function FileUploadDropzone(props) {
|
|
|
44
45
|
...consumerProps,
|
|
45
46
|
role: "region",
|
|
46
47
|
"data-part": "dropzone",
|
|
47
|
-
"aria-label":
|
|
48
|
+
"aria-label": labels.dropzone,
|
|
48
49
|
"data-disabled": disabled ? "" : void 0,
|
|
49
50
|
onDragOver: composeEventHandlers(consumerOnDragOver, (event) => {
|
|
50
51
|
event.preventDefault();
|
|
@@ -104,14 +105,20 @@ function FileUploadItemRemove(props) {
|
|
|
104
105
|
children = "\xD7",
|
|
105
106
|
...consumerProps
|
|
106
107
|
} = props;
|
|
107
|
-
const {
|
|
108
|
+
const {
|
|
109
|
+
disabled: rootDisabled,
|
|
110
|
+
files,
|
|
111
|
+
labels,
|
|
112
|
+
removeAt,
|
|
113
|
+
removeLabel
|
|
114
|
+
} = useFileUploadContext("ItemRemove");
|
|
108
115
|
const disabled = rootDisabled || consumerDisabled;
|
|
109
116
|
return useRenderElement({
|
|
110
117
|
defaultTag: "button",
|
|
111
118
|
props: {
|
|
112
119
|
type: "button",
|
|
113
120
|
...consumerProps,
|
|
114
|
-
"aria-label": consumerProps["aria-label"] ?? "
|
|
121
|
+
"aria-label": consumerProps["aria-label"] ?? (removeLabel !== void 0 ? formatLabel(removeLabel, { name: files[index]?.name ?? "" }) : labels.removeFallback),
|
|
115
122
|
children,
|
|
116
123
|
"data-part": "remove",
|
|
117
124
|
disabled: disabled || void 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/file-upload/FileUpload.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ElementType, DragEvent, ReactElement, SyntheticEvent } from \"react\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { FileUploadRoot, FileUploadRootClient } from \"./FileUploadRoot.js\";\nimport { FileUploadHiddenInput } from \"./FileUploadInput.js\";\nimport { useFileUploadContext } from \"./file-upload-context.js\";\nimport type {\n FileUploadTriggerProps,\n FileUploadDropzoneProps,\n FileUploadListOwnProps,\n FileUploadItemProps,\n FileUploadItemRemoveOwnProps,\n} from \"./types.js\";\nexport { FileUploadRoot, FileUploadRootClient, FileUploadHiddenInput };\n\nexport function FileUploadTrigger<TAs extends ElementType = \"label\">(\n props: FileUploadTriggerProps<TAs>,\n): ReactElement | null {\n const { as, render, className, children, ...consumerProps } =\n props as FileUploadTriggerProps<ElementType>;\n const { disabled, inputId, openPicker } = useFileUploadContext(\"Trigger\");\n const tag = typeof as === \"string\" ? as : undefined;\n const { onClick: consumerOnClick } = consumerProps as {\n onClick?: (event: SyntheticEvent<HTMLElement>) => void;\n };\n const interactiveProps =\n tag === \"button\"\n ? {\n type: \"button\" as const,\n \"data-uiify-button\": \"\",\n \"aria-controls\": inputId,\n disabled: disabled || undefined,\n onClick: composeEventHandlers(consumerOnClick, openPicker),\n }\n : {\n htmlFor: inputId,\n \"aria-controls\": inputId,\n };\n\n return useRenderElement({\n as,\n defaultTag: \"label\",\n props: {\n ...consumerProps,\n ...interactiveProps,\n \"data-part\": \"trigger\",\n ...(className ? { className } : {}),\n children,\n },\n render,\n state: { disabled },\n });\n}\n\nexport function FileUploadDropzone<TAs extends ElementType = \"div\">(\n props: FileUploadDropzoneProps<TAs>,\n): ReactElement | null {\n const { as, render, className, children, ...consumerProps } =\n props as FileUploadDropzoneProps<\"div\">;\n const { disabled, processFiles } = useFileUploadContext(\"Dropzone\");\n const { onDragOver: consumerOnDragOver, onDrop: consumerOnDrop } = consumerProps as {\n onDragOver?: (event: DragEvent<HTMLElement>) => void;\n onDrop?: (event: DragEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n role: \"region\",\n \"data-part\": \"dropzone\",\n \"aria-label\":
|
|
1
|
+
{"version":3,"sources":["../../../src/components/file-upload/FileUpload.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ElementType, DragEvent, ReactElement, SyntheticEvent } from \"react\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { formatLabel } from \"@gunkin/uiify/core/format-label\";\nimport { FileUploadRoot, FileUploadRootClient } from \"./FileUploadRoot.js\";\nimport { FileUploadHiddenInput } from \"./FileUploadInput.js\";\nimport { useFileUploadContext } from \"./file-upload-context.js\";\nimport type {\n FileUploadTriggerProps,\n FileUploadDropzoneProps,\n FileUploadListOwnProps,\n FileUploadItemProps,\n FileUploadItemRemoveOwnProps,\n} from \"./types.js\";\nexport { FileUploadRoot, FileUploadRootClient, FileUploadHiddenInput };\n\nexport function FileUploadTrigger<TAs extends ElementType = \"label\">(\n props: FileUploadTriggerProps<TAs>,\n): ReactElement | null {\n const { as, render, className, children, ...consumerProps } =\n props as FileUploadTriggerProps<ElementType>;\n const { disabled, inputId, openPicker } = useFileUploadContext(\"Trigger\");\n const tag = typeof as === \"string\" ? as : undefined;\n const { onClick: consumerOnClick } = consumerProps as {\n onClick?: (event: SyntheticEvent<HTMLElement>) => void;\n };\n const interactiveProps =\n tag === \"button\"\n ? {\n type: \"button\" as const,\n \"data-uiify-button\": \"\",\n \"aria-controls\": inputId,\n disabled: disabled || undefined,\n onClick: composeEventHandlers(consumerOnClick, openPicker),\n }\n : {\n htmlFor: inputId,\n \"aria-controls\": inputId,\n };\n\n return useRenderElement({\n as,\n defaultTag: \"label\",\n props: {\n ...consumerProps,\n ...interactiveProps,\n \"data-part\": \"trigger\",\n ...(className ? { className } : {}),\n children,\n },\n render,\n state: { disabled },\n });\n}\n\nexport function FileUploadDropzone<TAs extends ElementType = \"div\">(\n props: FileUploadDropzoneProps<TAs>,\n): ReactElement | null {\n const { as, render, className, children, ...consumerProps } =\n props as FileUploadDropzoneProps<\"div\">;\n const { disabled, labels, processFiles } = useFileUploadContext(\"Dropzone\");\n const { onDragOver: consumerOnDragOver, onDrop: consumerOnDrop } = consumerProps as {\n onDragOver?: (event: DragEvent<HTMLElement>) => void;\n onDrop?: (event: DragEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n role: \"region\",\n \"data-part\": \"dropzone\",\n \"aria-label\": labels.dropzone,\n \"data-disabled\": disabled ? \"\" : undefined,\n onDragOver: composeEventHandlers(consumerOnDragOver, (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n }),\n onDrop: composeEventHandlers(consumerOnDrop, (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n if (disabled) return;\n processFiles(event.dataTransfer.files);\n }),\n ...(className ? { className } : {}),\n children,\n },\n render,\n state: { disabled },\n });\n}\n\nexport function FileUploadList(props: FileUploadListOwnProps): ReactElement | null {\n const { children, ...consumerProps } = props;\n const { files } = useFileUploadContext(\"List\");\n return useRenderElement({\n defaultTag: \"ul\",\n props: {\n ...consumerProps,\n role: \"list\",\n \"data-part\": \"list\",\n children: typeof children === \"function\" ? children(files) : children,\n },\n state: {},\n });\n}\n\nexport function FileUploadItem<TAs extends ElementType = \"li\">(\n props: FileUploadItemProps<TAs>,\n): ReactElement | null {\n const { as, render, children, className, index, ...consumerProps } =\n props as FileUploadItemProps<\"li\">;\n const { files } = useFileUploadContext(\"Item\");\n const file = files[index];\n\n const element = useRenderElement({\n as,\n defaultTag: \"li\",\n props: {\n ...consumerProps,\n role: \"listitem\",\n \"data-part\": \"item\",\n \"data-name\": file?.name,\n ...(className ? { className } : {}),\n children: children ?? file?.name,\n },\n render,\n state: { index },\n });\n\n if (!file) return null;\n return element;\n}\n\nexport function FileUploadItemRemove(props: FileUploadItemRemoveOwnProps): ReactElement | null {\n const {\n index,\n onClick,\n disabled: consumerDisabled = false,\n children = \"×\",\n ...consumerProps\n } = props;\n const {\n disabled: rootDisabled,\n files,\n labels,\n removeAt,\n removeLabel,\n } = useFileUploadContext(\"ItemRemove\");\n\n const disabled = rootDisabled || consumerDisabled;\n return useRenderElement({\n defaultTag: \"button\",\n props: {\n type: \"button\",\n ...consumerProps,\n \"aria-label\":\n consumerProps[\"aria-label\"] ??\n (removeLabel !== undefined\n ? formatLabel(removeLabel, { name: files[index]?.name ?? \"\" })\n : labels.removeFallback),\n children,\n \"data-part\": \"remove\",\n disabled: disabled || undefined,\n onClick: composeEventHandlers(onClick, () => {\n if (!disabled) removeAt(index);\n }),\n },\n state: { disabled },\n });\n}\n\nexport const FileUpload = {\n Dropzone: FileUploadDropzone,\n HiddenInput: FileUploadHiddenInput,\n Item: FileUploadItem,\n ItemRemove: FileUploadItemRemove,\n List: FileUploadList,\n Root: FileUploadRoot,\n Trigger: FileUploadTrigger,\n};\n"],"mappings":";AAGA,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB,4BAA4B;AACrD,SAAS,6BAA6B;AACtC,SAAS,4BAA4B;AAU9B,SAAS,kBACd,OACqB;AACrB,QAAM,EAAE,IAAI,QAAQ,WAAW,UAAU,GAAG,cAAc,IACxD;AACF,QAAM,EAAE,UAAU,SAAS,WAAW,IAAI,qBAAqB,SAAS;AACxE,QAAM,MAAM,OAAO,OAAO,WAAW,KAAK;AAC1C,QAAM,EAAE,SAAS,gBAAgB,IAAI;AAGrC,QAAM,mBACJ,QAAQ,WACJ;AAAA,IACE,MAAM;AAAA,IACN,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,UAAU,YAAY;AAAA,IACtB,SAAS,qBAAqB,iBAAiB,UAAU;AAAA,EAC3D,IACA;AAAA,IACE,SAAS;AAAA,IACT,iBAAiB;AAAA,EACnB;AAEN,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,aAAa;AAAA,MACb,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,IACA;AAAA,IACA,OAAO,EAAE,SAAS;AAAA,EACpB,CAAC;AACH;AAEO,SAAS,mBACd,OACqB;AACrB,QAAM,EAAE,IAAI,QAAQ,WAAW,UAAU,GAAG,cAAc,IACxD;AACF,QAAM,EAAE,UAAU,QAAQ,aAAa,IAAI,qBAAqB,UAAU;AAC1E,QAAM,EAAE,YAAY,oBAAoB,QAAQ,eAAe,IAAI;AAKnE,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc,OAAO;AAAA,MACrB,iBAAiB,WAAW,KAAK;AAAA,MACjC,YAAY,qBAAqB,oBAAoB,CAAC,UAAkC;AACtF,cAAM,eAAe;AAAA,MACvB,CAAC;AAAA,MACD,QAAQ,qBAAqB,gBAAgB,CAAC,UAAkC;AAC9E,cAAM,eAAe;AACrB,YAAI,SAAU;AACd,qBAAa,MAAM,aAAa,KAAK;AAAA,MACvC,CAAC;AAAA,MACD,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,IACA;AAAA,IACA,OAAO,EAAE,SAAS;AAAA,EACpB,CAAC;AACH;AAEO,SAAS,eAAe,OAAoD;AACjF,QAAM,EAAE,UAAU,GAAG,cAAc,IAAI;AACvC,QAAM,EAAE,MAAM,IAAI,qBAAqB,MAAM;AAC7C,SAAO,iBAAiB;AAAA,IACtB,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU,OAAO,aAAa,aAAa,SAAS,KAAK,IAAI;AAAA,IAC/D;AAAA,IACA,OAAO,CAAC;AAAA,EACV,CAAC;AACH;AAEO,SAAS,eACd,OACqB;AACrB,QAAM,EAAE,IAAI,QAAQ,UAAU,WAAW,OAAO,GAAG,cAAc,IAC/D;AACF,QAAM,EAAE,MAAM,IAAI,qBAAqB,MAAM;AAC7C,QAAM,OAAO,MAAM,KAAK;AAExB,QAAM,UAAU,iBAAiB;AAAA,IAC/B;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,UAAU,YAAY,MAAM;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,OAAO,EAAE,MAAM;AAAA,EACjB,CAAC;AAED,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO;AACT;AAEO,SAAS,qBAAqB,OAA0D;AAC7F,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,UAAU,mBAAmB;AAAA,IAC7B,WAAW;AAAA,IACX,GAAG;AAAA,EACL,IAAI;AACJ,QAAM;AAAA,IACJ,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,qBAAqB,YAAY;AAErC,QAAM,WAAW,gBAAgB;AACjC,SAAO,iBAAiB;AAAA,IACtB,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,GAAG;AAAA,MACH,cACE,cAAc,YAAY,MACzB,gBAAgB,SACb,YAAY,aAAa,EAAE,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,IAC3D,OAAO;AAAA,MACb;AAAA,MACA,aAAa;AAAA,MACb,UAAU,YAAY;AAAA,MACtB,SAAS,qBAAqB,SAAS,MAAM;AAC3C,YAAI,CAAC,SAAU,UAAS,KAAK;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACA,OAAO,EAAE,SAAS;AAAA,EACpB,CAAC;AACH;AAEO,MAAM,aAAa;AAAA,EACxB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AACX;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ReactElement } from "react";
|
|
2
2
|
import type { FileUploadRootProps } from "./types.js";
|
|
3
|
-
export declare function FileUploadRootClient({ accept, children, defaultValue, disabled, maxFiles, maxSize, minSize, multiple, onValueChange, onReject, value, ...consumerProps }: FileUploadRootProps): ReactElement;
|
|
3
|
+
export declare function FileUploadRootClient({ accept, children, defaultValue, disabled, maxFiles, maxSize, labels, minSize, multiple, onValueChange, onReject, value, ...consumerProps }: FileUploadRootProps): ReactElement;
|
|
4
4
|
export declare namespace FileUploadRootClient {
|
|
5
5
|
var displayName: string;
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUploadRoot.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/FileUploadRoot.tsx"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAIlD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"FileUploadRoot.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/FileUploadRoot.tsx"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAIlD,OAAO,KAAK,EAAoB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQxE,wBAAgB,oBAAoB,CAAC,EACnC,MAAW,EACX,QAAQ,EACR,YAAiB,EACjB,QAAgB,EAChB,QAAQ,EACR,OAAO,EACP,MAAM,EACN,OAAO,EACP,QAAgB,EAChB,aAAa,EACb,QAAQ,EACR,KAAK,EACL,GAAG,aAAa,EACjB,EAAE,mBAAmB,GAAG,YAAY,CAkDpC;yBAhEe,oBAAoB;;;AAkEpC,eAAO,MAAM,cAAc,6BAAuB,CAAC"}
|
|
@@ -4,6 +4,11 @@ import { useRef } from "react";
|
|
|
4
4
|
import { useControllableState, useId } from "@gunkin/uiify/hooks";
|
|
5
5
|
import { FileUploadProvider } from "./file-upload-context.js";
|
|
6
6
|
import { validateFiles } from "./file-upload-store.js";
|
|
7
|
+
const DEFAULT_FILE_UPLOAD_LABELS = {
|
|
8
|
+
dropzone: "Drop files here",
|
|
9
|
+
remove: "Remove {name}",
|
|
10
|
+
removeFallback: "Remove file"
|
|
11
|
+
};
|
|
7
12
|
function FileUploadRootClient({
|
|
8
13
|
accept = [],
|
|
9
14
|
children,
|
|
@@ -11,6 +16,7 @@ function FileUploadRootClient({
|
|
|
11
16
|
disabled = false,
|
|
12
17
|
maxFiles,
|
|
13
18
|
maxSize,
|
|
19
|
+
labels,
|
|
14
20
|
minSize,
|
|
15
21
|
multiple = false,
|
|
16
22
|
onValueChange,
|
|
@@ -18,6 +24,7 @@ function FileUploadRootClient({
|
|
|
18
24
|
value,
|
|
19
25
|
...consumerProps
|
|
20
26
|
}) {
|
|
27
|
+
const resolvedLabels = { ...DEFAULT_FILE_UPLOAD_LABELS, ...labels };
|
|
21
28
|
const inputId = useId();
|
|
22
29
|
const hiddenInputRef = useRef(null);
|
|
23
30
|
const [files, setFiles] = useControllableState({
|
|
@@ -44,6 +51,8 @@ function FileUploadRootClient({
|
|
|
44
51
|
accept,
|
|
45
52
|
disabled,
|
|
46
53
|
files,
|
|
54
|
+
labels: resolvedLabels,
|
|
55
|
+
...labels?.remove !== void 0 ? { removeLabel: labels.remove } : {},
|
|
47
56
|
hiddenInputRef,
|
|
48
57
|
inputId,
|
|
49
58
|
multiple,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/file-upload/FileUploadRoot.tsx"],"sourcesContent":["\"use client\";\nimport { useRef, type ReactElement } from \"react\";\nimport { useControllableState, useId } from \"@gunkin/uiify/hooks\";\nimport { FileUploadProvider } from \"./file-upload-context.js\";\nimport { validateFiles } from \"./file-upload-store.js\";\nimport type { FileUploadRootProps } from \"./types.js\";\n\nexport function FileUploadRootClient({\n accept = [],\n children,\n defaultValue = [],\n disabled = false,\n maxFiles,\n maxSize,\n minSize,\n multiple = false,\n onValueChange,\n onReject,\n value,\n ...consumerProps\n}: FileUploadRootProps): ReactElement {\n const inputId = useId();\n const hiddenInputRef = useRef<HTMLInputElement | null>(null);\n const [files, setFiles] = useControllableState<readonly File[]>({\n value,\n defaultValue,\n onChange: (next) => onValueChange?.([...next]),\n });\n const processFiles = (list: FileList | readonly File[]) => {\n if (disabled) return;\n const { accepted, rejected } = validateFiles(Array.from(list), {\n accept,\n multiple,\n ...(maxFiles === undefined\n ? {}\n : { maxFiles: multiple ? Math.max(0, maxFiles - files.length) : maxFiles }),\n ...(maxSize === undefined ? {} : { maxSize }),\n ...(minSize === undefined ? {} : { minSize }),\n });\n if (rejected.length) onReject?.(rejected);\n if (accepted.length) setFiles(multiple ? [...files, ...accepted] : accepted);\n };\n return (\n <div {...consumerProps} data-uiify-file-upload=\"\" data-disabled={disabled ? \"\" : undefined}>\n <FileUploadProvider\n value={{\n accept,\n disabled,\n files,\n hiddenInputRef,\n inputId,\n multiple,\n processFiles,\n reset: () => setFiles([]),\n openPicker: () => {\n if (!disabled) hiddenInputRef.current?.click();\n },\n removeAt: (index) => {\n if (!disabled && index >= 0 && index < files.length)\n setFiles(files.filter((_, i) => i !== index));\n },\n }}\n >\n {children}\n </FileUploadProvider>\n </div>\n );\n}\nFileUploadRootClient.displayName = \"FileUploadRootClient\";\nexport const FileUploadRoot = FileUploadRootClient;\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../../src/components/file-upload/FileUploadRoot.tsx"],"sourcesContent":["\"use client\";\nimport { useRef, type ReactElement } from \"react\";\nimport { useControllableState, useId } from \"@gunkin/uiify/hooks\";\nimport { FileUploadProvider } from \"./file-upload-context.js\";\nimport { validateFiles } from \"./file-upload-store.js\";\nimport type { FileUploadLabels, FileUploadRootProps } from \"./types.js\";\n\nconst DEFAULT_FILE_UPLOAD_LABELS: FileUploadLabels = {\n dropzone: \"Drop files here\",\n remove: \"Remove {name}\",\n removeFallback: \"Remove file\",\n};\n\nexport function FileUploadRootClient({\n accept = [],\n children,\n defaultValue = [],\n disabled = false,\n maxFiles,\n maxSize,\n labels,\n minSize,\n multiple = false,\n onValueChange,\n onReject,\n value,\n ...consumerProps\n}: FileUploadRootProps): ReactElement {\n const resolvedLabels = { ...DEFAULT_FILE_UPLOAD_LABELS, ...labels };\n const inputId = useId();\n const hiddenInputRef = useRef<HTMLInputElement | null>(null);\n const [files, setFiles] = useControllableState<readonly File[]>({\n value,\n defaultValue,\n onChange: (next) => onValueChange?.([...next]),\n });\n const processFiles = (list: FileList | readonly File[]) => {\n if (disabled) return;\n const { accepted, rejected } = validateFiles(Array.from(list), {\n accept,\n multiple,\n ...(maxFiles === undefined\n ? {}\n : { maxFiles: multiple ? Math.max(0, maxFiles - files.length) : maxFiles }),\n ...(maxSize === undefined ? {} : { maxSize }),\n ...(minSize === undefined ? {} : { minSize }),\n });\n if (rejected.length) onReject?.(rejected);\n if (accepted.length) setFiles(multiple ? [...files, ...accepted] : accepted);\n };\n return (\n <div {...consumerProps} data-uiify-file-upload=\"\" data-disabled={disabled ? \"\" : undefined}>\n <FileUploadProvider\n value={{\n accept,\n disabled,\n files,\n labels: resolvedLabels,\n ...(labels?.remove !== undefined ? { removeLabel: labels.remove } : {}),\n hiddenInputRef,\n inputId,\n multiple,\n processFiles,\n reset: () => setFiles([]),\n openPicker: () => {\n if (!disabled) hiddenInputRef.current?.click();\n },\n removeAt: (index) => {\n if (!disabled && index >= 0 && index < files.length)\n setFiles(files.filter((_, i) => i !== index));\n },\n }}\n >\n {children}\n </FileUploadProvider>\n </div>\n );\n}\nFileUploadRootClient.displayName = \"FileUploadRootClient\";\nexport const FileUploadRoot = FileUploadRootClient;\n"],"mappings":";AAoDM;AAnDN,SAAS,cAAiC;AAC1C,SAAS,sBAAsB,aAAa;AAC5C,SAAS,0BAA0B;AACnC,SAAS,qBAAqB;AAG9B,MAAM,6BAA+C;AAAA,EACnD,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,gBAAgB;AAClB;AAEO,SAAS,qBAAqB;AAAA,EACnC,SAAS,CAAC;AAAA,EACV;AAAA,EACA,eAAe,CAAC;AAAA,EAChB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsC;AACpC,QAAM,iBAAiB,EAAE,GAAG,4BAA4B,GAAG,OAAO;AAClE,QAAM,UAAU,MAAM;AACtB,QAAM,iBAAiB,OAAgC,IAAI;AAC3D,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAAsC;AAAA,IAC9D;AAAA,IACA;AAAA,IACA,UAAU,CAAC,SAAS,gBAAgB,CAAC,GAAG,IAAI,CAAC;AAAA,EAC/C,CAAC;AACD,QAAM,eAAe,CAAC,SAAqC;AACzD,QAAI,SAAU;AACd,UAAM,EAAE,UAAU,SAAS,IAAI,cAAc,MAAM,KAAK,IAAI,GAAG;AAAA,MAC7D;AAAA,MACA;AAAA,MACA,GAAI,aAAa,SACb,CAAC,IACD,EAAE,UAAU,WAAW,KAAK,IAAI,GAAG,WAAW,MAAM,MAAM,IAAI,SAAS;AAAA,MAC3E,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC3C,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,IAC7C,CAAC;AACD,QAAI,SAAS,OAAQ,YAAW,QAAQ;AACxC,QAAI,SAAS,OAAQ,UAAS,WAAW,CAAC,GAAG,OAAO,GAAG,QAAQ,IAAI,QAAQ;AAAA,EAC7E;AACA,SACE,oBAAC,SAAK,GAAG,eAAe,0BAAuB,IAAG,iBAAe,WAAW,KAAK,QAC/E;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,GAAI,QAAQ,WAAW,SAAY,EAAE,aAAa,OAAO,OAAO,IAAI,CAAC;AAAA,QACrE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,MAAM,SAAS,CAAC,CAAC;AAAA,QACxB,YAAY,MAAM;AAChB,cAAI,CAAC,SAAU,gBAAe,SAAS,MAAM;AAAA,QAC/C;AAAA,QACA,UAAU,CAAC,UAAU;AACnB,cAAI,CAAC,YAAY,SAAS,KAAK,QAAQ,MAAM;AAC3C,qBAAS,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH,GACF;AAEJ;AACA,qBAAqB,cAAc;AAC5B,MAAM,iBAAiB;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { FileUpload, FileUploadDropzone, FileUploadHiddenInput, FileUploadItem, FileUploadItemRemove, FileUploadList, FileUploadRoot, FileUploadTrigger, } from "./FileUpload.js";
|
|
2
|
-
export type { FileUploadDropzoneOwnProps, FileUploadDropzoneProps, FileUploadHiddenInputOwnProps, FileUploadListOwnProps, FileUploadItemRemoveOwnProps, FileUploadItemOwnProps, FileUploadItemProps, FileUploadRootOwnProps, FileUploadRootProps, FileUploadTriggerOwnProps, FileUploadTriggerProps, FileRejection, } from "./types.js";
|
|
2
|
+
export type { FileUploadDropzoneOwnProps, FileUploadDropzoneProps, FileUploadHiddenInputOwnProps, FileUploadLabels, FileUploadListOwnProps, FileUploadItemRemoveOwnProps, FileUploadItemOwnProps, FileUploadItemProps, FileUploadRootOwnProps, FileUploadRootProps, FileUploadTriggerOwnProps, FileUploadTriggerProps, FileRejection, } from "./types.js";
|
|
3
3
|
export type { FileUploadStore } from "./types.js";
|
|
4
4
|
export { validateFiles } from "./file-upload-store.js";
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,6BAA6B,EAC7B,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,6BAA6B,EAC7B,gBAAgB,EAChB,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/file-upload/index.ts"],"sourcesContent":["export {\n FileUpload,\n FileUploadDropzone,\n FileUploadHiddenInput,\n FileUploadItem,\n FileUploadItemRemove,\n FileUploadList,\n FileUploadRoot,\n FileUploadTrigger,\n} from \"./FileUpload.js\";\nexport type {\n FileUploadDropzoneOwnProps,\n FileUploadDropzoneProps,\n FileUploadHiddenInputOwnProps,\n FileUploadListOwnProps,\n FileUploadItemRemoveOwnProps,\n FileUploadItemOwnProps,\n FileUploadItemProps,\n FileUploadRootOwnProps,\n FileUploadRootProps,\n FileUploadTriggerOwnProps,\n FileUploadTriggerProps,\n FileRejection,\n} from \"./types.js\";\nexport type { FileUploadStore } from \"./types.js\";\nexport { validateFiles } from \"./file-upload-store.js\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;
|
|
1
|
+
{"version":3,"sources":["../../../src/components/file-upload/index.ts"],"sourcesContent":["export {\n FileUpload,\n FileUploadDropzone,\n FileUploadHiddenInput,\n FileUploadItem,\n FileUploadItemRemove,\n FileUploadList,\n FileUploadRoot,\n FileUploadTrigger,\n} from \"./FileUpload.js\";\nexport type {\n FileUploadDropzoneOwnProps,\n FileUploadDropzoneProps,\n FileUploadHiddenInputOwnProps,\n FileUploadLabels,\n FileUploadListOwnProps,\n FileUploadItemRemoveOwnProps,\n FileUploadItemOwnProps,\n FileUploadItemProps,\n FileUploadRootOwnProps,\n FileUploadRootProps,\n FileUploadTriggerOwnProps,\n FileUploadTriggerProps,\n FileRejection,\n} from \"./types.js\";\nexport type { FileUploadStore } from \"./types.js\";\nexport { validateFiles } from \"./file-upload-store.js\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAiBP,SAAS,qBAAqB;","names":[]}
|
|
@@ -4,6 +4,11 @@ export interface FileRejection {
|
|
|
4
4
|
readonly file: File;
|
|
5
5
|
readonly reason: "accept" | "max-size" | "max-files";
|
|
6
6
|
}
|
|
7
|
+
export interface FileUploadLabels {
|
|
8
|
+
readonly dropzone: string;
|
|
9
|
+
readonly remove: string;
|
|
10
|
+
readonly removeFallback: string;
|
|
11
|
+
}
|
|
7
12
|
export interface FileUploadStoreOptions {
|
|
8
13
|
readonly accept?: readonly string[];
|
|
9
14
|
readonly maxFiles?: number;
|
|
@@ -30,6 +35,8 @@ export interface FileUploadContextValue {
|
|
|
30
35
|
readonly removeAt: (index: number) => void;
|
|
31
36
|
readonly reset: () => void;
|
|
32
37
|
readonly files: readonly File[];
|
|
38
|
+
readonly labels: FileUploadLabels;
|
|
39
|
+
readonly removeLabel?: string;
|
|
33
40
|
}
|
|
34
41
|
export interface FileUploadRootOwnProps {
|
|
35
42
|
readonly className?: string;
|
|
@@ -38,6 +45,7 @@ export interface FileUploadRootOwnProps {
|
|
|
38
45
|
readonly disabled?: boolean;
|
|
39
46
|
readonly maxFiles?: number;
|
|
40
47
|
readonly maxSize?: number;
|
|
48
|
+
readonly labels?: Partial<FileUploadLabels>;
|
|
41
49
|
readonly minSize?: number;
|
|
42
50
|
readonly multiple?: boolean;
|
|
43
51
|
readonly onValueChange?: (files: File[]) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;CACtD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineChart.d.ts","sourceRoot":"","sources":["../../../src/components/line-chart/LineChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA+B,YAAY,EAAE,MAAM,OAAO,CAAC;AAepF,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAE1F,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,EAC7B,EAAE,EAAE,GAAG,EACP,KAAK,EACL,aAAa,EACb,KAAK,EACL,KAAK,EACL,GAAG,EACH,GAAG,EACH,WAAW,EACX,QAAQ,EACR,UAAU,EACV,OAAO,EACP,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,GACnB,EAAE,mBAAmB,GAAG,YAAY,CAmCpC;yBAlDe,cAAc;;;AAqD9B,wBAAgB,SAAS,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EAC1D,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,GACzB,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"LineChart.d.ts","sourceRoot":"","sources":["../../../src/components/line-chart/LineChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA+B,YAAY,EAAE,MAAM,OAAO,CAAC;AAepF,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAE1F,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,EAC7B,EAAE,EAAE,GAAG,EACP,KAAK,EACL,aAAa,EACb,KAAK,EACL,KAAK,EACL,GAAG,EACH,GAAG,EACH,WAAW,EACX,QAAQ,EACR,UAAU,EACV,OAAO,EACP,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,GACnB,EAAE,mBAAmB,GAAG,YAAY,CAmCpC;yBAlDe,cAAc;;;AAqD9B,wBAAgB,SAAS,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EAC1D,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,GACzB,YAAY,GAAG,IAAI,CAsJrB;yBAxJe,SAAS"}
|
|
@@ -74,6 +74,7 @@ function LineChart(props) {
|
|
|
74
74
|
activePointIndex,
|
|
75
75
|
cursorY,
|
|
76
76
|
interactive = false,
|
|
77
|
+
locale = "en-US",
|
|
77
78
|
onPointClick,
|
|
78
79
|
onPointPointerLeave,
|
|
79
80
|
onPointPointerMove,
|
|
@@ -86,8 +87,8 @@ function LineChart(props) {
|
|
|
86
87
|
} = props;
|
|
87
88
|
const { min, max } = getValueBounds(data);
|
|
88
89
|
const label = ariaLabel ?? "Line chart";
|
|
89
|
-
const timeLabels = axisLabelsFor(xAxis, monthLabelsFor(data));
|
|
90
|
-
const valueLabels = axisLabelsFor(yAxis, valueLabelsFor(min, max));
|
|
90
|
+
const timeLabels = axisLabelsFor(xAxis, monthLabelsFor(data, locale));
|
|
91
|
+
const valueLabels = axisLabelsFor(yAxis, valueLabelsFor(min, max, locale));
|
|
91
92
|
const readoutIndex = activePointIndex ?? selectedPointIndex ?? (data.length > 0 ? data.length - 1 : void 0);
|
|
92
93
|
const readoutPoint = readoutIndex === void 0 ? void 0 : data[readoutIndex];
|
|
93
94
|
const crosshairPoint = activePointIndex === void 0 ? void 0 : data[activePointIndex];
|