{"version":3,"file":"index.mjs","names":["Dispatch","HTMLProps","SetStateAction","createContext","MenuContext","getItemProps","userProps","HTMLElement","Record","activeIndex","setActiveIndex","setHasFocusInside","isOpen","FloatingFocusManager","FloatingList","FloatingNode","FloatingPortal","autoUpdate","flip","offset","safePolygon","shift","useClick","useDismiss","useFloating","useFloatingNodeId","useFloatingParentNodeId","useFloatingTree","useHover","useInteractions","useListItem","useListNavigation","useMergeRefs","useRole","useTypeahead","FocusEvent","RefObject","useContext","useEffect","useRef","useState","MenuContext","clsx","Button","ButtonProps","Dialog","Props","label","triggerComponent","ref","HTMLButtonElement","MenuItemWithChildren","children","TriggerComponent","props","isOpen","setIsOpen","hasFocusInside","setHasFocusInside","activeIndex","setActiveIndex","elementsRef","Array","labelsRef","parent","tree","nodeId","parentId","item","isNested","floatingStyles","refs","context","open","onOpenChange","placement","middleware","mainAxis","alignmentAxis","whileElementsMounted","hover","enabled","delay","close","handleClose","blockPointerEvents","click","event","toggle","ignoreMouse","role","dismiss","bubbles","listNavigation","listRef","nested","onNavigate","typeahead","onMatch","undefined","getReferenceProps","getFloatingProps","getItemProps","handleTreeClick","onSubMenuOpen","events","on","off","emit","mergedRefs","setReference","index","onFocus","setFloating","RefObject","MenuItemWithChildren","FloatingTree","Button","ButtonProps","Props","label","triggerComponent","ref","HTMLButtonElement","DropdownMenuNested","t0","$","_c","props","t1","useFloatingTree","useListItem","useMergeRefs","ButtonHTMLAttributes","FocusEvent","MouseEvent","RefObject","useContext","MenuContext","Props","HTMLButtonElement","label","disabled","ref","MenuItem","t0","$","_c","props","menu","t1","t2","item","tree","isActive","index","activeIndex","t3","t4","t5","t6","t7","t8","t9","t10","t11","getItemProps","onClick","event","events","emit","onFocus","event_0","setHasFocusInside","t12"],"sources":["../../../src/components/dropdown-menu-nested/MenuContext.ts","../../../src/components/dropdown-menu-nested/MenuItemWithChildren.tsx","../../../src/components/dropdown-menu-nested/DropdownMenuNested.tsx","../../../src/components/dropdown-menu-nested/MenuItem.tsx"],"sourcesContent":["import { Dispatch, HTMLProps, SetStateAction, createContext } from \"react\";\n\nexport const MenuContext = createContext<{\n  getItemProps: (userProps?: HTMLProps<HTMLElement>) => Record<string, unknown>;\n  activeIndex: number | null;\n  setActiveIndex: Dispatch<SetStateAction<number | null>>;\n  setHasFocusInside: Dispatch<SetStateAction<boolean>>;\n  isOpen: boolean;\n}>({\n  getItemProps: () => ({}),\n  activeIndex: null,\n  setActiveIndex: () => {},\n  setHasFocusInside: () => {},\n  isOpen: false,\n});\n","import {\n  FloatingFocusManager,\n  FloatingList,\n  FloatingNode,\n  FloatingPortal,\n  autoUpdate,\n  flip,\n  offset,\n  safePolygon,\n  shift,\n  useClick,\n  useDismiss,\n  useFloating,\n  useFloatingNodeId,\n  useFloatingParentNodeId,\n  useFloatingTree,\n  useHover,\n  useInteractions,\n  useListItem,\n  useListNavigation,\n  useMergeRefs,\n  useRole,\n  useTypeahead,\n} from \"@floating-ui/react\";\nimport { FocusEvent, RefObject, useContext, useEffect, useRef, useState } from \"react\";\nimport { MenuContext } from \"./MenuContext\";\nimport clsx from \"clsx\";\nimport { Button, type ButtonProps } from \"../button/Button\";\nimport { Dialog } from \"../dialog/Dialog\";\n\nexport interface Props extends ButtonProps {\n  label?: string;\n  triggerComponent?: typeof Button;\n  ref?: RefObject<HTMLButtonElement>;\n}\n\nexport function MenuItemWithChildren({\n  children,\n  label,\n  triggerComponent: TriggerComponent = Button,\n  ref,\n  ...props\n}: Props) {\n  const [isOpen, setIsOpen] = useState(false);\n  const [hasFocusInside, setHasFocusInside] = useState(false);\n  const [activeIndex, setActiveIndex] = useState<number | null>(null);\n\n  const elementsRef = useRef<Array<HTMLButtonElement | null>>([]);\n  const labelsRef = useRef<Array<string | null>>([]);\n  const parent = useContext(MenuContext);\n\n  const tree = useFloatingTree();\n  const nodeId = useFloatingNodeId();\n  const parentId = useFloatingParentNodeId();\n  const item = useListItem();\n\n  const isNested = parentId != null;\n\n  const { floatingStyles, refs, context } = useFloating<HTMLButtonElement>({\n    nodeId,\n    open: isOpen,\n    onOpenChange: setIsOpen,\n    placement: isNested ? \"right-start\" : \"bottom-start\",\n    middleware: [\n      offset({ mainAxis: isNested ? -8 : 10, alignmentAxis: isNested ? 0 : 0 }),\n      flip(),\n      shift(),\n    ],\n    whileElementsMounted: autoUpdate,\n  });\n\n  const hover = useHover(context, {\n    enabled: isNested,\n    delay: { open: 75, close: 200 },\n    handleClose: safePolygon({ blockPointerEvents: true }),\n  });\n  const click = useClick(context, {\n    event: \"mousedown\",\n    toggle: !isNested,\n    ignoreMouse: isNested,\n  });\n  const role = useRole(context, { role: \"menu\" });\n  const dismiss = useDismiss(context, { bubbles: true });\n  const listNavigation = useListNavigation(context, {\n    listRef: elementsRef,\n    activeIndex,\n    nested: isNested,\n    onNavigate: setActiveIndex,\n  });\n  const typeahead = useTypeahead(context, {\n    listRef: labelsRef,\n    onMatch: isOpen ? setActiveIndex : undefined,\n    activeIndex,\n  });\n  const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([\n    hover,\n    click,\n    role,\n    dismiss,\n    listNavigation,\n    typeahead,\n  ]);\n\n  useEffect(() => {\n    if (!tree) return;\n\n    function handleTreeClick() {\n      setIsOpen(false);\n    }\n\n    function onSubMenuOpen(event: { nodeId: string; parentId: string }) {\n      // close sibling menu\n      if (event.nodeId !== nodeId && event.parentId === parentId) {\n        setIsOpen(false);\n      }\n    }\n\n    tree.events.on(\"click\", handleTreeClick);\n    tree.events.on(\"menuopen\", onSubMenuOpen);\n\n    return () => {\n      tree.events.off(\"click\", handleTreeClick);\n      tree.events.off(\"menuopen\", onSubMenuOpen);\n    };\n  }, [tree, nodeId, parentId]);\n\n  useEffect(() => {\n    if (isOpen && tree) {\n      tree.events.emit(\"menuopen\", { parentId, nodeId });\n    }\n  }, [tree, isOpen, nodeId, parentId]);\n\n  const mergedRefs = useMergeRefs([refs.setReference, item.ref, ref]);\n\n  return (\n    <FloatingNode id={nodeId}>\n      {isNested ? (\n        <button\n          ref={mergedRefs as any}\n          tabIndex={parent.activeIndex === item.index ? 0 : -1}\n          role=\"menuitem\"\n          data-open={isOpen ? \"\" : undefined}\n          data-nested=\"\"\n          data-presentation=\"compact\"\n          data-focus-inside={hasFocusInside ? \"\" : undefined}\n          {...getReferenceProps(\n            parent.getItemProps({\n              onFocus(event: FocusEvent<HTMLButtonElement>) {\n                props.onFocus?.(event);\n                setHasFocusInside(false);\n                parent.setHasFocusInside(true);\n              },\n            }),\n          )}\n          className={clsx(isNested && \"option\")}\n        >\n          <span>{label}</span>\n          <span className=\"ml-auto\">\n            <i className=\"fe-angle-right mr-0\" aria-hidden></i>\n          </span>\n        </button>\n      ) : (\n        <TriggerComponent\n          ref={ref}\n          data-open={isOpen ? \"\" : undefined}\n          data-focus-inside={hasFocusInside ? \"\" : undefined}\n          {...props}\n          {...getReferenceProps(\n            parent.getItemProps({\n              onFocus(event: FocusEvent<HTMLButtonElement>) {\n                props.onFocus?.(event);\n                setHasFocusInside(false);\n                parent.setHasFocusInside(true);\n              },\n            }),\n          )}\n          data-presentation=\"compact\"\n          className={clsx(isNested && \"option\")}\n        >\n          {label}\n        </TriggerComponent>\n      )}\n\n      <MenuContext.Provider\n        value={{ activeIndex, setActiveIndex, getItemProps, setHasFocusInside, isOpen }}\n      >\n        {isOpen && (\n          <FloatingPortal>\n            <FloatingFocusManager\n              context={context}\n              modal={false}\n              initialFocus={isNested ? -1 : 0}\n              returnFocus={!isNested}\n            >\n              <FloatingList elementsRef={elementsRef} labelsRef={labelsRef}>\n                <div ref={refs.setFloating} style={floatingStyles} className=\"outline-hidden\">\n                  <Dialog {...getFloatingProps()}>{children}</Dialog>\n                </div>\n              </FloatingList>\n            </FloatingFocusManager>\n          </FloatingPortal>\n        )}\n      </MenuContext.Provider>\n    </FloatingNode>\n  );\n}\n","import { RefObject } from \"react\";\nimport { MenuItemWithChildren } from \"./MenuItemWithChildren\";\nimport { FloatingTree } from \"@floating-ui/react\";\nimport { Button, type ButtonProps } from \"../button/Button\";\n\nexport interface Props extends ButtonProps {\n  label: string;\n  triggerComponent: typeof Button;\n  ref?: RefObject<HTMLButtonElement>;\n}\n\nexport function DropdownMenuNested({ ref, ...props }: Props) {\n  return (\n    <FloatingTree>\n      <MenuItemWithChildren {...props} ref={ref} />\n    </FloatingTree>\n  );\n}\n","import { useFloatingTree, useListItem, useMergeRefs } from \"@floating-ui/react\";\nimport { ButtonHTMLAttributes, FocusEvent, MouseEvent, RefObject, useContext } from \"react\";\nimport { MenuContext } from \"./MenuContext\";\n\ninterface Props extends ButtonHTMLAttributes<HTMLButtonElement> {\n  label: string;\n  disabled?: boolean;\n  ref?: RefObject<HTMLButtonElement>;\n}\n\nexport function MenuItem({ label, disabled, ref, ...props }: Props) {\n  const menu = useContext(MenuContext);\n  const item = useListItem({ label: disabled ? null : label });\n  const tree = useFloatingTree();\n  const isActive = item.index === menu.activeIndex;\n\n  return (\n    <button\n      {...props}\n      ref={useMergeRefs([item.ref, ref])}\n      type=\"button\"\n      role=\"menuitem\"\n      className=\"option\"\n      data-presentation=\"compact\"\n      tabIndex={isActive ? 0 : -1}\n      {...(disabled ? { disabled } : {})}\n      {...menu.getItemProps({\n        onClick(event: MouseEvent<HTMLButtonElement>) {\n          props.onClick?.(event);\n          tree?.events.emit(\"click\");\n        },\n        onFocus(event: FocusEvent<HTMLButtonElement>) {\n          props.onFocus?.(event);\n          menu.setHasFocusInside(true);\n        },\n      })}\n    >\n      {label}\n    </button>\n  );\n}\n"],"mappings":"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"}