@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.
- package/dist/react/datetime-picker.js +1 -4
- package/dist/react/datetime-picker.js.map +1 -1
- package/dist/react/dialog.js +1 -1
- package/dist/react/dialog.js.map +1 -1
- package/dist/react/dropdown.d.ts +4 -0
- package/dist/react/dropdown.js +106 -10
- package/dist/react/dropdown.js.map +1 -1
- package/dist/react/popover.js +1 -4
- package/dist/react/popover.js.map +1 -1
- package/dist/react/select.d.ts +2 -0
- package/dist/react/select.js +92 -6
- package/dist/react/select.js.map +1 -1
- package/dist/react/sheet.js +1 -1
- package/dist/react/sheet.js.map +1 -1
- package/dist/react/table-pagination.js +92 -6
- package/dist/react/table-pagination.js.map +1 -1
- package/dist/react/table-view/column-menu.js +92 -6
- package/dist/react/table-view/column-menu.js.map +1 -1
- package/dist/react/table-view/index.js +92 -6
- package/dist/react/table-view/index.js.map +1 -1
- package/dist/react/tooltip.js +0 -8
- package/dist/react/tooltip.js.map +1 -1
- package/package.json +1 -1
package/dist/react/dialog.js
CHANGED
|
@@ -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-
|
|
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
|
),
|
package/dist/react/dialog.js.map
CHANGED
|
@@ -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"]}
|
package/dist/react/dropdown.d.ts
CHANGED
|
@@ -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 };
|
package/dist/react/dropdown.js
CHANGED
|
@@ -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-
|
|
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) {
|