{"version":3,"file":"use-accordion.cjs","names":["createDescendants","createContext","useControllableState","getRootProps: PropGetter","mergeRefs","open","getItemProps: PropGetter","getButtonProps: PropGetter<\"button\">","getPanelProps: PropGetter"],"sources":["../../../../src/components/accordion/use-accordion.ts"],"sourcesContent":["\"use client\"\n\nimport type { KeyboardEvent } from \"react\"\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport { useCallback, useEffect, useId, useState } from \"react\"\nimport { useControllableState } from \"../../hooks/use-controllable-state\"\nimport { createDescendants } from \"../../hooks/use-descendants\"\nimport {\n  ariaAttr,\n  createContext,\n  cx,\n  dataAttr,\n  handlerAll,\n  isArray,\n  mergeRefs,\n  runKeyAction,\n} from \"../../utils\"\n\nconst {\n  DescendantsContext: AccordionDescendantsContext,\n  useDescendant: useAccordionDescendant,\n  useDescendants: useAccordionDescendants,\n} = createDescendants<HTMLButtonElement>()\n\nexport {\n  AccordionDescendantsContext,\n  useAccordionDescendant,\n  useAccordionDescendants,\n}\n\ninterface AccordionContext\n  extends Omit<UseAccordionReturn, \"descendants\" | \"getRootProps\"> {}\n\nconst [AccordionContext, useAccordionContext] = createContext<AccordionContext>(\n  {\n    name: \"AccordionContext\",\n  },\n)\n\nexport { AccordionContext, useAccordionContext }\n\ninterface AccordionItemContext\n  extends Omit<UseAccordionItemReturn, \"getItemProps\"> {}\n\nconst [AccordionItemContext, useAccordionItemContext] =\n  createContext<AccordionItemContext>({\n    name: \"AccordionItemContext\",\n  })\n\nexport { AccordionItemContext, useAccordionItemContext }\n\nexport interface UseAccordionProps extends Omit<HTMLProps, \"onChange\"> {\n  /**\n   * The initial index(es) of the accordion item to expand.\n   */\n  defaultIndex?: number | number[]\n  /**\n   * The index(es) of the accordion item to expand.\n   */\n  index?: number | number[]\n  /**\n   * If `true`, multiple accordion items can be expanded at once.\n   *\n   * @default false\n   */\n  multiple?: boolean\n  /**\n   * If `true`, any expanded accordion item can be collapsed again.\n   *\n   * @default false\n   */\n  toggle?: boolean\n  /**\n   * The callback invoked when accordion items are expanded or collapsed.\n   */\n  onChange?: (index: number | number[]) => void\n}\n\nexport const useAccordion = ({\n  defaultIndex: defaultIndexProp,\n  index: indexProp,\n  multiple,\n  toggle,\n  onChange,\n  ...rest\n}: UseAccordionProps = {}) => {\n  if (\n    (indexProp || defaultIndexProp) != null &&\n    !isArray(indexProp || defaultIndexProp) &&\n    multiple\n  ) {\n    console.warn(\n      `Accordion: If 'multiple' is passed, then 'index' or 'defaultIndex' must be an array.`,\n    )\n  }\n\n  if (multiple && toggle) {\n    console.warn(\n      `Accordion: If 'multiple' is passed, 'toggle' will be ignored. Either remove 'toggle' or 'multiple' depending on whether you want multiple accordions visible or not`,\n    )\n  }\n\n  const descendants = useAccordionDescendants()\n\n  const [focusedIndex, setFocusedIndex] = useState<number>(-1)\n\n  const [index, setIndex] = useControllableState({\n    defaultValue: () =>\n      multiple ? (defaultIndexProp ?? []) : (defaultIndexProp ?? -1),\n    value: indexProp,\n    onChange,\n  })\n\n  const getRootProps: PropGetter = useCallback(\n    ({ ref, ...props } = {}) => ({\n      ...props,\n      ...rest,\n      ref: mergeRefs(ref, rest.ref),\n    }),\n    [rest],\n  )\n\n  useEffect(() => {\n    return () => setFocusedIndex(-1)\n  }, [])\n\n  return {\n    descendants,\n    focusedIndex,\n    index,\n    multiple,\n    setFocusedIndex,\n    setIndex,\n    toggle,\n    getRootProps,\n  }\n}\n\nexport type UseAccordionReturn = ReturnType<typeof useAccordion>\n\nexport interface UseAccordionItemProps extends HTMLProps {\n  /**\n   * The index of the accordion item.\n   */\n  index: number\n  /**\n   * If `true`, the accordion item will be disabled.\n   *\n   * @default false\n   */\n  disabled?: boolean\n}\n\nexport const useAccordionItem = ({\n  disabled,\n  index,\n  ...rest\n}: UseAccordionItemProps) => {\n  const itemId = useId()\n  const panelId = useId()\n  const {\n    index: selectedIndex,\n    multiple,\n    setFocusedIndex,\n    setIndex,\n    toggle,\n  } = useAccordionContext()\n  const { descendants, register } = useAccordionDescendant({ disabled })\n  const open =\n    index !== -1\n      ? isArray(selectedIndex)\n        ? selectedIndex.includes(index)\n        : selectedIndex === index\n      : false\n\n  if (open && disabled)\n    console.warn(`Accordion: Cannot open a disabled accordion item`)\n\n  const onChange = useCallback(\n    (open: boolean) => {\n      if (index === -1) return\n\n      if (multiple && isArray(selectedIndex)) {\n        setIndex(\n          open\n            ? selectedIndex.concat(index)\n            : selectedIndex.filter((i) => i !== index),\n        )\n      } else if (open) {\n        setIndex(index)\n      } else if (toggle) {\n        setIndex(-1)\n      }\n    },\n    [multiple, toggle, index, selectedIndex, setIndex],\n  )\n\n  const onFocus = useCallback(() => {\n    setFocusedIndex(index)\n  }, [setFocusedIndex, index])\n\n  const onClick = useCallback(() => {\n    onChange(!open)\n    setFocusedIndex(index)\n  }, [index, setFocusedIndex, open, onChange])\n\n  const onKeyDown = useCallback(\n    (ev: KeyboardEvent<HTMLButtonElement>) => {\n      runKeyAction(ev, {\n        ArrowDown: () => {\n          const next = descendants.enabledNextValue(index)\n\n          next?.node.focus()\n        },\n        ArrowUp: () => {\n          const prev = descendants.enabledPrevValue(index)\n\n          prev?.node.focus()\n        },\n        End: () => {\n          const last = descendants.enabledLastValue()\n\n          last?.node.focus()\n        },\n        Home: () => {\n          const first = descendants.enabledFirstValue()\n\n          first?.node.focus()\n        },\n      })\n    },\n    [descendants, index],\n  )\n\n  const getItemProps: PropGetter = useCallback(\n    ({ ref, ...props } = {}) => ({\n      \"data-expanded\": dataAttr(open),\n      ...props,\n      ...rest,\n      ref: mergeRefs(ref, rest.ref),\n    }),\n    [open, rest],\n  )\n\n  const getButtonProps: PropGetter<\"button\"> = useCallback(\n    ({ ref, ...props } = {}) => ({\n      id: itemId,\n      type: \"button\",\n      \"aria-controls\": panelId,\n      \"aria-disabled\": ariaAttr((!multiple && !toggle && open) || disabled),\n      \"aria-expanded\": open,\n      ...props,\n      ref: mergeRefs(register, ref),\n      disabled,\n      onClick: handlerAll(props.onClick, onClick),\n      onFocus: handlerAll(props.onFocus, onFocus),\n      onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n    }),\n    [\n      itemId,\n      open,\n      panelId,\n      multiple,\n      toggle,\n      disabled,\n      register,\n      onClick,\n      onFocus,\n      onKeyDown,\n    ],\n  )\n\n  const getPanelProps: PropGetter = useCallback(\n    ({ \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n      id: panelId,\n      \"aria-labelledby\": cx(ariaLabelledby, itemId),\n      role: \"region\",\n      ...props,\n    }),\n    [itemId, panelId],\n  )\n\n  const getIconProps: PropGetter<\"svg\"> = useCallback(\n    (props) => ({\n      \"aria-disabled\": ariaAttr(disabled),\n      \"aria-expanded\": open,\n      \"aria-hidden\": true,\n      role: \"presentation\",\n      ...props,\n    }),\n    [open, disabled],\n  )\n\n  return {\n    disabled,\n    open,\n    getButtonProps,\n    getIconProps,\n    getItemProps,\n    getPanelProps,\n  }\n}\n\nexport type UseAccordionItemReturn = ReturnType<typeof useAccordionItem>\n"],"mappings":"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"}