@yamada-ui/react 2.2.1-dev-20260428104908 → 2.2.1-dev-20260428111001
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/dist/cjs/components/menu/use-menu.cjs +25 -22
- package/dist/cjs/components/menu/use-menu.cjs.map +1 -1
- package/dist/cjs/components/native-accordion/use-native-accordion.cjs +9 -12
- package/dist/cjs/components/native-accordion/use-native-accordion.cjs.map +1 -1
- package/dist/esm/components/menu/use-menu.js +25 -22
- package/dist/esm/components/menu/use-menu.js.map +1 -1
- package/dist/esm/components/native-accordion/use-native-accordion.js +9 -12
- package/dist/esm/components/native-accordion/use-native-accordion.js.map +1 -1
- package/dist/types/components/accordion/accordion.d.ts +2 -2
- package/dist/types/components/accordion/use-accordion.d.ts +11 -11
- package/dist/types/components/action-bar/action-bar.d.ts +2 -2
- package/dist/types/components/airy/airy.d.ts +2 -2
- package/dist/types/components/alert/alert.d.ts +2 -2
- package/dist/types/components/alert/alert.style.d.ts +1 -1
- package/dist/types/components/alpha-slider/alpha-slider.d.ts +2 -2
- package/dist/types/components/aspect-ratio/aspect-ratio.d.ts +2 -2
- package/dist/types/components/autocomplete/autocomplete.d.ts +2 -2
- package/dist/types/components/autocomplete/autocomplete.style.d.ts +1 -1
- package/dist/types/components/autocomplete/use-autocomplete.d.ts +5 -5
- package/dist/types/components/avatar/avatar.d.ts +5 -5
- package/dist/types/components/avatar/use-avatar-group.d.ts +2 -2
- package/dist/types/components/badge/badge.d.ts +2 -2
- package/dist/types/components/bleed/bleed.d.ts +2 -2
- package/dist/types/components/blockquote/blockquote.d.ts +2 -2
- package/dist/types/components/breadcrumb/breadcrumb.d.ts +2 -2
- package/dist/types/components/breadcrumb/use-breadcrumb.d.ts +2 -2
- package/dist/types/components/button/button.d.ts +2 -2
- package/dist/types/components/button/icon-button.d.ts +2 -2
- package/dist/types/components/calendar/calendar.d.ts +2 -2
- package/dist/types/components/calendar/calendar.style.d.ts +2 -2
- package/dist/types/components/calendar/use-calendar.d.ts +8 -8
- package/dist/types/components/card/card.d.ts +2 -2
- package/dist/types/components/carousel/carousel.d.ts +2 -2
- package/dist/types/components/carousel/carousel.style.d.ts +2 -2
- package/dist/types/components/carousel/use-carousel.d.ts +3 -3
- package/dist/types/components/center/center.d.ts +2 -2
- package/dist/types/components/chart/area-chart.d.ts +2 -2
- package/dist/types/components/chart/bar-chart.d.ts +2 -2
- package/dist/types/components/chart/cartesian-chart.style.d.ts +1 -1
- package/dist/types/components/chart/chart.d.ts +5 -5
- package/dist/types/components/chart/composed-chart.d.ts +2 -2
- package/dist/types/components/chart/donut-chart.d.ts +2 -2
- package/dist/types/components/chart/line-chart.d.ts +2 -2
- package/dist/types/components/chart/pie-chart.d.ts +2 -2
- package/dist/types/components/chart/polar-chart.style.d.ts +1 -1
- package/dist/types/components/chart/radar-chart.d.ts +2 -2
- package/dist/types/components/chart/radial-chart.d.ts +2 -2
- package/dist/types/components/chart/use-chart.d.ts +2 -2
- package/dist/types/components/checkbox/checkbox.d.ts +5 -5
- package/dist/types/components/checkbox/checkbox.style.d.ts +1 -1
- package/dist/types/components/checkbox/use-checkbox-group.d.ts +2 -2
- package/dist/types/components/checkbox-card/checkbox-card.d.ts +5 -5
- package/dist/types/components/checkbox-card/checkbox-card.style.d.ts +1 -1
- package/dist/types/components/circle-progress/circle-progress.d.ts +2 -2
- package/dist/types/components/close-button/close-button.d.ts +2 -2
- package/dist/types/components/code/code.d.ts +2 -2
- package/dist/types/components/collapse/collapse.d.ts +2 -2
- package/dist/types/components/color-picker/color-picker.d.ts +2 -2
- package/dist/types/components/color-picker/color-picker.style.d.ts +1 -1
- package/dist/types/components/color-picker/use-color-picker.d.ts +2 -2
- package/dist/types/components/color-selector/color-selector.d.ts +2 -2
- package/dist/types/components/color-selector/color-selector.style.d.ts +2 -2
- package/dist/types/components/color-selector/use-color-selector.d.ts +3 -3
- package/dist/types/components/color-swatch/color-swatch.d.ts +2 -2
- package/dist/types/components/container/container.d.ts +2 -2
- package/dist/types/components/data-list/data-list.d.ts +2 -2
- package/dist/types/components/data-list/data-list.style.d.ts +1 -1
- package/dist/types/components/date-picker/date-picker.d.ts +2 -2
- package/dist/types/components/date-picker/date-picker.style.d.ts +1 -1
- package/dist/types/components/date-picker/use-date-picker.d.ts +4 -4
- package/dist/types/components/drawer/drawer.d.ts +2 -2
- package/dist/types/components/drawer/drawer.style.d.ts +2 -2
- package/dist/types/components/dropzone/dropzone.d.ts +3 -3
- package/dist/types/components/dropzone/dropzone.style.d.ts +1 -1
- package/dist/types/components/editable/editable.d.ts +2 -2
- package/dist/types/components/editable/use-editable.d.ts +2 -2
- package/dist/types/components/em/em.d.ts +2 -2
- package/dist/types/components/empty-state/empty-state.d.ts +2 -2
- package/dist/types/components/empty-state/empty-state.style.d.ts +2 -2
- package/dist/types/components/fade/fade.d.ts +2 -2
- package/dist/types/components/field/field.d.ts +3 -3
- package/dist/types/components/field/use-field-props.d.ts +4 -4
- package/dist/types/components/fieldset/fieldset.d.ts +3 -3
- package/dist/types/components/file-button/file-button.d.ts +2 -2
- package/dist/types/components/file-button/use-file-button.d.ts +18 -18
- package/dist/types/components/file-input/file-input.d.ts +2 -2
- package/dist/types/components/file-input/file-input.style.d.ts +1 -1
- package/dist/types/components/file-input/use-file-input.d.ts +15 -15
- package/dist/types/components/flex/flex.d.ts +2 -2
- package/dist/types/components/flip/flip.d.ts +2 -2
- package/dist/types/components/float/float.d.ts +2 -2
- package/dist/types/components/form/form.d.ts +3 -3
- package/dist/types/components/form/form.style.d.ts +1 -1
- package/dist/types/components/format/format-byte.d.ts +4 -4
- package/dist/types/components/format/format-date-time.d.ts +4 -4
- package/dist/types/components/format/format-number.d.ts +2 -2
- package/dist/types/components/grid/grid-item.d.ts +2 -2
- package/dist/types/components/grid/grid.d.ts +2 -2
- package/dist/types/components/group/group.d.ts +2 -2
- package/dist/types/components/group/use-group.d.ts +2 -2
- package/dist/types/components/heading/heading.d.ts +2 -2
- package/dist/types/components/hue-slider/hue-slider.d.ts +3 -3
- package/dist/types/components/icon/icon.d.ts +5 -5
- package/dist/types/components/image/image.d.ts +2 -2
- package/dist/types/components/indicator/indicator.d.ts +4 -4
- package/dist/types/components/infinite-scroll-area/infinite-scroll-area.d.ts +2 -2
- package/dist/types/components/input/input-addon.d.ts +2 -2
- package/dist/types/components/input/input-element.d.ts +2 -2
- package/dist/types/components/input/input.d.ts +2 -2
- package/dist/types/components/kbd/kbd.d.ts +2 -2
- package/dist/types/components/link/link.d.ts +2 -2
- package/dist/types/components/link-box/link-box.d.ts +2 -2
- package/dist/types/components/list/list.d.ts +2 -2
- package/dist/types/components/loading/loading-provider.d.ts +2 -2
- package/dist/types/components/loading/loading.d.ts +3 -3
- package/dist/types/components/mark/mark.d.ts +2 -2
- package/dist/types/components/menu/menu.d.ts +2 -2
- package/dist/types/components/menu/use-menu.d.ts +11 -11
- package/dist/types/components/modal/modal.d.ts +2 -2
- package/dist/types/components/modal/modal.style.d.ts +2 -2
- package/dist/types/components/native-accordion/native-accordion.d.ts +2 -2
- package/dist/types/components/native-accordion/use-native-accordion.d.ts +2 -2
- package/dist/types/components/native-popover/native-popover.d.ts +2 -2
- package/dist/types/components/native-select/native-select.d.ts +2 -2
- package/dist/types/components/native-select/native-select.style.d.ts +1 -1
- package/dist/types/components/native-table/native-table.d.ts +4 -4
- package/dist/types/components/notice/notice.style.d.ts +1 -1
- package/dist/types/components/number-input/number-input.d.ts +2 -2
- package/dist/types/components/number-input/number-input.style.d.ts +1 -1
- package/dist/types/components/pagination/pagination.d.ts +2 -2
- package/dist/types/components/pagination/use-pagination.d.ts +2 -2
- package/dist/types/components/password-input/password-input.d.ts +2 -2
- package/dist/types/components/password-input/password-input.style.d.ts +1 -1
- package/dist/types/components/password-input/strength-meter.d.ts +2 -2
- package/dist/types/components/password-input/strength-meter.style.d.ts +1 -1
- package/dist/types/components/password-input/use-password-input.d.ts +2 -2
- package/dist/types/components/pin-input/pin-input.d.ts +2 -2
- package/dist/types/components/pin-input/pin-input.style.d.ts +1 -1
- package/dist/types/components/pin-input/use-pin-input.d.ts +7 -7
- package/dist/types/components/popover/popover.d.ts +2 -2
- package/dist/types/components/progress/progress.d.ts +4 -4
- package/dist/types/components/progress/use-progress.d.ts +706 -706
- package/dist/types/components/qr-code/qr-code.d.ts +2 -2
- package/dist/types/components/radio/radio.d.ts +5 -5
- package/dist/types/components/radio/radio.style.d.ts +1 -1
- package/dist/types/components/radio/use-radio-group.d.ts +2 -2
- package/dist/types/components/radio-card/radio-card.d.ts +5 -5
- package/dist/types/components/radio-card/radio-card.style.d.ts +1 -1
- package/dist/types/components/rating/use-rating.d.ts +7 -7
- package/dist/types/components/reorder/reorder.d.ts +2 -2
- package/dist/types/components/reorder/reorder.style.d.ts +1 -1
- package/dist/types/components/reorder/use-reorder.d.ts +3 -3
- package/dist/types/components/resizable/resizable.d.ts +2 -2
- package/dist/types/components/resizable/resizable.style.d.ts +2 -2
- package/dist/types/components/resizable/use-resizable.d.ts +2 -2
- package/dist/types/components/ripple/ripple.d.ts +2 -2
- package/dist/types/components/ripple/use-ripple.d.ts +2 -2
- package/dist/types/components/rotate/rotate.d.ts +2 -2
- package/dist/types/components/saturation-slider/saturation-slider.d.ts +2 -2
- package/dist/types/components/saturation-slider/use-saturation-slider.d.ts +2 -2
- package/dist/types/components/scroll-area/scroll-area.d.ts +2 -2
- package/dist/types/components/segmented-control/segmented-control.d.ts +2 -2
- package/dist/types/components/segmented-control/segmented-control.style.d.ts +2 -2
- package/dist/types/components/segmented-control/use-segmented-control.d.ts +9 -9
- package/dist/types/components/select/select.d.ts +2 -2
- package/dist/types/components/select/select.style.d.ts +1 -1
- package/dist/types/components/select/use-select.d.ts +4 -4
- package/dist/types/components/separator/separator.d.ts +2 -2
- package/dist/types/components/sidebar/sidebar.d.ts +2 -2
- package/dist/types/components/sidebar/use-sidebar.d.ts +9 -9
- package/dist/types/components/simple-grid/simple-grid.d.ts +2 -2
- package/dist/types/components/skeleton/skeleton.d.ts +2 -2
- package/dist/types/components/slide/slide.d.ts +2 -2
- package/dist/types/components/slide-fade/slide-fade.d.ts +2 -2
- package/dist/types/components/slider/slider.d.ts +2 -2
- package/dist/types/components/slider/use-slider.d.ts +2 -2
- package/dist/types/components/stack/h-stack.d.ts +2 -2
- package/dist/types/components/stack/stack.d.ts +2 -2
- package/dist/types/components/stack/v-stack.d.ts +2 -2
- package/dist/types/components/stack/z-stack.d.ts +2 -2
- package/dist/types/components/stat/stat.d.ts +2 -2
- package/dist/types/components/stat/stat.style.d.ts +2 -2
- package/dist/types/components/status/status.d.ts +2 -2
- package/dist/types/components/status/status.style.d.ts +2 -2
- package/dist/types/components/steps/steps.d.ts +2 -2
- package/dist/types/components/steps/steps.style.d.ts +1 -1
- package/dist/types/components/steps/use-steps.d.ts +10 -10
- package/dist/types/components/switch/switch.d.ts +2 -2
- package/dist/types/components/table/table.d.ts +2 -2
- package/dist/types/components/tabs/tabs.d.ts +2 -2
- package/dist/types/components/tabs/use-tabs.d.ts +16 -16
- package/dist/types/components/tag/tag.d.ts +2 -2
- package/dist/types/components/tag/tag.style.d.ts +1 -1
- package/dist/types/components/text/text.d.ts +2 -2
- package/dist/types/components/textarea/textarea.d.ts +2 -2
- package/dist/types/components/textarea/use-autosize.d.ts +2 -2
- package/dist/types/components/timeline/timeline.d.ts +5 -5
- package/dist/types/components/timeline/timeline.style.d.ts +1 -1
- package/dist/types/components/toggle/toggle.d.ts +5 -5
- package/dist/types/components/toggle/use-toggle-group.d.ts +2 -2
- package/dist/types/components/toggle/use-toggle.d.ts +2 -2
- package/dist/types/components/tooltip/tooltip.d.ts +2 -2
- package/dist/types/components/tree/tree.d.ts +2 -2
- package/dist/types/components/tree/tree.style.d.ts +1 -1
- package/dist/types/components/tree/use-tree.d.ts +183 -183
- package/dist/types/components/visually-hidden/visually-hidden.d.ts +2 -2
- package/dist/types/components/wrap/wrap.d.ts +2 -2
- package/dist/types/core/components/create-component.d.ts +8 -7
- package/dist/types/core/components/use-component-style.d.ts +1 -0
- package/dist/types/core/components/utils.d.ts +1 -0
- package/dist/types/core/constant.d.ts +1 -0
- package/dist/types/core/css/calc.d.ts +1 -0
- package/dist/types/core/css/config.d.ts +1 -0
- package/dist/types/core/css/css.d.ts +1 -0
- package/dist/types/core/css/index.types.d.ts +1 -0
- package/dist/types/core/css/styles.d.ts +1 -0
- package/dist/types/core/css/token.d.ts +1 -0
- package/dist/types/core/css/use-css.d.ts +1 -0
- package/dist/types/core/css/utils.d.ts +1 -0
- package/dist/types/core/generated-theme-tokens.types.d.ts +1 -0
- package/dist/types/core/index.d.ts +1 -0
- package/dist/types/core/system/color-mode-provider.d.ts +2 -2
- package/dist/types/core/system/storage-script.d.ts +3 -3
- package/dist/types/core/system/styled.d.ts +2 -2
- package/dist/types/core/system/system-provider.d.ts +2 -2
- package/dist/types/core/system/var.d.ts +1 -0
- package/dist/types/hooks/use-breakpoint/use-breakpoint-state.d.ts +2 -2
- package/dist/types/hooks/use-clickable/index.d.ts +7 -7
- package/dist/types/hooks/use-clipboard/index.d.ts +2 -2
- package/dist/types/hooks/use-combobox/index.d.ts +12 -12
- package/dist/types/hooks/use-counter/index.d.ts +2 -2
- package/dist/types/hooks/use-descendants/index.d.ts +2 -2
- package/dist/types/hooks/use-field-sizing/index.d.ts +2 -2
- package/dist/types/hooks/use-hover/index.d.ts +2 -2
- package/dist/types/providers/i18n-provider/i18n-provider.d.ts +3 -3
- package/dist/types/utils/children.d.ts +2 -2
- package/package.json +2 -2
|
@@ -6,6 +6,8 @@ const require_dom = require('../../utils/dom.cjs');
|
|
|
6
6
|
const require_effect = require('../../utils/effect.cjs');
|
|
7
7
|
const require_ref = require('../../utils/ref.cjs');
|
|
8
8
|
const require_utils_index = require('../../utils/index.cjs');
|
|
9
|
+
const require_props = require('../../core/components/props.cjs');
|
|
10
|
+
require('../../core/index.cjs');
|
|
9
11
|
const require_hooks_use_controllable_state_index = require('../../hooks/use-controllable-state/index.cjs');
|
|
10
12
|
const require_hooks_use_descendants_index = require('../../hooks/use-descendants/index.cjs');
|
|
11
13
|
const require_use_disclosure = require('../../hooks/use-disclosure/use-disclosure.cjs');
|
|
@@ -306,12 +308,10 @@ const useSubMenu = ({ descendants, disabled = false, open, subMenuDirection = "e
|
|
|
306
308
|
const useMenuGroup = ({ "aria-labelledby": ariaLabelledbyProp, ...rest }) => {
|
|
307
309
|
const labelId = (0, react.useId)();
|
|
308
310
|
return {
|
|
309
|
-
getGroupProps: (0, react.useCallback)(({ "aria-labelledby": ariaLabelledby, ...props } = {}) => ({
|
|
311
|
+
getGroupProps: (0, react.useCallback)(({ "aria-labelledby": ariaLabelledby, ...props } = {}) => require_props.mergeProps({
|
|
310
312
|
"aria-labelledby": (0, require_utils_index.utils_exports.cx)(ariaLabelledbyProp, ariaLabelledby, labelId),
|
|
311
|
-
role: "group"
|
|
312
|
-
|
|
313
|
-
...props
|
|
314
|
-
}), [
|
|
313
|
+
role: "group"
|
|
314
|
+
}, rest, props)(), [
|
|
315
315
|
ariaLabelledbyProp,
|
|
316
316
|
labelId,
|
|
317
317
|
rest
|
|
@@ -376,23 +376,26 @@ const useMenuItem = ({ id, "aria-disabled": ariaDisabled, "data-disabled": dataD
|
|
|
376
376
|
]);
|
|
377
377
|
return {
|
|
378
378
|
subMenuTrigger,
|
|
379
|
-
getItemProps: (0, react.useCallback)(({ ref, ...props } = {}) =>
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
379
|
+
getItemProps: (0, react.useCallback)(({ ref, ...props } = {}) => {
|
|
380
|
+
const { onClick: restOnClick, onFocus: restOnFocus, onKeyDown: restOnKeyDown, onMouseMove: restOnMouseMove, ...restProps } = rest;
|
|
381
|
+
const { onClick: propsOnClick, onFocus: propsOnFocus, onKeyDown: propsOnKeyDown, onMouseMove: propsOnMouseMove, ...itemProps } = props;
|
|
382
|
+
return require_props.mergeProps({
|
|
383
|
+
id,
|
|
384
|
+
"aria-disabled": ariaDisabled ?? (0, require_utils_index.utils_exports.ariaAttr)(disabled),
|
|
385
|
+
"data-disabled": dataDisabled ?? (0, require_utils_index.utils_exports.dataAttr)(disabled),
|
|
386
|
+
role: "menuitem",
|
|
387
|
+
tabIndex: -1
|
|
388
|
+
}, restProps, itemProps, {
|
|
389
|
+
ref: require_ref.mergeRefs(ref, itemRef, register),
|
|
390
|
+
onClick: (0, require_utils_index.utils_exports.handlerAll)(propsOnClick, restOnClick, () => onSelect(value, closeOnSelect)),
|
|
391
|
+
onFocus: (0, require_utils_index.utils_exports.handlerAll)(propsOnFocus, restOnFocus, onActive),
|
|
392
|
+
onKeyDown: (0, require_utils_index.utils_exports.handlerAll)(propsOnKeyDown, restOnKeyDown, onKeyDown),
|
|
393
|
+
onMouseMove: (0, require_utils_index.utils_exports.handlerAll)(propsOnMouseMove, restOnMouseMove, () => {
|
|
394
|
+
onCloseSubMenu();
|
|
395
|
+
onActive();
|
|
396
|
+
})
|
|
397
|
+
})();
|
|
398
|
+
}, [
|
|
396
399
|
id,
|
|
397
400
|
ariaDisabled,
|
|
398
401
|
disabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-menu.cjs","names":["createDescendants","createContext","useDisclosure","getTriggerProps: PropGetter","getContextTriggerProps: PropGetter","getContentProps: PropGetter","mergeRefs","getSeparatorProps: PropGetter","useControllableState","value"],"sources":["../../../../src/components/menu/use-menu.ts"],"sourcesContent":["\"use client\"\n\nimport type { KeyboardEvent, MouseEvent, RefObject } from \"react\"\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport type { Descendant, Descendants } from \"../../hooks/use-descendants\"\nimport type { UseDisclosureProps } from \"../../hooks/use-disclosure\"\nimport { useCallback, useId, useRef } from \"react\"\nimport { useControllableState } from \"../../hooks/use-controllable-state\"\nimport { createDescendants } from \"../../hooks/use-descendants\"\nimport { useDisclosure } from \"../../hooks/use-disclosure\"\nimport {\n ariaAttr,\n assignRef,\n createContext,\n cx,\n dataAttr,\n handlerAll,\n isArray,\n isString,\n isTruthyDataAttr,\n mergeRefs,\n noop,\n runKeyAction,\n useUpdateEffect,\n} from \"../../utils\"\n\ntype SubMenuDirection = \"end\" | \"start\"\n\ninterface MenuDescendantProps {\n id: string\n}\ntype MenuDescendant = Descendant<HTMLDivElement, MenuDescendantProps>\n\nconst {\n DescendantsContext: MenuDescendantsContext,\n useDescendant: useMenuDescendant,\n useDescendantRegister: useMenuDescendantRegister,\n useDescendants: useMenuDescendants,\n} = createDescendants<HTMLDivElement, MenuDescendantProps>()\n\nexport { MenuDescendantsContext, useMenuDescendant, useMenuDescendants }\n\ninterface MenuContext extends Pick<\n UseMenuReturn,\n | \"onActiveDescendant\"\n | \"onClose\"\n | \"onCloseSubMenu\"\n | \"onOpen\"\n | \"onSelect\"\n | \"subMenu\"\n | \"subMenuDirection\"\n> {}\n\nconst [MenuContext, useMenuContext] = createContext<MenuContext>({\n name: \"MenuContext\",\n})\n\ninterface MenuGroupContext extends Pick<UseMenuGroupReturn, \"getLabelProps\"> {}\n\nconst [MenuGroupContext, useMenuGroupContext] = createContext<MenuGroupContext>(\n {\n name: \"MenuGroupContext\",\n },\n)\n\ninterface MainMenuContext {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n onCloseRef: RefObject<() => void>\n onSelect: (value?: string, closeOnSelect?: boolean) => void\n closeOnSelect?: boolean\n}\n\nconst [MainMenuContext, useMainMenuContext] = createContext<MainMenuContext>({\n name: \"MainMenuContext\",\n strict: false,\n})\n\ninterface MenuOptionGroupContext {\n type: \"checkbox\" | \"radio\"\n value: string | string[]\n onChange?: (value: string) => void\n}\n\nconst [MenuOptionGroupContext, useMenuOptionGroupContext] =\n createContext<MenuOptionGroupContext>({\n name: \"MenuOptionGroupContext\",\n })\n\nexport {\n MainMenuContext,\n MenuContext,\n MenuGroupContext,\n MenuOptionGroupContext,\n useMainMenuContext,\n useMenuContext,\n useMenuGroupContext,\n useMenuOptionGroupContext,\n}\n\nexport interface UseMenuProps extends Omit<UseDisclosureProps, \"timing\"> {\n /**\n * If `true`, the menu item will be closed when selected.\n *\n * @default true\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The direction of the sub menu.\n *\n * @default 'end'\n */\n subMenuDirection?: SubMenuDirection\n /**\n * Callback invoked when a menu item is selected.\n */\n onSelect?: (value?: string) => void\n}\n\nexport const useMenu = ({\n closeOnSelect,\n defaultOpen,\n disabled = false,\n open: openProp,\n subMenuDirection = \"end\",\n onClose: onCloseProp,\n onOpen: onOpenProp,\n onSelect: onSelectProp,\n}: UseMenuProps = {}) => {\n const triggerId = useId()\n const contentId = useId()\n const descendants = useMenuDescendants()\n const updateRef = useRef<() => void>(noop)\n const onCloseRef = useRef<() => void>(noop)\n const contentRef = useRef<HTMLDivElement>(null)\n const { open, onClose, onOpen } = useDisclosure({\n defaultOpen,\n open: openProp,\n onClose: onCloseProp,\n onOpen: onOpenProp,\n })\n const onCloseSubMenu = useCallback(() => onCloseRef.current(), [])\n const onActiveDescendant = useCallback(\n (\n descendant?: MenuDescendant,\n options: FocusOptions = { preventScroll: true },\n ) => {\n if (!contentRef.current || !descendant || disabled) return\n\n contentRef.current.setAttribute(\"aria-activedescendant\", descendant.id)\n\n descendants.active(descendant, options)\n },\n [descendants, disabled],\n )\n const { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect } =\n useSubMenu({\n descendants,\n disabled,\n open,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onOpen,\n })\n\n closeOnSelect ??= mainCloseOnSelect ?? true\n\n const onSelect = useCallback(\n (value?: string, closeOnSelectProp = closeOnSelect) => {\n if (disabled) return\n\n onSelectProp?.(value)\n onMainSelect?.(value, closeOnSelectProp)\n\n if (!closeOnSelectProp) return\n\n onClose()\n },\n [closeOnSelect, disabled, onClose, onMainSelect, onSelectProp],\n )\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n\n if (!open) {\n onOpen()\n } else {\n onClose()\n }\n },\n [disabled, onClose, onOpen, open],\n )\n\n const onContextMenu = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n onOpen()\n updateRef.current()\n },\n [disabled, onOpen],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n\n runKeyAction(ev, {\n ArrowDown: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n ArrowUp: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n })\n },\n Enter: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n Space: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n })\n },\n [descendants, disabled, onActiveDescendant, onOpen],\n )\n\n const getTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n ...getSubMenuProps({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"button\",\n tabIndex: disabled ? -1 : 0,\n ...props,\n onClick: handlerAll(props.onClick, onClick),\n onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n }),\n }),\n [contentId, disabled, getSubMenuProps, onClick, onKeyDown, open, triggerId],\n )\n\n const getContextTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"application\",\n ...props,\n onContextMenu: handlerAll(props.onContextMenu, onContextMenu),\n }),\n [contentId, disabled, onContextMenu, open, triggerId],\n )\n\n const getContentProps: PropGetter = useCallback(\n ({ ref, \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n id: contentId,\n \"aria-labelledby\": cx(ariaLabelledby, triggerId),\n role: \"menu\",\n ...props,\n ref: mergeRefs(ref, contentRef),\n }),\n [contentId, triggerId],\n )\n\n const getSeparatorProps: PropGetter = useCallback(\n (props) => ({ role: \"separator\", ...props }),\n [],\n )\n\n return {\n closeOnSelect,\n descendants,\n open,\n subMenu,\n subMenuDirection,\n updateRef,\n getContentProps,\n getContextTriggerProps,\n getSeparatorProps,\n getTriggerProps,\n onActiveDescendant,\n onClose,\n onCloseRef,\n onCloseSubMenu,\n onOpen,\n onSelect,\n }\n}\n\nexport type UseMenuReturn = ReturnType<typeof useMenu>\n\nexport interface UseSubMenuProps extends Omit<\n Required<UseDisclosureProps>,\n \"defaultOpen\" | \"timing\"\n> {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n disabled?: boolean\n subMenuDirection?: SubMenuDirection\n}\n\nexport const useSubMenu = ({\n descendants,\n disabled = false,\n open,\n subMenuDirection = \"end\",\n onActiveDescendant,\n onClose,\n onOpen,\n}: UseSubMenuProps) => {\n const uuid = useId()\n const {\n closeOnSelect: mainCloseOnSelect,\n descendants: mainDescendants,\n onActiveDescendant: onActiveMainDescendant,\n onCloseRef,\n onSelect: onMainSelect,\n } = useMainMenuContext() ?? {}\n const subMenu = !!mainDescendants && !!onActiveMainDescendant\n const createRegister = useMenuDescendantRegister(mainDescendants)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const dataDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const dataDisabled = isTruthyDataAttr(node.getAttribute(\"data-disabled\"))\n\n return dataDisabled\n }, [])\n\n const ariaDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const ariaDisabled = isTruthyDataAttr(node.getAttribute(\"aria-disabled\"))\n\n return ariaDisabled\n }, [])\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu) return\n\n ev.defaultPrevented = disabled || dataDisabled() || ariaDisabled()\n },\n [ariaDisabled, dataDisabled, disabled, subMenu],\n )\n\n const onMouseEnter = useCallback(() => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n onOpen()\n }, [ariaDisabled, dataDisabled, disabled, onOpen, subMenu])\n\n const onMouseMove = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n const descendant = descendants.value(triggerRef.current)\n\n onActiveMainDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [\n ariaDisabled,\n dataDisabled,\n descendants,\n disabled,\n onActiveMainDescendant,\n subMenu,\n ],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (!subMenu || disabled) return\n\n const currentDescendant = open ? descendants : mainDescendants\n const onActiveCurrentDescendant = open\n ? onActiveDescendant\n : onActiveMainDescendant\n\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = currentDescendant.enabledNextValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n ArrowUp: () => {\n const descendant = currentDescendant.enabledPrevValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n End: () => {\n const descendant = currentDescendant.enabledLastValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n Home: () => {\n const descendant = currentDescendant.enabledFirstValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [subMenuDirection === \"end\" ? \"ArrowRight\" : \"ArrowLeft\"]: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n\n ev.defaultPrevented = true\n },\n })\n },\n [\n subMenu,\n disabled,\n open,\n descendants,\n mainDescendants,\n onActiveDescendant,\n onActiveMainDescendant,\n subMenuDirection,\n onOpen,\n ],\n )\n\n assignRef(onCloseRef, onClose)\n\n const getSubMenuProps: PropGetter = useCallback(\n ({ id = uuid, ref, ...props } = {}) => {\n const getDisabled = (node: HTMLDivElement) =>\n disabled || dataDisabled(node) || ariaDisabled(node)\n const register = createRegister({ id, disabled: getDisabled })\n\n return {\n role: subMenu ? \"menuitem\" : \"button\",\n ...props,\n ref: mergeRefs(ref, triggerRef, register),\n onClick: handlerAll(onClick, props.onClick),\n onKeyDown: handlerAll(onKeyDown, props.onKeyDown),\n onMouseEnter: handlerAll(onMouseEnter, props.onMouseEnter),\n onMouseMove: handlerAll(onMouseMove, props.onMouseMove),\n }\n },\n [\n uuid,\n subMenu,\n createRegister,\n onClick,\n onKeyDown,\n onMouseEnter,\n onMouseMove,\n disabled,\n dataDisabled,\n ariaDisabled,\n ],\n )\n\n return { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect }\n}\n\nexport type UseSubMenuReturn = ReturnType<typeof useSubMenu>\n\nexport interface UseMenuGroupProps extends HTMLProps {}\n\nexport const useMenuGroup = ({\n \"aria-labelledby\": ariaLabelledbyProp,\n ...rest\n}: UseMenuGroupProps) => {\n const labelId = useId()\n\n const getGroupProps: PropGetter = useCallback(\n ({ \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n \"aria-labelledby\": cx(ariaLabelledbyProp, ariaLabelledby, labelId),\n role: \"group\",\n ...rest,\n ...props,\n }),\n [ariaLabelledbyProp, labelId, rest],\n )\n\n const getLabelProps: PropGetter<\"span\"> = useCallback(\n (props) => ({ id: labelId, role: \"presentation\", ...props }),\n [labelId],\n )\n\n return { getGroupProps, getLabelProps }\n}\n\nexport type UseMenuGroupReturn = ReturnType<typeof useMenuGroup>\n\nexport interface UseMenuItemProps extends HTMLProps {\n /**\n * If `true`, the menu item will be closed when selected.\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The value of the menu item.\n */\n value?: string\n}\n\nexport const useMenuItem = ({\n id,\n \"aria-disabled\": ariaDisabled,\n \"data-disabled\": dataDisabled,\n \"data-trigger\": dataTrigger,\n closeOnSelect,\n disabled = false,\n value,\n ...rest\n}: UseMenuItemProps) => {\n const trigger = isTruthyDataAttr(dataTrigger)\n const {\n subMenu,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onCloseSubMenu,\n onSelect,\n } = useMenuContext()\n const uuid = useId()\n const itemRef = useRef<HTMLDivElement>(null)\n const subMenuTrigger = subMenu && trigger\n\n id ??= uuid\n\n const { descendants, register } = useMenuDescendant({\n id,\n disabled: disabled || subMenuTrigger,\n })\n\n const onActive = useCallback(() => {\n if (disabled) return\n\n const descendant = descendants.value(itemRef.current)\n\n onActiveDescendant(descendant)\n }, [descendants, disabled, onActiveDescendant])\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = descendants.enabledNextValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n ArrowUp: () => {\n const descendant = descendants.enabledPrevValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n End: () => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n },\n Enter: () => onSelect(value, closeOnSelect),\n Home: () => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n },\n Space: () => onSelect(value, closeOnSelect),\n [subMenuDirection === \"end\" ? \"ArrowLeft\" : \"ArrowRight\"]: () => {\n if (!subMenu) return\n\n onClose()\n\n const descendant = descendants.firstValue()\n\n descendant?.node.focus()\n },\n })\n },\n [\n closeOnSelect,\n descendants,\n onActiveDescendant,\n onClose,\n onSelect,\n subMenu,\n subMenuDirection,\n value,\n ],\n )\n\n const getItemProps: PropGetter = useCallback(\n ({ ref, ...props } = {}) => ({\n id,\n \"aria-disabled\": ariaDisabled ?? ariaAttr(disabled),\n \"data-disabled\": dataDisabled ?? dataAttr(disabled),\n role: \"menuitem\",\n tabIndex: -1,\n ...rest,\n ...props,\n ref: mergeRefs(ref, rest.ref, itemRef, register),\n onClick: handlerAll(props.onClick, rest.onClick, () =>\n onSelect(value, closeOnSelect),\n ),\n onFocus: handlerAll(props.onFocus, rest.onFocus, onActive),\n onKeyDown: handlerAll(props.onKeyDown, rest.onKeyDown, onKeyDown),\n onMouseMove: handlerAll(props.onMouseMove, rest.onMouseMove, () => {\n onCloseSubMenu()\n onActive()\n }),\n }),\n [\n id,\n ariaDisabled,\n disabled,\n dataDisabled,\n rest,\n register,\n onActive,\n onKeyDown,\n onSelect,\n value,\n closeOnSelect,\n onCloseSubMenu,\n ],\n )\n\n return {\n subMenuTrigger,\n getItemProps,\n }\n}\n\nexport type UseMenuItemReturn = ReturnType<typeof useMenuItem>\n\nexport type MenuOptionGroupType = \"checkbox\" | \"radio\"\nexport type MenuOptionGroupValue<Y extends MenuOptionGroupType> =\n Y extends \"checkbox\" ? string[] : string\n\nexport interface UseMenuOptionGroupProps<\n Y extends MenuOptionGroupType = \"checkbox\",\n M extends MenuOptionGroupValue<Y> = MenuOptionGroupValue<Y>,\n> {\n /**\n * The initial value of the menu item group.\n */\n defaultValue?: M\n /**\n * The type of the menu option group.\n */\n type?: Y\n /**\n * The value of the menu item group.\n */\n value?: M\n /**\n * The callback fired when any children checkbox is checked or unchecked.\n */\n onChange?: (value: M) => void\n}\n\nexport const useMenuOptionGroup = <\n Y extends \"checkbox\" | \"radio\" = \"checkbox\",\n M extends Y extends \"checkbox\" ? string[] : string = Y extends \"checkbox\"\n ? string[]\n : string,\n>({\n type = \"checkbox\" as Y,\n defaultValue = (type === \"checkbox\" ? [] : \"\") as M,\n value: valueProp,\n onChange: onChangeProp,\n}: UseMenuOptionGroupProps<Y, M>) => {\n const [value, setValue] = useControllableState({\n defaultValue,\n value: valueProp,\n onChange: onChangeProp,\n })\n const radio = type === \"radio\"\n\n const onChange = useCallback(\n (selectedValue: string) => {\n setValue((prev) => {\n if (radio && isString(prev)) {\n return selectedValue as M\n } else if (!radio && isArray(prev)) {\n return (\n prev.includes(selectedValue)\n ? prev.filter((value) => value !== selectedValue)\n : prev.concat(selectedValue)\n ) as M\n } else {\n return prev\n }\n })\n },\n [radio, setValue],\n )\n\n useUpdateEffect(() => {\n setValue(valueProp!)\n }, [valueProp])\n\n return {\n type,\n value,\n onChange,\n }\n}\n\nexport type UseMenuOptionGroupReturn = ReturnType<typeof useMenuOptionGroup>\n\nexport interface UseMenuOptionItemProps extends UseMenuItemProps {\n /**\n * The value of the menu option item.\n */\n value: string\n}\n\nexport const useMenuOptionItem = ({\n disabled,\n value,\n ...rest\n}: UseMenuOptionItemProps) => {\n const { type, value: selectedValue, onChange } = useMenuOptionGroupContext()\n const { getItemProps } = useMenuItem({ disabled, value, ...rest })\n const radio = type === \"radio\" && isString(selectedValue)\n const checkbox = type === \"checkbox\" && isArray(selectedValue)\n const selected = radio\n ? value === selectedValue\n : checkbox\n ? selectedValue.includes(value)\n : false\n\n const getIndicatorProps: PropGetter = useCallback(\n ({ style, ...props } = {}) => ({\n style: { opacity: selected ? 1 : 0, ...style },\n ...props,\n }),\n [selected],\n )\n\n const getOptionItemProps: PropGetter = useCallback(\n (props = {}) =>\n getItemProps({\n role: radio ? \"menuitemradio\" : \"menuitemcheckbox\",\n ...props,\n onClick: handlerAll(props.onClick, () =>\n !disabled ? onChange?.(value) : noop,\n ),\n }),\n [disabled, getItemProps, onChange, radio, value],\n )\n\n return {\n type,\n selected,\n getIndicatorProps,\n getOptionItemProps,\n }\n}\n\nexport type UseMenuOptionItemReturn = ReturnType<typeof useMenuOptionItem>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-menu.cjs","names":["createDescendants","createContext","useDisclosure","getTriggerProps: PropGetter","getContextTriggerProps: PropGetter","getContentProps: PropGetter","mergeRefs","getSeparatorProps: PropGetter","mergeProps","useControllableState","value"],"sources":["../../../../src/components/menu/use-menu.ts"],"sourcesContent":["\"use client\"\n\nimport type { KeyboardEvent, MouseEvent, RefObject } from \"react\"\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport type { Descendant, Descendants } from \"../../hooks/use-descendants\"\nimport type { UseDisclosureProps } from \"../../hooks/use-disclosure\"\nimport { useCallback, useId, useRef } from \"react\"\nimport { mergeProps } from \"../../core\"\nimport { useControllableState } from \"../../hooks/use-controllable-state\"\nimport { createDescendants } from \"../../hooks/use-descendants\"\nimport { useDisclosure } from \"../../hooks/use-disclosure\"\nimport {\n ariaAttr,\n assignRef,\n createContext,\n cx,\n dataAttr,\n handlerAll,\n isArray,\n isString,\n isTruthyDataAttr,\n mergeRefs,\n noop,\n runKeyAction,\n useUpdateEffect,\n} from \"../../utils\"\n\ntype SubMenuDirection = \"end\" | \"start\"\n\ninterface MenuDescendantProps {\n id: string\n}\ntype MenuDescendant = Descendant<HTMLDivElement, MenuDescendantProps>\n\nconst {\n DescendantsContext: MenuDescendantsContext,\n useDescendant: useMenuDescendant,\n useDescendantRegister: useMenuDescendantRegister,\n useDescendants: useMenuDescendants,\n} = createDescendants<HTMLDivElement, MenuDescendantProps>()\n\nexport { MenuDescendantsContext, useMenuDescendant, useMenuDescendants }\n\ninterface MenuContext extends Pick<\n UseMenuReturn,\n | \"onActiveDescendant\"\n | \"onClose\"\n | \"onCloseSubMenu\"\n | \"onOpen\"\n | \"onSelect\"\n | \"subMenu\"\n | \"subMenuDirection\"\n> {}\n\nconst [MenuContext, useMenuContext] = createContext<MenuContext>({\n name: \"MenuContext\",\n})\n\ninterface MenuGroupContext extends Pick<UseMenuGroupReturn, \"getLabelProps\"> {}\n\nconst [MenuGroupContext, useMenuGroupContext] = createContext<MenuGroupContext>(\n {\n name: \"MenuGroupContext\",\n },\n)\n\ninterface MainMenuContext {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n onCloseRef: RefObject<() => void>\n onSelect: (value?: string, closeOnSelect?: boolean) => void\n closeOnSelect?: boolean\n}\n\nconst [MainMenuContext, useMainMenuContext] = createContext<MainMenuContext>({\n name: \"MainMenuContext\",\n strict: false,\n})\n\ninterface MenuOptionGroupContext {\n type: \"checkbox\" | \"radio\"\n value: string | string[]\n onChange?: (value: string) => void\n}\n\nconst [MenuOptionGroupContext, useMenuOptionGroupContext] =\n createContext<MenuOptionGroupContext>({\n name: \"MenuOptionGroupContext\",\n })\n\nexport {\n MainMenuContext,\n MenuContext,\n MenuGroupContext,\n MenuOptionGroupContext,\n useMainMenuContext,\n useMenuContext,\n useMenuGroupContext,\n useMenuOptionGroupContext,\n}\n\nexport interface UseMenuProps extends Omit<UseDisclosureProps, \"timing\"> {\n /**\n * If `true`, the menu item will be closed when selected.\n *\n * @default true\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The direction of the sub menu.\n *\n * @default 'end'\n */\n subMenuDirection?: SubMenuDirection\n /**\n * Callback invoked when a menu item is selected.\n */\n onSelect?: (value?: string) => void\n}\n\nexport const useMenu = ({\n closeOnSelect,\n defaultOpen,\n disabled = false,\n open: openProp,\n subMenuDirection = \"end\",\n onClose: onCloseProp,\n onOpen: onOpenProp,\n onSelect: onSelectProp,\n}: UseMenuProps = {}) => {\n const triggerId = useId()\n const contentId = useId()\n const descendants = useMenuDescendants()\n const updateRef = useRef<() => void>(noop)\n const onCloseRef = useRef<() => void>(noop)\n const contentRef = useRef<HTMLDivElement>(null)\n const { open, onClose, onOpen } = useDisclosure({\n defaultOpen,\n open: openProp,\n onClose: onCloseProp,\n onOpen: onOpenProp,\n })\n const onCloseSubMenu = useCallback(() => onCloseRef.current(), [])\n const onActiveDescendant = useCallback(\n (\n descendant?: MenuDescendant,\n options: FocusOptions = { preventScroll: true },\n ) => {\n if (!contentRef.current || !descendant || disabled) return\n\n contentRef.current.setAttribute(\"aria-activedescendant\", descendant.id)\n\n descendants.active(descendant, options)\n },\n [descendants, disabled],\n )\n const { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect } =\n useSubMenu({\n descendants,\n disabled,\n open,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onOpen,\n })\n\n closeOnSelect ??= mainCloseOnSelect ?? true\n\n const onSelect = useCallback(\n (value?: string, closeOnSelectProp = closeOnSelect) => {\n if (disabled) return\n\n onSelectProp?.(value)\n onMainSelect?.(value, closeOnSelectProp)\n\n if (!closeOnSelectProp) return\n\n onClose()\n },\n [closeOnSelect, disabled, onClose, onMainSelect, onSelectProp],\n )\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n\n if (!open) {\n onOpen()\n } else {\n onClose()\n }\n },\n [disabled, onClose, onOpen, open],\n )\n\n const onContextMenu = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n onOpen()\n updateRef.current()\n },\n [disabled, onOpen],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n\n runKeyAction(ev, {\n ArrowDown: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n ArrowUp: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n })\n },\n Enter: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n Space: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n })\n },\n [descendants, disabled, onActiveDescendant, onOpen],\n )\n\n const getTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n ...getSubMenuProps({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"button\",\n tabIndex: disabled ? -1 : 0,\n ...props,\n onClick: handlerAll(props.onClick, onClick),\n onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n }),\n }),\n [contentId, disabled, getSubMenuProps, onClick, onKeyDown, open, triggerId],\n )\n\n const getContextTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"application\",\n ...props,\n onContextMenu: handlerAll(props.onContextMenu, onContextMenu),\n }),\n [contentId, disabled, onContextMenu, open, triggerId],\n )\n\n const getContentProps: PropGetter = useCallback(\n ({ ref, \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n id: contentId,\n \"aria-labelledby\": cx(ariaLabelledby, triggerId),\n role: \"menu\",\n ...props,\n ref: mergeRefs(ref, contentRef),\n }),\n [contentId, triggerId],\n )\n\n const getSeparatorProps: PropGetter = useCallback(\n (props) => ({ role: \"separator\", ...props }),\n [],\n )\n\n return {\n closeOnSelect,\n descendants,\n open,\n subMenu,\n subMenuDirection,\n updateRef,\n getContentProps,\n getContextTriggerProps,\n getSeparatorProps,\n getTriggerProps,\n onActiveDescendant,\n onClose,\n onCloseRef,\n onCloseSubMenu,\n onOpen,\n onSelect,\n }\n}\n\nexport type UseMenuReturn = ReturnType<typeof useMenu>\n\nexport interface UseSubMenuProps extends Omit<\n Required<UseDisclosureProps>,\n \"defaultOpen\" | \"timing\"\n> {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n disabled?: boolean\n subMenuDirection?: SubMenuDirection\n}\n\nexport const useSubMenu = ({\n descendants,\n disabled = false,\n open,\n subMenuDirection = \"end\",\n onActiveDescendant,\n onClose,\n onOpen,\n}: UseSubMenuProps) => {\n const uuid = useId()\n const {\n closeOnSelect: mainCloseOnSelect,\n descendants: mainDescendants,\n onActiveDescendant: onActiveMainDescendant,\n onCloseRef,\n onSelect: onMainSelect,\n } = useMainMenuContext() ?? {}\n const subMenu = !!mainDescendants && !!onActiveMainDescendant\n const createRegister = useMenuDescendantRegister(mainDescendants)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const dataDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const dataDisabled = isTruthyDataAttr(node.getAttribute(\"data-disabled\"))\n\n return dataDisabled\n }, [])\n\n const ariaDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const ariaDisabled = isTruthyDataAttr(node.getAttribute(\"aria-disabled\"))\n\n return ariaDisabled\n }, [])\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu) return\n\n ev.defaultPrevented = disabled || dataDisabled() || ariaDisabled()\n },\n [ariaDisabled, dataDisabled, disabled, subMenu],\n )\n\n const onMouseEnter = useCallback(() => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n onOpen()\n }, [ariaDisabled, dataDisabled, disabled, onOpen, subMenu])\n\n const onMouseMove = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n const descendant = descendants.value(triggerRef.current)\n\n onActiveMainDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [\n ariaDisabled,\n dataDisabled,\n descendants,\n disabled,\n onActiveMainDescendant,\n subMenu,\n ],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (!subMenu || disabled) return\n\n const currentDescendant = open ? descendants : mainDescendants\n const onActiveCurrentDescendant = open\n ? onActiveDescendant\n : onActiveMainDescendant\n\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = currentDescendant.enabledNextValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n ArrowUp: () => {\n const descendant = currentDescendant.enabledPrevValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n End: () => {\n const descendant = currentDescendant.enabledLastValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n Home: () => {\n const descendant = currentDescendant.enabledFirstValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [subMenuDirection === \"end\" ? \"ArrowRight\" : \"ArrowLeft\"]: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n\n ev.defaultPrevented = true\n },\n })\n },\n [\n subMenu,\n disabled,\n open,\n descendants,\n mainDescendants,\n onActiveDescendant,\n onActiveMainDescendant,\n subMenuDirection,\n onOpen,\n ],\n )\n\n assignRef(onCloseRef, onClose)\n\n const getSubMenuProps: PropGetter = useCallback(\n ({ id = uuid, ref, ...props } = {}) => {\n const getDisabled = (node: HTMLDivElement) =>\n disabled || dataDisabled(node) || ariaDisabled(node)\n const register = createRegister({ id, disabled: getDisabled })\n\n return {\n role: subMenu ? \"menuitem\" : \"button\",\n ...props,\n ref: mergeRefs(ref, triggerRef, register),\n onClick: handlerAll(onClick, props.onClick),\n onKeyDown: handlerAll(onKeyDown, props.onKeyDown),\n onMouseEnter: handlerAll(onMouseEnter, props.onMouseEnter),\n onMouseMove: handlerAll(onMouseMove, props.onMouseMove),\n }\n },\n [\n uuid,\n subMenu,\n createRegister,\n onClick,\n onKeyDown,\n onMouseEnter,\n onMouseMove,\n disabled,\n dataDisabled,\n ariaDisabled,\n ],\n )\n\n return { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect }\n}\n\nexport type UseSubMenuReturn = ReturnType<typeof useSubMenu>\n\nexport interface UseMenuGroupProps extends HTMLProps {}\n\nexport const useMenuGroup = ({\n \"aria-labelledby\": ariaLabelledbyProp,\n ...rest\n}: UseMenuGroupProps) => {\n const labelId = useId()\n\n const getGroupProps: PropGetter = useCallback(\n ({ \"aria-labelledby\": ariaLabelledby, ...props } = {}) =>\n mergeProps(\n {\n \"aria-labelledby\": cx(ariaLabelledbyProp, ariaLabelledby, labelId),\n role: \"group\",\n },\n rest,\n props,\n )(),\n [ariaLabelledbyProp, labelId, rest],\n )\n\n const getLabelProps: PropGetter<\"span\"> = useCallback(\n (props) => ({ id: labelId, role: \"presentation\", ...props }),\n [labelId],\n )\n\n return { getGroupProps, getLabelProps }\n}\n\nexport type UseMenuGroupReturn = ReturnType<typeof useMenuGroup>\n\nexport interface UseMenuItemProps extends HTMLProps {\n /**\n * If `true`, the menu item will be closed when selected.\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The value of the menu item.\n */\n value?: string\n}\n\nexport const useMenuItem = ({\n id,\n \"aria-disabled\": ariaDisabled,\n \"data-disabled\": dataDisabled,\n \"data-trigger\": dataTrigger,\n closeOnSelect,\n disabled = false,\n value,\n ...rest\n}: UseMenuItemProps) => {\n const trigger = isTruthyDataAttr(dataTrigger)\n const {\n subMenu,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onCloseSubMenu,\n onSelect,\n } = useMenuContext()\n const uuid = useId()\n const itemRef = useRef<HTMLDivElement>(null)\n const subMenuTrigger = subMenu && trigger\n\n id ??= uuid\n\n const { descendants, register } = useMenuDescendant({\n id,\n disabled: disabled || subMenuTrigger,\n })\n\n const onActive = useCallback(() => {\n if (disabled) return\n\n const descendant = descendants.value(itemRef.current)\n\n onActiveDescendant(descendant)\n }, [descendants, disabled, onActiveDescendant])\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = descendants.enabledNextValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n ArrowUp: () => {\n const descendant = descendants.enabledPrevValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n End: () => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n },\n Enter: () => onSelect(value, closeOnSelect),\n Home: () => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n },\n Space: () => onSelect(value, closeOnSelect),\n [subMenuDirection === \"end\" ? \"ArrowLeft\" : \"ArrowRight\"]: () => {\n if (!subMenu) return\n\n onClose()\n\n const descendant = descendants.firstValue()\n\n descendant?.node.focus()\n },\n })\n },\n [\n closeOnSelect,\n descendants,\n onActiveDescendant,\n onClose,\n onSelect,\n subMenu,\n subMenuDirection,\n value,\n ],\n )\n\n const getItemProps: PropGetter = useCallback(\n ({ ref, ...props } = {}) => {\n const {\n onClick: restOnClick,\n onFocus: restOnFocus,\n onKeyDown: restOnKeyDown,\n onMouseMove: restOnMouseMove,\n ...restProps\n } = rest\n const {\n onClick: propsOnClick,\n onFocus: propsOnFocus,\n onKeyDown: propsOnKeyDown,\n onMouseMove: propsOnMouseMove,\n ...itemProps\n } = props\n\n return mergeProps(\n {\n id,\n \"aria-disabled\": ariaDisabled ?? ariaAttr(disabled),\n \"data-disabled\": dataDisabled ?? dataAttr(disabled),\n role: \"menuitem\",\n tabIndex: -1,\n },\n restProps,\n itemProps,\n {\n ref: mergeRefs(ref, itemRef, register),\n onClick: handlerAll(propsOnClick, restOnClick, () =>\n onSelect(value, closeOnSelect),\n ),\n onFocus: handlerAll(propsOnFocus, restOnFocus, onActive),\n onKeyDown: handlerAll(propsOnKeyDown, restOnKeyDown, onKeyDown),\n onMouseMove: handlerAll(propsOnMouseMove, restOnMouseMove, () => {\n onCloseSubMenu()\n onActive()\n }),\n },\n )()\n },\n [\n id,\n ariaDisabled,\n disabled,\n dataDisabled,\n rest,\n register,\n onActive,\n onKeyDown,\n onSelect,\n value,\n closeOnSelect,\n onCloseSubMenu,\n ],\n )\n\n return {\n subMenuTrigger,\n getItemProps,\n }\n}\n\nexport type UseMenuItemReturn = ReturnType<typeof useMenuItem>\n\nexport type MenuOptionGroupType = \"checkbox\" | \"radio\"\nexport type MenuOptionGroupValue<Y extends MenuOptionGroupType> =\n Y extends \"checkbox\" ? string[] : string\n\nexport interface UseMenuOptionGroupProps<\n Y extends MenuOptionGroupType = \"checkbox\",\n M extends MenuOptionGroupValue<Y> = MenuOptionGroupValue<Y>,\n> {\n /**\n * The initial value of the menu item group.\n */\n defaultValue?: M\n /**\n * The type of the menu option group.\n */\n type?: Y\n /**\n * The value of the menu item group.\n */\n value?: M\n /**\n * The callback fired when any children checkbox is checked or unchecked.\n */\n onChange?: (value: M) => void\n}\n\nexport const useMenuOptionGroup = <\n Y extends \"checkbox\" | \"radio\" = \"checkbox\",\n M extends Y extends \"checkbox\" ? string[] : string = Y extends \"checkbox\"\n ? string[]\n : string,\n>({\n type = \"checkbox\" as Y,\n defaultValue = (type === \"checkbox\" ? [] : \"\") as M,\n value: valueProp,\n onChange: onChangeProp,\n}: UseMenuOptionGroupProps<Y, M>) => {\n const [value, setValue] = useControllableState({\n defaultValue,\n value: valueProp,\n onChange: onChangeProp,\n })\n const radio = type === \"radio\"\n\n const onChange = useCallback(\n (selectedValue: string) => {\n setValue((prev) => {\n if (radio && isString(prev)) {\n return selectedValue as M\n } else if (!radio && isArray(prev)) {\n return (\n prev.includes(selectedValue)\n ? prev.filter((value) => value !== selectedValue)\n : prev.concat(selectedValue)\n ) as M\n } else {\n return prev\n }\n })\n },\n [radio, setValue],\n )\n\n useUpdateEffect(() => {\n setValue(valueProp!)\n }, [valueProp])\n\n return {\n type,\n value,\n onChange,\n }\n}\n\nexport type UseMenuOptionGroupReturn = ReturnType<typeof useMenuOptionGroup>\n\nexport interface UseMenuOptionItemProps extends UseMenuItemProps {\n /**\n * The value of the menu option item.\n */\n value: string\n}\n\nexport const useMenuOptionItem = ({\n disabled,\n value,\n ...rest\n}: UseMenuOptionItemProps) => {\n const { type, value: selectedValue, onChange } = useMenuOptionGroupContext()\n const { getItemProps } = useMenuItem({ disabled, value, ...rest })\n const radio = type === \"radio\" && isString(selectedValue)\n const checkbox = type === \"checkbox\" && isArray(selectedValue)\n const selected = radio\n ? value === selectedValue\n : checkbox\n ? selectedValue.includes(value)\n : false\n\n const getIndicatorProps: PropGetter = useCallback(\n ({ style, ...props } = {}) => ({\n style: { opacity: selected ? 1 : 0, ...style },\n ...props,\n }),\n [selected],\n )\n\n const getOptionItemProps: PropGetter = useCallback(\n (props = {}) =>\n getItemProps({\n role: radio ? \"menuitemradio\" : \"menuitemcheckbox\",\n ...props,\n onClick: handlerAll(props.onClick, () =>\n !disabled ? onChange?.(value) : noop,\n ),\n }),\n [disabled, getItemProps, onChange, radio, value],\n )\n\n return {\n type,\n selected,\n getIndicatorProps,\n getOptionItemProps,\n }\n}\n\nexport type UseMenuOptionItemReturn = ReturnType<typeof useMenuOptionItem>\n"],"mappings":"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"}
|
|
@@ -4,17 +4,16 @@ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
|
|
|
4
4
|
const require_context = require('../../utils/context.cjs');
|
|
5
5
|
const require_ref = require('../../utils/ref.cjs');
|
|
6
6
|
const require_utils_index = require('../../utils/index.cjs');
|
|
7
|
+
const require_props = require('../../core/components/props.cjs');
|
|
8
|
+
require('../../core/index.cjs');
|
|
7
9
|
let react = require("react");
|
|
8
10
|
|
|
9
11
|
//#region src/components/native-accordion/use-native-accordion.ts
|
|
10
12
|
const [NativeAccordionContext, useNativeAccordionContext] = require_context.createContext({ name: "NativeAccordionContext" });
|
|
11
13
|
const useNativeAccordion = ({ name, multiple = false, ...rest } = {}) => {
|
|
12
14
|
const generatedName = (0, react.useId)();
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
...rest,
|
|
16
|
-
ref: require_ref.mergeRefs(ref, rest.ref)
|
|
17
|
-
});
|
|
15
|
+
const { ref: restRef, ...restProps } = rest;
|
|
16
|
+
const getRootProps = ({ ref, ...props } = {}) => require_props.mergeProps(props, restProps, { ref: require_ref.mergeRefs(ref, restRef) })();
|
|
18
17
|
return {
|
|
19
18
|
name: multiple ? void 0 : name ?? generatedName,
|
|
20
19
|
getRootProps
|
|
@@ -22,13 +21,11 @@ const useNativeAccordion = ({ name, multiple = false, ...rest } = {}) => {
|
|
|
22
21
|
};
|
|
23
22
|
const useNativeAccordionItem = ({ disabled, ...rest }) => {
|
|
24
23
|
const { name } = useNativeAccordionContext();
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
name: props.name ??
|
|
28
|
-
"data-group": ""
|
|
29
|
-
|
|
30
|
-
...props
|
|
31
|
-
});
|
|
24
|
+
const { ref: restRef, ...restProps } = rest;
|
|
25
|
+
const getItemProps = ({ ref, ...props } = {}) => require_props.mergeProps({
|
|
26
|
+
name: props.name ?? restProps.name ?? name,
|
|
27
|
+
"data-group": ""
|
|
28
|
+
}, restProps, props, { ref: require_ref.mergeRefs(ref, restRef) })();
|
|
32
29
|
const getButtonProps = (0, react.useCallback)((props = {}) => ({
|
|
33
30
|
"aria-disabled": (0, require_utils_index.utils_exports.ariaAttr)(disabled),
|
|
34
31
|
"data-disabled": (0, require_utils_index.utils_exports.dataAttr)(disabled),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-native-accordion.cjs","names":["createContext","getRootProps: PropGetter","mergeRefs","getItemProps: PropGetter<\"details\">","getButtonProps: PropGetter<\"summary\">","getPanelProps: PropGetter"],"sources":["../../../../src/components/native-accordion/use-native-accordion.ts"],"sourcesContent":["\"use client\"\n\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport { useCallback, useId } from \"react\"\nimport {\n ariaAttr,\n createContext,\n dataAttr,\n handlerAll,\n mergeRefs,\n} from \"../../utils\"\n\ninterface NativeAccordionContext extends Pick<\n UseNativeAccordionReturn,\n \"name\"\n> {}\n\nconst [NativeAccordionContext, useNativeAccordionContext] =\n createContext<NativeAccordionContext>({\n name: \"NativeAccordionContext\",\n })\n\nexport { NativeAccordionContext, useNativeAccordionContext }\n\nexport interface UseNativeAccordionProps extends HTMLProps {\n /**\n * If `true`, multiple accordion items can be expanded at once.\n *\n * @default false\n */\n multiple?: boolean\n /**\n * The HTML `name` attribute used for forms.\n */\n name?: string\n}\n\nexport const useNativeAccordion = ({\n name,\n multiple = false,\n ...rest\n}: UseNativeAccordionProps = {}) => {\n const generatedName = useId()\n\n const getRootProps: PropGetter = ({ ref, ...props } = {})
|
|
1
|
+
{"version":3,"file":"use-native-accordion.cjs","names":["createContext","getRootProps: PropGetter","mergeProps","mergeRefs","getItemProps: PropGetter<\"details\">","getButtonProps: PropGetter<\"summary\">","getPanelProps: PropGetter"],"sources":["../../../../src/components/native-accordion/use-native-accordion.ts"],"sourcesContent":["\"use client\"\n\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport { useCallback, useId } from \"react\"\nimport { mergeProps } from \"../../core\"\nimport {\n ariaAttr,\n createContext,\n dataAttr,\n handlerAll,\n mergeRefs,\n} from \"../../utils\"\n\ninterface NativeAccordionContext extends Pick<\n UseNativeAccordionReturn,\n \"name\"\n> {}\n\nconst [NativeAccordionContext, useNativeAccordionContext] =\n createContext<NativeAccordionContext>({\n name: \"NativeAccordionContext\",\n })\n\nexport { NativeAccordionContext, useNativeAccordionContext }\n\nexport interface UseNativeAccordionProps extends HTMLProps {\n /**\n * If `true`, multiple accordion items can be expanded at once.\n *\n * @default false\n */\n multiple?: boolean\n /**\n * The HTML `name` attribute used for forms.\n */\n name?: string\n}\n\nexport const useNativeAccordion = ({\n name,\n multiple = false,\n ...rest\n}: UseNativeAccordionProps = {}) => {\n const generatedName = useId()\n const { ref: restRef, ...restProps } = rest\n\n const getRootProps: PropGetter = ({ ref, ...props } = {}) =>\n mergeProps(props, restProps, {\n ref: mergeRefs(ref, restRef),\n })()\n\n return {\n name: multiple ? undefined : (name ?? generatedName),\n getRootProps,\n }\n}\n\nexport type UseNativeAccordionReturn = ReturnType<typeof useNativeAccordion>\n\nexport interface UseNativeAccordionItemProps extends HTMLProps<\"details\"> {\n /**\n * If `true`, the accordion item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n}\n\nexport const useNativeAccordionItem = ({\n disabled,\n ...rest\n}: UseNativeAccordionItemProps) => {\n const { name } = useNativeAccordionContext()\n const { ref: restRef, ...restProps } = rest\n\n const getItemProps: PropGetter<\"details\"> = ({ ref, ...props } = {}) =>\n mergeProps(\n {\n name: props.name ?? restProps.name ?? name,\n \"data-group\": \"\",\n },\n restProps,\n props,\n {\n ref: mergeRefs(ref, restRef),\n },\n )()\n\n const getButtonProps: PropGetter<\"summary\"> = useCallback(\n (props = {}) => ({\n \"aria-disabled\": ariaAttr(disabled),\n \"data-disabled\": dataAttr(disabled),\n ...props,\n onClick: handlerAll(props.onClick, (ev) => {\n if (!disabled) return\n\n ev.preventDefault()\n }),\n }),\n [disabled],\n )\n\n const getPanelProps: PropGetter = useCallback((props = {}) => props, [])\n\n const getIconProps: PropGetter<\"svg\"> = useCallback(\n (props = {}) => ({\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-hidden\": true,\n role: \"presentation\",\n ...props,\n }),\n [disabled],\n )\n\n return {\n disabled,\n getButtonProps,\n getIconProps,\n getItemProps,\n getPanelProps,\n }\n}\n\nexport type UseNativeAccordionItemReturn = ReturnType<\n typeof useNativeAccordionItem\n>\n"],"mappings":";;;;;;;;;;;AAkBA,MAAM,CAAC,wBAAwB,6BAC7BA,8BAAsC,EACpC,MAAM,0BACP,CAAC;AAiBJ,MAAa,sBAAsB,EACjC,MACA,WAAW,OACX,GAAG,SACwB,EAAE,KAAK;CAClC,MAAM,kCAAuB;CAC7B,MAAM,EAAE,KAAK,SAAS,GAAG,cAAc;CAEvC,MAAMC,gBAA4B,EAAE,KAAK,GAAG,UAAU,EAAE,KACtDC,yBAAW,OAAO,WAAW,EAC3B,KAAKC,sBAAU,KAAK,QAAQ,EAC7B,CAAC,EAAE;AAEN,QAAO;EACL,MAAM,WAAW,SAAa,QAAQ;EACtC;EACD;;AAcH,MAAa,0BAA0B,EACrC,UACA,GAAG,WAC8B;CACjC,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,EAAE,KAAK,SAAS,GAAG,cAAc;CAEvC,MAAMC,gBAAuC,EAAE,KAAK,GAAG,UAAU,EAAE,KACjEF,yBACE;EACE,MAAM,MAAM,QAAQ,UAAU,QAAQ;EACtC,cAAc;EACf,EACD,WACA,OACA,EACE,KAAKC,sBAAU,KAAK,QAAQ,EAC7B,CACF,EAAE;CAEL,MAAME,yCACH,QAAQ,EAAE,MAAM;EACf,iEAA0B,SAAS;EACnC,iEAA0B,SAAS;EACnC,GAAG;EACH,2DAAoB,MAAM,UAAU,OAAO;AACzC,OAAI,CAAC,SAAU;AAEf,MAAG,gBAAgB;IACnB;EACH,GACD,CAAC,SAAS,CACX;CAED,MAAMC,wCAAyC,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;AAYxE,QAAO;EACL;EACA;EACA,sCAZC,QAAQ,EAAE,MAAM;GACf,iEAA0B,SAAS;GACnC,eAAe;GACf,MAAM;GACN,GAAG;GACJ,GACD,CAAC,SAAS,CACX;EAMC;EACA;EACD"}
|
|
@@ -5,6 +5,8 @@ import { runKeyAction } from "../../utils/dom.js";
|
|
|
5
5
|
import { useUpdateEffect } from "../../utils/effect.js";
|
|
6
6
|
import { assignRef, mergeRefs } from "../../utils/ref.js";
|
|
7
7
|
import { utils_exports } from "../../utils/index.js";
|
|
8
|
+
import { mergeProps } from "../../core/components/props.js";
|
|
9
|
+
import "../../core/index.js";
|
|
8
10
|
import { useControllableState } from "../../hooks/use-controllable-state/index.js";
|
|
9
11
|
import { createDescendants } from "../../hooks/use-descendants/index.js";
|
|
10
12
|
import { useDisclosure } from "../../hooks/use-disclosure/use-disclosure.js";
|
|
@@ -305,12 +307,10 @@ const useSubMenu = ({ descendants, disabled = false, open, subMenuDirection = "e
|
|
|
305
307
|
const useMenuGroup = ({ "aria-labelledby": ariaLabelledbyProp, ...rest }) => {
|
|
306
308
|
const labelId = useId();
|
|
307
309
|
return {
|
|
308
|
-
getGroupProps: useCallback(({ "aria-labelledby": ariaLabelledby, ...props } = {}) => ({
|
|
310
|
+
getGroupProps: useCallback(({ "aria-labelledby": ariaLabelledby, ...props } = {}) => mergeProps({
|
|
309
311
|
"aria-labelledby": (0, utils_exports.cx)(ariaLabelledbyProp, ariaLabelledby, labelId),
|
|
310
|
-
role: "group"
|
|
311
|
-
|
|
312
|
-
...props
|
|
313
|
-
}), [
|
|
312
|
+
role: "group"
|
|
313
|
+
}, rest, props)(), [
|
|
314
314
|
ariaLabelledbyProp,
|
|
315
315
|
labelId,
|
|
316
316
|
rest
|
|
@@ -375,23 +375,26 @@ const useMenuItem = ({ id, "aria-disabled": ariaDisabled, "data-disabled": dataD
|
|
|
375
375
|
]);
|
|
376
376
|
return {
|
|
377
377
|
subMenuTrigger,
|
|
378
|
-
getItemProps: useCallback(({ ref, ...props } = {}) =>
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
378
|
+
getItemProps: useCallback(({ ref, ...props } = {}) => {
|
|
379
|
+
const { onClick: restOnClick, onFocus: restOnFocus, onKeyDown: restOnKeyDown, onMouseMove: restOnMouseMove, ...restProps } = rest;
|
|
380
|
+
const { onClick: propsOnClick, onFocus: propsOnFocus, onKeyDown: propsOnKeyDown, onMouseMove: propsOnMouseMove, ...itemProps } = props;
|
|
381
|
+
return mergeProps({
|
|
382
|
+
id,
|
|
383
|
+
"aria-disabled": ariaDisabled ?? (0, utils_exports.ariaAttr)(disabled),
|
|
384
|
+
"data-disabled": dataDisabled ?? (0, utils_exports.dataAttr)(disabled),
|
|
385
|
+
role: "menuitem",
|
|
386
|
+
tabIndex: -1
|
|
387
|
+
}, restProps, itemProps, {
|
|
388
|
+
ref: mergeRefs(ref, itemRef, register),
|
|
389
|
+
onClick: (0, utils_exports.handlerAll)(propsOnClick, restOnClick, () => onSelect(value, closeOnSelect)),
|
|
390
|
+
onFocus: (0, utils_exports.handlerAll)(propsOnFocus, restOnFocus, onActive),
|
|
391
|
+
onKeyDown: (0, utils_exports.handlerAll)(propsOnKeyDown, restOnKeyDown, onKeyDown),
|
|
392
|
+
onMouseMove: (0, utils_exports.handlerAll)(propsOnMouseMove, restOnMouseMove, () => {
|
|
393
|
+
onCloseSubMenu();
|
|
394
|
+
onActive();
|
|
395
|
+
})
|
|
396
|
+
})();
|
|
397
|
+
}, [
|
|
395
398
|
id,
|
|
396
399
|
ariaDisabled,
|
|
397
400
|
disabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-menu.js","names":["createContext","noop","getTriggerProps: PropGetter","getContextTriggerProps: PropGetter","getContentProps: PropGetter","getSeparatorProps: PropGetter","value"],"sources":["../../../../src/components/menu/use-menu.ts"],"sourcesContent":["\"use client\"\n\nimport type { KeyboardEvent, MouseEvent, RefObject } from \"react\"\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport type { Descendant, Descendants } from \"../../hooks/use-descendants\"\nimport type { UseDisclosureProps } from \"../../hooks/use-disclosure\"\nimport { useCallback, useId, useRef } from \"react\"\nimport { useControllableState } from \"../../hooks/use-controllable-state\"\nimport { createDescendants } from \"../../hooks/use-descendants\"\nimport { useDisclosure } from \"../../hooks/use-disclosure\"\nimport {\n ariaAttr,\n assignRef,\n createContext,\n cx,\n dataAttr,\n handlerAll,\n isArray,\n isString,\n isTruthyDataAttr,\n mergeRefs,\n noop,\n runKeyAction,\n useUpdateEffect,\n} from \"../../utils\"\n\ntype SubMenuDirection = \"end\" | \"start\"\n\ninterface MenuDescendantProps {\n id: string\n}\ntype MenuDescendant = Descendant<HTMLDivElement, MenuDescendantProps>\n\nconst {\n DescendantsContext: MenuDescendantsContext,\n useDescendant: useMenuDescendant,\n useDescendantRegister: useMenuDescendantRegister,\n useDescendants: useMenuDescendants,\n} = createDescendants<HTMLDivElement, MenuDescendantProps>()\n\nexport { MenuDescendantsContext, useMenuDescendant, useMenuDescendants }\n\ninterface MenuContext extends Pick<\n UseMenuReturn,\n | \"onActiveDescendant\"\n | \"onClose\"\n | \"onCloseSubMenu\"\n | \"onOpen\"\n | \"onSelect\"\n | \"subMenu\"\n | \"subMenuDirection\"\n> {}\n\nconst [MenuContext, useMenuContext] = createContext<MenuContext>({\n name: \"MenuContext\",\n})\n\ninterface MenuGroupContext extends Pick<UseMenuGroupReturn, \"getLabelProps\"> {}\n\nconst [MenuGroupContext, useMenuGroupContext] = createContext<MenuGroupContext>(\n {\n name: \"MenuGroupContext\",\n },\n)\n\ninterface MainMenuContext {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n onCloseRef: RefObject<() => void>\n onSelect: (value?: string, closeOnSelect?: boolean) => void\n closeOnSelect?: boolean\n}\n\nconst [MainMenuContext, useMainMenuContext] = createContext<MainMenuContext>({\n name: \"MainMenuContext\",\n strict: false,\n})\n\ninterface MenuOptionGroupContext {\n type: \"checkbox\" | \"radio\"\n value: string | string[]\n onChange?: (value: string) => void\n}\n\nconst [MenuOptionGroupContext, useMenuOptionGroupContext] =\n createContext<MenuOptionGroupContext>({\n name: \"MenuOptionGroupContext\",\n })\n\nexport {\n MainMenuContext,\n MenuContext,\n MenuGroupContext,\n MenuOptionGroupContext,\n useMainMenuContext,\n useMenuContext,\n useMenuGroupContext,\n useMenuOptionGroupContext,\n}\n\nexport interface UseMenuProps extends Omit<UseDisclosureProps, \"timing\"> {\n /**\n * If `true`, the menu item will be closed when selected.\n *\n * @default true\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The direction of the sub menu.\n *\n * @default 'end'\n */\n subMenuDirection?: SubMenuDirection\n /**\n * Callback invoked when a menu item is selected.\n */\n onSelect?: (value?: string) => void\n}\n\nexport const useMenu = ({\n closeOnSelect,\n defaultOpen,\n disabled = false,\n open: openProp,\n subMenuDirection = \"end\",\n onClose: onCloseProp,\n onOpen: onOpenProp,\n onSelect: onSelectProp,\n}: UseMenuProps = {}) => {\n const triggerId = useId()\n const contentId = useId()\n const descendants = useMenuDescendants()\n const updateRef = useRef<() => void>(noop)\n const onCloseRef = useRef<() => void>(noop)\n const contentRef = useRef<HTMLDivElement>(null)\n const { open, onClose, onOpen } = useDisclosure({\n defaultOpen,\n open: openProp,\n onClose: onCloseProp,\n onOpen: onOpenProp,\n })\n const onCloseSubMenu = useCallback(() => onCloseRef.current(), [])\n const onActiveDescendant = useCallback(\n (\n descendant?: MenuDescendant,\n options: FocusOptions = { preventScroll: true },\n ) => {\n if (!contentRef.current || !descendant || disabled) return\n\n contentRef.current.setAttribute(\"aria-activedescendant\", descendant.id)\n\n descendants.active(descendant, options)\n },\n [descendants, disabled],\n )\n const { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect } =\n useSubMenu({\n descendants,\n disabled,\n open,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onOpen,\n })\n\n closeOnSelect ??= mainCloseOnSelect ?? true\n\n const onSelect = useCallback(\n (value?: string, closeOnSelectProp = closeOnSelect) => {\n if (disabled) return\n\n onSelectProp?.(value)\n onMainSelect?.(value, closeOnSelectProp)\n\n if (!closeOnSelectProp) return\n\n onClose()\n },\n [closeOnSelect, disabled, onClose, onMainSelect, onSelectProp],\n )\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n\n if (!open) {\n onOpen()\n } else {\n onClose()\n }\n },\n [disabled, onClose, onOpen, open],\n )\n\n const onContextMenu = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n onOpen()\n updateRef.current()\n },\n [disabled, onOpen],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n\n runKeyAction(ev, {\n ArrowDown: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n ArrowUp: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n })\n },\n Enter: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n Space: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n })\n },\n [descendants, disabled, onActiveDescendant, onOpen],\n )\n\n const getTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n ...getSubMenuProps({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"button\",\n tabIndex: disabled ? -1 : 0,\n ...props,\n onClick: handlerAll(props.onClick, onClick),\n onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n }),\n }),\n [contentId, disabled, getSubMenuProps, onClick, onKeyDown, open, triggerId],\n )\n\n const getContextTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"application\",\n ...props,\n onContextMenu: handlerAll(props.onContextMenu, onContextMenu),\n }),\n [contentId, disabled, onContextMenu, open, triggerId],\n )\n\n const getContentProps: PropGetter = useCallback(\n ({ ref, \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n id: contentId,\n \"aria-labelledby\": cx(ariaLabelledby, triggerId),\n role: \"menu\",\n ...props,\n ref: mergeRefs(ref, contentRef),\n }),\n [contentId, triggerId],\n )\n\n const getSeparatorProps: PropGetter = useCallback(\n (props) => ({ role: \"separator\", ...props }),\n [],\n )\n\n return {\n closeOnSelect,\n descendants,\n open,\n subMenu,\n subMenuDirection,\n updateRef,\n getContentProps,\n getContextTriggerProps,\n getSeparatorProps,\n getTriggerProps,\n onActiveDescendant,\n onClose,\n onCloseRef,\n onCloseSubMenu,\n onOpen,\n onSelect,\n }\n}\n\nexport type UseMenuReturn = ReturnType<typeof useMenu>\n\nexport interface UseSubMenuProps extends Omit<\n Required<UseDisclosureProps>,\n \"defaultOpen\" | \"timing\"\n> {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n disabled?: boolean\n subMenuDirection?: SubMenuDirection\n}\n\nexport const useSubMenu = ({\n descendants,\n disabled = false,\n open,\n subMenuDirection = \"end\",\n onActiveDescendant,\n onClose,\n onOpen,\n}: UseSubMenuProps) => {\n const uuid = useId()\n const {\n closeOnSelect: mainCloseOnSelect,\n descendants: mainDescendants,\n onActiveDescendant: onActiveMainDescendant,\n onCloseRef,\n onSelect: onMainSelect,\n } = useMainMenuContext() ?? {}\n const subMenu = !!mainDescendants && !!onActiveMainDescendant\n const createRegister = useMenuDescendantRegister(mainDescendants)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const dataDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const dataDisabled = isTruthyDataAttr(node.getAttribute(\"data-disabled\"))\n\n return dataDisabled\n }, [])\n\n const ariaDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const ariaDisabled = isTruthyDataAttr(node.getAttribute(\"aria-disabled\"))\n\n return ariaDisabled\n }, [])\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu) return\n\n ev.defaultPrevented = disabled || dataDisabled() || ariaDisabled()\n },\n [ariaDisabled, dataDisabled, disabled, subMenu],\n )\n\n const onMouseEnter = useCallback(() => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n onOpen()\n }, [ariaDisabled, dataDisabled, disabled, onOpen, subMenu])\n\n const onMouseMove = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n const descendant = descendants.value(triggerRef.current)\n\n onActiveMainDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [\n ariaDisabled,\n dataDisabled,\n descendants,\n disabled,\n onActiveMainDescendant,\n subMenu,\n ],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (!subMenu || disabled) return\n\n const currentDescendant = open ? descendants : mainDescendants\n const onActiveCurrentDescendant = open\n ? onActiveDescendant\n : onActiveMainDescendant\n\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = currentDescendant.enabledNextValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n ArrowUp: () => {\n const descendant = currentDescendant.enabledPrevValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n End: () => {\n const descendant = currentDescendant.enabledLastValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n Home: () => {\n const descendant = currentDescendant.enabledFirstValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [subMenuDirection === \"end\" ? \"ArrowRight\" : \"ArrowLeft\"]: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n\n ev.defaultPrevented = true\n },\n })\n },\n [\n subMenu,\n disabled,\n open,\n descendants,\n mainDescendants,\n onActiveDescendant,\n onActiveMainDescendant,\n subMenuDirection,\n onOpen,\n ],\n )\n\n assignRef(onCloseRef, onClose)\n\n const getSubMenuProps: PropGetter = useCallback(\n ({ id = uuid, ref, ...props } = {}) => {\n const getDisabled = (node: HTMLDivElement) =>\n disabled || dataDisabled(node) || ariaDisabled(node)\n const register = createRegister({ id, disabled: getDisabled })\n\n return {\n role: subMenu ? \"menuitem\" : \"button\",\n ...props,\n ref: mergeRefs(ref, triggerRef, register),\n onClick: handlerAll(onClick, props.onClick),\n onKeyDown: handlerAll(onKeyDown, props.onKeyDown),\n onMouseEnter: handlerAll(onMouseEnter, props.onMouseEnter),\n onMouseMove: handlerAll(onMouseMove, props.onMouseMove),\n }\n },\n [\n uuid,\n subMenu,\n createRegister,\n onClick,\n onKeyDown,\n onMouseEnter,\n onMouseMove,\n disabled,\n dataDisabled,\n ariaDisabled,\n ],\n )\n\n return { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect }\n}\n\nexport type UseSubMenuReturn = ReturnType<typeof useSubMenu>\n\nexport interface UseMenuGroupProps extends HTMLProps {}\n\nexport const useMenuGroup = ({\n \"aria-labelledby\": ariaLabelledbyProp,\n ...rest\n}: UseMenuGroupProps) => {\n const labelId = useId()\n\n const getGroupProps: PropGetter = useCallback(\n ({ \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n \"aria-labelledby\": cx(ariaLabelledbyProp, ariaLabelledby, labelId),\n role: \"group\",\n ...rest,\n ...props,\n }),\n [ariaLabelledbyProp, labelId, rest],\n )\n\n const getLabelProps: PropGetter<\"span\"> = useCallback(\n (props) => ({ id: labelId, role: \"presentation\", ...props }),\n [labelId],\n )\n\n return { getGroupProps, getLabelProps }\n}\n\nexport type UseMenuGroupReturn = ReturnType<typeof useMenuGroup>\n\nexport interface UseMenuItemProps extends HTMLProps {\n /**\n * If `true`, the menu item will be closed when selected.\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The value of the menu item.\n */\n value?: string\n}\n\nexport const useMenuItem = ({\n id,\n \"aria-disabled\": ariaDisabled,\n \"data-disabled\": dataDisabled,\n \"data-trigger\": dataTrigger,\n closeOnSelect,\n disabled = false,\n value,\n ...rest\n}: UseMenuItemProps) => {\n const trigger = isTruthyDataAttr(dataTrigger)\n const {\n subMenu,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onCloseSubMenu,\n onSelect,\n } = useMenuContext()\n const uuid = useId()\n const itemRef = useRef<HTMLDivElement>(null)\n const subMenuTrigger = subMenu && trigger\n\n id ??= uuid\n\n const { descendants, register } = useMenuDescendant({\n id,\n disabled: disabled || subMenuTrigger,\n })\n\n const onActive = useCallback(() => {\n if (disabled) return\n\n const descendant = descendants.value(itemRef.current)\n\n onActiveDescendant(descendant)\n }, [descendants, disabled, onActiveDescendant])\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = descendants.enabledNextValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n ArrowUp: () => {\n const descendant = descendants.enabledPrevValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n End: () => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n },\n Enter: () => onSelect(value, closeOnSelect),\n Home: () => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n },\n Space: () => onSelect(value, closeOnSelect),\n [subMenuDirection === \"end\" ? \"ArrowLeft\" : \"ArrowRight\"]: () => {\n if (!subMenu) return\n\n onClose()\n\n const descendant = descendants.firstValue()\n\n descendant?.node.focus()\n },\n })\n },\n [\n closeOnSelect,\n descendants,\n onActiveDescendant,\n onClose,\n onSelect,\n subMenu,\n subMenuDirection,\n value,\n ],\n )\n\n const getItemProps: PropGetter = useCallback(\n ({ ref, ...props } = {}) => ({\n id,\n \"aria-disabled\": ariaDisabled ?? ariaAttr(disabled),\n \"data-disabled\": dataDisabled ?? dataAttr(disabled),\n role: \"menuitem\",\n tabIndex: -1,\n ...rest,\n ...props,\n ref: mergeRefs(ref, rest.ref, itemRef, register),\n onClick: handlerAll(props.onClick, rest.onClick, () =>\n onSelect(value, closeOnSelect),\n ),\n onFocus: handlerAll(props.onFocus, rest.onFocus, onActive),\n onKeyDown: handlerAll(props.onKeyDown, rest.onKeyDown, onKeyDown),\n onMouseMove: handlerAll(props.onMouseMove, rest.onMouseMove, () => {\n onCloseSubMenu()\n onActive()\n }),\n }),\n [\n id,\n ariaDisabled,\n disabled,\n dataDisabled,\n rest,\n register,\n onActive,\n onKeyDown,\n onSelect,\n value,\n closeOnSelect,\n onCloseSubMenu,\n ],\n )\n\n return {\n subMenuTrigger,\n getItemProps,\n }\n}\n\nexport type UseMenuItemReturn = ReturnType<typeof useMenuItem>\n\nexport type MenuOptionGroupType = \"checkbox\" | \"radio\"\nexport type MenuOptionGroupValue<Y extends MenuOptionGroupType> =\n Y extends \"checkbox\" ? string[] : string\n\nexport interface UseMenuOptionGroupProps<\n Y extends MenuOptionGroupType = \"checkbox\",\n M extends MenuOptionGroupValue<Y> = MenuOptionGroupValue<Y>,\n> {\n /**\n * The initial value of the menu item group.\n */\n defaultValue?: M\n /**\n * The type of the menu option group.\n */\n type?: Y\n /**\n * The value of the menu item group.\n */\n value?: M\n /**\n * The callback fired when any children checkbox is checked or unchecked.\n */\n onChange?: (value: M) => void\n}\n\nexport const useMenuOptionGroup = <\n Y extends \"checkbox\" | \"radio\" = \"checkbox\",\n M extends Y extends \"checkbox\" ? string[] : string = Y extends \"checkbox\"\n ? string[]\n : string,\n>({\n type = \"checkbox\" as Y,\n defaultValue = (type === \"checkbox\" ? [] : \"\") as M,\n value: valueProp,\n onChange: onChangeProp,\n}: UseMenuOptionGroupProps<Y, M>) => {\n const [value, setValue] = useControllableState({\n defaultValue,\n value: valueProp,\n onChange: onChangeProp,\n })\n const radio = type === \"radio\"\n\n const onChange = useCallback(\n (selectedValue: string) => {\n setValue((prev) => {\n if (radio && isString(prev)) {\n return selectedValue as M\n } else if (!radio && isArray(prev)) {\n return (\n prev.includes(selectedValue)\n ? prev.filter((value) => value !== selectedValue)\n : prev.concat(selectedValue)\n ) as M\n } else {\n return prev\n }\n })\n },\n [radio, setValue],\n )\n\n useUpdateEffect(() => {\n setValue(valueProp!)\n }, [valueProp])\n\n return {\n type,\n value,\n onChange,\n }\n}\n\nexport type UseMenuOptionGroupReturn = ReturnType<typeof useMenuOptionGroup>\n\nexport interface UseMenuOptionItemProps extends UseMenuItemProps {\n /**\n * The value of the menu option item.\n */\n value: string\n}\n\nexport const useMenuOptionItem = ({\n disabled,\n value,\n ...rest\n}: UseMenuOptionItemProps) => {\n const { type, value: selectedValue, onChange } = useMenuOptionGroupContext()\n const { getItemProps } = useMenuItem({ disabled, value, ...rest })\n const radio = type === \"radio\" && isString(selectedValue)\n const checkbox = type === \"checkbox\" && isArray(selectedValue)\n const selected = radio\n ? value === selectedValue\n : checkbox\n ? selectedValue.includes(value)\n : false\n\n const getIndicatorProps: PropGetter = useCallback(\n ({ style, ...props } = {}) => ({\n style: { opacity: selected ? 1 : 0, ...style },\n ...props,\n }),\n [selected],\n )\n\n const getOptionItemProps: PropGetter = useCallback(\n (props = {}) =>\n getItemProps({\n role: radio ? \"menuitemradio\" : \"menuitemcheckbox\",\n ...props,\n onClick: handlerAll(props.onClick, () =>\n !disabled ? onChange?.(value) : noop,\n ),\n }),\n [disabled, getItemProps, onChange, radio, value],\n )\n\n return {\n type,\n selected,\n getIndicatorProps,\n getOptionItemProps,\n }\n}\n\nexport type UseMenuOptionItemReturn = ReturnType<typeof useMenuOptionItem>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-menu.js","names":["createContext","noop","getTriggerProps: PropGetter","getContextTriggerProps: PropGetter","getContentProps: PropGetter","getSeparatorProps: PropGetter","value"],"sources":["../../../../src/components/menu/use-menu.ts"],"sourcesContent":["\"use client\"\n\nimport type { KeyboardEvent, MouseEvent, RefObject } from \"react\"\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport type { Descendant, Descendants } from \"../../hooks/use-descendants\"\nimport type { UseDisclosureProps } from \"../../hooks/use-disclosure\"\nimport { useCallback, useId, useRef } from \"react\"\nimport { mergeProps } from \"../../core\"\nimport { useControllableState } from \"../../hooks/use-controllable-state\"\nimport { createDescendants } from \"../../hooks/use-descendants\"\nimport { useDisclosure } from \"../../hooks/use-disclosure\"\nimport {\n ariaAttr,\n assignRef,\n createContext,\n cx,\n dataAttr,\n handlerAll,\n isArray,\n isString,\n isTruthyDataAttr,\n mergeRefs,\n noop,\n runKeyAction,\n useUpdateEffect,\n} from \"../../utils\"\n\ntype SubMenuDirection = \"end\" | \"start\"\n\ninterface MenuDescendantProps {\n id: string\n}\ntype MenuDescendant = Descendant<HTMLDivElement, MenuDescendantProps>\n\nconst {\n DescendantsContext: MenuDescendantsContext,\n useDescendant: useMenuDescendant,\n useDescendantRegister: useMenuDescendantRegister,\n useDescendants: useMenuDescendants,\n} = createDescendants<HTMLDivElement, MenuDescendantProps>()\n\nexport { MenuDescendantsContext, useMenuDescendant, useMenuDescendants }\n\ninterface MenuContext extends Pick<\n UseMenuReturn,\n | \"onActiveDescendant\"\n | \"onClose\"\n | \"onCloseSubMenu\"\n | \"onOpen\"\n | \"onSelect\"\n | \"subMenu\"\n | \"subMenuDirection\"\n> {}\n\nconst [MenuContext, useMenuContext] = createContext<MenuContext>({\n name: \"MenuContext\",\n})\n\ninterface MenuGroupContext extends Pick<UseMenuGroupReturn, \"getLabelProps\"> {}\n\nconst [MenuGroupContext, useMenuGroupContext] = createContext<MenuGroupContext>(\n {\n name: \"MenuGroupContext\",\n },\n)\n\ninterface MainMenuContext {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n onCloseRef: RefObject<() => void>\n onSelect: (value?: string, closeOnSelect?: boolean) => void\n closeOnSelect?: boolean\n}\n\nconst [MainMenuContext, useMainMenuContext] = createContext<MainMenuContext>({\n name: \"MainMenuContext\",\n strict: false,\n})\n\ninterface MenuOptionGroupContext {\n type: \"checkbox\" | \"radio\"\n value: string | string[]\n onChange?: (value: string) => void\n}\n\nconst [MenuOptionGroupContext, useMenuOptionGroupContext] =\n createContext<MenuOptionGroupContext>({\n name: \"MenuOptionGroupContext\",\n })\n\nexport {\n MainMenuContext,\n MenuContext,\n MenuGroupContext,\n MenuOptionGroupContext,\n useMainMenuContext,\n useMenuContext,\n useMenuGroupContext,\n useMenuOptionGroupContext,\n}\n\nexport interface UseMenuProps extends Omit<UseDisclosureProps, \"timing\"> {\n /**\n * If `true`, the menu item will be closed when selected.\n *\n * @default true\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The direction of the sub menu.\n *\n * @default 'end'\n */\n subMenuDirection?: SubMenuDirection\n /**\n * Callback invoked when a menu item is selected.\n */\n onSelect?: (value?: string) => void\n}\n\nexport const useMenu = ({\n closeOnSelect,\n defaultOpen,\n disabled = false,\n open: openProp,\n subMenuDirection = \"end\",\n onClose: onCloseProp,\n onOpen: onOpenProp,\n onSelect: onSelectProp,\n}: UseMenuProps = {}) => {\n const triggerId = useId()\n const contentId = useId()\n const descendants = useMenuDescendants()\n const updateRef = useRef<() => void>(noop)\n const onCloseRef = useRef<() => void>(noop)\n const contentRef = useRef<HTMLDivElement>(null)\n const { open, onClose, onOpen } = useDisclosure({\n defaultOpen,\n open: openProp,\n onClose: onCloseProp,\n onOpen: onOpenProp,\n })\n const onCloseSubMenu = useCallback(() => onCloseRef.current(), [])\n const onActiveDescendant = useCallback(\n (\n descendant?: MenuDescendant,\n options: FocusOptions = { preventScroll: true },\n ) => {\n if (!contentRef.current || !descendant || disabled) return\n\n contentRef.current.setAttribute(\"aria-activedescendant\", descendant.id)\n\n descendants.active(descendant, options)\n },\n [descendants, disabled],\n )\n const { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect } =\n useSubMenu({\n descendants,\n disabled,\n open,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onOpen,\n })\n\n closeOnSelect ??= mainCloseOnSelect ?? true\n\n const onSelect = useCallback(\n (value?: string, closeOnSelectProp = closeOnSelect) => {\n if (disabled) return\n\n onSelectProp?.(value)\n onMainSelect?.(value, closeOnSelectProp)\n\n if (!closeOnSelectProp) return\n\n onClose()\n },\n [closeOnSelect, disabled, onClose, onMainSelect, onSelectProp],\n )\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n\n if (!open) {\n onOpen()\n } else {\n onClose()\n }\n },\n [disabled, onClose, onOpen, open],\n )\n\n const onContextMenu = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n\n ev.preventDefault()\n onOpen()\n updateRef.current()\n },\n [disabled, onOpen],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n\n runKeyAction(ev, {\n ArrowDown: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n ArrowUp: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n })\n },\n Enter: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n Space: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n },\n })\n },\n [descendants, disabled, onActiveDescendant, onOpen],\n )\n\n const getTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n ...getSubMenuProps({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"button\",\n tabIndex: disabled ? -1 : 0,\n ...props,\n onClick: handlerAll(props.onClick, onClick),\n onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n }),\n }),\n [contentId, disabled, getSubMenuProps, onClick, onKeyDown, open, triggerId],\n )\n\n const getContextTriggerProps: PropGetter = useCallback(\n (props = {}) => ({\n id: triggerId,\n \"aria-controls\": open ? contentId : undefined,\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-trigger\": dataAttr(true),\n role: \"application\",\n ...props,\n onContextMenu: handlerAll(props.onContextMenu, onContextMenu),\n }),\n [contentId, disabled, onContextMenu, open, triggerId],\n )\n\n const getContentProps: PropGetter = useCallback(\n ({ ref, \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n id: contentId,\n \"aria-labelledby\": cx(ariaLabelledby, triggerId),\n role: \"menu\",\n ...props,\n ref: mergeRefs(ref, contentRef),\n }),\n [contentId, triggerId],\n )\n\n const getSeparatorProps: PropGetter = useCallback(\n (props) => ({ role: \"separator\", ...props }),\n [],\n )\n\n return {\n closeOnSelect,\n descendants,\n open,\n subMenu,\n subMenuDirection,\n updateRef,\n getContentProps,\n getContextTriggerProps,\n getSeparatorProps,\n getTriggerProps,\n onActiveDescendant,\n onClose,\n onCloseRef,\n onCloseSubMenu,\n onOpen,\n onSelect,\n }\n}\n\nexport type UseMenuReturn = ReturnType<typeof useMenu>\n\nexport interface UseSubMenuProps extends Omit<\n Required<UseDisclosureProps>,\n \"defaultOpen\" | \"timing\"\n> {\n descendants: Descendants<HTMLDivElement, MenuDescendantProps>\n onActiveDescendant: (descendant?: MenuDescendant) => void\n disabled?: boolean\n subMenuDirection?: SubMenuDirection\n}\n\nexport const useSubMenu = ({\n descendants,\n disabled = false,\n open,\n subMenuDirection = \"end\",\n onActiveDescendant,\n onClose,\n onOpen,\n}: UseSubMenuProps) => {\n const uuid = useId()\n const {\n closeOnSelect: mainCloseOnSelect,\n descendants: mainDescendants,\n onActiveDescendant: onActiveMainDescendant,\n onCloseRef,\n onSelect: onMainSelect,\n } = useMainMenuContext() ?? {}\n const subMenu = !!mainDescendants && !!onActiveMainDescendant\n const createRegister = useMenuDescendantRegister(mainDescendants)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const dataDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const dataDisabled = isTruthyDataAttr(node.getAttribute(\"data-disabled\"))\n\n return dataDisabled\n }, [])\n\n const ariaDisabled = useCallback((node?: HTMLDivElement | null) => {\n node ??= triggerRef.current\n\n if (!node) return false\n\n const ariaDisabled = isTruthyDataAttr(node.getAttribute(\"aria-disabled\"))\n\n return ariaDisabled\n }, [])\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu) return\n\n ev.defaultPrevented = disabled || dataDisabled() || ariaDisabled()\n },\n [ariaDisabled, dataDisabled, disabled, subMenu],\n )\n\n const onMouseEnter = useCallback(() => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n onOpen()\n }, [ariaDisabled, dataDisabled, disabled, onOpen, subMenu])\n\n const onMouseMove = useCallback(\n (ev: MouseEvent<HTMLDivElement>) => {\n if (!subMenu || disabled || dataDisabled() || ariaDisabled()) return\n\n const descendant = descendants.value(triggerRef.current)\n\n onActiveMainDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [\n ariaDisabled,\n dataDisabled,\n descendants,\n disabled,\n onActiveMainDescendant,\n subMenu,\n ],\n )\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n if (!subMenu || disabled) return\n\n const currentDescendant = open ? descendants : mainDescendants\n const onActiveCurrentDescendant = open\n ? onActiveDescendant\n : onActiveMainDescendant\n\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = currentDescendant.enabledNextValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n ArrowUp: () => {\n const descendant = currentDescendant.enabledPrevValue(\n triggerRef.current,\n )\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n End: () => {\n const descendant = currentDescendant.enabledLastValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n Home: () => {\n const descendant = currentDescendant.enabledFirstValue()\n\n onActiveCurrentDescendant(descendant)\n\n ev.defaultPrevented = true\n },\n [subMenuDirection === \"end\" ? \"ArrowRight\" : \"ArrowLeft\"]: () => {\n onOpen()\n\n setTimeout(() => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n })\n\n ev.defaultPrevented = true\n },\n })\n },\n [\n subMenu,\n disabled,\n open,\n descendants,\n mainDescendants,\n onActiveDescendant,\n onActiveMainDescendant,\n subMenuDirection,\n onOpen,\n ],\n )\n\n assignRef(onCloseRef, onClose)\n\n const getSubMenuProps: PropGetter = useCallback(\n ({ id = uuid, ref, ...props } = {}) => {\n const getDisabled = (node: HTMLDivElement) =>\n disabled || dataDisabled(node) || ariaDisabled(node)\n const register = createRegister({ id, disabled: getDisabled })\n\n return {\n role: subMenu ? \"menuitem\" : \"button\",\n ...props,\n ref: mergeRefs(ref, triggerRef, register),\n onClick: handlerAll(onClick, props.onClick),\n onKeyDown: handlerAll(onKeyDown, props.onKeyDown),\n onMouseEnter: handlerAll(onMouseEnter, props.onMouseEnter),\n onMouseMove: handlerAll(onMouseMove, props.onMouseMove),\n }\n },\n [\n uuid,\n subMenu,\n createRegister,\n onClick,\n onKeyDown,\n onMouseEnter,\n onMouseMove,\n disabled,\n dataDisabled,\n ariaDisabled,\n ],\n )\n\n return { mainCloseOnSelect, subMenu, getSubMenuProps, onMainSelect }\n}\n\nexport type UseSubMenuReturn = ReturnType<typeof useSubMenu>\n\nexport interface UseMenuGroupProps extends HTMLProps {}\n\nexport const useMenuGroup = ({\n \"aria-labelledby\": ariaLabelledbyProp,\n ...rest\n}: UseMenuGroupProps) => {\n const labelId = useId()\n\n const getGroupProps: PropGetter = useCallback(\n ({ \"aria-labelledby\": ariaLabelledby, ...props } = {}) =>\n mergeProps(\n {\n \"aria-labelledby\": cx(ariaLabelledbyProp, ariaLabelledby, labelId),\n role: \"group\",\n },\n rest,\n props,\n )(),\n [ariaLabelledbyProp, labelId, rest],\n )\n\n const getLabelProps: PropGetter<\"span\"> = useCallback(\n (props) => ({ id: labelId, role: \"presentation\", ...props }),\n [labelId],\n )\n\n return { getGroupProps, getLabelProps }\n}\n\nexport type UseMenuGroupReturn = ReturnType<typeof useMenuGroup>\n\nexport interface UseMenuItemProps extends HTMLProps {\n /**\n * If `true`, the menu item will be closed when selected.\n */\n closeOnSelect?: boolean\n /**\n * If `true`, the menu item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * The value of the menu item.\n */\n value?: string\n}\n\nexport const useMenuItem = ({\n id,\n \"aria-disabled\": ariaDisabled,\n \"data-disabled\": dataDisabled,\n \"data-trigger\": dataTrigger,\n closeOnSelect,\n disabled = false,\n value,\n ...rest\n}: UseMenuItemProps) => {\n const trigger = isTruthyDataAttr(dataTrigger)\n const {\n subMenu,\n subMenuDirection,\n onActiveDescendant,\n onClose,\n onCloseSubMenu,\n onSelect,\n } = useMenuContext()\n const uuid = useId()\n const itemRef = useRef<HTMLDivElement>(null)\n const subMenuTrigger = subMenu && trigger\n\n id ??= uuid\n\n const { descendants, register } = useMenuDescendant({\n id,\n disabled: disabled || subMenuTrigger,\n })\n\n const onActive = useCallback(() => {\n if (disabled) return\n\n const descendant = descendants.value(itemRef.current)\n\n onActiveDescendant(descendant)\n }, [descendants, disabled, onActiveDescendant])\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLDivElement>) => {\n runKeyAction(ev, {\n ArrowDown: () => {\n const descendant = descendants.enabledNextValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n ArrowUp: () => {\n const descendant = descendants.enabledPrevValue(itemRef.current)\n\n onActiveDescendant(descendant)\n },\n End: () => {\n const descendant = descendants.enabledLastValue()\n\n onActiveDescendant(descendant)\n },\n Enter: () => onSelect(value, closeOnSelect),\n Home: () => {\n const descendant = descendants.enabledFirstValue()\n\n onActiveDescendant(descendant)\n },\n Space: () => onSelect(value, closeOnSelect),\n [subMenuDirection === \"end\" ? \"ArrowLeft\" : \"ArrowRight\"]: () => {\n if (!subMenu) return\n\n onClose()\n\n const descendant = descendants.firstValue()\n\n descendant?.node.focus()\n },\n })\n },\n [\n closeOnSelect,\n descendants,\n onActiveDescendant,\n onClose,\n onSelect,\n subMenu,\n subMenuDirection,\n value,\n ],\n )\n\n const getItemProps: PropGetter = useCallback(\n ({ ref, ...props } = {}) => {\n const {\n onClick: restOnClick,\n onFocus: restOnFocus,\n onKeyDown: restOnKeyDown,\n onMouseMove: restOnMouseMove,\n ...restProps\n } = rest\n const {\n onClick: propsOnClick,\n onFocus: propsOnFocus,\n onKeyDown: propsOnKeyDown,\n onMouseMove: propsOnMouseMove,\n ...itemProps\n } = props\n\n return mergeProps(\n {\n id,\n \"aria-disabled\": ariaDisabled ?? ariaAttr(disabled),\n \"data-disabled\": dataDisabled ?? dataAttr(disabled),\n role: \"menuitem\",\n tabIndex: -1,\n },\n restProps,\n itemProps,\n {\n ref: mergeRefs(ref, itemRef, register),\n onClick: handlerAll(propsOnClick, restOnClick, () =>\n onSelect(value, closeOnSelect),\n ),\n onFocus: handlerAll(propsOnFocus, restOnFocus, onActive),\n onKeyDown: handlerAll(propsOnKeyDown, restOnKeyDown, onKeyDown),\n onMouseMove: handlerAll(propsOnMouseMove, restOnMouseMove, () => {\n onCloseSubMenu()\n onActive()\n }),\n },\n )()\n },\n [\n id,\n ariaDisabled,\n disabled,\n dataDisabled,\n rest,\n register,\n onActive,\n onKeyDown,\n onSelect,\n value,\n closeOnSelect,\n onCloseSubMenu,\n ],\n )\n\n return {\n subMenuTrigger,\n getItemProps,\n }\n}\n\nexport type UseMenuItemReturn = ReturnType<typeof useMenuItem>\n\nexport type MenuOptionGroupType = \"checkbox\" | \"radio\"\nexport type MenuOptionGroupValue<Y extends MenuOptionGroupType> =\n Y extends \"checkbox\" ? string[] : string\n\nexport interface UseMenuOptionGroupProps<\n Y extends MenuOptionGroupType = \"checkbox\",\n M extends MenuOptionGroupValue<Y> = MenuOptionGroupValue<Y>,\n> {\n /**\n * The initial value of the menu item group.\n */\n defaultValue?: M\n /**\n * The type of the menu option group.\n */\n type?: Y\n /**\n * The value of the menu item group.\n */\n value?: M\n /**\n * The callback fired when any children checkbox is checked or unchecked.\n */\n onChange?: (value: M) => void\n}\n\nexport const useMenuOptionGroup = <\n Y extends \"checkbox\" | \"radio\" = \"checkbox\",\n M extends Y extends \"checkbox\" ? string[] : string = Y extends \"checkbox\"\n ? string[]\n : string,\n>({\n type = \"checkbox\" as Y,\n defaultValue = (type === \"checkbox\" ? [] : \"\") as M,\n value: valueProp,\n onChange: onChangeProp,\n}: UseMenuOptionGroupProps<Y, M>) => {\n const [value, setValue] = useControllableState({\n defaultValue,\n value: valueProp,\n onChange: onChangeProp,\n })\n const radio = type === \"radio\"\n\n const onChange = useCallback(\n (selectedValue: string) => {\n setValue((prev) => {\n if (radio && isString(prev)) {\n return selectedValue as M\n } else if (!radio && isArray(prev)) {\n return (\n prev.includes(selectedValue)\n ? prev.filter((value) => value !== selectedValue)\n : prev.concat(selectedValue)\n ) as M\n } else {\n return prev\n }\n })\n },\n [radio, setValue],\n )\n\n useUpdateEffect(() => {\n setValue(valueProp!)\n }, [valueProp])\n\n return {\n type,\n value,\n onChange,\n }\n}\n\nexport type UseMenuOptionGroupReturn = ReturnType<typeof useMenuOptionGroup>\n\nexport interface UseMenuOptionItemProps extends UseMenuItemProps {\n /**\n * The value of the menu option item.\n */\n value: string\n}\n\nexport const useMenuOptionItem = ({\n disabled,\n value,\n ...rest\n}: UseMenuOptionItemProps) => {\n const { type, value: selectedValue, onChange } = useMenuOptionGroupContext()\n const { getItemProps } = useMenuItem({ disabled, value, ...rest })\n const radio = type === \"radio\" && isString(selectedValue)\n const checkbox = type === \"checkbox\" && isArray(selectedValue)\n const selected = radio\n ? value === selectedValue\n : checkbox\n ? selectedValue.includes(value)\n : false\n\n const getIndicatorProps: PropGetter = useCallback(\n ({ style, ...props } = {}) => ({\n style: { opacity: selected ? 1 : 0, ...style },\n ...props,\n }),\n [selected],\n )\n\n const getOptionItemProps: PropGetter = useCallback(\n (props = {}) =>\n getItemProps({\n role: radio ? \"menuitemradio\" : \"menuitemcheckbox\",\n ...props,\n onClick: handlerAll(props.onClick, () =>\n !disabled ? onChange?.(value) : noop,\n ),\n }),\n [disabled, getItemProps, onChange, radio, value],\n )\n\n return {\n type,\n selected,\n getIndicatorProps,\n getOptionItemProps,\n }\n}\n\nexport type UseMenuOptionItemReturn = ReturnType<typeof useMenuOptionItem>\n"],"mappings":"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"}
|
|
@@ -3,17 +3,16 @@
|
|
|
3
3
|
import { createContext as createContext$1 } from "../../utils/context.js";
|
|
4
4
|
import { mergeRefs } from "../../utils/ref.js";
|
|
5
5
|
import { utils_exports } from "../../utils/index.js";
|
|
6
|
+
import { mergeProps } from "../../core/components/props.js";
|
|
7
|
+
import "../../core/index.js";
|
|
6
8
|
import { useCallback, useId } from "react";
|
|
7
9
|
|
|
8
10
|
//#region src/components/native-accordion/use-native-accordion.ts
|
|
9
11
|
const [NativeAccordionContext, useNativeAccordionContext] = createContext$1({ name: "NativeAccordionContext" });
|
|
10
12
|
const useNativeAccordion = ({ name, multiple = false, ...rest } = {}) => {
|
|
11
13
|
const generatedName = useId();
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
...rest,
|
|
15
|
-
ref: mergeRefs(ref, rest.ref)
|
|
16
|
-
});
|
|
14
|
+
const { ref: restRef, ...restProps } = rest;
|
|
15
|
+
const getRootProps = ({ ref, ...props } = {}) => mergeProps(props, restProps, { ref: mergeRefs(ref, restRef) })();
|
|
17
16
|
return {
|
|
18
17
|
name: multiple ? void 0 : name ?? generatedName,
|
|
19
18
|
getRootProps
|
|
@@ -21,13 +20,11 @@ const useNativeAccordion = ({ name, multiple = false, ...rest } = {}) => {
|
|
|
21
20
|
};
|
|
22
21
|
const useNativeAccordionItem = ({ disabled, ...rest }) => {
|
|
23
22
|
const { name } = useNativeAccordionContext();
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
name: props.name ??
|
|
27
|
-
"data-group": ""
|
|
28
|
-
|
|
29
|
-
...props
|
|
30
|
-
});
|
|
23
|
+
const { ref: restRef, ...restProps } = rest;
|
|
24
|
+
const getItemProps = ({ ref, ...props } = {}) => mergeProps({
|
|
25
|
+
name: props.name ?? restProps.name ?? name,
|
|
26
|
+
"data-group": ""
|
|
27
|
+
}, restProps, props, { ref: mergeRefs(ref, restRef) })();
|
|
31
28
|
const getButtonProps = useCallback((props = {}) => ({
|
|
32
29
|
"aria-disabled": (0, utils_exports.ariaAttr)(disabled),
|
|
33
30
|
"data-disabled": (0, utils_exports.dataAttr)(disabled),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-native-accordion.js","names":["createContext","getRootProps: PropGetter","getItemProps: PropGetter<\"details\">","getButtonProps: PropGetter<\"summary\">","getPanelProps: PropGetter"],"sources":["../../../../src/components/native-accordion/use-native-accordion.ts"],"sourcesContent":["\"use client\"\n\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport { useCallback, useId } from \"react\"\nimport {\n ariaAttr,\n createContext,\n dataAttr,\n handlerAll,\n mergeRefs,\n} from \"../../utils\"\n\ninterface NativeAccordionContext extends Pick<\n UseNativeAccordionReturn,\n \"name\"\n> {}\n\nconst [NativeAccordionContext, useNativeAccordionContext] =\n createContext<NativeAccordionContext>({\n name: \"NativeAccordionContext\",\n })\n\nexport { NativeAccordionContext, useNativeAccordionContext }\n\nexport interface UseNativeAccordionProps extends HTMLProps {\n /**\n * If `true`, multiple accordion items can be expanded at once.\n *\n * @default false\n */\n multiple?: boolean\n /**\n * The HTML `name` attribute used for forms.\n */\n name?: string\n}\n\nexport const useNativeAccordion = ({\n name,\n multiple = false,\n ...rest\n}: UseNativeAccordionProps = {}) => {\n const generatedName = useId()\n\n const getRootProps: PropGetter = ({ ref, ...props } = {})
|
|
1
|
+
{"version":3,"file":"use-native-accordion.js","names":["createContext","getRootProps: PropGetter","getItemProps: PropGetter<\"details\">","getButtonProps: PropGetter<\"summary\">","getPanelProps: PropGetter"],"sources":["../../../../src/components/native-accordion/use-native-accordion.ts"],"sourcesContent":["\"use client\"\n\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport { useCallback, useId } from \"react\"\nimport { mergeProps } from \"../../core\"\nimport {\n ariaAttr,\n createContext,\n dataAttr,\n handlerAll,\n mergeRefs,\n} from \"../../utils\"\n\ninterface NativeAccordionContext extends Pick<\n UseNativeAccordionReturn,\n \"name\"\n> {}\n\nconst [NativeAccordionContext, useNativeAccordionContext] =\n createContext<NativeAccordionContext>({\n name: \"NativeAccordionContext\",\n })\n\nexport { NativeAccordionContext, useNativeAccordionContext }\n\nexport interface UseNativeAccordionProps extends HTMLProps {\n /**\n * If `true`, multiple accordion items can be expanded at once.\n *\n * @default false\n */\n multiple?: boolean\n /**\n * The HTML `name` attribute used for forms.\n */\n name?: string\n}\n\nexport const useNativeAccordion = ({\n name,\n multiple = false,\n ...rest\n}: UseNativeAccordionProps = {}) => {\n const generatedName = useId()\n const { ref: restRef, ...restProps } = rest\n\n const getRootProps: PropGetter = ({ ref, ...props } = {}) =>\n mergeProps(props, restProps, {\n ref: mergeRefs(ref, restRef),\n })()\n\n return {\n name: multiple ? undefined : (name ?? generatedName),\n getRootProps,\n }\n}\n\nexport type UseNativeAccordionReturn = ReturnType<typeof useNativeAccordion>\n\nexport interface UseNativeAccordionItemProps extends HTMLProps<\"details\"> {\n /**\n * If `true`, the accordion item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n}\n\nexport const useNativeAccordionItem = ({\n disabled,\n ...rest\n}: UseNativeAccordionItemProps) => {\n const { name } = useNativeAccordionContext()\n const { ref: restRef, ...restProps } = rest\n\n const getItemProps: PropGetter<\"details\"> = ({ ref, ...props } = {}) =>\n mergeProps(\n {\n name: props.name ?? restProps.name ?? name,\n \"data-group\": \"\",\n },\n restProps,\n props,\n {\n ref: mergeRefs(ref, restRef),\n },\n )()\n\n const getButtonProps: PropGetter<\"summary\"> = useCallback(\n (props = {}) => ({\n \"aria-disabled\": ariaAttr(disabled),\n \"data-disabled\": dataAttr(disabled),\n ...props,\n onClick: handlerAll(props.onClick, (ev) => {\n if (!disabled) return\n\n ev.preventDefault()\n }),\n }),\n [disabled],\n )\n\n const getPanelProps: PropGetter = useCallback((props = {}) => props, [])\n\n const getIconProps: PropGetter<\"svg\"> = useCallback(\n (props = {}) => ({\n \"aria-disabled\": ariaAttr(disabled),\n \"aria-hidden\": true,\n role: \"presentation\",\n ...props,\n }),\n [disabled],\n )\n\n return {\n disabled,\n getButtonProps,\n getIconProps,\n getItemProps,\n getPanelProps,\n }\n}\n\nexport type UseNativeAccordionItemReturn = ReturnType<\n typeof useNativeAccordionItem\n>\n"],"mappings":";;;;;;;;;;AAkBA,MAAM,CAAC,wBAAwB,6BAC7BA,gBAAsC,EACpC,MAAM,0BACP,CAAC;AAiBJ,MAAa,sBAAsB,EACjC,MACA,WAAW,OACX,GAAG,SACwB,EAAE,KAAK;CAClC,MAAM,gBAAgB,OAAO;CAC7B,MAAM,EAAE,KAAK,SAAS,GAAG,cAAc;CAEvC,MAAMC,gBAA4B,EAAE,KAAK,GAAG,UAAU,EAAE,KACtD,WAAW,OAAO,WAAW,EAC3B,KAAK,UAAU,KAAK,QAAQ,EAC7B,CAAC,EAAE;AAEN,QAAO;EACL,MAAM,WAAW,SAAa,QAAQ;EACtC;EACD;;AAcH,MAAa,0BAA0B,EACrC,UACA,GAAG,WAC8B;CACjC,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,EAAE,KAAK,SAAS,GAAG,cAAc;CAEvC,MAAMC,gBAAuC,EAAE,KAAK,GAAG,UAAU,EAAE,KACjE,WACE;EACE,MAAM,MAAM,QAAQ,UAAU,QAAQ;EACtC,cAAc;EACf,EACD,WACA,OACA,EACE,KAAK,UAAU,KAAK,QAAQ,EAC7B,CACF,EAAE;CAEL,MAAMC,iBAAwC,aAC3C,QAAQ,EAAE,MAAM;EACf,6CAA0B,SAAS;EACnC,6CAA0B,SAAS;EACnC,GAAG;EACH,uCAAoB,MAAM,UAAU,OAAO;AACzC,OAAI,CAAC,SAAU;AAEf,MAAG,gBAAgB;IACnB;EACH,GACD,CAAC,SAAS,CACX;CAED,MAAMC,gBAA4B,aAAa,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;AAYxE,QAAO;EACL;EACA;EACA,cAbsC,aACrC,QAAQ,EAAE,MAAM;GACf,6CAA0B,SAAS;GACnC,eAAe;GACf,MAAM;GACN,GAAG;GACJ,GACD,CAAC,SAAS,CACX;EAMC;EACA;EACD"}
|
|
@@ -9,7 +9,7 @@ import "../collapse/index.js";
|
|
|
9
9
|
import "../../index.js";
|
|
10
10
|
import { AccordionStyle } from "./accordion.style.js";
|
|
11
11
|
import { UseAccordionItemProps, UseAccordionProps } from "./use-accordion.js";
|
|
12
|
-
import * as
|
|
12
|
+
import * as react823 from "react";
|
|
13
13
|
|
|
14
14
|
//#region src/components/accordion/accordion.d.ts
|
|
15
15
|
interface AccordionCallBackProps {
|
|
@@ -33,7 +33,7 @@ interface AccordionRootProps extends Omit<HTMLStyledProps, "onChange">, ThemePro
|
|
|
33
33
|
*/
|
|
34
34
|
items?: AccordionItem[];
|
|
35
35
|
}
|
|
36
|
-
declare const AccordionPropsContext:
|
|
36
|
+
declare const AccordionPropsContext: react823.Context<Partial<AccordionRootProps> | undefined>, useAccordionPropsContext: () => Partial<AccordionRootProps> | undefined;
|
|
37
37
|
/**
|
|
38
38
|
* `Accordion` is a component for a list that displays information in an expandable or collapsible manner.
|
|
39
39
|
*
|