UNPKG

@arolariu/components

Version:

🎨 60+ beautiful, accessible React components built on Radix UI. TypeScript-first, tree-shakeable, SSR-ready. Perfect for modern web apps, design systems & rapid prototyping. Zero config, maximum flexibility! ⚡

1 lines • 45 kB
{"version":3,"file":"components\\ui\\dropdrawer.cjs","sources":["webpack://@arolariu/components/webpack/runtime/define_property_getters","webpack://@arolariu/components/webpack/runtime/has_own_property","webpack://@arolariu/components/webpack/runtime/make_namespace_object","webpack://@arolariu/components/./src/components/ui/dropdrawer.tsx"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\r\n\r\nimport { AnimatePresence, motion, Transition } from \"motion/react\";\r\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {\r\n Drawer,\r\n DrawerClose,\r\n DrawerContent,\r\n DrawerFooter,\r\n DrawerHeader,\r\n DrawerTitle,\r\n DrawerTrigger,\r\n} from \"@/components/ui/drawer\";\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuTrigger,\r\n} from \"@/components/ui/dropdown-menu\";\r\nimport { useIsMobile } from \"@/hooks/use-mobile\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\nconst DropDrawerContext = React.createContext<{ isMobile: boolean }>({\r\n isMobile: false,\r\n});\r\n\r\nconst useDropDrawerContext = () => {\r\n const context = React.useContext(DropDrawerContext);\r\n if (!context) {\r\n throw new Error(\r\n \"DropDrawer components cannot be rendered outside the Context\",\r\n );\r\n }\r\n return context;\r\n};\r\n\r\nfunction DropDrawer({\r\n children,\r\n ...props\r\n}:\r\n | React.ComponentProps<typeof Drawer>\r\n | React.ComponentProps<typeof DropdownMenu>) {\r\n const isMobile = useIsMobile();\r\n const DropdownComponent = isMobile ? Drawer : DropdownMenu;\r\n\r\n return (\r\n <DropDrawerContext.Provider value={{ isMobile }}>\r\n <DropdownComponent\r\n data-slot=\"drop-drawer\"\r\n {...(isMobile && { autoFocus: true })}\r\n {...props}\r\n >\r\n {children}\r\n </DropdownComponent>\r\n </DropDrawerContext.Provider>\r\n );\r\n}\r\n\r\nfunction DropDrawerTrigger({\r\n className,\r\n children,\r\n ...props\r\n}:\r\n | React.ComponentProps<typeof DrawerTrigger>\r\n | React.ComponentProps<typeof DropdownMenuTrigger>) {\r\n const { isMobile } = useDropDrawerContext();\r\n const TriggerComponent = isMobile ? DrawerTrigger : DropdownMenuTrigger;\r\n\r\n return (\r\n <TriggerComponent\r\n data-slot=\"drop-drawer-trigger\"\r\n className={className}\r\n {...props}\r\n >\r\n {children}\r\n </TriggerComponent>\r\n );\r\n}\r\n\r\nfunction DropDrawerContent({\r\n className,\r\n children,\r\n ...props\r\n}:\r\n | React.ComponentProps<typeof DrawerContent>\r\n | React.ComponentProps<typeof DropdownMenuContent>) {\r\n const { isMobile } = useDropDrawerContext();\r\n const [activeSubmenu, setActiveSubmenu] = React.useState<string | null>(null);\r\n const [submenuTitle, setSubmenuTitle] = React.useState<string | null>(null);\r\n const [submenuStack, setSubmenuStack] = React.useState<\r\n { id: string; title: string }[]\r\n >([]);\r\n // Add animation direction state\r\n const [animationDirection, setAnimationDirection] = React.useState<\r\n \"forward\" | \"backward\"\r\n >(\"forward\");\r\n\r\n // Create a ref to store submenu content by ID\r\n const submenuContentRef = React.useRef<Map<string, React.ReactNode[]>>(\r\n new Map(),\r\n );\r\n\r\n // Function to navigate to a submenu\r\n const navigateToSubmenu = React.useCallback((id: string, title: string) => {\r\n // Set animation direction to forward when navigating to a submenu\r\n setAnimationDirection(\"forward\");\r\n setActiveSubmenu(id);\r\n setSubmenuTitle(title);\r\n setSubmenuStack((prev) => [...prev, { id, title }]);\r\n }, []);\r\n\r\n // Function to go back to previous menu\r\n const goBack = React.useCallback(() => {\r\n // Set animation direction to backward when going back\r\n setAnimationDirection(\"backward\");\r\n\r\n if (submenuStack.length <= 1) {\r\n // If we're at the first level, go back to main menu\r\n setActiveSubmenu(null);\r\n setSubmenuTitle(null);\r\n setSubmenuStack([]);\r\n } else {\r\n // Go back to previous submenu\r\n const newStack = [...submenuStack];\r\n newStack.pop(); // Remove current\r\n const previous = newStack[newStack.length - 1];\r\n setActiveSubmenu(previous.id);\r\n setSubmenuTitle(previous.title);\r\n setSubmenuStack(newStack);\r\n }\r\n }, [submenuStack]);\r\n\r\n // Function to register submenu content\r\n const registerSubmenuContent = React.useCallback(\r\n (id: string, content: React.ReactNode[]) => {\r\n submenuContentRef.current.set(id, content);\r\n },\r\n [],\r\n );\r\n\r\n // Function to extract submenu content\r\n const extractSubmenuContent = React.useCallback(\r\n (elements: React.ReactNode, targetId: string): React.ReactNode[] => {\r\n const result: React.ReactNode[] = [];\r\n\r\n // Recursive function to search through all children\r\n const findSubmenuContent = (node: React.ReactNode) => {\r\n // Skip if not a valid element\r\n if (!React.isValidElement(node)) return;\r\n\r\n const element = node as React.ReactElement;\r\n // Use a more specific type to avoid 'any'\r\n const props = element.props as {\r\n id?: string;\r\n \"data-submenu-id\"?: string;\r\n children?: React.ReactNode;\r\n };\r\n\r\n // Check if this is a DropDrawerSub\r\n if (element.type === DropDrawerSub) {\r\n // Get all possible ID values\r\n const elementId = props.id;\r\n const dataSubmenuId = props[\"data-submenu-id\"];\r\n\r\n // If this is the submenu we're looking for\r\n if (elementId === targetId || dataSubmenuId === targetId) {\r\n // Find the SubContent within this Sub\r\n if (props.children) {\r\n React.Children.forEach(props.children, (child) => {\r\n if (\r\n React.isValidElement(child) &&\r\n child.type === DropDrawerSubContent\r\n ) {\r\n // Add all children of the SubContent to the result\r\n const subContentProps = child.props as {\r\n children?: React.ReactNode;\r\n };\r\n if (subContentProps.children) {\r\n React.Children.forEach(\r\n subContentProps.children,\r\n (contentChild) => {\r\n result.push(contentChild);\r\n },\r\n );\r\n }\r\n }\r\n });\r\n }\r\n return; // Found what we needed, no need to search deeper\r\n }\r\n }\r\n\r\n // If this element has children, search through them\r\n if (props.children) {\r\n if (Array.isArray(props.children)) {\r\n props.children.forEach((child: React.ReactNode) =>\r\n findSubmenuContent(child),\r\n );\r\n } else {\r\n findSubmenuContent(props.children);\r\n }\r\n }\r\n };\r\n\r\n // Start the search from the root elements\r\n if (Array.isArray(elements)) {\r\n elements.forEach((child) => findSubmenuContent(child));\r\n } else {\r\n findSubmenuContent(elements);\r\n }\r\n\r\n return result;\r\n },\r\n [],\r\n );\r\n\r\n // Get submenu content (either from cache or extract it)\r\n const getSubmenuContent = React.useCallback(\r\n (id: string) => {\r\n // Check if we have the content in our ref\r\n const cachedContent = submenuContentRef.current.get(id || \"\");\r\n if (cachedContent && cachedContent.length > 0) {\r\n return cachedContent;\r\n }\r\n\r\n // If not in cache, extract it\r\n const submenuContent = extractSubmenuContent(children, id);\r\n\r\n if (submenuContent.length === 0) {\r\n return [];\r\n }\r\n\r\n // Store in cache for future use\r\n if (id) {\r\n submenuContentRef.current.set(id, submenuContent);\r\n }\r\n\r\n return submenuContent;\r\n },\r\n [children, extractSubmenuContent],\r\n );\r\n\r\n // Animation variants for Framer Motion\r\n const variants = {\r\n enter: (direction: \"forward\" | \"backward\") => ({\r\n x: direction === \"forward\" ? \"100%\" : \"-100%\",\r\n opacity: 0,\r\n }),\r\n center: {\r\n x: 0,\r\n opacity: 1,\r\n },\r\n exit: (direction: \"forward\" | \"backward\") => ({\r\n x: direction === \"forward\" ? \"-100%\" : \"100%\",\r\n opacity: 0,\r\n }),\r\n };\r\n\r\n // Animation transition\r\n const transition = {\r\n duration: 0.3,\r\n ease: [0.25, 0.1, 0.25, 1.0], // cubic-bezier easing\r\n } satisfies Transition;\r\n\r\n if (isMobile) {\r\n return (\r\n <SubmenuContext.Provider\r\n value={{\r\n activeSubmenu,\r\n setActiveSubmenu: (id) => {\r\n if (id === null) {\r\n setActiveSubmenu(null);\r\n setSubmenuTitle(null);\r\n setSubmenuStack([]);\r\n }\r\n },\r\n submenuTitle,\r\n setSubmenuTitle,\r\n navigateToSubmenu,\r\n registerSubmenuContent,\r\n }}\r\n >\r\n <DrawerContent\r\n data-slot=\"drop-drawer-content\"\r\n className={cn(\"max-h-[90vh]\", className)}\r\n {...props}\r\n >\r\n {activeSubmenu ? (\r\n <>\r\n <DrawerHeader>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={goBack}\r\n className=\"hover:bg-neutral-100/50 rounded-full p-1 dark:hover:bg-neutral-800/50\"\r\n >\r\n <ChevronLeftIcon className=\"h-5 w-5\" />\r\n </button>\r\n <DrawerTitle>{submenuTitle || \"Submenu\"}</DrawerTitle>\r\n </div>\r\n </DrawerHeader>\r\n <div className=\"flex-1 relative overflow-y-auto max-h-[70vh]\">\r\n {/* Use AnimatePresence to handle exit animations */}\r\n <AnimatePresence\r\n initial={false}\r\n mode=\"wait\"\r\n custom={animationDirection}\r\n >\r\n <motion.div\r\n key={activeSubmenu || \"main\"}\r\n custom={animationDirection}\r\n variants={variants}\r\n initial=\"enter\"\r\n animate=\"center\"\r\n exit=\"exit\"\r\n transition={transition}\r\n className=\"pb-6 space-y-1.5 w-full h-full\"\r\n >\r\n {activeSubmenu\r\n ? getSubmenuContent(activeSubmenu)\r\n : children}\r\n </motion.div>\r\n </AnimatePresence>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <DrawerHeader className=\"sr-only\">\r\n <DrawerTitle>Menu</DrawerTitle>\r\n </DrawerHeader>\r\n <div className=\"overflow-y-auto max-h-[70vh]\">\r\n <AnimatePresence\r\n initial={false}\r\n mode=\"wait\"\r\n custom={animationDirection}\r\n >\r\n <motion.div\r\n key=\"main-menu\"\r\n custom={animationDirection}\r\n variants={variants}\r\n initial=\"enter\"\r\n animate=\"center\"\r\n exit=\"exit\"\r\n transition={transition}\r\n className=\"pb-6 space-y-1.5 w-full\"\r\n >\r\n {children}\r\n </motion.div>\r\n </AnimatePresence>\r\n </div>\r\n </>\r\n )}\r\n </DrawerContent>\r\n </SubmenuContext.Provider>\r\n );\r\n }\r\n\r\n return (\r\n <SubmenuContext.Provider\r\n value={{\r\n activeSubmenu,\r\n setActiveSubmenu,\r\n submenuTitle,\r\n setSubmenuTitle,\r\n registerSubmenuContent,\r\n }}\r\n >\r\n <DropdownMenuContent\r\n data-slot=\"drop-drawer-content\"\r\n align=\"end\"\r\n sideOffset={4}\r\n className={cn(\r\n \"max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[220px] overflow-y-auto\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </DropdownMenuContent>\r\n </SubmenuContext.Provider>\r\n );\r\n}\r\n\r\nfunction DropDrawerItem({\r\n className,\r\n children,\r\n onSelect,\r\n onClick,\r\n icon,\r\n variant = \"default\",\r\n inset,\r\n disabled,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuItem> & {\r\n icon?: React.ReactNode;\r\n}) {\r\n const { isMobile } = useDropDrawerContext();\r\n\r\n // Define hooks outside of conditionals to follow React rules\r\n // Check if this item is inside a group by looking at parent elements\r\n const isInGroup = React.useCallback(\r\n (element: HTMLElement | null): boolean => {\r\n if (!element) return false;\r\n\r\n // Check if any parent has a data-drop-drawer-group attribute\r\n let parent = element.parentElement;\r\n while (parent) {\r\n if (parent.hasAttribute(\"data-drop-drawer-group\")) {\r\n return true;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return false;\r\n },\r\n [],\r\n );\r\n\r\n // Create a ref to check if the item is in a group\r\n const itemRef = React.useRef<HTMLDivElement>(null);\r\n const [isInsideGroup, setIsInsideGroup] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n // Only run this effect in mobile mode\r\n if (!isMobile) return;\r\n\r\n // Use a short timeout to ensure the DOM is fully rendered\r\n const timer = setTimeout(() => {\r\n if (itemRef.current) {\r\n setIsInsideGroup(isInGroup(itemRef.current));\r\n }\r\n }, 0);\r\n\r\n return () => clearTimeout(timer);\r\n }, [isInGroup, isMobile]);\r\n\r\n if (isMobile) {\r\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (disabled) return;\r\n if (onClick) onClick(e);\r\n if (onSelect) onSelect(e as unknown as Event);\r\n };\r\n\r\n // Only wrap in DrawerClose if it's not a submenu item\r\n const content = (\r\n <div\r\n ref={itemRef}\r\n data-slot=\"drop-drawer-item\"\r\n data-variant={variant}\r\n data-inset={inset}\r\n data-disabled={disabled}\r\n className={cn(\r\n \"flex cursor-pointer items-center justify-between px-4 py-4\",\r\n // Only apply margin, background and rounded corners if not in a group\r\n !isInsideGroup &&\r\n \"bg-neutral-100 dark:bg-neutral-100 mx-2 my-1.5 rounded-md dark:bg-neutral-800 dark:dark:bg-neutral-800\",\r\n // For items in a group, don't add background but add more padding\r\n isInsideGroup && \"bg-transparent py-4\",\r\n inset && \"pl-8\",\r\n variant === \"destructive\" &&\r\n \"text-red-500 dark:text-red-500 dark:text-red-900 dark:dark:text-red-900\",\r\n disabled && \"pointer-events-none opacity-50\",\r\n className,\r\n )}\r\n onClick={handleClick}\r\n aria-disabled={disabled}\r\n {...props}\r\n >\r\n <div className=\"flex items-center gap-2\">{children}</div>\r\n {icon && <div className=\"flex-shrink-0\">{icon}</div>}\r\n </div>\r\n );\r\n\r\n // Check if this is inside a submenu\r\n const isInSubmenu =\r\n (props as Record<string, unknown>)[\"data-parent-submenu-id\"] ||\r\n (props as Record<string, unknown>)[\"data-parent-submenu\"];\r\n\r\n if (isInSubmenu) {\r\n return content;\r\n }\r\n\r\n return <DrawerClose asChild>{content}</DrawerClose>;\r\n }\r\n\r\n return (\r\n <DropdownMenuItem\r\n data-slot=\"drop-drawer-item\"\r\n data-variant={variant}\r\n data-inset={inset}\r\n className={className}\r\n onSelect={onSelect}\r\n onClick={onClick as React.MouseEventHandler<HTMLDivElement>}\r\n variant={variant}\r\n inset={inset}\r\n disabled={disabled}\r\n {...props}\r\n >\r\n <div className=\"flex w-full items-center justify-between\">\r\n <div>{children}</div>\r\n {icon && <div>{icon}</div>}\r\n </div>\r\n </DropdownMenuItem>\r\n );\r\n}\r\n\r\nfunction DropDrawerSeparator({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuSeparator>) {\r\n const { isMobile } = useDropDrawerContext();\r\n\r\n // For mobile, render a simple divider\r\n if (isMobile) {\r\n return null;\r\n }\r\n\r\n // For desktop, use the standard dropdown separator\r\n return (\r\n <DropdownMenuSeparator\r\n data-slot=\"drop-drawer-separator\"\r\n className={className}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropDrawerLabel({\r\n className,\r\n children,\r\n ...props\r\n}:\r\n | React.ComponentProps<typeof DropdownMenuLabel>\r\n | React.ComponentProps<typeof DrawerTitle>) {\r\n const { isMobile } = useDropDrawerContext();\r\n\r\n if (isMobile) {\r\n return (\r\n <DrawerHeader className=\"p-0\">\r\n <DrawerTitle\r\n data-slot=\"drop-drawer-label\"\r\n className={cn(\r\n \"text-neutral-500 px-4 py-2 text-sm font-medium dark:text-neutral-400\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </DrawerTitle>\r\n </DrawerHeader>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenuLabel\r\n data-slot=\"drop-drawer-label\"\r\n className={className}\r\n {...props}\r\n >\r\n {children}\r\n </DropdownMenuLabel>\r\n );\r\n}\r\n\r\nfunction DropDrawerFooter({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DrawerFooter> | React.ComponentProps<\"div\">) {\r\n const { isMobile } = useDropDrawerContext();\r\n\r\n if (isMobile) {\r\n return (\r\n <DrawerFooter\r\n data-slot=\"drop-drawer-footer\"\r\n className={cn(\"p-4\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </DrawerFooter>\r\n );\r\n }\r\n\r\n // No direct equivalent in DropdownMenu, so we'll just render a div\r\n return (\r\n <div\r\n data-slot=\"drop-drawer-footer\"\r\n className={cn(\"p-2\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nfunction DropDrawerGroup({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<\"div\"> & {\r\n children: React.ReactNode;\r\n}) {\r\n const { isMobile } = useDropDrawerContext();\r\n\r\n // Add separators between children on mobile\r\n const childrenWithSeparators = React.useMemo(() => {\r\n if (!isMobile) return children;\r\n\r\n const childArray = React.Children.toArray(children);\r\n\r\n // Filter out any existing separators\r\n const filteredChildren = childArray.filter(\r\n (child) =>\r\n React.isValidElement(child) && child.type !== DropDrawerSeparator,\r\n );\r\n\r\n // Add separators between items\r\n return filteredChildren.flatMap((child, index) => {\r\n if (index === filteredChildren.length - 1) return [child];\r\n return [\r\n child,\r\n <div\r\n key={`separator-${index}`}\r\n className=\"bg-neutral-200 h-px dark:bg-neutral-800\"\r\n aria-hidden=\"true\"\r\n />,\r\n ];\r\n });\r\n }, [children, isMobile]);\r\n\r\n if (isMobile) {\r\n return (\r\n <div\r\n data-drop-drawer-group\r\n data-slot=\"drop-drawer-group\"\r\n role=\"group\"\r\n className={cn(\r\n \"bg-neutral-100 dark:bg-neutral-100 mx-2 my-3 overflow-hidden rounded-xl dark:bg-neutral-800 dark:dark:bg-neutral-800\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {childrenWithSeparators}\r\n </div>\r\n );\r\n }\r\n\r\n // On desktop, use a div with proper role and attributes\r\n return (\r\n <div\r\n data-drop-drawer-group\r\n data-slot=\"drop-drawer-group\"\r\n role=\"group\"\r\n className={className}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\n// Context for managing submenu state on mobile\r\ninterface SubmenuContextType {\r\n activeSubmenu: string | null;\r\n setActiveSubmenu: (id: string | null) => void;\r\n submenuTitle: string | null;\r\n setSubmenuTitle: (title: string | null) => void;\r\n navigateToSubmenu?: (id: string, title: string) => void;\r\n registerSubmenuContent?: (id: string, content: React.ReactNode[]) => void;\r\n}\r\n\r\nconst SubmenuContext = React.createContext<SubmenuContextType>({\r\n activeSubmenu: null,\r\n setActiveSubmenu: () => {},\r\n submenuTitle: null,\r\n setSubmenuTitle: () => {},\r\n navigateToSubmenu: undefined,\r\n registerSubmenuContent: undefined,\r\n});\r\n\r\n// Submenu components\r\n// Counter for generating simple numeric IDs\r\nlet submenuIdCounter = 0;\r\n\r\nfunction DropDrawerSub({\r\n children,\r\n id,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuSub> & {\r\n id?: string;\r\n}) {\r\n const { isMobile } = useDropDrawerContext();\r\n const { registerSubmenuContent } = React.useContext(SubmenuContext);\r\n\r\n // Generate a simple numeric ID instead of using React.useId()\r\n const [generatedId] = React.useState(() => `submenu-${submenuIdCounter++}`);\r\n const submenuId = id || generatedId;\r\n\r\n // Extract submenu content to register with parent\r\n React.useEffect(() => {\r\n if (!registerSubmenuContent) return;\r\n\r\n // Find the SubContent within this Sub\r\n const contentItems: React.ReactNode[] = [];\r\n React.Children.forEach(children, (child) => {\r\n if (React.isValidElement(child) && child.type === DropDrawerSubContent) {\r\n // Add all children of the SubContent to the result\r\n React.Children.forEach(\r\n (child.props as { children?: React.ReactNode }).children,\r\n (contentChild) => {\r\n contentItems.push(contentChild);\r\n },\r\n );\r\n }\r\n });\r\n\r\n // Register the content with the parent\r\n if (contentItems.length > 0) {\r\n registerSubmenuContent(submenuId, contentItems);\r\n }\r\n }, [children, registerSubmenuContent, submenuId]);\r\n\r\n if (isMobile) {\r\n // For mobile, we'll use the context to manage submenu state\r\n // Process children to pass the submenu ID to the trigger and content\r\n const processedChildren = React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child;\r\n\r\n if (child.type === DropDrawerSubTrigger) {\r\n return React.cloneElement(\r\n child as React.ReactElement,\r\n {\r\n ...(child.props as object),\r\n \"data-parent-submenu-id\": submenuId,\r\n \"data-submenu-id\": submenuId,\r\n // Use only data attributes, not custom props\r\n \"data-parent-submenu\": submenuId,\r\n } as React.HTMLAttributes<HTMLElement>,\r\n );\r\n }\r\n\r\n if (child.type === DropDrawerSubContent) {\r\n return React.cloneElement(\r\n child as React.ReactElement,\r\n {\r\n ...(child.props as object),\r\n \"data-parent-submenu-id\": submenuId,\r\n \"data-submenu-id\": submenuId,\r\n // Use only data attributes, not custom props\r\n \"data-parent-submenu\": submenuId,\r\n } as React.HTMLAttributes<HTMLElement>,\r\n );\r\n }\r\n\r\n return child;\r\n });\r\n\r\n return (\r\n <div\r\n data-slot=\"drop-drawer-sub\"\r\n data-submenu-id={submenuId}\r\n id={submenuId}\r\n >\r\n {processedChildren}\r\n </div>\r\n );\r\n }\r\n\r\n // For desktop, pass the generated ID to the DropdownMenuSub\r\n return (\r\n <DropdownMenuSub\r\n data-slot=\"drop-drawer-sub\"\r\n data-submenu-id={submenuId}\r\n // Don't pass id to DropdownMenuSub as it doesn't accept this prop\r\n {...props}\r\n >\r\n {children}\r\n </DropdownMenuSub>\r\n );\r\n}\r\n\r\nfunction DropDrawerSubTrigger({\r\n className,\r\n inset,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuSubTrigger> & {\r\n icon?: React.ReactNode;\r\n}) {\r\n const { isMobile } = useDropDrawerContext();\r\n const { navigateToSubmenu } = React.useContext(SubmenuContext);\r\n\r\n // Define hooks outside of conditionals to follow React rules\r\n // Check if this item is inside a group by looking at parent elements\r\n const isInGroup = React.useCallback(\r\n (element: HTMLElement | null): boolean => {\r\n if (!element) return false;\r\n\r\n // Check if any parent has a data-drop-drawer-group attribute\r\n let parent = element.parentElement;\r\n while (parent) {\r\n if (parent.hasAttribute(\"data-drop-drawer-group\")) {\r\n return true;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return false;\r\n },\r\n [],\r\n );\r\n\r\n // Create a ref to check if the item is in a group\r\n const itemRef = React.useRef<HTMLDivElement>(null);\r\n const [isInsideGroup, setIsInsideGroup] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n // Only run this effect in mobile mode\r\n if (!isMobile) return;\r\n\r\n // Use a short timeout to ensure the DOM is fully rendered\r\n const timer = setTimeout(() => {\r\n if (itemRef.current) {\r\n setIsInsideGroup(isInGroup(itemRef.current));\r\n }\r\n }, 0);\r\n\r\n return () => clearTimeout(timer);\r\n }, [isInGroup, isMobile]);\r\n\r\n if (isMobile) {\r\n // Find the parent submenu ID\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n // Get the closest parent with data-submenu-id attribute\r\n const element = e.currentTarget as HTMLElement;\r\n let submenuId: string | null = null;\r\n\r\n // First check if the element itself has the data attribute\r\n if (element.closest(\"[data-submenu-id]\")) {\r\n const closestElement = element.closest(\"[data-submenu-id]\");\r\n const id = closestElement?.getAttribute(\"data-submenu-id\");\r\n if (id) {\r\n submenuId = id;\r\n }\r\n }\r\n\r\n // If not found, try props\r\n if (!submenuId) {\r\n submenuId =\r\n ((props as Record<string, unknown>)[\r\n \"data-parent-submenu-id\"\r\n ] as string) ||\r\n ((props as Record<string, unknown>)[\"data-parent-submenu\"] as string);\r\n }\r\n\r\n if (!submenuId) {\r\n return;\r\n }\r\n\r\n // Get the title\r\n const title = typeof children === \"string\" ? children : \"Submenu\";\r\n\r\n // Navigate to the submenu\r\n if (navigateToSubmenu) {\r\n navigateToSubmenu(submenuId, title);\r\n }\r\n };\r\n\r\n // Combine onClick handlers\r\n const combinedOnClick = (e: React.MouseEvent) => {\r\n // Call the original onClick if provided\r\n const typedProps = props as Record<string, unknown>;\r\n if (typedProps[\"onClick\"]) {\r\n const originalOnClick = typedProps[\r\n \"onClick\"\r\n ] as React.MouseEventHandler<HTMLDivElement>;\r\n originalOnClick(e as React.MouseEvent<HTMLDivElement>);\r\n }\r\n\r\n // Call our navigation handler\r\n handleClick(e);\r\n };\r\n\r\n // Remove onClick from props to avoid duplicate handlers\r\n const { ...restProps } = props as Record<string, unknown>;\r\n\r\n // Don't wrap in DrawerClose for submenu triggers\r\n return (\r\n <div\r\n ref={itemRef}\r\n data-slot=\"drop-drawer-sub-trigger\"\r\n data-inset={inset}\r\n className={cn(\r\n \"flex cursor-pointer items-center justify-between px-4 py-4\",\r\n // Only apply margin, background and rounded corners if not in a group\r\n !isInsideGroup &&\r\n \"bg-neutral-100 dark:bg-neutral-100 mx-2 my-1.5 rounded-md dark:bg-neutral-800 dark:dark:bg-neutral-800\",\r\n // For items in a group, don't add background but add more padding\r\n isInsideGroup && \"bg-transparent py-4\",\r\n inset && \"pl-8\",\r\n className,\r\n )}\r\n onClick={combinedOnClick}\r\n {...restProps}\r\n >\r\n <div className=\"flex items-center gap-2\">{children}</div>\r\n <ChevronRightIcon className=\"h-5 w-5\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenuSubTrigger\r\n data-slot=\"drop-drawer-sub-trigger\"\r\n data-inset={inset}\r\n className={className}\r\n inset={inset}\r\n {...props}\r\n >\r\n {children}\r\n </DropdownMenuSubTrigger>\r\n );\r\n}\r\n\r\nfunction DropDrawerSubContent({\r\n className,\r\n sideOffset = 4,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuSubContent>) {\r\n const { isMobile } = useDropDrawerContext();\r\n\r\n if (isMobile) {\r\n // For mobile, we don't render the content directly\r\n // It will be rendered by the DropDrawerContent component when active\r\n return null;\r\n }\r\n\r\n return (\r\n <DropdownMenuSubContent\r\n data-slot=\"drop-drawer-sub-content\"\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-neutral-200 p-1 shadow-lg dark:border-neutral-800\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </DropdownMenuSubContent>\r\n );\r\n}\r\n\r\nexport {\r\n DropDrawer,\r\n DropDrawerContent,\r\n DropDrawerFooter,\r\n DropDrawerGroup,\r\n DropDrawerItem,\r\n DropDrawerLabel,\r\n DropDrawerSeparator,\r\n DropDrawerSub,\r\n DropDrawerSubContent,\r\n DropDrawerSubTrigger,\r\n DropDrawerTrigger,\r\n};\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","DropDrawerContext","React","useDropDrawerContext","context","Error","DropDrawer","children","props","isMobile","useIsMobile","DropdownComponent","Drawer","DropdownMenu","DropDrawerTrigger","className","TriggerComponent","DrawerTrigger","DropdownMenuTrigger","DropDrawerContent","activeSubmenu","setActiveSubmenu","submenuTitle","setSubmenuTitle","submenuStack","setSubmenuStack","animationDirection","setAnimationDirection","submenuContentRef","Map","navigateToSubmenu","id","title","prev","goBack","newStack","previous","registerSubmenuContent","content","extractSubmenuContent","elements","targetId","result","findSubmenuContent","node","element","DropDrawerSub","elementId","dataSubmenuId","child","DropDrawerSubContent","subContentProps","contentChild","Array","getSubmenuContent","cachedContent","submenuContent","variants","direction","transition","SubmenuContext","DrawerContent","cn","DrawerHeader","ChevronLeftIcon","DrawerTitle","AnimatePresence","motion","DropdownMenuContent","DropDrawerItem","onSelect","onClick","icon","variant","inset","disabled","isInGroup","parent","itemRef","isInsideGroup","setIsInsideGroup","timer","setTimeout","clearTimeout","handleClick","e","isInSubmenu","DrawerClose","DropdownMenuItem","DropDrawerSeparator","DropdownMenuSeparator","DropDrawerLabel","DropdownMenuLabel","DropDrawerFooter","DrawerFooter","DropDrawerGroup","childrenWithSeparators","childArray","filteredChildren","index","undefined","submenuIdCounter","generatedId","submenuId","contentItems","processedChildren","DropDrawerSubTrigger","DropdownMenuSub","closestElement","combinedOnClick","typedProps","originalOnClick","restProps","ChevronRightIcon","DropdownMenuSubTrigger","sideOffset","DropdownMenuSubContent"],"mappings":"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"}