@avenue-ticketing/ui 0.8.0 → 0.10.0

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.
@@ -263,7 +263,7 @@ var DialogContent = ({
263
263
  );
264
264
  const overlayClassName = useMemo(
265
265
  () => cn(
266
- "fixed inset-0 bg-black/40 dark:bg-black/60",
266
+ "fixed inset-0 bg-black/40 dark:bg-primary/4",
267
267
  !useBottomSheetMotion && !slideEntrance && "transition-opacity ease-in-out",
268
268
  isAnimating ? "opacity-100" : "opacity-0"
269
269
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/dialog.tsx"],"names":[],"mappings":"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","file":"dialog.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\n\n/** Used for slide / bottom-sheet motion — duration + entry/exit easing (see `slideMotionEasing`). */\nconst DIALOG_MOTION_MS = 200;\nconst DIALOG_ENTRY_MOTION_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DIALOG_EXIT_MOTION_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\n\n/** matches `SHEET_MOBILE_MAX_WIDTH_PX` in sheet.tsx */\nconst DIALOG_MOBILE_BOTTOM_SHEET_MAX_PX = 1024;\n\nconst DIALOG_Z_BASE = 50;\nconst DIALOG_Z_STEP = 10;\n\nlet dialogBodyScrollLockCount = 0;\nconst dialogEscapeClosers: Array<() => void> = [];\n\nfunction dialogEscapeOnKeydown(e: KeyboardEvent) {\n if (e.key !== \"Escape\") return;\n const top = dialogEscapeClosers[dialogEscapeClosers.length - 1];\n if (!top) return;\n e.preventDefault();\n top();\n}\n\nfunction dialogPushEscapeCloser(closer: () => void) {\n dialogEscapeClosers.push(closer);\n if (dialogEscapeClosers.length === 1) {\n window.addEventListener(\"keydown\", dialogEscapeOnKeydown, true);\n }\n}\n\nfunction dialogPopEscapeCloser(closer: () => void) {\n const i = dialogEscapeClosers.lastIndexOf(closer);\n if (i >= 0) dialogEscapeClosers.splice(i, 1);\n if (dialogEscapeClosers.length === 0) {\n window.removeEventListener(\"keydown\", dialogEscapeOnKeydown, true);\n }\n}\n\ntype DialogSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nfunction useDialogMobileBottomSheetViewport() {\n const query = `(max-width: ${DIALOG_MOBILE_BOTTOM_SHEET_MAX_PX}px)`;\n return useSyncExternalStore(\n (onChange) => {\n const mq = window.matchMedia(query);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n },\n () => window.matchMedia(query).matches,\n () => false,\n );\n}\n\n/**\n * Slide distance for `slideEntrance`, scaled to `size` (full keeps 120px like a\n * mobile sheet; smaller presets use shorter travel so the motion matches width).\n */\nconst SLIDE_ENTRANCE_OFFSET_PX: Record<DialogSize, number> = {\n sm: 16,\n md: 16,\n lg: 16,\n xl: 16,\n full: 120,\n};\n\nconst SIZE_CLASSES: Record<Exclude<DialogSize, \"full\">, string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n};\n\nconst SIZE_CLASSES_LG_ONLY: Record<Exclude<DialogSize, \"full\">, string> = {\n sm: \"lg:max-w-sm\",\n md: \"lg:max-w-md\",\n lg: \"lg:max-w-lg\",\n xl: \"lg:max-w-xl\",\n};\n\n/** Same pattern as `useSheetRenderLifecycle` in sheet.tsx (portal + enter/exit timing). */\nfunction useDialogRenderLifecycle(open: boolean, panelCloseMs: number) {\n const [shouldRender, setShouldRender] = useState(open);\n const [isAnimating, setIsAnimating] = useState(false);\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), panelCloseMs);\n return () => clearTimeout(timer);\n }\n }, [open, panelCloseMs]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n return { shouldRender, isAnimating };\n}\n\n//////////////////////////////////////////////// Context\n\ntype DialogContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n /** nesting depth for z-index (1 = outermost dialog in tree) */\n depth: number;\n};\n\nconst DialogContext = React.createContext<DialogContextValue | undefined>(\n undefined,\n);\n\nfunction useDialog() {\n const context = React.useContext(DialogContext);\n if (!context) {\n throw new Error(\"Dialog components must be used within a <Dialog />\");\n }\n return context;\n}\n\n//////////////////////////////////////////////// Main\n\ninterface DialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const Dialog: React.FC<DialogProps> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n}) => {\n const parentCtx = React.useContext(DialogContext);\n const parentDepth = parentCtx?.depth ?? 0;\n const depth = parentDepth + 1;\n\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setInternalOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange],\n );\n\n const contextValue = useMemo<DialogContextValue>(\n () => ({ open, setOpen, depth }),\n [open, setOpen, depth],\n );\n\n return (\n <DialogContext.Provider value={contextValue}>\n {children}\n </DialogContext.Provider>\n );\n};\n\nexport const DialogTrigger: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useDialog();\n\n const handleClick = () => setOpen(true);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n });\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\nexport const DialogClose: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useDialog();\n\n const handleClick = () => setOpen(false);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n });\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\n//////////////////////////////////////////////// Close\n\nexport interface DialogCloseButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * Default dismiss control for {@link DialogContent}. Includes absolute top-right\n * placement; pass `className` to adjust or replace positioning.\n * When `onClick` is omitted, closes via the surrounding `Dialog` context (`setOpen(false)`).\n */\nexport const DialogCloseButton = React.forwardRef<\n HTMLButtonElement,\n DialogCloseButtonProps\n>(({ className, type = \"button\", onClick, ...props }, ref) => {\n const { setOpen } = useDialog();\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (onClick == null) {\n setOpen(false);\n }\n },\n [onClick, setOpen],\n );\n\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"z-100 flex size-12 cursor-pointer items-center justify-center rounded-full transition-all hover:bg-secondary-background active:scale-[0.96]\",\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n );\n});\nDialogCloseButton.displayName = \"DialogCloseButton\";\n\n//////////////////////////////////////////////// Content\n\ninterface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n duration?: number;\n closeOnOverlayClick?: boolean;\n showClose?: boolean;\n /**\n * When `true` (default), viewports ≤1024px use a bottom-anchored panel and\n * slide-up motion (same breakpoint as {@link SheetContent}). Wider viewports\n * keep the centered dialog. Set `false` to always use the centered dialog.\n */\n mobileBottomSheet?: boolean;\n /**\n * When `true`, panel uses translateY + opacity with fixed timing and separate\n * entry/exit curves (works with any `size`). Default `false` uses scale + fade.\n * Ignored when `mobileBottomSheet` applies on a narrow viewport.\n */\n slideEntrance?: boolean;\n /** Override slide distance (px); default follows `size` via `SLIDE_ENTRANCE_OFFSET_PX`. */\n slideEntranceOffsetPx?: number;\n}\n\nexport const DialogContent: React.FC<DialogContentProps> = ({\n children,\n size = \"md\",\n className,\n duration = 200,\n closeOnOverlayClick = true,\n showClose = true,\n mobileBottomSheet = true,\n slideEntrance = false,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n ...rest\n}) => {\n const { open, setOpen, depth } = useDialog();\n\n const isNarrowViewport = useDialogMobileBottomSheetViewport();\n\n const useMobileBottomSheet = useMemo(\n () => mobileBottomSheet !== false && isNarrowViewport,\n [mobileBottomSheet, isNarrowViewport],\n );\n\n const useMobileBottomSheetChrome = useMemo(\n () => mobileBottomSheet !== false && size !== \"full\",\n [mobileBottomSheet, size],\n );\n\n const slideOffsetPx = useMemo(\n () => slideEntranceOffsetPxProp ?? SLIDE_ENTRANCE_OFFSET_PX[size],\n [slideEntranceOffsetPxProp, size],\n );\n\n const useBottomSheetMotion = useMobileBottomSheet;\n const useDesktopSlideEntrance = slideEntrance && !useBottomSheetMotion;\n\n const panelCloseMs = useMemo(\n () =>\n useBottomSheetMotion\n ? DIALOG_MOTION_MS\n : slideEntrance\n ? DIALOG_MOTION_MS\n : duration,\n [useBottomSheetMotion, slideEntrance, duration],\n );\n\n const { shouldRender, isAnimating } = useDialogRenderLifecycle(\n open,\n panelCloseMs,\n );\n\n const slideMotionEasing = useMemo(\n () => (open ? DIALOG_ENTRY_MOTION_EASING : DIALOG_EXIT_MOTION_EASING),\n [open],\n );\n\n const portalZIndex = useMemo(\n () => DIALOG_Z_BASE + (depth - 1) * DIALOG_Z_STEP,\n [depth],\n );\n\n const handleOverlayClick = useCallback(() => {\n if (closeOnOverlayClick) setOpen(false);\n }, [closeOnOverlayClick, setOpen]);\n\n useEffect(() => {\n if (!open || typeof document === \"undefined\") return;\n\n const closer = () => setOpen(false);\n dialogPushEscapeCloser(closer);\n\n dialogBodyScrollLockCount += 1;\n if (dialogBodyScrollLockCount === 1) {\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n dialogPopEscapeCloser(closer);\n dialogBodyScrollLockCount -= 1;\n if (dialogBodyScrollLockCount <= 0) {\n dialogBodyScrollLockCount = 0;\n document.body.style.overflow = \"\";\n }\n };\n }, [open, setOpen]);\n\n const rootClassName = useMemo(\n () =>\n cn(\n \"fixed inset-0 flex\",\n size === \"full\"\n ? \"h-dvh w-full flex-col p-0\"\n : mobileBottomSheet !== false\n ? \"max-lg:items-end max-lg:justify-center max-lg:p-0 lg:items-center lg:justify-center lg:p-4\"\n : \"items-center justify-center p-4\",\n ),\n [size, mobileBottomSheet],\n );\n\n const rootStyle = useMemo(\n (): React.CSSProperties => ({ zIndex: portalZIndex }),\n [portalZIndex],\n );\n\n const overlayClassName = useMemo(\n () =>\n cn(\n \"fixed inset-0 bg-black/40 dark:bg-black/60\",\n !useBottomSheetMotion && !slideEntrance && \"transition-opacity ease-in-out\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n ),\n [useBottomSheetMotion, slideEntrance, isAnimating],\n );\n\n const overlayStyle = useMemo((): React.CSSProperties => {\n const style: React.CSSProperties = {\n transitionDuration: `${panelCloseMs}ms`,\n };\n if (useBottomSheetMotion || slideEntrance) {\n style.transitionProperty = \"opacity\";\n style.transitionTimingFunction = slideMotionEasing;\n }\n return style;\n }, [panelCloseMs, useBottomSheetMotion, slideEntrance, slideMotionEasing]);\n\n const panelClassName = useMemo(() => {\n const sizeKey = size === \"full\" ? null : size;\n return cn(\n \"bg-background relative z-10 w-full overflow-hidden shadow-2xl\",\n size === \"full\"\n ? \"flex min-h-0 flex-1 flex-col max-w-none rounded-none\"\n : cn(\n \"border-primary/10 border\",\n useMobileBottomSheetChrome\n ? \"max-lg:max-h-[min(90dvh,calc(100dvh-env(safe-area-inset-bottom,0px)))] max-lg:rounded-t-2xl max-lg:rounded-b-none max-lg:border-x-0 max-lg:border-b-0 max-lg:border-t max-lg:border-primary/10 lg:rounded-2xl\"\n : \"rounded-2xl\",\n sizeKey &&\n (useMobileBottomSheetChrome\n ? SIZE_CLASSES_LG_ONLY[sizeKey]\n : SIZE_CLASSES[sizeKey]),\n ),\n !useBottomSheetMotion &&\n !useDesktopSlideEntrance &&\n cn(\n \"transition-all ease-in-out\",\n isAnimating ? \"scale-100 opacity-100\" : \"scale-95 opacity-0\",\n ),\n className,\n );\n }, [\n size,\n useMobileBottomSheetChrome,\n useBottomSheetMotion,\n useDesktopSlideEntrance,\n isAnimating,\n className,\n ]);\n\n const panelStyle = useMemo((): React.CSSProperties => {\n const base = { ...rest.style };\n if (useBottomSheetMotion) {\n return {\n ...base,\n transform: isAnimating ? \"translateY(0)\" : \"translateY(100%)\",\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DIALOG_MOTION_MS}ms`,\n transitionTimingFunction: slideMotionEasing,\n };\n }\n if (useDesktopSlideEntrance) {\n return {\n ...base,\n transform: isAnimating\n ? \"translateY(0)\"\n : `translateY(${slideOffsetPx}px)`,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DIALOG_MOTION_MS}ms`,\n transitionTimingFunction: slideMotionEasing,\n };\n }\n return {\n ...base,\n transitionDuration: `${duration}ms`,\n };\n }, [\n rest.style,\n useBottomSheetMotion,\n useDesktopSlideEntrance,\n isAnimating,\n slideOffsetPx,\n slideMotionEasing,\n duration,\n ]);\n\n if (!shouldRender) return null;\n\n return createPortal(\n <div className={rootClassName} style={rootStyle}>\n <div\n className={overlayClassName}\n style={overlayStyle}\n onClick={handleOverlayClick}\n />\n\n <div {...rest} className={panelClassName} style={panelStyle}>\n {children}\n\n {showClose && (\n <DialogCloseButton\n className={cn(\"absolute top-4 right-4 md:top-4 md:right-4\")}\n />\n )}\n </div>\n </div>,\n document.body,\n );\n};\n\nexport const DialogHeader: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => {\n return (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 p-6 text-center sm:text-left\",\n fixed && \"bg-background border-primary/10 sticky top-0 z-10 border-b\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogFooter: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => {\n return (\n <div\n className={cn(\n \"flex flex-col-reverse p-6 sm:flex-row sm:justify-end sm:space-x-2\",\n fixed &&\n \"bg-background border-primary/10 sticky bottom-0 z-10 border-t pb-[max(1.5rem,env(safe-area-inset-bottom))]\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogTitle: React.FC<\n React.HTMLAttributes<HTMLHeadingElement>\n> = ({ className, ...props }) => {\n return (\n <h3\n className={cn(\n \"text-primary text-xl leading-none font-semibold\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogDescription: React.FC<\n React.HTMLAttributes<HTMLParagraphElement>\n> = ({ className, ...props }) => {\n return (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n );\n};\n"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/dialog.tsx"],"names":[],"mappings":"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","file":"dialog.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\n\n/** Used for slide / bottom-sheet motion — duration + entry/exit easing (see `slideMotionEasing`). */\nconst DIALOG_MOTION_MS = 200;\nconst DIALOG_ENTRY_MOTION_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DIALOG_EXIT_MOTION_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\n\n/** matches `SHEET_MOBILE_MAX_WIDTH_PX` in sheet.tsx */\nconst DIALOG_MOBILE_BOTTOM_SHEET_MAX_PX = 1024;\n\nconst DIALOG_Z_BASE = 50;\nconst DIALOG_Z_STEP = 10;\n\nlet dialogBodyScrollLockCount = 0;\nconst dialogEscapeClosers: Array<() => void> = [];\n\nfunction dialogEscapeOnKeydown(e: KeyboardEvent) {\n if (e.key !== \"Escape\") return;\n const top = dialogEscapeClosers[dialogEscapeClosers.length - 1];\n if (!top) return;\n e.preventDefault();\n top();\n}\n\nfunction dialogPushEscapeCloser(closer: () => void) {\n dialogEscapeClosers.push(closer);\n if (dialogEscapeClosers.length === 1) {\n window.addEventListener(\"keydown\", dialogEscapeOnKeydown, true);\n }\n}\n\nfunction dialogPopEscapeCloser(closer: () => void) {\n const i = dialogEscapeClosers.lastIndexOf(closer);\n if (i >= 0) dialogEscapeClosers.splice(i, 1);\n if (dialogEscapeClosers.length === 0) {\n window.removeEventListener(\"keydown\", dialogEscapeOnKeydown, true);\n }\n}\n\ntype DialogSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nfunction useDialogMobileBottomSheetViewport() {\n const query = `(max-width: ${DIALOG_MOBILE_BOTTOM_SHEET_MAX_PX}px)`;\n return useSyncExternalStore(\n (onChange) => {\n const mq = window.matchMedia(query);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n },\n () => window.matchMedia(query).matches,\n () => false,\n );\n}\n\n/**\n * Slide distance for `slideEntrance`, scaled to `size` (full keeps 120px like a\n * mobile sheet; smaller presets use shorter travel so the motion matches width).\n */\nconst SLIDE_ENTRANCE_OFFSET_PX: Record<DialogSize, number> = {\n sm: 16,\n md: 16,\n lg: 16,\n xl: 16,\n full: 120,\n};\n\nconst SIZE_CLASSES: Record<Exclude<DialogSize, \"full\">, string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n};\n\nconst SIZE_CLASSES_LG_ONLY: Record<Exclude<DialogSize, \"full\">, string> = {\n sm: \"lg:max-w-sm\",\n md: \"lg:max-w-md\",\n lg: \"lg:max-w-lg\",\n xl: \"lg:max-w-xl\",\n};\n\n/** Same pattern as `useSheetRenderLifecycle` in sheet.tsx (portal + enter/exit timing). */\nfunction useDialogRenderLifecycle(open: boolean, panelCloseMs: number) {\n const [shouldRender, setShouldRender] = useState(open);\n const [isAnimating, setIsAnimating] = useState(false);\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), panelCloseMs);\n return () => clearTimeout(timer);\n }\n }, [open, panelCloseMs]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n return { shouldRender, isAnimating };\n}\n\n//////////////////////////////////////////////// Context\n\ntype DialogContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n /** nesting depth for z-index (1 = outermost dialog in tree) */\n depth: number;\n};\n\nconst DialogContext = React.createContext<DialogContextValue | undefined>(\n undefined,\n);\n\nfunction useDialog() {\n const context = React.useContext(DialogContext);\n if (!context) {\n throw new Error(\"Dialog components must be used within a <Dialog />\");\n }\n return context;\n}\n\n//////////////////////////////////////////////// Main\n\ninterface DialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const Dialog: React.FC<DialogProps> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n}) => {\n const parentCtx = React.useContext(DialogContext);\n const parentDepth = parentCtx?.depth ?? 0;\n const depth = parentDepth + 1;\n\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setInternalOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange],\n );\n\n const contextValue = useMemo<DialogContextValue>(\n () => ({ open, setOpen, depth }),\n [open, setOpen, depth],\n );\n\n return (\n <DialogContext.Provider value={contextValue}>\n {children}\n </DialogContext.Provider>\n );\n};\n\nexport const DialogTrigger: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useDialog();\n\n const handleClick = () => setOpen(true);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n });\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\nexport const DialogClose: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useDialog();\n\n const handleClick = () => setOpen(false);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n });\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\n//////////////////////////////////////////////// Close\n\nexport interface DialogCloseButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * Default dismiss control for {@link DialogContent}. Includes absolute top-right\n * placement; pass `className` to adjust or replace positioning.\n * When `onClick` is omitted, closes via the surrounding `Dialog` context (`setOpen(false)`).\n */\nexport const DialogCloseButton = React.forwardRef<\n HTMLButtonElement,\n DialogCloseButtonProps\n>(({ className, type = \"button\", onClick, ...props }, ref) => {\n const { setOpen } = useDialog();\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (onClick == null) {\n setOpen(false);\n }\n },\n [onClick, setOpen],\n );\n\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"z-100 flex size-12 cursor-pointer items-center justify-center rounded-full transition-all hover:bg-secondary-background active:scale-[0.96]\",\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n );\n});\nDialogCloseButton.displayName = \"DialogCloseButton\";\n\n//////////////////////////////////////////////// Content\n\ninterface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n duration?: number;\n closeOnOverlayClick?: boolean;\n showClose?: boolean;\n /**\n * When `true` (default), viewports ≤1024px use a bottom-anchored panel and\n * slide-up motion (same breakpoint as {@link SheetContent}). Wider viewports\n * keep the centered dialog. Set `false` to always use the centered dialog.\n */\n mobileBottomSheet?: boolean;\n /**\n * When `true`, panel uses translateY + opacity with fixed timing and separate\n * entry/exit curves (works with any `size`). Default `false` uses scale + fade.\n * Ignored when `mobileBottomSheet` applies on a narrow viewport.\n */\n slideEntrance?: boolean;\n /** Override slide distance (px); default follows `size` via `SLIDE_ENTRANCE_OFFSET_PX`. */\n slideEntranceOffsetPx?: number;\n}\n\nexport const DialogContent: React.FC<DialogContentProps> = ({\n children,\n size = \"md\",\n className,\n duration = 200,\n closeOnOverlayClick = true,\n showClose = true,\n mobileBottomSheet = true,\n slideEntrance = false,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n ...rest\n}) => {\n const { open, setOpen, depth } = useDialog();\n\n const isNarrowViewport = useDialogMobileBottomSheetViewport();\n\n const useMobileBottomSheet = useMemo(\n () => mobileBottomSheet !== false && isNarrowViewport,\n [mobileBottomSheet, isNarrowViewport],\n );\n\n const useMobileBottomSheetChrome = useMemo(\n () => mobileBottomSheet !== false && size !== \"full\",\n [mobileBottomSheet, size],\n );\n\n const slideOffsetPx = useMemo(\n () => slideEntranceOffsetPxProp ?? SLIDE_ENTRANCE_OFFSET_PX[size],\n [slideEntranceOffsetPxProp, size],\n );\n\n const useBottomSheetMotion = useMobileBottomSheet;\n const useDesktopSlideEntrance = slideEntrance && !useBottomSheetMotion;\n\n const panelCloseMs = useMemo(\n () =>\n useBottomSheetMotion\n ? DIALOG_MOTION_MS\n : slideEntrance\n ? DIALOG_MOTION_MS\n : duration,\n [useBottomSheetMotion, slideEntrance, duration],\n );\n\n const { shouldRender, isAnimating } = useDialogRenderLifecycle(\n open,\n panelCloseMs,\n );\n\n const slideMotionEasing = useMemo(\n () => (open ? DIALOG_ENTRY_MOTION_EASING : DIALOG_EXIT_MOTION_EASING),\n [open],\n );\n\n const portalZIndex = useMemo(\n () => DIALOG_Z_BASE + (depth - 1) * DIALOG_Z_STEP,\n [depth],\n );\n\n const handleOverlayClick = useCallback(() => {\n if (closeOnOverlayClick) setOpen(false);\n }, [closeOnOverlayClick, setOpen]);\n\n useEffect(() => {\n if (!open || typeof document === \"undefined\") return;\n\n const closer = () => setOpen(false);\n dialogPushEscapeCloser(closer);\n\n dialogBodyScrollLockCount += 1;\n if (dialogBodyScrollLockCount === 1) {\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n dialogPopEscapeCloser(closer);\n dialogBodyScrollLockCount -= 1;\n if (dialogBodyScrollLockCount <= 0) {\n dialogBodyScrollLockCount = 0;\n document.body.style.overflow = \"\";\n }\n };\n }, [open, setOpen]);\n\n const rootClassName = useMemo(\n () =>\n cn(\n \"fixed inset-0 flex\",\n size === \"full\"\n ? \"h-dvh w-full flex-col p-0\"\n : mobileBottomSheet !== false\n ? \"max-lg:items-end max-lg:justify-center max-lg:p-0 lg:items-center lg:justify-center lg:p-4\"\n : \"items-center justify-center p-4\",\n ),\n [size, mobileBottomSheet],\n );\n\n const rootStyle = useMemo(\n (): React.CSSProperties => ({ zIndex: portalZIndex }),\n [portalZIndex],\n );\n\n const overlayClassName = useMemo(\n () =>\n cn(\n \"fixed inset-0 bg-black/40 dark:bg-primary/4\",\n !useBottomSheetMotion && !slideEntrance && \"transition-opacity ease-in-out\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n ),\n [useBottomSheetMotion, slideEntrance, isAnimating],\n );\n\n const overlayStyle = useMemo((): React.CSSProperties => {\n const style: React.CSSProperties = {\n transitionDuration: `${panelCloseMs}ms`,\n };\n if (useBottomSheetMotion || slideEntrance) {\n style.transitionProperty = \"opacity\";\n style.transitionTimingFunction = slideMotionEasing;\n }\n return style;\n }, [panelCloseMs, useBottomSheetMotion, slideEntrance, slideMotionEasing]);\n\n const panelClassName = useMemo(() => {\n const sizeKey = size === \"full\" ? null : size;\n return cn(\n \"bg-background relative z-10 w-full overflow-hidden shadow-2xl\",\n size === \"full\"\n ? \"flex min-h-0 flex-1 flex-col max-w-none rounded-none\"\n : cn(\n \"border-primary/10 border\",\n useMobileBottomSheetChrome\n ? \"max-lg:max-h-[min(90dvh,calc(100dvh-env(safe-area-inset-bottom,0px)))] max-lg:rounded-t-2xl max-lg:rounded-b-none max-lg:border-x-0 max-lg:border-b-0 max-lg:border-t max-lg:border-primary/10 lg:rounded-2xl\"\n : \"rounded-2xl\",\n sizeKey &&\n (useMobileBottomSheetChrome\n ? SIZE_CLASSES_LG_ONLY[sizeKey]\n : SIZE_CLASSES[sizeKey]),\n ),\n !useBottomSheetMotion &&\n !useDesktopSlideEntrance &&\n cn(\n \"transition-all ease-in-out\",\n isAnimating ? \"scale-100 opacity-100\" : \"scale-95 opacity-0\",\n ),\n className,\n );\n }, [\n size,\n useMobileBottomSheetChrome,\n useBottomSheetMotion,\n useDesktopSlideEntrance,\n isAnimating,\n className,\n ]);\n\n const panelStyle = useMemo((): React.CSSProperties => {\n const base = { ...rest.style };\n if (useBottomSheetMotion) {\n return {\n ...base,\n transform: isAnimating ? \"translateY(0)\" : \"translateY(100%)\",\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DIALOG_MOTION_MS}ms`,\n transitionTimingFunction: slideMotionEasing,\n };\n }\n if (useDesktopSlideEntrance) {\n return {\n ...base,\n transform: isAnimating\n ? \"translateY(0)\"\n : `translateY(${slideOffsetPx}px)`,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DIALOG_MOTION_MS}ms`,\n transitionTimingFunction: slideMotionEasing,\n };\n }\n return {\n ...base,\n transitionDuration: `${duration}ms`,\n };\n }, [\n rest.style,\n useBottomSheetMotion,\n useDesktopSlideEntrance,\n isAnimating,\n slideOffsetPx,\n slideMotionEasing,\n duration,\n ]);\n\n if (!shouldRender) return null;\n\n return createPortal(\n <div className={rootClassName} style={rootStyle}>\n <div\n className={overlayClassName}\n style={overlayStyle}\n onClick={handleOverlayClick}\n />\n\n <div {...rest} className={panelClassName} style={panelStyle}>\n {children}\n\n {showClose && (\n <DialogCloseButton\n className={cn(\"absolute top-4 right-4 md:top-4 md:right-4\")}\n />\n )}\n </div>\n </div>,\n document.body,\n );\n};\n\nexport const DialogHeader: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => {\n return (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 p-6 text-center sm:text-left\",\n fixed && \"bg-background border-primary/10 sticky top-0 z-10 border-b\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogFooter: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => {\n return (\n <div\n className={cn(\n \"flex flex-col-reverse p-6 sm:flex-row sm:justify-end sm:space-x-2\",\n fixed &&\n \"bg-background border-primary/10 sticky bottom-0 z-10 border-t pb-[max(1.5rem,env(safe-area-inset-bottom))]\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogTitle: React.FC<\n React.HTMLAttributes<HTMLHeadingElement>\n> = ({ className, ...props }) => {\n return (\n <h3\n className={cn(\n \"text-primary text-xl leading-none font-semibold\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogDescription: React.FC<\n React.HTMLAttributes<HTMLParagraphElement>\n> = ({ className, ...props }) => {\n return (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n );\n};\n"]}
@@ -59,6 +59,8 @@ interface DropdownContentProps extends React__default.HTMLAttributes<HTMLDivElem
59
59
  minWidth?: number | "trigger";
60
60
  /** Loop keyboard focus at list boundaries */
61
61
  loop?: boolean;
62
+ /** Type characters to jump to matching items (default true). */
63
+ typeahead?: boolean;
62
64
  /**
63
65
  * Mobile (≤1024px) bottom-sheet configuration (`sheet`, `title`, panel
64
66
  * `className`, optional scroll body `contentClassName` after default `pb-20`
@@ -129,6 +131,8 @@ declare const DropdownSubContent: React__default.FC<React__default.HTMLAttribute
129
131
  /** Same as {@link DropdownContent} slideEntrance; default true. */
130
132
  slideEntrance?: boolean;
131
133
  slideEntranceOffsetPx?: number;
134
+ /** Same as {@link DropdownContent}; default true. */
135
+ typeahead?: boolean;
132
136
  }>;
133
137
 
134
138
  export { Dropdown, DropdownCheckboxItem, DropdownChevron, DropdownContent, DropdownItem, DropdownLabel, DropdownMobileClose, type DropdownMobileCloseProps, type DropdownMobileSheetOptions, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, type DropdownTriggerProps };
@@ -181,6 +181,85 @@ var Checkbox = React3.forwardRef(
181
181
  }
182
182
  );
183
183
  Checkbox.displayName = "Checkbox";
184
+
185
+ // src/lib/typeahead.ts
186
+ var TYPEAHEAD_TIMEOUT_MS = 500;
187
+ function createTypeaheadState() {
188
+ return { search: "", timer: null };
189
+ }
190
+ function resetTypeahead(state) {
191
+ state.search = "";
192
+ if (state.timer) {
193
+ clearTimeout(state.timer);
194
+ state.timer = null;
195
+ }
196
+ }
197
+ function getItemLabel(item) {
198
+ const aria = item.getAttribute("aria-label")?.trim();
199
+ if (aria) return aria;
200
+ const marked = item.querySelector("[data-menu-label]");
201
+ if (marked?.textContent) return marked.textContent.replace(/\s+/g, " ").trim();
202
+ return (item.textContent ?? "").replace(/\s+/g, " ").trim();
203
+ }
204
+ function normalizeSearch(value) {
205
+ return value.trim().toLocaleLowerCase();
206
+ }
207
+ function isTypeaheadTarget(target) {
208
+ if (!(target instanceof HTMLElement)) return true;
209
+ if (target.isContentEditable) return false;
210
+ const tag = target.tagName;
211
+ return tag !== "INPUT" && tag !== "TEXTAREA" && tag !== "SELECT";
212
+ }
213
+ function handleTypeaheadKeyDown(event, items, state, options) {
214
+ if (options?.enabled === false || items.length === 0) return false;
215
+ if (event.ctrlKey || event.metaKey || event.altKey) return false;
216
+ if (event.key.length !== 1 || !isTypeaheadTarget(event.target)) return false;
217
+ event.preventDefault();
218
+ const timeoutMs = options?.timeoutMs ?? TYPEAHEAD_TIMEOUT_MS;
219
+ const char = event.key;
220
+ const prevSearch = state.search;
221
+ const repeatSingleChar = prevSearch.length === 1 && prevSearch === char;
222
+ if (repeatSingleChar) {
223
+ state.search = prevSearch;
224
+ } else {
225
+ state.search = prevSearch + char;
226
+ }
227
+ if (state.timer) clearTimeout(state.timer);
228
+ state.timer = setTimeout(() => {
229
+ state.search = "";
230
+ state.timer = null;
231
+ }, timeoutMs);
232
+ const labels = items.map((item) => normalizeSearch(getItemLabel(item)));
233
+ let needle = normalizeSearch(state.search);
234
+ let matches = items.map((item, index) => ({ item, index, label: labels[index] })).filter(({ label }) => label.startsWith(needle));
235
+ if (matches.length === 0 && state.search.length > 1) {
236
+ state.search = char;
237
+ needle = normalizeSearch(char);
238
+ matches = items.map((item, index) => ({ item, index, label: labels[index] })).filter(({ label }) => label.startsWith(needle));
239
+ }
240
+ if (matches.length === 0) return true;
241
+ const focused = document.activeElement;
242
+ const focusedIndex = focused ? items.indexOf(focused) : -1;
243
+ if (repeatSingleChar && focusedIndex !== -1) {
244
+ const currentMatch = matches.findIndex(
245
+ ({ index }) => index === focusedIndex
246
+ );
247
+ if (currentMatch !== -1) {
248
+ const next = matches[(currentMatch + 1) % matches.length];
249
+ next?.item.focus();
250
+ return true;
251
+ }
252
+ }
253
+ if (focusedIndex !== -1) {
254
+ const nextAfterFocus = matches.find(({ index }) => index > focusedIndex);
255
+ if (nextAfterFocus) {
256
+ nextAfterFocus.item.focus();
257
+ return true;
258
+ }
259
+ }
260
+ matches[0]?.item.focus();
261
+ return true;
262
+ }
184
263
  var DROPDOWN_PANEL_OPEN_EASING = "cubic-bezier(0,0.55,0.45,1)";
185
264
  var DROPDOWN_PANEL_CLOSE_EASING = "cubic-bezier(0.55,0,1,0.45)";
186
265
  var DROPDOWN_MENU_MIN_WIDTH_PX = 192;
@@ -304,9 +383,6 @@ function computePos(trigger, menu, side, align, offset, pad) {
304
383
  left = fl;
305
384
  }
306
385
  }
307
- const layoutHeight = maxHeight ?? contentHeight;
308
- left = Math.max(sx + pad, Math.min(left, vw + sx - mr.width - pad));
309
- top = Math.max(sy + pad, Math.min(top, vh + sy - layoutHeight - pad));
310
386
  return { top, left, side: effectiveSide, maxHeight };
311
387
  }
312
388
  function useIsMobile(breakpoint = 1025) {
@@ -496,7 +572,7 @@ function DropdownMobileBottomSheetPortal({
496
572
  "div",
497
573
  {
498
574
  className: cn(
499
- "fixed inset-0 bg-black/40 dark:bg-black/60",
575
+ "fixed inset-0 bg-black/40 dark:bg-primary/4",
500
576
  isAnimating ? "opacity-100" : "opacity-0"
501
577
  ),
502
578
  style: {
@@ -578,6 +654,7 @@ var DropdownContent = ({
578
654
  closeOnEscape = true,
579
655
  minWidth = "trigger",
580
656
  loop = true,
657
+ typeahead = true,
581
658
  mobileOptions,
582
659
  slideEntrance = true,
583
660
  slideEntranceOffsetPx: slideEntranceOffsetPxProp,
@@ -592,6 +669,7 @@ var DropdownContent = ({
592
669
  const [pos, setPos] = useState({ top: -9999, left: -9999, side });
593
670
  const [triggerW, setTriggerW] = useState(0);
594
671
  const menuRef = useRef(null);
672
+ const typeaheadStateRef = useRef(createTypeaheadState());
595
673
  const resolvedMobile = resolveDropdownMobileSheet(mobileOptions);
596
674
  const isMobileSheet = isMobile && resolvedMobile.sheet;
597
675
  const slideOffsetPx = slideEntranceOffsetPxProp ?? DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX;
@@ -666,6 +744,9 @@ var DropdownContent = ({
666
744
  menuRef.current.focus();
667
745
  }
668
746
  }, [isAnimating]);
747
+ useEffect(() => {
748
+ if (!open) resetTypeahead(typeaheadStateRef.current);
749
+ }, [open]);
669
750
  useEffect(() => {
670
751
  if (!open) return;
671
752
  const handler = (e) => {
@@ -720,11 +801,16 @@ var DropdownContent = ({
720
801
  case "Tab":
721
802
  setOpen(false);
722
803
  break;
804
+ default:
805
+ handleTypeaheadKeyDown(e, items, typeaheadStateRef.current, {
806
+ enabled: typeahead
807
+ });
808
+ break;
723
809
  }
724
810
  };
725
811
  window.addEventListener("keydown", handler);
726
812
  return () => window.removeEventListener("keydown", handler);
727
- }, [open, closeOnEscape, loop, setOpen, triggerRef]);
813
+ }, [open, closeOnEscape, loop, typeahead, setOpen, triggerRef]);
728
814
  useEffect(() => {
729
815
  if (!open || !isMobileSheet) return;
730
816
  document.body.style.overflow = "hidden";
@@ -848,7 +934,7 @@ var DropdownItem = ({
848
934
  ),
849
935
  children: [
850
936
  icon && /* @__PURE__ */ jsx("span", { className: "flex size-4 shrink-0 items-center justify-center", children: icon }),
851
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children }),
937
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", "data-menu-label": true, children }),
852
938
  shortcut ? /* @__PURE__ */ jsx(
853
939
  "span",
854
940
  {
@@ -935,7 +1021,7 @@ var DropdownCheckboxItem = ({
935
1021
  className: "pointer-events-none"
936
1022
  }
937
1023
  ) }),
938
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children }),
1024
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", "data-menu-label": true, children }),
939
1025
  shortcut && /* @__PURE__ */ jsx(
940
1026
  "span",
941
1027
  {
@@ -1022,7 +1108,7 @@ var DropdownRadioItem = ({
1022
1108
  className
1023
1109
  ),
1024
1110
  children: [
1025
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children }),
1111
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", "data-menu-label": true, children }),
1026
1112
  shortcut ? /* @__PURE__ */ jsx(
1027
1113
  "span",
1028
1114
  {
@@ -1100,7 +1186,7 @@ var DropdownSubTrigger = ({ children, icon, inset, disabled = false, className,
1100
1186
  ),
1101
1187
  children: [
1102
1188
  icon && /* @__PURE__ */ jsx("span", { className: "flex size-4 shrink-0 items-center justify-center", children: icon }),
1103
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children }),
1189
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", "data-menu-label": true, children }),
1104
1190
  /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto size-4 shrink-0 opacity-50" })
1105
1191
  ]
1106
1192
  }
@@ -1113,6 +1199,7 @@ var DropdownSubContent = ({
1113
1199
  mobileOptions,
1114
1200
  slideEntrance = true,
1115
1201
  slideEntranceOffsetPx: slideEntranceOffsetPxProp,
1202
+ typeahead = true,
1116
1203
  className,
1117
1204
  style,
1118
1205
  onKeyDown: onKeyDownProp,
@@ -1133,6 +1220,7 @@ var DropdownSubContent = ({
1133
1220
  side: "right"
1134
1221
  });
1135
1222
  const menuRef = useRef(null);
1223
+ const typeaheadStateRef = useRef(createTypeaheadState());
1136
1224
  useEffect(() => {
1137
1225
  if (open) {
1138
1226
  setShouldRender(true);
@@ -1206,6 +1294,9 @@ var DropdownSubContent = ({
1206
1294
  menuRef.current.focus();
1207
1295
  }
1208
1296
  }, [isAnimating]);
1297
+ useEffect(() => {
1298
+ if (!open) resetTypeahead(typeaheadStateRef.current);
1299
+ }, [open]);
1209
1300
  useEffect(() => {
1210
1301
  if (!open) return;
1211
1302
  const handler = (e) => {
@@ -1256,9 +1347,14 @@ var DropdownSubContent = ({
1256
1347
  e.preventDefault();
1257
1348
  items[items.length - 1]?.focus();
1258
1349
  break;
1350
+ default:
1351
+ handleTypeaheadKeyDown(e.nativeEvent, items, typeaheadStateRef.current, {
1352
+ enabled: typeahead
1353
+ });
1354
+ break;
1259
1355
  }
1260
1356
  },
1261
- [onKeyDownProp, setOpen, triggerRef]
1357
+ [onKeyDownProp, setOpen, triggerRef, typeahead]
1262
1358
  );
1263
1359
  if (!shouldRender || typeof document === "undefined") return null;
1264
1360
  if (isMobileSheet) {