@mateosuarezdev/react-ui 1.0.7 → 1.0.13
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/index.cjs +4 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +33 -1
- package/dist/index.js +128 -113
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/design.ts","../src/utils/forms.ts","../src/utils/focus.ts","../src/utils/overflow.tsx","../src/components/Avatar.tsx","../src/components/AvatarsGroup.tsx","../../../node_modules/@mateosuarezdev/atoms/dist/react.js","../src/hooks/use-large-screen.tsx","../src/hooks/use-merged-ref.tsx","../src/hooks/use-ripple.tsx","../src/hooks/use-popover.tsx","../src/hooks/use-click-away.tsx","../src/components/Button.tsx","../src/components/Separator.tsx","../src/components/Icon.tsx","../src/components/Spinner.tsx","../src/components/Portal.tsx","../../../node_modules/zod/v4/core/core.js","../../../node_modules/zod/v4/core/util.js","../../../node_modules/zod/v4/core/errors.js","../../../node_modules/zod/v4/core/parse.js","../../../node_modules/@hookform/resolvers/zod/dist/zod.mjs","../src/components/Form.tsx","../src/components/Checkbox.tsx","../src/components/Input.tsx","../src/components/TextArea.tsx","../src/components/Tags.tsx","../src/components/MultiSelect.tsx","../src/components/Submit.tsx","../src/components/Switch.tsx","../src/components/KeepAlive.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\n//Custom ClassName\r\nexport type { ClassValue };\r\n\r\n/**Tailwind Merge + Clsx */\r\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\r\n\r\n/**\r\n * Creates a throttled function that only invokes func at most once per every limit milliseconds.\r\n * The first call executes immediately, subsequent calls are rate-limited, and the last call\r\n * during rapid firing is guaranteed to execute with the most recent arguments.\r\n *\r\n * @param func - The function to throttle\r\n * @param limit - The number of milliseconds to throttle invocations to (default: 100)\r\n * @returns A throttled version of the function\r\n *\r\n * @example\r\n * const handleScroll = throttle(() => {\r\n * console.log('Scrolled!');\r\n * }, 200);\r\n *\r\n * window.addEventListener('scroll', handleScroll);\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number = 100\r\n): (...args: Parameters<T>) => void {\r\n let lastRan: number | null = null;\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function (this: any, ...args: Parameters<T>) {\r\n const now = Date.now();\r\n\r\n if (lastRan === null || now - lastRan >= limit) {\r\n func.apply(this, args);\r\n lastRan = now;\r\n } else {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n func.apply(this, args);\r\n lastRan = Date.now();\r\n }, limit - (now - lastRan));\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Creates a debounced function that delays invoking func until after delay milliseconds\r\n * have elapsed since the last time the debounced function was invoked. Each call resets\r\n * the timer, ensuring func only executes after activity has stopped.\r\n *\r\n * @param func - The function to debounce\r\n * @param delay - The number of milliseconds to delay (default: 300)\r\n * @returns A debounced version of the function\r\n *\r\n * @example\r\n * const handleSearch = debounce((query) => {\r\n * fetchResults(query);\r\n * }, 300);\r\n *\r\n * input.addEventListener('input', (e) => handleSearch(e.target.value));\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number = 500\r\n): (...args: Parameters<T>) => void {\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function (this: any, ...args: Parameters<T>) {\r\n if (timeout) clearTimeout(timeout);\r\n\r\n timeout = setTimeout(() => {\r\n func.apply(this, args);\r\n timeout = null;\r\n }, delay);\r\n };\r\n}\r\n\r\nexport function generateInitials(name: string) {\r\n if (!name) return \"\";\r\n\r\n // Trim and remove extra spaces\r\n const trimmedName = name.trim().replace(/\\s+/g, \" \");\r\n\r\n // Split by space to get words\r\n const words = trimmedName.split(\" \");\r\n\r\n // If no words (empty string), return empty\r\n if (words.length === 0 || words[0] === \"\") {\r\n return \"\";\r\n }\r\n\r\n // If only one word, return first letter\r\n if (words.length === 1) {\r\n return words[0].charAt(0).toUpperCase();\r\n }\r\n\r\n // If two or more words, return first letter of first two words\r\n return (words[0].charAt(0) + words[1].charAt(0)).toUpperCase();\r\n}\r\n","export function setFocusEnd(element: HTMLInputElement) {\r\n element.focus();\r\n const length = element.value.length;\r\n element.setSelectionRange(length, length);\r\n}\r\n\r\nexport function removeWhitespaces(text: string) {\r\n return text.replace(/\\s/g, \"\");\r\n}\r\n\r\nexport function toTitleCase(str: string) {\r\n // First, convert the entire string to lowercase\r\n const lowerCase = str.toLowerCase();\r\n\r\n // Split the string into an array of words\r\n const words = lowerCase.split(\" \");\r\n\r\n // Capitalize the first letter of each word\r\n const titleCaseWords = words.map((word) => {\r\n if (word.length === 0) return word;\r\n\r\n // Get the first character, which may be a multi-byte character\r\n const firstChar = [...word][0];\r\n // Get the rest of the word\r\n const restOfWord = word.slice(firstChar.length);\r\n\r\n // Return the capitalized first character + the rest of the word\r\n return firstChar.toUpperCase() + restOfWord;\r\n });\r\n\r\n // Join the words back together\r\n return titleCaseWords.join(\" \");\r\n}\r\n\r\n/**\r\n * helper to set an input to empty string\r\n * if the value is null\r\n */\r\nexport function nullRead(e: string | null) {\r\n if (e === null) return \"\";\r\n return e;\r\n}\r\n\r\n/**\r\n * helper to set an input\r\n * back to null if the value is empty\r\n */\r\nexport function nullSet(e: string) {\r\n if (removeWhitespaces(e) === \"\") return null;\r\n return e;\r\n}\r\n\r\n/**\r\n * Extracts only the dirty fields from form data\r\n * @param data The complete form data\r\n * @param dirtyFields The dirtyFields object from form.formState\r\n * @param staticFields An object containing fields to always include (like ID)\r\n * @returns A new object containing only dirty fields and the static fields\r\n */\r\nexport function extractDirtyData<T extends Record<string, any>>(\r\n data: T,\r\n dirtyFields: any,\r\n staticFields: Partial<T> = {} as Partial<T>\r\n): Partial<T> {\r\n // Start with the static fields\r\n const result = { ...staticFields };\r\n\r\n // Add only the dirty fields\r\n Object.keys(dirtyFields).forEach((field) => {\r\n if (dirtyFields[field] === true && field in data) {\r\n const key = field as keyof T;\r\n result[key] = data[key];\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","//main per page focus trapping should be done\r\n//in the router itself, when setting the current active page\r\n\r\n//then for modals and popovers we can call custom trapWithinScope\r\n//and restore focus inside a classic useEffect\r\n\r\nclass FocusTrap {\r\n private container: HTMLElement | null;\r\n private previouslyFocusedElement: HTMLElement | null;\r\n\r\n constructor() {\r\n this.container = null;\r\n this.previouslyFocusedElement = null;\r\n }\r\n\r\n enable(): void {\r\n if (!this.container) return;\r\n\r\n this.previouslyFocusedElement = document.activeElement as HTMLElement;\r\n this.container.addEventListener(\"keydown\", this.trapFocus.bind(this));\r\n document.addEventListener(\"click\", this.handleClickOutside.bind(this));\r\n }\r\n\r\n disable(): void {\r\n if (!this.container) return;\r\n\r\n this.container.removeEventListener(\"keydown\", this.trapFocus.bind(this));\r\n document.removeEventListener(\"click\", this.handleClickOutside.bind(this));\r\n if (this.previouslyFocusedElement && this.previouslyFocusedElement.focus) {\r\n this.previouslyFocusedElement.focus();\r\n }\r\n }\r\n\r\n setContainer(container: HTMLElement): void {\r\n this.disable();\r\n this.container = container;\r\n this.enable();\r\n }\r\n\r\n private trapFocus(event: KeyboardEvent): void {\r\n const focusableElements = this.container?.querySelectorAll<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\r\n );\r\n\r\n if (!focusableElements) return;\r\n\r\n const firstFocusable = focusableElements[0];\r\n const lastFocusable = focusableElements[focusableElements.length - 1];\r\n\r\n if (event.key === \"Tab\") {\r\n if (event.shiftKey && document.activeElement === firstFocusable) {\r\n event.preventDefault();\r\n lastFocusable.focus();\r\n } else if (!event.shiftKey && document.activeElement === lastFocusable) {\r\n event.preventDefault();\r\n firstFocusable.focus();\r\n }\r\n }\r\n }\r\n\r\n private handleClickOutside(event: MouseEvent): void {\r\n if (this.container && !this.container.contains(event.target as Node)) {\r\n event.preventDefault();\r\n if (\r\n this.previouslyFocusedElement &&\r\n this.previouslyFocusedElement.focus\r\n ) {\r\n this.previouslyFocusedElement.focus();\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { FocusTrap };\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport { throttle } from \"./design\";\r\n\r\ntype OverflowInfo = {\r\n horizontal: boolean;\r\n vertical: boolean;\r\n scrollWidth: number;\r\n clientWidth: number;\r\n scrollHeight: number;\r\n clientHeight: number;\r\n // These require scroll position tracking\r\n canScrollLeft: boolean;\r\n canScrollRight: boolean;\r\n canScrollUp: boolean;\r\n canScrollDown: boolean;\r\n scrollPercentageX: number;\r\n scrollPercentageY: number;\r\n scrollLeft: number;\r\n scrollTop: number;\r\n};\r\n\r\nconst checkOverflow = (element: HTMLElement): OverflowInfo => {\r\n const horizontal = element.scrollWidth > element.clientWidth;\r\n const vertical = element.scrollHeight > element.clientHeight;\r\n\r\n const maxScrollLeft = Math.max(0, element.scrollWidth - element.clientWidth);\r\n const maxScrollTop = Math.max(0, element.scrollHeight - element.clientHeight);\r\n\r\n return {\r\n horizontal,\r\n vertical,\r\n scrollWidth: element.scrollWidth,\r\n clientWidth: element.clientWidth,\r\n scrollHeight: element.scrollHeight,\r\n clientHeight: element.clientHeight,\r\n scrollLeft: element.scrollLeft,\r\n scrollTop: element.scrollTop,\r\n // Scroll capabilities (require current scroll position)\r\n canScrollLeft: element.scrollLeft > 10,\r\n canScrollRight: element.scrollLeft < maxScrollLeft - 10,\r\n canScrollUp: element.scrollTop > 0,\r\n canScrollDown: element.scrollTop < maxScrollTop,\r\n // Scroll percentages\r\n scrollPercentageX:\r\n horizontal && maxScrollLeft > 0\r\n ? (element.scrollLeft / maxScrollLeft) * 100\r\n : 0,\r\n scrollPercentageY:\r\n vertical && maxScrollTop > 0\r\n ? (element.scrollTop / maxScrollTop) * 100\r\n : 0,\r\n };\r\n};\r\n\r\n// Updated hook that listens to scroll events\r\nconst useOverflow = <T extends HTMLElement>({\r\n onOverflow,\r\n trackScroll = false, // New option to enable scroll tracking\r\n withObserver = false,\r\n enabled = true,\r\n deps = [],\r\n}: {\r\n onOverflow?: (info: OverflowInfo) => void;\r\n trackScroll?: boolean;\r\n withObserver?: boolean;\r\n enabled?: boolean;\r\n deps?: any[];\r\n} = {}) => {\r\n const ref = useRef<T>(null);\r\n\r\n useEffect(() => {\r\n if (!ref.current || !enabled) return;\r\n\r\n let initialOverflow = false;\r\n\r\n const updateOverflow = () => {\r\n // console.log(\"updating overflow\");\r\n if (ref.current) {\r\n const info = checkOverflow(ref.current);\r\n onOverflow?.(info);\r\n }\r\n };\r\n\r\n const throttledUpdate = throttle(updateOverflow);\r\n\r\n // Initial check\r\n // updateOverflow();\r\n const info = checkOverflow(ref.current);\r\n initialOverflow = info.horizontal || info.vertical;\r\n onOverflow?.(info);\r\n\r\n // Listen for resize\r\n window.addEventListener(\"resize\", throttledUpdate);\r\n\r\n // Conditionally use ResizeObserver\r\n // this is for in element content changes\r\n let observer: ResizeObserver | null = null;\r\n if (withObserver) {\r\n observer = new ResizeObserver(throttledUpdate);\r\n if (ref.current) {\r\n observer.observe(ref.current);\r\n }\r\n }\r\n\r\n // Conditionally listen to scroll events\r\n let scrollElement: HTMLElement | null = null;\r\n if (trackScroll && initialOverflow) {\r\n scrollElement = ref.current;\r\n scrollElement.addEventListener(\"scroll\", throttledUpdate);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", throttledUpdate);\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n if (scrollElement && initialOverflow) {\r\n scrollElement.removeEventListener(\"scroll\", throttledUpdate);\r\n }\r\n };\r\n }, [enabled, ...deps]);\r\n\r\n return { ref };\r\n};\r\n\r\n// Alternative: State-based approach with scroll tracking\r\nconst useOverflowState = <T extends HTMLElement>({\r\n trackScroll = false,\r\n withObserver = false,\r\n enabled = true,\r\n deps = [],\r\n}: {\r\n trackScroll?: boolean;\r\n withObserver?: boolean;\r\n enabled?: boolean;\r\n deps?: any[];\r\n} = {}) => {\r\n const ref = useRef<T>(null);\r\n const [overflowInfo, setOverflowInfo] = useState<OverflowInfo | null>(null);\r\n\r\n useEffect(() => {\r\n if (!ref.current || !enabled) return;\r\n\r\n let initialOverflow = false;\r\n\r\n const updateOverflow = () => {\r\n // console.log(\"updating overflow\");\r\n if (ref.current) {\r\n const info = checkOverflow(ref.current);\r\n setOverflowInfo(info);\r\n }\r\n };\r\n\r\n const throttledUpdate = throttle(updateOverflow);\r\n\r\n // Initial check\r\n // updateOverflow();\r\n const info = checkOverflow(ref.current);\r\n initialOverflow = info.horizontal || info.vertical;\r\n setOverflowInfo(info);\r\n\r\n // Attach resize listener\r\n window.addEventListener(\"resize\", throttledUpdate);\r\n\r\n // Conditionally use ResizeObserver\r\n // this is for in element content changes\r\n let observer: ResizeObserver | null = null;\r\n if (withObserver) {\r\n observer = new ResizeObserver(throttledUpdate);\r\n if (ref.current) {\r\n observer.observe(ref.current);\r\n }\r\n }\r\n\r\n // Conditionally listen to scroll events\r\n let scrollElement: HTMLElement | null = null;\r\n if (trackScroll && initialOverflow) {\r\n scrollElement = ref.current;\r\n scrollElement.addEventListener(\"scroll\", throttledUpdate);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", throttledUpdate);\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n if (scrollElement && initialOverflow) {\r\n scrollElement.removeEventListener(\"scroll\", throttledUpdate);\r\n }\r\n };\r\n }, [enabled, ...deps]);\r\n\r\n return { ref, overflowInfo };\r\n};\r\n\r\nexport { checkOverflow, useOverflow, useOverflowState };\r\n","import { Icon } from \".\";\r\nimport { cn } from \"../utils\";\r\nimport { generateInitials } from \"../utils\";\r\n\r\nconst sizes = {\r\n xs: \"w-8 h-8\",\r\n sm: \"w-10 h-10 text-lg\",\r\n md: \"w-14 h-14 text-xl\",\r\n lg: \"h-20 w-20 text-2xl\",\r\n xl: \"h-24 w-24 text-2xl\",\r\n};\r\n\r\nconst Avatar = ({\r\n src,\r\n name,\r\n size = \"md\",\r\n className,\r\n}: {\r\n src?: string;\r\n name?: string;\r\n size?: keyof typeof sizes;\r\n className?: string;\r\n}) => {\r\n if (src) {\r\n return (\r\n <img\r\n alt=\"avatar\"\r\n src={src}\r\n className={cn(\"rounded-full bg-base-3\", sizes[size])}\r\n />\r\n );\r\n }\r\n\r\n if (name) {\r\n return (\r\n <p\r\n className={cn(\r\n \"rounded-full font-medium dark-theme:bg-base-3 border border-base-6 dark-theme:border-base-4 flex items-center justify-center\",\r\n sizes[size],\r\n className\r\n )}\r\n >\r\n {generateInitials(name)}\r\n </p>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"rounded-full text-2xl font-medium flex items-center justify-center\",\r\n \"bg-base-2 dark-theme:bg-base-3 border border-base-4\",\r\n \"lg:hover:bg-base-3 max-lg:active:bg-base-4 transition-colors\",\r\n sizes[size],\r\n className\r\n )}\r\n >\r\n <Icon\r\n size={size === \"xs\" ? 16 : size === \"sm\" ? 20 : 24}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\r\n </Icon>\r\n </div>\r\n );\r\n};\r\n\r\nexport { Avatar };\r\n","import { ComponentPropsWithoutRef } from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\nfunction AvatarsGroup({\r\n className,\r\n children,\r\n animate = false,\r\n ...props\r\n}: ComponentPropsWithoutRef<\"div\"> & { animate?: boolean }) {\r\n return (\r\n <div\r\n className={cn(\"flex -space-x-3 rtl:space-x-reverse\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport { AvatarsGroup };\r\n","import { useSyncExternalStore as s, useCallback as o, useRef as i, useEffect as l } from \"react\";\nimport { computed as p, effect as b } from \"./index.js\";\nfunction A(e) {\n const t = s(\n (u) => e.subscribe(u),\n () => e.get(),\n () => e.get()\n ), r = o(\n (u) => {\n e.set(u);\n },\n [e]\n );\n return [t, r];\n}\nfunction f(e) {\n return s(\n (t) => e.subscribe(t),\n () => e.get(),\n () => e.get()\n );\n}\nfunction d(e) {\n return o(\n (t) => {\n e.set(t);\n },\n [e]\n );\n}\nfunction E(e) {\n const t = i(null);\n return t.current || (t.current = p(e)), f(t.current);\n}\nfunction S(e) {\n l(() => b(e), []);\n}\nfunction h(e, ...t) {\n const r = t.length > 0 ? t : Object.keys(e), u = {};\n return r.forEach((c) => {\n const n = e[c];\n n && typeof n == \"object\" && \"get\" in n ? u[c] = f(n) : u[c] = n;\n }), u;\n}\nexport {\n A as useAtom,\n S as useAtomEffect,\n f as useAtomValue,\n E as useComputed,\n d as useSetAtom,\n h as useStore\n};\n//# sourceMappingURL=react.js.map\n","import { throttle } from \"../utils\";\r\nimport { useEffect } from \"react\";\r\nimport { atom } from \"@mateosuarezdev/atoms\";\r\nimport { useAtomValue } from \"@mateosuarezdev/atoms/react\";\r\n\r\n/**\r\n * Standard breakpoints for responsive design.\r\n */\r\n// export const mediaQueries = {\r\n// sm: 640,\r\n// md: 768,\r\n// lg: 1024,\r\n// xl: 1280,\r\n// \"2xl\": 1536,\r\n// };\r\n\r\n/**\r\n * Observable state tracking whether the screen is larger than the 'lg' breakpoint.\r\n * Default to true on server (assumes desktop), update on client.\r\n */\r\n// const largeObservable = observable(\r\n// typeof window !== \"undefined\" ? window.innerWidth > mediaQueries.lg : true\r\n// );\r\nconst largeAtom = atom(true);\r\n\r\nlet listening = false;\r\n\r\n/**\r\n * Throttled resize handler to update screen size state.\r\n * Only updates the observable when the viewport crosses the large screen threshold.\r\n * Throttled to improve performance by limiting update frequency.\r\n */\r\nconst handleResize = throttle(() => {\r\n largeAtom.set(window.innerWidth > 1024);\r\n}); // Throttle to once per 100ms\r\n\r\n// Only set up listeners on client\r\nif (typeof window !== \"undefined\") {\r\n if (listening) {\r\n window.removeEventListener(\"resize\", handleResize);\r\n listening = false;\r\n }\r\n\r\n // Attach resize listener to update state when window is resized\r\n window.addEventListener(\"resize\", handleResize);\r\n listening = true;\r\n}\r\n\r\n/**\r\n * Custom hook that returns whether the current viewport is larger than the 'lg' breakpoint.\r\n *\r\n * @example\r\n * function MyComponent() {\r\n * const lg = useLargeScreen();\r\n *\r\n * return (\r\n * <div>\r\n * {lg\r\n * ? <DesktopLayout />\r\n * : <MobileLayout />\r\n * }\r\n * </div>\r\n * );\r\n * }\r\n *\r\n * @returns {boolean} True if the current viewport width is larger than the 'lg' breakpoint\r\n */\r\nconst useLargeScreen = (): boolean => {\r\n useEffect(() => {\r\n largeAtom.set(window.innerWidth > 1024);\r\n }, []);\r\n return useAtomValue(largeAtom);\r\n};\r\n\r\nexport { useLargeScreen };\r\n","function useMergedRef<T>(...refs: React.Ref<T>[]): React.RefCallback<T> {\r\n return (value) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n } else if (ref != null) {\r\n (ref as React.MutableRefObject<T | null>).current = value;\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport { useMergedRef };\r\n","import { CSSProperties, useCallback, useRef } from \"react\";\r\nimport { useLargeScreen } from \"./use-large-screen\";\r\n\r\n// new ripple uses a wrapper so the parent doesn't need overflow-hidden\r\nconst useRipple = <T extends HTMLElement>(\r\n enabled: boolean = true,\r\n contrastRipple?: boolean\r\n) => {\r\n const lg = useLargeScreen();\r\n const ref = useRef<T>(null);\r\n\r\n const ripple = useCallback(\r\n (event: React.MouseEvent<T>) => {\r\n if (!enabled || lg) return;\r\n\r\n const button = ref.current;\r\n if (!button) return;\r\n\r\n // Get button's position and dimensions\r\n const buttonRect = button.getBoundingClientRect();\r\n const rippleSize = Math.max(buttonRect.width, buttonRect.height);\r\n const offsetX = event.clientX - buttonRect.left - rippleSize / 2;\r\n const offsetY = event.clientY - buttonRect.top - rippleSize / 2;\r\n\r\n // Create the ripple wrapper (this element holds the ripple)\r\n const rippleWrapper = document.createElement(\"span\");\r\n rippleWrapper.classList.add(\"ripple-wrapper\");\r\n\r\n // Create the ripple element (circle)\r\n const rippleEl = document.createElement(\"span\");\r\n rippleEl.classList.add(\"ripple\");\r\n rippleEl.style.backgroundColor = contrastRipple\r\n ? \"var(--ripple-contrast)\"\r\n : \"var(--ripple-main)\";\r\n\r\n // Set the position and size of the ripple\r\n rippleEl.style.width = `${rippleSize}px`;\r\n rippleEl.style.height = `${rippleSize}px`;\r\n rippleEl.style.left = `${offsetX}px`;\r\n rippleEl.style.top = `${offsetY}px`;\r\n\r\n rippleWrapper.appendChild(rippleEl);\r\n\r\n const ripples = button.getElementsByClassName(\"ripple-wrapper\");\r\n if (ripples?.length) {\r\n for (const ripple of ripples) {\r\n ripple.remove();\r\n }\r\n }\r\n\r\n // Append the ripple wrapper to the button\r\n button.appendChild(rippleWrapper);\r\n\r\n // Remove the ripple wrapper after animation\r\n setTimeout(() => {\r\n rippleWrapper.remove();\r\n }, 700); // Match the animation duration\r\n },\r\n [enabled, lg, contrastRipple]\r\n );\r\n\r\n return {\r\n ref,\r\n ripple,\r\n styles: {\r\n position: \"relative\",\r\n } as CSSProperties,\r\n };\r\n};\r\n\r\nexport { useRipple };\r\n\r\n// ios like fade effect\r\n// const useRipple = (enabled = true, contrastRipple?: boolean) => {\r\n// const lg = useLargeScreen();\r\n// const ref = useRef<HTMLElement>(null);\r\n\r\n// const ripple = useCallback(\r\n// (event: React.MouseEvent<HTMLElement>) => {\r\n// if (!enabled || lg) return;\r\n\r\n// const rippleEl = document.createElement(\"span\");\r\n// rippleEl.classList.add(\"simple-ripple\");\r\n// rippleEl.style.backgroundColor = contrastRipple\r\n// ? \"var(--ripple-contrast)\"\r\n// : \"var(--ripple-main)\";\r\n\r\n// const target = ref.current;\r\n// if (!target) return;\r\n\r\n// target.appendChild(rippleEl);\r\n\r\n// // Remove after animation\r\n// setTimeout(() => {\r\n// rippleEl.remove();\r\n// }, 400); // Match animation duration\r\n// },\r\n// [enabled, lg, contrastRipple]\r\n// );\r\n\r\n// return { ref, ripple };\r\n// };\r\n\r\n// export default useRipple;\r\n\r\n// old ripple requires parent with overflow-hidden\r\n// const useRipple = (enabled: boolean = true, contrastRipple?: boolean) => {\r\n// const lg = useLargeScreen();\r\n// const ref = useRef<HTMLElement>(null);\r\n// const ripple = useCallback(\r\n// (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\r\n// if (!lg && enabled) {\r\n// const rippleContainer = event.currentTarget.getBoundingClientRect();\r\n// const circle = document.createElement(\"span\");\r\n// const diameter = Math.max(\r\n// rippleContainer.width,\r\n// rippleContainer.height\r\n// );\r\n// const radius = diameter / 2;\r\n\r\n// circle.style.width = circle.style.height = `${diameter}px`;\r\n// circle.style.left = `${\r\n// event.clientX - (rippleContainer.left + radius)\r\n// }px`;\r\n// circle.style.top = `${\r\n// event.clientY - (rippleContainer.top + radius)\r\n// }px`;\r\n// circle.style.backgroundColor = `${\r\n// contrastRipple ? \"var(--ripple-contrast)\" : \"var(--ripple-main)\"\r\n// }`;\r\n// circle.style.pointerEvents = \"none\";\r\n// circle.classList.add(\"ripple\");\r\n\r\n// const ripples = ref.current?.getElementsByClassName(\"ripple\");\r\n// if (ripples?.length) {\r\n// for (const ripple of ripples) {\r\n// ripple.remove();\r\n// }\r\n// }\r\n\r\n// ref.current?.appendChild(circle);\r\n\r\n// (async () => {\r\n// //await sleep(750);\r\n// setTimeout(\r\n// () => ref.current?.getElementsByClassName(\"ripple\")[0]?.remove(),\r\n// 750\r\n// );\r\n// })();\r\n// }\r\n// },\r\n// [contrastRipple, lg, enabled]\r\n// );\r\n\r\n// return {\r\n// ref: ref,\r\n// ripple: ripple,\r\n// classNames: \"relative overflow-hidden inline-block\",\r\n// };\r\n// };\r\n\r\n// export default useRipple;\r\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\r\n\r\ntype UsePopoverProps = {\r\n // routerMode?: \"stack\" | \"outlet\";\r\n scrollerId?: string;\r\n /**\r\n * To point scroller id to route id-content instead of id\r\n */\r\n // useScrollerSuffix?: boolean;\r\n align?: \"start\" | \"center\" | \"end\";\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n offset?: number;\r\n collisionPadding?: number;\r\n avoidCollisions?: boolean;\r\n closeOnScroll?: boolean;\r\n // observeResize?: boolean;\r\n onOpen?: VoidFunction;\r\n onClose?: VoidFunction;\r\n};\r\n\r\n// const hybridUseRoute = (routerMode: \"stack\" | \"outlet\") => {\r\n// if (routerMode === \"stack\") return stackUseRoute();\r\n// return outletUseRoute();\r\n// };\r\n\r\nexport const usePopover = <T extends HTMLElement, P extends HTMLElement>({\r\n // routerMode = \"outlet\",\r\n scrollerId,\r\n // useScrollerSuffix,\r\n align = \"start\",\r\n side = \"bottom\",\r\n offset = 8,\r\n collisionPadding = 8,\r\n avoidCollisions = true,\r\n closeOnScroll = true,\r\n // observeResize = false,\r\n onOpen,\r\n onClose,\r\n}: UsePopoverProps = {}) => {\r\n // const { id } = useRoute();\r\n const [open, setOpen] = useState(false);\r\n const [popoverDimensions, setPopoverDimensions] = useState({\r\n width: 192,\r\n height: 300,\r\n });\r\n const triggerRef = useRef<T>(null);\r\n const popoverRef = useRef<P>(null);\r\n const triggerRectRef = useRef({\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n });\r\n const scrollerRef = useRef<HTMLElement | null>(null);\r\n\r\n // Generate unique IDs for accessibility\r\n const triggerId = useId();\r\n\r\n // Calculate optimal position with collision detection\r\n const getPopoverPosition = useCallback(\r\n (customRect?: DOMRect) => {\r\n const rect = customRect ?? triggerRectRef.current;\r\n if (!rect) return { x: 0, top: 0, bottom: undefined };\r\n\r\n const popoverWidth = popoverDimensions.width;\r\n const popoverHeight = popoverDimensions.height;\r\n\r\n return calculatePopoverPosition({\r\n triggerRect: rect as DOMRect,\r\n popoverWidth,\r\n popoverHeight,\r\n align,\r\n side,\r\n offset: offset,\r\n collisionPadding: collisionPadding,\r\n avoidCollisions: avoidCollisions,\r\n });\r\n },\r\n [triggerRectRef.current, popoverDimensions, align, side]\r\n );\r\n\r\n // const popoverPosition = useMemo(\r\n // (customRect?: DOMRect) => {\r\n // const rect = customRect ?? triggerRectRef.current;\r\n // if (!rect) return { x: 0, top: 0, bottom: undefined };\r\n\r\n // const popoverWidth = popoverDimensions.width;\r\n // const popoverHeight = popoverDimensions.height;\r\n\r\n // // toast.info(`New dimensions, ${popoverWidth} ${popoverHeight}`);\r\n\r\n // const position = calculatePopoverPosition({\r\n // triggerRect: rect as DOMRect,\r\n // popoverWidth,\r\n // popoverHeight,\r\n // align,\r\n // side,\r\n // offset: offset,\r\n // collisionPadding: collisionPadding,\r\n // avoidCollisions: avoidCollisions,\r\n // });\r\n\r\n // return position;\r\n // },\r\n // [triggerRectRef.current, popoverDimensions, align, side]\r\n // );\r\n\r\n useEffect(() => {\r\n if (!open || !scrollerId) return;\r\n\r\n // let scrollerId = id;\r\n\r\n // if (customScrollerId) {\r\n // scrollerId = customScrollerId;\r\n // } else if (routerMode === \"stack\" || useScrollerSuffix) {\r\n // scrollerId = `${id}-content`;\r\n // }\r\n\r\n scrollerRef.current = document.getElementById(scrollerId);\r\n\r\n if (!scrollerRef.current) return;\r\n\r\n // added here to update popoverdimensions\r\n if (open) {\r\n updatePopoverDimensions();\r\n }\r\n\r\n // const handleScroll = throttle(() => setOpen(false), 1000);\r\n const handleScroll = () => {\r\n if (!scrollerRef.current) return;\r\n setOpen(false);\r\n onOpen?.();\r\n scrollerRef.current.removeEventListener(\"scroll\", handleScroll);\r\n };\r\n\r\n if (closeOnScroll) {\r\n scrollerRef.current.addEventListener(\"scroll\", handleScroll, {\r\n passive: true,\r\n });\r\n }\r\n\r\n return () => {\r\n scrollerRef.current &&\r\n scrollerRef.current.removeEventListener(\"scroll\", handleScroll);\r\n };\r\n }, [open, scrollerId]);\r\n\r\n // useEffect(() => {\r\n // if (!observeResize) return;\r\n // if (!popoverRef.current) return;\r\n // const observer = new ResizeObserver(() => {\r\n // updatePopoverDimensions();\r\n // if (triggerRef.current) {\r\n // // const rect = triggerRef.current.getBoundingClientRect();\r\n // // triggerRectRef.current = rect;\r\n // // Recalculate y with new height\r\n // const { x, top, bottom } = getPopoverPosition(\r\n // triggerRectRef.current as DOMRect\r\n // );\r\n // popoverRef.current!.style.left = `${x}px`;\r\n // if (top) {\r\n // popoverRef.current!.style = `${top}px`;\r\n // } else {\r\n // popoverRef.current!.style.removeProperty(\"top\");\r\n // }\r\n // if (bottom) {\r\n // popoverRef.current!.style = `${bottom}px`;\r\n // } else {\r\n // popoverRef.current!.style.removeProperty(\"bottom\");\r\n // }\r\n // }\r\n // });\r\n // observer.observe(popoverRef.current);\r\n // return () => observer.disconnect();\r\n // }, [observeResize, getPopoverPosition]);\r\n\r\n const updatePopoverDimensions = () => {\r\n if (!popoverRef.current) return;\r\n setPopoverDimensions({\r\n width: popoverRef.current.offsetWidth,\r\n height: popoverRef.current.offsetHeight,\r\n });\r\n };\r\n\r\n const toggle = useCallback(() => {\r\n if (!triggerRef.current) return;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n triggerRectRef.current = {\r\n left: rect.left,\r\n right: rect.right,\r\n top: rect.top,\r\n bottom: rect.bottom,\r\n x: rect.x,\r\n y: rect.y,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n setOpen((prev) => {\r\n if (prev) {\r\n onClose?.();\r\n } else {\r\n onOpen?.();\r\n }\r\n return !prev;\r\n });\r\n }, []);\r\n\r\n const close = useCallback(() => {\r\n setOpen(false);\r\n onClose?.();\r\n }, []);\r\n\r\n return {\r\n triggerRef,\r\n triggerProps: {\r\n id: triggerId,\r\n \"aria-expanded\": open,\r\n \"aria-haspopup\": true,\r\n },\r\n popoverRef,\r\n // popoverPosition,\r\n /**\r\n * Call this sync before rendering the popover\r\n */\r\n getPopoverPosition,\r\n open,\r\n toggle,\r\n close,\r\n };\r\n};\r\n\r\ntype PositionOptions = {\r\n triggerRect: DOMRect;\r\n popoverWidth: number;\r\n popoverHeight: number;\r\n align?: \"start\" | \"center\" | \"end\";\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n offset?: number;\r\n collisionPadding?: number;\r\n avoidCollisions?: boolean;\r\n};\r\n\r\nexport const calculatePopoverPosition = ({\r\n triggerRect,\r\n popoverWidth,\r\n popoverHeight,\r\n align = \"start\",\r\n side = \"bottom\",\r\n offset = 4,\r\n collisionPadding = 8,\r\n avoidCollisions = true,\r\n}: PositionOptions) => {\r\n const viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n };\r\n\r\n let x = 0;\r\n let y = 0;\r\n\r\n if (avoidCollisions) {\r\n if (side === \"right\") {\r\n // Calculate overflow on both sides\r\n const rightSideX = triggerRect.right + offset;\r\n const leftSideX = triggerRect.left - popoverWidth - offset;\r\n\r\n const rightOverflow = Math.max(\r\n 0,\r\n rightSideX + popoverWidth - (viewport.width - collisionPadding)\r\n );\r\n const leftOverflow = Math.max(0, collisionPadding - leftSideX);\r\n\r\n // Choose the side with less overflow\r\n if (rightOverflow <= leftOverflow) {\r\n // Use right side, but adjust if needed\r\n x = rightSideX;\r\n if (rightOverflow > 0) {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n } else {\r\n // Use left side, but adjust if needed\r\n x = leftSideX;\r\n if (leftOverflow > 0) {\r\n x = collisionPadding;\r\n }\r\n }\r\n\r\n // Vertical positioning - align with trigger top\r\n y = triggerRect.top;\r\n\r\n // Adjust if would go off bottom\r\n if (y + popoverHeight > viewport.height - collisionPadding) {\r\n y = viewport.height - popoverHeight - collisionPadding;\r\n }\r\n if (y < collisionPadding) {\r\n y = collisionPadding;\r\n }\r\n } else if (side === \"left\") {\r\n // Calculate overflow on both sides\r\n const leftSideX = triggerRect.left - popoverWidth - offset;\r\n const rightSideX = triggerRect.right + offset;\r\n\r\n const leftOverflow = Math.max(0, collisionPadding - leftSideX);\r\n const rightOverflow = Math.max(\r\n 0,\r\n rightSideX + popoverWidth - (viewport.width - collisionPadding)\r\n );\r\n\r\n // Choose the side with less overflow\r\n if (leftOverflow <= rightOverflow) {\r\n // Use left side, but adjust if needed\r\n x = leftSideX;\r\n if (leftOverflow > 0) {\r\n x = collisionPadding;\r\n }\r\n } else {\r\n // Use right side, but adjust if needed\r\n x = rightSideX;\r\n if (rightOverflow > 0) {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n\r\n // Vertical positioning - align with trigger top\r\n y = triggerRect.top;\r\n\r\n // Adjust if would go off bottom\r\n if (y + popoverHeight > viewport.height - collisionPadding) {\r\n y = viewport.height - popoverHeight - collisionPadding;\r\n }\r\n if (y < collisionPadding) {\r\n y = collisionPadding;\r\n }\r\n } else if (side === \"bottom\") {\r\n // Vertical positioning\r\n const spaceBelow = viewport.height - triggerRect.bottom;\r\n const spaceAbove = triggerRect.top;\r\n\r\n if (spaceBelow >= popoverHeight + offset) {\r\n y = triggerRect.bottom + offset;\r\n } else if (spaceAbove >= popoverHeight + offset) {\r\n y = triggerRect.top - popoverHeight - offset;\r\n } else {\r\n // Not enough space either way, prefer bottom but constrain\r\n y = triggerRect.bottom + offset;\r\n y = Math.min(y, viewport.height - popoverHeight - collisionPadding);\r\n }\r\n\r\n // Horizontal positioning with collision detection\r\n const spaceRight = viewport.width - triggerRect.left;\r\n const spaceLeft = triggerRect.right;\r\n\r\n if (align === \"start\") {\r\n x = triggerRect.left;\r\n\r\n // Check right edge collision\r\n if (x + popoverWidth > viewport.width - collisionPadding) {\r\n if (spaceLeft >= popoverWidth) {\r\n // Flip to end alignment\r\n x = triggerRect.right - popoverWidth;\r\n } else {\r\n // Pull back to fit\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n } else if (align === \"end\") {\r\n x = triggerRect.right - popoverWidth;\r\n\r\n // Check left edge collision\r\n if (x < collisionPadding) {\r\n if (spaceRight >= popoverWidth) {\r\n // Flip to start alignment\r\n x = triggerRect.left;\r\n } else {\r\n // Push right to fit\r\n x = collisionPadding;\r\n }\r\n }\r\n } else {\r\n // align === \"center\"\r\n const centeredX =\r\n triggerRect.left + triggerRect.width / 2 - popoverWidth / 2;\r\n\r\n if (\r\n centeredX >= collisionPadding &&\r\n centeredX + popoverWidth <= viewport.width - collisionPadding\r\n ) {\r\n x = centeredX;\r\n } else if (centeredX < collisionPadding) {\r\n x = collisionPadding;\r\n } else {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n } else {\r\n // side === \"top\"\r\n // Vertical positioning\r\n const spaceAbove = triggerRect.top;\r\n const spaceBelow = viewport.height - triggerRect.bottom;\r\n\r\n if (spaceAbove >= popoverHeight + offset) {\r\n y = triggerRect.top - popoverHeight - offset;\r\n } else if (spaceBelow >= popoverHeight + offset) {\r\n y = triggerRect.bottom + offset;\r\n } else {\r\n // Not enough space either way, prefer top but constrain\r\n y = triggerRect.top - popoverHeight - offset;\r\n y = Math.max(collisionPadding, y);\r\n }\r\n\r\n // Horizontal positioning (same logic as bottom)\r\n const spaceRight = viewport.width - triggerRect.left;\r\n const spaceLeft = triggerRect.right;\r\n\r\n if (align === \"start\") {\r\n x = triggerRect.left;\r\n\r\n if (x + popoverWidth > viewport.width - collisionPadding) {\r\n if (spaceLeft >= popoverWidth) {\r\n x = triggerRect.right - popoverWidth;\r\n } else {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n } else if (align === \"end\") {\r\n x = triggerRect.right - popoverWidth;\r\n\r\n if (x < collisionPadding) {\r\n if (spaceRight >= popoverWidth) {\r\n x = triggerRect.left;\r\n } else {\r\n x = collisionPadding;\r\n }\r\n }\r\n } else {\r\n // center\r\n const centeredX =\r\n triggerRect.left + triggerRect.width / 2 - popoverWidth / 2;\r\n\r\n if (\r\n centeredX >= collisionPadding &&\r\n centeredX + popoverWidth <= viewport.width - collisionPadding\r\n ) {\r\n x = centeredX;\r\n } else if (centeredX < collisionPadding) {\r\n x = collisionPadding;\r\n } else {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n }\r\n\r\n // Final bounds check to ensure nothing goes outside viewport\r\n x = Math.max(\r\n collisionPadding,\r\n Math.min(x, viewport.width - popoverWidth - collisionPadding)\r\n );\r\n y = Math.max(\r\n collisionPadding,\r\n Math.min(y, viewport.height - popoverHeight - collisionPadding)\r\n );\r\n } else {\r\n // Simple positioning without collision detection\r\n if (side === \"right\") {\r\n x = triggerRect.right + offset;\r\n y = triggerRect.top;\r\n } else if (side === \"left\") {\r\n x = triggerRect.left - popoverWidth - offset;\r\n y = triggerRect.top;\r\n } else if (side === \"bottom\") {\r\n y = triggerRect.bottom + offset;\r\n } else {\r\n y = triggerRect.top - popoverHeight - offset;\r\n }\r\n\r\n if (side === \"top\" || side === \"bottom\") {\r\n if (align === \"start\") {\r\n x = triggerRect.left;\r\n } else if (align === \"end\") {\r\n x = triggerRect.right - popoverWidth;\r\n } else {\r\n x = triggerRect.left + triggerRect.width / 2 - popoverWidth / 2;\r\n }\r\n }\r\n }\r\n\r\n let top: number | undefined;\r\n let bottom: number | undefined;\r\n\r\n // If popover's bottom edge is above the trigger top → popover is above\r\n if (y + popoverHeight <= triggerRect.top) {\r\n bottom = window.innerHeight - (y + popoverHeight); // attach to bottom\r\n } else {\r\n // popover is below trigger → attach to top\r\n top = y;\r\n }\r\n\r\n return { x, top, bottom };\r\n};\r\n","import { useEffect, useRef } from \"react\";\r\n\r\n// Basic version\r\nexport function useClickAway<T extends HTMLElement = HTMLElement>(\r\n callback: () => void\r\n) {\r\n const ref = useRef<T>(null);\r\n\r\n useEffect(() => {\r\n const handleClickAway = (event: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n callback();\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickAway);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickAway);\r\n };\r\n }, [callback]);\r\n\r\n return ref;\r\n}\r\n\r\n// Advanced version with options\r\ninterface UseClickOutsideOptions {\r\n enabled?: boolean;\r\n events?: string[];\r\n excludeRefs?: React.RefObject<HTMLElement>[];\r\n}\r\n\r\nexport function useClickAwayAdvanced<T extends HTMLElement = HTMLElement>(\r\n callback: () => void,\r\n options: UseClickOutsideOptions = {}\r\n) {\r\n const {\r\n enabled = true,\r\n events = [\"mousedown\", \"touchstart\"],\r\n excludeRefs = [],\r\n } = options;\r\n\r\n const ref = useRef<T>(null);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n const handleClick = (event: Event) => {\r\n const target = event.target as Node;\r\n\r\n // Check if click is inside the main element\r\n if (ref.current?.contains(target)) {\r\n return;\r\n }\r\n\r\n // Check if click is inside any excluded elements\r\n const isInsideExcluded = excludeRefs.some((excludeRef) =>\r\n excludeRef.current?.contains(target)\r\n );\r\n\r\n if (isInsideExcluded) {\r\n return;\r\n }\r\n\r\n callback();\r\n };\r\n\r\n events.forEach((eventName) => {\r\n document.addEventListener(eventName, handleClick);\r\n });\r\n\r\n return () => {\r\n events.forEach((eventName) => {\r\n document.removeEventListener(eventName, handleClick);\r\n });\r\n };\r\n }, [callback, enabled, events, excludeRefs]);\r\n\r\n return ref;\r\n}\r\n\r\n// Version that accepts external ref\r\nexport function useClickAwayWithRef<T extends HTMLElement | null = HTMLElement>(\r\n ref: React.RefObject<T>,\r\n callback: (event: MouseEvent) => void,\r\n enabled: boolean = true\r\n) {\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n const handleClickAway = (event: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n callback(event);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickAway);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickAway);\r\n };\r\n }, [ref, callback, enabled]);\r\n}\r\n\r\n// usage example\r\n\r\n// Dropdown with separate trigger button\r\n// function Dropdown() {\r\n// const [isOpen, setIsOpen] = useState(false);\r\n// const dropdownRef = useRef(null);\r\n// const triggerRef = useRef(null);\r\n\r\n// const ref = useClickAwayAdvanced(() => setIsOpen(false), {\r\n// enabled: isOpen,\r\n// excludeRefs: [triggerRef], // Don't close when clicking trigger\r\n// events: ['mousedown', 'touchstart'] // Mobile support\r\n// });\r\n\r\n// return (\r\n// <>\r\n// <button ref={triggerRef} onClick={() => setIsOpen(!isOpen)}>\r\n// Toggle\r\n// </button>\r\n// {isOpen && (\r\n// <div ref={ref}>Dropdown content</div>\r\n// )}\r\n// </>\r\n// );\r\n// }\r\n","import { forwardRef, useState, ForwardedRef } from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { useMergedRef, useRipple } from \"../hooks\";\r\n\r\nexport type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\r\n color?: keyof typeof colorStyles;\r\n size?: keyof typeof sizeStyles;\r\n fontWeight?: keyof typeof fontWeightStyles;\r\n rounded?: keyof typeof borderRadiusStyles;\r\n state?: \"enabled\" | \"disabled\" | \"loading\";\r\n onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\r\n className?: string;\r\n withRipple?: boolean;\r\n contrastRipple?: boolean;\r\n showFocus?: \"all\" | \"desktop\" | \"mobile\" | \"none\";\r\n withDisabledDelay?: boolean;\r\n type?: \"button\" | \"submit\" | \"reset\";\r\n children?: React.ReactNode;\r\n};\r\n\r\n// Base button styles that apply to all variants\r\nconst baseStyles =\r\n \"relative shrink-0 select-none transition outline-none duration-200 ease-out focus:ring-border-brand-light flex items-center justify-center cursor-pointer\"; //was pl-1.5 and rounded-lg\r\n\r\nconst sizeStyles = {\r\n xs: \"text-xs px-1 gap-x-0.5 py-1\",\r\n sm: \"text-sm px-2.5 gap-x-1 py-1.5\",\r\n mdsm: \"text-sm px-3 gap-x-1.5 py-2.5\",\r\n md: \"text-base px-4 gap-x-1.5 py-2.5\",\r\n lg: \"text-base px-4 gap-x-1.5 py-3.5\",\r\n picker: \"text-base px-2 py-2 gap-x-1.5\",\r\n iconXs: \"text-xs p-1\",\r\n iconSm: \"text-sm p-2\",\r\n iconMd: \"text-base p-3\",\r\n iconLg: \"text-base p-4\",\r\n};\r\n\r\n// Focus styles based on showFocus prop\r\nconst focusStyles = {\r\n all: \"focus:ring-1\",\r\n desktop: \"lg:focus:ring-1\",\r\n mobile: \"focus:ring-1 lg:focus-ring-0\",\r\n none: \"\",\r\n};\r\n\r\nconst fontWeightStyles = {\r\n light: \"font-light\",\r\n normal: \"font-normal\",\r\n medium: \"font-medium\",\r\n semibold: \"font-semibold\",\r\n bold: \"font-bold\",\r\n};\r\n\r\nconst borderRadiusStyles = {\r\n none: \"rounded-none\",\r\n \"1\": \"rounded-1\",\r\n \"2\": \"rounded-2\",\r\n \"3\": \"rounded-3\",\r\n \"4\": \"rounded-4\",\r\n \"5\": \"rounded-5\",\r\n \"6\": \"rounded-6\",\r\n \"7\": \"rounded-7\",\r\n \"8\": \"rounded-8\",\r\n \"9\": \"rounded-9\",\r\n \"10\": \"rounded-10\",\r\n \"11\": \"rounded-11\",\r\n \"12\": \"rounded-12\",\r\n full: \"rounded-full\",\r\n};\r\n\r\n// Color variant styles\r\nconst colorStyles = {\r\n transparent: \"text-base-12 lg:hover:bg-base-4 focus:ring-base-6\",\r\n transparentinactive: \"text-base-11 lg:hover:bg-base-4\",\r\n brand:\r\n \"bg-brand text-brand-text lg:hover:bg-brand-hover focus:ring-base-6 border border-transparent\",\r\n accent: \"bg-accent text-accent-text lg:hover:bg-accent-hover\",\r\n contrast: \"bg-base-12 text-base-1 lg:hover:bg-base-11 focus:ring-base-6\",\r\n solid:\r\n \"bg-base-3 dark-theme:bg-base-3 lg:hover:bg-base-4 border border-base-4 focus:ring-base-5\",\r\n solidhybrid:\r\n \"border border-base-5 dark-theme:border-base-4 dark-theme:bg-base-3 lg:hover:bg-base-4 focus:ring-base-6\",\r\n outline: \"border border-base-6 lg:hover:bg-base-3 focus:ring-base-6\",\r\n info: \"bg-blue-3 text-blue-9 lg:hover:bg-blue-4 lg:active:bg-blue-5 focus:ring-blue-9 border border-transparent\",\r\n success:\r\n \"bg-green-4 text-green-9 lg:hover:bg-green-5 lg:active:bg-green-6 focus:ring-green-9 border border-transparent\",\r\n warning:\r\n \"bg-yellow-4 text-yellow-9 lg:hover:bg-yellow-5 lg:active:bg-yellow-6 focus:ring-yellow-9 border border-transparent\",\r\n danger:\r\n \"bg-red-4 text-red-9 lg:hover:bg-red-5 focus:ring-red-9 border border-transparent\",\r\n dangersolid:\r\n \"bg-red-9 text-base-1 dark-theme:text-base-12 lg:hover:bg-red-8 focus:ring-base-6 border border-transparent\",\r\n disabled: \"bg-base-3 text-base-11 border border-transparent\",\r\n};\r\n\r\n// State based styles\r\nconst stateStyles = {\r\n enabled: \"\",\r\n disabled: \"opacity-75\",\r\n loading: \"\",\r\n};\r\n\r\nconst Button = forwardRef(\r\n (\r\n {\r\n color = \"transparent\",\r\n size = \"mdsm\",\r\n fontWeight = \"normal\",\r\n rounded = \"6\",\r\n state = \"enabled\",\r\n onClick,\r\n className,\r\n children,\r\n withRipple = true,\r\n contrastRipple,\r\n showFocus = \"desktop\",\r\n withDisabledDelay = false,\r\n type = \"button\",\r\n ...others\r\n }: ButtonProps,\r\n forwardedRef: ForwardedRef<HTMLButtonElement>\r\n ) => {\r\n const [disabledDelay, setDisabledDelay] = useState(false);\r\n\r\n const handleClick = (\r\n e: React.MouseEvent<HTMLButtonElement, MouseEvent>\r\n ) => {\r\n if (state === \"enabled\") {\r\n if (withDisabledDelay) {\r\n setDisabledDelay(true);\r\n onClick && onClick(e);\r\n setTimeout(() => setDisabledDelay(false), 1000);\r\n } else {\r\n onClick && onClick(e);\r\n }\r\n }\r\n };\r\n\r\n const { ref: rippleRef, ripple } = useRipple(\r\n withRipple,\r\n color === \"contrast\" || contrastRipple\r\n );\r\n\r\n // Merge the ripple ref with forwarded ref\r\n const ref = useMergedRef(rippleRef, forwardedRef);\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={type}\r\n disabled={\r\n others.disabled\r\n ? others.disabled\r\n : state === \"disabled\" || state === \"loading\"\r\n }\r\n onMouseDown={ripple}\r\n onClick={(e) => (!disabledDelay ? handleClick(e) : null)}\r\n className={cn(\r\n baseStyles,\r\n sizeStyles[size],\r\n fontWeightStyles[fontWeight],\r\n borderRadiusStyles[rounded],\r\n focusStyles[showFocus],\r\n colorStyles[color],\r\n stateStyles[state],\r\n others.disabled && \"opacity-50\",\r\n className\r\n )}\r\n {...others}\r\n >\r\n {children}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = \"Button\";\r\n\r\nexport { Button };\r\n","import { cn } from \"../utils\";\r\n\r\nconst Separator = ({ className }: { className?: string }) => {\r\n return <div className={cn(\"w-full h-px bg-base-4\", className)} />;\r\n};\r\n\r\nexport { Separator };\r\n","/**\r\n * Props for the base Icon component that provides a consistent SVG wrapper.\r\n */\r\ninterface IconProps extends React.SVGProps<SVGSVGElement> {\r\n /** Width and height of the icon in pixels (default: 24) */\r\n size?: number | string;\r\n /** Stroke width for outlined icons (default: 2) */\r\n strokeWidth?: number;\r\n /** SVG viewBox attribute defining the coordinate system (default: \"0 0 24 24\") */\r\n viewBox?: \"0 0 24 24\" | \"0 0 48 48\" | \"0 0 512 512\";\r\n /** CSS class names for styling */\r\n className?: string;\r\n /** SVG elements (paths, circles, etc.) that define the icon shape */\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Base Icon component that provides a consistent SVG wrapper for creating custom icons.\r\n * Handles common SVG properties while allowing full customization through standard SVG props.\r\n *\r\n * @example\r\n * // Creating a reusable icon component\r\n * export const CustomIcon = ({ size, className, ...props }: IndividualIconProps) => {\r\n * return (\r\n * <Icon size={size} className={className} fill=\"currentColor\" {...props}>\r\n * <path d=\"M12 2L2 7v10c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-10-5z\" />\r\n * </Icon>\r\n * );\r\n * };\r\n *\r\n * @example\r\n * // Creating a custom icon\r\n * <Icon size={32} strokeWidth={1.5}>\r\n * <path d=\"M12 2L2 7v10c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-10-5z\" />\r\n * </Icon>\r\n *\r\n * @example\r\n * // Using with custom viewBox for different icon sets\r\n * <Icon viewBox=\"0 0 512 512\" size={48}>\r\n * <circle cx=\"256\" cy=\"256\" r=\"200\" />\r\n * </Icon>\r\n */\r\nexport const Icon: React.FC<IconProps> = ({\r\n children,\r\n size = 24,\r\n strokeWidth = 2,\r\n viewBox = \"0 0 24 24\",\r\n className,\r\n ...props\r\n}) => {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={size}\r\n height={size}\r\n viewBox={viewBox}\r\n className={className}\r\n {...props}\r\n >\r\n {children}\r\n </svg>\r\n );\r\n};\r\n\r\n// Define props for individual icons\r\nexport type IndividualIconProps = Omit<IconProps, \"children\">;\r\n\r\n// just here as example\r\n//ri:home-fill\r\n// export const HomeFill = ({\r\n// size,\r\n// className,\r\n// ...props\r\n// }: IndividualIconProps) => {\r\n// return (\r\n// <Icon size={size} className={className} fill=\"currentColor\" {...props}>\r\n// <path d=\"M21 20a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V9.49a1 1 0 0 1 .386-.79l8-6.223a1 1 0 0 1 1.228 0l8 6.223a1 1 0 0 1 .386.79z\" />\r\n// </Icon>\r\n// );\r\n// };\r\n","import { cn } from \"../utils\";\n\ntype SpinnerProps = {\n loading?: boolean;\n wrapperClassName?: string;\n spinnerClassName?: string;\n};\n\nconst Spinner: React.FC<SpinnerProps> = ({\n loading = true,\n wrapperClassName,\n spinnerClassName,\n}) => {\n return (\n <div className={cn(\"flex justify-center\", wrapperClassName)}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n className={cn({ \"animate-spin\": loading }, spinnerClassName)}\n >\n <path\n fill=\"currentColor\"\n d=\"M10 3a7 7 0 0 0-7 7a.5.5 0 0 1-1 0a8 8 0 1 1 8 8a.5.5 0 0 1 0-1a7 7 0 1 0 0-14Z\"\n />\n </svg>\n </div>\n );\n};\n\nexport { Spinner };\n","import { createPortal } from \"react-dom\";\n\ntype PortalProps = {\n children: React.ReactNode;\n node?: HTMLElement | null;\n};\n\nconst Portal = ({ children, node }: PortalProps) => {\n return createPortal(children, node ?? document.body);\n};\n\nexport { Portal };\n","/** A special constant with type `never` */\nexport const NEVER = Object.freeze({\n status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n function init(inst, def) {\n var _a;\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod ?? {},\n enumerable: false,\n });\n (_a = inst._zod).traits ?? (_a.traits = new Set());\n inst._zod.traits.add(name);\n initializer(inst, def);\n // support prototype modifications\n for (const k in _.prototype) {\n if (!(k in inst))\n Object.defineProperty(inst, k, { value: _.prototype[k].bind(inst) });\n }\n inst._zod.constr = _;\n inst._zod.def = def;\n }\n // doesn't work if Parent has a constructor with arguments\n const Parent = params?.Parent ?? Object;\n class Definition extends Parent {\n }\n Object.defineProperty(Definition, \"name\", { value: name });\n function _(def) {\n var _a;\n const inst = params?.Parent ? new Definition() : this;\n init(inst, def);\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n for (const fn of inst._zod.deferred) {\n fn();\n }\n return inst;\n }\n Object.defineProperty(_, \"init\", { value: init });\n Object.defineProperty(_, Symbol.hasInstance, {\n value: (inst) => {\n if (params?.Parent && inst instanceof params.Parent)\n return true;\n return inst?._zod?.traits?.has(name);\n },\n });\n Object.defineProperty(_, \"name\", { value: name });\n return _;\n}\n////////////////////////////// UTILITIES ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n constructor() {\n super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n }\n}\nexport const globalConfig = {};\nexport function config(newConfig) {\n if (newConfig)\n Object.assign(globalConfig, newConfig);\n return globalConfig;\n}\n","// functions\nexport function assertEqual(val) {\n return val;\n}\nexport function assertNotEqual(val) {\n return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n throw new Error();\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n const values = Object.entries(entries)\n .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n .map(([_, v]) => v);\n return values;\n}\nexport function joinValues(array, separator = \"|\") {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n if (typeof value === \"bigint\")\n return value.toString();\n return value;\n}\nexport function cached(getter) {\n const set = false;\n return {\n get value() {\n if (!set) {\n const value = getter();\n Object.defineProperty(this, \"value\", { value });\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n };\n}\nexport function nullish(input) {\n return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport function defineLazy(object, key, getter) {\n const set = false;\n Object.defineProperty(object, key, {\n get() {\n if (!set) {\n const value = getter();\n object[key] = value;\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n set(v) {\n Object.defineProperty(object, key, {\n value: v,\n // configurable: true,\n });\n // object[key] = v;\n },\n configurable: true,\n });\n}\nexport function assignProp(target, prop, value) {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n}\nexport function getElementAtPath(obj, path) {\n if (!path)\n return obj;\n return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n const keys = Object.keys(promisesObj);\n const promises = keys.map((key) => promisesObj[key]);\n return Promise.all(promises).then((results) => {\n const resolvedObj = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObj[keys[i]] = results[i];\n }\n return resolvedObj;\n });\n}\nexport function randomString(length = 10) {\n const chars = \"abcdefghijklmnopqrstuvwxyz\";\n let str = \"\";\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * chars.length)];\n }\n return str;\n}\nexport function esc(str) {\n return JSON.stringify(str);\n}\nexport const captureStackTrace = Error.captureStackTrace\n ? Error.captureStackTrace\n : (..._args) => { };\nexport function isObject(data) {\n return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = cached(() => {\n if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n return false;\n }\n try {\n const F = Function;\n new F(\"\");\n return true;\n }\n catch (_) {\n return false;\n }\n});\nexport function isPlainObject(o) {\n if (isObject(o) === false)\n return false;\n // modified constructor\n const ctor = o.constructor;\n if (ctor === undefined)\n return true;\n // modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false)\n return false;\n // ctor doesn't have static `isPrototypeOf`\n if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n return false;\n }\n return true;\n}\nexport function numKeys(data) {\n let keyCount = 0;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n }\n }\n return keyCount;\n}\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return \"undefined\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isNaN(data) ? \"nan\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"function\":\n return \"function\";\n case \"bigint\":\n return \"bigint\";\n case \"symbol\":\n return \"symbol\";\n case \"object\":\n if (Array.isArray(data)) {\n return \"array\";\n }\n if (data === null) {\n return \"null\";\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return \"promise\";\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return \"map\";\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return \"set\";\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return \"date\";\n }\n if (typeof File !== \"undefined\" && data instanceof File) {\n return \"file\";\n }\n return \"object\";\n default:\n throw new Error(`Unknown data type: ${t}`);\n }\n};\nexport const propertyKeyTypes = new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = new Set([\"string\", \"number\", \"bigint\", \"boolean\", \"symbol\", \"undefined\"]);\nexport function escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n const cl = new inst._zod.constr(def ?? inst._zod.def);\n if (!def || params?.parent)\n cl._zod.parent = inst;\n return cl;\n}\nexport function normalizeParams(_params) {\n const params = _params;\n if (!params)\n return {};\n if (typeof params === \"string\")\n return { error: () => params };\n if (params?.message !== undefined) {\n if (params?.error !== undefined)\n throw new Error(\"Cannot specify both `message` and `error` params\");\n params.error = params.message;\n }\n delete params.message;\n if (typeof params.error === \"string\")\n return { ...params, error: () => params.error };\n return params;\n}\nexport function createTransparentProxy(getter) {\n let target;\n return new Proxy({}, {\n get(_, prop, receiver) {\n target ?? (target = getter());\n return Reflect.get(target, prop, receiver);\n },\n set(_, prop, value, receiver) {\n target ?? (target = getter());\n return Reflect.set(target, prop, value, receiver);\n },\n has(_, prop) {\n target ?? (target = getter());\n return Reflect.has(target, prop);\n },\n deleteProperty(_, prop) {\n target ?? (target = getter());\n return Reflect.deleteProperty(target, prop);\n },\n ownKeys(_) {\n target ?? (target = getter());\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(_, prop) {\n target ?? (target = getter());\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n defineProperty(_, prop, descriptor) {\n target ?? (target = getter());\n return Reflect.defineProperty(target, prop, descriptor);\n },\n });\n}\nexport function stringifyPrimitive(value) {\n if (typeof value === \"bigint\")\n return value.toString() + \"n\";\n if (typeof value === \"string\")\n return `\"${value}\"`;\n return `${value}`;\n}\nexport function optionalKeys(shape) {\n return Object.keys(shape).filter((k) => {\n return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n });\n}\nexport const NUMBER_FORMAT_RANGES = {\n safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n int32: [-2147483648, 2147483647],\n uint32: [0, 4294967295],\n float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n const newShape = {};\n const currDef = schema._zod.def; //.shape;\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // pick key\n newShape[key] = currDef.shape[key];\n }\n return clone(schema, {\n ...schema._zod.def,\n shape: newShape,\n checks: [],\n });\n}\nexport function omit(schema, mask) {\n const newShape = { ...schema._zod.def.shape };\n const currDef = schema._zod.def; //.shape;\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n delete newShape[key];\n }\n return clone(schema, {\n ...schema._zod.def,\n shape: newShape,\n checks: [],\n });\n}\nexport function extend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to extend: expected a plain object\");\n }\n const def = {\n ...schema._zod.def,\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n checks: [], // delete existing checks\n };\n return clone(schema, def);\n}\nexport function merge(a, b) {\n return clone(a, {\n ...a._zod.def,\n get shape() {\n const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n catchall: b._zod.def.catchall,\n checks: [], // delete existing checks\n });\n}\nexport function partial(Class, schema, mask) {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in oldShape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n else {\n for (const key in oldShape) {\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n return clone(schema, {\n ...schema._zod.def,\n shape,\n checks: [],\n });\n}\nexport function required(Class, schema, mask) {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n else {\n for (const key in oldShape) {\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n return clone(schema, {\n ...schema._zod.def,\n shape,\n // optional: [],\n checks: [],\n });\n}\nexport function aborted(x, startIndex = 0) {\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue !== true)\n return true;\n }\n return false;\n}\nexport function prefixIssues(path, issues) {\n return issues.map((iss) => {\n var _a;\n (_a = iss).path ?? (_a.path = []);\n iss.path.unshift(path);\n return iss;\n });\n}\nexport function unwrapMessage(message) {\n return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n const full = { ...iss, path: iss.path ?? [] };\n // for backwards compatibility\n if (!iss.message) {\n const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n unwrapMessage(ctx?.error?.(iss)) ??\n unwrapMessage(config.customError?.(iss)) ??\n unwrapMessage(config.localeError?.(iss)) ??\n \"Invalid input\";\n full.message = message;\n }\n // delete (full as any).def;\n delete full.inst;\n delete full.continue;\n if (!ctx?.reportInput) {\n delete full.input;\n }\n return full;\n}\nexport function getSizableOrigin(input) {\n if (input instanceof Set)\n return \"set\";\n if (input instanceof Map)\n return \"map\";\n if (input instanceof File)\n return \"file\";\n return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n if (Array.isArray(input))\n return \"array\";\n if (typeof input === \"string\")\n return \"string\";\n return \"unknown\";\n}\nexport function issue(...args) {\n const [iss, input, inst] = args;\n if (typeof iss === \"string\") {\n return {\n message: iss,\n code: \"custom\",\n input,\n inst,\n };\n }\n return { ...iss };\n}\nexport function cleanEnum(obj) {\n return Object.entries(obj)\n .filter(([k, _]) => {\n // return true if NaN, meaning it's not a number, thus a string key\n return Number.isNaN(Number.parseInt(k, 10));\n })\n .map((el) => el[1]);\n}\n// instanceof\nexport class Class {\n constructor(..._args) { }\n}\n","import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n inst.name = \"$ZodError\";\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod,\n enumerable: false,\n });\n Object.defineProperty(inst, \"issues\", {\n value: def,\n enumerable: false,\n });\n Object.defineProperty(inst, \"message\", {\n get() {\n return JSON.stringify(def, util.jsonStringifyReplacer, 2);\n },\n enumerable: true,\n // configurable: false,\n });\n Object.defineProperty(inst, \"toString\", {\n value: () => inst.message,\n enumerable: false,\n });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of error.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n}\nexport function formatError(error, _mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n issue.errors.map((issues) => processError({ issues }));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues });\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues });\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(error);\n return fieldErrors;\n}\nexport function treeifyError(error, _mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const result = { errors: [] };\n const processError = (error, path = []) => {\n var _a, _b;\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n // regular union error\n issue.errors.map((issues) => processError({ issues }, issue.path));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n result.errors.push(mapper(issue));\n continue;\n }\n let curr = result;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (typeof el === \"string\") {\n curr.properties ?? (curr.properties = {});\n (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n curr = curr.properties[el];\n }\n else {\n curr.items ?? (curr.items = []);\n (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n curr = curr.items[el];\n }\n if (terminal) {\n curr.errors.push(mapper(issue));\n }\n i++;\n }\n }\n }\n };\n processError(error);\n return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n * issues: [\n * {\n * expected: 'string',\n * code: 'invalid_type',\n * path: [ 'username' ],\n * message: 'Invalid input: expected string'\n * },\n * {\n * expected: 'number',\n * code: 'invalid_type',\n * path: [ 'favoriteNumbers', 1 ],\n * message: 'Invalid input: expected number'\n * }\n * ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n * ✖ Expected number, received string at \"username\n * favoriteNumbers[0]\n * ✖ Invalid input: expected number\n * ```\n */\nexport function toDotPath(path) {\n const segs = [];\n for (const seg of path) {\n if (typeof seg === \"number\")\n segs.push(`[${seg}]`);\n else if (typeof seg === \"symbol\")\n segs.push(`[${JSON.stringify(String(seg))}]`);\n else if (/[^\\w$]/.test(seg))\n segs.push(`[${JSON.stringify(seg)}]`);\n else {\n if (segs.length)\n segs.push(\".\");\n segs.push(seg);\n }\n }\n return segs.join(\"\");\n}\nexport function prettifyError(error) {\n const lines = [];\n // sort by path length\n const issues = [...error.issues].sort((a, b) => a.path.length - b.path.length);\n // Process each issue\n for (const issue of issues) {\n lines.push(`✖ ${issue.message}`);\n if (issue.path?.length)\n lines.push(` → at ${toDotPath(issue.path)}`);\n }\n // Convert Map to formatted string\n return lines.join(\"\\n\");\n}\n","import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n if (result.issues.length) {\n const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, _params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n if (result.issues.length) {\n const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n return result.issues.length\n ? {\n success: false,\n error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n return result.issues.length\n ? {\n success: false,\n error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\n","import{validateFieldsNatively as r,toNestErrors as e}from\"@hookform/resolvers\";import{appendErrors as o}from\"react-hook-form\";import*as n from\"zod/v4/core\";function t(r,e){try{var o=r()}catch(r){return e(r)}return o&&o.then?o.then(void 0,e):o}function s(r,e){for(var n={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(\".\");if(!n[a])if(\"unionErrors\"in t){var u=t.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:s};if(\"unionErrors\"in t&&t.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var c=n[a].types,f=c&&c[t.code];n[a]=o(a,e,n,s,f?[].concat(f,t.message):t.message)}r.shift()}return n}function i(r,e){for(var n={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(\".\");if(!n[a])if(\"invalid_union\"===t.code&&t.errors.length>0){var u=t.errors[0][0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:s};if(\"invalid_union\"===t.code&&t.errors.forEach(function(e){return e.forEach(function(e){return r.push(e)})}),e){var c=n[a].types,f=c&&c[t.code];n[a]=o(a,e,n,s,f?[].concat(f,t.message):t.message)}r.shift()}return n}function a(o,a,u){if(void 0===u&&(u={}),function(r){return\"_def\"in r&&\"object\"==typeof r._def&&\"typeName\"in r._def}(o))return function(n,i,c){try{return Promise.resolve(t(function(){return Promise.resolve(o[\"sync\"===u.mode?\"parse\":\"parseAsync\"](n,a)).then(function(e){return c.shouldUseNativeValidation&&r({},c),{errors:{},values:u.raw?Object.assign({},n):e}})},function(r){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(r))return{values:{},errors:e(s(r.errors,!c.shouldUseNativeValidation&&\"all\"===c.criteriaMode),c)};throw r}))}catch(r){return Promise.reject(r)}};if(function(r){return\"_zod\"in r&&\"object\"==typeof r._zod}(o))return function(s,c,f){try{return Promise.resolve(t(function(){return Promise.resolve((\"sync\"===u.mode?n.parse:n.parseAsync)(o,s,a)).then(function(e){return f.shouldUseNativeValidation&&r({},f),{errors:{},values:u.raw?Object.assign({},s):e}})},function(r){if(function(r){return r instanceof n.$ZodError}(r))return{values:{},errors:e(i(r.issues,!f.shouldUseNativeValidation&&\"all\"===f.criteriaMode),f)};throw r}))}catch(r){return Promise.reject(r)}};throw new Error(\"Invalid input: not a Zod schema\")}export{a as zodResolver};\n//# sourceMappingURL=zod.module.js.map\n","import React from \"react\";\r\nimport {\r\n FieldValues,\r\n FormProvider,\r\n useForm,\r\n UseFormReturn,\r\n type SubmitHandler as RHFSubmitHandler,\r\n type FieldErrors,\r\n} from \"react-hook-form\";\r\nimport { cn } from \"../utils\";\r\nimport { z, ZodTypeAny } from \"zod\";\r\nimport { zodResolver } from \"@hookform/resolvers/zod\";\r\n\r\n// Custom type helper\r\n//OLD V\r\ntype SubmitHandler<T extends FieldValues> = (\r\n data: T,\r\n form: UseFormReturn<T>\r\n // dirtyFields: Partial<Readonly<DeepMap<DeepPartial<z.TypeOf<T>>, boolean>>>\r\n) => Promise<void> | void;\r\n\r\ntype FormWrapperProps<T extends FieldValues> = {\r\n methods: UseFormReturn<T>;\r\n onSubmit: RHFSubmitHandler<T>;\r\n onError?: (errors: FieldErrors<T>) => void;\r\n children: React.ReactNode;\r\n logErrors?: boolean;\r\n className?: string;\r\n};\r\n\r\n// Helper type to make all properties optional recursively\r\n// type DeepPartial<T> = T extends object\r\n// ? { [P in keyof T]?: DeepPartial<T[P]> }\r\n// : T;\r\n\r\nfunction Form<T extends FieldValues>({\r\n methods,\r\n onSubmit,\r\n onError,\r\n children,\r\n logErrors,\r\n className,\r\n}: FormWrapperProps<T>) {\r\n return (\r\n <FormProvider {...methods}>\r\n <form\r\n className={cn(\r\n \"mt-4 lg:mt-8 grid grid-cols-1 lg:grid-cols-2 gap-4 lg:gap-8 relative\",\r\n className\r\n )}\r\n onSubmit={methods.handleSubmit(\r\n (data) => onSubmit(data),\r\n (errors) => {\r\n if (logErrors) {\r\n console.log(errors);\r\n }\r\n onError?.(errors);\r\n }\r\n )}\r\n >\r\n {children}\r\n </form>\r\n </FormProvider>\r\n );\r\n}\r\n\r\n/**\r\n * Hook to create react-hook-form methods based on a zod schema and default values.\r\n *\r\n * @param schema Zod schema to validate form data\r\n * @param defaultValues Optional default form values (partial)\r\n * @returns UseFormReturn with typed form methods\r\n */\r\nfunction useMethods<TSchema extends ZodTypeAny>(\r\n schema: TSchema,\r\n defaultValues?: Partial<z.infer<TSchema>>\r\n): UseFormReturn<z.infer<TSchema>> {\r\n return useForm<z.infer<TSchema>>({\r\n resolver: zodResolver(schema),\r\n defaultValues: defaultValues as any,\r\n });\r\n}\r\nexport { Form, useMethods };\r\nexport type { SubmitHandler, RHFSubmitHandler };\r\n","import React, { forwardRef } from \"react\";\r\nimport { Check, Minus } from \"lucide-react\";\r\nimport { cn } from \"../utils\";\r\n\r\ninterface CheckboxProps {\r\n checked?: boolean | \"indeterminate\";\r\n onCheckedChange?: (checked: boolean | \"indeterminate\") => void;\r\n disabled?: boolean;\r\n required?: boolean;\r\n name?: string;\r\n value?: string;\r\n id?: string;\r\n className?: string | ((checked: boolean | \"indeterminate\") => string);\r\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nconst colorClasses = {\r\n unchecked: \"bg-base-3 lg:hover:bg-base-4\",\r\n checked: \"bg-brand lg:hover:bg-brand-hover text-brand-text\",\r\n uncheckedDisabled: \"bg-base-3 border-base-4\",\r\n checkedDisabled: \"bg-base-3 border-base-4 text-base-10\",\r\n};\r\n\r\nconst Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\r\n (\r\n {\r\n checked = false,\r\n onCheckedChange,\r\n disabled = false,\r\n required = false,\r\n name,\r\n value,\r\n id,\r\n className = \"\",\r\n size = \"sm\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const handleClick = () => {\r\n if (disabled) return;\r\n\r\n if (checked === \"indeterminate\") {\r\n onCheckedChange?.(true);\r\n } else {\r\n onCheckedChange?.(!checked);\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === \" \" || e.key === \"Enter\") {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n };\r\n\r\n const sizeClasses = {\r\n xs: \"h-3.5 w-3.5\",\r\n sm: \"h-4 w-4\",\r\n md: \"h-5 w-5\",\r\n lg: \"h-6 w-6\",\r\n };\r\n\r\n const iconSizes = {\r\n xs: 24,\r\n sm: 12,\r\n md: 14,\r\n lg: 16,\r\n };\r\n\r\n return (\r\n <>\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"checkbox\"\r\n aria-checked={checked === \"indeterminate\" ? \"mixed\" : checked}\r\n aria-required={required}\r\n disabled={disabled}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n className={cn(\r\n // Base styles\r\n \"inline-flex items-center justify-center rounded-2 border border-base-4 transition-all duration-200 ease-in-out\",\r\n \"focus:outline-none focus:ring-2 focus:ring-base-5\",\r\n // Size\r\n sizeClasses[size],\r\n // Disabled state\r\n disabled && \"cursor-not-allowed opacity-75\",\r\n !disabled && \"cursor-pointer\",\r\n // Checked states\r\n checked\r\n ? disabled\r\n ? colorClasses.checkedDisabled\r\n : colorClasses.checked\r\n : disabled\r\n ? colorClasses.uncheckedDisabled\r\n : colorClasses.unchecked,\r\n // Custom classes\r\n typeof className === \"function\" ? className(checked) : className\r\n )}\r\n {...props}\r\n >\r\n {checked === true && (\r\n <Check\r\n size={iconSizes[size]}\r\n className=\"stroke-current\"\r\n // strokeWidth={2.5}\r\n />\r\n )}\r\n {checked === \"indeterminate\" && (\r\n <Minus\r\n size={iconSizes[size]}\r\n className=\"stroke-current\"\r\n // strokeWidth={2.5}\r\n />\r\n )}\r\n </button>\r\n\r\n {/* Hidden input for form submission */}\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n value={value}\r\n checked={checked === true}\r\n onChange={() => {}} // Controlled by button\r\n disabled={disabled}\r\n required={required}\r\n id={id}\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </>\r\n );\r\n }\r\n);\r\n\r\nCheckbox.displayName = \"Checkbox\";\r\n\r\nexport { Checkbox };\r\n","import { CheckIcon, DollarSign, Eye, EyeOffIcon } from \"lucide-react\";\r\nimport {\r\n InputHTMLAttributes,\r\n forwardRef,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { nullRead, nullSet, setFocusEnd } from \"../utils\";\r\nimport { Controller, useFormContext } from \"react-hook-form\";\r\n\r\n// Types\r\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\r\n label?: string;\r\n description?: string;\r\n labelPosition?: \"default\" | \"floating\";\r\n color?: \"solid\" | \"outline\";\r\n focusColor?: \"solid\" | \"brand\";\r\n valid?: boolean;\r\n error?: boolean;\r\n errorMessage?: string;\r\n isPrice?: boolean;\r\n prefix?: string;\r\n wrapperClassName?: string;\r\n containerClassName?: string;\r\n}\r\n\r\nconst inputColors = {\r\n solid:\r\n \"bg-base-3 border border-base-4 drop-shadow-sm dark-theme:drop-shadow-none\",\r\n outline: \"border border-base-6\",\r\n};\r\n\r\nconst focusColors = {\r\n brand: \"ring-1 ring-brand\",\r\n solid: \"ring-1 ring-base-6\",\r\n};\r\n\r\n// similar to button size mdsm (text-sm px-3 py-2.5)\r\n// (this is similar to h-10 if need to make some shape)\r\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n label,\r\n description,\r\n labelPosition = \"default\",\r\n color = \"solid\",\r\n focusColor = \"brand\",\r\n placeholder,\r\n valid,\r\n error,\r\n errorMessage,\r\n isPrice,\r\n prefix,\r\n wrapperClassName,\r\n containerClassName,\r\n className,\r\n type = \"text\",\r\n value,\r\n ...props\r\n },\r\n forwardedRef\r\n ) => {\r\n const innerRef = useRef<HTMLInputElement>(null);\r\n const mounted = useRef(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isFocused, setIsFocused] = useState(false);\r\n const isPassword = type === \"password\";\r\n const inputType =\r\n isPassword && showPassword ? \"text\" : isPrice ? \"number\" : type;\r\n const hasValue = value !== \"\" && value !== null && value !== undefined;\r\n\r\n // Use the forwarded ref if available, otherwise use innerRef\r\n // const ref = forwardedRef || innerRef;\r\n // // const ref = forwardedRef;\r\n\r\n useEffect(() => {\r\n if (!mounted.current) {\r\n mounted.current = true;\r\n return;\r\n }\r\n\r\n if (innerRef.current) {\r\n setFocusEnd(innerRef.current);\r\n }\r\n }, [showPassword, innerRef]);\r\n\r\n return (\r\n <div className={cn(\"relative\", wrapperClassName)}>\r\n {label && labelPosition === \"default\" && (\r\n <label\r\n className={cn(\"font-medium ml-0.5 text-xs\", error && \"text-red-9\")}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n <div\r\n className={cn(\r\n \"rounded-6 transition cursor-text relative\",\r\n inputColors[color],\r\n {\r\n \"pt-[22px] pb-1.5\": labelPosition === \"floating\",\r\n [focusColors[focusColor]]: !error && isFocused,\r\n \"bg-red-4 text-red-9\": !!error,\r\n \"ring-1 ring-red-9\": !!error && isFocused,\r\n },\r\n containerClassName\r\n )}\r\n >\r\n {label && labelPosition === \"floating\" && (\r\n <label\r\n className={cn(\r\n \"absolute transition-all duration-200 pointer-events-none\",\r\n \"text-sm top-[18px] font-semibold left-3\",\r\n {\r\n \"text-xs top-2.5\": isFocused || hasValue || placeholder,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n {isPrice && (\r\n <DollarSign\r\n size={16}\r\n className={cn(\r\n \"absolute top-1/2 -translate-y-1/2 left-3\",\r\n error ? \"text-red-9\" : \"text-base-11\"\r\n )}\r\n />\r\n )}\r\n {prefix && (\r\n <p className=\"text-sm text-base-11 absolute top-1/2 -translate-y-1/2 left-3\">\r\n {prefix}\r\n </p>\r\n )}\r\n <input\r\n ref={(e) => {\r\n if (forwardedRef) {\r\n if (typeof forwardedRef === \"function\") {\r\n forwardedRef(e);\r\n } else {\r\n forwardedRef.current = e;\r\n }\r\n }\r\n //@ts-ignore\r\n innerRef.current = e;\r\n }}\r\n type={inputType}\r\n className={cn(\r\n \"w-full bg-transparent focus:outline-none\",\r\n \"placeholder:text-sm text-sm placeholder:text-base-11\",\r\n isPrice || prefix ? \"pl-9\" : \"pl-3\",\r\n {\r\n \"py-2.5\": labelPosition === \"default\",\r\n \"mt-1.5\": labelPosition === \"floating\",\r\n \"pr-10\": valid,\r\n \"text-red-9 placeholder:text-red-9\": !!error,\r\n },\r\n className\r\n )}\r\n value={value}\r\n placeholder={placeholder}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n {...props}\r\n />\r\n </div>\r\n\r\n {valid ? (\r\n <CheckIcon\r\n size={20}\r\n className={`absolute top-1/2 -translate-y-1/2 text-green-500 ${\r\n isPassword ? \"right-10\" : \"right-3\"\r\n }`}\r\n />\r\n ) : null}\r\n\r\n {isPassword && (\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n labelPosition === \"floating\"\r\n ? \"absolute right-3 top-1/2 -translate-y-1/2\"\r\n : \"absolute right-3 top-10\"\r\n )}\r\n onClick={() => {\r\n setShowPassword(!showPassword);\r\n }}\r\n >\r\n {showPassword ? (\r\n <EyeOffIcon\r\n size={20}\r\n className={cn(error ? \"text-red-9\" : \"text-base-11\")}\r\n />\r\n ) : (\r\n <Eye\r\n size={20}\r\n className={cn(error ? \"text-red-9\" : \"text-base-11\")}\r\n />\r\n )}\r\n </button>\r\n )}\r\n {errorMessage ? (\r\n <span role=\"alert\" className=\"text-red-9 text-sm mt-1 ml-0.5\">\r\n {errorMessage}\r\n </span>\r\n ) : description ? (\r\n <p className=\"text-xs text-base-11 mt-1 ml-0.5\">{description}</p>\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\n// Add display name for better debugging\r\nInput.displayName = \"Input\";\r\n\r\nexport const FormInput = ({\r\n name,\r\n customRead,\r\n customSet,\r\n withNullSet = true,\r\n ...others\r\n}: {\r\n name: string;\r\n customRead?: (value: string | null) => string;\r\n customSet?: (value: string) => string | number | null | undefined;\r\n withNullSet?: boolean;\r\n} & InputProps) => {\r\n const { control } = useFormContext();\r\n\r\n const readValue = useCallback(\r\n (value: string | null) => {\r\n if (customRead) {\r\n return customRead(value);\r\n } else if (value === null) {\r\n return nullRead(value);\r\n }\r\n return value;\r\n },\r\n [customRead]\r\n );\r\n\r\n const setValue = useCallback(\r\n (value: string) => {\r\n if (customSet) {\r\n if (withNullSet && value === null) {\r\n return nullSet(value);\r\n } else {\r\n return customSet(value);\r\n }\r\n } else if (value === null) {\r\n return nullSet(value);\r\n }\r\n return value;\r\n },\r\n [customSet]\r\n );\r\n\r\n if (!control) {\r\n console.error(`Form control is missing for field: ${name}`);\r\n return <p>Form control missing for field: {name}</p>;\r\n }\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field, fieldState }) => {\r\n return (\r\n <Input\r\n value={readValue(field.value)}\r\n onChange={(e) => field.onChange(setValue(e.target.value))}\r\n error={!!fieldState.error}\r\n errorMessage={fieldState.error?.message}\r\n // Pass the ref from React Hook Form\r\n ref={field.ref}\r\n {...others}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import {\r\n TextareaHTMLAttributes,\r\n forwardRef,\r\n useCallback,\r\n useState,\r\n} from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { nullRead, nullSet } from \"../utils\";\r\nimport { Controller, useFormContext } from \"react-hook-form\";\r\n\r\n// Types\r\ninterface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n label: string;\r\n labelPosition?: \"default\" | \"floating\";\r\n error?: boolean;\r\n focusColor?: \"solid\" | \"brand\";\r\n}\r\n\r\nconst focusColors = {\r\n brand: \"ring-1 ring-brand\",\r\n solid: \"ring-1 ring-base-6\",\r\n};\r\n\r\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\r\n (\r\n {\r\n label,\r\n labelPosition = \"default\",\r\n placeholder,\r\n error,\r\n focusColor = \"brand\",\r\n className,\r\n value,\r\n rows = 3,\r\n ...props\r\n },\r\n forwardedRef\r\n ) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n const hasValue = value !== \"\" && value !== null && value !== undefined;\r\n\r\n return (\r\n <div className=\"relative\">\r\n {labelPosition === \"default\" ? (\r\n <label\r\n className={cn(\r\n \"top-[18px] font-medium ml-0.5 text-xs\",\r\n error && \"text-red-9\"\r\n )}\r\n >\r\n {label}\r\n </label>\r\n ) : null}\r\n <div\r\n className={cn(labelPosition === \"default\" ? \"p-0\" : \"pt-5 pb-2\", {\r\n \"bg-red-4 text-red-9\": !!error,\r\n })}\r\n >\r\n {labelPosition === \"floating\" && (\r\n <label\r\n className={cn(\r\n \"absolute transition-all duration-200 pointer-events-none\",\r\n \"text-sm top-2.5 font-semibold left-2.5\",\r\n {\r\n \"text-xs top-2.5\": isFocused || hasValue || placeholder,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n <textarea\r\n ref={forwardedRef}\r\n className={cn(\r\n !error && isFocused && focusColors[focusColor],\r\n \"bg-base-3 border border-base-4 light-theme:drop-shadow-sm rounded-6 w-full focus:outline-none customscrollbarnohide\",\r\n \"placeholder:text-base-11 text-sm\",\r\n \"resize-none\", // Prevent manual resizing since we're auto-resizing\r\n labelPosition === \"default\" ? \"p-3\" : \"mt-1\",\r\n {\r\n // \"pr-10\": valid,\r\n \"text-red-9 placeholder:text-red-9\": !!error,\r\n },\r\n className\r\n )}\r\n value={value}\r\n placeholder={placeholder}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n rows={rows}\r\n {...props}\r\n />\r\n </div>\r\n\r\n {/* {valid && (\r\n <CheckIcon\r\n size={16}\r\n className=\"absolute top-6 right-3 text-green-9\"\r\n />\r\n )} */}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\n// Add display name for better debugging\r\nTextArea.displayName = \"TextArea\";\r\n\r\nexport const FormTextArea = ({\r\n name,\r\n customRead,\r\n customSet,\r\n ...others\r\n}: {\r\n name: string;\r\n customRead?: (value: string | null) => string;\r\n customSet?: (value: string) => string | null | undefined;\r\n} & TextAreaProps) => {\r\n const { control } = useFormContext();\r\n\r\n const readValue = useCallback(\r\n (value: string | null) => {\r\n if (customRead) {\r\n return customRead(value);\r\n } else if (value === null) {\r\n return nullRead(value);\r\n }\r\n return value;\r\n },\r\n [customRead]\r\n );\r\n\r\n const setValue = useCallback(\r\n (value: string) => {\r\n if (customSet) {\r\n return customSet(value);\r\n } else if (value === null) {\r\n return nullSet(value);\r\n }\r\n return value;\r\n },\r\n [customSet]\r\n );\r\n\r\n if (!control) {\r\n console.error(`Form control is missing for field: ${name}`);\r\n return <p>Form control missing for field: {name}</p>;\r\n }\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field, fieldState }) => {\r\n return (\r\n <div>\r\n <TextArea\r\n value={readValue(field.value)}\r\n onChange={(e) => field.onChange(setValue(e.target.value))}\r\n error={!!fieldState.error}\r\n // Pass the ref from React Hook Form\r\n ref={field.ref}\r\n {...others}\r\n />\r\n {fieldState.error ? (\r\n <span role=\"alert\" className=\"text-red-9 text-sm mt-1 ml-0.5\">\r\n {fieldState.error.message}\r\n </span>\r\n ) : null}\r\n </div>\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { CheckIcon } from \"lucide-react\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { Controller, useFormContext } from \"react-hook-form\";\r\n\r\ninterface TagsProps {\r\n label: string;\r\n variant?: \"default\" | \"floating\";\r\n color?: \"solid\" | \"translucent\" | \"outline\";\r\n tags: string[];\r\n onChange: (tags: string[]) => void;\r\n valid?: boolean;\r\n error?: string;\r\n placeholder?: string;\r\n maxTags?: number;\r\n validateTag?: (tag: string) => boolean | string;\r\n}\r\n\r\n// Custom Tag Input Component with accessibility\r\nexport const Tags = ({\r\n label,\r\n variant = \"default\",\r\n color = \"solid\",\r\n tags,\r\n onChange,\r\n valid,\r\n error,\r\n placeholder = \"Add a tag...\",\r\n maxTags,\r\n validateTag,\r\n}: TagsProps) => {\r\n const [inputValue, setInputValue] = useState(\"\");\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [localError, setLocalError] = useState<string | null>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const tagRefs = useRef<(HTMLDivElement | null)[]>([]);\r\n const hasValue = tags.length > 0;\r\n\r\n // Unique IDs for ARIA attributes\r\n const inputId = useRef(\r\n `taginput-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const labelId = useRef(\r\n `label-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const errorId = useRef(\r\n `error-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n\r\n // Set up tag refs\r\n useEffect(() => {\r\n tagRefs.current = tagRefs.current.slice(0, tags.length);\r\n }, [tags.length]);\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\" && inputValue.trim()) {\r\n e.preventDefault(); // Prevent form submission\r\n\r\n const newTag = inputValue.trim();\r\n\r\n // Check if we've reached the maximum number of tags\r\n if (maxTags && tags.length >= maxTags) {\r\n setLocalError(`Maximum of ${maxTags} tags allowed`);\r\n return;\r\n }\r\n\r\n // Check for duplicates\r\n if (tags.includes(newTag)) {\r\n setLocalError(\"Tag already exists\");\r\n return;\r\n }\r\n\r\n // Custom validation if provided\r\n if (validateTag) {\r\n const validationResult = validateTag(newTag);\r\n if (typeof validationResult === \"string\") {\r\n setLocalError(validationResult);\r\n return;\r\n } else if (validationResult === false) {\r\n setLocalError(\"Invalid tag\");\r\n return;\r\n }\r\n }\r\n\r\n // Add the tag\r\n onChange([...tags, newTag]);\r\n setInputValue(\"\");\r\n setLocalError(null);\r\n\r\n // Announce tag added for screen readers\r\n announceChange(`Added tag ${newTag}`);\r\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\r\n // Remove the last tag when backspace is pressed and input is empty\r\n const removedTag = tags[tags.length - 1];\r\n onChange(tags.slice(0, -1));\r\n\r\n // Announce tag removed for screen readers\r\n announceChange(`Removed tag ${removedTag}`);\r\n } else if (e.key === \"ArrowLeft\" && inputValue === \"\" && tags.length > 0) {\r\n // Allow navigating to tags with arrow keys when input is empty\r\n if (tagRefs.current[tags.length - 1]) {\r\n tagRefs.current[tags.length - 1]?.focus();\r\n }\r\n }\r\n };\r\n\r\n // Handle keyboard navigation among tags\r\n const handleTagKeyDown = (e: React.KeyboardEvent, tagIndex: number) => {\r\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\r\n e.preventDefault();\r\n const removedTag = tags[tagIndex];\r\n const newTags = [...tags];\r\n newTags.splice(tagIndex, 1);\r\n onChange(newTags);\r\n\r\n // Focus the input after removing\r\n setTimeout(() => {\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, 0);\r\n\r\n announceChange(`Removed tag ${removedTag}`);\r\n } else if (e.key === \"ArrowRight\") {\r\n e.preventDefault();\r\n if (tagIndex < tags.length - 1) {\r\n // Move focus to next tag\r\n tagRefs.current[tagIndex + 1]?.focus();\r\n } else {\r\n // Move to input if at last tag\r\n inputRef.current?.focus();\r\n }\r\n } else if (e.key === \"ArrowLeft\") {\r\n e.preventDefault();\r\n if (tagIndex > 0) {\r\n // Move focus to previous tag\r\n tagRefs.current[tagIndex - 1]?.focus();\r\n }\r\n }\r\n };\r\n\r\n const handleRemoveTag = (tagToRemove: string, tagIndex: number) => {\r\n onChange(tags.filter((tag) => tag !== tagToRemove));\r\n\r\n // Focus appropriately after removing\r\n setTimeout(() => {\r\n if (tagIndex < tags.length - 1) {\r\n // If there are tags after, focus the next tag\r\n tagRefs.current[tagIndex]?.focus();\r\n } else if (tagIndex > 0) {\r\n // Otherwise focus the previous tag\r\n tagRefs.current[tagIndex - 1]?.focus();\r\n } else {\r\n // Otherwise focus the input\r\n inputRef.current?.focus();\r\n }\r\n }, 0);\r\n\r\n announceChange(`Removed tag ${tagToRemove}`);\r\n };\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setInputValue(e.target.value);\r\n setLocalError(null);\r\n };\r\n\r\n const handleContainerClick = () => {\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n };\r\n\r\n // todo\r\n // accessibility announcement\r\n const announceChange = (message: string) => {\r\n // This would ideally use a live region, but for simplicity we'll just use console\r\n // In future, we'd have a visually hidden div with aria-live=\"polite\"\r\n console.log(`Accessibility announcement: ${message}`);\r\n };\r\n\r\n return (\r\n <div>\r\n <div className=\"relative\" ref={containerRef}>\r\n {variant === \"default\" ? (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n className={cn(\"text-base top-4 font-semibold left-3\", {\r\n \"text-sm top-2 left-2\": isFocused || hasValue || placeholder,\r\n \"text-red-9\": !!error,\r\n })}\r\n >\r\n {label} {maxTags && `(${tags.length}/${maxTags})`}\r\n </label>\r\n ) : null}\r\n <div\r\n className={cn(\"rounded-6 px-2 transition cursor-text pr-10\", {\r\n \"bg-base-3\": color === \"solid\",\r\n \"border border-uielborder focus:border-transparent\":\r\n color === \"outline\",\r\n \"py-3\": variant === \"default\",\r\n \"pt-5 pb-2\": variant === \"floating\",\r\n \"ring-2 ring-branduielborder\": isFocused,\r\n \"text-red-9\": error || localError,\r\n \"ring-2 ring-red-6\": (error || localError) && isFocused,\r\n })}\r\n // ${\r\n // error || localError ? \"border border-red-500\" : \"\"\r\n // }`}\r\n onClick={handleContainerClick}\r\n role=\"group\"\r\n aria-labelledby={labelId}\r\n aria-describedby={error || localError ? errorId : undefined}\r\n >\r\n {variant === \"floating\" ? (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n className={cn(\r\n \"absolute transition-all duration-200 pointer-events-none\",\r\n \"text-base top-4 font-semibold left-3\",\r\n {\r\n \"text-sm top-2 left-2\": isFocused || hasValue || placeholder,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label} {maxTags && `(${tags.length}/${maxTags})`}\r\n </label>\r\n ) : null}\r\n\r\n <div\r\n className={cn(\"flex flex-wrap gap-1 items-center\", {\r\n \"mt-2.5\": variant === \"floating\",\r\n })}\r\n >\r\n {tags.map((tag, index) => (\r\n <div\r\n key={`${tag}-${index}`}\r\n ref={(el) => {\r\n tagRefs.current[index] = el;\r\n }}\r\n className={cn(\r\n \"line-clamp-1 text-brand rounded-full px-2 text-sm flex items-center\",\r\n {\r\n \"bg-brandfadedbg text-brand\": !error && !localError,\r\n \"bg-red-4 text-red-9\": error || localError,\r\n }\r\n )}\r\n tabIndex={0} // Make tags focusable\r\n role=\"button\"\r\n aria-label={`${tag}, press delete or backspace to remove`}\r\n onKeyDown={(e) => handleTagKeyDown(e, index)}\r\n >\r\n {tag}\r\n <button\r\n type=\"button\"\r\n className=\"ml-1 text-brand hover:text-brandhover shrink-0\"\r\n onClick={() => handleRemoveTag(tag, index)}\r\n aria-label={`Remove ${tag} tag`}\r\n >\r\n x\r\n </button>\r\n </div>\r\n ))}\r\n <input\r\n id={inputId}\r\n ref={inputRef}\r\n type=\"text\"\r\n className=\"flex-grow min-w-[60px] bg-transparent outline-none placeholder:text-sm placeholder:text-secondarytext\"\r\n value={inputValue}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n enterKeyHint=\"enter\"\r\n autoComplete=\"off\"\r\n placeholder={tags.length > 0 ? \"\" : placeholder}\r\n style={{ width: `${Math.max(60, inputValue.length * 8)}px` }}\r\n aria-describedby={error || localError ? errorId : undefined}\r\n aria-invalid={!!(error || localError)}\r\n />\r\n </div>\r\n </div>\r\n\r\n {valid && (\r\n <span className=\"absolute right-3 top-1/2 transform -translate-y-1/2\">\r\n <CheckIcon />\r\n </span>\r\n )}\r\n </div>\r\n\r\n {(error || localError) && (\r\n <p\r\n id={errorId}\r\n className=\"text-red-500 text-xs mt-1\"\r\n aria-live=\"assertive\"\r\n >\r\n {error || localError}\r\n </p>\r\n )}\r\n\r\n {/* {maxTags && !error && !localError && (\r\n <p className=\"text-secondarytext text-xs ml-0.5 mt-1\">\r\n {tags.length} / {maxTags} tags\r\n </p>\r\n )} */}\r\n\r\n {/* Visually hidden live region for announcements */}\r\n <div className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {tags.length > 0\r\n ? `Current tags: ${tags.join(\", \")}`\r\n : \"No tags added yet\"}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ntype FormTagsProps = Omit<TagsProps, \"tags\" | \"onChange\"> & {\r\n name: string;\r\n};\r\n\r\nexport const FormTags = ({ name, ...others }: FormTagsProps) => {\r\n const { control } = useFormContext();\r\n\r\n if (!control) {\r\n console.error(`Form control is missing for field: ${name}`);\r\n return <p>Form control missing for field: {name}</p>;\r\n }\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field, fieldState }) => {\r\n return (\r\n <Tags\r\n tags={field.value}\r\n onChange={(tags) => field.onChange(tags)}\r\n error={fieldState.error?.message}\r\n {...others}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { CheckIcon, ChevronDownIcon, XIcon } from \"lucide-react\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { Controller, useFormContext } from \"react-hook-form\";\r\nimport { useClickAwayWithRef, usePopover } from \"../hooks\";\r\nimport { AnimatePresence, motion } from \"motion/react\";\r\nimport { Portal } from \"../components\";\r\n\r\ninterface MultiSelectProps<T> {\r\n label: string;\r\n labelPosition?: \"default\" | \"floating\";\r\n options: T[];\r\n selectedValues: T[];\r\n onChange: (values: T[]) => void;\r\n idExtractor: (item: T) => string | number;\r\n labelExtractor: (item: T) => string;\r\n customSetter?: (item: T) => any;\r\n valid?: boolean;\r\n error?: string;\r\n placeholder?: string;\r\n maxSelections?: number;\r\n searchable?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const MultiSelect = <T,>({\r\n label,\r\n labelPosition = \"default\",\r\n options,\r\n selectedValues,\r\n onChange,\r\n idExtractor,\r\n labelExtractor,\r\n customSetter,\r\n valid,\r\n error,\r\n placeholder = \"Select options...\",\r\n maxSelections,\r\n searchable = false,\r\n disabled = false,\r\n className,\r\n}: MultiSelectProps<T>) => {\r\n const [searchValue, setSearchValue] = useState(\"\");\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [focusedOptionIndex, setFocusedOptionIndex] = useState(-1);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\r\n\r\n const {\r\n triggerRef,\r\n triggerProps,\r\n popoverRef,\r\n getPopoverPosition,\r\n open,\r\n toggle,\r\n close,\r\n } = usePopover<HTMLDivElement, HTMLDivElement>({\r\n align: \"start\",\r\n side: \"top\",\r\n avoidCollisions: false,\r\n onOpen: () => {\r\n setIsFocused(true);\r\n if (searchable && inputRef.current) {\r\n setTimeout(() => inputRef.current?.focus(), 10);\r\n }\r\n },\r\n onClose: () => {\r\n setIsFocused(false);\r\n setSearchValue(\"\");\r\n setFocusedOptionIndex(-1);\r\n },\r\n });\r\n\r\n // Unique IDs for ARIA attributes\r\n const inputId = useRef(\r\n `multiselect-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const labelId = useRef(\r\n `label-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const errorId = useRef(\r\n `error-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const listboxId = useRef(\r\n `listbox-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n\r\n // Handle crossover between stored IDs and display objects\r\n const getDisplayValues = (): T[] => {\r\n if (!customSetter) return selectedValues;\r\n\r\n // selectedValues contains IDs, find matching objects from options\r\n return selectedValues\r\n .map((storedValue) => {\r\n const matchingOption = options.find(\r\n (option) =>\r\n idExtractor(option) === storedValue ||\r\n idExtractor(option) === idExtractor(storedValue as any)\r\n );\r\n return matchingOption;\r\n })\r\n .filter(Boolean) as T[];\r\n };\r\n\r\n const displayValues = getDisplayValues();\r\n const hasValue = displayValues.length > 0;\r\n\r\n // Filter options based on search\r\n const filteredOptions = searchable\r\n ? options.filter((option) =>\r\n labelExtractor(option).toLowerCase().includes(searchValue.toLowerCase())\r\n )\r\n : options;\r\n\r\n // Update option refs when filtered options change\r\n useEffect(() => {\r\n optionRefs.current = optionRefs.current.slice(0, filteredOptions.length);\r\n }, [filteredOptions.length]);\r\n\r\n const isSelected = (option: T) => {\r\n if (!customSetter) {\r\n return selectedValues.some(\r\n (selected) => idExtractor(selected) === idExtractor(option)\r\n );\r\n }\r\n\r\n // When using customSetter, selectedValues contains IDs\r\n return selectedValues.some(\r\n (storedValue) =>\r\n storedValue === idExtractor(option) ||\r\n idExtractor(storedValue as any) === idExtractor(option)\r\n );\r\n };\r\n\r\n const handleToggleOption = (option: T) => {\r\n if (disabled) return;\r\n\r\n if (isSelected(option)) {\r\n // Remove from selection\r\n let newValues;\r\n if (customSetter) {\r\n // Remove by ID when using customSetter\r\n const optionId = idExtractor(option);\r\n newValues = selectedValues.filter(\r\n (storedValue) =>\r\n storedValue !== optionId &&\r\n idExtractor(storedValue as any) !== optionId\r\n );\r\n } else {\r\n // Remove by object comparison\r\n newValues = selectedValues.filter(\r\n (selected) => idExtractor(selected) !== idExtractor(option)\r\n );\r\n }\r\n onChange(newValues);\r\n announceChange(`Removed ${labelExtractor(option)}`);\r\n } else {\r\n // Add to selection\r\n if (maxSelections && displayValues.length >= maxSelections) {\r\n announceChange(`Maximum of ${maxSelections} selections allowed`);\r\n return;\r\n }\r\n\r\n let newValues;\r\n if (customSetter) {\r\n // Add ID when using customSetter\r\n newValues = [...selectedValues, customSetter(option)];\r\n } else {\r\n // Add full object\r\n newValues = [...selectedValues, option];\r\n }\r\n onChange(newValues);\r\n announceChange(`Added ${labelExtractor(option)}`);\r\n }\r\n };\r\n\r\n const handleRemoveValue = (valueToRemove: T) => {\r\n if (disabled) return;\r\n\r\n let newValues;\r\n if (customSetter) {\r\n // Remove by ID when using customSetter\r\n const valueId = idExtractor(valueToRemove);\r\n newValues = selectedValues.filter(\r\n (storedValue) =>\r\n storedValue !== valueId && idExtractor(storedValue as any) !== valueId\r\n );\r\n } else {\r\n // Remove by object comparison\r\n newValues = selectedValues.filter(\r\n (selected) => idExtractor(selected) !== idExtractor(valueToRemove)\r\n );\r\n }\r\n onChange(newValues);\r\n announceChange(`Removed ${labelExtractor(valueToRemove)}`);\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n\r\n switch (e.key) {\r\n case \"Enter\":\r\n e.preventDefault();\r\n if (!open) {\r\n toggle();\r\n } else if (focusedOptionIndex >= 0) {\r\n handleToggleOption(filteredOptions[focusedOptionIndex]);\r\n }\r\n break;\r\n case \"Escape\":\r\n e.preventDefault();\r\n close();\r\n break;\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n if (!open) {\r\n toggle();\r\n } else {\r\n const nextIndex =\r\n focusedOptionIndex >= filteredOptions.length - 1\r\n ? 0\r\n : focusedOptionIndex + 1;\r\n setFocusedOptionIndex(nextIndex);\r\n optionRefs.current[nextIndex]?.scrollIntoView({ block: \"nearest\" });\r\n }\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n if (open) {\r\n const prevIndex =\r\n focusedOptionIndex <= 0\r\n ? filteredOptions.length - 1\r\n : focusedOptionIndex - 1;\r\n setFocusedOptionIndex(prevIndex);\r\n optionRefs.current[prevIndex]?.scrollIntoView({ block: \"nearest\" });\r\n }\r\n break;\r\n case \"Backspace\":\r\n if (searchable && searchValue === \"\" && displayValues.length > 0) {\r\n // Remove last selected value\r\n const lastValue = displayValues[displayValues.length - 1];\r\n handleRemoveValue(lastValue);\r\n }\r\n break;\r\n }\r\n };\r\n\r\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearchValue(e.target.value);\r\n setFocusedOptionIndex(-1);\r\n };\r\n\r\n const handleContainerClick = () => {\r\n if (!disabled) {\r\n if (searchable && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n toggle();\r\n }\r\n };\r\n\r\n const announceChange = (message: string) => {\r\n if (import.meta.env.NODE_ENV !== \"production\") {\r\n console.log(`Accessibility announcement: ${message}`);\r\n }\r\n };\r\n\r\n useClickAwayWithRef(popoverRef, (event) => {\r\n if (!triggerRef.current || !open || !event.target) return;\r\n if (triggerRef.current.contains(event.target as Node)) return;\r\n close();\r\n });\r\n\r\n const position = getPopoverPosition();\r\n\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n <div className=\"relative\" ref={containerRef}>\r\n {/* {labelPosition === \"default\" && (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n className={cn(\r\n \"text-base top-4 font-semibold left-3 absolute transition-all duration-200\",\r\n {\r\n \"text-sm top-2 left-2\": isFocused || hasValue,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label}{\" \"}\r\n {maxSelections && `(${selectedValues.length}/${maxSelections})`}\r\n </label>\r\n )} */}\r\n {labelPosition === \"default\" && (\r\n <label\r\n className={cn(\r\n \"top-[18px] font-medium ml-0.5 text-xs\",\r\n error && \"text-red-9\"\r\n )}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div\r\n ref={triggerRef}\r\n {...triggerProps}\r\n className={cn(\r\n \"relative rounded-6 px-2 transition cursor-pointer pr-10 min-h-[48px]\",\r\n \"border border-base-4 light-theme:drop-shadow-sm dark-theme:bg-base-3\",\r\n {\r\n \"py-3\": labelPosition === \"default\",\r\n \"pt-5 pb-2\": labelPosition === \"floating\",\r\n \"ring-1 ring-brand\": open || isFocused,\r\n \"text-red-9\": error,\r\n \"ring-2 ring-red-6\": error && (open || isFocused),\r\n \"opacity-60 cursor-not-allowed\": disabled,\r\n }\r\n )}\r\n onClick={handleContainerClick}\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-haspopup=\"listbox\"\r\n aria-owns={listboxId}\r\n aria-labelledby={labelId}\r\n aria-describedby={error ? errorId : undefined}\r\n onKeyDown={handleKeyDown}\r\n tabIndex={disabled ? -1 : 0}\r\n >\r\n {labelPosition === \"floating\" && (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n className={cn(\r\n \"absolute transition-all duration-200 pointer-events-none\",\r\n \"text-base top-4 font-semibold left-3\",\r\n {\r\n \"text-sm top-2 left-2\": isFocused || hasValue,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label}{\" \"}\r\n {maxSelections && `(${selectedValues.length}/${maxSelections})`}\r\n </label>\r\n )}\r\n\r\n <div\r\n className={cn(\"flex flex-wrap gap-2 items-center\", {\r\n \"mt-2.5\": labelPosition === \"floating\",\r\n })}\r\n >\r\n {displayValues.map((value) => (\r\n <div\r\n key={idExtractor(value)}\r\n className={cn(\r\n \"border border-base-4 dark-theme:border-base-5 dark-theme:bg-base-4 rounded-full px-2 py-1 text-sm flex items-center gap-1\",\r\n {\r\n \"bg-red-4 text-red-9\": error,\r\n }\r\n )}\r\n >\r\n <span className=\"line-clamp-1\">{labelExtractor(value)}</span>\r\n {!disabled && (\r\n <button\r\n type=\"button\"\r\n className=\"hover:bg-brand/20 rounded-full p-0.5 transition-colors\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleRemoveValue(value);\r\n }}\r\n aria-label={`Remove ${labelExtractor(value)}`}\r\n >\r\n <XIcon size={12} />\r\n </button>\r\n )}\r\n </div>\r\n ))}\r\n\r\n {searchable && (\r\n <input\r\n ref={inputRef}\r\n id={inputId}\r\n type=\"text\"\r\n className=\"flex-grow min-w-[60px] bg-transparent outline-none placeholder:text-sm\"\r\n value={searchValue}\r\n onChange={handleSearchChange}\r\n onKeyDown={handleKeyDown}\r\n placeholder={hasValue ? \"\" : placeholder}\r\n disabled={disabled}\r\n aria-autocomplete=\"list\"\r\n aria-controls={listboxId}\r\n autoComplete=\"off\"\r\n />\r\n )}\r\n\r\n {!searchable && !hasValue && (\r\n <span className=\"text-secondarytext text-sm flex-grow\">\r\n {placeholder}\r\n </span>\r\n )}\r\n </div>\r\n\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-2\">\r\n {valid && <CheckIcon size={16} className=\"text-green-600\" />}\r\n <ChevronDownIcon\r\n size={16}\r\n className={cn(\"transition-transform text-base-11\", {\r\n \"rotate-180\": open,\r\n })}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <AnimatePresence>\r\n {open && (\r\n <Portal>\r\n <motion.div\r\n initial={{ opacity: 0, y: -10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -10 }}\r\n transition={{ duration: 0.15 }}\r\n ref={popoverRef}\r\n style={{\r\n position: \"fixed\",\r\n left: position.x,\r\n top: position.top,\r\n bottom: position.bottom,\r\n width: containerRef.current?.offsetWidth ?? 200,\r\n }}\r\n className={cn(\r\n \"bg-base-1 dark-theme:bg-base-3 border border-base-4\",\r\n \"rounded-6 shadow-lg max-h-[300px] overflow-y-auto z-50\",\r\n \"customscrollbarnohide\"\r\n )}\r\n role=\"listbox\"\r\n id={listboxId}\r\n aria-labelledby={labelId}\r\n >\r\n {filteredOptions.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-secondarytext\">\r\n {searchValue ? \"No results found\" : \"No options available\"}\r\n </div>\r\n ) : (\r\n filteredOptions.map((option, index) => {\r\n const selected = isSelected(option);\r\n const focused = index === focusedOptionIndex;\r\n\r\n return (\r\n <div\r\n key={idExtractor(option)}\r\n ref={(el) => {\r\n optionRefs.current[index] = el;\r\n }}\r\n className={cn(\r\n \"px-3 py-2 text-sm cursor-pointer flex items-center justify-between\", // gap-x-2\r\n \"first:rounded-t-6 last:rounded-b-6\",\r\n // !selected && \"pl-9\",\r\n {\r\n \"bg-base-3 dark-theme:bg-base-4\": focused,\r\n \"bg-brandfadedbg text-brand\": selected,\r\n }\r\n )}\r\n onClick={() => handleToggleOption(option)}\r\n role=\"option\"\r\n aria-selected={selected}\r\n onMouseEnter={() => setFocusedOptionIndex(index)}\r\n >\r\n <span>{labelExtractor(option)}</span>\r\n {selected && <CheckIcon size={16} />}\r\n </div>\r\n );\r\n })\r\n )}\r\n </motion.div>\r\n </Portal>\r\n )}\r\n </AnimatePresence>\r\n\r\n {error && (\r\n <p\r\n id={errorId}\r\n className=\"text-red-9 text-xs mt-1\"\r\n aria-live=\"assertive\"\r\n >\r\n {error}\r\n </p>\r\n )}\r\n\r\n {/* Visually hidden live region for announcements */}\r\n <div className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {displayValues.length > 0\r\n ? `Selected: ${displayValues.map(labelExtractor).join(\", \")}`\r\n : \"No selections\"}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ntype FormMultiSelectProps<T> = Omit<\r\n MultiSelectProps<T>,\r\n \"selectedValues\" | \"onChange\"\r\n> & {\r\n name: string;\r\n};\r\n\r\nexport const FormMultiSelect = <T,>({\r\n name,\r\n ...others\r\n}: FormMultiSelectProps<T>) => {\r\n const { control } = useFormContext();\r\n\r\n if (!control) {\r\n console.error(`Form control is missing for field: ${name}`);\r\n return <p>Form control missing for field: {name}</p>;\r\n }\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field, fieldState }) => {\r\n return (\r\n <MultiSelect\r\n selectedValues={field.value || []}\r\n onChange={(values) => field.onChange(values)}\r\n error={fieldState.error?.message}\r\n {...others}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { Check, Plus, X } from \"lucide-react\";\r\nimport { Button, Spinner } from \"../components\";\r\nimport { useState } from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport const FormSubmit = ({\r\n isEditable,\r\n isDeletable = true,\r\n createUpdateLoading,\r\n deleteLoading,\r\n onDelete,\r\n onDeleteConfirm,\r\n addText = \"Añadir\",\r\n updateText = \"Actualizar\",\r\n deleteText = \"Eliminar\",\r\n className,\r\n}: {\r\n isEditable?: boolean;\r\n isDeletable?: boolean;\r\n createUpdateLoading: boolean;\r\n deleteLoading?: boolean;\r\n onDelete?: () => void;\r\n onDeleteConfirm?: boolean;\r\n addText?: string;\r\n updateText?: string;\r\n deleteText?: string;\r\n className?: string;\r\n}) => {\r\n const [confirm, setConfirm] = useState(false);\r\n\r\n return (\r\n <div className={`w-full grid grid-cols-2 gap-4 col-span-full ${className}`}>\r\n {isEditable && isDeletable ? (\r\n <Button\r\n color=\"dangersolid\"\r\n state={\r\n deleteLoading\r\n ? \"loading\"\r\n : createUpdateLoading\r\n ? \"disabled\"\r\n : \"enabled\"\r\n }\r\n onClick={() => {\r\n if (onDeleteConfirm) {\r\n if (!confirm) {\r\n setConfirm(true);\r\n } else {\r\n onDelete?.();\r\n }\r\n } else {\r\n onDelete?.();\r\n }\r\n }}\r\n >\r\n <X size={18} />\r\n {onDeleteConfirm ? (confirm ? \"Confirmar\" : deleteText) : deleteText}\r\n </Button>\r\n ) : null}\r\n <Button\r\n color=\"brand\"\r\n className={cn(isEditable && isDeletable ? \"\" : \"col-span-2\")}\r\n state={\r\n createUpdateLoading\r\n ? \"loading\"\r\n : deleteLoading\r\n ? \"disabled\"\r\n : \"enabled\"\r\n }\r\n type=\"submit\"\r\n >\r\n {createUpdateLoading ? (\r\n <Spinner />\r\n ) : isEditable ? (\r\n <Check size={18} />\r\n ) : (\r\n <Plus size={18} />\r\n )}\r\n {isEditable ? updateText : addText}\r\n </Button>\r\n </div>\r\n );\r\n};\r\n","import { useId } from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\ninterface SwitchProps {\r\n checked: boolean;\r\n onCheckedChange: (checked: boolean) => void;\r\n disabled?: boolean;\r\n name?: string;\r\n required?: boolean;\r\n className?: string;\r\n}\r\n\r\nfunction Switch({\r\n checked,\r\n onCheckedChange,\r\n disabled = false,\r\n name,\r\n required,\r\n className = \"\",\r\n}: SwitchProps) {\r\n const id = useId();\r\n\r\n const handleClick = () => {\r\n if (disabled) return;\r\n onCheckedChange(!checked);\r\n };\r\n\r\n return (\r\n <button\r\n id={id}\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={checked}\r\n aria-required={required}\r\n data-state={checked ? \"checked\" : \"unchecked\"}\r\n disabled={disabled}\r\n onClick={handleClick}\r\n className={cn(\r\n `\r\n relative inline-flex h-6 w-11 items-center rounded-full\r\n transition-colors duration-200 ease-in-out\r\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\r\n focus-visible:ring-blue-500`,\r\n checked ? \"bg-blue-600\" : \"bg-gray-200\",\r\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\r\n className\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n `inline-block h-5 w-5 transform rounded-full bg-white\r\n transition-transform duration-200 ease-in-out\r\n shadow-lg`,\r\n checked ? \"translate-x-6\" : \"translate-x-0.5\"\r\n )}\r\n />\r\n\r\n {/* Hidden input for form submission */}\r\n {name && (\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n checked={checked}\r\n required={required}\r\n disabled={disabled}\r\n onChange={() => {}} // Controlled by Controller\r\n tabIndex={-1}\r\n aria-hidden=\"true\"\r\n className=\"sr-only\"\r\n />\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\nexport { Switch };\r\n","import {\n createContext,\n memo,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\n//============================\n// #region AliveScope\n//============================\ntype AliveScopeContextType = {\n getPortalElement: (\n id: string,\n children: React.ReactNode,\n className?: string\n ) => HTMLElement;\n dropPortalElement: (id: string) => void;\n};\n\nconst AliveScopeContext = createContext<AliveScopeContextType | null>(null);\n\nconst AliveScopeProvider = ({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: AliveScopeContextType;\n}) => {\n return (\n <AliveScopeContext.Provider value={value}>\n {children}\n </AliveScopeContext.Provider>\n );\n};\n\nconst useAliveScope = () => {\n const context = useContext(AliveScopeContext);\n\n if (!context)\n throw new Error(\"useAliveScope must be wrapped within AliveScopeProvider\");\n\n return context;\n};\n\ntype AliveScopeProps = {\n children?: React.ReactNode;\n};\n\nconst AliveScope: React.FC<AliveScopeProps> = ({ children }) => {\n const [nodes, setNodes] = useState<{\n [id: string]: { children: React.ReactNode; element: HTMLElement };\n }>({});\n\n const onMountCallbacks = useRef<{ [id: string]: ((id: string) => void)[] }>(\n {}\n );\n const onDropCallbacks = useRef<{ [id: string]: ((id: string) => void)[] }>(\n {}\n );\n\n const getPortalElement = (\n id: string,\n children: React.ReactNode,\n className?: string\n ) => {\n if (!nodes[id]) {\n const element = document.createElement(\"div\");\n if (id) {\n element.id = id;\n }\n if (className) {\n element.className = className;\n }\n setNodes((prevNodes) => ({\n ...prevNodes,\n [id]: { children, element },\n }));\n onMountCallbacks.current[id] = [];\n onDropCallbacks.current[id] = [];\n if (onMountCallbacks.current && onMountCallbacks.current[id]) {\n onMountCallbacks.current[id].forEach((callback) => callback(id));\n }\n return element;\n }\n if (onMountCallbacks.current && onMountCallbacks.current[id]) {\n onMountCallbacks.current[id].forEach((callback) => callback(id));\n }\n return nodes[id].element;\n };\n\n const dropPortalElement = (id: string) => {\n setNodes((prevNodes) => {\n const copy = { ...prevNodes };\n delete copy[id];\n return copy;\n });\n //console.log(\"dropped\", id);\n if (onDropCallbacks.current && onDropCallbacks.current[id]) {\n onDropCallbacks.current[id].forEach((callback) => callback(id));\n }\n };\n\n return (\n <AliveScopeProvider\n value={{\n getPortalElement,\n dropPortalElement,\n }}\n >\n {children}\n {Object.entries(nodes).map(([id, { children, element }]) => (\n <Component\n key={id}\n id={id}\n onMountCallbacks={onMountCallbacks}\n onDropCallbacks={onDropCallbacks}\n children={children}\n element={element}\n />\n ))}\n </AliveScopeProvider>\n );\n};\n//============================\n// #endregion AliveScope\n//============================\n\n//============================\n// #region KeepAlive\n//============================\ntype KeepAliveContextType = {\n keepAliveId: string;\n onKeepAliveMount: (\n callback: (id: string) => void,\n options?: { runOnFirstMount?: boolean }\n ) => void;\n onKeepAliveDrop: (callback: (id: string) => void) => void;\n};\n\nexport const KeepAliveContext = createContext<KeepAliveContextType | null>(\n null\n);\n\nexport const KeepAliveProvider = ({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: KeepAliveContextType;\n}) => {\n return (\n <KeepAliveContext.Provider value={value}>\n {children}\n </KeepAliveContext.Provider>\n );\n};\n\nconst Component = memo<{\n id: string;\n onMountCallbacks: React.MutableRefObject<{\n [id: string]: ((id: string) => void)[];\n }>;\n onDropCallbacks: React.MutableRefObject<{\n [id: string]: ((id: string) => void)[];\n }>;\n children: React.ReactNode;\n element: HTMLElement;\n}>(({ id, onMountCallbacks, onDropCallbacks, children, element }) => {\n const onKeepAliveMount = (\n callback: (id: string) => void,\n options: { runOnFirstMount?: boolean } = { runOnFirstMount: false }\n ) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n const runCallback = () => {\n const el = document.getElementById(id);\n if (el) {\n callback(id);\n } else {\n // If element is not found, use MutationObserver to wait for it\n const observer = new MutationObserver((_mutations, obs) => {\n const el = document.getElementById(id);\n if (el) {\n callback(id);\n obs.disconnect(); // Stop observing once element is found\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n // Cleanup function to disconnect the observer if component unmounts\n return () => observer.disconnect();\n }\n };\n\n if (options?.runOnFirstMount) {\n runCallback();\n }\n\n onMountCallbacks.current[id].push(runCallback);\n return () => {\n onMountCallbacks.current[id] = onMountCallbacks.current[id].filter(\n (cb) => cb !== runCallback\n );\n };\n }, []);\n };\n\n const onKeepAliveDrop = (callback: (id: string) => void) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n onDropCallbacks.current[id].push(callback);\n return () => {\n onDropCallbacks.current[id] = onDropCallbacks.current[id].filter(\n (cb) => cb !== callback\n );\n };\n }, []);\n };\n\n return (\n <KeepAliveProvider\n value={{ keepAliveId: id, onKeepAliveMount, onKeepAliveDrop }}\n >\n {createPortal(children, element, id)}\n </KeepAliveProvider>\n );\n});\n\nconst useKeepAlive = () => {\n const context = useContext(KeepAliveContext);\n\n if (!context)\n throw new Error(\"useKeepAlive must be used within KeepAliveProvider\");\n\n return context;\n};\n\ntype KeepAliveProps = React.HTMLAttributes<HTMLDivElement> & {\n aliveKey: string;\n children: React.ReactNode;\n enabled?: boolean;\n};\n\nconst KeepAlive: React.FC<KeepAliveProps> = ({\n aliveKey,\n children,\n enabled = true,\n ...others\n}) => {\n const keepAliveRef = useRef<HTMLDivElement | null>(null);\n const { getPortalElement } = useAliveScope();\n\n useEffect(() => {\n const element = getPortalElement(aliveKey, children, others.className);\n\n if (enabled) {\n if (keepAliveRef.current) {\n keepAliveRef.current.replaceWith(element);\n }\n }\n\n return () => {\n //TODO\n //callUnmountCallbacks(aliveKey)\n };\n }, [aliveKey, children, enabled, others]);\n\n return (\n <div {...others} ref={keepAliveRef}>\n {/* Added children back for ssr initial rendering */}\n {children}\n </div>\n );\n};\n//============================\n// #endregion KeepAlive\n//============================\n\nexport { AliveScope, KeepAlive, useKeepAlive };\n"],"names":["cn","inputs","twMerge","clsx","throttle","func","limit","lastRan","timeout","args","now","debounce","delay","generateInitials","name","words","setFocusEnd","element","length","removeWhitespaces","text","toTitleCase","str","word","firstChar","restOfWord","nullRead","nullSet","extractDirtyData","data","dirtyFields","staticFields","result","field","key","FocusTrap","container","event","focusableElements","firstFocusable","lastFocusable","checkOverflow","horizontal","vertical","maxScrollLeft","maxScrollTop","useOverflow","onOverflow","trackScroll","withObserver","enabled","deps","ref","useRef","useEffect","initialOverflow","throttledUpdate","info","observer","scrollElement","useOverflowState","overflowInfo","setOverflowInfo","useState","sizes","Avatar","src","size","className","jsx","jsxs","Icon","AvatarsGroup","children","animate","props","f","s","t","largeAtom","atom","listening","handleResize","useLargeScreen","useAtomValue","useMergedRef","refs","value","useRipple","contrastRipple","lg","ripple","useCallback","button","buttonRect","rippleSize","offsetX","offsetY","rippleWrapper","rippleEl","ripples","usePopover","scrollerId","align","side","offset","collisionPadding","avoidCollisions","closeOnScroll","onOpen","onClose","open","setOpen","popoverDimensions","setPopoverDimensions","triggerRef","popoverRef","triggerRectRef","scrollerRef","triggerId","useId","getPopoverPosition","customRect","rect","popoverWidth","popoverHeight","calculatePopoverPosition","updatePopoverDimensions","handleScroll","toggle","prev","close","triggerRect","viewport","x","y","rightSideX","leftSideX","rightOverflow","leftOverflow","spaceBelow","spaceAbove","spaceRight","spaceLeft","centeredX","top","bottom","useClickAway","callback","handleClickAway","useClickAwayAdvanced","options","events","excludeRefs","handleClick","target","excludeRef","eventName","useClickAwayWithRef","baseStyles","sizeStyles","focusStyles","fontWeightStyles","borderRadiusStyles","colorStyles","stateStyles","Button","forwardRef","color","fontWeight","rounded","state","onClick","withRipple","showFocus","withDisabledDelay","type","others","forwardedRef","disabledDelay","setDisabledDelay","e","rippleRef","Separator","strokeWidth","viewBox","Spinner","loading","wrapperClassName","spinnerClassName","Portal","node","createPortal","$constructor","initializer","params","init","inst","def","_a","k","_","Parent","Definition","fn","$ZodAsyncError","globalConfig","config","newConfig","jsonStringifyReplacer","captureStackTrace","_args","unwrapMessage","message","finalizeIssue","iss","ctx","full","util.jsonStringifyReplacer","$ZodError","$ZodRealError","_parse","_Err","schema","_ctx","_params","core.$ZodAsyncError","util.finalizeIssue","core.config","util.captureStackTrace","parse","errors.$ZodRealError","_parseAsync","parseAsync","r","o","n","i","a","u","c","n.parse","n.parseAsync","n.$ZodError","Form","methods","onSubmit","onError","logErrors","FormProvider","errors","useMethods","defaultValues","useForm","zodResolver","colorClasses","Checkbox","checked","onCheckedChange","disabled","required","id","handleKeyDown","sizeClasses","iconSizes","Fragment","Check","Minus","inputColors","focusColors","Input","label","description","labelPosition","focusColor","placeholder","valid","error","errorMessage","isPrice","prefix","containerClassName","innerRef","mounted","showPassword","setShowPassword","isFocused","setIsFocused","isPassword","inputType","hasValue","DollarSign","CheckIcon","EyeOffIcon","Eye","FormInput","customRead","customSet","withNullSet","control","useFormContext","readValue","setValue","Controller","fieldState","TextArea","rows","FormTextArea","Tags","variant","tags","onChange","maxTags","validateTag","inputValue","setInputValue","localError","setLocalError","inputRef","containerRef","tagRefs","inputId","labelId","errorId","newTag","validationResult","announceChange","removedTag","handleTagKeyDown","tagIndex","newTags","handleRemoveTag","tagToRemove","tag","handleInputChange","handleContainerClick","index","el","FormTags","MultiSelect","selectedValues","idExtractor","labelExtractor","customSetter","maxSelections","searchable","searchValue","setSearchValue","focusedOptionIndex","setFocusedOptionIndex","optionRefs","triggerProps","listboxId","displayValues","storedValue","option","filteredOptions","isSelected","selected","handleToggleOption","newValues","optionId","handleRemoveValue","valueToRemove","valueId","nextIndex","prevIndex","lastValue","handleSearchChange","position","XIcon","ChevronDownIcon","AnimatePresence","motion","focused","FormMultiSelect","values","FormSubmit","isEditable","isDeletable","createUpdateLoading","deleteLoading","onDelete","onDeleteConfirm","addText","updateText","deleteText","confirm","setConfirm","X","Plus","Switch","AliveScopeContext","createContext","AliveScopeProvider","useAliveScope","context","useContext","AliveScope","nodes","setNodes","onMountCallbacks","onDropCallbacks","getPortalElement","prevNodes","dropPortalElement","copy","Component","KeepAliveContext","KeepAliveProvider","memo","onKeepAliveMount","runCallback","_mutations","obs","cb","onKeepAliveDrop","useKeepAlive","KeepAlive","aliveKey","keepAliveRef"],"mappings":"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","x_google_ignoreList":[6,17,18,19,20,21]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/design.ts","../src/utils/forms.ts","../src/utils/focus.ts","../src/utils/overflow.tsx","../src/components/Avatar.tsx","../src/components/AvatarsGroup.tsx","../../../node_modules/@mateosuarezdev/atoms/dist/react.js","../src/hooks/use-large-screen.tsx","../src/hooks/use-merged-ref.tsx","../src/hooks/use-ripple.tsx","../src/hooks/use-popover.tsx","../src/hooks/use-click-away.tsx","../src/hooks/use-key-listener.tsx","../src/components/Button.tsx","../src/components/Separator.tsx","../src/components/Icon.tsx","../src/components/Spinner.tsx","../src/components/Portal.tsx","../../../node_modules/zod/v4/core/core.js","../../../node_modules/zod/v4/core/util.js","../../../node_modules/zod/v4/core/errors.js","../../../node_modules/zod/v4/core/parse.js","../../../node_modules/@hookform/resolvers/zod/dist/zod.mjs","../src/components/Form.tsx","../src/components/Checkbox.tsx","../src/components/Input.tsx","../src/components/TextArea.tsx","../src/components/Tags.tsx","../src/components/MultiSelect.tsx","../src/components/Submit.tsx","../src/components/Switch.tsx","../src/components/KeepAlive.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\n//Custom ClassName\r\nexport type { ClassValue };\r\n\r\n/**Tailwind Merge + Clsx */\r\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\r\n\r\n/**\r\n * Creates a throttled function that only invokes func at most once per every limit milliseconds.\r\n * The first call executes immediately, subsequent calls are rate-limited, and the last call\r\n * during rapid firing is guaranteed to execute with the most recent arguments.\r\n *\r\n * @param func - The function to throttle\r\n * @param limit - The number of milliseconds to throttle invocations to (default: 100)\r\n * @returns A throttled version of the function\r\n *\r\n * @example\r\n * const handleScroll = throttle(() => {\r\n * console.log('Scrolled!');\r\n * }, 200);\r\n *\r\n * window.addEventListener('scroll', handleScroll);\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number = 100\r\n): (...args: Parameters<T>) => void {\r\n let lastRan: number | null = null;\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function (this: any, ...args: Parameters<T>) {\r\n const now = Date.now();\r\n\r\n if (lastRan === null || now - lastRan >= limit) {\r\n func.apply(this, args);\r\n lastRan = now;\r\n } else {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n func.apply(this, args);\r\n lastRan = Date.now();\r\n }, limit - (now - lastRan));\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Creates a debounced function that delays invoking func until after delay milliseconds\r\n * have elapsed since the last time the debounced function was invoked. Each call resets\r\n * the timer, ensuring func only executes after activity has stopped.\r\n *\r\n * @param func - The function to debounce\r\n * @param delay - The number of milliseconds to delay (default: 300)\r\n * @returns A debounced version of the function\r\n *\r\n * @example\r\n * const handleSearch = debounce((query) => {\r\n * fetchResults(query);\r\n * }, 300);\r\n *\r\n * input.addEventListener('input', (e) => handleSearch(e.target.value));\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n delay: number = 500\r\n): (...args: Parameters<T>) => void {\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function (this: any, ...args: Parameters<T>) {\r\n if (timeout) clearTimeout(timeout);\r\n\r\n timeout = setTimeout(() => {\r\n func.apply(this, args);\r\n timeout = null;\r\n }, delay);\r\n };\r\n}\r\n\r\nexport function generateInitials(name: string) {\r\n if (!name) return \"\";\r\n\r\n // Trim and remove extra spaces\r\n const trimmedName = name.trim().replace(/\\s+/g, \" \");\r\n\r\n // Split by space to get words\r\n const words = trimmedName.split(\" \");\r\n\r\n // If no words (empty string), return empty\r\n if (words.length === 0 || words[0] === \"\") {\r\n return \"\";\r\n }\r\n\r\n // If only one word, return first letter\r\n if (words.length === 1) {\r\n return words[0].charAt(0).toUpperCase();\r\n }\r\n\r\n // If two or more words, return first letter of first two words\r\n return (words[0].charAt(0) + words[1].charAt(0)).toUpperCase();\r\n}\r\n","export function setFocusEnd(element: HTMLInputElement) {\r\n element.focus();\r\n const length = element.value.length;\r\n element.setSelectionRange(length, length);\r\n}\r\n\r\nexport function removeWhitespaces(text: string) {\r\n return text.replace(/\\s/g, \"\");\r\n}\r\n\r\nexport function toTitleCase(str: string) {\r\n // First, convert the entire string to lowercase\r\n const lowerCase = str.toLowerCase();\r\n\r\n // Split the string into an array of words\r\n const words = lowerCase.split(\" \");\r\n\r\n // Capitalize the first letter of each word\r\n const titleCaseWords = words.map((word) => {\r\n if (word.length === 0) return word;\r\n\r\n // Get the first character, which may be a multi-byte character\r\n const firstChar = [...word][0];\r\n // Get the rest of the word\r\n const restOfWord = word.slice(firstChar.length);\r\n\r\n // Return the capitalized first character + the rest of the word\r\n return firstChar.toUpperCase() + restOfWord;\r\n });\r\n\r\n // Join the words back together\r\n return titleCaseWords.join(\" \");\r\n}\r\n\r\n/**\r\n * helper to set an input to empty string\r\n * if the value is null\r\n */\r\nexport function nullRead(e: string | null) {\r\n if (e === null) return \"\";\r\n return e;\r\n}\r\n\r\n/**\r\n * helper to set an input\r\n * back to null if the value is empty\r\n */\r\nexport function nullSet(e: string) {\r\n if (removeWhitespaces(e) === \"\") return null;\r\n return e;\r\n}\r\n\r\n/**\r\n * Extracts only the dirty fields from form data\r\n * @param data The complete form data\r\n * @param dirtyFields The dirtyFields object from form.formState\r\n * @param staticFields An object containing fields to always include (like ID)\r\n * @returns A new object containing only dirty fields and the static fields\r\n */\r\nexport function extractDirtyData<T extends Record<string, any>>(\r\n data: T,\r\n dirtyFields: any,\r\n staticFields: Partial<T> = {} as Partial<T>\r\n): Partial<T> {\r\n // Start with the static fields\r\n const result = { ...staticFields };\r\n\r\n // Add only the dirty fields\r\n Object.keys(dirtyFields).forEach((field) => {\r\n if (dirtyFields[field] === true && field in data) {\r\n const key = field as keyof T;\r\n result[key] = data[key];\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","//main per page focus trapping should be done\r\n//in the router itself, when setting the current active page\r\n\r\n//then for modals and popovers we can call custom trapWithinScope\r\n//and restore focus inside a classic useEffect\r\n\r\nclass FocusTrap {\r\n private container: HTMLElement | null;\r\n private previouslyFocusedElement: HTMLElement | null;\r\n\r\n constructor() {\r\n this.container = null;\r\n this.previouslyFocusedElement = null;\r\n }\r\n\r\n enable(): void {\r\n if (!this.container) return;\r\n\r\n this.previouslyFocusedElement = document.activeElement as HTMLElement;\r\n this.container.addEventListener(\"keydown\", this.trapFocus.bind(this));\r\n document.addEventListener(\"click\", this.handleClickOutside.bind(this));\r\n }\r\n\r\n disable(): void {\r\n if (!this.container) return;\r\n\r\n this.container.removeEventListener(\"keydown\", this.trapFocus.bind(this));\r\n document.removeEventListener(\"click\", this.handleClickOutside.bind(this));\r\n if (this.previouslyFocusedElement && this.previouslyFocusedElement.focus) {\r\n this.previouslyFocusedElement.focus();\r\n }\r\n }\r\n\r\n setContainer(container: HTMLElement): void {\r\n this.disable();\r\n this.container = container;\r\n this.enable();\r\n }\r\n\r\n private trapFocus(event: KeyboardEvent): void {\r\n const focusableElements = this.container?.querySelectorAll<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\r\n );\r\n\r\n if (!focusableElements) return;\r\n\r\n const firstFocusable = focusableElements[0];\r\n const lastFocusable = focusableElements[focusableElements.length - 1];\r\n\r\n if (event.key === \"Tab\") {\r\n if (event.shiftKey && document.activeElement === firstFocusable) {\r\n event.preventDefault();\r\n lastFocusable.focus();\r\n } else if (!event.shiftKey && document.activeElement === lastFocusable) {\r\n event.preventDefault();\r\n firstFocusable.focus();\r\n }\r\n }\r\n }\r\n\r\n private handleClickOutside(event: MouseEvent): void {\r\n if (this.container && !this.container.contains(event.target as Node)) {\r\n event.preventDefault();\r\n if (\r\n this.previouslyFocusedElement &&\r\n this.previouslyFocusedElement.focus\r\n ) {\r\n this.previouslyFocusedElement.focus();\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { FocusTrap };\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport { throttle } from \"./design\";\r\n\r\ntype OverflowInfo = {\r\n horizontal: boolean;\r\n vertical: boolean;\r\n scrollWidth: number;\r\n clientWidth: number;\r\n scrollHeight: number;\r\n clientHeight: number;\r\n // These require scroll position tracking\r\n canScrollLeft: boolean;\r\n canScrollRight: boolean;\r\n canScrollUp: boolean;\r\n canScrollDown: boolean;\r\n scrollPercentageX: number;\r\n scrollPercentageY: number;\r\n scrollLeft: number;\r\n scrollTop: number;\r\n};\r\n\r\nconst checkOverflow = (element: HTMLElement): OverflowInfo => {\r\n const horizontal = element.scrollWidth > element.clientWidth;\r\n const vertical = element.scrollHeight > element.clientHeight;\r\n\r\n const maxScrollLeft = Math.max(0, element.scrollWidth - element.clientWidth);\r\n const maxScrollTop = Math.max(0, element.scrollHeight - element.clientHeight);\r\n\r\n return {\r\n horizontal,\r\n vertical,\r\n scrollWidth: element.scrollWidth,\r\n clientWidth: element.clientWidth,\r\n scrollHeight: element.scrollHeight,\r\n clientHeight: element.clientHeight,\r\n scrollLeft: element.scrollLeft,\r\n scrollTop: element.scrollTop,\r\n // Scroll capabilities (require current scroll position)\r\n canScrollLeft: element.scrollLeft > 10,\r\n canScrollRight: element.scrollLeft < maxScrollLeft - 10,\r\n canScrollUp: element.scrollTop > 0,\r\n canScrollDown: element.scrollTop < maxScrollTop,\r\n // Scroll percentages\r\n scrollPercentageX:\r\n horizontal && maxScrollLeft > 0\r\n ? (element.scrollLeft / maxScrollLeft) * 100\r\n : 0,\r\n scrollPercentageY:\r\n vertical && maxScrollTop > 0\r\n ? (element.scrollTop / maxScrollTop) * 100\r\n : 0,\r\n };\r\n};\r\n\r\n// Updated hook that listens to scroll events\r\nconst useOverflow = <T extends HTMLElement>({\r\n onOverflow,\r\n trackScroll = false, // New option to enable scroll tracking\r\n withObserver = false,\r\n enabled = true,\r\n deps = [],\r\n}: {\r\n onOverflow?: (info: OverflowInfo) => void;\r\n trackScroll?: boolean;\r\n withObserver?: boolean;\r\n enabled?: boolean;\r\n deps?: any[];\r\n} = {}) => {\r\n const ref = useRef<T>(null);\r\n\r\n useEffect(() => {\r\n if (!ref.current || !enabled) return;\r\n\r\n let initialOverflow = false;\r\n\r\n const updateOverflow = () => {\r\n // console.log(\"updating overflow\");\r\n if (ref.current) {\r\n const info = checkOverflow(ref.current);\r\n onOverflow?.(info);\r\n }\r\n };\r\n\r\n const throttledUpdate = throttle(updateOverflow);\r\n\r\n // Initial check\r\n // updateOverflow();\r\n const info = checkOverflow(ref.current);\r\n initialOverflow = info.horizontal || info.vertical;\r\n onOverflow?.(info);\r\n\r\n // Listen for resize\r\n window.addEventListener(\"resize\", throttledUpdate);\r\n\r\n // Conditionally use ResizeObserver\r\n // this is for in element content changes\r\n let observer: ResizeObserver | null = null;\r\n if (withObserver) {\r\n observer = new ResizeObserver(throttledUpdate);\r\n if (ref.current) {\r\n observer.observe(ref.current);\r\n }\r\n }\r\n\r\n // Conditionally listen to scroll events\r\n let scrollElement: HTMLElement | null = null;\r\n if (trackScroll && initialOverflow) {\r\n scrollElement = ref.current;\r\n scrollElement.addEventListener(\"scroll\", throttledUpdate);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", throttledUpdate);\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n if (scrollElement && initialOverflow) {\r\n scrollElement.removeEventListener(\"scroll\", throttledUpdate);\r\n }\r\n };\r\n }, [enabled, ...deps]);\r\n\r\n return { ref };\r\n};\r\n\r\n// Alternative: State-based approach with scroll tracking\r\nconst useOverflowState = <T extends HTMLElement>({\r\n trackScroll = false,\r\n withObserver = false,\r\n enabled = true,\r\n deps = [],\r\n}: {\r\n trackScroll?: boolean;\r\n withObserver?: boolean;\r\n enabled?: boolean;\r\n deps?: any[];\r\n} = {}) => {\r\n const ref = useRef<T>(null);\r\n const [overflowInfo, setOverflowInfo] = useState<OverflowInfo | null>(null);\r\n\r\n useEffect(() => {\r\n if (!ref.current || !enabled) return;\r\n\r\n let initialOverflow = false;\r\n\r\n const updateOverflow = () => {\r\n // console.log(\"updating overflow\");\r\n if (ref.current) {\r\n const info = checkOverflow(ref.current);\r\n setOverflowInfo(info);\r\n }\r\n };\r\n\r\n const throttledUpdate = throttle(updateOverflow);\r\n\r\n // Initial check\r\n // updateOverflow();\r\n const info = checkOverflow(ref.current);\r\n initialOverflow = info.horizontal || info.vertical;\r\n setOverflowInfo(info);\r\n\r\n // Attach resize listener\r\n window.addEventListener(\"resize\", throttledUpdate);\r\n\r\n // Conditionally use ResizeObserver\r\n // this is for in element content changes\r\n let observer: ResizeObserver | null = null;\r\n if (withObserver) {\r\n observer = new ResizeObserver(throttledUpdate);\r\n if (ref.current) {\r\n observer.observe(ref.current);\r\n }\r\n }\r\n\r\n // Conditionally listen to scroll events\r\n let scrollElement: HTMLElement | null = null;\r\n if (trackScroll && initialOverflow) {\r\n scrollElement = ref.current;\r\n scrollElement.addEventListener(\"scroll\", throttledUpdate);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", throttledUpdate);\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n if (scrollElement && initialOverflow) {\r\n scrollElement.removeEventListener(\"scroll\", throttledUpdate);\r\n }\r\n };\r\n }, [enabled, ...deps]);\r\n\r\n return { ref, overflowInfo };\r\n};\r\n\r\nexport { checkOverflow, useOverflow, useOverflowState };\r\n","import { Icon } from \".\";\r\nimport { cn } from \"../utils\";\r\nimport { generateInitials } from \"../utils\";\r\n\r\nconst sizes = {\r\n xs: \"w-8 h-8\",\r\n sm: \"w-10 h-10 text-lg\",\r\n md: \"w-14 h-14 text-xl\",\r\n lg: \"h-20 w-20 text-2xl\",\r\n xl: \"h-24 w-24 text-2xl\",\r\n};\r\n\r\nconst Avatar = ({\r\n src,\r\n name,\r\n size = \"md\",\r\n className,\r\n}: {\r\n src?: string;\r\n name?: string;\r\n size?: keyof typeof sizes;\r\n className?: string;\r\n}) => {\r\n if (src) {\r\n return (\r\n <img\r\n alt=\"avatar\"\r\n src={src}\r\n className={cn(\"rounded-full bg-base-3\", sizes[size])}\r\n />\r\n );\r\n }\r\n\r\n if (name) {\r\n return (\r\n <p\r\n className={cn(\r\n \"rounded-full font-medium dark-theme:bg-base-3 border border-base-6 dark-theme:border-base-4 flex items-center justify-center\",\r\n sizes[size],\r\n className\r\n )}\r\n >\r\n {generateInitials(name)}\r\n </p>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"rounded-full text-2xl font-medium flex items-center justify-center\",\r\n \"bg-base-2 dark-theme:bg-base-3 border border-base-4\",\r\n \"lg:hover:bg-base-3 max-lg:active:bg-base-4 transition-colors\",\r\n sizes[size],\r\n className\r\n )}\r\n >\r\n <Icon\r\n size={size === \"xs\" ? 16 : size === \"sm\" ? 20 : 24}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\r\n </Icon>\r\n </div>\r\n );\r\n};\r\n\r\nexport { Avatar };\r\n","import { ComponentPropsWithoutRef } from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\nfunction AvatarsGroup({\r\n className,\r\n children,\r\n animate = false,\r\n ...props\r\n}: ComponentPropsWithoutRef<\"div\"> & { animate?: boolean }) {\r\n return (\r\n <div\r\n className={cn(\"flex -space-x-3 rtl:space-x-reverse\", className)}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport { AvatarsGroup };\r\n","import { useSyncExternalStore as s, useCallback as o, useRef as i, useEffect as l } from \"react\";\nimport { computed as p, effect as b } from \"./index.js\";\nfunction A(e) {\n const t = s(\n (u) => e.subscribe(u),\n () => e.get(),\n () => e.get()\n ), r = o(\n (u) => {\n e.set(u);\n },\n [e]\n );\n return [t, r];\n}\nfunction f(e) {\n return s(\n (t) => e.subscribe(t),\n () => e.get(),\n () => e.get()\n );\n}\nfunction d(e) {\n return o(\n (t) => {\n e.set(t);\n },\n [e]\n );\n}\nfunction E(e) {\n const t = i(null);\n return t.current || (t.current = p(e)), f(t.current);\n}\nfunction S(e) {\n l(() => b(e), []);\n}\nfunction h(e, ...t) {\n const r = t.length > 0 ? t : Object.keys(e), u = {};\n return r.forEach((c) => {\n const n = e[c];\n n && typeof n == \"object\" && \"get\" in n ? u[c] = f(n) : u[c] = n;\n }), u;\n}\nexport {\n A as useAtom,\n S as useAtomEffect,\n f as useAtomValue,\n E as useComputed,\n d as useSetAtom,\n h as useStore\n};\n//# sourceMappingURL=react.js.map\n","import { throttle } from \"../utils\";\r\nimport { useEffect } from \"react\";\r\nimport { atom } from \"@mateosuarezdev/atoms\";\r\nimport { useAtomValue } from \"@mateosuarezdev/atoms/react\";\r\n\r\n/**\r\n * Standard breakpoints for responsive design.\r\n */\r\n// export const mediaQueries = {\r\n// sm: 640,\r\n// md: 768,\r\n// lg: 1024,\r\n// xl: 1280,\r\n// \"2xl\": 1536,\r\n// };\r\n\r\n/**\r\n * Observable state tracking whether the screen is larger than the 'lg' breakpoint.\r\n * Default to true on server (assumes desktop), update on client.\r\n */\r\n// const largeObservable = observable(\r\n// typeof window !== \"undefined\" ? window.innerWidth > mediaQueries.lg : true\r\n// );\r\nconst largeAtom = atom(true);\r\n\r\nlet listening = false;\r\n\r\n/**\r\n * Throttled resize handler to update screen size state.\r\n * Only updates the observable when the viewport crosses the large screen threshold.\r\n * Throttled to improve performance by limiting update frequency.\r\n */\r\nconst handleResize = throttle(() => {\r\n largeAtom.set(window.innerWidth > 1024);\r\n}); // Throttle to once per 100ms\r\n\r\n// Only set up listeners on client\r\nif (typeof window !== \"undefined\") {\r\n if (listening) {\r\n window.removeEventListener(\"resize\", handleResize);\r\n listening = false;\r\n }\r\n\r\n // Attach resize listener to update state when window is resized\r\n window.addEventListener(\"resize\", handleResize);\r\n listening = true;\r\n}\r\n\r\n/**\r\n * Custom hook that returns whether the current viewport is larger than the 'lg' breakpoint.\r\n *\r\n * @example\r\n * function MyComponent() {\r\n * const lg = useLargeScreen();\r\n *\r\n * return (\r\n * <div>\r\n * {lg\r\n * ? <DesktopLayout />\r\n * : <MobileLayout />\r\n * }\r\n * </div>\r\n * );\r\n * }\r\n *\r\n * @returns {boolean} True if the current viewport width is larger than the 'lg' breakpoint\r\n */\r\nconst useLargeScreen = (): boolean => {\r\n useEffect(() => {\r\n largeAtom.set(window.innerWidth > 1024);\r\n }, []);\r\n return useAtomValue(largeAtom);\r\n};\r\n\r\nexport { useLargeScreen };\r\n","function useMergedRef<T>(...refs: React.Ref<T>[]): React.RefCallback<T> {\r\n return (value) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n } else if (ref != null) {\r\n (ref as React.MutableRefObject<T | null>).current = value;\r\n }\r\n });\r\n };\r\n}\r\n\r\nexport { useMergedRef };\r\n","import { CSSProperties, useCallback, useRef } from \"react\";\r\nimport { useLargeScreen } from \"./use-large-screen\";\r\n\r\n// new ripple uses a wrapper so the parent doesn't need overflow-hidden\r\nconst useRipple = <T extends HTMLElement>(\r\n enabled: boolean = true,\r\n contrastRipple?: boolean\r\n) => {\r\n const lg = useLargeScreen();\r\n const ref = useRef<T>(null);\r\n\r\n const ripple = useCallback(\r\n (event: React.MouseEvent<T>) => {\r\n if (!enabled || lg) return;\r\n\r\n const button = ref.current;\r\n if (!button) return;\r\n\r\n // Get button's position and dimensions\r\n const buttonRect = button.getBoundingClientRect();\r\n const rippleSize = Math.max(buttonRect.width, buttonRect.height);\r\n const offsetX = event.clientX - buttonRect.left - rippleSize / 2;\r\n const offsetY = event.clientY - buttonRect.top - rippleSize / 2;\r\n\r\n // Create the ripple wrapper (this element holds the ripple)\r\n const rippleWrapper = document.createElement(\"span\");\r\n rippleWrapper.classList.add(\"ripple-wrapper\");\r\n\r\n // Create the ripple element (circle)\r\n const rippleEl = document.createElement(\"span\");\r\n rippleEl.classList.add(\"ripple\");\r\n rippleEl.style.backgroundColor = contrastRipple\r\n ? \"var(--ripple-contrast)\"\r\n : \"var(--ripple-main)\";\r\n\r\n // Set the position and size of the ripple\r\n rippleEl.style.width = `${rippleSize}px`;\r\n rippleEl.style.height = `${rippleSize}px`;\r\n rippleEl.style.left = `${offsetX}px`;\r\n rippleEl.style.top = `${offsetY}px`;\r\n\r\n rippleWrapper.appendChild(rippleEl);\r\n\r\n const ripples = button.getElementsByClassName(\"ripple-wrapper\");\r\n if (ripples?.length) {\r\n for (const ripple of ripples) {\r\n ripple.remove();\r\n }\r\n }\r\n\r\n // Append the ripple wrapper to the button\r\n button.appendChild(rippleWrapper);\r\n\r\n // Remove the ripple wrapper after animation\r\n setTimeout(() => {\r\n rippleWrapper.remove();\r\n }, 700); // Match the animation duration\r\n },\r\n [enabled, lg, contrastRipple]\r\n );\r\n\r\n return {\r\n ref,\r\n ripple,\r\n styles: {\r\n position: \"relative\",\r\n } as CSSProperties,\r\n };\r\n};\r\n\r\nexport { useRipple };\r\n\r\n// ios like fade effect\r\n// const useRipple = (enabled = true, contrastRipple?: boolean) => {\r\n// const lg = useLargeScreen();\r\n// const ref = useRef<HTMLElement>(null);\r\n\r\n// const ripple = useCallback(\r\n// (event: React.MouseEvent<HTMLElement>) => {\r\n// if (!enabled || lg) return;\r\n\r\n// const rippleEl = document.createElement(\"span\");\r\n// rippleEl.classList.add(\"simple-ripple\");\r\n// rippleEl.style.backgroundColor = contrastRipple\r\n// ? \"var(--ripple-contrast)\"\r\n// : \"var(--ripple-main)\";\r\n\r\n// const target = ref.current;\r\n// if (!target) return;\r\n\r\n// target.appendChild(rippleEl);\r\n\r\n// // Remove after animation\r\n// setTimeout(() => {\r\n// rippleEl.remove();\r\n// }, 400); // Match animation duration\r\n// },\r\n// [enabled, lg, contrastRipple]\r\n// );\r\n\r\n// return { ref, ripple };\r\n// };\r\n\r\n// export default useRipple;\r\n\r\n// old ripple requires parent with overflow-hidden\r\n// const useRipple = (enabled: boolean = true, contrastRipple?: boolean) => {\r\n// const lg = useLargeScreen();\r\n// const ref = useRef<HTMLElement>(null);\r\n// const ripple = useCallback(\r\n// (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\r\n// if (!lg && enabled) {\r\n// const rippleContainer = event.currentTarget.getBoundingClientRect();\r\n// const circle = document.createElement(\"span\");\r\n// const diameter = Math.max(\r\n// rippleContainer.width,\r\n// rippleContainer.height\r\n// );\r\n// const radius = diameter / 2;\r\n\r\n// circle.style.width = circle.style.height = `${diameter}px`;\r\n// circle.style.left = `${\r\n// event.clientX - (rippleContainer.left + radius)\r\n// }px`;\r\n// circle.style.top = `${\r\n// event.clientY - (rippleContainer.top + radius)\r\n// }px`;\r\n// circle.style.backgroundColor = `${\r\n// contrastRipple ? \"var(--ripple-contrast)\" : \"var(--ripple-main)\"\r\n// }`;\r\n// circle.style.pointerEvents = \"none\";\r\n// circle.classList.add(\"ripple\");\r\n\r\n// const ripples = ref.current?.getElementsByClassName(\"ripple\");\r\n// if (ripples?.length) {\r\n// for (const ripple of ripples) {\r\n// ripple.remove();\r\n// }\r\n// }\r\n\r\n// ref.current?.appendChild(circle);\r\n\r\n// (async () => {\r\n// //await sleep(750);\r\n// setTimeout(\r\n// () => ref.current?.getElementsByClassName(\"ripple\")[0]?.remove(),\r\n// 750\r\n// );\r\n// })();\r\n// }\r\n// },\r\n// [contrastRipple, lg, enabled]\r\n// );\r\n\r\n// return {\r\n// ref: ref,\r\n// ripple: ripple,\r\n// classNames: \"relative overflow-hidden inline-block\",\r\n// };\r\n// };\r\n\r\n// export default useRipple;\r\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\r\n\r\ntype UsePopoverProps = {\r\n // routerMode?: \"stack\" | \"outlet\";\r\n scrollerId?: string;\r\n /**\r\n * To point scroller id to route id-content instead of id\r\n */\r\n // useScrollerSuffix?: boolean;\r\n align?: \"start\" | \"center\" | \"end\";\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n offset?: number;\r\n collisionPadding?: number;\r\n avoidCollisions?: boolean;\r\n closeOnScroll?: boolean;\r\n // observeResize?: boolean;\r\n onOpen?: VoidFunction;\r\n onClose?: VoidFunction;\r\n};\r\n\r\n// const hybridUseRoute = (routerMode: \"stack\" | \"outlet\") => {\r\n// if (routerMode === \"stack\") return stackUseRoute();\r\n// return outletUseRoute();\r\n// };\r\n\r\nexport const usePopover = <T extends HTMLElement, P extends HTMLElement>({\r\n // routerMode = \"outlet\",\r\n scrollerId,\r\n // useScrollerSuffix,\r\n align = \"start\",\r\n side = \"bottom\",\r\n offset = 8,\r\n collisionPadding = 8,\r\n avoidCollisions = true,\r\n closeOnScroll = true,\r\n // observeResize = false,\r\n onOpen,\r\n onClose,\r\n}: UsePopoverProps = {}) => {\r\n // const { id } = useRoute();\r\n const [open, setOpen] = useState(false);\r\n const [popoverDimensions, setPopoverDimensions] = useState({\r\n width: 192,\r\n height: 300,\r\n });\r\n const triggerRef = useRef<T>(null);\r\n const popoverRef = useRef<P>(null);\r\n const triggerRectRef = useRef({\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n });\r\n const scrollerRef = useRef<HTMLElement | null>(null);\r\n\r\n // Generate unique IDs for accessibility\r\n const triggerId = useId();\r\n\r\n // Calculate optimal position with collision detection\r\n const getPopoverPosition = useCallback(\r\n (customRect?: DOMRect) => {\r\n const rect = customRect ?? triggerRectRef.current;\r\n if (!rect) return { x: 0, top: 0, bottom: undefined };\r\n\r\n const popoverWidth = popoverDimensions.width;\r\n const popoverHeight = popoverDimensions.height;\r\n\r\n return calculatePopoverPosition({\r\n triggerRect: rect as DOMRect,\r\n popoverWidth,\r\n popoverHeight,\r\n align,\r\n side,\r\n offset: offset,\r\n collisionPadding: collisionPadding,\r\n avoidCollisions: avoidCollisions,\r\n });\r\n },\r\n [triggerRectRef.current, popoverDimensions, align, side]\r\n );\r\n\r\n // const popoverPosition = useMemo(\r\n // (customRect?: DOMRect) => {\r\n // const rect = customRect ?? triggerRectRef.current;\r\n // if (!rect) return { x: 0, top: 0, bottom: undefined };\r\n\r\n // const popoverWidth = popoverDimensions.width;\r\n // const popoverHeight = popoverDimensions.height;\r\n\r\n // // toast.info(`New dimensions, ${popoverWidth} ${popoverHeight}`);\r\n\r\n // const position = calculatePopoverPosition({\r\n // triggerRect: rect as DOMRect,\r\n // popoverWidth,\r\n // popoverHeight,\r\n // align,\r\n // side,\r\n // offset: offset,\r\n // collisionPadding: collisionPadding,\r\n // avoidCollisions: avoidCollisions,\r\n // });\r\n\r\n // return position;\r\n // },\r\n // [triggerRectRef.current, popoverDimensions, align, side]\r\n // );\r\n\r\n useEffect(() => {\r\n if (!open || !scrollerId) return;\r\n\r\n // let scrollerId = id;\r\n\r\n // if (customScrollerId) {\r\n // scrollerId = customScrollerId;\r\n // } else if (routerMode === \"stack\" || useScrollerSuffix) {\r\n // scrollerId = `${id}-content`;\r\n // }\r\n\r\n scrollerRef.current = document.getElementById(scrollerId);\r\n\r\n if (!scrollerRef.current) return;\r\n\r\n // added here to update popoverdimensions\r\n if (open) {\r\n updatePopoverDimensions();\r\n }\r\n\r\n // const handleScroll = throttle(() => setOpen(false), 1000);\r\n const handleScroll = () => {\r\n if (!scrollerRef.current) return;\r\n setOpen(false);\r\n onOpen?.();\r\n scrollerRef.current.removeEventListener(\"scroll\", handleScroll);\r\n };\r\n\r\n if (closeOnScroll) {\r\n scrollerRef.current.addEventListener(\"scroll\", handleScroll, {\r\n passive: true,\r\n });\r\n }\r\n\r\n return () => {\r\n scrollerRef.current &&\r\n scrollerRef.current.removeEventListener(\"scroll\", handleScroll);\r\n };\r\n }, [open, scrollerId]);\r\n\r\n // useEffect(() => {\r\n // if (!observeResize) return;\r\n // if (!popoverRef.current) return;\r\n // const observer = new ResizeObserver(() => {\r\n // updatePopoverDimensions();\r\n // if (triggerRef.current) {\r\n // // const rect = triggerRef.current.getBoundingClientRect();\r\n // // triggerRectRef.current = rect;\r\n // // Recalculate y with new height\r\n // const { x, top, bottom } = getPopoverPosition(\r\n // triggerRectRef.current as DOMRect\r\n // );\r\n // popoverRef.current!.style.left = `${x}px`;\r\n // if (top) {\r\n // popoverRef.current!.style = `${top}px`;\r\n // } else {\r\n // popoverRef.current!.style.removeProperty(\"top\");\r\n // }\r\n // if (bottom) {\r\n // popoverRef.current!.style = `${bottom}px`;\r\n // } else {\r\n // popoverRef.current!.style.removeProperty(\"bottom\");\r\n // }\r\n // }\r\n // });\r\n // observer.observe(popoverRef.current);\r\n // return () => observer.disconnect();\r\n // }, [observeResize, getPopoverPosition]);\r\n\r\n const updatePopoverDimensions = () => {\r\n if (!popoverRef.current) return;\r\n setPopoverDimensions({\r\n width: popoverRef.current.offsetWidth,\r\n height: popoverRef.current.offsetHeight,\r\n });\r\n };\r\n\r\n const toggle = useCallback(() => {\r\n if (!triggerRef.current) return;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n triggerRectRef.current = {\r\n left: rect.left,\r\n right: rect.right,\r\n top: rect.top,\r\n bottom: rect.bottom,\r\n x: rect.x,\r\n y: rect.y,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n setOpen((prev) => {\r\n if (prev) {\r\n onClose?.();\r\n } else {\r\n onOpen?.();\r\n }\r\n return !prev;\r\n });\r\n }, []);\r\n\r\n const close = useCallback(() => {\r\n setOpen(false);\r\n onClose?.();\r\n }, []);\r\n\r\n return {\r\n triggerRef,\r\n triggerProps: {\r\n id: triggerId,\r\n \"aria-expanded\": open,\r\n \"aria-haspopup\": true,\r\n },\r\n popoverRef,\r\n // popoverPosition,\r\n /**\r\n * Call this sync before rendering the popover\r\n */\r\n getPopoverPosition,\r\n open,\r\n toggle,\r\n close,\r\n };\r\n};\r\n\r\ntype PositionOptions = {\r\n triggerRect: DOMRect;\r\n popoverWidth: number;\r\n popoverHeight: number;\r\n align?: \"start\" | \"center\" | \"end\";\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n offset?: number;\r\n collisionPadding?: number;\r\n avoidCollisions?: boolean;\r\n};\r\n\r\nexport const calculatePopoverPosition = ({\r\n triggerRect,\r\n popoverWidth,\r\n popoverHeight,\r\n align = \"start\",\r\n side = \"bottom\",\r\n offset = 4,\r\n collisionPadding = 8,\r\n avoidCollisions = true,\r\n}: PositionOptions) => {\r\n const viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n };\r\n\r\n let x = 0;\r\n let y = 0;\r\n\r\n if (avoidCollisions) {\r\n if (side === \"right\") {\r\n // Calculate overflow on both sides\r\n const rightSideX = triggerRect.right + offset;\r\n const leftSideX = triggerRect.left - popoverWidth - offset;\r\n\r\n const rightOverflow = Math.max(\r\n 0,\r\n rightSideX + popoverWidth - (viewport.width - collisionPadding)\r\n );\r\n const leftOverflow = Math.max(0, collisionPadding - leftSideX);\r\n\r\n // Choose the side with less overflow\r\n if (rightOverflow <= leftOverflow) {\r\n // Use right side, but adjust if needed\r\n x = rightSideX;\r\n if (rightOverflow > 0) {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n } else {\r\n // Use left side, but adjust if needed\r\n x = leftSideX;\r\n if (leftOverflow > 0) {\r\n x = collisionPadding;\r\n }\r\n }\r\n\r\n // Vertical positioning - align with trigger top\r\n y = triggerRect.top;\r\n\r\n // Adjust if would go off bottom\r\n if (y + popoverHeight > viewport.height - collisionPadding) {\r\n y = viewport.height - popoverHeight - collisionPadding;\r\n }\r\n if (y < collisionPadding) {\r\n y = collisionPadding;\r\n }\r\n } else if (side === \"left\") {\r\n // Calculate overflow on both sides\r\n const leftSideX = triggerRect.left - popoverWidth - offset;\r\n const rightSideX = triggerRect.right + offset;\r\n\r\n const leftOverflow = Math.max(0, collisionPadding - leftSideX);\r\n const rightOverflow = Math.max(\r\n 0,\r\n rightSideX + popoverWidth - (viewport.width - collisionPadding)\r\n );\r\n\r\n // Choose the side with less overflow\r\n if (leftOverflow <= rightOverflow) {\r\n // Use left side, but adjust if needed\r\n x = leftSideX;\r\n if (leftOverflow > 0) {\r\n x = collisionPadding;\r\n }\r\n } else {\r\n // Use right side, but adjust if needed\r\n x = rightSideX;\r\n if (rightOverflow > 0) {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n\r\n // Vertical positioning - align with trigger top\r\n y = triggerRect.top;\r\n\r\n // Adjust if would go off bottom\r\n if (y + popoverHeight > viewport.height - collisionPadding) {\r\n y = viewport.height - popoverHeight - collisionPadding;\r\n }\r\n if (y < collisionPadding) {\r\n y = collisionPadding;\r\n }\r\n } else if (side === \"bottom\") {\r\n // Vertical positioning\r\n const spaceBelow = viewport.height - triggerRect.bottom;\r\n const spaceAbove = triggerRect.top;\r\n\r\n if (spaceBelow >= popoverHeight + offset) {\r\n y = triggerRect.bottom + offset;\r\n } else if (spaceAbove >= popoverHeight + offset) {\r\n y = triggerRect.top - popoverHeight - offset;\r\n } else {\r\n // Not enough space either way, prefer bottom but constrain\r\n y = triggerRect.bottom + offset;\r\n y = Math.min(y, viewport.height - popoverHeight - collisionPadding);\r\n }\r\n\r\n // Horizontal positioning with collision detection\r\n const spaceRight = viewport.width - triggerRect.left;\r\n const spaceLeft = triggerRect.right;\r\n\r\n if (align === \"start\") {\r\n x = triggerRect.left;\r\n\r\n // Check right edge collision\r\n if (x + popoverWidth > viewport.width - collisionPadding) {\r\n if (spaceLeft >= popoverWidth) {\r\n // Flip to end alignment\r\n x = triggerRect.right - popoverWidth;\r\n } else {\r\n // Pull back to fit\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n } else if (align === \"end\") {\r\n x = triggerRect.right - popoverWidth;\r\n\r\n // Check left edge collision\r\n if (x < collisionPadding) {\r\n if (spaceRight >= popoverWidth) {\r\n // Flip to start alignment\r\n x = triggerRect.left;\r\n } else {\r\n // Push right to fit\r\n x = collisionPadding;\r\n }\r\n }\r\n } else {\r\n // align === \"center\"\r\n const centeredX =\r\n triggerRect.left + triggerRect.width / 2 - popoverWidth / 2;\r\n\r\n if (\r\n centeredX >= collisionPadding &&\r\n centeredX + popoverWidth <= viewport.width - collisionPadding\r\n ) {\r\n x = centeredX;\r\n } else if (centeredX < collisionPadding) {\r\n x = collisionPadding;\r\n } else {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n } else {\r\n // side === \"top\"\r\n // Vertical positioning\r\n const spaceAbove = triggerRect.top;\r\n const spaceBelow = viewport.height - triggerRect.bottom;\r\n\r\n if (spaceAbove >= popoverHeight + offset) {\r\n y = triggerRect.top - popoverHeight - offset;\r\n } else if (spaceBelow >= popoverHeight + offset) {\r\n y = triggerRect.bottom + offset;\r\n } else {\r\n // Not enough space either way, prefer top but constrain\r\n y = triggerRect.top - popoverHeight - offset;\r\n y = Math.max(collisionPadding, y);\r\n }\r\n\r\n // Horizontal positioning (same logic as bottom)\r\n const spaceRight = viewport.width - triggerRect.left;\r\n const spaceLeft = triggerRect.right;\r\n\r\n if (align === \"start\") {\r\n x = triggerRect.left;\r\n\r\n if (x + popoverWidth > viewport.width - collisionPadding) {\r\n if (spaceLeft >= popoverWidth) {\r\n x = triggerRect.right - popoverWidth;\r\n } else {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n } else if (align === \"end\") {\r\n x = triggerRect.right - popoverWidth;\r\n\r\n if (x < collisionPadding) {\r\n if (spaceRight >= popoverWidth) {\r\n x = triggerRect.left;\r\n } else {\r\n x = collisionPadding;\r\n }\r\n }\r\n } else {\r\n // center\r\n const centeredX =\r\n triggerRect.left + triggerRect.width / 2 - popoverWidth / 2;\r\n\r\n if (\r\n centeredX >= collisionPadding &&\r\n centeredX + popoverWidth <= viewport.width - collisionPadding\r\n ) {\r\n x = centeredX;\r\n } else if (centeredX < collisionPadding) {\r\n x = collisionPadding;\r\n } else {\r\n x = viewport.width - popoverWidth - collisionPadding;\r\n }\r\n }\r\n }\r\n\r\n // Final bounds check to ensure nothing goes outside viewport\r\n x = Math.max(\r\n collisionPadding,\r\n Math.min(x, viewport.width - popoverWidth - collisionPadding)\r\n );\r\n y = Math.max(\r\n collisionPadding,\r\n Math.min(y, viewport.height - popoverHeight - collisionPadding)\r\n );\r\n } else {\r\n // Simple positioning without collision detection\r\n if (side === \"right\") {\r\n x = triggerRect.right + offset;\r\n y = triggerRect.top;\r\n } else if (side === \"left\") {\r\n x = triggerRect.left - popoverWidth - offset;\r\n y = triggerRect.top;\r\n } else if (side === \"bottom\") {\r\n y = triggerRect.bottom + offset;\r\n } else {\r\n y = triggerRect.top - popoverHeight - offset;\r\n }\r\n\r\n if (side === \"top\" || side === \"bottom\") {\r\n if (align === \"start\") {\r\n x = triggerRect.left;\r\n } else if (align === \"end\") {\r\n x = triggerRect.right - popoverWidth;\r\n } else {\r\n x = triggerRect.left + triggerRect.width / 2 - popoverWidth / 2;\r\n }\r\n }\r\n }\r\n\r\n let top: number | undefined;\r\n let bottom: number | undefined;\r\n\r\n // If popover's bottom edge is above the trigger top → popover is above\r\n if (y + popoverHeight <= triggerRect.top) {\r\n bottom = window.innerHeight - (y + popoverHeight); // attach to bottom\r\n } else {\r\n // popover is below trigger → attach to top\r\n top = y;\r\n }\r\n\r\n return { x, top, bottom };\r\n};\r\n","import { useEffect, useRef } from \"react\";\r\n\r\n// Basic version\r\nexport function useClickAway<T extends HTMLElement = HTMLElement>(\r\n callback: () => void\r\n) {\r\n const ref = useRef<T>(null);\r\n\r\n useEffect(() => {\r\n const handleClickAway = (event: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n callback();\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickAway);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickAway);\r\n };\r\n }, [callback]);\r\n\r\n return ref;\r\n}\r\n\r\n// Advanced version with options\r\ninterface UseClickOutsideOptions {\r\n enabled?: boolean;\r\n events?: string[];\r\n excludeRefs?: React.RefObject<HTMLElement>[];\r\n}\r\n\r\nexport function useClickAwayAdvanced<T extends HTMLElement = HTMLElement>(\r\n callback: () => void,\r\n options: UseClickOutsideOptions = {}\r\n) {\r\n const {\r\n enabled = true,\r\n events = [\"mousedown\", \"touchstart\"],\r\n excludeRefs = [],\r\n } = options;\r\n\r\n const ref = useRef<T>(null);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n const handleClick = (event: Event) => {\r\n const target = event.target as Node;\r\n\r\n // Check if click is inside the main element\r\n if (ref.current?.contains(target)) {\r\n return;\r\n }\r\n\r\n // Check if click is inside any excluded elements\r\n const isInsideExcluded = excludeRefs.some((excludeRef) =>\r\n excludeRef.current?.contains(target)\r\n );\r\n\r\n if (isInsideExcluded) {\r\n return;\r\n }\r\n\r\n callback();\r\n };\r\n\r\n events.forEach((eventName) => {\r\n document.addEventListener(eventName, handleClick);\r\n });\r\n\r\n return () => {\r\n events.forEach((eventName) => {\r\n document.removeEventListener(eventName, handleClick);\r\n });\r\n };\r\n }, [callback, enabled, events, excludeRefs]);\r\n\r\n return ref;\r\n}\r\n\r\n// Version that accepts external ref\r\nexport function useClickAwayWithRef<T extends HTMLElement | null = HTMLElement>(\r\n ref: React.RefObject<T>,\r\n callback: (event: MouseEvent) => void,\r\n enabled: boolean = true\r\n) {\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n const handleClickAway = (event: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n callback(event);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickAway);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickAway);\r\n };\r\n }, [ref, callback, enabled]);\r\n}\r\n\r\n// usage example\r\n\r\n// Dropdown with separate trigger button\r\n// function Dropdown() {\r\n// const [isOpen, setIsOpen] = useState(false);\r\n// const dropdownRef = useRef(null);\r\n// const triggerRef = useRef(null);\r\n\r\n// const ref = useClickAwayAdvanced(() => setIsOpen(false), {\r\n// enabled: isOpen,\r\n// excludeRefs: [triggerRef], // Don't close when clicking trigger\r\n// events: ['mousedown', 'touchstart'] // Mobile support\r\n// });\r\n\r\n// return (\r\n// <>\r\n// <button ref={triggerRef} onClick={() => setIsOpen(!isOpen)}>\r\n// Toggle\r\n// </button>\r\n// {isOpen && (\r\n// <div ref={ref}>Dropdown content</div>\r\n// )}\r\n// </>\r\n// );\r\n// }\r\n","import { useEffect, useRef } from \"react\";\r\n\r\ntype KeyMapping = {\r\n [key: string]: (event: KeyboardEvent) => void;\r\n};\r\n\r\ntype UseKeyListenerOptions = {\r\n target?: EventTarget | HTMLElement;\r\n event?: \"keydown\" | \"keyup\" | \"keypress\";\r\n enabled?: boolean;\r\n};\r\n\r\n/**\r\n * Custom hook for handling keyboard events in React\r\n *\r\n * @param keyMap - Object mapping keys to callback functions\r\n * @param options - Additional options for event handling\r\n *\r\n * @example\r\n * useKeyListener({\r\n * 'Escape': (e) => {\r\n * e.preventDefault();\r\n * setIsOpen(false);\r\n * },\r\n * 'Tab': (e) => {\r\n * if (document.activeElement === inputRef.current) {\r\n * e.preventDefault();\r\n * // Custom tab handling logic\r\n * }\r\n * }\r\n * });\r\n */\r\nfunction useKeyListener(\r\n keyMap: KeyMapping,\r\n { target = window, event = \"keydown\", enabled }: UseKeyListenerOptions = {}\r\n) {\r\n // Use a ref to keep the latest keyMap without triggering effect\r\n const keyMapRef = useRef<KeyMapping>(keyMap);\r\n\r\n // Update ref when keyMap changes\r\n useEffect(() => {\r\n keyMapRef.current = keyMap;\r\n }, [keyMap]);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n const handleKeyEvent = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n const callback = keyMapRef.current[key];\r\n\r\n if (callback) {\r\n callback(e);\r\n }\r\n };\r\n\r\n target.addEventListener(event, handleKeyEvent as EventListener);\r\n\r\n return () => {\r\n target.removeEventListener(event, handleKeyEvent as EventListener);\r\n };\r\n }, [target, event, enabled]);\r\n}\r\n\r\nexport { useKeyListener };\r\n","import { forwardRef, useState, ForwardedRef } from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { useMergedRef, useRipple } from \"../hooks\";\r\n\r\nexport type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\r\n color?: keyof typeof colorStyles;\r\n size?: keyof typeof sizeStyles;\r\n fontWeight?: keyof typeof fontWeightStyles;\r\n rounded?: keyof typeof borderRadiusStyles;\r\n state?: \"enabled\" | \"disabled\" | \"loading\";\r\n onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\r\n className?: string;\r\n withRipple?: boolean;\r\n contrastRipple?: boolean;\r\n showFocus?: \"all\" | \"desktop\" | \"mobile\" | \"none\";\r\n withDisabledDelay?: boolean;\r\n type?: \"button\" | \"submit\" | \"reset\";\r\n children?: React.ReactNode;\r\n};\r\n\r\n// Base button styles that apply to all variants\r\nconst baseStyles =\r\n \"relative shrink-0 select-none transition outline-none duration-200 ease-out focus:ring-border-brand-light flex items-center justify-center cursor-pointer\"; //was pl-1.5 and rounded-lg\r\n\r\nconst sizeStyles = {\r\n xs: \"text-xs px-1 gap-x-0.5 py-1\",\r\n sm: \"text-sm px-2.5 gap-x-1 py-1.5\",\r\n mdsm: \"text-sm px-3 gap-x-1.5 py-2.5\",\r\n md: \"text-base px-4 gap-x-1.5 py-2.5\",\r\n lg: \"text-base px-4 gap-x-1.5 py-3.5\",\r\n picker: \"text-base px-2 py-2 gap-x-1.5\",\r\n iconXs: \"text-xs p-1\",\r\n iconSm: \"text-sm p-2\",\r\n iconMd: \"text-base p-3\",\r\n iconLg: \"text-base p-4\",\r\n};\r\n\r\n// Focus styles based on showFocus prop\r\nconst focusStyles = {\r\n all: \"focus:ring-1\",\r\n desktop: \"lg:focus:ring-1\",\r\n mobile: \"focus:ring-1 lg:focus-ring-0\",\r\n none: \"\",\r\n};\r\n\r\nconst fontWeightStyles = {\r\n light: \"font-light\",\r\n normal: \"font-normal\",\r\n medium: \"font-medium\",\r\n semibold: \"font-semibold\",\r\n bold: \"font-bold\",\r\n};\r\n\r\nconst borderRadiusStyles = {\r\n none: \"rounded-none\",\r\n \"1\": \"rounded-1\",\r\n \"2\": \"rounded-2\",\r\n \"3\": \"rounded-3\",\r\n \"4\": \"rounded-4\",\r\n \"5\": \"rounded-5\",\r\n \"6\": \"rounded-6\",\r\n \"7\": \"rounded-7\",\r\n \"8\": \"rounded-8\",\r\n \"9\": \"rounded-9\",\r\n \"10\": \"rounded-10\",\r\n \"11\": \"rounded-11\",\r\n \"12\": \"rounded-12\",\r\n full: \"rounded-full\",\r\n};\r\n\r\n// Color variant styles\r\nconst colorStyles = {\r\n transparent: \"text-base-12 lg:hover:bg-base-4 focus:ring-base-6\",\r\n transparentinactive: \"text-base-11 lg:hover:bg-base-4\",\r\n brand:\r\n \"bg-brand text-brand-text lg:hover:bg-brand-hover focus:ring-base-6 border border-transparent\",\r\n accent: \"bg-accent text-accent-text lg:hover:bg-accent-hover\",\r\n contrast: \"bg-base-12 text-base-1 lg:hover:bg-base-11 focus:ring-base-6\",\r\n solid:\r\n \"bg-base-3 dark-theme:bg-base-3 lg:hover:bg-base-4 border border-base-4 focus:ring-base-5\",\r\n solidhybrid:\r\n \"border border-base-5 dark-theme:border-base-4 dark-theme:bg-base-3 lg:hover:bg-base-4 focus:ring-base-6\",\r\n outline: \"border border-base-6 lg:hover:bg-base-3 focus:ring-base-6\",\r\n info: \"bg-blue-3 text-blue-9 lg:hover:bg-blue-4 lg:active:bg-blue-5 focus:ring-blue-9 border border-transparent\",\r\n success:\r\n \"bg-green-4 text-green-9 lg:hover:bg-green-5 lg:active:bg-green-6 focus:ring-green-9 border border-transparent\",\r\n warning:\r\n \"bg-yellow-4 text-yellow-9 lg:hover:bg-yellow-5 lg:active:bg-yellow-6 focus:ring-yellow-9 border border-transparent\",\r\n danger:\r\n \"bg-red-4 text-red-9 lg:hover:bg-red-5 focus:ring-red-9 border border-transparent\",\r\n dangersolid:\r\n \"bg-red-9 text-base-1 dark-theme:text-base-12 lg:hover:bg-red-8 focus:ring-base-6 border border-transparent\",\r\n disabled: \"bg-base-3 text-base-11 border border-transparent\",\r\n};\r\n\r\n// State based styles\r\nconst stateStyles = {\r\n enabled: \"\",\r\n disabled: \"opacity-75\",\r\n loading: \"\",\r\n};\r\n\r\nconst Button = forwardRef(\r\n (\r\n {\r\n color = \"transparent\",\r\n size = \"mdsm\",\r\n fontWeight = \"normal\",\r\n rounded = \"6\",\r\n state = \"enabled\",\r\n onClick,\r\n className,\r\n children,\r\n withRipple = true,\r\n contrastRipple,\r\n showFocus = \"desktop\",\r\n withDisabledDelay = false,\r\n type = \"button\",\r\n ...others\r\n }: ButtonProps,\r\n forwardedRef: ForwardedRef<HTMLButtonElement>\r\n ) => {\r\n const [disabledDelay, setDisabledDelay] = useState(false);\r\n\r\n const handleClick = (\r\n e: React.MouseEvent<HTMLButtonElement, MouseEvent>\r\n ) => {\r\n if (state === \"enabled\") {\r\n if (withDisabledDelay) {\r\n setDisabledDelay(true);\r\n onClick && onClick(e);\r\n setTimeout(() => setDisabledDelay(false), 1000);\r\n } else {\r\n onClick && onClick(e);\r\n }\r\n }\r\n };\r\n\r\n const { ref: rippleRef, ripple } = useRipple(\r\n withRipple,\r\n color === \"contrast\" || contrastRipple\r\n );\r\n\r\n // Merge the ripple ref with forwarded ref\r\n const ref = useMergedRef(rippleRef, forwardedRef);\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={type}\r\n disabled={\r\n others.disabled\r\n ? others.disabled\r\n : state === \"disabled\" || state === \"loading\"\r\n }\r\n onMouseDown={ripple}\r\n onClick={(e) => (!disabledDelay ? handleClick(e) : null)}\r\n className={cn(\r\n baseStyles,\r\n sizeStyles[size],\r\n fontWeightStyles[fontWeight],\r\n borderRadiusStyles[rounded],\r\n focusStyles[showFocus],\r\n colorStyles[color],\r\n stateStyles[state],\r\n others.disabled && \"opacity-50\",\r\n className\r\n )}\r\n {...others}\r\n >\r\n {children}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = \"Button\";\r\n\r\nexport { Button };\r\n","import { cn } from \"../utils\";\r\n\r\nconst Separator = ({ className }: { className?: string }) => {\r\n return <div className={cn(\"w-full h-px bg-base-4\", className)} />;\r\n};\r\n\r\nexport { Separator };\r\n","/**\r\n * Props for the base Icon component that provides a consistent SVG wrapper.\r\n */\r\ninterface IconProps extends React.SVGProps<SVGSVGElement> {\r\n /** Width and height of the icon in pixels (default: 24) */\r\n size?: number | string;\r\n /** Stroke width for outlined icons (default: 2) */\r\n strokeWidth?: number;\r\n /** SVG viewBox attribute defining the coordinate system (default: \"0 0 24 24\") */\r\n viewBox?: \"0 0 24 24\" | \"0 0 48 48\" | \"0 0 512 512\";\r\n /** CSS class names for styling */\r\n className?: string;\r\n /** SVG elements (paths, circles, etc.) that define the icon shape */\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Base Icon component that provides a consistent SVG wrapper for creating custom icons.\r\n * Handles common SVG properties while allowing full customization through standard SVG props.\r\n *\r\n * @example\r\n * // Creating a reusable icon component\r\n * export const CustomIcon = ({ size, className, ...props }: IndividualIconProps) => {\r\n * return (\r\n * <Icon size={size} className={className} fill=\"currentColor\" {...props}>\r\n * <path d=\"M12 2L2 7v10c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-10-5z\" />\r\n * </Icon>\r\n * );\r\n * };\r\n *\r\n * @example\r\n * // Creating a custom icon\r\n * <Icon size={32} strokeWidth={1.5}>\r\n * <path d=\"M12 2L2 7v10c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-10-5z\" />\r\n * </Icon>\r\n *\r\n * @example\r\n * // Using with custom viewBox for different icon sets\r\n * <Icon viewBox=\"0 0 512 512\" size={48}>\r\n * <circle cx=\"256\" cy=\"256\" r=\"200\" />\r\n * </Icon>\r\n */\r\nexport const Icon: React.FC<IconProps> = ({\r\n children,\r\n size = 24,\r\n strokeWidth = 2,\r\n viewBox = \"0 0 24 24\",\r\n className,\r\n ...props\r\n}) => {\r\n return (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={size}\r\n height={size}\r\n viewBox={viewBox}\r\n className={className}\r\n {...props}\r\n >\r\n {children}\r\n </svg>\r\n );\r\n};\r\n\r\n// Define props for individual icons\r\nexport type IndividualIconProps = Omit<IconProps, \"children\">;\r\n\r\n// just here as example\r\n//ri:home-fill\r\n// export const HomeFill = ({\r\n// size,\r\n// className,\r\n// ...props\r\n// }: IndividualIconProps) => {\r\n// return (\r\n// <Icon size={size} className={className} fill=\"currentColor\" {...props}>\r\n// <path d=\"M21 20a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V9.49a1 1 0 0 1 .386-.79l8-6.223a1 1 0 0 1 1.228 0l8 6.223a1 1 0 0 1 .386.79z\" />\r\n// </Icon>\r\n// );\r\n// };\r\n","import { cn } from \"../utils\";\n\ntype SpinnerProps = {\n loading?: boolean;\n wrapperClassName?: string;\n spinnerClassName?: string;\n};\n\nconst Spinner: React.FC<SpinnerProps> = ({\n loading = true,\n wrapperClassName,\n spinnerClassName,\n}) => {\n return (\n <div className={cn(\"flex justify-center\", wrapperClassName)}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n className={cn({ \"animate-spin\": loading }, spinnerClassName)}\n >\n <path\n fill=\"currentColor\"\n d=\"M10 3a7 7 0 0 0-7 7a.5.5 0 0 1-1 0a8 8 0 1 1 8 8a.5.5 0 0 1 0-1a7 7 0 1 0 0-14Z\"\n />\n </svg>\n </div>\n );\n};\n\nexport { Spinner };\n","import { createPortal } from \"react-dom\";\n\ntype PortalProps = {\n children: React.ReactNode;\n node?: HTMLElement | null;\n};\n\nconst Portal = ({ children, node }: PortalProps) => {\n return createPortal(children, node ?? document.body);\n};\n\nexport { Portal };\n","/** A special constant with type `never` */\nexport const NEVER = Object.freeze({\n status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n function init(inst, def) {\n var _a;\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod ?? {},\n enumerable: false,\n });\n (_a = inst._zod).traits ?? (_a.traits = new Set());\n inst._zod.traits.add(name);\n initializer(inst, def);\n // support prototype modifications\n for (const k in _.prototype) {\n if (!(k in inst))\n Object.defineProperty(inst, k, { value: _.prototype[k].bind(inst) });\n }\n inst._zod.constr = _;\n inst._zod.def = def;\n }\n // doesn't work if Parent has a constructor with arguments\n const Parent = params?.Parent ?? Object;\n class Definition extends Parent {\n }\n Object.defineProperty(Definition, \"name\", { value: name });\n function _(def) {\n var _a;\n const inst = params?.Parent ? new Definition() : this;\n init(inst, def);\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n for (const fn of inst._zod.deferred) {\n fn();\n }\n return inst;\n }\n Object.defineProperty(_, \"init\", { value: init });\n Object.defineProperty(_, Symbol.hasInstance, {\n value: (inst) => {\n if (params?.Parent && inst instanceof params.Parent)\n return true;\n return inst?._zod?.traits?.has(name);\n },\n });\n Object.defineProperty(_, \"name\", { value: name });\n return _;\n}\n////////////////////////////// UTILITIES ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n constructor() {\n super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n }\n}\nexport const globalConfig = {};\nexport function config(newConfig) {\n if (newConfig)\n Object.assign(globalConfig, newConfig);\n return globalConfig;\n}\n","// functions\nexport function assertEqual(val) {\n return val;\n}\nexport function assertNotEqual(val) {\n return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n throw new Error();\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n const values = Object.entries(entries)\n .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n .map(([_, v]) => v);\n return values;\n}\nexport function joinValues(array, separator = \"|\") {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n if (typeof value === \"bigint\")\n return value.toString();\n return value;\n}\nexport function cached(getter) {\n const set = false;\n return {\n get value() {\n if (!set) {\n const value = getter();\n Object.defineProperty(this, \"value\", { value });\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n };\n}\nexport function nullish(input) {\n return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport function defineLazy(object, key, getter) {\n const set = false;\n Object.defineProperty(object, key, {\n get() {\n if (!set) {\n const value = getter();\n object[key] = value;\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n set(v) {\n Object.defineProperty(object, key, {\n value: v,\n // configurable: true,\n });\n // object[key] = v;\n },\n configurable: true,\n });\n}\nexport function assignProp(target, prop, value) {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n}\nexport function getElementAtPath(obj, path) {\n if (!path)\n return obj;\n return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n const keys = Object.keys(promisesObj);\n const promises = keys.map((key) => promisesObj[key]);\n return Promise.all(promises).then((results) => {\n const resolvedObj = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObj[keys[i]] = results[i];\n }\n return resolvedObj;\n });\n}\nexport function randomString(length = 10) {\n const chars = \"abcdefghijklmnopqrstuvwxyz\";\n let str = \"\";\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * chars.length)];\n }\n return str;\n}\nexport function esc(str) {\n return JSON.stringify(str);\n}\nexport const captureStackTrace = Error.captureStackTrace\n ? Error.captureStackTrace\n : (..._args) => { };\nexport function isObject(data) {\n return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = cached(() => {\n if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n return false;\n }\n try {\n const F = Function;\n new F(\"\");\n return true;\n }\n catch (_) {\n return false;\n }\n});\nexport function isPlainObject(o) {\n if (isObject(o) === false)\n return false;\n // modified constructor\n const ctor = o.constructor;\n if (ctor === undefined)\n return true;\n // modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false)\n return false;\n // ctor doesn't have static `isPrototypeOf`\n if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n return false;\n }\n return true;\n}\nexport function numKeys(data) {\n let keyCount = 0;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n }\n }\n return keyCount;\n}\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return \"undefined\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isNaN(data) ? \"nan\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"function\":\n return \"function\";\n case \"bigint\":\n return \"bigint\";\n case \"symbol\":\n return \"symbol\";\n case \"object\":\n if (Array.isArray(data)) {\n return \"array\";\n }\n if (data === null) {\n return \"null\";\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return \"promise\";\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return \"map\";\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return \"set\";\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return \"date\";\n }\n if (typeof File !== \"undefined\" && data instanceof File) {\n return \"file\";\n }\n return \"object\";\n default:\n throw new Error(`Unknown data type: ${t}`);\n }\n};\nexport const propertyKeyTypes = new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = new Set([\"string\", \"number\", \"bigint\", \"boolean\", \"symbol\", \"undefined\"]);\nexport function escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n const cl = new inst._zod.constr(def ?? inst._zod.def);\n if (!def || params?.parent)\n cl._zod.parent = inst;\n return cl;\n}\nexport function normalizeParams(_params) {\n const params = _params;\n if (!params)\n return {};\n if (typeof params === \"string\")\n return { error: () => params };\n if (params?.message !== undefined) {\n if (params?.error !== undefined)\n throw new Error(\"Cannot specify both `message` and `error` params\");\n params.error = params.message;\n }\n delete params.message;\n if (typeof params.error === \"string\")\n return { ...params, error: () => params.error };\n return params;\n}\nexport function createTransparentProxy(getter) {\n let target;\n return new Proxy({}, {\n get(_, prop, receiver) {\n target ?? (target = getter());\n return Reflect.get(target, prop, receiver);\n },\n set(_, prop, value, receiver) {\n target ?? (target = getter());\n return Reflect.set(target, prop, value, receiver);\n },\n has(_, prop) {\n target ?? (target = getter());\n return Reflect.has(target, prop);\n },\n deleteProperty(_, prop) {\n target ?? (target = getter());\n return Reflect.deleteProperty(target, prop);\n },\n ownKeys(_) {\n target ?? (target = getter());\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(_, prop) {\n target ?? (target = getter());\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n defineProperty(_, prop, descriptor) {\n target ?? (target = getter());\n return Reflect.defineProperty(target, prop, descriptor);\n },\n });\n}\nexport function stringifyPrimitive(value) {\n if (typeof value === \"bigint\")\n return value.toString() + \"n\";\n if (typeof value === \"string\")\n return `\"${value}\"`;\n return `${value}`;\n}\nexport function optionalKeys(shape) {\n return Object.keys(shape).filter((k) => {\n return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n });\n}\nexport const NUMBER_FORMAT_RANGES = {\n safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n int32: [-2147483648, 2147483647],\n uint32: [0, 4294967295],\n float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n const newShape = {};\n const currDef = schema._zod.def; //.shape;\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // pick key\n newShape[key] = currDef.shape[key];\n }\n return clone(schema, {\n ...schema._zod.def,\n shape: newShape,\n checks: [],\n });\n}\nexport function omit(schema, mask) {\n const newShape = { ...schema._zod.def.shape };\n const currDef = schema._zod.def; //.shape;\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n delete newShape[key];\n }\n return clone(schema, {\n ...schema._zod.def,\n shape: newShape,\n checks: [],\n });\n}\nexport function extend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to extend: expected a plain object\");\n }\n const def = {\n ...schema._zod.def,\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n checks: [], // delete existing checks\n };\n return clone(schema, def);\n}\nexport function merge(a, b) {\n return clone(a, {\n ...a._zod.def,\n get shape() {\n const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n catchall: b._zod.def.catchall,\n checks: [], // delete existing checks\n });\n}\nexport function partial(Class, schema, mask) {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in oldShape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n else {\n for (const key in oldShape) {\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n return clone(schema, {\n ...schema._zod.def,\n shape,\n checks: [],\n });\n}\nexport function required(Class, schema, mask) {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n else {\n for (const key in oldShape) {\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n return clone(schema, {\n ...schema._zod.def,\n shape,\n // optional: [],\n checks: [],\n });\n}\nexport function aborted(x, startIndex = 0) {\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue !== true)\n return true;\n }\n return false;\n}\nexport function prefixIssues(path, issues) {\n return issues.map((iss) => {\n var _a;\n (_a = iss).path ?? (_a.path = []);\n iss.path.unshift(path);\n return iss;\n });\n}\nexport function unwrapMessage(message) {\n return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n const full = { ...iss, path: iss.path ?? [] };\n // for backwards compatibility\n if (!iss.message) {\n const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n unwrapMessage(ctx?.error?.(iss)) ??\n unwrapMessage(config.customError?.(iss)) ??\n unwrapMessage(config.localeError?.(iss)) ??\n \"Invalid input\";\n full.message = message;\n }\n // delete (full as any).def;\n delete full.inst;\n delete full.continue;\n if (!ctx?.reportInput) {\n delete full.input;\n }\n return full;\n}\nexport function getSizableOrigin(input) {\n if (input instanceof Set)\n return \"set\";\n if (input instanceof Map)\n return \"map\";\n if (input instanceof File)\n return \"file\";\n return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n if (Array.isArray(input))\n return \"array\";\n if (typeof input === \"string\")\n return \"string\";\n return \"unknown\";\n}\nexport function issue(...args) {\n const [iss, input, inst] = args;\n if (typeof iss === \"string\") {\n return {\n message: iss,\n code: \"custom\",\n input,\n inst,\n };\n }\n return { ...iss };\n}\nexport function cleanEnum(obj) {\n return Object.entries(obj)\n .filter(([k, _]) => {\n // return true if NaN, meaning it's not a number, thus a string key\n return Number.isNaN(Number.parseInt(k, 10));\n })\n .map((el) => el[1]);\n}\n// instanceof\nexport class Class {\n constructor(..._args) { }\n}\n","import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n inst.name = \"$ZodError\";\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod,\n enumerable: false,\n });\n Object.defineProperty(inst, \"issues\", {\n value: def,\n enumerable: false,\n });\n Object.defineProperty(inst, \"message\", {\n get() {\n return JSON.stringify(def, util.jsonStringifyReplacer, 2);\n },\n enumerable: true,\n // configurable: false,\n });\n Object.defineProperty(inst, \"toString\", {\n value: () => inst.message,\n enumerable: false,\n });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of error.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n}\nexport function formatError(error, _mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n issue.errors.map((issues) => processError({ issues }));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues });\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues });\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(error);\n return fieldErrors;\n}\nexport function treeifyError(error, _mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const result = { errors: [] };\n const processError = (error, path = []) => {\n var _a, _b;\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n // regular union error\n issue.errors.map((issues) => processError({ issues }, issue.path));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n result.errors.push(mapper(issue));\n continue;\n }\n let curr = result;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (typeof el === \"string\") {\n curr.properties ?? (curr.properties = {});\n (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n curr = curr.properties[el];\n }\n else {\n curr.items ?? (curr.items = []);\n (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n curr = curr.items[el];\n }\n if (terminal) {\n curr.errors.push(mapper(issue));\n }\n i++;\n }\n }\n }\n };\n processError(error);\n return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n * issues: [\n * {\n * expected: 'string',\n * code: 'invalid_type',\n * path: [ 'username' ],\n * message: 'Invalid input: expected string'\n * },\n * {\n * expected: 'number',\n * code: 'invalid_type',\n * path: [ 'favoriteNumbers', 1 ],\n * message: 'Invalid input: expected number'\n * }\n * ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n * ✖ Expected number, received string at \"username\n * favoriteNumbers[0]\n * ✖ Invalid input: expected number\n * ```\n */\nexport function toDotPath(path) {\n const segs = [];\n for (const seg of path) {\n if (typeof seg === \"number\")\n segs.push(`[${seg}]`);\n else if (typeof seg === \"symbol\")\n segs.push(`[${JSON.stringify(String(seg))}]`);\n else if (/[^\\w$]/.test(seg))\n segs.push(`[${JSON.stringify(seg)}]`);\n else {\n if (segs.length)\n segs.push(\".\");\n segs.push(seg);\n }\n }\n return segs.join(\"\");\n}\nexport function prettifyError(error) {\n const lines = [];\n // sort by path length\n const issues = [...error.issues].sort((a, b) => a.path.length - b.path.length);\n // Process each issue\n for (const issue of issues) {\n lines.push(`✖ ${issue.message}`);\n if (issue.path?.length)\n lines.push(` → at ${toDotPath(issue.path)}`);\n }\n // Convert Map to formatted string\n return lines.join(\"\\n\");\n}\n","import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n if (result.issues.length) {\n const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, _params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n if (result.issues.length) {\n const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n return result.issues.length\n ? {\n success: false,\n error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n return result.issues.length\n ? {\n success: false,\n error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\n","import{validateFieldsNatively as r,toNestErrors as e}from\"@hookform/resolvers\";import{appendErrors as o}from\"react-hook-form\";import*as n from\"zod/v4/core\";function t(r,e){try{var o=r()}catch(r){return e(r)}return o&&o.then?o.then(void 0,e):o}function s(r,e){for(var n={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(\".\");if(!n[a])if(\"unionErrors\"in t){var u=t.unionErrors[0].errors[0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:s};if(\"unionErrors\"in t&&t.unionErrors.forEach(function(e){return e.errors.forEach(function(e){return r.push(e)})}),e){var c=n[a].types,f=c&&c[t.code];n[a]=o(a,e,n,s,f?[].concat(f,t.message):t.message)}r.shift()}return n}function i(r,e){for(var n={};r.length;){var t=r[0],s=t.code,i=t.message,a=t.path.join(\".\");if(!n[a])if(\"invalid_union\"===t.code&&t.errors.length>0){var u=t.errors[0][0];n[a]={message:u.message,type:u.code}}else n[a]={message:i,type:s};if(\"invalid_union\"===t.code&&t.errors.forEach(function(e){return e.forEach(function(e){return r.push(e)})}),e){var c=n[a].types,f=c&&c[t.code];n[a]=o(a,e,n,s,f?[].concat(f,t.message):t.message)}r.shift()}return n}function a(o,a,u){if(void 0===u&&(u={}),function(r){return\"_def\"in r&&\"object\"==typeof r._def&&\"typeName\"in r._def}(o))return function(n,i,c){try{return Promise.resolve(t(function(){return Promise.resolve(o[\"sync\"===u.mode?\"parse\":\"parseAsync\"](n,a)).then(function(e){return c.shouldUseNativeValidation&&r({},c),{errors:{},values:u.raw?Object.assign({},n):e}})},function(r){if(function(r){return Array.isArray(null==r?void 0:r.issues)}(r))return{values:{},errors:e(s(r.errors,!c.shouldUseNativeValidation&&\"all\"===c.criteriaMode),c)};throw r}))}catch(r){return Promise.reject(r)}};if(function(r){return\"_zod\"in r&&\"object\"==typeof r._zod}(o))return function(s,c,f){try{return Promise.resolve(t(function(){return Promise.resolve((\"sync\"===u.mode?n.parse:n.parseAsync)(o,s,a)).then(function(e){return f.shouldUseNativeValidation&&r({},f),{errors:{},values:u.raw?Object.assign({},s):e}})},function(r){if(function(r){return r instanceof n.$ZodError}(r))return{values:{},errors:e(i(r.issues,!f.shouldUseNativeValidation&&\"all\"===f.criteriaMode),f)};throw r}))}catch(r){return Promise.reject(r)}};throw new Error(\"Invalid input: not a Zod schema\")}export{a as zodResolver};\n//# sourceMappingURL=zod.module.js.map\n","import React from \"react\";\r\nimport {\r\n FieldValues,\r\n FormProvider,\r\n useForm,\r\n UseFormReturn,\r\n type SubmitHandler as RHFSubmitHandler,\r\n type FieldErrors,\r\n} from \"react-hook-form\";\r\nimport { cn } from \"../utils\";\r\nimport { z, ZodTypeAny } from \"zod\";\r\nimport { zodResolver } from \"@hookform/resolvers/zod\";\r\n\r\n// Custom type helper\r\n//OLD V\r\ntype SubmitHandler<T extends FieldValues> = (\r\n data: T,\r\n form: UseFormReturn<T>\r\n // dirtyFields: Partial<Readonly<DeepMap<DeepPartial<z.TypeOf<T>>, boolean>>>\r\n) => Promise<void> | void;\r\n\r\ntype FormWrapperProps<T extends FieldValues> = {\r\n methods: UseFormReturn<T>;\r\n onSubmit: SubmitHandler<T>;\r\n onError?: (errors: FieldErrors<T>) => void;\r\n children: React.ReactNode;\r\n logErrors?: boolean;\r\n className?: string;\r\n};\r\n\r\n// Helper type to make all properties optional recursively\r\n// type DeepPartial<T> = T extends object\r\n// ? { [P in keyof T]?: DeepPartial<T[P]> }\r\n// : T;\r\n\r\nfunction Form<T extends FieldValues>({\r\n methods,\r\n onSubmit,\r\n onError,\r\n children,\r\n logErrors,\r\n className,\r\n}: FormWrapperProps<T>) {\r\n return (\r\n <FormProvider {...methods}>\r\n <form\r\n className={cn(\r\n \"mt-4 lg:mt-8 grid grid-cols-1 lg:grid-cols-2 gap-4 lg:gap-8 relative\",\r\n className\r\n )}\r\n onSubmit={methods.handleSubmit(\r\n (data) => onSubmit(data, methods),\r\n (errors) => {\r\n if (logErrors) {\r\n console.log(errors);\r\n }\r\n onError?.(errors);\r\n }\r\n )}\r\n >\r\n {children}\r\n </form>\r\n </FormProvider>\r\n );\r\n}\r\n\r\n/**\r\n * Hook to create react-hook-form methods based on a zod schema and default values.\r\n *\r\n * @param schema Zod schema to validate form data\r\n * @param defaultValues Optional default form values (partial)\r\n * @returns UseFormReturn with typed form methods\r\n */\r\nfunction useMethods<TSchema extends ZodTypeAny>(\r\n schema: TSchema,\r\n defaultValues?: Partial<z.infer<TSchema>>\r\n): UseFormReturn<z.infer<TSchema>> {\r\n return useForm<z.infer<TSchema>>({\r\n resolver: zodResolver(schema),\r\n defaultValues: defaultValues as any,\r\n });\r\n}\r\nexport { Form, useMethods };\r\nexport type { SubmitHandler, RHFSubmitHandler };\r\n","import React, { forwardRef } from \"react\";\r\nimport { Check, Minus } from \"lucide-react\";\r\nimport { cn } from \"../utils\";\r\n\r\ninterface CheckboxProps {\r\n checked?: boolean | \"indeterminate\";\r\n onCheckedChange?: (checked: boolean | \"indeterminate\") => void;\r\n disabled?: boolean;\r\n required?: boolean;\r\n name?: string;\r\n value?: string;\r\n id?: string;\r\n className?: string | ((checked: boolean | \"indeterminate\") => string);\r\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nconst colorClasses = {\r\n unchecked: \"bg-base-3 lg:hover:bg-base-4\",\r\n checked: \"bg-brand lg:hover:bg-brand-hover text-brand-text\",\r\n uncheckedDisabled: \"bg-base-3 border-base-4\",\r\n checkedDisabled: \"bg-base-3 border-base-4 text-base-10\",\r\n};\r\n\r\nconst Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\r\n (\r\n {\r\n checked = false,\r\n onCheckedChange,\r\n disabled = false,\r\n required = false,\r\n name,\r\n value,\r\n id,\r\n className = \"\",\r\n size = \"sm\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const handleClick = () => {\r\n if (disabled) return;\r\n\r\n if (checked === \"indeterminate\") {\r\n onCheckedChange?.(true);\r\n } else {\r\n onCheckedChange?.(!checked);\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === \" \" || e.key === \"Enter\") {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n };\r\n\r\n const sizeClasses = {\r\n xs: \"h-3.5 w-3.5\",\r\n sm: \"h-4 w-4\",\r\n md: \"h-5 w-5\",\r\n lg: \"h-6 w-6\",\r\n };\r\n\r\n const iconSizes = {\r\n xs: 24,\r\n sm: 12,\r\n md: 14,\r\n lg: 16,\r\n };\r\n\r\n return (\r\n <>\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"checkbox\"\r\n aria-checked={checked === \"indeterminate\" ? \"mixed\" : checked}\r\n aria-required={required}\r\n disabled={disabled}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n className={cn(\r\n // Base styles\r\n \"inline-flex items-center justify-center rounded-2 border border-base-4 transition-all duration-200 ease-in-out\",\r\n \"focus:outline-none focus:ring-2 focus:ring-base-5\",\r\n // Size\r\n sizeClasses[size],\r\n // Disabled state\r\n disabled && \"cursor-not-allowed opacity-75\",\r\n !disabled && \"cursor-pointer\",\r\n // Checked states\r\n checked\r\n ? disabled\r\n ? colorClasses.checkedDisabled\r\n : colorClasses.checked\r\n : disabled\r\n ? colorClasses.uncheckedDisabled\r\n : colorClasses.unchecked,\r\n // Custom classes\r\n typeof className === \"function\" ? className(checked) : className\r\n )}\r\n {...props}\r\n >\r\n {checked === true && (\r\n <Check\r\n size={iconSizes[size]}\r\n className=\"stroke-current\"\r\n // strokeWidth={2.5}\r\n />\r\n )}\r\n {checked === \"indeterminate\" && (\r\n <Minus\r\n size={iconSizes[size]}\r\n className=\"stroke-current\"\r\n // strokeWidth={2.5}\r\n />\r\n )}\r\n </button>\r\n\r\n {/* Hidden input for form submission */}\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n value={value}\r\n checked={checked === true}\r\n onChange={() => {}} // Controlled by button\r\n disabled={disabled}\r\n required={required}\r\n id={id}\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </>\r\n );\r\n }\r\n);\r\n\r\nCheckbox.displayName = \"Checkbox\";\r\n\r\nexport { Checkbox };\r\n","import { CheckIcon, DollarSign, Eye, EyeOffIcon } from \"lucide-react\";\r\nimport {\r\n InputHTMLAttributes,\r\n forwardRef,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { nullRead, nullSet, setFocusEnd } from \"../utils\";\r\nimport { Controller, useFormContext } from \"react-hook-form\";\r\n\r\n// Types\r\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\r\n label?: string;\r\n description?: string;\r\n labelPosition?: \"default\" | \"floating\";\r\n color?: \"solid\" | \"outline\";\r\n focusColor?: \"solid\" | \"brand\";\r\n valid?: boolean;\r\n error?: boolean;\r\n errorMessage?: string;\r\n isPrice?: boolean;\r\n prefix?: string;\r\n wrapperClassName?: string;\r\n containerClassName?: string;\r\n}\r\n\r\nconst inputColors = {\r\n solid:\r\n \"bg-base-3 border border-base-4 drop-shadow-sm dark-theme:drop-shadow-none\",\r\n outline: \"border border-base-6\",\r\n};\r\n\r\nconst focusColors = {\r\n brand: \"ring-1 ring-brand\",\r\n solid: \"ring-1 ring-base-6\",\r\n};\r\n\r\n// similar to button size mdsm (text-sm px-3 py-2.5)\r\n// (this is similar to h-10 if need to make some shape)\r\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n label,\r\n description,\r\n labelPosition = \"default\",\r\n color = \"solid\",\r\n focusColor = \"brand\",\r\n placeholder,\r\n valid,\r\n error,\r\n errorMessage,\r\n isPrice,\r\n prefix,\r\n wrapperClassName,\r\n containerClassName,\r\n className,\r\n type = \"text\",\r\n value,\r\n ...props\r\n },\r\n forwardedRef\r\n ) => {\r\n const innerRef = useRef<HTMLInputElement>(null);\r\n const mounted = useRef(false);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isFocused, setIsFocused] = useState(false);\r\n const isPassword = type === \"password\";\r\n const inputType =\r\n isPassword && showPassword ? \"text\" : isPrice ? \"number\" : type;\r\n const hasValue = value !== \"\" && value !== null && value !== undefined;\r\n\r\n // Use the forwarded ref if available, otherwise use innerRef\r\n // const ref = forwardedRef || innerRef;\r\n // // const ref = forwardedRef;\r\n\r\n useEffect(() => {\r\n if (!mounted.current) {\r\n mounted.current = true;\r\n return;\r\n }\r\n\r\n if (innerRef.current) {\r\n setFocusEnd(innerRef.current);\r\n }\r\n }, [showPassword, innerRef]);\r\n\r\n return (\r\n <div className={cn(\"relative\", wrapperClassName)}>\r\n {label && labelPosition === \"default\" && (\r\n <label\r\n className={cn(\"font-medium ml-0.5 text-xs\", error && \"text-red-9\")}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n <div\r\n className={cn(\r\n \"rounded-6 transition cursor-text relative\",\r\n inputColors[color],\r\n {\r\n \"pt-[22px] pb-1.5\": labelPosition === \"floating\",\r\n [focusColors[focusColor]]: !error && isFocused,\r\n \"bg-red-4 text-red-9\": !!error,\r\n \"ring-1 ring-red-9\": !!error && isFocused,\r\n },\r\n containerClassName\r\n )}\r\n >\r\n {label && labelPosition === \"floating\" && (\r\n <label\r\n className={cn(\r\n \"absolute transition-all duration-200 pointer-events-none\",\r\n \"text-sm top-[18px] font-semibold left-3\",\r\n {\r\n \"text-xs top-2.5\": isFocused || hasValue || placeholder,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n {isPrice && (\r\n <DollarSign\r\n size={16}\r\n className={cn(\r\n \"absolute top-1/2 -translate-y-1/2 left-3\",\r\n error ? \"text-red-9\" : \"text-base-11\"\r\n )}\r\n />\r\n )}\r\n {prefix && (\r\n <p className=\"text-sm text-base-11 absolute top-1/2 -translate-y-1/2 left-3\">\r\n {prefix}\r\n </p>\r\n )}\r\n <input\r\n ref={(e) => {\r\n if (forwardedRef) {\r\n if (typeof forwardedRef === \"function\") {\r\n forwardedRef(e);\r\n } else {\r\n forwardedRef.current = e;\r\n }\r\n }\r\n //@ts-ignore\r\n innerRef.current = e;\r\n }}\r\n type={inputType}\r\n className={cn(\r\n \"w-full bg-transparent focus:outline-none\",\r\n \"placeholder:text-sm text-sm placeholder:text-base-11\",\r\n isPrice || prefix ? \"pl-9\" : \"pl-3\",\r\n {\r\n \"py-2.5\": labelPosition === \"default\",\r\n \"mt-1.5\": labelPosition === \"floating\",\r\n \"pr-10\": valid,\r\n \"text-red-9 placeholder:text-red-9\": !!error,\r\n },\r\n className\r\n )}\r\n value={value}\r\n placeholder={placeholder}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n {...props}\r\n />\r\n </div>\r\n\r\n {valid ? (\r\n <CheckIcon\r\n size={20}\r\n className={`absolute top-1/2 -translate-y-1/2 text-green-500 ${\r\n isPassword ? \"right-10\" : \"right-3\"\r\n }`}\r\n />\r\n ) : null}\r\n\r\n {isPassword && (\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n labelPosition === \"floating\"\r\n ? \"absolute right-3 top-1/2 -translate-y-1/2\"\r\n : \"absolute right-3 top-10\"\r\n )}\r\n onClick={() => {\r\n setShowPassword(!showPassword);\r\n }}\r\n >\r\n {showPassword ? (\r\n <EyeOffIcon\r\n size={20}\r\n className={cn(error ? \"text-red-9\" : \"text-base-11\")}\r\n />\r\n ) : (\r\n <Eye\r\n size={20}\r\n className={cn(error ? \"text-red-9\" : \"text-base-11\")}\r\n />\r\n )}\r\n </button>\r\n )}\r\n {errorMessage ? (\r\n <span role=\"alert\" className=\"text-red-9 text-sm mt-1 ml-0.5\">\r\n {errorMessage}\r\n </span>\r\n ) : description ? (\r\n <p className=\"text-xs text-base-11 mt-1 ml-0.5\">{description}</p>\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\n// Add display name for better debugging\r\nInput.displayName = \"Input\";\r\n\r\nexport const FormInput = ({\r\n name,\r\n customRead,\r\n customSet,\r\n withNullSet = true,\r\n ...others\r\n}: {\r\n name: string;\r\n customRead?: (value: string | null) => string;\r\n customSet?: (value: string) => string | number | null | undefined;\r\n withNullSet?: boolean;\r\n} & InputProps) => {\r\n const { control } = useFormContext();\r\n\r\n const readValue = useCallback(\r\n (value: string | null) => {\r\n if (customRead) {\r\n return customRead(value);\r\n } else if (value === null) {\r\n return nullRead(value);\r\n }\r\n return value;\r\n },\r\n [customRead]\r\n );\r\n\r\n const setValue = useCallback(\r\n (value: string) => {\r\n if (customSet) {\r\n if (withNullSet && value === null) {\r\n return nullSet(value);\r\n } else {\r\n return customSet(value);\r\n }\r\n } else if (value === null) {\r\n return nullSet(value);\r\n }\r\n return value;\r\n },\r\n [customSet]\r\n );\r\n\r\n if (!control) {\r\n console.error(`Form control is missing for field: ${name}`);\r\n return <p>Form control missing for field: {name}</p>;\r\n }\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field, fieldState }) => {\r\n return (\r\n <Input\r\n value={readValue(field.value)}\r\n onChange={(e) => field.onChange(setValue(e.target.value))}\r\n error={!!fieldState.error}\r\n errorMessage={fieldState.error?.message}\r\n // Pass the ref from React Hook Form\r\n ref={field.ref}\r\n {...others}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import {\r\n TextareaHTMLAttributes,\r\n forwardRef,\r\n useCallback,\r\n useState,\r\n} from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { nullRead, nullSet } from \"../utils\";\r\nimport { Controller, useFormContext } from \"react-hook-form\";\r\n\r\n// Types\r\ninterface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n label: string;\r\n labelPosition?: \"default\" | \"floating\";\r\n error?: boolean;\r\n focusColor?: \"solid\" | \"brand\";\r\n}\r\n\r\nconst focusColors = {\r\n brand: \"ring-1 ring-brand\",\r\n solid: \"ring-1 ring-base-6\",\r\n};\r\n\r\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\r\n (\r\n {\r\n label,\r\n labelPosition = \"default\",\r\n placeholder,\r\n error,\r\n focusColor = \"brand\",\r\n className,\r\n value,\r\n rows = 3,\r\n ...props\r\n },\r\n forwardedRef\r\n ) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n const hasValue = value !== \"\" && value !== null && value !== undefined;\r\n\r\n return (\r\n <div className=\"relative\">\r\n {labelPosition === \"default\" ? (\r\n <label\r\n className={cn(\r\n \"top-[18px] font-medium ml-0.5 text-xs\",\r\n error && \"text-red-9\"\r\n )}\r\n >\r\n {label}\r\n </label>\r\n ) : null}\r\n <div\r\n className={cn(labelPosition === \"default\" ? \"p-0\" : \"pt-5 pb-2\", {\r\n \"bg-red-4 text-red-9\": !!error,\r\n })}\r\n >\r\n {labelPosition === \"floating\" && (\r\n <label\r\n className={cn(\r\n \"absolute transition-all duration-200 pointer-events-none\",\r\n \"text-sm top-2.5 font-semibold left-2.5\",\r\n {\r\n \"text-xs top-2.5\": isFocused || hasValue || placeholder,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n <textarea\r\n ref={forwardedRef}\r\n className={cn(\r\n !error && isFocused && focusColors[focusColor],\r\n \"bg-base-3 border border-base-4 light-theme:drop-shadow-sm rounded-6 w-full focus:outline-none customscrollbarnohide\",\r\n \"placeholder:text-base-11 text-sm\",\r\n \"resize-none\", // Prevent manual resizing since we're auto-resizing\r\n labelPosition === \"default\" ? \"p-3\" : \"mt-1\",\r\n {\r\n // \"pr-10\": valid,\r\n \"text-red-9 placeholder:text-red-9\": !!error,\r\n },\r\n className\r\n )}\r\n value={value}\r\n placeholder={placeholder}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n rows={rows}\r\n {...props}\r\n />\r\n </div>\r\n\r\n {/* {valid && (\r\n <CheckIcon\r\n size={16}\r\n className=\"absolute top-6 right-3 text-green-9\"\r\n />\r\n )} */}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\n// Add display name for better debugging\r\nTextArea.displayName = \"TextArea\";\r\n\r\nexport const FormTextArea = ({\r\n name,\r\n customRead,\r\n customSet,\r\n ...others\r\n}: {\r\n name: string;\r\n customRead?: (value: string | null) => string;\r\n customSet?: (value: string) => string | null | undefined;\r\n} & TextAreaProps) => {\r\n const { control } = useFormContext();\r\n\r\n const readValue = useCallback(\r\n (value: string | null) => {\r\n if (customRead) {\r\n return customRead(value);\r\n } else if (value === null) {\r\n return nullRead(value);\r\n }\r\n return value;\r\n },\r\n [customRead]\r\n );\r\n\r\n const setValue = useCallback(\r\n (value: string) => {\r\n if (customSet) {\r\n return customSet(value);\r\n } else if (value === null) {\r\n return nullSet(value);\r\n }\r\n return value;\r\n },\r\n [customSet]\r\n );\r\n\r\n if (!control) {\r\n console.error(`Form control is missing for field: ${name}`);\r\n return <p>Form control missing for field: {name}</p>;\r\n }\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field, fieldState }) => {\r\n return (\r\n <div>\r\n <TextArea\r\n value={readValue(field.value)}\r\n onChange={(e) => field.onChange(setValue(e.target.value))}\r\n error={!!fieldState.error}\r\n // Pass the ref from React Hook Form\r\n ref={field.ref}\r\n {...others}\r\n />\r\n {fieldState.error ? (\r\n <span role=\"alert\" className=\"text-red-9 text-sm mt-1 ml-0.5\">\r\n {fieldState.error.message}\r\n </span>\r\n ) : null}\r\n </div>\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { CheckIcon } from \"lucide-react\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { Controller, useFormContext } from \"react-hook-form\";\r\n\r\ninterface TagsProps {\r\n label: string;\r\n variant?: \"default\" | \"floating\";\r\n color?: \"solid\" | \"translucent\" | \"outline\";\r\n tags: string[];\r\n onChange: (tags: string[]) => void;\r\n valid?: boolean;\r\n error?: string;\r\n placeholder?: string;\r\n maxTags?: number;\r\n validateTag?: (tag: string) => boolean | string;\r\n}\r\n\r\n// Custom Tag Input Component with accessibility\r\nexport const Tags = ({\r\n label,\r\n variant = \"default\",\r\n color = \"solid\",\r\n tags,\r\n onChange,\r\n valid,\r\n error,\r\n placeholder = \"Add a tag...\",\r\n maxTags,\r\n validateTag,\r\n}: TagsProps) => {\r\n const [inputValue, setInputValue] = useState(\"\");\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [localError, setLocalError] = useState<string | null>(null);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const tagRefs = useRef<(HTMLDivElement | null)[]>([]);\r\n const hasValue = tags.length > 0;\r\n\r\n // Unique IDs for ARIA attributes\r\n const inputId = useRef(\r\n `taginput-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const labelId = useRef(\r\n `label-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const errorId = useRef(\r\n `error-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n\r\n // Set up tag refs\r\n useEffect(() => {\r\n tagRefs.current = tagRefs.current.slice(0, tags.length);\r\n }, [tags.length]);\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\" && inputValue.trim()) {\r\n e.preventDefault(); // Prevent form submission\r\n\r\n const newTag = inputValue.trim();\r\n\r\n // Check if we've reached the maximum number of tags\r\n if (maxTags && tags.length >= maxTags) {\r\n setLocalError(`Maximum of ${maxTags} tags allowed`);\r\n return;\r\n }\r\n\r\n // Check for duplicates\r\n if (tags.includes(newTag)) {\r\n setLocalError(\"Tag already exists\");\r\n return;\r\n }\r\n\r\n // Custom validation if provided\r\n if (validateTag) {\r\n const validationResult = validateTag(newTag);\r\n if (typeof validationResult === \"string\") {\r\n setLocalError(validationResult);\r\n return;\r\n } else if (validationResult === false) {\r\n setLocalError(\"Invalid tag\");\r\n return;\r\n }\r\n }\r\n\r\n // Add the tag\r\n onChange([...tags, newTag]);\r\n setInputValue(\"\");\r\n setLocalError(null);\r\n\r\n // Announce tag added for screen readers\r\n announceChange(`Added tag ${newTag}`);\r\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\r\n // Remove the last tag when backspace is pressed and input is empty\r\n const removedTag = tags[tags.length - 1];\r\n onChange(tags.slice(0, -1));\r\n\r\n // Announce tag removed for screen readers\r\n announceChange(`Removed tag ${removedTag}`);\r\n } else if (e.key === \"ArrowLeft\" && inputValue === \"\" && tags.length > 0) {\r\n // Allow navigating to tags with arrow keys when input is empty\r\n if (tagRefs.current[tags.length - 1]) {\r\n tagRefs.current[tags.length - 1]?.focus();\r\n }\r\n }\r\n };\r\n\r\n // Handle keyboard navigation among tags\r\n const handleTagKeyDown = (e: React.KeyboardEvent, tagIndex: number) => {\r\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\r\n e.preventDefault();\r\n const removedTag = tags[tagIndex];\r\n const newTags = [...tags];\r\n newTags.splice(tagIndex, 1);\r\n onChange(newTags);\r\n\r\n // Focus the input after removing\r\n setTimeout(() => {\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, 0);\r\n\r\n announceChange(`Removed tag ${removedTag}`);\r\n } else if (e.key === \"ArrowRight\") {\r\n e.preventDefault();\r\n if (tagIndex < tags.length - 1) {\r\n // Move focus to next tag\r\n tagRefs.current[tagIndex + 1]?.focus();\r\n } else {\r\n // Move to input if at last tag\r\n inputRef.current?.focus();\r\n }\r\n } else if (e.key === \"ArrowLeft\") {\r\n e.preventDefault();\r\n if (tagIndex > 0) {\r\n // Move focus to previous tag\r\n tagRefs.current[tagIndex - 1]?.focus();\r\n }\r\n }\r\n };\r\n\r\n const handleRemoveTag = (tagToRemove: string, tagIndex: number) => {\r\n onChange(tags.filter((tag) => tag !== tagToRemove));\r\n\r\n // Focus appropriately after removing\r\n setTimeout(() => {\r\n if (tagIndex < tags.length - 1) {\r\n // If there are tags after, focus the next tag\r\n tagRefs.current[tagIndex]?.focus();\r\n } else if (tagIndex > 0) {\r\n // Otherwise focus the previous tag\r\n tagRefs.current[tagIndex - 1]?.focus();\r\n } else {\r\n // Otherwise focus the input\r\n inputRef.current?.focus();\r\n }\r\n }, 0);\r\n\r\n announceChange(`Removed tag ${tagToRemove}`);\r\n };\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setInputValue(e.target.value);\r\n setLocalError(null);\r\n };\r\n\r\n const handleContainerClick = () => {\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n };\r\n\r\n // todo\r\n // accessibility announcement\r\n const announceChange = (message: string) => {\r\n // This would ideally use a live region, but for simplicity we'll just use console\r\n // In future, we'd have a visually hidden div with aria-live=\"polite\"\r\n console.log(`Accessibility announcement: ${message}`);\r\n };\r\n\r\n return (\r\n <div>\r\n <div className=\"relative\" ref={containerRef}>\r\n {variant === \"default\" ? (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n className={cn(\"text-base top-4 font-semibold left-3\", {\r\n \"text-sm top-2 left-2\": isFocused || hasValue || placeholder,\r\n \"text-red-9\": !!error,\r\n })}\r\n >\r\n {label} {maxTags && `(${tags.length}/${maxTags})`}\r\n </label>\r\n ) : null}\r\n <div\r\n className={cn(\"rounded-6 px-2 transition cursor-text pr-10\", {\r\n \"bg-base-3\": color === \"solid\",\r\n \"border border-uielborder focus:border-transparent\":\r\n color === \"outline\",\r\n \"py-3\": variant === \"default\",\r\n \"pt-5 pb-2\": variant === \"floating\",\r\n \"ring-2 ring-branduielborder\": isFocused,\r\n \"text-red-9\": error || localError,\r\n \"ring-2 ring-red-6\": (error || localError) && isFocused,\r\n })}\r\n // ${\r\n // error || localError ? \"border border-red-500\" : \"\"\r\n // }`}\r\n onClick={handleContainerClick}\r\n role=\"group\"\r\n aria-labelledby={labelId}\r\n aria-describedby={error || localError ? errorId : undefined}\r\n >\r\n {variant === \"floating\" ? (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n className={cn(\r\n \"absolute transition-all duration-200 pointer-events-none\",\r\n \"text-base top-4 font-semibold left-3\",\r\n {\r\n \"text-sm top-2 left-2\": isFocused || hasValue || placeholder,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label} {maxTags && `(${tags.length}/${maxTags})`}\r\n </label>\r\n ) : null}\r\n\r\n <div\r\n className={cn(\"flex flex-wrap gap-1 items-center\", {\r\n \"mt-2.5\": variant === \"floating\",\r\n })}\r\n >\r\n {tags.map((tag, index) => (\r\n <div\r\n key={`${tag}-${index}`}\r\n ref={(el) => {\r\n tagRefs.current[index] = el;\r\n }}\r\n className={cn(\r\n \"line-clamp-1 text-brand rounded-full px-2 text-sm flex items-center\",\r\n {\r\n \"bg-brandfadedbg text-brand\": !error && !localError,\r\n \"bg-red-4 text-red-9\": error || localError,\r\n }\r\n )}\r\n tabIndex={0} // Make tags focusable\r\n role=\"button\"\r\n aria-label={`${tag}, press delete or backspace to remove`}\r\n onKeyDown={(e) => handleTagKeyDown(e, index)}\r\n >\r\n {tag}\r\n <button\r\n type=\"button\"\r\n className=\"ml-1 text-brand hover:text-brandhover shrink-0\"\r\n onClick={() => handleRemoveTag(tag, index)}\r\n aria-label={`Remove ${tag} tag`}\r\n >\r\n x\r\n </button>\r\n </div>\r\n ))}\r\n <input\r\n id={inputId}\r\n ref={inputRef}\r\n type=\"text\"\r\n className=\"flex-grow min-w-[60px] bg-transparent outline-none placeholder:text-sm placeholder:text-secondarytext\"\r\n value={inputValue}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n enterKeyHint=\"enter\"\r\n autoComplete=\"off\"\r\n placeholder={tags.length > 0 ? \"\" : placeholder}\r\n style={{ width: `${Math.max(60, inputValue.length * 8)}px` }}\r\n aria-describedby={error || localError ? errorId : undefined}\r\n aria-invalid={!!(error || localError)}\r\n />\r\n </div>\r\n </div>\r\n\r\n {valid && (\r\n <span className=\"absolute right-3 top-1/2 transform -translate-y-1/2\">\r\n <CheckIcon />\r\n </span>\r\n )}\r\n </div>\r\n\r\n {(error || localError) && (\r\n <p\r\n id={errorId}\r\n className=\"text-red-500 text-xs mt-1\"\r\n aria-live=\"assertive\"\r\n >\r\n {error || localError}\r\n </p>\r\n )}\r\n\r\n {/* {maxTags && !error && !localError && (\r\n <p className=\"text-secondarytext text-xs ml-0.5 mt-1\">\r\n {tags.length} / {maxTags} tags\r\n </p>\r\n )} */}\r\n\r\n {/* Visually hidden live region for announcements */}\r\n <div className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {tags.length > 0\r\n ? `Current tags: ${tags.join(\", \")}`\r\n : \"No tags added yet\"}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ntype FormTagsProps = Omit<TagsProps, \"tags\" | \"onChange\"> & {\r\n name: string;\r\n};\r\n\r\nexport const FormTags = ({ name, ...others }: FormTagsProps) => {\r\n const { control } = useFormContext();\r\n\r\n if (!control) {\r\n console.error(`Form control is missing for field: ${name}`);\r\n return <p>Form control missing for field: {name}</p>;\r\n }\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field, fieldState }) => {\r\n return (\r\n <Tags\r\n tags={field.value}\r\n onChange={(tags) => field.onChange(tags)}\r\n error={fieldState.error?.message}\r\n {...others}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { CheckIcon, ChevronDownIcon, XIcon } from \"lucide-react\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport { cn } from \"../utils\";\r\nimport { Controller, useFormContext } from \"react-hook-form\";\r\nimport { useClickAwayWithRef, usePopover } from \"../hooks\";\r\nimport { AnimatePresence, motion } from \"motion/react\";\r\nimport { Portal } from \"../components\";\r\n\r\ninterface MultiSelectProps<T> {\r\n label: string;\r\n labelPosition?: \"default\" | \"floating\";\r\n options: T[];\r\n selectedValues: T[];\r\n onChange: (values: T[]) => void;\r\n idExtractor: (item: T) => string | number;\r\n labelExtractor: (item: T) => string;\r\n customSetter?: (item: T) => any;\r\n valid?: boolean;\r\n error?: string;\r\n placeholder?: string;\r\n maxSelections?: number;\r\n searchable?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport const MultiSelect = <T,>({\r\n label,\r\n labelPosition = \"default\",\r\n options,\r\n selectedValues,\r\n onChange,\r\n idExtractor,\r\n labelExtractor,\r\n customSetter,\r\n valid,\r\n error,\r\n placeholder = \"Select options...\",\r\n maxSelections,\r\n searchable = false,\r\n disabled = false,\r\n className,\r\n}: MultiSelectProps<T>) => {\r\n const [searchValue, setSearchValue] = useState(\"\");\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [focusedOptionIndex, setFocusedOptionIndex] = useState(-1);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\r\n\r\n const {\r\n triggerRef,\r\n triggerProps,\r\n popoverRef,\r\n getPopoverPosition,\r\n open,\r\n toggle,\r\n close,\r\n } = usePopover<HTMLDivElement, HTMLDivElement>({\r\n align: \"start\",\r\n side: \"top\",\r\n avoidCollisions: false,\r\n onOpen: () => {\r\n setIsFocused(true);\r\n if (searchable && inputRef.current) {\r\n setTimeout(() => inputRef.current?.focus(), 10);\r\n }\r\n },\r\n onClose: () => {\r\n setIsFocused(false);\r\n setSearchValue(\"\");\r\n setFocusedOptionIndex(-1);\r\n },\r\n });\r\n\r\n // Unique IDs for ARIA attributes\r\n const inputId = useRef(\r\n `multiselect-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const labelId = useRef(\r\n `label-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const errorId = useRef(\r\n `error-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n const listboxId = useRef(\r\n `listbox-${Math.random().toString(36).substr(2, 9)}`\r\n ).current;\r\n\r\n // Handle crossover between stored IDs and display objects\r\n const getDisplayValues = (): T[] => {\r\n if (!customSetter) return selectedValues;\r\n\r\n // selectedValues contains IDs, find matching objects from options\r\n return selectedValues\r\n .map((storedValue) => {\r\n const matchingOption = options.find(\r\n (option) =>\r\n idExtractor(option) === storedValue ||\r\n idExtractor(option) === idExtractor(storedValue as any)\r\n );\r\n return matchingOption;\r\n })\r\n .filter(Boolean) as T[];\r\n };\r\n\r\n const displayValues = getDisplayValues();\r\n const hasValue = displayValues.length > 0;\r\n\r\n // Filter options based on search\r\n const filteredOptions = searchable\r\n ? options.filter((option) =>\r\n labelExtractor(option).toLowerCase().includes(searchValue.toLowerCase())\r\n )\r\n : options;\r\n\r\n // Update option refs when filtered options change\r\n useEffect(() => {\r\n optionRefs.current = optionRefs.current.slice(0, filteredOptions.length);\r\n }, [filteredOptions.length]);\r\n\r\n const isSelected = (option: T) => {\r\n if (!customSetter) {\r\n return selectedValues.some(\r\n (selected) => idExtractor(selected) === idExtractor(option)\r\n );\r\n }\r\n\r\n // When using customSetter, selectedValues contains IDs\r\n return selectedValues.some(\r\n (storedValue) =>\r\n storedValue === idExtractor(option) ||\r\n idExtractor(storedValue as any) === idExtractor(option)\r\n );\r\n };\r\n\r\n const handleToggleOption = (option: T) => {\r\n if (disabled) return;\r\n\r\n if (isSelected(option)) {\r\n // Remove from selection\r\n let newValues;\r\n if (customSetter) {\r\n // Remove by ID when using customSetter\r\n const optionId = idExtractor(option);\r\n newValues = selectedValues.filter(\r\n (storedValue) =>\r\n storedValue !== optionId &&\r\n idExtractor(storedValue as any) !== optionId\r\n );\r\n } else {\r\n // Remove by object comparison\r\n newValues = selectedValues.filter(\r\n (selected) => idExtractor(selected) !== idExtractor(option)\r\n );\r\n }\r\n onChange(newValues);\r\n announceChange(`Removed ${labelExtractor(option)}`);\r\n } else {\r\n // Add to selection\r\n if (maxSelections && displayValues.length >= maxSelections) {\r\n announceChange(`Maximum of ${maxSelections} selections allowed`);\r\n return;\r\n }\r\n\r\n let newValues;\r\n if (customSetter) {\r\n // Add ID when using customSetter\r\n newValues = [...selectedValues, customSetter(option)];\r\n } else {\r\n // Add full object\r\n newValues = [...selectedValues, option];\r\n }\r\n onChange(newValues);\r\n announceChange(`Added ${labelExtractor(option)}`);\r\n }\r\n };\r\n\r\n const handleRemoveValue = (valueToRemove: T) => {\r\n if (disabled) return;\r\n\r\n let newValues;\r\n if (customSetter) {\r\n // Remove by ID when using customSetter\r\n const valueId = idExtractor(valueToRemove);\r\n newValues = selectedValues.filter(\r\n (storedValue) =>\r\n storedValue !== valueId && idExtractor(storedValue as any) !== valueId\r\n );\r\n } else {\r\n // Remove by object comparison\r\n newValues = selectedValues.filter(\r\n (selected) => idExtractor(selected) !== idExtractor(valueToRemove)\r\n );\r\n }\r\n onChange(newValues);\r\n announceChange(`Removed ${labelExtractor(valueToRemove)}`);\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (disabled) return;\r\n\r\n switch (e.key) {\r\n case \"Enter\":\r\n e.preventDefault();\r\n if (!open) {\r\n toggle();\r\n } else if (focusedOptionIndex >= 0) {\r\n handleToggleOption(filteredOptions[focusedOptionIndex]);\r\n }\r\n break;\r\n case \"Escape\":\r\n e.preventDefault();\r\n close();\r\n break;\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n if (!open) {\r\n toggle();\r\n } else {\r\n const nextIndex =\r\n focusedOptionIndex >= filteredOptions.length - 1\r\n ? 0\r\n : focusedOptionIndex + 1;\r\n setFocusedOptionIndex(nextIndex);\r\n optionRefs.current[nextIndex]?.scrollIntoView({ block: \"nearest\" });\r\n }\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n if (open) {\r\n const prevIndex =\r\n focusedOptionIndex <= 0\r\n ? filteredOptions.length - 1\r\n : focusedOptionIndex - 1;\r\n setFocusedOptionIndex(prevIndex);\r\n optionRefs.current[prevIndex]?.scrollIntoView({ block: \"nearest\" });\r\n }\r\n break;\r\n case \"Backspace\":\r\n if (searchable && searchValue === \"\" && displayValues.length > 0) {\r\n // Remove last selected value\r\n const lastValue = displayValues[displayValues.length - 1];\r\n handleRemoveValue(lastValue);\r\n }\r\n break;\r\n }\r\n };\r\n\r\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearchValue(e.target.value);\r\n setFocusedOptionIndex(-1);\r\n };\r\n\r\n const handleContainerClick = () => {\r\n if (!disabled) {\r\n if (searchable && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n toggle();\r\n }\r\n };\r\n\r\n const announceChange = (message: string) => {\r\n if (import.meta.env.NODE_ENV !== \"production\") {\r\n console.log(`Accessibility announcement: ${message}`);\r\n }\r\n };\r\n\r\n useClickAwayWithRef(popoverRef, (event) => {\r\n if (!triggerRef.current || !open || !event.target) return;\r\n if (triggerRef.current.contains(event.target as Node)) return;\r\n close();\r\n });\r\n\r\n const position = getPopoverPosition();\r\n\r\n return (\r\n <div className={cn(\"relative\", className)}>\r\n <div className=\"relative\" ref={containerRef}>\r\n {/* {labelPosition === \"default\" && (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n className={cn(\r\n \"text-base top-4 font-semibold left-3 absolute transition-all duration-200\",\r\n {\r\n \"text-sm top-2 left-2\": isFocused || hasValue,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label}{\" \"}\r\n {maxSelections && `(${selectedValues.length}/${maxSelections})`}\r\n </label>\r\n )} */}\r\n {labelPosition === \"default\" && (\r\n <label\r\n className={cn(\r\n \"top-[18px] font-medium ml-0.5 text-xs\",\r\n error && \"text-red-9\"\r\n )}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div\r\n ref={triggerRef}\r\n {...triggerProps}\r\n className={cn(\r\n \"relative rounded-6 px-2 transition cursor-pointer pr-10 min-h-[48px]\",\r\n \"border border-base-4 light-theme:drop-shadow-sm dark-theme:bg-base-3\",\r\n {\r\n \"py-3\": labelPosition === \"default\",\r\n \"pt-5 pb-2\": labelPosition === \"floating\",\r\n \"ring-1 ring-brand\": open || isFocused,\r\n \"text-red-9\": error,\r\n \"ring-2 ring-red-6\": error && (open || isFocused),\r\n \"opacity-60 cursor-not-allowed\": disabled,\r\n }\r\n )}\r\n onClick={handleContainerClick}\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-haspopup=\"listbox\"\r\n aria-owns={listboxId}\r\n aria-labelledby={labelId}\r\n aria-describedby={error ? errorId : undefined}\r\n onKeyDown={handleKeyDown}\r\n tabIndex={disabled ? -1 : 0}\r\n >\r\n {labelPosition === \"floating\" && (\r\n <label\r\n id={labelId}\r\n htmlFor={inputId}\r\n className={cn(\r\n \"absolute transition-all duration-200 pointer-events-none\",\r\n \"text-base top-4 font-semibold left-3\",\r\n {\r\n \"text-sm top-2 left-2\": isFocused || hasValue,\r\n \"text-red-9\": !!error,\r\n }\r\n )}\r\n >\r\n {label}{\" \"}\r\n {maxSelections && `(${selectedValues.length}/${maxSelections})`}\r\n </label>\r\n )}\r\n\r\n <div\r\n className={cn(\"flex flex-wrap gap-2 items-center\", {\r\n \"mt-2.5\": labelPosition === \"floating\",\r\n })}\r\n >\r\n {displayValues.map((value) => (\r\n <div\r\n key={idExtractor(value)}\r\n className={cn(\r\n \"border border-base-4 dark-theme:border-base-5 dark-theme:bg-base-4 rounded-full px-2 py-1 text-sm flex items-center gap-1\",\r\n {\r\n \"bg-red-4 text-red-9\": error,\r\n }\r\n )}\r\n >\r\n <span className=\"line-clamp-1\">{labelExtractor(value)}</span>\r\n {!disabled && (\r\n <button\r\n type=\"button\"\r\n className=\"hover:bg-brand/20 rounded-full p-0.5 transition-colors\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleRemoveValue(value);\r\n }}\r\n aria-label={`Remove ${labelExtractor(value)}`}\r\n >\r\n <XIcon size={12} />\r\n </button>\r\n )}\r\n </div>\r\n ))}\r\n\r\n {searchable && (\r\n <input\r\n ref={inputRef}\r\n id={inputId}\r\n type=\"text\"\r\n className=\"flex-grow min-w-[60px] bg-transparent outline-none placeholder:text-sm\"\r\n value={searchValue}\r\n onChange={handleSearchChange}\r\n onKeyDown={handleKeyDown}\r\n placeholder={hasValue ? \"\" : placeholder}\r\n disabled={disabled}\r\n aria-autocomplete=\"list\"\r\n aria-controls={listboxId}\r\n autoComplete=\"off\"\r\n />\r\n )}\r\n\r\n {!searchable && !hasValue && (\r\n <span className=\"text-secondarytext text-sm flex-grow\">\r\n {placeholder}\r\n </span>\r\n )}\r\n </div>\r\n\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-2\">\r\n {valid && <CheckIcon size={16} className=\"text-green-600\" />}\r\n <ChevronDownIcon\r\n size={16}\r\n className={cn(\"transition-transform text-base-11\", {\r\n \"rotate-180\": open,\r\n })}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <AnimatePresence>\r\n {open && (\r\n <Portal>\r\n <motion.div\r\n initial={{ opacity: 0, y: -10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{ opacity: 0, y: -10 }}\r\n transition={{ duration: 0.15 }}\r\n ref={popoverRef}\r\n style={{\r\n position: \"fixed\",\r\n left: position.x,\r\n top: position.top,\r\n bottom: position.bottom,\r\n width: containerRef.current?.offsetWidth ?? 200,\r\n }}\r\n className={cn(\r\n \"bg-base-1 dark-theme:bg-base-3 border border-base-4\",\r\n \"rounded-6 shadow-lg max-h-[300px] overflow-y-auto z-50\",\r\n \"customscrollbarnohide\"\r\n )}\r\n role=\"listbox\"\r\n id={listboxId}\r\n aria-labelledby={labelId}\r\n >\r\n {filteredOptions.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-secondarytext\">\r\n {searchValue ? \"No results found\" : \"No options available\"}\r\n </div>\r\n ) : (\r\n filteredOptions.map((option, index) => {\r\n const selected = isSelected(option);\r\n const focused = index === focusedOptionIndex;\r\n\r\n return (\r\n <div\r\n key={idExtractor(option)}\r\n ref={(el) => {\r\n optionRefs.current[index] = el;\r\n }}\r\n className={cn(\r\n \"px-3 py-2 text-sm cursor-pointer flex items-center justify-between\", // gap-x-2\r\n \"first:rounded-t-6 last:rounded-b-6\",\r\n // !selected && \"pl-9\",\r\n {\r\n \"bg-base-3 dark-theme:bg-base-4\": focused,\r\n \"bg-brandfadedbg text-brand\": selected,\r\n }\r\n )}\r\n onClick={() => handleToggleOption(option)}\r\n role=\"option\"\r\n aria-selected={selected}\r\n onMouseEnter={() => setFocusedOptionIndex(index)}\r\n >\r\n <span>{labelExtractor(option)}</span>\r\n {selected && <CheckIcon size={16} />}\r\n </div>\r\n );\r\n })\r\n )}\r\n </motion.div>\r\n </Portal>\r\n )}\r\n </AnimatePresence>\r\n\r\n {error && (\r\n <p\r\n id={errorId}\r\n className=\"text-red-9 text-xs mt-1\"\r\n aria-live=\"assertive\"\r\n >\r\n {error}\r\n </p>\r\n )}\r\n\r\n {/* Visually hidden live region for announcements */}\r\n <div className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {displayValues.length > 0\r\n ? `Selected: ${displayValues.map(labelExtractor).join(\", \")}`\r\n : \"No selections\"}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ntype FormMultiSelectProps<T> = Omit<\r\n MultiSelectProps<T>,\r\n \"selectedValues\" | \"onChange\"\r\n> & {\r\n name: string;\r\n};\r\n\r\nexport const FormMultiSelect = <T,>({\r\n name,\r\n ...others\r\n}: FormMultiSelectProps<T>) => {\r\n const { control } = useFormContext();\r\n\r\n if (!control) {\r\n console.error(`Form control is missing for field: ${name}`);\r\n return <p>Form control missing for field: {name}</p>;\r\n }\r\n\r\n return (\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field, fieldState }) => {\r\n return (\r\n <MultiSelect\r\n selectedValues={field.value || []}\r\n onChange={(values) => field.onChange(values)}\r\n error={fieldState.error?.message}\r\n {...others}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { Check, Plus, X } from \"lucide-react\";\r\nimport { Button, Spinner } from \"../components\";\r\nimport { useState } from \"react\";\r\nimport { cn } from \"../utils\";\r\n\r\nexport const FormSubmit = ({\r\n isEditable,\r\n isDeletable = true,\r\n createUpdateLoading,\r\n deleteLoading,\r\n onDelete,\r\n onDeleteConfirm,\r\n addText = \"Añadir\",\r\n updateText = \"Actualizar\",\r\n deleteText = \"Eliminar\",\r\n className,\r\n}: {\r\n isEditable?: boolean;\r\n isDeletable?: boolean;\r\n createUpdateLoading: boolean;\r\n deleteLoading?: boolean;\r\n onDelete?: () => void;\r\n onDeleteConfirm?: boolean;\r\n addText?: string;\r\n updateText?: string;\r\n deleteText?: string;\r\n className?: string;\r\n}) => {\r\n const [confirm, setConfirm] = useState(false);\r\n\r\n return (\r\n <div className={`w-full grid grid-cols-2 gap-4 col-span-full ${className}`}>\r\n {isEditable && isDeletable ? (\r\n <Button\r\n color=\"dangersolid\"\r\n state={\r\n deleteLoading\r\n ? \"loading\"\r\n : createUpdateLoading\r\n ? \"disabled\"\r\n : \"enabled\"\r\n }\r\n onClick={() => {\r\n if (onDeleteConfirm) {\r\n if (!confirm) {\r\n setConfirm(true);\r\n } else {\r\n onDelete?.();\r\n }\r\n } else {\r\n onDelete?.();\r\n }\r\n }}\r\n >\r\n <X size={18} />\r\n {onDeleteConfirm ? (confirm ? \"Confirmar\" : deleteText) : deleteText}\r\n </Button>\r\n ) : null}\r\n <Button\r\n color=\"brand\"\r\n className={cn(isEditable && isDeletable ? \"\" : \"col-span-2\")}\r\n state={\r\n createUpdateLoading\r\n ? \"loading\"\r\n : deleteLoading\r\n ? \"disabled\"\r\n : \"enabled\"\r\n }\r\n type=\"submit\"\r\n >\r\n {createUpdateLoading ? (\r\n <Spinner />\r\n ) : isEditable ? (\r\n <Check size={18} />\r\n ) : (\r\n <Plus size={18} />\r\n )}\r\n {isEditable ? updateText : addText}\r\n </Button>\r\n </div>\r\n );\r\n};\r\n","import { cn } from \"../utils\";\r\nimport { useId } from \"react\";\r\n\r\ninterface SwitchProps {\r\n checked: boolean;\r\n onCheckedChange: (checked: boolean) => void;\r\n disabled?: boolean;\r\n name?: string;\r\n required?: boolean;\r\n className?: string;\r\n}\r\n\r\nfunction Switch({\r\n checked,\r\n onCheckedChange,\r\n disabled = false,\r\n name,\r\n required,\r\n className = \"\",\r\n}: SwitchProps) {\r\n const id = useId();\r\n\r\n const handleClick = () => {\r\n if (disabled) return;\r\n onCheckedChange(!checked);\r\n };\r\n\r\n return (\r\n <button\r\n id={id}\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={checked}\r\n aria-required={required}\r\n data-state={checked ? \"checked\" : \"unchecked\"}\r\n disabled={disabled}\r\n onClick={handleClick}\r\n className={cn(\r\n `relative inline-flex h-[28px] w-[48px] items-center rounded-full\r\n transition-colors duration-200 ease-in-out\r\n focus-visible:outline-none focus-visible:ring-1\r\n focus-visible:ring-base-6`,\r\n checked ? \"bg-brand\" : \"bg-base-3\",\r\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\r\n className\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n `inline-block h-6 w-6 transform rounded-full\r\n transition-transform duration-200 ease-in-out\r\n shadow`,\r\n checked\r\n ? \"bg-brand-text translate-x-[22px]\"\r\n : \"bg-base-1 dark-theme:bg-base-12 translate-x-[2px]\"\r\n )}\r\n />\r\n\r\n {/* Hidden input for form submission */}\r\n {name && (\r\n <input\r\n type=\"checkbox\"\r\n name={name}\r\n checked={checked}\r\n required={required}\r\n disabled={disabled}\r\n onChange={() => {}} // Controlled by Controller\r\n tabIndex={-1}\r\n aria-hidden=\"true\"\r\n className=\"sr-only\"\r\n />\r\n )}\r\n </button>\r\n );\r\n}\r\n\r\nexport { Switch };\r\n","import {\n createContext,\n memo,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\n//============================\n// #region AliveScope\n//============================\ntype AliveScopeContextType = {\n getPortalElement: (\n id: string,\n children: React.ReactNode,\n className?: string\n ) => HTMLElement;\n dropPortalElement: (id: string) => void;\n};\n\nconst AliveScopeContext = createContext<AliveScopeContextType | null>(null);\n\nconst AliveScopeProvider = ({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: AliveScopeContextType;\n}) => {\n return (\n <AliveScopeContext.Provider value={value}>\n {children}\n </AliveScopeContext.Provider>\n );\n};\n\nconst useAliveScope = () => {\n const context = useContext(AliveScopeContext);\n\n if (!context)\n throw new Error(\"useAliveScope must be wrapped within AliveScopeProvider\");\n\n return context;\n};\n\ntype AliveScopeProps = {\n children?: React.ReactNode;\n};\n\nconst AliveScope: React.FC<AliveScopeProps> = ({ children }) => {\n const [nodes, setNodes] = useState<{\n [id: string]: { children: React.ReactNode; element: HTMLElement };\n }>({});\n\n const onMountCallbacks = useRef<{ [id: string]: ((id: string) => void)[] }>(\n {}\n );\n const onDropCallbacks = useRef<{ [id: string]: ((id: string) => void)[] }>(\n {}\n );\n\n const getPortalElement = (\n id: string,\n children: React.ReactNode,\n className?: string\n ) => {\n if (!nodes[id]) {\n const element = document.createElement(\"div\");\n if (id) {\n element.id = id;\n }\n if (className) {\n element.className = className;\n }\n setNodes((prevNodes) => ({\n ...prevNodes,\n [id]: { children, element },\n }));\n onMountCallbacks.current[id] = [];\n onDropCallbacks.current[id] = [];\n if (onMountCallbacks.current && onMountCallbacks.current[id]) {\n onMountCallbacks.current[id].forEach((callback) => callback(id));\n }\n return element;\n }\n if (onMountCallbacks.current && onMountCallbacks.current[id]) {\n onMountCallbacks.current[id].forEach((callback) => callback(id));\n }\n return nodes[id].element;\n };\n\n const dropPortalElement = (id: string) => {\n setNodes((prevNodes) => {\n const copy = { ...prevNodes };\n delete copy[id];\n return copy;\n });\n //console.log(\"dropped\", id);\n if (onDropCallbacks.current && onDropCallbacks.current[id]) {\n onDropCallbacks.current[id].forEach((callback) => callback(id));\n }\n };\n\n return (\n <AliveScopeProvider\n value={{\n getPortalElement,\n dropPortalElement,\n }}\n >\n {children}\n {Object.entries(nodes).map(([id, { children, element }]) => (\n <Component\n key={id}\n id={id}\n onMountCallbacks={onMountCallbacks}\n onDropCallbacks={onDropCallbacks}\n children={children}\n element={element}\n />\n ))}\n </AliveScopeProvider>\n );\n};\n//============================\n// #endregion AliveScope\n//============================\n\n//============================\n// #region KeepAlive\n//============================\ntype KeepAliveContextType = {\n keepAliveId: string;\n onKeepAliveMount: (\n callback: (id: string) => void,\n options?: { runOnFirstMount?: boolean }\n ) => void;\n onKeepAliveDrop: (callback: (id: string) => void) => void;\n};\n\nexport const KeepAliveContext = createContext<KeepAliveContextType | null>(\n null\n);\n\nexport const KeepAliveProvider = ({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: KeepAliveContextType;\n}) => {\n return (\n <KeepAliveContext.Provider value={value}>\n {children}\n </KeepAliveContext.Provider>\n );\n};\n\nconst Component = memo<{\n id: string;\n onMountCallbacks: React.MutableRefObject<{\n [id: string]: ((id: string) => void)[];\n }>;\n onDropCallbacks: React.MutableRefObject<{\n [id: string]: ((id: string) => void)[];\n }>;\n children: React.ReactNode;\n element: HTMLElement;\n}>(({ id, onMountCallbacks, onDropCallbacks, children, element }) => {\n const onKeepAliveMount = (\n callback: (id: string) => void,\n options: { runOnFirstMount?: boolean } = { runOnFirstMount: false }\n ) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n const runCallback = () => {\n const el = document.getElementById(id);\n if (el) {\n callback(id);\n } else {\n // If element is not found, use MutationObserver to wait for it\n const observer = new MutationObserver((_mutations, obs) => {\n const el = document.getElementById(id);\n if (el) {\n callback(id);\n obs.disconnect(); // Stop observing once element is found\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n // Cleanup function to disconnect the observer if component unmounts\n return () => observer.disconnect();\n }\n };\n\n if (options?.runOnFirstMount) {\n runCallback();\n }\n\n onMountCallbacks.current[id].push(runCallback);\n return () => {\n onMountCallbacks.current[id] = onMountCallbacks.current[id].filter(\n (cb) => cb !== runCallback\n );\n };\n }, []);\n };\n\n const onKeepAliveDrop = (callback: (id: string) => void) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n onDropCallbacks.current[id].push(callback);\n return () => {\n onDropCallbacks.current[id] = onDropCallbacks.current[id].filter(\n (cb) => cb !== callback\n );\n };\n }, []);\n };\n\n return (\n <KeepAliveProvider\n value={{ keepAliveId: id, onKeepAliveMount, onKeepAliveDrop }}\n >\n {createPortal(children, element, id)}\n </KeepAliveProvider>\n );\n});\n\nconst useKeepAlive = () => {\n const context = useContext(KeepAliveContext);\n\n if (!context)\n throw new Error(\"useKeepAlive must be used within KeepAliveProvider\");\n\n return context;\n};\n\ntype KeepAliveProps = React.HTMLAttributes<HTMLDivElement> & {\n aliveKey: string;\n children: React.ReactNode;\n enabled?: boolean;\n};\n\nconst KeepAlive: React.FC<KeepAliveProps> = ({\n aliveKey,\n children,\n enabled = true,\n ...others\n}) => {\n const keepAliveRef = useRef<HTMLDivElement | null>(null);\n const { getPortalElement } = useAliveScope();\n\n useEffect(() => {\n const element = getPortalElement(aliveKey, children, others.className);\n\n if (enabled) {\n if (keepAliveRef.current) {\n keepAliveRef.current.replaceWith(element);\n }\n }\n\n return () => {\n //TODO\n //callUnmountCallbacks(aliveKey)\n };\n }, [aliveKey, children, enabled, others]);\n\n return (\n <div {...others} ref={keepAliveRef}>\n {/* Added children back for ssr initial rendering */}\n {children}\n </div>\n );\n};\n//============================\n// #endregion KeepAlive\n//============================\n\nexport { AliveScope, KeepAlive, useKeepAlive };\n"],"names":["cn","inputs","twMerge","clsx","throttle","func","limit","lastRan","timeout","args","now","debounce","delay","generateInitials","name","words","setFocusEnd","element","length","removeWhitespaces","text","toTitleCase","str","word","firstChar","restOfWord","nullRead","nullSet","extractDirtyData","data","dirtyFields","staticFields","result","field","key","FocusTrap","container","event","focusableElements","firstFocusable","lastFocusable","checkOverflow","horizontal","vertical","maxScrollLeft","maxScrollTop","useOverflow","onOverflow","trackScroll","withObserver","enabled","deps","ref","useRef","useEffect","initialOverflow","throttledUpdate","info","observer","scrollElement","useOverflowState","overflowInfo","setOverflowInfo","useState","sizes","Avatar","src","size","className","jsx","jsxs","Icon","AvatarsGroup","children","animate","props","f","s","t","largeAtom","atom","listening","handleResize","useLargeScreen","useAtomValue","useMergedRef","refs","value","useRipple","contrastRipple","lg","ripple","useCallback","button","buttonRect","rippleSize","offsetX","offsetY","rippleWrapper","rippleEl","ripples","usePopover","scrollerId","align","side","offset","collisionPadding","avoidCollisions","closeOnScroll","onOpen","onClose","open","setOpen","popoverDimensions","setPopoverDimensions","triggerRef","popoverRef","triggerRectRef","scrollerRef","triggerId","useId","getPopoverPosition","customRect","rect","popoverWidth","popoverHeight","calculatePopoverPosition","updatePopoverDimensions","handleScroll","toggle","prev","close","triggerRect","viewport","x","y","rightSideX","leftSideX","rightOverflow","leftOverflow","spaceBelow","spaceAbove","spaceRight","spaceLeft","centeredX","top","bottom","useClickAway","callback","handleClickAway","useClickAwayAdvanced","options","events","excludeRefs","handleClick","target","excludeRef","eventName","useClickAwayWithRef","useKeyListener","keyMap","keyMapRef","handleKeyEvent","e","baseStyles","sizeStyles","focusStyles","fontWeightStyles","borderRadiusStyles","colorStyles","stateStyles","Button","forwardRef","color","fontWeight","rounded","state","onClick","withRipple","showFocus","withDisabledDelay","type","others","forwardedRef","disabledDelay","setDisabledDelay","rippleRef","Separator","strokeWidth","viewBox","Spinner","loading","wrapperClassName","spinnerClassName","Portal","node","createPortal","$constructor","initializer","params","init","inst","def","_a","k","_","Parent","Definition","fn","$ZodAsyncError","globalConfig","config","newConfig","jsonStringifyReplacer","captureStackTrace","_args","unwrapMessage","message","finalizeIssue","iss","ctx","full","util.jsonStringifyReplacer","$ZodError","$ZodRealError","_parse","_Err","schema","_ctx","_params","core.$ZodAsyncError","util.finalizeIssue","core.config","util.captureStackTrace","parse","errors.$ZodRealError","_parseAsync","parseAsync","r","o","n","i","a","u","c","n.parse","n.parseAsync","n.$ZodError","Form","methods","onSubmit","onError","logErrors","FormProvider","errors","useMethods","defaultValues","useForm","zodResolver","colorClasses","Checkbox","checked","onCheckedChange","disabled","required","id","handleKeyDown","sizeClasses","iconSizes","Fragment","Check","Minus","inputColors","focusColors","Input","label","description","labelPosition","focusColor","placeholder","valid","error","errorMessage","isPrice","prefix","containerClassName","innerRef","mounted","showPassword","setShowPassword","isFocused","setIsFocused","isPassword","inputType","hasValue","DollarSign","CheckIcon","EyeOffIcon","Eye","FormInput","customRead","customSet","withNullSet","control","useFormContext","readValue","setValue","Controller","fieldState","TextArea","rows","FormTextArea","Tags","variant","tags","onChange","maxTags","validateTag","inputValue","setInputValue","localError","setLocalError","inputRef","containerRef","tagRefs","inputId","labelId","errorId","newTag","validationResult","announceChange","removedTag","handleTagKeyDown","tagIndex","newTags","handleRemoveTag","tagToRemove","tag","handleInputChange","handleContainerClick","index","el","FormTags","MultiSelect","selectedValues","idExtractor","labelExtractor","customSetter","maxSelections","searchable","searchValue","setSearchValue","focusedOptionIndex","setFocusedOptionIndex","optionRefs","triggerProps","listboxId","displayValues","storedValue","option","filteredOptions","isSelected","selected","handleToggleOption","newValues","optionId","handleRemoveValue","valueToRemove","valueId","nextIndex","prevIndex","lastValue","handleSearchChange","position","XIcon","ChevronDownIcon","AnimatePresence","motion","focused","FormMultiSelect","values","FormSubmit","isEditable","isDeletable","createUpdateLoading","deleteLoading","onDelete","onDeleteConfirm","addText","updateText","deleteText","confirm","setConfirm","X","Plus","Switch","AliveScopeContext","createContext","AliveScopeProvider","useAliveScope","context","useContext","AliveScope","nodes","setNodes","onMountCallbacks","onDropCallbacks","getPortalElement","prevNodes","dropPortalElement","copy","Component","KeepAliveContext","KeepAliveProvider","memo","onKeepAliveMount","runCallback","_mutations","obs","cb","onKeepAliveDrop","useKeepAlive","KeepAlive","aliveKey","keepAliveRef"],"mappings":"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","x_google_ignoreList":[6,18,19,20,21,22]}
|