@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
156 lines (152 loc) • 6.05 kB
JavaScript
"use client";
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
const require_context = require('../../utils/context.cjs');
const require_dom = require('../../utils/dom.cjs');
const require_ref = require('../../utils/ref.cjs');
const require_utils_index = require('../../utils/index.cjs');
const require_hooks_use_controllable_state_index = require('../../hooks/use-controllable-state/index.cjs');
const require_hooks_use_descendants_index = require('../../hooks/use-descendants/index.cjs');
let react = require("react");
react = require_rolldown_runtime.__toESM(react);
//#region src/components/accordion/use-accordion.ts
const { DescendantsContext: AccordionDescendantsContext, useDescendant: useAccordionDescendant, useDescendants: useAccordionDescendants } = require_hooks_use_descendants_index.createDescendants();
const [AccordionContext, useAccordionContext] = require_context.createContext({ name: "AccordionContext" });
const [AccordionItemContext, useAccordionItemContext] = require_context.createContext({ name: "AccordionItemContext" });
const useAccordion = ({ defaultIndex: defaultIndexProp, index: indexProp, multiple, toggle, onChange,...rest } = {}) => {
if ((indexProp || defaultIndexProp) != null && !(0, require_utils_index.utils_exports.isArray)(indexProp || defaultIndexProp) && multiple) console.warn(`Accordion: If 'multiple' is passed, then 'index' or 'defaultIndex' must be an array.`);
if (multiple && toggle) console.warn(`Accordion: If 'multiple' is passed, 'toggle' will be ignored. Either remove 'toggle' or 'multiple' depending on whether you want multiple accordions visible or not`);
const descendants = useAccordionDescendants();
const [focusedIndex, setFocusedIndex] = (0, react.useState)(-1);
const [index, setIndex] = require_hooks_use_controllable_state_index.useControllableState({
defaultValue: () => multiple ? defaultIndexProp ?? [] : defaultIndexProp ?? -1,
value: indexProp,
onChange
});
const getRootProps = (0, react.useCallback)(({ ref,...props } = {}) => ({
...props,
...rest,
ref: require_ref.mergeRefs(ref, rest.ref)
}), [rest]);
(0, react.useEffect)(() => {
return () => setFocusedIndex(-1);
}, []);
return {
descendants,
focusedIndex,
index,
multiple,
setFocusedIndex,
setIndex,
toggle,
getRootProps
};
};
const useAccordionItem = ({ disabled, index,...rest }) => {
const itemId = (0, react.useId)();
const panelId = (0, react.useId)();
const { index: selectedIndex, multiple, setFocusedIndex, setIndex, toggle } = useAccordionContext();
const { descendants, register } = useAccordionDescendant({ disabled });
const open = index !== -1 ? (0, require_utils_index.utils_exports.isArray)(selectedIndex) ? selectedIndex.includes(index) : selectedIndex === index : false;
if (open && disabled) console.warn(`Accordion: Cannot open a disabled accordion item`);
const onChange = (0, react.useCallback)((open$1) => {
if (index === -1) return;
if (multiple && (0, require_utils_index.utils_exports.isArray)(selectedIndex)) setIndex(open$1 ? selectedIndex.concat(index) : selectedIndex.filter((i) => i !== index));
else if (open$1) setIndex(index);
else if (toggle) setIndex(-1);
}, [
multiple,
toggle,
index,
selectedIndex,
setIndex
]);
const onFocus = (0, react.useCallback)(() => {
setFocusedIndex(index);
}, [setFocusedIndex, index]);
const onClick = (0, react.useCallback)(() => {
onChange(!open);
setFocusedIndex(index);
}, [
index,
setFocusedIndex,
open,
onChange
]);
const onKeyDown = (0, react.useCallback)((ev) => {
require_dom.runKeyAction(ev, {
ArrowDown: () => {
descendants.enabledNextValue(index)?.node.focus();
},
ArrowUp: () => {
descendants.enabledPrevValue(index)?.node.focus();
},
End: () => {
descendants.enabledLastValue()?.node.focus();
},
Home: () => {
descendants.enabledFirstValue()?.node.focus();
}
});
}, [descendants, index]);
const getItemProps = (0, react.useCallback)(({ ref,...props } = {}) => ({
"data-expanded": (0, require_utils_index.utils_exports.dataAttr)(open),
...props,
...rest,
ref: require_ref.mergeRefs(ref, rest.ref)
}), [open, rest]);
const getButtonProps = (0, react.useCallback)(({ ref,...props } = {}) => ({
id: itemId,
type: "button",
"aria-controls": panelId,
"aria-disabled": (0, require_utils_index.utils_exports.ariaAttr)(!multiple && !toggle && open || disabled),
"aria-expanded": open,
...props,
ref: require_ref.mergeRefs(register, ref),
disabled,
onClick: (0, require_utils_index.utils_exports.handlerAll)(props.onClick, onClick),
onFocus: (0, require_utils_index.utils_exports.handlerAll)(props.onFocus, onFocus),
onKeyDown: (0, require_utils_index.utils_exports.handlerAll)(props.onKeyDown, onKeyDown)
}), [
itemId,
open,
panelId,
multiple,
toggle,
disabled,
register,
onClick,
onFocus,
onKeyDown
]);
const getPanelProps = (0, react.useCallback)(({ "aria-labelledby": ariaLabelledby,...props } = {}) => ({
id: panelId,
"aria-labelledby": (0, require_utils_index.utils_exports.cx)(ariaLabelledby, itemId),
role: "region",
...props
}), [itemId, panelId]);
return {
disabled,
open,
getButtonProps,
getIconProps: (0, react.useCallback)((props) => ({
"aria-disabled": (0, require_utils_index.utils_exports.ariaAttr)(disabled),
"aria-expanded": open,
"aria-hidden": true,
role: "presentation",
...props
}), [open, disabled]),
getItemProps,
getPanelProps
};
};
//#endregion
exports.AccordionContext = AccordionContext;
exports.AccordionDescendantsContext = AccordionDescendantsContext;
exports.AccordionItemContext = AccordionItemContext;
exports.useAccordion = useAccordion;
exports.useAccordionContext = useAccordionContext;
exports.useAccordionDescendant = useAccordionDescendant;
exports.useAccordionDescendants = useAccordionDescendants;
exports.useAccordionItem = useAccordionItem;
exports.useAccordionItemContext = useAccordionItemContext;
//# sourceMappingURL=use-accordion.cjs.map