@alsha-research/picaso-ui 0.0.2 → 0.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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../app/components/Accordion.tsx","../app/utils/utils.tsx","../app/components/Avatar.tsx","../app/components/AvatarGroup.tsx","../app/components/Breadcrumb.tsx","../app/components/Button.tsx","../app/components/Calendar.tsx","../app/components/Callout.tsx","../app/components/Card.tsx","../app/components/Checkbox.tsx","../app/components/Chip.tsx","../app/components/CircularProgress.tsx","../app/components/ColorPicker.tsx","../app/components/Input.tsx","../app/components/DatePicker.tsx","../app/components/DateTimePicker.tsx","../app/components/TimePicker.tsx","../app/components/DateRangePicker.tsx","../app/components/Divider.tsx","../app/components/Drawer.tsx","../app/components/Dropdown.tsx","../app/components/Label.tsx","../app/components/DropdownMenu.tsx","../app/components/DropdownWithIcon.tsx","../app/components/FileSelector.tsx","../app/components/FileUpload.tsx","../app/components/FileUploadPreview.tsx","../app/components/GlobalNavigation.tsx","../app/components/HelperText.tsx","../app/components/ListPagination.tsx","../app/components/Loading.tsx","../app/components/Modal.tsx","../app/components/Notice.tsx","../app/components/OTPInput.tsx","../app/components/Pagination.tsx","../app/components/Progress.tsx","../app/components/Radio.tsx","../app/components/FileUploadControl.tsx","../app/components/Spinner.tsx","../app/components/Select.tsx","../app/components/Sidebar.tsx","../app/components/Skeleton.tsx","../app/components/Slider.tsx","../app/components/SplitButton.tsx","../app/components/Stepper.tsx","../app/components/TableComponents.tsx","../app/components/Tabs.tsx","../app/components/Textarea.tsx","../app/components/TextInputWithLabel.tsx","../app/components/Toggle.tsx","../app/components/Tooltip.tsx","../app/components/TreeView.tsx","../app/components/Typography.tsx","../app/components/ThemeProvider.tsx","../app/utils/theme.ts","../app/components/ThemeColorPicker.tsx","../app/components/ThemeModeSwitch.tsx","../app/components/ThemeScript.tsx"],"sourcesContent":["\"use client\";\nimport React, { useState, useEffect } from \"react\";\nimport { RiArrowDownSLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ntype AccordionProps = {\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n className?: string;\n children: React.ReactNode;\n expanded?: boolean;\n};\n\nexport default function Accordion({\n type = \"single\",\n collapsible = true,\n className,\n children,\n expanded,\n}: AccordionProps) {\n const [openItems, setOpenItems] = useState<string[]>(() => {\n const defaultOpen: string[] = [];\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const triggerChild = React.Children.toArray(child.props.children)[0];\n if (\n React.isValidElement(triggerChild) &&\n triggerChild.props.defaultOpen\n ) {\n defaultOpen.push((child.props as AccordionItemProps).value);\n }\n }\n });\n return defaultOpen;\n });\n\n // Handle expanded prop changes\n useEffect(() => {\n if (expanded !== undefined) {\n if (expanded) {\n // Open all items\n const allValues: string[] = [];\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n allValues.push((child.props as AccordionItemProps).value);\n }\n });\n setOpenItems(allValues);\n } else {\n // Collapse all items\n setOpenItems([]);\n }\n }\n }, [expanded, children]);\n\n const handleToggle = (value: string) => {\n if (type === \"single\") {\n setOpenItems((prev) =>\n prev.includes(value) ? (collapsible ? [] : prev) : [value],\n );\n } else {\n setOpenItems((prev) =>\n prev.includes(value)\n ? prev.filter((item) => item !== value)\n : [...prev, value],\n );\n }\n };\n\n return (\n <div className={className} role=\"region\" aria-label=\"Accordion\">\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(\n child as React.ReactElement<{\n openItems: string[];\n handleToggle: (value: string) => void;\n }>,\n {\n openItems,\n handleToggle,\n },\n );\n }\n return child;\n })}\n </div>\n );\n}\n\ntype AccordionItemProps = {\n value: string;\n disabled?: boolean;\n openItems?: string[];\n handleToggle?: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n};\n\nexport function AccordionItem({\n value,\n disabled = false,\n openItems,\n handleToggle,\n children,\n className,\n}: AccordionItemProps) {\n const isOpen = openItems?.includes(value);\n const headerId = `accordion-header-${value}`;\n const contentId = `accordion-content-${value}`;\n\n const toggle = () => {\n if (!disabled && handleToggle) {\n handleToggle(value);\n }\n };\n\n return (\n <div\n className={cn(\n // same radius and border language as Input, Dropdown and Modal\n \"bg-white rounded-xl border border-gray-200 shadow-sm\",\n \"transition-[border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:border-gray-300\",\n disabled && \"opacity-50 pointer-events-none select-none\",\n isOpen && \"border-gray-300 shadow-md\",\n className,\n )}\n >\n {children && Array.isArray(children) ? (\n <>\n <div\n onClick={toggle}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggle();\n }\n }}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-expanded={isOpen}\n aria-disabled={disabled}\n aria-controls={contentId}\n id={headerId}\n className={cn(\n \"cursor-pointer rounded-xl outline-none\",\n // keyboard-only ring, inset so the item border never clips it\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n // the header joins the panel below it while open\n isOpen && \"rounded-b-none\",\n )}\n >\n {React.cloneElement(children[0] as React.ReactElement, { isOpen })}\n </div>\n <div\n id={contentId}\n role=\"region\"\n aria-labelledby={headerId}\n className={cn(\n \"overflow-hidden transition-[max-height,opacity,visibility] duration-300 ease-in-out motion-reduce:transition-none\",\n // invisible keeps collapsed content out of the tab order\n isOpen\n ? \"max-h-[1000px] opacity-100 visible border-t border-gray-100\"\n : \"max-h-0 opacity-0 invisible\",\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"p-3.5\">{children[1]}</div>\n </div>\n </>\n ) : (\n children\n )}\n </div>\n );\n}\n\ntype AccordionTriggerProps = {\n isOpen?: boolean;\n children: React.ReactNode;\n defaultOpen?: boolean;\n className?: string;\n triggerIcon?: React.ReactNode;\n};\n\nexport function AccordionTrigger({\n isOpen,\n children,\n className,\n // the muted color is on the default icon only, so a custom triggerIcon\n // still inherits the colour set through className\n triggerIcon = <RiArrowDownSLine size={18} className=\"text-gray-500\" />,\n}: AccordionTriggerProps) {\n return (\n <div\n className={cn(\n \"flex gap-3 p-3.5 text-base text-gray-900 rounded-xl bg-white hover:bg-gray-50 justify-between items-center font-semibold\",\n \"transition-colors duration-200 ease-out motion-reduce:transition-none\",\n isOpen && \"bg-gray-50 rounded-b-none\",\n className,\n )}\n >\n <span className=\"min-w-0\">{children}</span>\n <span\n className={cn(\n \"inline-flex shrink-0 transition-transform duration-300 ease-out motion-reduce:transition-none\",\n isOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n aria-hidden=\"true\"\n >\n {triggerIcon}\n </span>\n </div>\n );\n}\n\ntype AccordionContentProps = {\n children: React.ReactNode;\n};\n\nexport function AccordionContent({ children }: AccordionContentProps) {\n return <div className=\"text-sm leading-6 text-gray-600\">{children}</div>;\n}\n","import clsx, { ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nexport const cn = (...classes: ClassValue[]) => twMerge(clsx(...classes));\n","import Image from \"next/image\";\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface BaseProps {\n type: \"image\" | \"icon\" | \"text\";\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n onClick?: () => void;\n rounded?: boolean;\n border?: boolean;\n borderColor?: string;\n borderWidth?: string;\n radius?: string;\n disabled?: boolean;\n statusIcon?: JSX.Element;\n statusPosition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\n}\n\nexport interface ImageProps extends BaseProps {\n type: \"image\";\n src: string;\n alt?: string;\n}\n\nexport interface IconProps extends BaseProps {\n type: \"icon\";\n icon: JSX.Element;\n}\n\nexport interface TextProps extends BaseProps {\n type: \"text\";\n text: string;\n}\n\ntype AvatarProps = ImageProps | IconProps | TextProps;\n\nconst Avatar = forwardRef<HTMLDivElement, AvatarProps>((props, ref) => {\n const {\n type,\n size = \"md\",\n className,\n onClick,\n rounded,\n border,\n borderColor,\n borderWidth,\n radius,\n disabled,\n statusIcon,\n statusPosition = \"bottom-right\",\n } = props;\n\n const sizes = {\n sm: \"w-8 h-8\",\n md: \"w-12 h-12\",\n lg: \"w-16 h-16\",\n };\n\n // Matches the rendered box so next/image can pick a sensible source size.\n const imageSizes = { sm: \"32px\", md: \"48px\", lg: \"64px\" };\n\n const displayText =\n type === \"text\" && props.text\n ? props.text.length === 2\n ? props.text.toUpperCase()\n : props.text\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase())\n .join(\"\")\n .slice(0, 2)\n : \"\";\n\n // An avatar with onClick used to be a bare div: not focusable and not\n // operable from the keyboard. It is now exposed as a button.\n const interactive = onClick\n ? {\n role: \"button\" as const,\n tabIndex: disabled ? -1 : 0,\n \"aria-disabled\": disabled || undefined,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n },\n }\n : {};\n\n const interactiveClasses = onClick\n ? cn(\n \"outline-none transition-opacity duration-200 motion-reduce:transition-none\",\n \"hover:opacity-90 active:opacity-80\",\n \"focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n )\n : \"\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"relative\",\n rounded && \"rounded-full\",\n border && \"border border-gray-200\",\n disabled && \"opacity-50 pointer-events-none select-none\",\n onClick && \"cursor-pointer\",\n )}\n style={{\n borderColor: borderColor,\n borderWidth: borderWidth,\n borderRadius: radius,\n }}\n >\n {type === \"image\" && (\n <div\n {...interactive}\n className={cn(\n // rounded-[inherit] makes the content follow the outer shape,\n // including a custom `radius`\n \"relative flex items-center justify-center rounded-[inherit]\",\n interactiveClasses,\n sizes[size],\n className,\n )}\n onClick={onClick}\n >\n <Image\n fill\n sizes={imageSizes[size]}\n className={cn(\n \"rounded-[inherit]\",\n rounded && \"rounded-full\",\n \"object-cover\",\n )}\n src={(props as ImageProps).src}\n alt={(props as ImageProps).alt || \"\"}\n />\n </div>\n )}\n {type === \"icon\" && (\n <div\n {...interactive}\n className={cn(\n // soft tinted background so an icon avatar reads as an avatar;\n // a className such as bg-primary-50 overrides it\n \"flex items-center justify-center rounded-[inherit] bg-gray-100 text-gray-600\",\n interactiveClasses,\n rounded && \"rounded-full\",\n className,\n sizes[size],\n )}\n onClick={onClick}\n >\n {(props as IconProps).icon}\n </div>\n )}\n {type === \"text\" && (\n <p\n {...interactive}\n // initials are shortened visually, so expose the full text\n role={onClick ? \"button\" : \"img\"}\n aria-label={(props as TextProps).text}\n onClick={onClick}\n className={cn(\n \"flex items-center justify-center rounded-[inherit] bg-gray-100 text-sm font-semibold tracking-wide text-gray-700 select-none\",\n interactiveClasses,\n rounded && \"rounded-full\",\n className,\n sizes[size],\n size === \"sm\" && \"text-xs\",\n size === \"lg\" && \"text-xl\",\n size === \"md\" && \"text-base\",\n )}\n >\n {displayText}\n </p>\n )}\n {statusIcon && (\n <span\n className={cn(\n \"absolute w-2 h-2\",\n // small\n statusPosition === \"bottom-left\" &&\n size === \"sm\" &&\n type === \"image\" &&\n \"bottom-0\",\n statusPosition === \"top-left\" &&\n size === \"sm\" &&\n type === \"image\" &&\n \"top-0 -left-1.5\",\n statusPosition === \"bottom-right\" &&\n size === \"sm\" &&\n type === \"image\" &&\n \"bottom-0.5 right-0.5\",\n statusPosition === \"top-right\" &&\n size === \"sm\" &&\n type === \"image\" &&\n \"-top-[1.1px] right-0\",\n // sm text and icon\n statusPosition === \"bottom-left\" &&\n size === \"sm\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-0\",\n statusPosition === \"top-left\" &&\n size === \"sm\" &&\n (type === \"text\" || type === \"icon\") &&\n \"-top-1 left-0\",\n statusPosition === \"bottom-right\" &&\n size === \"sm\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-0 right-1.5\",\n statusPosition === \"top-right\" &&\n size === \"sm\" &&\n (type === \"text\" || type === \"icon\") &&\n \"top-0 right-0.5\",\n // medium\n statusPosition === \"bottom-left\" &&\n size === \"md\" &&\n type === \"image\" &&\n \"bottom-1\",\n statusPosition === \"top-left\" &&\n size === \"md\" &&\n type === \"image\" &&\n \"-top-1 left-0.5\",\n statusPosition === \"bottom-right\" &&\n size === \"md\" &&\n type === \"image\" &&\n \"bottom-1 right-2\",\n statusPosition === \"top-right\" &&\n size === \"md\" &&\n type === \"image\" &&\n \"top-0 right-1\",\n // medium text and icon\n statusPosition === \"bottom-left\" &&\n size === \"md\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-1\",\n statusPosition === \"top-left\" &&\n size === \"md\" &&\n (type === \"text\" || type === \"icon\") &&\n \"-top-1 left-1\",\n statusPosition === \"bottom-right\" &&\n size === \"md\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-1 right-2\",\n statusPosition === \"top-right\" &&\n size === \"md\" &&\n (type === \"text\" || type === \"icon\") &&\n \"top-0 right-1.5\",\n // large\n statusPosition === \"bottom-left\" &&\n size === \"lg\" &&\n type === \"image\" &&\n \"bottom-2 left-0\",\n statusPosition === \"top-left\" &&\n size === \"lg\" &&\n type === \"image\" &&\n \"top-0 left-0.5\",\n statusPosition === \"bottom-right\" &&\n size === \"lg\" &&\n type === \"image\" &&\n \"bottom-2.5 right-2\",\n statusPosition === \"top-right\" &&\n size === \"lg\" &&\n type === \"image\" &&\n \"top-0 right-2\",\n // large text and icon\n statusPosition === \"bottom-left\" &&\n size === \"lg\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-1.5 left-1.5\",\n statusPosition === \"top-left\" &&\n size === \"lg\" &&\n (type === \"text\" || type === \"icon\") &&\n \"top-0 left-1\",\n statusPosition === \"bottom-right\" &&\n size === \"lg\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-2 right-2.5\",\n statusPosition === \"top-right\" &&\n size === \"lg\" &&\n (type === \"text\" || type === \"icon\") &&\n \"top-0 right-2.5\",\n )}\n >\n {statusIcon}\n </span>\n )}\n </div>\n );\n});\n\nAvatar.displayName = \"Avatar\";\n\nexport default Avatar;\n","// AvatarGroup.tsx\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport Avatar, { ImageProps, IconProps, TextProps } from \"./Avatar\";\n\ntype AvatarItemProps =\n | Omit<ImageProps, \"size\">\n | Omit<IconProps, \"size\">\n | Omit<TextProps, \"size\">;\n\ninterface AvatarGroupProps {\n avatars: AvatarItemProps[];\n size?: \"sm\" | \"md\" | \"lg\";\n max?: number;\n className?: string;\n}\n\nconst AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(\n ({ avatars, size = \"md\", max, className }, ref) => {\n const displayAvatars = max ? avatars.slice(0, max) : avatars;\n const remainingCount = max ? avatars.length - max : 0;\n\n return (\n <div\n ref={ref}\n className={cn(\"flex -space-x-6 rtl:space-x-reverse\", className)}\n >\n {displayAvatars.map((avatar, index) => (\n <div\n className=\"hover:-translate-x-3 transition-all duration-200\"\n key={index}\n >\n <Avatar {...avatar} size={size} />\n </div>\n ))}\n {remainingCount > 0 && (\n <div>\n <Avatar\n type=\"text\"\n text={`+${remainingCount}`}\n size={size}\n rounded\n className=\"bg-gray-100\"\n />\n </div>\n )}\n </div>\n );\n }\n);\n\nAvatarGroup.displayName = \"AvatarGroup\";\n\nexport default AvatarGroup;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ntype BreadcrumbsProps = {\n children: React.ReactNode;\n separator?: React.ReactNode;\n \"aria-label\": string;\n containerClasses?: string;\n};\n\n// Styles applied to links (<a>) that are direct children of an item.\n// Written out in full so Tailwind can detect them.\nconst linkBase =\n \"[&>a]:inline-flex [&>a]:items-center [&>a]:rounded-md [&>a]:px-1.5 [&>a]:py-0.5 [&>a]:transition-colors [&>a]:duration-200 motion-reduce:[&>a]:transition-none \" +\n \"[&>a:focus-visible]:outline-none [&>a:focus-visible]:ring-2 [&>a:focus-visible]:ring-primary-500\";\n\nconst linkInteractive =\n \"[&>a:hover]:bg-gray-100 [&>a:hover]:text-gray-900 [&>a:active]:bg-gray-200\";\n\nconst Breadcrumbs = ({\n children,\n separator = \"/\",\n \"aria-label\": ariaLabel,\n containerClasses,\n}: BreadcrumbsProps) => {\n const count = React.Children.count(children);\n\n const items = React.Children.toArray(children).map((child, index) => {\n const isLast = index === count - 1;\n\n // Mark the current page for screen readers. A link child gets\n // aria-current directly (unless the consumer already set it);\n // anything else is marked on its wrapper.\n const content =\n isLast && React.isValidElement(child)\n ? React.cloneElement(child as React.ReactElement<any>, {\n \"aria-current\": (child.props as any)[\"aria-current\"] ?? \"page\",\n })\n : child;\n\n return (\n <span\n key={index}\n aria-current={\n isLast && !React.isValidElement(child) ? \"page\" : undefined\n }\n className={cn(\n \"flex items-center whitespace-nowrap text-text-xs\",\n linkBase,\n isLast\n ? \"text-gray-900 font-semibold\"\n : cn(\"text-gray-500 font-medium\", linkInteractive),\n )}\n >\n {content}\n {!isLast && (\n <span aria-hidden=\"true\" className=\"mx-0.5 text-gray-400\">\n {separator}\n </span>\n )}\n </span>\n );\n });\n\n return (\n <nav\n aria-label={ariaLabel}\n // flex-wrap lets long trails wrap on narrow screens instead of overflowing\n className={cn(\n \"flex flex-wrap items-center gap-y-1 text-text-xs text-gray-700 font-semibold\",\n containerClasses,\n )}\n >\n {items}\n </nav>\n );\n};\n\nexport default Breadcrumbs;\n","import React, { ButtonHTMLAttributes, MouseEvent, ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { cva, VariantProps } from \"class-variance-authority\";\n\ninterface ButtonProps\n extends\n ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n children?: ReactNode;\n startIcon?: JSX.Element;\n endIcon?: JSX.Element;\n disabled?: boolean;\n fullWidth?: boolean;\n type?: \"submit\" | \"reset\" | \"button\";\n /**\n * Optional. Shows a spinner and blocks clicks / form submission while true.\n * Defaults to false, so existing usages are unaffected.\n */\n loading?: boolean;\n /**\n * Optional. Where the spinner appears while `loading` is true.\n * \"start\" / \"end\" replace the matching icon (or add the spinner if there is\n * no icon). \"center\" overlays the spinner and keeps the button width stable.\n * Defaults to \"start\".\n */\n loadingPosition?: \"start\" | \"center\" | \"end\";\n /** Optional. Custom indicator shown instead of the default spinner. */\n loadingIndicator?: ReactNode;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Tone maps for the new \"soft\", \"ghost\" and \"link\" variants. */\n/* Class names are written out in full so Tailwind can detect them. */\n/* These pair with the solid intents (primary, success, error, ...). */\n/* -------------------------------------------------------------------------- */\n\ntype SolidIntent =\n | \"primary\"\n | \"success\"\n | \"error\"\n | \"warning\"\n | \"default\"\n | \"blue\"\n | \"bluegray\"\n | \"bluelight\"\n | \"indigo\"\n | \"purple\"\n | \"violet\"\n | \"pink\"\n | \"rose\"\n | \"orange\";\n\nconst softTones: Record<SolidIntent, string> = {\n primary:\n \"bg-primary-50 text-primary-700 border-primary-100 hover:bg-primary-100 hover:border-primary-200 hover:text-primary-800 active:bg-primary-200 active:border-primary-300\",\n success:\n \"bg-success-50 text-success-700 border-success-100 hover:bg-success-100 hover:border-success-200 hover:text-success-800 active:bg-success-200 active:border-success-300\",\n error:\n \"bg-error-50 text-error-700 border-error-100 hover:bg-error-100 hover:border-error-200 hover:text-error-800 active:bg-error-200 active:border-error-300\",\n warning:\n \"bg-warning-50 text-warning-700 border-warning-100 hover:bg-warning-100 hover:border-warning-200 hover:text-warning-800 active:bg-warning-200 active:border-warning-300\",\n default:\n \"bg-gray-100 text-gray-700 border-gray-200 hover:bg-gray-200 hover:border-gray-300 hover:text-gray-800 active:bg-gray-300 active:border-gray-300\",\n blue: \"bg-blue-50 text-blue-700 border-blue-100 hover:bg-blue-100 hover:border-blue-200 hover:text-blue-800 active:bg-blue-200 active:border-blue-300\",\n bluegray:\n \"bg-bluegray-50 text-bluegray-700 border-bluegray-100 hover:bg-bluegray-100 hover:border-bluegray-200 hover:text-bluegray-800 active:bg-bluegray-200 active:border-bluegray-300\",\n bluelight:\n \"bg-bluelight-50 text-bluelight-700 border-bluelight-100 hover:bg-bluelight-100 hover:border-bluelight-200 hover:text-bluelight-800 active:bg-bluelight-200 active:border-bluelight-300\",\n indigo:\n \"bg-indigo-50 text-indigo-700 border-indigo-100 hover:bg-indigo-100 hover:border-indigo-200 hover:text-indigo-800 active:bg-indigo-200 active:border-indigo-300\",\n purple:\n \"bg-purple-50 text-purple-700 border-purple-100 hover:bg-purple-100 hover:border-purple-200 hover:text-purple-800 active:bg-purple-200 active:border-purple-300\",\n violet:\n \"bg-violet-50 text-violet-700 border-violet-100 hover:bg-violet-100 hover:border-violet-200 hover:text-violet-800 active:bg-violet-200 active:border-violet-300\",\n pink: \"bg-pink-50 text-pink-700 border-pink-100 hover:bg-pink-100 hover:border-pink-200 hover:text-pink-800 active:bg-pink-200 active:border-pink-300\",\n rose: \"bg-rose-50 text-rose-700 border-rose-100 hover:bg-rose-100 hover:border-rose-200 hover:text-rose-800 active:bg-rose-200 active:border-rose-300\",\n orange:\n \"bg-orange-50 text-orange-700 border-orange-100 hover:bg-orange-100 hover:border-orange-200 hover:text-orange-800 active:bg-orange-200 active:border-orange-300\",\n};\n\nconst ghostReset =\n \"bg-transparent border-transparent hover:border-transparent active:border-transparent\";\n\nconst ghostTones: Record<SolidIntent, string> = {\n primary: \"text-primary-700 hover:bg-primary-50 active:bg-primary-100\",\n success: \"text-success-700 hover:bg-success-50 active:bg-success-100\",\n error: \"text-error-700 hover:bg-error-50 active:bg-error-100\",\n warning: \"text-warning-700 hover:bg-warning-50 active:bg-warning-100\",\n default: \"text-gray-700 hover:bg-gray-100 active:bg-gray-200\",\n blue: \"text-blue-700 hover:bg-blue-50 active:bg-blue-100\",\n bluegray: \"text-bluegray-700 hover:bg-bluegray-50 active:bg-bluegray-100\",\n bluelight: \"text-bluelight-700 hover:bg-bluelight-50 active:bg-bluelight-100\",\n indigo: \"text-indigo-700 hover:bg-indigo-50 active:bg-indigo-100\",\n purple: \"text-purple-700 hover:bg-purple-50 active:bg-purple-100\",\n violet: \"text-violet-700 hover:bg-violet-50 active:bg-violet-100\",\n pink: \"text-pink-700 hover:bg-pink-50 active:bg-pink-100\",\n rose: \"text-rose-700 hover:bg-rose-50 active:bg-rose-100\",\n orange: \"text-orange-700 hover:bg-orange-50 active:bg-orange-100\",\n};\n\nconst linkReset =\n \"bg-transparent border-transparent hover:bg-transparent active:bg-transparent hover:border-transparent active:border-transparent\";\n\nconst linkTones: Record<SolidIntent, string> = {\n primary: \"text-primary-700 hover:text-primary-800 active:text-primary-900\",\n success: \"text-success-700 hover:text-success-800 active:text-success-900\",\n error: \"text-error-700 hover:text-error-800 active:text-error-900\",\n warning: \"text-warning-700 hover:text-warning-800 active:text-warning-900\",\n default: \"text-gray-700 hover:text-gray-800 active:text-gray-900\",\n blue: \"text-blue-700 hover:text-blue-800 active:text-blue-900\",\n bluegray:\n \"text-bluegray-700 hover:text-bluegray-800 active:text-bluegray-900\",\n bluelight:\n \"text-bluelight-700 hover:text-bluelight-800 active:text-bluelight-900\",\n indigo: \"text-indigo-700 hover:text-indigo-800 active:text-indigo-900\",\n purple: \"text-purple-700 hover:text-purple-800 active:text-purple-900\",\n violet: \"text-violet-700 hover:text-violet-800 active:text-violet-900\",\n pink: \"text-pink-700 hover:text-pink-800 active:text-pink-900\",\n rose: \"text-rose-700 hover:text-rose-800 active:text-rose-900\",\n orange: \"text-orange-700 hover:text-orange-800 active:text-orange-900\",\n};\n\nconst solidIntents = Object.keys(softTones) as SolidIntent[];\n\nconst buttonVariants = cva(\n [\n // layout & typography\n \"rounded-xl font-semibold tracking-[-0.005em] select-none touch-manipulation\",\n // interaction\n \"cursor-pointer disabled:select-none\",\n \"transition-[background-color,border-color,color,box-shadow,transform] duration-200 ease-out\",\n \"hover:-translate-y-px active:translate-y-0 active:scale-[0.98]\",\n \"motion-reduce:transition-none motion-reduce:transform-none motion-reduce:hover:transform-none motion-reduce:active:transform-none\",\n // elevation\n \"shadow-sm hover:shadow-md active:shadow-sm disabled:shadow-none\",\n // focus (ring colour is refined per intent below)\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n ],\n {\n variants: {\n variant: {\n filled:\n \"bg-primary-600 text-white active:bg-primary-900 active:border-primary-900 hover:bg-primary-700 hover:border-primary-700 border border-primary-600 shadow-[inset_0_1px_0_0_rgb(255_255_255/0.18),0_1px_2px_0_rgb(16_24_40/0.08)] hover:shadow-[inset_0_1px_0_0_rgb(255_255_255/0.18),0_4px_10px_-2px_rgb(16_24_40/0.18)] active:shadow-[inset_0_1px_2px_0_rgb(0_0_0/0.2)] disabled:opacity-[30%] disabled:pointer-events-none\",\n outlined:\n \"border border-primary-600 bg-white disabled:opacity-[30%] disabled:pointer-events-none text-primary-600 hover:bg-primary-100 active:bg-primary-200 active:border-primary-700\",\n // New, additive variants. Pair with the solid intents.\n soft: \"border border-primary-100 bg-primary-50 text-primary-700 hover:bg-primary-100 hover:border-primary-200 active:bg-primary-200 active:border-primary-300 shadow-none hover:shadow-none active:shadow-none hover:translate-y-0 disabled:opacity-[30%] disabled:pointer-events-none\",\n ghost:\n \"border border-transparent bg-transparent text-primary-700 hover:bg-primary-50 active:bg-primary-100 shadow-none hover:shadow-none active:shadow-none hover:translate-y-0 disabled:opacity-[30%] disabled:pointer-events-none\",\n link: \"border border-transparent bg-transparent text-primary-700 hover:text-primary-800 active:text-primary-900 hover:underline underline-offset-4 shadow-none hover:shadow-none active:shadow-none hover:translate-y-0 active:scale-100 disabled:opacity-[30%] disabled:pointer-events-none\",\n },\n intent: {\n primary:\n \"bg-primary-600 border-primary-600 active:bg-primary-900 active:border-primary-900 hover:bg-primary-700 hover:border-primary-700 focus-visible:ring-primary-500\",\n success:\n \"bg-success-600 border-success-600 active:bg-success-900 active:border-success-900 hover:bg-success-700 hover:border-success-700 focus-visible:ring-success-500\",\n error:\n \"bg-error-700 border-error-700 active:bg-error-900 active:border-error-900 hover:bg-error-800 hover:border-error-800 focus-visible:ring-error-500\",\n warning:\n \"bg-warning-600 border-warning-600 active:bg-warning-900 active:border-warning-900 hover:bg-warning-700 hover:border-warning-700 focus-visible:ring-warning-500\",\n default:\n \"bg-gray-600 border-gray-600 active:bg-gray-900 active:border-gray-900 hover:bg-gray-700 hover:border-gray-700 focus-visible:ring-gray-500\",\n blue: \"bg-blue-600 border-blue-600 active:bg-blue-900 active:border-blue-900 hover:bg-blue-700 hover:border-blue-700 focus-visible:ring-blue-500\",\n bluegray:\n \"bg-bluegray-600 border-bluegray-600 active:bg-bluegray-900 active:border-bluegray-900 hover:bg-bluegray-700 hover:border-bluegray-700 focus-visible:ring-bluegray-500\",\n bluelight:\n \"bg-bluelight-600 border-bluelight-600 active:bg-bluelight-900 active:border-bluelight-900 hover:bg-bluelight-700 hover:border-bluelight-700 focus-visible:ring-bluelight-500\",\n indigo:\n \"bg-indigo-600 border-indigo-600 active:bg-indigo-900 active:border-indigo-900 hover:bg-indigo-700 hover:border-indigo-700 focus-visible:ring-indigo-500\",\n purple:\n \"bg-purple-600 border-purple-600 active:bg-purple-900 active:border-purple-900 hover:bg-purple-700 hover:border-purple-700 focus-visible:ring-purple-500\",\n violet:\n \"bg-violet-600 border-violet-600 active:bg-violet-900 active:border-violet-900 hover:bg-violet-700 hover:border-violet-700 focus-visible:ring-violet-500\",\n pink: \"bg-pink-600 border-pink-600 active:bg-pink-900 active:border-pink-900 hover:bg-pink-700 hover:border-pink-700 focus-visible:ring-pink-500\",\n rose: \"bg-rose-600 border-rose-600 active:bg-rose-900 active:border-rose-900 hover:bg-rose-700 hover:border-rose-700 focus-visible:ring-rose-500\",\n orange:\n \"bg-orange-600 border-orange-600 active:bg-orange-900 active:border-orange-900 hover:bg-orange-700 hover:border-orange-700 focus-visible:ring-orange-500\",\n \"primary-outlined\":\n \"border-primary-600 text-primary-600 hover:bg-primary-100 active:bg-primary-200 active:border-primary-700 focus-visible:ring-primary-500\",\n \"success-outlined\":\n \"border-success-600 text-success-600 hover:bg-success-50 hover:border-success-700 hover:text-success-700 active:bg-success-100 active:text-success-900 active:border-success-900 focus-visible:ring-success-500\",\n \"error-outlined\":\n \"border-error-700 text-error-700 hover:bg-error-100 hover:border-error-700 hover:text-error-700 active:bg-error-200 active:text-error-700 active:border-error-800 focus-visible:ring-error-500\",\n \"warning-outlined\":\n \"border-warning-500 text-warning-500 hover:bg-warning-50 hover:border-warning-600 hover:text-warning-600 active:bg-warning-100 active:text-warning-700 active:border-warning-700 focus-visible:ring-warning-500\",\n \"default-outlined\":\n \"border-gray-700 text-gray-700 hover:bg-gray-100 hover:border-gray-700 hover:text-gray-700 active:bg-gray-300 active:text-gray-800 active:border-gray-800 focus-visible:ring-gray-500\",\n \"blue-outlined\":\n \"border-blue-600 text-blue-600 hover:bg-blue-50 hover:border-blue-700 hover:text-blue-700 active:bg-blue-100 active:text-blue-900 active:border-blue-900 focus-visible:ring-blue-500\",\n \"bluegray-outlined\":\n \"border-bluegray-600 text-bluegray-600 hover:bg-bluegray-50 hover:border-bluegray-700 hover:text-bluegray-700 active:bg-bluegray-100 active:text-bluegray-900 active:border-bluegray-900 focus-visible:ring-bluegray-500\",\n \"bluelight-outlined\":\n \"border-bluelight-600 text-bluelight-600 hover:bg-bluelight-50 hover:border-bluelight-700 hover:text-bluelight-700 active:bg-bluelight-100 active:text-bluelight-900 active:border-bluelight-900 focus-visible:ring-bluelight-500\",\n \"indigo-outlined\":\n \"border-indigo-600 text-indigo-600 hover:bg-indigo-50 hover:border-indigo-700 hover:text-indigo-700 active:bg-indigo-100 active:text-indigo-900 active:border-indigo-900 focus-visible:ring-indigo-500\",\n \"purple-outlined\":\n \"border-purple-600 text-purple-600 hover:bg-purple-50 hover:border-purple-700 hover:text-purple-700 active:bg-purple-100 active:text-purple-900 active:border-purple-900 focus-visible:ring-purple-500\",\n \"violet-outlined\":\n \"border-violet-600 text-violet-600 hover:bg-violet-50 hover:border-violet-700 hover:text-violet-700 active:bg-violet-100 active:text-violet-900 active:border-violet-900 focus-visible:ring-violet-500\",\n \"pink-outlined\":\n \"border-pink-600 text-pink-600 hover:bg-pink-50 hover:border-pink-700 hover:text-pink-700 active:bg-pink-100 active:text-pink-900 active:border-pink-900 focus-visible:ring-pink-500\",\n \"rose-outlined\":\n \"border-rose-600 text-rose-600 hover:bg-rose-50 hover:border-rose-700 hover:text-rose-700 active:bg-rose-100 active:text-rose-900 active:border-rose-900 focus-visible:ring-rose-500\",\n \"orange-outlined\":\n \"border-orange-600 text-orange-600 hover:bg-orange-50 hover:border-orange-700 hover:text-orange-700 active:bg-orange-100 active:text-orange-900 active:border-orange-900 focus-visible:ring-orange-500\",\n },\n size: {\n // xs and xl are new, additive sizes. sm / md / lg are unchanged.\n xs: \"text-xs px-3 py-1.5\",\n sm: \"text-sm px-3.5 py-2\",\n md: \"text-sm px-4 py-2.5\",\n lg: \"text-base px-[18px] py-2.5\",\n xl: \"text-base px-5 py-3\",\n },\n // New, optional. Square button for a single icon. Needs an aria-label.\n iconOnly: {\n true: \"aspect-square\",\n false: \"\",\n },\n },\n compoundVariants: [\n // icon-only padding per size (overrides the horizontal/vertical padding)\n { iconOnly: true, size: \"xs\", className: \"p-1.5\" },\n { iconOnly: true, size: \"sm\", className: \"p-2\" },\n { iconOnly: true, size: \"md\", className: \"p-2.5\" },\n { iconOnly: true, size: \"lg\", className: \"p-3\" },\n { iconOnly: true, size: \"xl\", className: \"p-3.5\" },\n // per-intent colours for the new variants\n ...solidIntents.map((intent) => ({\n variant: \"soft\" as const,\n intent,\n className: softTones[intent],\n })),\n ...solidIntents.map((intent) => ({\n variant: \"ghost\" as const,\n intent,\n className: `${ghostReset} ${ghostTones[intent]}`,\n })),\n ...solidIntents.map((intent) => ({\n variant: \"link\" as const,\n intent,\n className: `${linkReset} ${linkTones[intent]}`,\n })),\n ],\n defaultVariants: {\n variant: \"filled\",\n size: \"sm\",\n },\n },\n);\n\nconst iconWrapper = \"inline-flex shrink-0 items-center\";\n\n// Sized in em so it scales with the button's font size.\nconst Spinner = () => (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className=\"h-[1.15em] w-[1.15em] shrink-0 animate-spin motion-reduce:animate-none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M21 12a9 9 0 0 0-9-9\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n variant,\n intent,\n fullWidth = false,\n startIcon,\n disabled,\n endIcon,\n size,\n iconOnly,\n type = \"button\",\n loading = false,\n loadingPosition = \"start\",\n loadingIndicator,\n onClick,\n ...props\n },\n ref,\n ) => {\n // While loading the button stays natively enabled (so it keeps its normal\n // colours and focus), but clicks and form submission are blocked.\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n const indicator = (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {loadingIndicator ?? <Spinner />}\n </span>\n );\n\n const startNode =\n loading && loadingPosition === \"start\"\n ? indicator\n : startIcon && (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {startIcon}\n </span>\n );\n\n const endNode =\n loading && loadingPosition === \"end\"\n ? indicator\n : endIcon && (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {endIcon}\n </span>\n );\n\n const isCenterLoading = loading && loadingPosition === \"center\";\n\n return (\n <button\n {...props}\n ref={ref}\n onClick={handleClick}\n disabled={disabled}\n aria-disabled={loading ? true : disabled}\n aria-busy={loading || undefined}\n type={type}\n className={cn(\n fullWidth && \"w-full\",\n buttonVariants({ intent, className, variant, size, iconOnly }),\n \"flex items-center text-center justify-center gap-2\",\n loading && \"cursor-wait hover:translate-y-0 active:scale-100\",\n isCenterLoading && \"relative\",\n )}\n >\n {isCenterLoading ? (\n <>\n {/* opacity-0 (not invisible) keeps the label in the accessibility tree */}\n <span className=\"inline-flex items-center justify-center gap-2 opacity-0\">\n {startIcon && <span className={iconWrapper}>{startIcon}</span>}\n {children}\n {endIcon && <span className={iconWrapper}>{endIcon}</span>}\n </span>\n <span className=\"absolute inset-0 flex items-center justify-center\">\n {indicator}\n </span>\n </>\n ) : (\n <>\n {startNode}\n {children}\n {endNode}\n </>\n )}\n </button>\n );\n },\n);\n\nButton.displayName = \"Button\";\n\nexport type { ButtonProps };\nexport { buttonVariants };\nexport default Button;\n","\"use client\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { RiArrowLeftSLine, RiArrowRightSLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface CalendarRange {\n start: Date | null;\n end: Date | null;\n}\n\ninterface CalendarBaseProps {\n /** Optional. Visible month (controlled). Any day inside the month works. */\n month?: Date;\n /** Optional. Initial visible month (uncontrolled). Defaults to the selected date or today. */\n defaultMonth?: Date;\n /** Optional. Called when the user navigates to another month. */\n onMonthChange?: (month: Date) => void;\n /** Optional. Earliest selectable date (inclusive). */\n min?: Date;\n /** Optional. Latest selectable date (inclusive). */\n max?: Date;\n /** Optional. Return true to make a date unselectable. */\n isDateDisabled?: (date: Date) => boolean;\n /** Optional. Days that get a small dot under the number (events, deadlines…). */\n markedDates?: Date[];\n /** Optional. Show 1 or 2 months side by side. Defaults to 1. */\n numberOfMonths?: 1 | 2;\n /** Optional. Show days of neighbouring months (single-month view only). Defaults to true. */\n showOutsideDays?: boolean;\n /** Optional. First day of the week: 0 = Sunday, 1 = Monday. Defaults to 0. */\n weekStartsOn?: 0 | 1;\n /** Optional. BCP 47 locale for month and weekday names. Defaults to \"en-US\". */\n locale?: string;\n className?: string;\n \"aria-label\"?: string;\n}\n\ninterface CalendarSingleProps extends CalendarBaseProps {\n mode?: \"single\";\n value?: Date | null;\n defaultValue?: Date | null;\n onChange?: (date: Date | null) => void;\n}\n\ninterface CalendarMultipleProps extends CalendarBaseProps {\n mode: \"multiple\";\n value?: Date[];\n defaultValue?: Date[];\n onChange?: (dates: Date[]) => void;\n}\n\ninterface CalendarRangeProps extends CalendarBaseProps {\n mode: \"range\";\n value?: CalendarRange;\n defaultValue?: CalendarRange;\n onChange?: (range: CalendarRange) => void;\n}\n\nexport type CalendarProps =\n | CalendarSingleProps\n | CalendarMultipleProps\n | CalendarRangeProps;\n\n/* ------------------------------ date helpers ------------------------------ */\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\nconst addDays = (d: Date, n: number) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\nconst addMonths = (d: Date, n: number) => {\n const t = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const last = new Date(t.getFullYear(), t.getMonth() + 1, 0).getDate();\n return new Date(t.getFullYear(), t.getMonth(), Math.min(d.getDate(), last));\n};\nconst sameDay = (a?: Date | null, b?: Date | null) =>\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\nconst key = (d: Date) =>\n `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\nconst monthIndex = (d: Date) => d.getFullYear() * 12 + d.getMonth();\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\nconst navButton = cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-lg text-gray-600\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-100 hover:text-gray-900 disabled:pointer-events-none disabled:opacity-30\",\n focusRing,\n);\n\ntype View = \"days\" | \"months\" | \"years\";\n\nconst Calendar = (props: CalendarProps) => {\n const {\n min,\n max,\n isDateDisabled,\n markedDates,\n numberOfMonths = 1,\n showOutsideDays = true,\n weekStartsOn = 0,\n locale = \"en-US\",\n className,\n \"aria-label\": ariaLabel = \"Calendar\",\n } = props;\n const mode = props.mode ?? \"single\";\n const today = useMemo(() => startOfDay(new Date()), []);\n\n /* ----- value (controlled or not) ----- */\n const [innerSingle, setInnerSingle] = useState<Date | null>(\n mode === \"single\" ? ((props.defaultValue as Date | null | undefined) ?? null) : null,\n );\n const [innerMulti, setInnerMulti] = useState<Date[]>(\n mode === \"multiple\" ? ((props.defaultValue as Date[] | undefined) ?? []) : [],\n );\n const [innerRange, setInnerRange] = useState<CalendarRange>(\n mode === \"range\"\n ? ((props.defaultValue as CalendarRange | undefined) ?? { start: null, end: null })\n : { start: null, end: null },\n );\n const single = mode === \"single\" ? (props.value !== undefined ? (props.value as Date | null) : innerSingle) : null;\n const multi = mode === \"multiple\" ? (props.value !== undefined ? (props.value as Date[]) : innerMulti) : [];\n const range: CalendarRange =\n mode === \"range\"\n ? props.value !== undefined\n ? (props.value as CalendarRange)\n : innerRange\n : { start: null, end: null };\n\n /* ----- navigation state ----- */\n const anchor =\n props.defaultMonth ??\n (mode === \"single\" ? single : mode === \"range\" ? range.start : multi[0]) ??\n today;\n const [innerMonth, setInnerMonth] = useState<Date>(\n new Date(anchor.getFullYear(), anchor.getMonth(), 1),\n );\n const viewMonth = props.month\n ? new Date(props.month.getFullYear(), props.month.getMonth(), 1)\n : innerMonth;\n const [view, setView] = useState<View>(\"days\");\n const [focused, setFocused] = useState<Date>(startOfDay(anchor));\n const [hover, setHover] = useState<Date | null>(null);\n const shouldFocus = useRef(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const goMonth = useCallback(\n (d: Date) => {\n const first = new Date(d.getFullYear(), d.getMonth(), 1);\n if (!props.month) setInnerMonth(first);\n props.onMonthChange?.(first);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [props.month, props.onMonthChange],\n );\n\n const disabledDay = useCallback(\n (d: Date) => {\n const day = startOfDay(d);\n if (min && day < startOfDay(min)) return true;\n if (max && day > startOfDay(max)) return true;\n return !!isDateDisabled?.(day);\n },\n [min, max, isDateDisabled],\n );\n\n const marked = useMemo(() => new Set((markedDates ?? []).map(key)), [markedDates]);\n\n /* ----- selection ----- */\n const select = (d: Date) => {\n if (disabledDay(d)) return;\n const day = startOfDay(d);\n if (mode === \"single\") {\n const p = props as CalendarSingleProps;\n if (p.value === undefined) setInnerSingle(day);\n p.onChange?.(day);\n } else if (mode === \"multiple\") {\n const p = props as CalendarMultipleProps;\n const exists = multi.some((x) => sameDay(x, day));\n const next = exists ? multi.filter((x) => !sameDay(x, day)) : [...multi, day];\n if (p.value === undefined) setInnerMulti(next);\n p.onChange?.(next);\n } else {\n const p = props as CalendarRangeProps;\n let next: CalendarRange;\n if (!range.start || range.end) next = { start: day, end: null };\n else\n next =\n day < range.start\n ? { start: day, end: range.start }\n : { start: range.start, end: day };\n if (p.value === undefined) setInnerRange(next);\n p.onChange?.(next);\n }\n };\n\n /* ----- keyboard ----- */\n const moveFocus = (next: Date) => {\n shouldFocus.current = true;\n const clamped = (() => {\n const day = startOfDay(next);\n if (min && day < startOfDay(min)) return startOfDay(min);\n if (max && day > startOfDay(max)) return startOfDay(max);\n return day;\n })();\n setFocused(clamped);\n const diff = monthIndex(clamped) - monthIndex(viewMonth);\n if (diff < 0) goMonth(clamped);\n else if (diff >= numberOfMonths) goMonth(addMonths(clamped, -(numberOfMonths - 1)));\n };\n\n const onGridKeyDown = (e: React.KeyboardEvent) => {\n const offset = (focused.getDay() - weekStartsOn + 7) % 7;\n let next: Date;\n switch (e.key) {\n case \"ArrowLeft\": next = addDays(focused, -1); break;\n case \"ArrowRight\": next = addDays(focused, 1); break;\n case \"ArrowUp\": next = addDays(focused, -7); break;\n case \"ArrowDown\": next = addDays(focused, 7); break;\n case \"Home\": next = addDays(focused, -offset); break;\n case \"End\": next = addDays(focused, 6 - offset); break;\n case \"PageUp\": next = addMonths(focused, e.shiftKey ? -12 : -1); break;\n case \"PageDown\": next = addMonths(focused, e.shiftKey ? 12 : 1); break;\n default: return;\n }\n e.preventDefault();\n moveFocus(next);\n };\n\n useEffect(() => {\n if (!shouldFocus.current || view !== \"days\") return;\n shouldFocus.current = false;\n rootRef.current\n ?.querySelector<HTMLButtonElement>(`[data-date=\"${key(focused)}\"]`)\n ?.focus();\n }, [focused, viewMonth, view]);\n\n /* ----- labels ----- */\n const weekdays = useMemo(() => {\n const short = new Intl.DateTimeFormat(locale, { weekday: \"short\" });\n const long = new Intl.DateTimeFormat(locale, { weekday: \"long\" });\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(2023, 0, 1 + ((i + weekStartsOn) % 7));\n return { short: short.format(d).slice(0, 2), long: long.format(d) };\n });\n }, [locale, weekStartsOn]);\n const monthFmt = new Intl.DateTimeFormat(locale, { month: \"long\", year: \"numeric\" });\n const fullDate = new Intl.DateTimeFormat(locale, { dateStyle: \"full\" });\n const yearPageStart = Math.floor(viewMonth.getFullYear() / 12) * 12;\n\n /* ----- range preview ----- */\n const previewEnd = mode === \"range\" ? (range.end ?? (range.start ? hover : null)) : null;\n const lo = mode === \"range\" && range.start && previewEnd ? (range.start < previewEnd ? range.start : previewEnd) : null;\n const hi = mode === \"range\" && range.start && previewEnd ? (range.start < previewEnd ? previewEnd : range.start) : null;\n\n const isSelected = (d: Date) =>\n mode === \"single\"\n ? sameDay(d, single)\n : mode === \"multiple\"\n ? multi.some((x) => sameDay(x, d))\n : sameDay(d, lo ?? range.start) || sameDay(d, hi);\n const inRange = (d: Date) => !!lo && !!hi && startOfDay(d) > lo && startOfDay(d) < hi;\n\n const weeksOf = (m: Date) => {\n const first = new Date(m.getFullYear(), m.getMonth(), 1);\n const offset = (first.getDay() - weekStartsOn + 7) % 7;\n const start = addDays(first, -offset);\n return Array.from({ length: 6 }, (_, w) =>\n Array.from({ length: 7 }, (_, d) => addDays(start, w * 7 + d)),\n );\n };\n\n const months = Array.from({ length: numberOfMonths }, (_, i) => addMonths(viewMonth, i));\n\n const headerLabel =\n view === \"days\"\n ? numberOfMonths === 1\n ? monthFmt.format(viewMonth)\n : `${monthFmt.format(months[0])} – ${monthFmt.format(months[numberOfMonths - 1])}`\n : view === \"months\"\n ? String(viewMonth.getFullYear())\n : `${yearPageStart} – ${yearPageStart + 11}`;\n\n const step = view === \"days\" ? 1 : view === \"months\" ? 12 : 144;\n\n return (\n <div\n ref={rootRef}\n role=\"group\"\n aria-label={ariaLabel}\n className={cn(\n \"inline-block rounded-xl border border-gray-200 bg-white p-3\",\n numberOfMonths === 2 ? \"w-[600px] max-w-full\" : \"w-[296px]\",\n className,\n )}\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n className={navButton}\n aria-label={view === \"days\" ? \"Previous month\" : view === \"months\" ? \"Previous year\" : \"Previous years\"}\n onClick={() => goMonth(addMonths(viewMonth, -step))}\n >\n <RiArrowLeftSLine size={18} aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n aria-live=\"polite\"\n onClick={() => setView(view === \"days\" ? \"months\" : view === \"months\" ? \"years\" : \"days\")}\n className={cn(\"rounded-lg px-2 py-1 text-sm font-semibold text-gray-900 hover:bg-gray-100\", focusRing)}\n >\n {headerLabel}\n </button>\n <button\n type=\"button\"\n className={navButton}\n aria-label={view === \"days\" ? \"Next month\" : view === \"months\" ? \"Next year\" : \"Next years\"}\n onClick={() => goMonth(addMonths(viewMonth, step))}\n >\n <RiArrowRightSLine size={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n {view === \"days\" && (\n <div\n className={cn(\"grid gap-4\", numberOfMonths === 2 ? \"grid-cols-2\" : \"grid-cols-1\")}\n onKeyDown={onGridKeyDown}\n onMouseLeave={() => setHover(null)}\n >\n {months.map((m) => (\n <div key={key(m)} role=\"grid\" aria-label={monthFmt.format(m)}>\n {numberOfMonths > 1 && (\n <p className=\"mb-1 text-center text-xs font-medium text-gray-500\">{monthFmt.format(m)}</p>\n )}\n <div role=\"row\" className=\"mb-1 grid grid-cols-7\">\n {weekdays.map((w) => (\n <div key={w.long} role=\"columnheader\" aria-label={w.long} className=\"flex h-8 items-center justify-center text-xs font-medium text-gray-500\">\n {w.short}\n </div>\n ))}\n </div>\n {weeksOf(m).map((week, wi) => (\n <div key={wi} role=\"row\" className=\"grid grid-cols-7\">\n {week.map((d) => {\n const outside = d.getMonth() !== m.getMonth();\n if (outside && (!showOutsideDays || numberOfMonths > 1))\n return <div key={key(d)} role=\"gridcell\" className=\"h-10\" />;\n const off = disabledDay(d);\n const sel = isSelected(d);\n const mid = inRange(d);\n const isToday = sameDay(d, today);\n return (\n <div\n key={key(d)}\n role=\"gridcell\"\n aria-selected={sel || mid || undefined}\n className={cn(\n \"flex items-center justify-center py-0.5\",\n mid && \"bg-primary-50\",\n mode === \"range\" && hi && lo && !sameDay(lo, hi) && sameDay(d, lo) && \"rounded-l-full bg-primary-50\",\n mode === \"range\" && hi && lo && !sameDay(lo, hi) && sameDay(d, hi) && \"rounded-r-full bg-primary-50\",\n )}\n >\n <button\n type=\"button\"\n data-date={key(d)}\n tabIndex={sameDay(d, focused) ? 0 : -1}\n disabled={off}\n aria-label={fullDate.format(d) + (marked.has(key(d)) ? \", has events\" : \"\")}\n aria-current={isToday ? \"date\" : undefined}\n onClick={() => {\n setFocused(startOfDay(d));\n select(d);\n }}\n onMouseEnter={() => setHover(startOfDay(d))}\n onFocus={() => {\n if (!sameDay(d, focused)) setFocused(startOfDay(d));\n }}\n className={cn(\n \"relative inline-flex h-9 w-9 items-center justify-center rounded-full text-sm\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n sel\n ? \"bg-primary-600 font-semibold text-white hover:bg-primary-700\"\n : outside\n ? \"text-gray-400 hover:bg-gray-100\"\n : \"text-gray-900 hover:bg-gray-100\",\n !sel && isToday && \"border border-primary-600 font-semibold text-primary-700\",\n off && \"pointer-events-none text-gray-300 line-through hover:bg-transparent\",\n )}\n >\n {d.getDate()}\n {marked.has(key(d)) && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute bottom-1 h-1 w-1 rounded-full\",\n sel ? \"bg-white\" : \"bg-primary-600\",\n )}\n />\n )}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {view === \"months\" && (\n <div className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, i) => {\n const label = new Intl.DateTimeFormat(locale, { month: \"short\" }).format(new Date(2023, i, 1));\n const first = new Date(viewMonth.getFullYear(), i, 1);\n const last = new Date(viewMonth.getFullYear(), i + 1, 0);\n const off = (!!min && last < startOfDay(min)) || (!!max && first > startOfDay(max));\n const current = i === viewMonth.getMonth();\n return (\n <button\n key={i}\n type=\"button\"\n disabled={off}\n onClick={() => {\n goMonth(first);\n setFocused(new Date(first.getFullYear(), i, Math.min(focused.getDate(), last.getDate())));\n setView(\"days\");\n }}\n className={cn(\n \"h-10 rounded-lg text-sm transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n current ? \"bg-primary-600 font-semibold text-white\" : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n )}\n\n {view === \"years\" && (\n <div className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, i) => {\n const y = yearPageStart + i;\n const off = (!!min && y < min.getFullYear()) || (!!max && y > max.getFullYear());\n return (\n <button\n key={y}\n type=\"button\"\n disabled={off}\n onClick={() => {\n goMonth(new Date(y, viewMonth.getMonth(), 1));\n setView(\"months\");\n }}\n className={cn(\n \"h-10 rounded-lg text-sm transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n y === viewMonth.getFullYear() ? \"bg-primary-600 font-semibold text-white\" : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n )}\n >\n {y}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nCalendar.displayName = \"Calendar\";\n\nexport default Calendar;\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport React, { ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\n\nconst calloutVariants = cva(\n // Every callout now has a 1px border (filled ones use a faint tint of their\n // own colour), so filled and outlined callouts have the same height.\n \"py-3 px-4 font-medium rounded-xl border\",\n {\n variants: {\n variant: {\n filled: \"\",\n outlined: \"\",\n },\n intent: {\n primary: \"\",\n warning: \"\",\n error: \"\",\n success: \"\",\n default: \"\",\n },\n size: {\n xs: \"text-xs\",\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n },\n },\n compoundVariants: [\n // Text uses the 700 shade for readable contrast on the pale backgrounds\n // (600 on warning-50 in particular was low contrast).\n {\n variant: \"filled\",\n intent: \"primary\",\n className: \"bg-primary-50 border-primary-100 text-primary-700\",\n },\n {\n variant: \"outlined\",\n intent: \"primary\",\n className: \"border-primary-300 text-primary-700 bg-transparent\",\n },\n\n {\n variant: \"filled\",\n intent: \"warning\",\n className: \"bg-warning-50 border-warning-100 text-warning-700\",\n },\n {\n variant: \"outlined\",\n intent: \"warning\",\n className: \"border-warning-300 text-warning-700 bg-transparent\",\n },\n\n {\n variant: \"filled\",\n intent: \"error\",\n className: \"bg-error-50 border-error-100 text-error-700\",\n },\n {\n variant: \"outlined\",\n intent: \"error\",\n className: \"border-error-300 text-error-700 bg-transparent\",\n },\n\n {\n variant: \"filled\",\n intent: \"success\",\n className: \"bg-success-50 border-success-100 text-success-700\",\n },\n {\n variant: \"outlined\",\n intent: \"success\",\n className: \"border-success-300 text-success-700 bg-transparent\",\n },\n\n {\n variant: \"filled\",\n intent: \"default\",\n className: \"bg-gray-50 border-gray-100 text-gray-700\",\n },\n {\n variant: \"outlined\",\n intent: \"default\",\n className: \"border-gray-300 text-gray-700 bg-transparent\",\n },\n ],\n defaultVariants: {\n variant: \"filled\",\n intent: \"primary\",\n size: \"sm\",\n },\n },\n);\n\ninterface CalloutProps extends VariantProps<typeof calloutVariants> {\n children: ReactNode;\n startIcon?: JSX.Element;\n endIcon?: JSX.Element;\n className?: string;\n}\n\nconst Callout: React.FC<CalloutProps> = ({\n children,\n variant,\n intent,\n size,\n startIcon,\n endIcon,\n className,\n}) => {\n return (\n <div\n role=\"alert\"\n className={cn(\n calloutVariants({ variant, intent, size }),\n \"flex items-center justify-between gap-3\",\n className,\n )}\n >\n {/* min-w-0 lets long text wrap instead of pushing the end icon out */}\n <div className=\"flex min-w-0 items-center gap-2\">\n {startIcon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0\">\n {startIcon}\n </span>\n )}\n {children}\n </div>\n {/* not aria-hidden: the end slot may hold a button */}\n {endIcon && <span className=\"inline-flex shrink-0\">{endIcon}</span>}\n </div>\n );\n};\n\nexport default Callout;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\n// Every part now also accepts the native attributes of its element (id,\n// aria-*, data-*, onClick...). children and className are unchanged.\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardActionProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport default function Card({ children, className, ...props }: CardProps) {\n return (\n <div\n {...props}\n className={cn(\n // same radius, border and shadow family as Modal, Accordion and Dropdown\n \"bg-white rounded-xl border border-gray-200 shadow-sm\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nexport const CardHeader: React.FC<CardHeaderProps> = ({\n children,\n className,\n ...props\n}) => {\n // The header used 16px side padding while the content and footer used 24px,\n // so their text did not line up. All three now share 24px.\n return (\n <div {...props} className={cn(\"px-6 pt-6 pb-4\", className)}>\n {children}\n </div>\n );\n};\n\nexport const CardTitle: React.FC<CardTitleProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <h3\n {...props}\n className={cn(\n \"text-lg font-semibold leading-7 tracking-tight text-gray-900 mb-1\",\n className,\n )}\n >\n {children}\n </h3>\n );\n};\n\nexport const CardDescription: React.FC<CardDescriptionProps> = ({\n children,\n className,\n ...props\n}) => {\n // No bottom margin: the header's padding (and CardAction's own top margin)\n // set the spacing, so a description no longer doubles the gap to the content.\n return (\n <p {...props} className={cn(\"text-sm leading-5 text-gray-600\", className)}>\n {children}\n </p>\n );\n};\n\nexport const CardAction: React.FC<CardActionProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <div {...props} className={cn(\"mt-4\", className)}>\n {children}\n </div>\n );\n};\n\nexport const CardContent: React.FC<CardContentProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <div {...props} className={cn(\"px-6 pb-6 pt-0\", className)}>\n {children}\n </div>\n );\n};\n\nexport const CardFooter: React.FC<CardFooterProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <div {...props} className={cn(\"px-6 pb-6 pt-0\", className)}>\n {children}\n </div>\n );\n};\n","import React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { cva, VariantProps } from \"class-variance-authority\";\n\n/* -------------------------------------------------------------------------- */\n/* Per-intent styles. Class names are written out in full so Tailwind can */\n/* detect them. `primary` is the default, so existing checkboxes stay in the */\n/* primary colour family. Checked: solid fill, one shade darker on hover. */\n/* Unchecked hover: a light tint of the intent. The focus ring follows the */\n/* intent. `checked:hover:` is used so the hover tint never overrides the */\n/* checked fill. */\n/* -------------------------------------------------------------------------- */\nconst intentClasses = {\n primary:\n \"hover:bg-primary-50 checked:border-primary-600 checked:bg-primary-600 checked:hover:border-primary-700 checked:hover:bg-primary-700 focus-visible:ring-primary-500\",\n success:\n \"hover:bg-success-50 checked:border-success-600 checked:bg-success-600 checked:hover:border-success-700 checked:hover:bg-success-700 focus-visible:ring-success-500\",\n error:\n \"hover:bg-error-50 checked:border-error-600 checked:bg-error-600 checked:hover:border-error-700 checked:hover:bg-error-700 focus-visible:ring-error-500\",\n warning:\n \"hover:bg-warning-50 checked:border-warning-600 checked:bg-warning-600 checked:hover:border-warning-700 checked:hover:bg-warning-700 focus-visible:ring-warning-500\",\n default:\n \"hover:bg-gray-100 checked:border-gray-700 checked:bg-gray-700 checked:hover:border-gray-800 checked:hover:bg-gray-800 focus-visible:ring-gray-500\",\n blue: \"hover:bg-blue-50 checked:border-blue-600 checked:bg-blue-600 checked:hover:border-blue-700 checked:hover:bg-blue-700 focus-visible:ring-blue-500\",\n bluegray:\n \"hover:bg-bluegray-50 checked:border-bluegray-600 checked:bg-bluegray-600 checked:hover:border-bluegray-700 checked:hover:bg-bluegray-700 focus-visible:ring-bluegray-500\",\n bluelight:\n \"hover:bg-bluelight-50 checked:border-bluelight-600 checked:bg-bluelight-600 checked:hover:border-bluelight-700 checked:hover:bg-bluelight-700 focus-visible:ring-bluelight-500\",\n indigo:\n \"hover:bg-indigo-50 checked:border-indigo-600 checked:bg-indigo-600 checked:hover:border-indigo-700 checked:hover:bg-indigo-700 focus-visible:ring-indigo-500\",\n purple:\n \"hover:bg-purple-50 checked:border-purple-600 checked:bg-purple-600 checked:hover:border-purple-700 checked:hover:bg-purple-700 focus-visible:ring-purple-500\",\n violet:\n \"hover:bg-violet-50 checked:border-violet-600 checked:bg-violet-600 checked:hover:border-violet-700 checked:hover:bg-violet-700 focus-visible:ring-violet-500\",\n pink: \"hover:bg-pink-50 checked:border-pink-600 checked:bg-pink-600 checked:hover:border-pink-700 checked:hover:bg-pink-700 focus-visible:ring-pink-500\",\n rose: \"hover:bg-rose-50 checked:border-rose-600 checked:bg-rose-600 checked:hover:border-rose-700 checked:hover:bg-rose-700 focus-visible:ring-rose-500\",\n orange:\n \"hover:bg-orange-50 checked:border-orange-600 checked:bg-orange-600 checked:hover:border-orange-700 checked:hover:bg-orange-700 focus-visible:ring-orange-500\",\n};\n\nconst checkboxVariant = cva(\n [\n \"peer relative cursor-pointer appearance-none rounded-[4px] border border-gray-300 bg-white\",\n \"shadow-sm hover:border-gray-400 checked:shadow-none\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // keyboard-only focus ring (colour is set per intent)\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n // error state via the native attribute, no new prop needed\n \"aria-[invalid=true]:border-error-500\",\n \"disabled:opacity-30 disabled:pointer-events-none disabled:shadow-none\",\n ],\n {\n variants: {\n // Box dimensions are unchanged from the original.\n size: {\n sm: \"h-3 w-3\",\n lg: \"h-3.5 w-3.5\",\n xl: \"h-4 w-4\",\n },\n // New, optional. Defaults to \"primary\".\n intent: intentClasses,\n },\n defaultVariants: {\n size: \"lg\",\n intent: \"primary\",\n },\n },\n);\n\n// The tick scales with the box so it never touches the border.\nconst checkIconSize = {\n sm: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\",\n xl: \"w-3 h-3\",\n};\n\ninterface CheckboxProps\n extends\n Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof checkboxVariant> {\n size?: \"sm\" | \"lg\" | \"xl\";\n}\n\nconst Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ size, intent, className, checked, ...props }, ref) => {\n return (\n <div className=\"inline-flex relative items-center\">\n <input\n ref={ref}\n type=\"checkbox\"\n {...(checked !== undefined ? { checked } : {})}\n {...props}\n className={cn(\"peer\", checkboxVariant({ size, intent, className }))}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute text-white pointer-events-none top-2/4 left-2/4 -translate-y-2/4 -translate-x-2/4\",\n // the tick fades and pops in when checked\n \"opacity-0 scale-50 peer-checked:opacity-100 peer-checked:scale-100\",\n \"transition-[opacity,transform] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={checkIconSize[size ?? \"lg\"]}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n </div>\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n\nexport default Checkbox;\n","import React, { ReactNode, HTMLAttributes } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { cva, VariantProps } from \"class-variance-authority\";\n\ninterface ChipProps\n extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof chipVariants> {\n children: ReactNode;\n dot?: boolean;\n dotColor?: string;\n startIcon?: JSX.Element;\n endIcon?: JSX.Element;\n}\n\ntype ChipIntent =\n | \"default\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"blue\"\n | \"primary\"\n | \"bluegray\"\n | \"bluelight\"\n | \"violet\"\n | \"indigo\"\n | \"purple\"\n | \"pink\"\n | \"rose\"\n | \"orange\";\n\n/* -------------------------------------------------------------------------- */\n/* Per-intent styles. Class names are written out in full so Tailwind can */\n/* detect them. */\n/* - soft: the default look (same background as before) plus a hairline */\n/* inset ring for definition */\n/* - outlined: new, white background with a coloured ring */\n/* - solid: new, filled with the strong shade and white text */\n/* -------------------------------------------------------------------------- */\n\nconst tones: Record<\n ChipIntent,\n { soft: string; outlined: string; solid: string }\n> = {\n default: {\n soft: \"ring-gray-200\",\n outlined: \"bg-white text-gray-700 ring-gray-300\",\n solid: \"bg-gray-600 text-white ring-gray-600\",\n },\n success: {\n soft: \"ring-success-200\",\n outlined: \"bg-white text-success-700 ring-success-300\",\n solid: \"bg-success-600 text-white ring-success-600\",\n },\n warning: {\n soft: \"ring-warning-200\",\n outlined: \"bg-white text-warning-700 ring-warning-300\",\n solid: \"bg-warning-600 text-white ring-warning-600\",\n },\n error: {\n soft: \"ring-error-200\",\n outlined: \"bg-white text-error-700 ring-error-300\",\n solid: \"bg-error-700 text-white ring-error-700\",\n },\n blue: {\n soft: \"ring-blue-200\",\n outlined: \"bg-white text-blue-700 ring-blue-300\",\n solid: \"bg-blue-600 text-white ring-blue-600\",\n },\n primary: {\n soft: \"ring-primary-200\",\n outlined: \"bg-white text-primary-700 ring-primary-300\",\n solid: \"bg-primary-600 text-white ring-primary-600\",\n },\n bluegray: {\n soft: \"ring-bluegray-200\",\n outlined: \"bg-white text-bluegray-700 ring-bluegray-300\",\n solid: \"bg-bluegray-600 text-white ring-bluegray-600\",\n },\n bluelight: {\n soft: \"ring-bluelight-200\",\n outlined: \"bg-white text-bluelight-700 ring-bluelight-300\",\n solid: \"bg-bluelight-600 text-white ring-bluelight-600\",\n },\n violet: {\n soft: \"ring-violet-200\",\n outlined: \"bg-white text-violet-700 ring-violet-300\",\n solid: \"bg-violet-600 text-white ring-violet-600\",\n },\n indigo: {\n soft: \"ring-indigo-200\",\n outlined: \"bg-white text-indigo-700 ring-indigo-300\",\n solid: \"bg-indigo-600 text-white ring-indigo-600\",\n },\n purple: {\n soft: \"ring-purple-200\",\n outlined: \"bg-white text-purple-700 ring-purple-300\",\n solid: \"bg-purple-600 text-white ring-purple-600\",\n },\n pink: {\n soft: \"ring-pink-200\",\n outlined: \"bg-white text-pink-700 ring-pink-300\",\n solid: \"bg-pink-600 text-white ring-pink-600\",\n },\n rose: {\n soft: \"ring-rose-200\",\n outlined: \"bg-white text-rose-700 ring-rose-300\",\n solid: \"bg-rose-600 text-white ring-rose-600\",\n },\n orange: {\n soft: \"ring-orange-200\",\n outlined: \"bg-white text-orange-700 ring-orange-300\",\n solid: \"bg-orange-600 text-white ring-orange-600\",\n },\n};\n\nconst intents = Object.keys(tones) as ChipIntent[];\n\nconst chipVariants = cva(\n [\n \"inline-flex items-center w-fit gap-1.5 rounded-full capitalize\",\n \"font-medium whitespace-nowrap align-middle select-none\",\n \"ring-1 ring-inset\",\n ],\n {\n variants: {\n // New, optional. \"soft\" is the default and keeps the existing look.\n variant: {\n soft: \"\",\n outlined: \"\",\n solid: \"\",\n },\n intent: {\n default: \"bg-gray-50 text-gray-700\",\n success: \"bg-success-50 text-success-700\",\n warning: \"bg-warning-50 text-warning-700\",\n error: \"bg-error-50 text-error-700\",\n blue: \"bg-blue-50 text-blue-700\",\n primary: \"bg-primary-50 text-primary-700\",\n bluegray: \"bg-bluegray-50 text-bluegray-700\",\n bluelight: \"bg-bluelight-50 text-bluelight-700\",\n violet: \"bg-violet-50 text-violet-700\",\n indigo: \"bg-indigo-50 text-indigo-700\",\n purple: \"bg-purple-50 text-purple-700\",\n pink: \"bg-pink-25 text-pink-700\",\n rose: \"bg-rose-50 text-rose-700\",\n orange: \"bg-orange-50 text-orange-700\",\n },\n size: {\n sm: \"text-xs px-2 py-0.5\",\n md: \"text-sm px-2.5 py-0.5\",\n lg: \"text-base px-3 py-1\",\n },\n },\n compoundVariants: [\n ...intents.map((intent) => ({\n variant: \"soft\" as const,\n intent,\n className: tones[intent].soft,\n })),\n ...intents.map((intent) => ({\n variant: \"outlined\" as const,\n intent,\n className: tones[intent].outlined,\n })),\n ...intents.map((intent) => ({\n variant: \"solid\" as const,\n intent,\n className: tones[intent].solid,\n })),\n ],\n defaultVariants: {\n variant: \"soft\",\n intent: \"default\",\n size: \"md\",\n },\n },\n);\n\nconst dotColorVariants: Record<string, string> = {\n default: \"bg-gray-600\",\n success: \"bg-success-600\",\n warning: \"bg-warning-600\",\n error: \"bg-error-600\",\n blue: \"bg-blue-600\",\n primary: \"bg-primary-600\",\n bluegray: \"bg-bluegray-500\",\n bluelight: \"bg-bluelight-600\",\n violet: \"bg-violet-700\",\n indigo: \"bg-indigo-700\",\n purple: \"bg-purple-700\",\n pink: \"bg-pink-700\",\n rose: \"bg-rose-600\",\n orange: \"bg-orange-600\",\n};\n\nconst iconWrapper = \"inline-flex shrink-0 items-center\";\n\nconst Chip = ({\n children,\n className,\n size,\n variant,\n intent = \"default\",\n dot,\n dotColor,\n startIcon,\n endIcon,\n ...rest\n}: ChipProps) => {\n const resolvedIntent = intent ?? \"default\";\n\n // On a solid chip the intent-coloured dot would be invisible, so it\n // defaults to white there. An explicit `dotColor` always wins.\n const defaultDot =\n variant === \"solid\"\n ? \"bg-white/90\"\n : dotColorVariants[resolvedIntent] || \"bg-primary-600\";\n\n return (\n <span\n className={cn(\n chipVariants({ intent: resolvedIntent, size, variant }),\n className,\n )}\n {...rest}\n >\n {startIcon && (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {startIcon}\n </span>\n )}\n\n {!startIcon && dot && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"shrink-0 rounded-full\",\n size === \"lg\" ? \"w-2 h-2\" : \"w-1.5 h-1.5\",\n dotColor || defaultDot,\n )}\n />\n )}\n\n {children}\n\n {endIcon && (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {endIcon}\n </span>\n )}\n </span>\n );\n};\n\nexport default Chip;\n","import { cn } from \"../utils/utils\";\nimport React from \"react\";\n\ninterface CircularProgressBarProps {\n strokeWidth?: number;\n size?: number;\n percentage: number;\n text?: string;\n textClassName?: string;\n}\n\nconst CircularProgressBar = ({\n percentage,\n size = 160,\n strokeWidth = 8,\n text,\n textClassName,\n}: CircularProgressBarProps) => {\n const radius = (size - strokeWidth) / 2;\n const viewBox = `0 0 ${size} ${size}`;\n const dashArray = radius * Math.PI * 2;\n const dashOffset = dashArray - (dashArray * (percentage || 0)) / 100;\n\n return (\n <svg width={size} height={size} viewBox={viewBox}>\n <circle\n className=\"fill-none stroke-gray-200\"\n cx={size / 2}\n cy={size / 2}\n r={radius}\n strokeWidth={`${strokeWidth}px`}\n />\n <circle\n className=\"fill-none stroke-primary-600 transition-all delay-200 ease-in\"\n cx={size / 2}\n cy={size / 2}\n r={radius}\n strokeLinecap=\"round\"\n strokeWidth={`${strokeWidth}px`}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n style={{\n strokeDasharray: dashArray,\n strokeDashoffset: dashOffset,\n }}\n />\n <text\n x=\"50%\"\n y=\"50%\"\n dy=\".3em\"\n textAnchor=\"middle\"\n fill=\"currentColor\"\n className={cn(textClassName)}\n >\n {text}\n </text>\n </svg>\n );\n};\n\nexport default CircularProgressBar;\n","\"use client\";\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n} from \"react\";\nimport { RiArrowDownSLine, RiCheckLine, RiPaletteLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Input from \"./Input\";\n\n/* -------------------------------------------------------------------------- */\n/* Palette */\n/* */\n/* Mirrors the colour scales in globals.css (primary, gray, error, warning, */\n/* success are CSS variables, so a consuming app can re-theme them) and in */\n/* tailwind.config.ts (the remaining families are fixed hex values). */\n/* */\n/* `themed` families are read from their CSS variable at runtime; the hex */\n/* listed here is only the fallback used when the variable isn't defined. */\n/* Order matches SHADES below. */\n/* -------------------------------------------------------------------------- */\n\nconst SHADES = [25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900] as const;\nconst DEFAULT_SHADE_INDEX = SHADES.indexOf(500);\n\nconst PALETTE = {\n primary: {\n label: \"Primary\",\n themed: true,\n colors: [\"#f5faff\", \"#eff8ff\", \"#d1e9ff\", \"#b2ddff\", \"#84caff\", \"#53b1fd\", \"#2e90fa\", \"#1570ef\", \"#175cd3\", \"#1849a9\", \"#194185\"],\n },\n gray: {\n label: \"Gray\",\n themed: true,\n colors: [\"#ffffff\", \"#f9fafb\", \"#f2f4f7\", \"#eaecf0\", \"#d0d5dd\", \"#98a2b3\", \"#667085\", \"#475467\", \"#344054\", \"#1d2939\", \"#101828\"],\n },\n error: {\n label: \"Error\",\n themed: true,\n colors: [\"#fffbfa\", \"#fef3f2\", \"#fee4e2\", \"#fecdca\", \"#fda29b\", \"#f97066\", \"#f04438\", \"#d92d20\", \"#b42318\", \"#912018\", \"#7a271a\"],\n },\n warning: {\n label: \"Warning\",\n themed: true,\n colors: [\"#fffdf5\", \"#fffaeb\", \"#fef0c7\", \"#fedf89\", \"#fec84b\", \"#fdb022\", \"#f79009\", \"#dc6803\", \"#b54708\", \"#93370d\", \"#7a2e0e\"],\n },\n success: {\n label: \"Success\",\n themed: true,\n colors: [\"#f6fef9\", \"#ecfdf3\", \"#d1fadf\", \"#a6f4c5\", \"#6ce9a6\", \"#32d583\", \"#12b76a\", \"#039855\", \"#027a48\", \"#05603a\", \"#054f31\"],\n },\n blue: {\n label: \"Blue\",\n themed: false,\n colors: [\"#f5faff\", \"#eff8ff\", \"#d1e9ff\", \"#b2ddff\", \"#84caff\", \"#53b1fd\", \"#2e90fa\", \"#1570ef\", \"#175cd3\", \"#1849a9\", \"#194185\"],\n },\n bluegray: {\n label: \"Blue gray\",\n themed: false,\n colors: [\"#fcfcfd\", \"#f8f9fc\", \"#eaecf5\", \"#d5d9eb\", \"#afb5d9\", \"#717bbc\", \"#4e5ba6\", \"#3e4784\", \"#363f72\", \"#293056\", \"#101323\"],\n },\n bluelight: {\n label: \"Blue light\",\n themed: false,\n colors: [\"#f5fbff\", \"#f0f9ff\", \"#e0f2fe\", \"#b9e6fe\", \"#7cd4fd\", \"#36bffa\", \"#0ba5ec\", \"#0086c9\", \"#026aa2\", \"#065986\", \"#0b4a6f\"],\n },\n indigo: {\n label: \"Indigo\",\n themed: false,\n colors: [\"#f5f8ff\", \"#eef4ff\", \"#e0eaff\", \"#c7d7fe\", \"#a4bcfd\", \"#8098f9\", \"#6172f3\", \"#444ce7\", \"#3538cd\", \"#2d31a6\", \"#2d3282\"],\n },\n purple: {\n label: \"Purple\",\n themed: false,\n colors: [\"#fafaff\", \"#f4f3ff\", \"#ebe9fe\", \"#d9d6fe\", \"#bdb4fe\", \"#9b8afb\", \"#7a5af8\", \"#6938ef\", \"#5925dc\", \"#4a1fb8\", \"#3e1c96\"],\n },\n violet: {\n label: \"Violet\",\n themed: false,\n colors: [\"#fcfaff\", \"#f9f5ff\", \"#f4ebff\", \"#e9d7fe\", \"#d6bbfb\", \"#b692f6\", \"#9e77ed\", \"#7f56d9\", \"#6941c6\", \"#53389e\", \"#42307d\"],\n },\n pink: {\n label: \"Pink\",\n themed: false,\n colors: [\"#fef6fb\", \"#fdf2fa\", \"#fce7f6\", \"#fcceee\", \"#faa7e0\", \"#f670c7\", \"#ee46bc\", \"#dd2590\", \"#c11574\", \"#9e165f\", \"#851651\"],\n },\n rose: {\n label: \"Rose\",\n themed: false,\n colors: [\"#fff5f6\", \"#fff1f3\", \"#ffe4e8\", \"#fecdd6\", \"#fea3b4\", \"#fd6f8e\", \"#f63d68\", \"#e31b54\", \"#c01048\", \"#a11043\", \"#89123e\"],\n },\n orange: {\n label: \"Orange\",\n themed: false,\n colors: [\"#fffaf5\", \"#fff6ed\", \"#ffead5\", \"#fddcab\", \"#feb273\", \"#fd853a\", \"#fb6514\", \"#ec4a0a\", \"#c4320a\", \"#9c2a10\", \"#7e2410\"],\n },\n} as const;\n\ntype ColorFamily = keyof typeof PALETTE;\ntype ColorShade = (typeof SHADES)[number];\n\nconst ALL_FAMILIES = Object.keys(PALETTE) as ColorFamily[];\n\ninterface ColorPickerToken {\n family: ColorFamily;\n shade: ColorShade;\n}\n\ninterface ColorPickerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\" | \"placeholder\"\n> {\n /** Selected colour as a hex string (`#rgb` or `#rrggbb`). Makes the component controlled. */\n value?: string;\n /** Initial colour when uncontrolled. */\n defaultValue?: string;\n /**\n * Called with the new colour as a lowercase `#rrggbb` string. When the colour\n * is one of the theme swatches, the second argument names it\n * (e.g. `{ family: \"primary\", shade: 600 }`).\n */\n onChange?: (value: string, token?: ColorPickerToken) => void;\n /** Limit which colour families are offered. Defaults to all theme families. */\n families?: ColorFamily[];\n /** Show the hex field and native colour input for colours outside the palette. Defaults to true. */\n showCustomColor?: boolean;\n /** Text shown in the trigger while no colour is selected. */\n placeholder?: string;\n /** Which side of the trigger the panel opens on. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n disabled?: boolean;\n error?: boolean;\n /** When set, a hidden input carries the hex value so the picker works inside native forms. */\n name?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nconst HEX_RE = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\nconst HEX_COMPLETE_RE = /^#?[0-9a-f]{6}$/i;\n\n/** Returns a lowercase `#rrggbb` string, or null when the input isn't a hex colour. */\nconst normalizeHex = (input: string | undefined | null): string | null => {\n if (!input) return null;\n const match = input.trim().match(HEX_RE);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n return `#${hex}`;\n};\n\n/** Picks a readable check-mark colour for a given swatch. */\nconst checkColor = (hex: string) => {\n const n = parseInt(hex.slice(1), 16);\n const r = (n >> 16) & 255;\n const g = (n >> 8) & 255;\n const b = n & 255;\n return 0.299 * r + 0.587 * g + 0.114 * b > 160 ? \"#101828\" : \"#ffffff\";\n};\n\ntype ResolvedPalette = Record<string, string>;\n\nconst keyOf = (family: ColorFamily, shade: ColorShade) => `${family}-${shade}`;\n\n/**\n * Reads the live colours for every family. Themed families come from their CSS\n * variable on `element` (so overridden themes are respected); anything missing\n * or not a hex falls back to the default value above.\n */\nconst resolvePalette = (element: Element): ResolvedPalette => {\n const styles = getComputedStyle(element);\n const out: ResolvedPalette = {};\n for (const family of ALL_FAMILIES) {\n const def = PALETTE[family];\n SHADES.forEach((shade, i) => {\n const fromVar = def.themed\n ? normalizeHex(styles.getPropertyValue(`--${family}-${shade}`))\n : null;\n out[keyOf(family, shade)] = fromVar ?? def.colors[i];\n });\n }\n return out;\n};\n\nconst findToken = (\n hex: string | null,\n palette: ResolvedPalette | null,\n families: ColorFamily[],\n): ColorPickerToken | undefined => {\n if (!hex || !palette) return undefined;\n for (const family of families) {\n for (const shade of SHADES) {\n if (palette[keyOf(family, shade)] === hex) return { family, shade };\n }\n }\n return undefined;\n};\n\n// Shared focus ring (same family as Input, Dropdown and Pagination)\nconst focusRing =\n \"focus-visible:outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\";\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nconst ColorPicker = forwardRef<HTMLButtonElement, ColorPickerProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n families,\n showCustomColor = true,\n placeholder = \"Select color\",\n placement = \"bottom\",\n disabled = false,\n error = false,\n name,\n id,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ...props\n },\n ref,\n ) => {\n const autoId = useId().replace(/:/g, \"\");\n // `id` goes on the trigger so `<Label htmlFor={id}>` works, like a native control.\n const baseId = id ?? `color-picker-${autoId}`;\n const panelId = `${baseId}-panel`;\n\n const familyList = useMemo(() => {\n const wanted = (families ?? []).filter((f) => f in PALETTE);\n return wanted.length > 0 ? wanted : ALL_FAMILIES;\n // join() keeps the memo stable when callers pass a new array each render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [families?.join(\",\")]);\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string | undefined>(\n defaultValue,\n );\n const currentHex = normalizeHex(isControlled ? value : internalValue);\n\n const [open, setOpen] = useState(false);\n const isOpen = open && !disabled;\n const [activeFamily, setActiveFamily] = useState<ColorFamily>(\n familyList[0],\n );\n const shownFamily = familyList.includes(activeFamily)\n ? activeFamily\n : familyList[0];\n\n // Resolved lazily on open, so nothing touches `window` during SSR/hydration.\n const [palette, setPalette] = useState<ResolvedPalette | null>(null);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const setTriggerRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLButtonElement | null>).current =\n node;\n },\n [ref],\n );\n\n // Draft text for the hex field (kept separate so partial input is allowed).\n const [draft, setDraft] = useState(currentHex ?? \"\");\n useEffect(() => {\n setDraft(currentHex ?? \"\");\n }, [currentHex]);\n const draftInvalid = draft.trim() !== \"\" && normalizeHex(draft) === null;\n\n // Read the theme and jump to the family of the current colour on open.\n useEffect(() => {\n if (!isOpen || !rootRef.current) return;\n const resolved = resolvePalette(rootRef.current);\n setPalette(resolved);\n const match = findToken(currentHex, resolved, familyList);\n if (match) setActiveFamily(match.family);\n // Only on open: later value changes shouldn't yank the user between families.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n // Close on outside pointer / focus leaving the picker.\n useEffect(() => {\n if (!isOpen) return;\n const outside = (event: Event) => {\n if (\n rootRef.current &&\n !rootRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", outside);\n document.addEventListener(\"focusin\", outside);\n return () => {\n document.removeEventListener(\"pointerdown\", outside);\n document.removeEventListener(\"focusin\", outside);\n };\n }, [isOpen]);\n\n const commit = (hex: string, token?: ColorPickerToken) => {\n if (!isControlled) setInternalValue(hex);\n onChange?.(hex, token ?? findToken(hex, palette, ALL_FAMILIES));\n };\n\n const pickSwatch = (family: ColorFamily, shade: ColorShade) => {\n // Read fresh so a theme change between open and click is respected.\n const live = rootRef.current ? resolvePalette(rootRef.current) : palette;\n const hex = live?.[keyOf(family, shade)];\n if (!hex) return;\n setPalette(live);\n commit(hex, { family, shade });\n };\n\n const handleDraftChange = (next: string) => {\n setDraft(next);\n // Commit as soon as a full 6-digit colour is typed or pasted.\n if (HEX_COMPLETE_RE.test(next.trim())) {\n const hex = normalizeHex(next);\n if (hex && hex !== currentHex) commit(hex);\n }\n };\n\n const handleDraftSettle = () => {\n const hex = normalizeHex(draft);\n if (hex) {\n if (hex !== currentHex) commit(hex);\n setDraft(hex);\n } else {\n setDraft(currentHex ?? \"\");\n }\n };\n\n // Arrow / Home / End move between the swatches of a radio group.\n const handleRadioKeys = (event: KeyboardEvent<HTMLDivElement>) => {\n const keys = [\n \"ArrowRight\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowUp\",\n \"Home\",\n \"End\",\n ];\n if (!keys.includes(event.key)) return;\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button[role=\"radio\"]',\n ),\n );\n const index = items.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n event.preventDefault();\n let next = index;\n if (event.key === \"Home\") next = 0;\n else if (event.key === \"End\") next = items.length - 1;\n else if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\")\n next = (index + 1) % items.length;\n else next = (index - 1 + items.length) % items.length;\n items[next].focus();\n items[next].click();\n };\n\n const swatchBg = (family: ColorFamily, shade: ColorShade) => {\n const live = palette?.[keyOf(family, shade)];\n if (live) return live;\n const fallback = PALETTE[family].colors[SHADES.indexOf(shade)];\n return PALETTE[family].themed\n ? `var(--${family}-${shade}, ${fallback})`\n : fallback;\n };\n\n const selectedToken = isOpen\n ? findToken(currentHex, palette, familyList)\n : undefined;\n const familyDef = PALETTE[shownFamily];\n const shadeTabStop =\n selectedToken?.family === shownFamily ? selectedToken.shade : SHADES[0];\n\n return (\n <div\n {...props}\n ref={rootRef}\n // Escape closes the panel and hands focus back to the trigger. It is\n // stopped here so an enclosing Modal doesn't also close.\n onKeyDown={(e) => {\n props.onKeyDown?.(e);\n if (e.key === \"Escape\" && isOpen) {\n e.stopPropagation();\n setOpen(false);\n triggerRef.current?.focus();\n }\n }}\n className={cn(\"relative w-full\", className)}\n >\n <button\n ref={setTriggerRef}\n id={baseId}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? panelId : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n onClick={() => setOpen((prev) => !prev)}\n className={cn(\n \"flex h-10 w-full items-center gap-2.5 rounded-xl border bg-white px-3.5 text-sm cursor-pointer\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n focusRing,\n isOpen\n ? \"border-primary-600 ring-4 ring-primary-100 hover:border-primary-600 hover:bg-white\"\n : \"border-gray-200\",\n error &&\n \"border-error-500 hover:border-error-600 focus-visible:border-error-500 focus-visible:ring-error-100\",\n error && isOpen && \"border-error-500 ring-error-100\",\n disabled &&\n \"bg-gray-300 hover:bg-gray-300 hover:border-gray-200 opacity-50 cursor-not-allowed shadow-none\",\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n \"h-5 w-5 shrink-0 rounded-md border border-black/10\",\n !currentHex && \"bg-gray-100\",\n )}\n style={currentHex ? { backgroundColor: currentHex } : undefined}\n />\n <span\n className={cn(\n \"min-w-0 flex-1 truncate text-left\",\n currentHex ? \"font-mono text-gray-900\" : \"text-gray-500\",\n )}\n >\n {currentHex ?? placeholder}\n </span>\n <RiArrowDownSLine\n aria-hidden=\"true\"\n size={18}\n className={cn(\n \"shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {name && <input type=\"hidden\" name={name} value={currentHex ?? \"\"} />}\n\n {isOpen && (\n <div\n id={panelId}\n role=\"dialog\"\n aria-label=\"Choose a color\"\n className={cn(\n \"absolute left-0 z-[1000] w-[304px] max-w-[calc(100vw-2rem)] rounded-xl border border-gray-200 bg-white p-3 shadow-lg\",\n \"fade-in-grow motion-reduce:[animation:none]\",\n placement === \"top\" ? \"bottom-full mb-1\" : \"top-full mt-1\",\n )}\n >\n {/* Family */}\n <div\n role=\"radiogroup\"\n aria-label=\"Color family\"\n onKeyDown={handleRadioKeys}\n className=\"grid grid-cols-7 gap-1\"\n >\n {familyList.map((family) => {\n const checked = family === shownFamily;\n return (\n <button\n key={family}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n aria-label={PALETTE[family].label}\n title={PALETTE[family].label}\n tabIndex={checked ? 0 : -1}\n onClick={() => setActiveFamily(family)}\n className={cn(\n \"flex h-8 items-center justify-center rounded-lg cursor-pointer\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-100\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n checked && \"bg-primary-50 ring-1 ring-primary-300\",\n )}\n >\n <span\n aria-hidden=\"true\"\n className=\"h-5 w-5 rounded-full border border-black/10\"\n style={{\n backgroundColor: swatchBg(\n family,\n SHADES[DEFAULT_SHADE_INDEX],\n ),\n }}\n />\n </button>\n );\n })}\n </div>\n\n {/* Shades */}\n <div className=\"mb-2 mt-3 flex items-center justify-between text-xs\">\n <span className=\"font-semibold text-gray-700\">\n {familyDef.label}\n </span>\n <span className=\"text-gray-500\" aria-live=\"polite\">\n {selectedToken\n ? `${PALETTE[selectedToken.family].label} ${selectedToken.shade}`\n : \"\"}\n </span>\n </div>\n <div\n role=\"radiogroup\"\n aria-label={`${familyDef.label} shades`}\n onKeyDown={handleRadioKeys}\n className=\"grid grid-cols-6 gap-1.5\"\n >\n {SHADES.map((shade) => {\n const hex =\n palette?.[keyOf(shownFamily, shade)] ??\n familyDef.colors[SHADES.indexOf(shade)];\n const checked = currentHex === hex;\n return (\n <button\n key={shade}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n aria-label={`${familyDef.label} ${shade}`}\n title={`${familyDef.label} ${shade} · ${hex}`}\n tabIndex={shade === shadeTabStop ? 0 : -1}\n onClick={() => pickSwatch(shownFamily, shade)}\n style={{ backgroundColor: swatchBg(shownFamily, shade) }}\n className={cn(\n \"flex h-8 items-center justify-center rounded-lg border border-black/10 cursor-pointer\",\n \"transition-transform duration-150 hover:scale-105 motion-reduce:transition-none motion-reduce:hover:scale-100\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-1\",\n checked && \"ring-2 ring-gray-900 ring-offset-1\",\n )}\n >\n {checked && (\n <RiCheckLine\n aria-hidden=\"true\"\n size={16}\n style={{ color: checkColor(hex) }}\n />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Custom colour */}\n {showCustomColor && (\n <div className=\"mt-3 flex items-center gap-2 border-t border-gray-100 pt-3\">\n <Input\n type=\"text\"\n value={draft}\n placeholder=\"#000000\"\n spellCheck={false}\n autoComplete=\"off\"\n aria-label=\"Hex color\"\n error={draftInvalid}\n onChange={(e) => handleDraftChange(e.target.value)}\n // select on focus so typing or pasting replaces the whole code\n onFocus={(e) => e.currentTarget.select()}\n onBlur={handleDraftSettle}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleDraftSettle();\n }\n }}\n className=\"min-w-0 flex-1 font-mono\"\n />\n <label\n title=\"Pick a custom color\"\n className={cn(\n \"relative inline-flex h-10 w-10 shrink-0 cursor-pointer items-center justify-center rounded-xl border border-gray-200 bg-white text-gray-600\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n )}\n >\n <RiPaletteLine aria-hidden=\"true\" size={18} />\n <input\n type=\"color\"\n aria-label=\"Custom color\"\n value={currentHex ?? \"#000000\"}\n onChange={(e) => commit(e.target.value.toLowerCase())}\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n />\n </label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nColorPicker.displayName = \"ColorPicker\";\n\nexport type { ColorPickerProps, ColorPickerToken, ColorFamily, ColorShade };\n// Shared with ThemeColorPicker so both read the same palette definition.\nexport { PALETTE as COLOR_PALETTE, SHADES as COLOR_SHADES };\nexport default ColorPicker;\n","import React, { InputHTMLAttributes, forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface InputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> {\n size?: \"sm\" | \"lg\";\n startIcon?: JSX.Element;\n endIcon?: JSX.Element;\n disabled?: boolean;\n error?: boolean;\n type:\n | \"text\"\n | \"url\"\n | \"email\"\n | \"password\"\n | \"number\"\n | \"tel\"\n | \"search\"\n | \"time\";\n}\n\nconst iconWrapper = \"inline-flex shrink-0 items-center\";\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size,\n startIcon,\n endIcon,\n className,\n type,\n error,\n disabled,\n id,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n ...props\n },\n ref,\n ) => {\n return (\n <div\n className={cn(\n // layout (padding, heights and widths below are unchanged)\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n // surface\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // hover\n \"hover:bg-gray-50 hover:border-gray-300\",\n // focus: border colour change plus a soft outer ring\n \"focus-within:border-primary-600 focus-within:bg-gray-25 focus-within:ring-4 focus-within:ring-primary-100\",\n \"focus-within:hover:bg-gray-50 focus-within:hover:border-primary-600\",\n // disabled\n \"has-[:disabled]:opacity-30 has-[:disabled]:bg-gray-300 has-[:disabled]:select-none has-[:disabled]:pointer-events-none has-[:disabled]:shadow-none\",\n size === \"sm\"\n ? \"w-[320px] h-10\"\n : size === \"lg\"\n ? \"w-[313px] h-11\"\n : \"w-full h-10\",\n error &&\n \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100 focus-within:hover:border-error-500\",\n className,\n )}\n >\n {startIcon && (\n <span\n aria-hidden=\"true\"\n className={cn(\n iconWrapper,\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"group-hover:text-gray-600 group-focus-within:text-gray-600\",\n disabled && \"text-gray-900\",\n error && \"text-error-500\",\n )}\n >\n {startIcon}\n </span>\n )}\n <input\n aria-invalid={error || undefined}\n {...props}\n ref={ref}\n id={id}\n disabled={disabled}\n type={type}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-disabled={disabled}\n className={cn(\n \"w-full min-w-0 text-sm text-gray-900 focus:outline-none focus:ring-offset-0 bg-transparent disabled:text-gray-900 placeholder:text-gray-500 group-hover:placeholder:text-gray-500 rounded-md\",\n size,\n )}\n />\n {endIcon && (\n <span\n aria-hidden=\"true\"\n className={cn(\n iconWrapper,\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"group-hover:text-gray-600 group-focus-within:text-gray-600\",\n disabled && \"text-gray-900\",\n )}\n >\n {endIcon}\n </span>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n\nexport default Input;\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n RiArrowLeftSLine,\n RiArrowRightSLine,\n RiCalendarLine,\n RiCloseLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\ninterface DatePickerBaseProps {\n /** Optional. Earliest selectable date (inclusive). */\n min?: Date;\n /** Optional. Latest selectable date (inclusive). */\n max?: Date;\n /** Optional. Return true to make a specific date unselectable (e.g. weekends, holidays). */\n isDateDisabled?: (date: Date) => boolean;\n /** Optional. Text shown when nothing is selected. */\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. \"sm\" = 320px, \"lg\" = 313px, default = full width (same as Input). */\n size?: \"sm\" | \"lg\";\n /** Optional. Open the calendar above or below the field. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. Show a clear button when a value is selected. Defaults to true. */\n clearable?: boolean;\n /** Optional. Show a \"Today\" shortcut in the footer. Defaults to true. */\n showToday?: boolean;\n /** Optional. First day of the week: 0 = Sunday, 1 = Monday. Defaults to 0. */\n weekStartsOn?: 0 | 1;\n /** Optional. BCP 47 locale used for month and weekday names. Defaults to \"en-US\". */\n locale?: string;\n /** Optional. Intl.DateTimeFormat options for the text shown in the field. */\n formatOptions?: Intl.DateTimeFormatOptions;\n id?: string;\n /** Optional. Adds a hidden input (ISO date, or \"start/end\" for ranges) for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n}\n\ninterface DatePickerSingleProps extends DatePickerBaseProps {\n mode?: \"single\";\n /** Controlled value. */\n value?: Date | null;\n /** Uncontrolled initial value. */\n defaultValue?: Date | null;\n onChange?: (date: Date | null) => void;\n}\n\nexport interface DateRangePreset {\n label: string;\n range: DateRange;\n}\n\ninterface DatePickerRangeProps extends DatePickerBaseProps {\n mode: \"range\";\n /** Optional. Shortcut buttons (e.g. \"Last 7 days\") shown above the footer. */\n presets?: DateRangePreset[];\n /** Controlled value. */\n value?: DateRange;\n /** Uncontrolled initial value. */\n defaultValue?: DateRange;\n onChange?: (range: DateRange) => void;\n}\n\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n/* -------------------------------------------------------------------------- */\n/* Date utilities */\n/* -------------------------------------------------------------------------- */\n\nconst startOfDay = (d: Date) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\nconst addDays = (d: Date, n: number) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n\n/** Adds months and clamps the day (Jan 31 + 1 month = Feb 28/29). */\nconst addMonths = (d: Date, n: number) => {\n const target = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const last = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();\n return new Date(\n target.getFullYear(),\n target.getMonth(),\n Math.min(d.getDate(), last),\n );\n};\n\nconst isSameDay = (a?: Date | null, b?: Date | null) =>\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\nconst dayKey = (d: Date) =>\n `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(\n d.getDate(),\n ).padStart(2, \"0\")}`;\n\nconst clampDate = (d: Date, min?: Date, max?: Date) => {\n const day = startOfDay(d);\n if (min && day < startOfDay(min)) return startOfDay(min);\n if (max && day > startOfDay(max)) return startOfDay(max);\n return day;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Shared styles */\n/* -------------------------------------------------------------------------- */\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst navButton = cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-lg text-gray-600\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-100 hover:text-gray-900 disabled:pointer-events-none disabled:opacity-30\",\n focusRing,\n);\n\nconst textButton =\n \"rounded-md px-2 py-1 text-sm font-medium text-primary-700 transition-colors duration-150 motion-reduce:transition-none hover:bg-primary-50 disabled:pointer-events-none disabled:opacity-30 \" +\n focusRing;\n\ntype View = \"days\" | \"months\" | \"years\";\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nconst DatePicker = (props: DatePickerProps) => {\n const {\n min,\n max,\n isDateDisabled,\n placeholder,\n disabled = false,\n error = false,\n size,\n placement = \"bottom\",\n clearable = true,\n showToday = true,\n weekStartsOn = 0,\n locale = \"en-US\",\n formatOptions = { day: \"numeric\", month: \"short\", year: \"numeric\" },\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n } = props;\n\n const isRange = props.mode === \"range\";\n const presets = isRange ? (props as DatePickerRangeProps).presets : undefined;\n const reactId = useId();\n const triggerId = id ?? `datepicker-${reactId}`;\n const dialogId = `${triggerId}-dialog`;\n\n /* ----- value (controlled or not) ----- */\n const [innerSingle, setInnerSingle] = useState<Date | null>(\n !isRange ? ((props.defaultValue as Date | null | undefined) ?? null) : null,\n );\n const [innerRange, setInnerRange] = useState<DateRange>(\n isRange\n ? ((props.defaultValue as DateRange | undefined) ?? {\n start: null,\n end: null,\n })\n : { start: null, end: null },\n );\n\n const single: Date | null = !isRange\n ? props.value !== undefined\n ? (props.value as Date | null)\n : innerSingle\n : null;\n const range: DateRange = isRange\n ? props.value !== undefined\n ? (props.value as DateRange)\n : innerRange\n : { start: null, end: null };\n\n const hasValue = isRange ? !!(range.start || range.end) : !!single;\n\n /* ----- popover state ----- */\n const [open, setOpen] = useState(false);\n const [view, setView] = useState<View>(\"days\");\n const today = useMemo(() => startOfDay(new Date()), []);\n const initialFocus = useCallback(\n () =>\n clampDate(\n (isRange ? range.start : single) ?? today,\n min,\n max,\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isRange, range.start, single, today, min, max],\n );\n const [focused, setFocused] = useState<Date>(initialFocus);\n const [hover, setHover] = useState<Date | null>(null);\n const [pickingEnd, setPickingEnd] = useState(false);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const shouldFocusDay = useRef(false);\n\n const disabledDay = useCallback(\n (d: Date) => {\n const day = startOfDay(d);\n if (min && day < startOfDay(min)) return true;\n if (max && day > startOfDay(max)) return true;\n return !!isDateDisabled?.(day);\n },\n [min, max, isDateDisabled],\n );\n\n const close = useCallback((returnFocus = true) => {\n setOpen(false);\n setHover(null);\n setPickingEnd(false);\n if (returnFocus) triggerRef.current?.focus();\n }, []);\n\n const openPicker = () => {\n if (disabled) return;\n setFocused(initialFocus());\n setView(\"days\");\n shouldFocusDay.current = true;\n setOpen(true);\n };\n\n // Click outside closes\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) close(false);\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, close]);\n\n // Move DOM focus to the focused day after keyboard navigation / opening\n useEffect(() => {\n if (!open || view !== \"days\" || !shouldFocusDay.current) return;\n shouldFocusDay.current = false;\n gridRef.current\n ?.querySelector<HTMLButtonElement>(`[data-date=\"${dayKey(focused)}\"]`)\n ?.focus();\n }, [open, view, focused]);\n\n /* ----- commit helpers ----- */\n const commitSingle = (d: Date | null) => {\n if (props.value === undefined) setInnerSingle(d);\n (props as DatePickerSingleProps).onChange?.(d);\n };\n const commitRange = (r: DateRange) => {\n if (props.value === undefined) setInnerRange(r);\n (props as DatePickerRangeProps).onChange?.(r);\n };\n\n const selectDay = (d: Date) => {\n if (disabledDay(d)) return;\n const day = startOfDay(d);\n if (!isRange) {\n commitSingle(day);\n close();\n return;\n }\n if (!pickingEnd || !range.start) {\n commitRange({ start: day, end: null });\n setPickingEnd(true);\n return;\n }\n const [start, end] =\n day < range.start ? [day, range.start] : [range.start, day];\n commitRange({ start, end });\n close();\n };\n\n const clear = () => {\n if (isRange) commitRange({ start: null, end: null });\n else commitSingle(null);\n setPickingEnd(false);\n triggerRef.current?.focus();\n };\n\n /* ----- calendar grid ----- */\n const monthStart = new Date(focused.getFullYear(), focused.getMonth(), 1);\n\n const weekdays = useMemo(() => {\n const fmt = new Intl.DateTimeFormat(locale, { weekday: \"short\" });\n const long = new Intl.DateTimeFormat(locale, { weekday: \"long\" });\n // 2023-01-01 is a Sunday\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(2023, 0, 1 + ((i + weekStartsOn) % 7));\n return { short: fmt.format(d).slice(0, 2), long: long.format(d) };\n });\n }, [locale, weekStartsOn]);\n\n const weeks = useMemo(() => {\n const offset = (monthStart.getDay() - weekStartsOn + 7) % 7;\n const first = addDays(monthStart, -offset);\n return Array.from({ length: 6 }, (_, w) =>\n Array.from({ length: 7 }, (_, d) => addDays(first, w * 7 + d)),\n );\n }, [monthStart, weekStartsOn]);\n\n const monthLabel = new Intl.DateTimeFormat(locale, {\n month: \"long\",\n year: \"numeric\",\n }).format(monthStart);\n\n const fullDate = new Intl.DateTimeFormat(locale, { dateStyle: \"full\" });\n\n const moveFocus = (next: Date) => {\n shouldFocusDay.current = true;\n setFocused(clampDate(next, min, max));\n };\n\n const onGridKeyDown = (e: React.KeyboardEvent) => {\n let next: Date | null = null;\n const offset = (focused.getDay() - weekStartsOn + 7) % 7;\n switch (e.key) {\n case \"ArrowLeft\":\n next = addDays(focused, -1);\n break;\n case \"ArrowRight\":\n next = addDays(focused, 1);\n break;\n case \"ArrowUp\":\n next = addDays(focused, -7);\n break;\n case \"ArrowDown\":\n next = addDays(focused, 7);\n break;\n case \"Home\":\n next = addDays(focused, -offset);\n break;\n case \"End\":\n next = addDays(focused, 6 - offset);\n break;\n case \"PageUp\":\n next = addMonths(focused, e.shiftKey ? -12 : -1);\n break;\n case \"PageDown\":\n next = addMonths(focused, e.shiftKey ? 12 : 1);\n break;\n default:\n return;\n }\n e.preventDefault();\n moveFocus(next);\n };\n\n const onDialogKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n if (view !== \"days\") setView(\"days\");\n else close();\n }\n };\n\n /* ----- day state helpers ----- */\n const rangeEnd = isRange ? (range.end ?? (pickingEnd ? hover : null)) : null;\n const rangeLo =\n isRange && range.start && rangeEnd\n ? range.start < rangeEnd\n ? range.start\n : rangeEnd\n : null;\n const rangeHi =\n isRange && range.start && rangeEnd\n ? range.start < rangeEnd\n ? rangeEnd\n : range.start\n : null;\n\n const dayState = (d: Date) => {\n const selectedStart = isRange\n ? isSameDay(d, rangeLo ?? range.start)\n : isSameDay(d, single);\n const selectedEnd = isRange ? isSameDay(d, rangeHi) : false;\n const inRange =\n !!rangeLo && !!rangeHi && startOfDay(d) > rangeLo && startOfDay(d) < rangeHi;\n return { selected: selectedStart || selectedEnd, inRange, selectedStart, selectedEnd };\n };\n\n /* ----- trigger text ----- */\n const fmt = useMemo(\n () => new Intl.DateTimeFormat(locale, formatOptions),\n [locale, formatOptions],\n );\n const label = isRange\n ? range.start\n ? `${fmt.format(range.start)} – ${range.end ? fmt.format(range.end) : \"…\"}`\n : \"\"\n : single\n ? fmt.format(single)\n : \"\";\n const resolvedPlaceholder =\n placeholder ?? (isRange ? \"Select date range\" : \"Select date\");\n\n const hiddenValue = isRange\n ? range.start\n ? `${dayKey(range.start)}/${range.end ? dayKey(range.end) : \"\"}`\n : \"\"\n : single\n ? dayKey(single)\n : \"\";\n\n /* ----- months / years views ----- */\n const yearPageStart = Math.floor(focused.getFullYear() / 12) * 12;\n\n return (\n <div ref={rootRef} className=\"relative inline-block max-w-full\">\n {name && <input type=\"hidden\" name={name} value={hiddenValue} />}\n\n {/* Trigger — same surface as <Input /> */}\n <div\n className={cn(\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n open && \"border-primary-600 ring-4 ring-primary-100\",\n disabled &&\n \"opacity-30 bg-gray-300 select-none pointer-events-none shadow-none\",\n size === \"sm\"\n ? \"w-[320px] h-10\"\n : size === \"lg\"\n ? \"w-[313px] h-11\"\n : \"w-full h-10\",\n isRange && !size && \"min-w-[280px]\",\n error &&\n \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n className,\n )}\n >\n <RiCalendarLine\n size={18}\n aria-hidden=\"true\"\n className=\"shrink-0 text-gray-500 group-hover:text-gray-600\"\n />\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? dialogId : undefined}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-invalid={error || undefined}\n onClick={() => (open ? close() : openPicker())}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\" && !open) {\n e.preventDefault();\n openPicker();\n }\n }}\n className={cn(\n \"min-w-0 flex-1 truncate bg-transparent text-left text-sm focus:outline-none\",\n label ? \"text-gray-900\" : \"text-gray-500\",\n )}\n >\n {label || resolvedPlaceholder}\n </button>\n {clearable && hasValue && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear date\"\n onClick={clear}\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-800\",\n focusRing,\n )}\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {/* Popover */}\n {open && (\n <div\n id={dialogId}\n role=\"dialog\"\n aria-label={isRange ? \"Choose date range\" : \"Choose date\"}\n onKeyDown={onDialogKeyDown}\n className={cn(\n \"absolute left-0 z-50 w-[296px] rounded-xl border border-gray-200 bg-white p-3 shadow-lg\",\n placement === \"top\" ? \"bottom-full mb-2\" : \"top-full mt-2\",\n )}\n >\n {/* Header */}\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n className={navButton}\n aria-label={\n view === \"days\"\n ? \"Previous month\"\n : view === \"months\"\n ? \"Previous year\"\n : \"Previous years\"\n }\n onClick={() =>\n setFocused(\n view === \"days\"\n ? addMonths(focused, -1)\n : view === \"months\"\n ? addMonths(focused, -12)\n : addMonths(focused, -144),\n )\n }\n >\n <RiArrowLeftSLine size={18} aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n aria-live=\"polite\"\n onClick={() =>\n setView(view === \"days\" ? \"months\" : view === \"months\" ? \"years\" : \"days\")\n }\n className={cn(\n \"rounded-lg px-2 py-1 text-sm font-semibold text-gray-900 hover:bg-gray-100\",\n focusRing,\n )}\n >\n {view === \"days\"\n ? monthLabel\n : view === \"months\"\n ? focused.getFullYear()\n : `${yearPageStart} – ${yearPageStart + 11}`}\n </button>\n <button\n type=\"button\"\n className={navButton}\n aria-label={\n view === \"days\"\n ? \"Next month\"\n : view === \"months\"\n ? \"Next year\"\n : \"Next years\"\n }\n onClick={() =>\n setFocused(\n view === \"days\"\n ? addMonths(focused, 1)\n : view === \"months\"\n ? addMonths(focused, 12)\n : addMonths(focused, 144),\n )\n }\n >\n <RiArrowRightSLine size={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Days */}\n {view === \"days\" && (\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={monthLabel}\n onKeyDown={onGridKeyDown}\n onMouseLeave={() => setHover(null)}\n >\n <div role=\"row\" className=\"mb-1 grid grid-cols-7\">\n {weekdays.map((w) => (\n <div\n key={w.long}\n role=\"columnheader\"\n aria-label={w.long}\n className=\"flex h-8 items-center justify-center text-xs font-medium text-gray-500\"\n >\n {w.short}\n </div>\n ))}\n </div>\n {weeks.map((week, wi) => (\n <div key={wi} role=\"row\" className=\"grid grid-cols-7\">\n {week.map((d) => {\n const outside = d.getMonth() !== monthStart.getMonth();\n const off = disabledDay(d);\n const st = dayState(d);\n const isToday = isSameDay(d, today);\n return (\n <div\n key={dayKey(d)}\n role=\"gridcell\"\n aria-selected={st.selected || st.inRange || undefined}\n className={cn(\n \"flex items-center justify-center py-0.5\",\n st.inRange && \"bg-primary-50\",\n st.selectedStart && rangeHi && !isSameDay(rangeLo, rangeHi) && \"rounded-l-full bg-primary-50\",\n st.selectedEnd && \"rounded-r-full bg-primary-50\",\n )}\n >\n <button\n type=\"button\"\n data-date={dayKey(d)}\n tabIndex={isSameDay(d, focused) ? 0 : -1}\n disabled={off}\n aria-label={fullDate.format(d)}\n aria-current={isToday ? \"date\" : undefined}\n onClick={() => selectDay(d)}\n onMouseEnter={() => setHover(startOfDay(d))}\n onFocus={() => {\n if (!isSameDay(d, focused)) setFocused(startOfDay(d));\n }}\n className={cn(\n \"inline-flex h-9 w-9 items-center justify-center rounded-full text-sm\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n st.selected\n ? \"bg-primary-600 font-semibold text-white hover:bg-primary-700\"\n : outside\n ? \"text-gray-400 hover:bg-gray-100\"\n : \"text-gray-900 hover:bg-gray-100\",\n !st.selected && isToday && \"border border-primary-600 font-semibold text-primary-700\",\n off && \"pointer-events-none text-gray-300 line-through hover:bg-transparent\",\n )}\n >\n {d.getDate()}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n )}\n\n {/* Months */}\n {view === \"months\" && (\n <div className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, m) => {\n const label = new Intl.DateTimeFormat(locale, { month: \"short\" }).format(\n new Date(2023, m, 1),\n );\n const current = m === focused.getMonth();\n const monthEnd = new Date(focused.getFullYear(), m + 1, 0);\n const monthBegin = new Date(focused.getFullYear(), m, 1);\n const off =\n (!!min && monthEnd < startOfDay(min)) ||\n (!!max && monthBegin > startOfDay(max));\n return (\n <button\n key={m}\n type=\"button\"\n disabled={off}\n onClick={() => {\n const lastDay = new Date(focused.getFullYear(), m + 1, 0).getDate();\n setFocused(\n clampDate(\n new Date(focused.getFullYear(), m, Math.min(focused.getDate(), lastDay)),\n min,\n max,\n ),\n );\n setView(\"days\");\n }}\n className={cn(\n \"h-10 rounded-lg text-sm transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n current\n ? \"bg-primary-600 font-semibold text-white\"\n : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Years */}\n {view === \"years\" && (\n <div className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, i) => {\n const y = yearPageStart + i;\n const current = y === focused.getFullYear();\n const off =\n (!!min && y < min.getFullYear()) || (!!max && y > max.getFullYear());\n return (\n <button\n key={y}\n type=\"button\"\n disabled={off}\n onClick={() => {\n const lastDay = new Date(y, focused.getMonth() + 1, 0).getDate();\n setFocused(\n clampDate(\n new Date(y, focused.getMonth(), Math.min(focused.getDate(), lastDay)),\n min,\n max,\n ),\n );\n setView(\"months\");\n }}\n className={cn(\n \"h-10 rounded-lg text-sm transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n current\n ? \"bg-primary-600 font-semibold text-white\"\n : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n )}\n >\n {y}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Presets */}\n {presets && presets.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1 border-t border-gray-100 pt-2\">\n {presets.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n className={cn(\n \"rounded-full border border-gray-200 px-2.5 py-1 text-xs font-medium text-gray-700 hover:bg-gray-50\",\n focusRing,\n )}\n onClick={() => {\n commitRange(p.range);\n close();\n }}\n >\n {p.label}\n </button>\n ))}\n </div>\n )}\n\n {/* Footer */}\n {(showToday || (clearable && hasValue)) && (\n <div className=\"mt-2 flex items-center justify-between border-t border-gray-100 pt-2\">\n {showToday ? (\n <button\n type=\"button\"\n className={textButton}\n disabled={disabledDay(today)}\n onClick={() => {\n selectDay(today);\n }}\n >\n Today\n </button>\n ) : (\n <span />\n )}\n {clearable && hasValue && (\n <button\n type=\"button\"\n className={cn(textButton, \"text-gray-600 hover:bg-gray-100\")}\n onClick={() => {\n clear();\n close(false);\n }}\n >\n Clear\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nDatePicker.displayName = \"DatePicker\";\n\nexport default DatePicker;\n","\"use client\";\nimport React, { useState } from \"react\";\nimport DatePicker from \"./DatePicker\";\nimport TimePicker from \"./TimePicker\";\nimport { cn } from \"../utils/utils\";\n\nexport interface DateTimePickerProps {\n /** Controlled value: a Date carrying both day and time, or null. */\n value?: Date | null;\n /** Uncontrolled initial value. */\n defaultValue?: Date | null;\n /** Called with a Date (local time) or null when cleared. */\n onChange?: (value: Date | null) => void;\n /** Optional. Earliest selectable moment (date and time). */\n min?: Date;\n /** Optional. Latest selectable moment (date and time). */\n max?: Date;\n /** Optional. Return true to block a specific day. */\n isDateDisabled?: (date: Date) => boolean;\n /** Optional. Time used when a date is picked before any time. Defaults to \"00:00\". */\n defaultTime?: string;\n /** Optional. Time display format. Defaults to \"12h\". */\n format?: \"12h\" | \"24h\";\n /** Optional. Minutes between time options. Defaults to 5. */\n minuteStep?: number;\n datePlaceholder?: string;\n timePlaceholder?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. Open the popovers above or below. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. First day of week: 0 = Sunday, 1 = Monday. Defaults to 0. */\n weekStartsOn?: 0 | 1;\n /** Optional. BCP 47 locale for month and weekday names. Defaults to \"en-US\". */\n locale?: string;\n /** Optional. Intl options for the date text. */\n formatOptions?: Intl.DateTimeFormatOptions;\n /** Optional. Adds a hidden input with a local ISO value (\"YYYY-MM-DDTHH:mm\"). */\n name?: string;\n id?: string;\n className?: string;\n \"aria-label\"?: string;\n}\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\nconst timeOf = (d: Date) => `${pad(d.getHours())}:${pad(d.getMinutes())}`;\nconst sameDay = (a: Date, b: Date) =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\nconst iso = (d: Date) =>\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${timeOf(d)}`;\n\nconst combine = (day: Date, time: string) => {\n const [h, m] = time.split(\":\").map(Number);\n return new Date(day.getFullYear(), day.getMonth(), day.getDate(), h || 0, m || 0);\n};\n\n/** Date + time in one control. Composes DatePicker and TimePicker around a single Date value. */\nconst DateTimePicker = ({\n value,\n defaultValue = null,\n onChange,\n min,\n max,\n isDateDisabled,\n defaultTime = \"00:00\",\n format = \"12h\",\n minuteStep = 5,\n datePlaceholder = \"Select date\",\n timePlaceholder = \"Select time\",\n disabled,\n error,\n placement = \"bottom\",\n weekStartsOn = 0,\n locale = \"en-US\",\n formatOptions,\n name,\n id,\n className,\n \"aria-label\": ariaLabel,\n}: DateTimePickerProps) => {\n const [inner, setInner] = useState<Date | null>(defaultValue);\n const [pendingTime, setPendingTime] = useState<string | null>(null);\n const current = value !== undefined ? value : inner;\n\n const emit = (next: Date | null) => {\n if (value === undefined) setInner(next);\n onChange?.(next);\n };\n\n const clamp = (d: Date) => {\n if (min && d < min) return new Date(min);\n if (max && d > max) return new Date(max);\n return d;\n };\n\n const onDate = (d: Date | null) => {\n if (!d) {\n setPendingTime(null);\n emit(null);\n return;\n }\n const time = current ? timeOf(current) : (pendingTime ?? defaultTime);\n setPendingTime(null);\n emit(clamp(combine(d, time)));\n };\n\n const onTime = (t: string | null) => {\n if (!t) return;\n if (current) emit(clamp(combine(current, t)));\n else setPendingTime(t);\n };\n\n // When the chosen day is the min/max day, restrict the time list too.\n const timeMin = min && current && sameDay(current, min) ? timeOf(min) : undefined;\n const timeMax = max && current && sameDay(current, max) ? timeOf(max) : undefined;\n\n const timeValue = current ? timeOf(current) : pendingTime;\n\n return (\n <div className={cn(\"flex flex-wrap items-start gap-3\", className)}>\n {name && <input type=\"hidden\" name={name} value={current ? iso(current) : \"\"} />}\n <div className=\"min-w-[200px] flex-1\">\n <DatePicker\n id={id}\n aria-label={ariaLabel ?? \"Date\"}\n value={current}\n onChange={onDate}\n min={min}\n max={max}\n isDateDisabled={isDateDisabled}\n placeholder={datePlaceholder}\n disabled={disabled}\n error={error}\n placement={placement}\n weekStartsOn={weekStartsOn}\n locale={locale}\n formatOptions={formatOptions}\n showToday\n />\n </div>\n <div className=\"w-40 shrink-0\">\n <TimePicker\n aria-label={ariaLabel ? `${ariaLabel} time` : \"Time\"}\n value={timeValue}\n onChange={onTime}\n min={timeMin}\n max={timeMax}\n format={format}\n minuteStep={minuteStep}\n placeholder={timePlaceholder}\n disabled={disabled}\n error={error}\n placement={placement}\n clearable={false}\n />\n </div>\n </div>\n );\n};\n\nDateTimePicker.displayName = \"DateTimePicker\";\n\nexport default DateTimePicker;\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { RiCloseLine, RiTimeLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/** Time is stored as a 24-hour \"HH:mm\" string, e.g. \"09:30\" or \"17:05\". */\nexport interface TimePickerProps {\n /** Controlled value (\"HH:mm\", 24-hour) or null for empty. */\n value?: string | null;\n /** Uncontrolled initial value (\"HH:mm\"). */\n defaultValue?: string | null;\n /** Called with \"HH:mm\" (24-hour) or null when cleared. */\n onChange?: (time: string | null) => void;\n /** Optional. Display and picker format. Defaults to \"12h\". */\n format?: \"12h\" | \"24h\";\n /** Optional. Minutes between options (1, 5, 10, 15, 30 …). Defaults to 5. */\n minuteStep?: number;\n /** Optional. Earliest selectable time (\"HH:mm\"). */\n min?: string;\n /** Optional. Latest selectable time (\"HH:mm\"). */\n max?: string;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. \"sm\" = 320px, \"lg\" = 313px, default = full width (same as Input). */\n size?: \"sm\" | \"lg\";\n /** Optional. Open the picker above or below the field. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. Show a clear button when a value is set. Defaults to true. */\n clearable?: boolean;\n /** Optional. Show a \"Now\" shortcut. Defaults to true. */\n showNow?: boolean;\n id?: string;\n /** Optional. Adds a hidden input (\"HH:mm\") for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n}\n\n/* ------------------------------ time helpers ------------------------------ */\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nconst parse = (t?: string | null): { h: number; m: number } | null => {\n if (!t) return null;\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(t.trim());\n if (!match) return null;\n const h = Number(match[1]);\n const m = Number(match[2]);\n if (h > 23 || m > 59) return null;\n return { h, m };\n};\n\nconst toMinutes = (t: { h: number; m: number }) => t.h * 60 + t.m;\nconst toString = (t: { h: number; m: number }) => `${pad(t.h)}:${pad(t.m)}`;\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst textButton =\n \"rounded-md px-2 py-1 text-sm font-medium transition-colors duration-150 motion-reduce:transition-none disabled:pointer-events-none disabled:opacity-30 \" +\n focusRing;\n\ntype Draft = { h: number; m: number };\n\nconst TimePicker = ({\n value,\n defaultValue = null,\n onChange,\n format = \"12h\",\n minuteStep = 5,\n min,\n max,\n placeholder = \"Select time\",\n disabled = false,\n error = false,\n size,\n placement = \"bottom\",\n clearable = true,\n showNow = true,\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n}: TimePickerProps) => {\n const reactId = useId();\n const triggerId = id ?? `timepicker-${reactId}`;\n const dialogId = `${triggerId}-dialog`;\n const is12 = format === \"12h\";\n const step = Math.max(1, Math.min(60, Math.floor(minuteStep) || 1));\n\n const [inner, setInner] = useState<string | null>(defaultValue);\n const current = value !== undefined ? value : inner;\n const currentTime = parse(current);\n\n const [open, setOpen] = useState(false);\n const [draft, setDraft] = useState<Draft | null>(currentTime);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const popRef = useRef<HTMLDivElement>(null);\n\n const minT = parse(min);\n const maxT = parse(max);\n\n const inRange = useCallback(\n (t: Draft) => {\n const v = toMinutes(t);\n if (minT && v < toMinutes(minT)) return false;\n if (maxT && v > toMinutes(maxT)) return false;\n return true;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [min, max],\n );\n\n const minutes = useMemo(\n () => Array.from({ length: Math.ceil(60 / step) }, (_, i) => i * step),\n [step],\n );\n\n const commit = (t: Draft | null) => {\n const next = t ? toString(t) : null;\n if (value === undefined) setInner(next);\n onChange?.(next);\n };\n\n const close = useCallback((returnFocus = true) => {\n setOpen(false);\n if (returnFocus) triggerRef.current?.focus();\n }, []);\n\n const openPicker = () => {\n if (disabled) return;\n setDraft(currentTime);\n setOpen(true);\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) close(false);\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, close]);\n\n // Scroll selected options into view (inside their own column) and focus one on open\n const justOpened = useRef(false);\n useEffect(() => {\n if (open) justOpened.current = true;\n }, [open]);\n useEffect(() => {\n if (!open || !popRef.current) return;\n popRef.current\n .querySelectorAll<HTMLElement>('[role=\"listbox\"]')\n .forEach((col) => {\n const sel = col.querySelector<HTMLElement>('[aria-selected=\"true\"]');\n if (sel) col.scrollTop = sel.offsetTop - col.clientHeight / 2 + sel.clientHeight / 2;\n });\n if (justOpened.current) {\n justOpened.current = false;\n const target =\n popRef.current.querySelector<HTMLElement>('[aria-selected=\"true\"]') ??\n popRef.current.querySelector<HTMLElement>('[role=\"option\"]:not([disabled])');\n target?.focus({ preventScroll: true });\n }\n }, [open, draft]);\n\n /* ---------------------------- display + drafting --------------------------- */\n\n const display = (t: Draft) => {\n if (!is12) return toString(t);\n const period = t.h >= 12 ? \"PM\" : \"AM\";\n const h12 = t.h % 12 === 0 ? 12 : t.h % 12;\n return `${h12}:${pad(t.m)} ${period}`;\n };\n\n const period: \"AM\" | \"PM\" = draft && draft.h >= 12 ? \"PM\" : \"AM\";\n\n const hours = is12\n ? Array.from({ length: 12 }, (_, i) => (i === 0 ? 12 : i)) // 12,1..11\n : Array.from({ length: 24 }, (_, i) => i);\n\n const to24 = (h12: number, p: \"AM\" | \"PM\") => (h12 % 12) + (p === \"PM\" ? 12 : 0);\n\n const hourOk = (h24: number) => minutes.some((m) => inRange({ h: h24, m }));\n\n /** 24-hour value for a picker hour, preferring the current AM/PM when valid. */\n const resolveHour = (h: number) => {\n if (!is12) return h;\n const preferred = to24(h, period);\n if (hourOk(preferred)) return preferred;\n const other = to24(h, period === \"AM\" ? \"PM\" : \"AM\");\n return hourOk(other) ? other : preferred;\n };\n\n const hourDisabled = (h: number) =>\n is12 ? !hourOk(to24(h, \"AM\")) && !hourOk(to24(h, \"PM\")) : !hourOk(h);\n\n const periodDisabled = (p: \"AM\" | \"PM\") =>\n !Array.from({ length: 12 }, (_, i) => i + (p === \"PM\" ? 12 : 0)).some(hourOk);\n\n const setHour = (h: number) => {\n const hh = resolveHour(h);\n const m = draft && inRange({ h: hh, m: draft.m })\n ? draft.m\n : (minutes.find((mm) => inRange({ h: hh, m: mm })) ?? 0);\n setDraft({ h: hh, m });\n };\n const setMinute = (m: number) => setDraft({ h: draft?.h ?? (is12 ? 0 : 0), m });\n const setPeriod = (p: \"AM\" | \"PM\") => {\n const base = draft ?? { h: 0, m: 0 };\n const h = (base.h % 12) + (p === \"PM\" ? 12 : 0);\n const m = inRange({ h, m: base.m })\n ? base.m\n : (minutes.find((mm) => inRange({ h, m: mm })) ?? base.m);\n setDraft({ h, m });\n };\n\n const confirm = () => {\n if (draft && inRange(draft)) commit(draft);\n close();\n };\n\n const setNow = () => {\n const now = new Date();\n const rounded = Math.round(now.getMinutes() / step) * step;\n let h = now.getHours();\n let m = rounded;\n if (m >= 60) {\n m = 0;\n h = (h + 1) % 24;\n }\n setDraft({ h, m });\n };\n\n /* -------------------------------- keyboard -------------------------------- */\n\n const onPopKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n close();\n return;\n }\n const opt = (e.target as HTMLElement).closest<HTMLElement>('[role=\"option\"]');\n if (!opt) return;\n const col = opt.parentElement as HTMLElement;\n const cols = Array.from(popRef.current!.querySelectorAll<HTMLElement>('[role=\"listbox\"]'));\n const move = (list: HTMLElement[], idx: number, dir: 1 | -1) => {\n for (let i = idx + dir; i >= 0 && i < list.length; i += dir) {\n if (!(list[i] as HTMLButtonElement).disabled) return list[i];\n }\n return null;\n };\n let next: HTMLElement | null = null;\n const items = Array.from(col.querySelectorAll<HTMLElement>('[role=\"option\"]'));\n const i = items.indexOf(opt);\n if (e.key === \"ArrowDown\") next = move(items, i, 1);\n else if (e.key === \"ArrowUp\") next = move(items, i, -1);\n else if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\n const c = cols.indexOf(col) + (e.key === \"ArrowRight\" ? 1 : -1);\n const target = cols[c];\n if (target)\n next =\n target.querySelector<HTMLElement>('[aria-selected=\"true\"]') ??\n target.querySelector<HTMLElement>('[role=\"option\"]:not([disabled])');\n } else return;\n e.preventDefault();\n next?.focus();\n };\n\n /* --------------------------------- render --------------------------------- */\n\n const optionClass = (selected: boolean, off: boolean) =>\n cn(\n \"flex h-8 w-full items-center justify-center rounded-md text-sm\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n selected\n ? \"bg-primary-600 font-semibold text-white hover:bg-primary-700\"\n : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n );\n\n const column = (\n label: string,\n items: { key: string; label: string; selected: boolean; disabled: boolean; onPick: () => void }[],\n ) => (\n <div\n role=\"listbox\"\n aria-label={label}\n className=\"h-52 w-16 space-y-0.5 overflow-y-auto overscroll-contain px-1 [scrollbar-width:thin]\"\n >\n {items.map((it) => (\n <button\n key={it.key}\n type=\"button\"\n role=\"option\"\n aria-selected={it.selected}\n disabled={it.disabled}\n tabIndex={it.selected ? 0 : -1}\n onClick={it.onPick}\n className={optionClass(it.selected, it.disabled)}\n >\n {it.label}\n </button>\n ))}\n </div>\n );\n\n const selectedHourLabel = draft ? (is12 ? (draft.h % 12 === 0 ? 12 : draft.h % 12) : draft.h) : null;\n\n return (\n <div ref={rootRef} className=\"relative inline-block max-w-full\">\n {name && <input type=\"hidden\" name={name} value={current ?? \"\"} />}\n\n <div\n className={cn(\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n open && \"border-primary-600 ring-4 ring-primary-100\",\n disabled && \"opacity-30 bg-gray-300 select-none pointer-events-none shadow-none\",\n size === \"sm\" ? \"w-[320px] h-10\" : size === \"lg\" ? \"w-[313px] h-11\" : \"w-full h-10\",\n error &&\n \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n className,\n )}\n >\n <RiTimeLine\n size={18}\n aria-hidden=\"true\"\n className=\"shrink-0 text-gray-500 group-hover:text-gray-600\"\n />\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? dialogId : undefined}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-invalid={error || undefined}\n onClick={() => (open ? close() : openPicker())}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\" && !open) {\n e.preventDefault();\n openPicker();\n }\n }}\n className={cn(\n \"min-w-0 flex-1 truncate bg-transparent text-left text-sm focus:outline-none\",\n currentTime ? \"text-gray-900\" : \"text-gray-500\",\n )}\n >\n {currentTime ? display(currentTime) : placeholder}\n </button>\n {clearable && currentTime && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear time\"\n onClick={() => {\n commit(null);\n setDraft(null);\n triggerRef.current?.focus();\n }}\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-800\",\n focusRing,\n )}\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {open && (\n <div\n ref={popRef}\n id={dialogId}\n role=\"dialog\"\n aria-label=\"Choose time\"\n onKeyDown={onPopKeyDown}\n className={cn(\n \"absolute left-0 z-50 rounded-xl border border-gray-200 bg-white p-3 shadow-lg\",\n placement === \"top\" ? \"bottom-full mb-2\" : \"top-full mt-2\",\n )}\n >\n <div className=\"mb-2 text-center text-sm font-semibold text-gray-900\" aria-live=\"polite\">\n {draft ? display(draft) : \"--:--\"}\n </div>\n <div className=\"flex justify-center gap-1\">\n {column(\n \"Hours\",\n hours.map((h) => ({\n key: String(h),\n label: is12 ? String(h) : pad(h),\n selected: selectedHourLabel === h,\n disabled: hourDisabled(h),\n onPick: () => setHour(h),\n })),\n )}\n {column(\n \"Minutes\",\n minutes.map((m) => ({\n key: String(m),\n label: pad(m),\n selected: draft?.m === m,\n disabled: draft ? !inRange({ h: draft.h, m }) : false,\n onPick: () => setMinute(m),\n })),\n )}\n {is12 &&\n column(\n \"AM or PM\",\n ([\"AM\", \"PM\"] as const).map((p) => ({\n key: p,\n label: p,\n selected: !!draft && period === p,\n disabled: periodDisabled(p),\n onPick: () => setPeriod(p),\n })),\n )}\n </div>\n <div className=\"mt-2 flex items-center justify-between border-t border-gray-100 pt-2\">\n {showNow ? (\n <button\n type=\"button\"\n className={cn(textButton, \"text-primary-700 hover:bg-primary-50\")}\n onClick={setNow}\n >\n Now\n </button>\n ) : (\n <span />\n )}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n className={cn(textButton, \"text-gray-600 hover:bg-gray-100\")}\n onClick={() => close()}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={!draft || !inRange(draft)}\n className={cn(textButton, \"bg-primary-600 text-white hover:bg-primary-700\")}\n onClick={confirm}\n >\n OK\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nTimePicker.displayName = \"TimePicker\";\n\nexport default TimePicker;\n","\"use client\";\nimport React from \"react\";\nimport DatePicker, { DateRange, DateRangePreset } from \"./DatePicker\";\n\ntype SharedProps = Omit<\n React.ComponentProps<typeof DatePicker>,\n \"mode\" | \"value\" | \"defaultValue\" | \"onChange\"\n>;\n\nexport interface DateRangePickerProps extends SharedProps {\n /** Controlled value. */\n value?: DateRange;\n /** Uncontrolled initial value. */\n defaultValue?: DateRange;\n onChange?: (range: DateRange) => void;\n /** Optional. Shortcut buttons such as \"Last 7 days\". See getDefaultRangePresets(). */\n presets?: DateRangePreset[];\n}\n\n/** Common presets: Last 7 / 30 days and This month. */\nexport const getDefaultRangePresets = (now: Date = new Date()): DateRangePreset[] => {\n const end = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const daysAgo = (n: number) =>\n new Date(end.getFullYear(), end.getMonth(), end.getDate() - n);\n return [\n { label: \"Last 7 days\", range: { start: daysAgo(6), end } },\n { label: \"Last 30 days\", range: { start: daysAgo(29), end } },\n {\n label: \"This month\",\n range: {\n start: new Date(end.getFullYear(), end.getMonth(), 1),\n end: new Date(end.getFullYear(), end.getMonth() + 1, 0),\n },\n },\n ];\n};\n\n/** DatePicker locked to range mode. */\nconst DateRangePicker = (props: DateRangePickerProps) => (\n <DatePicker {...(props as object)} mode=\"range\" />\n);\n\nDateRangePicker.displayName = \"DateRangePicker\";\n\nexport default DateRangePicker;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface DividerProps {\n width?: string;\n height?: string;\n position?: \"horizontal\" | \"vertical\";\n className?: string;\n}\n\nconst Divider = ({\n width,\n height,\n position = \"horizontal\",\n className,\n}: DividerProps) => {\n return (\n <div\n style={{\n width: width,\n height: height,\n }}\n className={cn(\n `bg-gray-200`,\n position === \"horizontal\" ? \"w-full h-[1px]\" : \"w-[1px] h-full\",\n className\n )}\n ></div>\n );\n};\n\nexport default Divider;\n","\"use client\";\nimport React, {\n Dispatch,\n FC,\n ReactNode,\n SetStateAction,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { RiCloseLine } from \"@remixicon/react\";\n\ninterface DrawerProps {\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n children: ReactNode;\n position?: \"left\" | \"right\" | \"top\" | \"bottom\";\n width?: string;\n height?: string;\n className?: string;\n showCloseButton?: boolean;\n closeOnOutsideClick?: boolean;\n /** Optional. Close when Escape is pressed. Defaults to true. */\n closeOnEscape?: boolean;\n /** Optional. Accessible name for the drawer. Prefer aria-labelledby if you have a visible title. */\n \"aria-label\"?: string;\n /** Optional. id of the element that titles the drawer. */\n \"aria-labelledby\"?: string;\n /** Optional. id of the element that describes the drawer. */\n \"aria-describedby\"?: string;\n}\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]):not([type=\"hidden\"]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nconst Drawer: FC<DrawerProps> = ({\n isOpen,\n setIsOpen,\n children,\n position = \"right\",\n width = \"w-80\",\n height = \"h-64\",\n className,\n showCloseButton = true,\n closeOnOutsideClick = true,\n closeOnEscape = true,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n}) => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, [setIsOpen]);\n\n // Prevent body scroll while open, and restore the previous value on close.\n // (The old version wrote body.style.overflow on every change, even while\n // closed, so one closed drawer could unlock the page for another open one.)\n useEffect(() => {\n if (!isOpen) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [isOpen]);\n\n // Move focus into the drawer on open and hand it back on close.\n useEffect(() => {\n if (!isOpen) return;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n const panel = panelRef.current;\n // Respect autoFocus inside the children.\n if (panel && !panel.contains(document.activeElement)) {\n panel.focus({ preventScroll: true });\n }\n return () => {\n previouslyFocused?.focus?.();\n };\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!closeOnEscape) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && isOpen) {\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen, handleClose, closeOnEscape]);\n\n // Keep Tab / Shift+Tab inside the drawer.\n const handlePanelKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") return;\n const panel = panelRef.current;\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (items.length === 0) {\n event.preventDefault();\n panel.focus();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === panel)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n return (\n <div>\n <div\n className={cn(\n \"fixed inset-0 bg-black/50 backdrop-blur-[2px] z-[10000000000000000]\",\n \"transition-[opacity,visibility] duration-300 ease-out motion-reduce:transition-none\",\n isOpen\n ? \"opacity-100 visible\"\n : \"opacity-0 invisible pointer-events-none\",\n )}\n onClick={() => closeOnOutsideClick && handleClose()}\n />\n\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n tabIndex={-1}\n onKeyDown={handlePanelKeyDown}\n className={cn(\n // surface: rounded on the inner edge, hairline border, deeper shadow\n \"fixed bg-white shadow-2xl p-4 z-[100000000000000000] focus:outline-none\",\n // slides with the transform; invisible keeps a closed drawer's\n // links and buttons out of the tab order\n \"transition-[transform,visibility] duration-300 ease-out motion-reduce:transition-none\",\n position === \"right\" &&\n `top-0 right-0 ${width} h-full max-w-full rounded-l-2xl border-l border-gray-200`,\n position === \"left\" &&\n `top-0 left-0 ${width} h-full max-w-full rounded-r-2xl border-r border-gray-200`,\n position === \"top\" &&\n `top-0 left-0 w-full ${height} max-h-full rounded-b-2xl border-b border-gray-200`,\n position === \"bottom\" &&\n `bottom-0 left-0 w-full ${height} max-h-full rounded-t-2xl border-t border-gray-200`,\n !isOpen &&\n (position === \"right\"\n ? \"translate-x-full\"\n : position === \"left\"\n ? \"-translate-x-full\"\n : position === \"top\"\n ? \"-translate-y-full\"\n : \"translate-y-full\"),\n isOpen ? \"translate-x-0 translate-y-0 visible\" : \"invisible\",\n className,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={handleClose}\n aria-label=\"Close drawer\"\n className={cn(\n \"absolute top-3 right-4 z-10 inline-flex items-center justify-center rounded-lg p-1 cursor-pointer\",\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-100 hover:text-gray-800 active:bg-gray-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n )}\n >\n <RiCloseLine size={20} aria-hidden=\"true\" />\n </button>\n )}\n\n <div className=\"overflow-y-auto overscroll-contain h-full\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Drawer;\n","\"use client\";\nimport React, {\n useEffect,\n useState,\n useMemo,\n useCallback,\n forwardRef,\n useRef,\n useImperativeHandle,\n} from \"react\";\nimport { RiArrowDownSLine, RiCheckLine, RiSearchLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Input from \"./Input\";\nimport Label from \"./Label\";\nimport Checkbox from \"./Checkbox\";\n\ntype Option = {\n label: string | number;\n value: string | number;\n info?: string;\n addInfo?: string;\n tooltipContent?: string;\n disabledOption?: boolean;\n labelTextColor?: string;\n};\n\ninterface MenuItemProps {\n label?: string | number;\n value: string | number;\n children?: React.ReactNode;\n}\n\ninterface DropdownProps {\n id?: string;\n icon?: JSX.Element;\n options: Option[];\n selected?: Option[];\n setSelected?: React.Dispatch<React.SetStateAction<Option[]>>;\n onApply?: () => void;\n onReset?: () => void;\n dropdownText?: string;\n search?: boolean;\n multiple?: boolean;\n renderItem?: (option: Option) => React.ReactNode;\n children?: React.ReactNode;\n position?: \"top\" | \"bottom\";\n info?: string | number;\n addInfo?: string | number;\n tooltipContent?: string;\n width?: string;\n dropdownFooter?: boolean | undefined;\n disabled?: boolean;\n labelTextColor?: string;\n footerAction?: React.ReactNode;\n height?: string;\n}\n\nconst defaultRenderItem = (option: Option) => {\n return <MenuItem label={option.label} value={option.value} />;\n};\n\n// Shared focus ring (same family as Input, Textarea and Pagination)\nconst focusRing =\n \"focus-visible:outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\";\n\n// Small text buttons inside the menu (Select all, Reset)\nconst textButton =\n \"rounded-md px-1.5 py-0.5 text-sm font-medium cursor-pointer transition-colors duration-150 motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst Dropdown = forwardRef<HTMLDivElement, DropdownProps>(\n (\n {\n id = `dropdown-${Math.random().toString(36).substring(2, 11)}`,\n options,\n selected,\n setSelected,\n search = false,\n multiple = false,\n dropdownText = \"Select\",\n renderItem = defaultRenderItem,\n children,\n icon,\n position = \"top\",\n width,\n info,\n dropdownFooter = false,\n onApply,\n disabled = false,\n onReset,\n footerAction,\n height = \"200px\",\n },\n ref,\n ) => {\n const [searchQuery, setSearchQuery] = useState<string>(\"\");\n const [filteredOptions, setFilteredOptions] = useState<Option[]>(\n options || [],\n );\n\n const [dropdownMenu, setDropdownMenu] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n useImperativeHandle(ref, () => dropdownRef.current!);\n\n useEffect(() => {\n if (options) {\n setFilteredOptions(options);\n }\n }, [options]);\n\n const memoizedFilteredOptions = useMemo(() => {\n if (!search) return filteredOptions;\n return filteredOptions.filter((option) => {\n if (typeof option.label === \"string\") {\n return option.label.toLowerCase().includes(searchQuery.toLowerCase());\n }\n return option.label.toString().includes(searchQuery.toLowerCase());\n });\n }, [search, searchQuery, filteredOptions]);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n },\n [],\n );\n\n const toggleOption = useCallback(\n (option: Option) => {\n if (multiple && setSelected) {\n setSelected((prevSelected) =>\n prevSelected.some((item) => item.value === option.value)\n ? prevSelected.filter((item) => item.value !== option.value)\n : [...prevSelected, option],\n );\n } else if (setSelected) {\n setSelected([option]);\n setDropdownMenu(false);\n }\n },\n [multiple, setSelected],\n );\n\n const handleCheckboxChange = useCallback(\n (option: Option) => {\n if (multiple && setSelected) {\n setSelected((prevSelected) =>\n prevSelected.some((item) => item.value === option.value)\n ? prevSelected.filter((item) => item.value !== option.value)\n : [...prevSelected, option],\n );\n } else if (setSelected) {\n setSelected([option]);\n }\n },\n [multiple, setSelected],\n );\n\n const handleSelectAll = () => {\n if (selected?.length === filteredOptions.length) {\n setSelected?.([]);\n } else {\n setSelected?.(filteredOptions);\n }\n };\n\n const handleReset = () => {\n if (onReset) {\n onReset();\n }\n setSelected?.([]);\n setDropdownMenu(false);\n };\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setDropdownMenu(false);\n }\n };\n\n // Same text as before; hasValue only drives the placeholder colour.\n const triggerText = multiple\n ? (selected?.length ?? 0) > 0\n ? `${selected?.length} Selected`\n : dropdownText\n : selected?.[0]?.label\n ? selected?.[0]?.label\n : dropdownText;\n const hasValue = multiple\n ? (selected?.length ?? 0) > 0\n : !!selected?.[0]?.label;\n\n return (\n <div\n id={id}\n ref={dropdownRef}\n // Escape closes the menu and hands focus back to the trigger. It is\n // stopped here so an enclosing Modal doesn't also close.\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && dropdownMenu) {\n e.stopPropagation();\n setDropdownMenu(false);\n triggerRef.current?.focus();\n }\n }}\n className={cn(\n \"relative bg-white shadow-[0px_1px_2px_0px_#1018280D] rounded-xl\",\n !width && \"w-full\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n style={{\n width: width,\n }}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={dropdownMenu}\n aria-controls={`${id}-listbox`}\n aria-labelledby={`${id}-label`}\n disabled={disabled}\n onClick={() => !disabled && setDropdownMenu((prev) => !prev)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n !disabled && setDropdownMenu((prev) => !prev);\n }\n }}\n className={cn(\n // height is unchanged (py-2 + 1px border), the menu offsets depend on it\n \"w-full py-2 px-[14px] rounded-xl flex justify-between items-center gap-2 text-sm bg-white cursor-pointer border\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n focusRing,\n dropdownMenu\n ? \"border-primary-600 ring-4 ring-primary-100 hover:border-primary-600 hover:bg-white\"\n : \"border-gray-200\",\n disabled &&\n \"bg-gray-300 hover:bg-gray-300 hover:border-gray-200 cursor-not-allowed\",\n )}\n >\n <section className=\"flex min-w-0 items-center gap-2 text-ellipsis overflow-hidden\">\n {icon && (\n <span aria-hidden=\"true\" className=\"shrink-0 text-gray-500\">\n {icon}\n </span>\n )}\n <span\n id={`${id}-label`}\n className={cn(\n \"line-clamp-1 w-full text-left\",\n hasValue ? \"text-gray-900\" : \"text-gray-500\",\n )}\n >\n {triggerText}\n </span>\n </section>\n <RiArrowDownSLine\n aria-hidden=\"true\"\n size={18}\n className={cn(\n \"shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none\",\n dropdownMenu && \"rotate-180\",\n )}\n />\n </button>\n <ul\n id={`${id}-listbox`}\n role=\"listbox\"\n aria-multiselectable={multiple}\n aria-labelledby={`${id}-label`}\n className={cn(\n \"absolute w-full mt-1 z-[1000] overflow-hidden rounded-xl border border-gray-200 bg-white text-sm\",\n \"transition-[opacity,transform,max-height,visibility] ease-out motion-reduce:transition-none\",\n position === \"top\" ? \"top-10\" : \"bottom-10\",\n dropdownMenu\n ? \"max-h-[360px] h-fit opacity-100 translate-y-0 visible shadow-lg duration-150\"\n : // invisible keeps the closed menu out of the tab order\n \"max-h-0 opacity-0 -translate-y-1 invisible pointer-events-none shadow-none duration-100\",\n )}\n >\n {search && (\n <div className=\"border-b border-gray-100\">\n <Input\n id={`${id}-search`}\n type=\"text\"\n placeholder=\"Search...\"\n aria-label=\"Search options\"\n value={searchQuery}\n onChange={handleSearchChange}\n className=\"rounded-none text-gray-800 bg-white w-full h-[40px] pl-3 border-none shadow-none hover:bg-white focus-within:bg-white focus-within:hover:bg-white focus-within:ring-0\"\n endIcon={<RiSearchLine size={18} />}\n />\n </div>\n )}\n {multiple && (\n <section className=\"py-1.5 px-[10px] flex justify-between items-center border-b border-gray-100\">\n <button\n type=\"button\"\n aria-label=\"Select all\"\n onClick={handleSelectAll}\n className={cn(\n textButton,\n \"text-primary-600 hover:text-primary-700 hover:bg-primary-50\",\n )}\n >\n Select all\n </button>\n <button\n aria-label=\"Reset\"\n type=\"button\"\n className={cn(\n textButton,\n \"text-warning-700 hover:text-warning-800 hover:bg-warning-50\",\n )}\n onClick={handleReset}\n >\n Reset\n </button>\n </section>\n )}\n <section\n style={{ maxHeight: height }}\n className=\"overflow-y-auto overscroll-contain py-1\"\n >\n {options ? (\n memoizedFilteredOptions.length === 0 ? (\n <p className=\"px-[14px] py-6 text-center text-sm text-gray-500\">\n No results found\n </p>\n ) : (\n memoizedFilteredOptions.map((option, i) => {\n const isSelected =\n !!selected && selected[0]?.value === option.value;\n\n return (\n <React.Fragment key={i}>\n {multiple ? (\n <Label\n className={cn(\n \"flex flex-col py-1.5 px-[14px] mx-1 rounded-lg cursor-pointer\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-50 has-[:checked]:bg-primary-50 has-[:checked]:hover:bg-primary-100\",\n option?.disabledOption &&\n \"opacity-50 cursor-not-allowed hover:bg-transparent text-gray-300 select-none\",\n )}\n htmlFor={`${id}-checkbox-${option.value}`}\n key={i}\n >\n <section className=\"flex items-center justify-between gap-2 w-full\">\n <div className=\"flex gap-2\">\n <Checkbox\n id={`${id}-checkbox-${option.value}`}\n checked={\n selected?.some(\n (item) => item.value === option.value,\n ) ?? false\n }\n onChange={() => handleCheckboxChange(option)}\n disabled={option?.disabledOption}\n />\n <div className=\"flex items-center gap-1\">\n <div\n style={{\n color: option?.disabledOption\n ? \"#D1D5DB\"\n : option.labelTextColor,\n }}\n className={cn(\n \"break-words\",\n option?.disabledOption && \"text-gray-300\",\n )}\n >\n {renderItem(option)}\n </div>\n </div>\n </div>\n <span className=\"shrink-0 text-xs text-gray-500\">\n {option?.info}\n </span>\n </section>\n <span className=\"pt-[2px] text-xs text-gray-500\">\n {option?.addInfo}\n </span>\n </Label>\n ) : (\n <Label\n key={i}\n htmlFor={`${id}-checkbox-${option.value}`}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option?.disabledOption || undefined}\n tabIndex={option?.disabledOption ? -1 : 0}\n className={cn(\n \"flex justify-between py-1.5 px-[14px] mx-1 rounded-lg gap-2 items-center cursor-pointer\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-50\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n {\n \"bg-primary-50 hover:bg-primary-100 font-medium\":\n isSelected,\n \"opacity-50 cursor-not-allowed hover:bg-transparent text-gray-500\":\n option?.disabledOption,\n },\n )}\n onClick={() =>\n !option?.disabledOption && toggleOption(option)\n }\n onKeyDown={(e: React.KeyboardEvent) => {\n if (\n (e.key === \"Enter\" || e.key === \" \") &&\n !option?.disabledOption\n ) {\n e.preventDefault();\n toggleOption(option);\n triggerRef.current?.focus();\n }\n }}\n >\n <div\n style={{\n color: option?.disabledOption\n ? \"#D1D5DB\"\n : option.labelTextColor,\n }}\n className={cn(\n \"break-words\",\n option?.disabledOption && \"text-gray-300\",\n )}\n >\n {renderItem(option)}\n </div>\n <span className=\"flex shrink-0 items-center gap-2 text-gray-500\">\n {info}\n {isSelected && (\n <RiCheckLine\n size={16}\n aria-hidden=\"true\"\n className=\"text-primary-600\"\n />\n )}\n </span>\n </Label>\n )}\n </React.Fragment>\n );\n })\n )\n ) : (\n children\n )}\n </section>\n {footerAction && (\n <div className=\"py-2 px-2 border-t border-gray-200\">\n {footerAction}\n </div>\n )}\n {dropdownFooter && (\n <DropdownFooter\n setDropdownMenu={setDropdownMenu}\n onApply={onApply}\n />\n )}\n </ul>\n </div>\n );\n },\n);\n\nexport const MenuItem: React.FC<MenuItemProps> = ({ label, children }) => {\n return <p className=\"break-all\">{label || children}</p>;\n};\n\ninterface DropdownFooterProps {\n onApply?: (() => void) | undefined;\n setDropdownMenu?: (value: boolean) => void;\n}\n\nexport const DropdownFooter: React.FC<DropdownFooterProps> = ({\n onApply,\n setDropdownMenu,\n}) => {\n return (\n <div className=\"flex justify-end border-t border-gray-200 bg-gray-25 px-[14px] py-[8px] text-sm\">\n <button\n type=\"button\"\n className={cn(\n \"rounded-lg border border-primary-600 bg-primary-600 px-3 py-1 font-semibold text-white cursor-pointer\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-primary-700 hover:border-primary-700 active:bg-primary-900 active:border-primary-900\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n )}\n onClick={() => {\n if (onApply) {\n onApply();\n }\n if (setDropdownMenu) {\n setDropdownMenu(false);\n }\n }}\n >\n Apply\n </button>\n </div>\n );\n};\n\nDropdown.displayName = \"Dropdown\";\n\nexport default Dropdown;\n","import { cva, VariantProps } from \"class-variance-authority\";\nimport React, { LabelHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface LabelProps\n extends\n LabelHTMLAttributes<HTMLLabelElement>,\n VariantProps<typeof labelVariants> {\n htmlFor?: string;\n children: ReactNode;\n required?: boolean;\n disabled?: boolean;\n}\n\nconst labelVariants = cva(\"flex item-start\", {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n});\n\nconst Label = ({\n children,\n htmlFor,\n size,\n required,\n disabled,\n className,\n ...props\n}: LabelProps) => {\n return (\n <label\n htmlFor={htmlFor}\n className={cn(\n \"cursor-pointer\",\n labelVariants({ className, size }),\n disabled === true\n ? \"opacity-30 select-none pointer-events-none\"\n : \"opacity-100\",\n )}\n aria-disabled={disabled}\n {...props}\n >\n <div className=\"flex items-center gap-1\">\n {children}\n {required && (\n <span\n aria-label=\"required field\"\n role=\"presentation\"\n className=\"text-red-500\"\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n </div>\n </label>\n );\n};\n\nexport default Label;\n","\"use client\";\n\nimport { RiArrowDownSLine } from \"@remixicon/react\";\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n Children,\n isValidElement,\n cloneElement,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\n\n/* ─────────────────────────────\n Types\n───────────────────────────── */\ntype DropdownAlignment =\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"center\"\n | \"start\"\n | \"end\";\n\ninterface DropdownProps {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n triggerRef: React.RefObject<HTMLDivElement>;\n contentRef: React.RefObject<HTMLDivElement>;\n registerItem: () => number;\n menuItemsRef: React.MutableRefObject<(HTMLDivElement | null)[]>;\n closeMenu: () => void;\n}\n\ninterface SubmenuProps {\n isSubOpen: boolean;\n setIsSubOpen: (open: boolean) => void;\n}\n\n// Helper function to check component type\nconst isComponentType = (\n child: any,\n component: React.ComponentType<any>,\n): boolean => {\n return child.type === component;\n};\n\n/* ─────────────────────────────\n Root DropdownMenu\n───────────────────────────── */\nexport default function DropdownMenu({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const menuItemsRef = useRef<(HTMLDivElement | null)[]>([]);\n const itemsCountRef = useRef(0);\n\n const registerItem = useCallback(() => {\n const idx = itemsCountRef.current;\n itemsCountRef.current += 1;\n return idx;\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n setFocusedIndex(-1);\n }, []);\n\n const dropdownProps: DropdownProps = {\n isOpen,\n setIsOpen,\n triggerRef,\n contentRef,\n registerItem,\n menuItemsRef,\n closeMenu,\n };\n\n /* Outside click */\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n if (\n triggerRef.current &&\n contentRef.current &&\n !triggerRef.current.contains(e.target as Node) &&\n !contentRef.current.contains(e.target as Node)\n ) {\n closeMenu();\n }\n };\n\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isOpen, closeMenu]);\n\n /* Keyboard navigation */\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"Escape\":\n e.preventDefault();\n closeMenu();\n triggerRef.current?.focus();\n break;\n\n case \"ArrowDown\":\n e.preventDefault();\n setFocusedIndex((p) => (p < itemsCountRef.current - 1 ? p + 1 : 0));\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n setFocusedIndex((p) => (p > 0 ? p - 1 : itemsCountRef.current - 1));\n break;\n\n case \"Home\":\n // preventDefault stops the page from scrolling while the menu is open\n e.preventDefault();\n setFocusedIndex(0);\n break;\n\n case \"End\":\n e.preventDefault();\n setFocusedIndex(itemsCountRef.current - 1);\n break;\n }\n };\n\n document.addEventListener(\"keydown\", handler);\n setFocusedIndex(0);\n\n return () => document.removeEventListener(\"keydown\", handler);\n }, [isOpen, closeMenu]);\n\n /* Focus active item */\n useEffect(() => {\n if (!isOpen) return;\n menuItemsRef.current[focusedIndex]?.focus();\n }, [focusedIndex, isOpen]);\n\n /* Enhance children with dropdown props */\n const enhancedChildren = Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n\n // Add displayName for identification\n const childWithDisplayName = cloneElement(child as React.ReactElement, {\n ...child.props,\n dropdownProps,\n });\n\n return childWithDisplayName;\n });\n\n return <div className=\"relative inline-block\">{enhancedChildren}</div>;\n}\n\n/* ─────────────────────────────\n Trigger\n───────────────────────────── */\nexport function DropdownMenuTrigger({\n children,\n dropdownProps,\n}: {\n children: React.ReactNode;\n dropdownProps?: DropdownProps;\n}) {\n const { isOpen, setIsOpen, triggerRef } = dropdownProps || {};\n\n if (!dropdownProps) {\n throw new Error(\"DropdownMenuTrigger must be used inside DropdownMenu\");\n }\n\n return (\n <div\n ref={triggerRef}\n tabIndex={0}\n role=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n onClick={() => setIsOpen?.(!isOpen)}\n // Enter / Space open the menu when the wrapper itself is focused.\n // The target check stops a nested native <button> from toggling twice.\n onKeyDown={(e) => {\n if (\n e.target === e.currentTarget &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n setIsOpen?.(!isOpen);\n }\n }}\n className={cn(\n \"cursor-pointer rounded-xl outline-none\",\n // keyboard-only ring, same family as Button\n \"focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n )}\n >\n {children}\n </div>\n );\n}\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\n\n/* ─────────────────────────────\n Content\n───────────────────────────── */\nexport function DropdownMenuContent({\n children,\n align = \"right\",\n className,\n dropdownProps,\n}: {\n children: React.ReactNode;\n align?: DropdownAlignment;\n className?: string;\n dropdownProps?: DropdownProps;\n}) {\n const { isOpen, contentRef } = dropdownProps || {};\n const [visible, setVisible] = useState(false);\n\n if (!dropdownProps) {\n throw new Error(\"DropdownMenuContent must be used inside DropdownMenu\");\n }\n\n useEffect(() => {\n if (isOpen) {\n setVisible(true);\n } else {\n const timer = setTimeout(() => setVisible(false), 150);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n if (!visible) return null;\n\n const positionClasses = {\n left: \"right-0\",\n right: \"left-0\",\n start: \"right-0\",\n end: \"left-0\",\n center: \"left-1/2 -translate-x-1/2\",\n top: \"bottom-full mb-2\",\n bottom: \"top-full mt-2\",\n };\n\n // Function to recursively inject dropdownProps\n const injectPropsToChildren = (\n children: React.ReactNode,\n ): React.ReactNode => {\n return Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n\n // Check if this is a menu item or submenu\n const isMenuItem = isComponentType(child, DropdownMenuItem);\n const isSubMenu = isComponentType(child, DropdownMenuSub);\n if (isMenuItem || isSubMenu) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n dropdownProps,\n });\n }\n\n // If it has children, recursively inject props\n if (child.props.children) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n children: injectPropsToChildren(child.props.children),\n });\n }\n\n return child;\n });\n };\n\n return (\n <div\n ref={contentRef}\n role=\"menu\"\n className={cn(\n // surface: same radius and border language as Input and Dropdown\n \"absolute mt-2 w-56 max-w-[calc(100vw-1rem)] rounded-xl border border-gray-200 bg-white p-1 shadow-lg z-50\",\n // fade and scale from the edge closest to the trigger\n align === \"top\" ? \"origin-bottom\" : \"origin-top\",\n \"transition-[opacity,transform] duration-150 ease-out motion-reduce:transition-none\",\n isOpen ? \"opacity-100 scale-100\" : \"opacity-0 scale-95\",\n positionClasses[align] || positionClasses.right,\n className,\n )}\n >\n {injectPropsToChildren(children)}\n </div>\n );\n}\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\n\n/* ─────────────────────────────\n Label\n───────────────────────────── */\nexport function DropdownMenuLabel({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"px-3 pt-2 pb-1 text-xs font-semibold uppercase tracking-wide text-gray-500 select-none\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\";\n\n/* ─────────────────────────────\n Separator\n───────────────────────────── */\nexport function DropdownMenuSeparator() {\n return <div role=\"separator\" className=\"my-1 h-px bg-gray-100\" />;\n}\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\";\n\n/* ─────────────────────────────\n Item Wrapper\n───────────────────────────── */\nfunction DropdownMenuItemWrapper({\n children,\n onClick,\n disabled,\n className,\n dropdownProps,\n closeOnClick = true,\n ariaExpanded,\n}: {\n children: React.ReactNode;\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n dropdownProps?: DropdownProps;\n closeOnClick?: boolean;\n ariaExpanded?: boolean;\n}) {\n const [index] = useState(() => dropdownProps?.registerItem?.() ?? -1);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (index >= 0 && dropdownProps?.menuItemsRef) {\n dropdownProps.menuItemsRef.current[index] = ref.current;\n }\n }, [index, dropdownProps]);\n\n const handleClick = () => {\n if (disabled) return;\n onClick?.();\n if (closeOnClick) {\n dropdownProps?.closeMenu();\n }\n };\n\n return (\n <div\n ref={ref}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-expanded={ariaExpanded}\n aria-disabled={disabled}\n onClick={handleClick}\n // Enter / Space activate the item (a div doesn't do this natively)\n onKeyDown={(e) => {\n if (\n e.target === e.currentTarget &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n handleClick();\n }\n }}\n className={cn(\n \"flex items-center justify-between gap-2 rounded-lg px-3 py-2 text-sm select-none outline-none\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n // keyboard focus: tint plus an inset ring so it is never clipped\n \"focus:bg-gray-100 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n disabled\n ? \"text-gray-400 cursor-not-allowed\"\n : \"text-gray-700 cursor-pointer hover:bg-gray-100 active:bg-gray-200\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n/* ─────────────────────────────\n Item\n───────────────────────────── */\nexport function DropdownMenuItem({\n children,\n onClick,\n disabled,\n dropdownProps,\n className,\n}: {\n children: React.ReactNode;\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n dropdownProps?: DropdownProps;\n}) {\n return (\n <DropdownMenuItemWrapper\n className={className}\n disabled={disabled}\n onClick={onClick}\n closeOnClick={true}\n dropdownProps={dropdownProps}\n >\n {children}\n </DropdownMenuItemWrapper>\n );\n}\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\n\n/* ─────────────────────────────\n Submenu\n───────────────────────────── */\nexport function DropdownMenuSub({\n children,\n dropdownProps,\n}: {\n children: React.ReactNode;\n dropdownProps?: DropdownProps;\n}) {\n const [isSubOpen, setIsSubOpen] = useState(false);\n\n const submenuProps: SubmenuProps = {\n isSubOpen,\n setIsSubOpen,\n };\n\n // Function to inject both dropdownProps and submenuProps\n const injectPropsToChildren = (\n children: React.ReactNode,\n ): React.ReactNode => {\n return Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n\n const isSubTrigger = isComponentType(child, DropdownMenuSubTrigger);\n const isSubContent = isComponentType(child, DropdownMenuSubContent);\n const isMenuItem = isComponentType(child, DropdownMenuItem);\n const isNestedSubMenu = isComponentType(child, DropdownMenuSub);\n\n if (isSubTrigger || isSubContent || isMenuItem || isNestedSubMenu) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n dropdownProps, // Always pass dropdownProps\n ...(isSubTrigger || isSubContent ? { submenuProps } : {}),\n });\n }\n\n // If it has children, recursively inject props\n if (child.props.children) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n children: injectPropsToChildren(child.props.children),\n });\n }\n\n return child;\n });\n };\n\n return <div className=\"relative\">{injectPropsToChildren(children)}</div>;\n}\nDropdownMenuSub.displayName = \"DropdownMenuSub\";\n\nexport function DropdownMenuSubTrigger({\n children,\n submenuProps,\n dropdownProps,\n className,\n}: {\n children: React.ReactNode;\n submenuProps?: SubmenuProps;\n dropdownProps?: DropdownProps;\n className?: string;\n}) {\n return (\n <DropdownMenuItemWrapper\n dropdownProps={dropdownProps}\n // The original passed the hyphenated name, which the wrapper ignored.\n // ariaExpanded is the prop it actually reads, so screen readers now get the state.\n ariaExpanded={submenuProps?.isSubOpen}\n onClick={() => submenuProps?.setIsSubOpen(!submenuProps?.isSubOpen)}\n closeOnClick={false}\n className={className}\n >\n <span>{children}</span>\n <RiArrowDownSLine\n aria-hidden=\"true\"\n className={cn(\n \"w-4 h-4 shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none\",\n submenuProps?.isSubOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </DropdownMenuItemWrapper>\n );\n}\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\";\n\nexport function DropdownMenuSubContent({\n children,\n submenuProps,\n dropdownProps,\n}: {\n children: React.ReactNode;\n submenuProps?: SubmenuProps;\n dropdownProps?: DropdownProps;\n}) {\n // Function to inject dropdownProps to all nested components\n const injectPropsToChildren = (\n children: React.ReactNode,\n ): React.ReactNode => {\n return Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n\n const isMenuItem = isComponentType(child, DropdownMenuItem);\n const isSubMenu = isComponentType(child, DropdownMenuSub);\n\n if (isMenuItem || isSubMenu) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n dropdownProps,\n });\n }\n\n // If it has children, recursively inject props\n if (child.props.children) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n children: injectPropsToChildren(child.props.children),\n });\n }\n\n return child;\n });\n };\n\n return (\n <div\n className={cn(\n // a thin guide line shows which items belong to the submenu\n \"ml-3 pl-1 border-l border-gray-100 overflow-hidden\",\n \"transition-[max-height,opacity] duration-200 ease-out motion-reduce:transition-none\",\n submenuProps?.isSubOpen\n ? \"max-h-[500px] opacity-100\"\n : \"max-h-0 opacity-0\",\n )}\n >\n {injectPropsToChildren(children)}\n </div>\n );\n}\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\";\n\nDropdownMenu.displayName = \"DropdownMenu\";\n","\"use client\";\nimport React, {\n useEffect,\n useState,\n useMemo,\n forwardRef,\n useCallback,\n useRef,\n useImperativeHandle,\n} from \"react\";\nimport { RiSearchLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Input from \"./Input\";\nimport Label from \"./Label\";\nimport Checkbox from \"./Checkbox\";\n\ntype Option = {\n label: string | number;\n value: string | number;\n info?: string;\n addInfo?: string;\n tooltipContent?: string;\n disabledOption?: boolean;\n labelTextColor?: string;\n};\n\ninterface MenuItemProps {\n label?: string | number;\n value: string | number;\n children?: React.ReactNode;\n}\n\ninterface DropdownFooterProps {\n onApply?: (() => void) | undefined;\n setDropdownMenu?: (value: boolean) => void;\n}\n\ninterface DropdownProps {\n id?: string;\n options: Option[];\n selected?: Option[];\n setSelected?: React.Dispatch<React.SetStateAction<Option[]>>;\n onApply?: () => void;\n onReset?: () => void;\n dropdownText?: string;\n search?: boolean;\n multiple?: boolean;\n renderItem?: (option: Option) => React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n dropdownMenu?: boolean;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n setDropdownMenu?: (value: boolean) => void;\n info?: string | number;\n addInfo?: string | number;\n tooltipContent?: string;\n width?: string;\n dropdownFooter?: boolean;\n disabled?: boolean;\n labelTextColor?: string;\n footerAction?: React.ReactNode;\n height?: string;\n}\n\nconst defaultRenderItem = (option: Option) => {\n return <MenuItem label={option.label} value={option.value} />;\n};\n\nconst DropdownWithIcon = forwardRef<HTMLDivElement, DropdownProps>(\n (\n {\n id = `dropdown-${Math.random().toString(36).substring(2, 11)}`,\n options,\n selected = [],\n setSelected,\n search = false,\n multiple = false,\n dropdownText,\n renderItem = defaultRenderItem,\n children,\n trigger,\n position = \"top\",\n width,\n info,\n dropdownFooter = false,\n onApply,\n disabled = false,\n onReset,\n footerAction,\n height = \"200px\",\n },\n ref\n ) => {\n const [searchQuery, setSearchQuery] = useState<string>(\"\");\n const localDropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownMenu, setDropdownMenu] = useState(false);\n\n useImperativeHandle(ref, () => localDropdownRef.current!);\n\n const memoizedFilteredOptions = useMemo(() => {\n if (!search) return options;\n return options?.filter(\n (option) =>\n typeof option?.label === \"string\" &&\n option?.label?.toLowerCase()?.includes(searchQuery?.toLowerCase())\n );\n }, [search, searchQuery, options]);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e?.target?.value);\n },\n []\n );\n\n const toggleOption = useCallback(\n (option: Option) => {\n if (multiple && setSelected) {\n setSelected((prevSelected) =>\n prevSelected?.some((item) => item?.value === option?.value)\n ? prevSelected?.filter((item) => item?.value !== option?.value)\n : [...prevSelected, option]\n );\n } else if (setSelected) {\n setSelected([option]);\n setDropdownMenu(false);\n }\n },\n [multiple, setSelected, setDropdownMenu]\n );\n\n const handleCheckboxChange = useCallback(\n (option: Option) => {\n if (multiple && setSelected) {\n setSelected((prevSelected) =>\n prevSelected?.some((item) => item?.value === option?.value)\n ? prevSelected?.filter((item) => item?.value !== option?.value)\n : [...prevSelected, option]\n );\n } else if (setSelected) {\n setSelected([option]);\n }\n },\n [multiple, setSelected]\n );\n\n const handleSelectAll = () => {\n if (selected?.length === options?.length) {\n setSelected?.([]);\n } else {\n setSelected?.(options);\n }\n };\n\n const handleReset = () => {\n if (onReset) {\n onReset();\n }\n setSelected?.([]);\n setDropdownMenu(false);\n };\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n localDropdownRef?.current &&\n !localDropdownRef?.current?.contains(event?.target as Node)\n ) {\n setDropdownMenu(false);\n }\n };\n\n document?.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document?.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [setDropdownMenu]);\n\n return (\n <div\n id={id}\n ref={localDropdownRef}\n className={cn(\n \"relative\",\n !width && \"w-full\",\n disabled && \"cursor-not-allowed opacity-50\"\n )}\n style={{\n width: width,\n }}\n >\n <button\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={dropdownMenu}\n aria-labelledby={`${id}-label`}\n disabled={disabled}\n onClick={() => !disabled && setDropdownMenu((prev) => !prev)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n !disabled && setDropdownMenu((prev) => !prev);\n }\n }}\n className={cn(\n \"w-full\",\n disabled && \"cursor-not-allowed opacity-50\",\n dropdownText && \"flex items-center gap-2\"\n )}\n >\n {trigger}\n {dropdownText && (\n <span id={`${id}-label`} className=\"text-sm text-gray-800\">\n {dropdownText}\n </span>\n )}\n </button>\n <ul\n role=\"listbox\"\n aria-multiselectable={multiple}\n aria-labelledby={`${id}-label`}\n tabIndex={-1}\n className={cn(\n \"max-h-0 opacity-0 overflow-hidden shadow-sm mt-1 rounded absolute text-sm bg-white z-[1000] w-full transition-all duration-75 delay-100 ease-in\",\n dropdownMenu\n ? \"border border-primary-600\"\n : \"border border-gray-200\",\n position === \"top\"\n ? \"top-10\"\n : position === \"bottom\"\n ? \"bottom-10\"\n : position === \"left\"\n ? \"left-0\"\n : position === \"right\"\n ? \"right-[90%]\"\n : \"top-10\",\n dropdownMenu &&\n \"max-h-[360px] h-fit opacity-[1] transition-all ease-in duration-150\"\n )}\n style={{\n width: width,\n minWidth: \"200px\",\n top: \"calc(100% + 4px)\",\n }}\n >\n {search && (\n <Input\n id={`${id}-search`}\n type=\"text\"\n placeholder=\"Search...\"\n aria-label=\"Search options\"\n value={searchQuery}\n onChange={handleSearchChange}\n className=\"rounded rounded-b-none text-gray-800 bg-white w-full h-[35px] pl-3 border-none\"\n endIcon={<RiSearchLine size={18} />}\n />\n )}\n {multiple && (\n <section className=\"py-[6px] px-[14px] flex justify-between items-center\">\n <button\n type=\"button\"\n aria-label=\"Select all\"\n onClick={handleSelectAll}\n className=\"text-sm hover:text-primary-700 text-primary-600 cursor-pointer\"\n >\n Select all\n </button>\n <button\n aria-label=\"Reset\"\n type=\"button\"\n className=\"text-sm text-warning-500 hover:text-warning-600\"\n onClick={handleReset}\n >\n Reset\n </button>\n </section>\n )}\n <section style={{ maxHeight: height }} className=\"z-[1000] transition-all duration-75 delay-100 ease-in-out overflow-y-scroll\">\n {options\n ? memoizedFilteredOptions?.map((option, i) => (\n <React.Fragment key={i}>\n {multiple ? (\n <Label\n className={cn(\n \"has-[:checked]:bg-primary-50 has-[:checked]:border-primary-600 hover:bg-gray-50 flex flex-col py-[6px] px-[14px] break-words cursor-pointer border-l-4 border-transparent\",\n option?.disabledOption &&\n \"opacity-50 cursor-not-allowed hover:bg-white text-gray-300 select-none\"\n )}\n htmlFor={`${id}-checkbox-${option.value}`}\n key={i}\n >\n <section className=\"flex items-center justify-between gap-2 w-full\">\n <div className=\"flex gap-2\">\n <Checkbox\n id={`${id}-checkbox-${option.value}`}\n checked={selected?.some(\n (item) => item?.value === option?.value\n )}\n onChange={() => handleCheckboxChange(option)}\n disabled={option?.disabledOption}\n />\n <div className=\"flex items-center gap-1\">\n <div\n style={{\n color: option?.disabledOption\n ? \"#D1D5DB\"\n : option.labelTextColor,\n }}\n className={cn(\n \"break-words\",\n option?.disabledOption && \"text-gray-300\"\n )}\n >\n {renderItem(option)}\n </div>\n </div>\n </div>\n <span className=\"text-gray-500\">{option?.info}</span>\n </section>\n <span className=\"pt-[2px] text-sm text-gray-500\">\n {option?.addInfo}\n </span>\n </Label>\n ) : (\n <Label\n htmlFor={`${id}-checkbox-${option.value}`}\n key={i}\n className={cn(\n \"flex justify-between py-[6px] px-[14px] hover:bg-gray-50 gap-2 items-center border-l-4 border-transparent cursor-pointer\",\n {\n \"bg-primary-50 border-primary-600\":\n selected && selected[0]?.value === option?.value,\n \"opacity-50 cursor-not-allowed hover:bg-white text-gray-500\":\n option?.disabledOption,\n }\n )}\n onClick={() =>\n !option?.disabledOption && toggleOption(option)\n }\n >\n <div\n style={{\n color: option?.disabledOption\n ? \"#D1D5DB\"\n : option.labelTextColor,\n }}\n className={cn(\n \"break-words\",\n option?.disabledOption && \"text-gray-300\"\n )}\n >\n {renderItem(option)}\n </div>\n <span className=\"text-gray-500\">{info}</span>\n </Label>\n )}\n </React.Fragment>\n ))\n : children}\n </section>\n {footerAction && (\n <div className=\"py-2 mt-1 px-2 border-t\">{footerAction}</div>\n )}\n {dropdownFooter && (\n <DropdownFooter\n setDropdownMenu={setDropdownMenu}\n onApply={onApply}\n />\n )}\n </ul>\n </div>\n );\n }\n);\n\nexport const MenuItem: React.FC<MenuItemProps> = ({ label, children }) => {\n return <p className=\"break-all\">{label || children}</p>;\n};\n\nconst DropdownFooter: React.FC<DropdownFooterProps> = ({\n onApply,\n setDropdownMenu,\n}) => {\n return (\n <div className=\"flex justify-end border-t border-gray-200 px-[14px] py-[8px] text-sm\">\n <button\n type=\"button\"\n className=\"text-primary-600 hover:text-primary-700\"\n onClick={() => {\n if (onApply) {\n onApply();\n }\n if (setDropdownMenu) {\n setDropdownMenu(false);\n }\n }}\n >\n Apply\n </button>\n </div>\n );\n};\n\nDropdownWithIcon.displayName = \"DropdownWithIcon\";\n\nexport default DropdownWithIcon;\n","\"use client\";\nimport React, { forwardRef, InputHTMLAttributes, useRef } from \"react\";\n\ninterface FileSelectorProps extends InputHTMLAttributes<HTMLInputElement> {\n component: JSX.Element;\n}\n\nconst FileSelector = forwardRef<HTMLInputElement, FileSelectorProps>(\n ({ component, ...props }, ref) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const inputRef = (ref as React.RefObject<HTMLInputElement>) || internalRef;\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n return (\n <div\n onClick={handleClick}\n style={{ display: \"inline-block\", cursor: \"pointer\" }}\n >\n <input\n type=\"file\"\n ref={inputRef}\n {...props}\n style={{ display: \"none\" }}\n />\n {component}\n </div>\n );\n }\n);\n\nFileSelector.displayName = \"FileSelector\";\n\nexport default FileSelector;\n","\"use client\";\nimport React, { forwardRef, useState, DragEvent } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { RiUpload2Line } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Label from \"./Label\";\nimport FileUploadPreview from \"./FileUploadPreview\";\n\nexport interface FileUploadProps extends InputHTMLAttributes<HTMLInputElement> {\n id: string;\n selectedFile?: File[];\n setSelectedFile?: (files: File[]) => void;\n children?: ReactNode;\n onDelete?: (index: number) => void;\n title?: string;\n disabled?: boolean;\n filePreviewClassName?: string;\n}\n\nconst FileUpload = forwardRef<HTMLInputElement, FileUploadProps>(\n (\n {\n selectedFile,\n setSelectedFile,\n onChange,\n multiple,\n onDelete,\n children,\n disabled,\n title,\n filePreviewClassName,\n id,\n className,\n accept,\n ...props\n },\n ref,\n ) => {\n const [isDragging, setIsDragging] = useState(false);\n\n const handleDragOver = (e: DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragLeave = () => {\n setIsDragging(false);\n };\n\n const handleDrop = (e: DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length === 0) return;\n\n if (multiple) {\n setSelectedFile && setSelectedFile([...(selectedFile || []), ...files]);\n } else {\n setSelectedFile && setSelectedFile([files[0]]);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n <input\n type=\"file\"\n {...props}\n accept={accept}\n id={id}\n onChange={onChange}\n multiple={multiple}\n disabled={disabled}\n hidden\n ref={ref}\n />\n <Label\n htmlFor={id}\n disabled={disabled}\n role=\"button\"\n aria-label={`Upload ${multiple ? \"files\" : \"file\"}`}\n aria-disabled={disabled || undefined}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.currentTarget.click();\n }\n }}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={cn(\n // layout (height and width are unchanged)\n \"group w-full h-[126px] px-6 py-4 flex items-center justify-center cursor-pointer\",\n // surface\n \"rounded-xl border-2 border-dashed border-gray-200 bg-white\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // hover\n \"hover:bg-gray-50 hover:border-primary-300\",\n // keyboard focus (same ring as Input and Textarea)\n \"focus-visible:outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\",\n // drag-over: stays highlighted even while hovered\n isDragging &&\n \"border-primary-500 bg-primary-50 ring-4 ring-primary-100 hover:bg-primary-50 hover:border-primary-500\",\n // disabled\n disabled && \"pointer-events-none opacity-30\",\n className,\n )}\n >\n {/* pointer-events-none stops children from firing dragleave, which made the drag highlight flicker */}\n <div\n className={cn(\n \"grid grid-cols-1 place-items-center gap-2 pointer-events-none\",\n )}\n >\n <div\n className={cn(\n \"w-10 h-10 border-[6px] border-gray-50 bg-gray-200 text-gray-600 rounded-full p-1 flex justify-center items-center\",\n \"transition-[background-color,border-color,color,transform] duration-200 ease-out\",\n \"motion-reduce:transition-none motion-reduce:transform-none\",\n \"group-hover:border-primary-50 group-hover:bg-primary-100 group-hover:text-primary-600\",\n \"group-focus-visible:border-primary-50 group-focus-visible:bg-primary-100 group-focus-visible:text-primary-600\",\n isDragging &&\n \"border-primary-50 bg-primary-100 text-primary-600 scale-110\",\n )}\n >\n <RiUpload2Line className=\"w-5 h-5\" />\n </div>\n <div>\n <p className=\"text-center text-sm text-gray-600\">\n <span className=\"text-primary-600 font-semibold\">\n Click to upload or drag and drop\n </span>{\" \"}\n <br /> {title}\n </p>\n </div>\n </div>\n </Label>\n <section className={cn(`grid gap-2`, filePreviewClassName)}>\n {selectedFile?.map((file, index) => (\n <FileUploadPreview\n key={file.name || index}\n file={file}\n index={index}\n onDelete={onDelete}\n >\n {children}\n </FileUploadPreview>\n ))}\n </section>\n </div>\n );\n },\n);\n\nFileUpload.displayName = \"FileUpload\";\n\nexport default FileUpload;\n","import {\n RiDeleteBinLine,\n RiFileExcel2Line,\n RiFileLine,\n RiFilePdf2Line,\n RiFilePpt2Line,\n RiFileWord2Line,\n RiFileZipLine,\n RiImageLine,\n RiMusic2Line,\n RiVideoLine,\n} from \"@remixicon/react\";\nimport React, { ReactNode } from \"react\";\n\ninterface FileUploadPreviewProps {\n index: number;\n file: File;\n children?: ReactNode;\n onDelete?: (index: number) => void;\n}\n\nconst getIconForMimeType = (file: File) => {\n const fileName = typeof file === \"string\" ? file : file.name;\n const extension = fileName.split(\".\").pop()?.toLowerCase();\n\n let iconComponent: JSX.Element;\n switch (extension) {\n case \"jpg\":\n case \"jpeg\":\n case \"png\":\n case \"gif\":\n case \"svg\":\n case \"webp\":\n iconComponent = (\n <RiImageLine className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"mp3\":\n case \"wav\":\n case \"ogg\":\n iconComponent = (\n <RiMusic2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"mp4\":\n case \"avi\":\n case \"mkv\":\n iconComponent = (\n <RiVideoLine className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"xls\":\n case \"xlsx\":\n case \"csv\":\n case \"txt\":\n case \"ods\":\n iconComponent = (\n <RiFileExcel2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"doc\":\n case \"docx\":\n case \"odt\":\n case \"xml\":\n iconComponent = (\n <RiFileWord2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"pptx\":\n case \"pptm\":\n case \"xps\":\n case \"ppsx\":\n iconComponent = (\n <RiFilePpt2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"rar\":\n case \"zip\":\n iconComponent = (\n <RiFileZipLine className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"pdf\":\n iconComponent = (\n <RiFilePdf2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n default:\n // Return generic file icon\n iconComponent = (\n <RiFileLine className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n }\n return iconComponent;\n};\n\nconst FileUploadPreview = ({\n index,\n file,\n children,\n onDelete,\n}: FileUploadPreviewProps) => {\n return (\n <div\n key={index}\n className=\"p-4 border border-gray-200 rounded-lg flex items-center justify-between gap-5\"\n >\n <div className=\"flex items-center gap-2 w-full\">\n {getIconForMimeType(file)}\n <div className=\"flex flex-col gap-1 w-full\">\n <p className=\"text-sm line-clamp-2 break-all\">\n {typeof file === \"string\" ? file : file.name}{\" \"}\n </p>\n {children && <div className=\"w-full\">{children}</div>}\n </div>\n </div>\n <button type=\"button\" onClick={() => onDelete?.(index)}>\n <RiDeleteBinLine className=\"text-gray-500 w-5 h-5 cursor-pointer\" />\n </button>\n </div>\n );\n};\n\nexport default FileUploadPreview;\n","\"use client\";\nimport React, { useEffect, useRef, forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface GlobalNavigationProps {\n isOpen: boolean;\n setIsOpen: (isOpen: boolean) => void;\n className?: string;\n children: React.ReactNode;\n trigger: JSX.Element;\n postion?: \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\";\n}\n\nconst GlobalNavigation = forwardRef<HTMLDivElement, GlobalNavigationProps>(\n (\n {\n isOpen,\n setIsOpen,\n trigger,\n children,\n className,\n postion = \"bottom-right\",\n },\n ref,\n ) => {\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Close on an outside click, and on Escape (returning focus to the trigger).\n // Listeners are only attached while the panel is open.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n !triggerRef.current?.contains(event.target as Node) &&\n !contentRef.current?.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen, setIsOpen]);\n\n return (\n <div className=\"relative w-max\" ref={ref}>\n <div\n ref={triggerRef}\n // The trigger was a bare clickable div. It is now focusable and\n // announces its state; Enter / Space toggle it when the wrapper itself\n // has focus (the target check stops a nested <button> from toggling twice).\n role=\"button\"\n tabIndex={0}\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n onClick={() => setIsOpen(!isOpen)}\n onKeyDown={(e) => {\n if (\n e.target === e.currentTarget &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n setIsOpen(!isOpen);\n }\n }}\n className={cn(\n \"cursor-pointer rounded-full outline-none\",\n // keyboard-only ring, same as Button\n \"focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n )}\n >\n {trigger}\n </div>\n {isOpen && (\n <div\n ref={contentRef}\n className={cn(\n // surface: same radius, border and shadow family as Modal, Dropdown and Card\n \"absolute z-10 bg-white rounded-xl shadow-lg border border-gray-200 min-w-[200px] max-w-[calc(100vw-2rem)] p-4\",\n // fades in when it opens (it is mounted on open, so a CSS\n // transition could never run)\n \"animate-fade-in motion-reduce:animate-none\",\n // Offsets are relative to the trigger, not hard-coded pixels.\n // The top placements used bottom-[57px], which only worked for\n // a trigger exactly 56px tall.\n postion === \"bottom-left\" && \"left-0 top-full mt-2\",\n postion === \"bottom-right\" && \"right-0 top-full mt-2\",\n postion === \"top-left\" && \"left-0 bottom-full mb-2\",\n postion === \"top-right\" && \"right-0 bottom-full mb-2\",\n className,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n },\n);\n\nGlobalNavigation.displayName = \"GlobalNavigation\";\n\nexport default GlobalNavigation;\n","import React, { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface HelperTextProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode;\n size?: \"sm\" | \"lg\";\n error?: boolean;\n}\n\nconst HelperText = ({ children, className, size, error }: HelperTextProps) => {\n return (\n <span\n className={cn(\n \"text-gray-500\",\n error && \"text-error-500\",\n className,\n size === \"sm\" ? \"text-xs\" : \"text-sm\"\n )}\n >\n {children}\n </span>\n );\n};\n\nexport default HelperText;\n","\"use client\";\nimport React, { useState } from \"react\";\nimport { RiArrowLeftSLine, RiArrowRightSLine } from \"@remixicon/react\";\nimport Button from \"./Button\";\nimport { cn } from \"../utils/utils\";\n\ninterface ListPaginationProps {\n count: number;\n page: number;\n rowsPerPage: number;\n onPageChange: (newPage: number) => void;\n className?: string;\n}\n\nconst ListPagination: React.FC<ListPaginationProps> = ({\n count,\n page,\n rowsPerPage,\n onPageChange,\n className,\n}) => {\n const totalPages = Math.ceil(count / rowsPerPage);\n const [expanded, setExpanded] = useState(false);\n\n const renderPages = () => {\n if (totalPages <= 6 || expanded) {\n return [...Array(totalPages)].map((_, i) => (\n <PageBtn key={i} i={i} page={page} onPageChange={onPageChange} />\n ));\n }\n\n const start = [0, 1];\n const mid = [page - 1, page, page + 1].filter(\n (i) => i > 1 && i < totalPages - 2,\n );\n const end = [totalPages - 2, totalPages - 1];\n\n const range = Array.from(new Set([...start, ...mid, ...end]));\n return range.map((i, idx) =>\n typeof range[idx - 1] === \"number\" && i - range[idx - 1] > 1 ? (\n <Button\n key={`dots-${i}`}\n size=\"sm\"\n variant=\"outlined\"\n aria-label=\"Show all pages\"\n className=\"min-w-9 px-2\"\n onClick={() => setExpanded(true)}\n >\n ...\n </Button>\n ) : (\n <PageBtn key={i} i={i} page={page} onPageChange={onPageChange} />\n ),\n );\n };\n\n return (\n <section\n role=\"navigation\"\n aria-label=\"Pagination\"\n className={cn(\"flex items-center gap-1\", className)}\n >\n <NavBtn\n label=\"Previous page\"\n icon={<RiArrowLeftSLine size={22} />}\n onClick={() => onPageChange(page - 1)}\n disabled={page === 0}\n />\n {/* p-2 leaves room for the hover shadow and focus ring inside the scroll area */}\n <div className=\"max-w-[90vw] w-max overflow-auto flex items-center gap-2 p-2\">\n {renderPages()}\n </div>\n <NavBtn\n label=\"Next page\"\n icon={<RiArrowRightSLine size={22} />}\n onClick={() => onPageChange(page + 1)}\n disabled={page === totalPages - 1}\n />\n </section>\n );\n};\n\nconst PageBtn = ({\n i,\n page,\n onPageChange,\n}: {\n i: number;\n page: number;\n onPageChange: (i: number) => void;\n}) => {\n const isActive = i === page;\n\n return (\n <Button\n size=\"sm\"\n // the current page is a solid button, the others stay outlined\n variant={isActive ? \"filled\" : \"outlined\"}\n aria-label={`Page ${i + 1}`}\n aria-current={isActive ? \"page\" : undefined}\n className=\"min-w-9 px-2 tabular-nums\"\n onClick={() => onPageChange(i)}\n >\n {i + 1}\n </Button>\n );\n};\n\nconst NavBtn = ({\n icon,\n onClick,\n disabled,\n label,\n}: {\n icon: JSX.Element;\n onClick: () => void;\n disabled: boolean;\n label: string;\n}) => (\n <Button\n size=\"sm\"\n variant=\"outlined\"\n startIcon={icon}\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n className=\"p-2\"\n />\n);\n\nexport default ListPagination;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface LoadingProps {\n width?: string;\n height?: string;\n loaderColor?: string;\n variant?: \"light\" | \"heavy\";\n}\n\nconst Loading = ({ width, height, loaderColor, variant }: LoadingProps) => {\n return (\n <div\n // announced as a status message, and the spinner is never squashed\n // when it sits next to text in a flex row (for example inside a Button)\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"shrink-0 animate-spin-slow rounded-full\",\n // faint full ring as the track, with a solid arc on top that spins.\n // These are the defaults. A loaderColor overrides them inline below.\n \"border-primary-600/25 border-t-primary-600\",\n variant === \"light\" ? \"border-2\" : \"border-4\",\n )}\n style={{\n width: width,\n height: height,\n // loaderColor can be any CSS colour (named, hex, rgb, oklch...).\n // The track is the same colour at 25% so it matches the arc.\n ...(loaderColor\n ? {\n borderColor: `color-mix(in srgb, ${loaderColor} 25%, transparent)`,\n borderTopColor: loaderColor,\n }\n : {}),\n }}\n ></div>\n );\n};\n\nexport default Loading;\n","\"use client\";\nimport React, { ReactNode, useEffect, useRef } from \"react\";\nimport { RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ninterface ModalProps {\n children?: ReactNode;\n showModal?: boolean;\n closeModal?: boolean;\n setShowModal: (value: boolean) => void;\n closeOnOutsideClick?: boolean;\n className?: string;\n width?: string;\n /** Optional. Close when Escape is pressed. Defaults to true. */\n closeOnEscape?: boolean;\n /** Optional. Accessible name for the dialog. Prefer aria-labelledby if you have a visible title. */\n \"aria-label\"?: string;\n /** Optional. id of the element that titles the dialog. */\n \"aria-labelledby\"?: string;\n /** Optional. id of the element that describes the dialog. */\n \"aria-describedby\"?: string;\n}\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]):not([type=\"hidden\"]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nexport default function Modal({\n children,\n showModal,\n setShowModal,\n closeModal = true,\n closeOnOutsideClick = true,\n className = \"\",\n width = \"50%\",\n closeOnEscape = true,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n}: ModalProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const pressStartedOnBackdrop = useRef(false);\n\n // Lock page scroll while open, and restore whatever value was there before.\n useEffect(() => {\n if (!showModal) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [showModal]);\n\n // Move focus into the dialog on open and hand it back on close.\n useEffect(() => {\n if (!showModal) return;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n const dialog = dialogRef.current;\n // Respect autoFocus inside the children.\n if (dialog && !dialog.contains(document.activeElement)) {\n dialog.focus();\n }\n return () => {\n previouslyFocused?.focus?.();\n };\n }, [showModal]);\n\n // Escape to close.\n useEffect(() => {\n if (!showModal || !closeOnEscape) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setShowModal(false);\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [showModal, closeOnEscape, setShowModal]);\n\n // Keep Tab / Shift+Tab inside the dialog.\n const handleDialogKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") return;\n const dialog = dialogRef.current;\n if (!dialog) return;\n const items = Array.from(dialog.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (items.length === 0) {\n event.preventDefault();\n dialog.focus();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === dialog)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n // Only close when the press AND the release both happen on the backdrop,\n // so selecting text inside the dialog and releasing outside doesn't close it.\n const handleBackdropMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n pressStartedOnBackdrop.current = event.target === event.currentTarget;\n };\n\n const handleClickOutside = (event: React.MouseEvent<HTMLDivElement>) => {\n if (\n event.target === event.currentTarget &&\n pressStartedOnBackdrop.current &&\n closeOnOutsideClick\n ) {\n setShowModal(false);\n }\n pressStartedOnBackdrop.current = false;\n };\n\n return (\n <>\n {showModal && (\n <div\n onMouseDown={handleBackdropMouseDown}\n onClick={handleClickOutside}\n className=\"w-full h-full bg-backdrop bg-blend-overlay backdrop-blur-[2px] fixed top-0 bottom-0 left-0 right-0 flex justify-center items-center z-[1000000] overflow-hidden\"\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n tabIndex={-1}\n onKeyDown={handleDialogKeyDown}\n style={{\n width,\n // never wider than the screen, never too narrow to use on phones\n maxWidth: \"calc(100vw - 2rem)\",\n minWidth: \"min(20rem, calc(100vw - 2rem))\",\n }}\n className={cn(\n \"relative bg-white shadow-boxShadow rounded-2xl border border-gray-100 p-[18px] transition-all duration-150 fade-in-grow mx-4\",\n // tall content scrolls inside the dialog instead of being cut off\n \"max-h-[calc(100dvh-2rem)] overflow-y-auto overscroll-contain\",\n \"focus:outline-none motion-reduce:transition-none motion-reduce:animate-none\",\n className,\n )}\n >\n <div>{children}</div>\n {closeModal && (\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={() => setShowModal(false)}\n className={cn(\n \"absolute top-4 right-5 z-10 inline-flex items-center justify-center rounded-lg p-1 cursor-pointer\",\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-100 hover:text-gray-800 active:bg-gray-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n )}\n >\n <RiCloseLine size={20} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n )}\n </>\n );\n}\n","import { VariantProps, cva } from \"class-variance-authority\";\nimport { HTMLAttributes, ReactNode } from \"react\";\nimport React from \"react\";\nimport { cn } from \"../utils/utils\";\nimport {\n RiAlertFill,\n RiCloseLine,\n RiErrorWarningLine,\n RiQuestionLine,\n RiThumbUpLine,\n RiShieldCheckLine,\n} from \"@remixicon/react\";\n\ninterface VariantIconProps {\n variant: \"success\" | \"warning\" | \"info\" | \"error\" | \"default\";\n}\n\n// Icon colours now come from the same tokens as the rest of the library\n// (they were hard-coded hex values), and the wrapper keeps the icon from\n// shrinking next to long text.\nconst iconWrapper = \"inline-flex shrink-0\";\n\nconst VariantIcon = ({ variant }: VariantIconProps) => {\n switch (variant) {\n case \"success\":\n return (\n <span\n aria-hidden=\"true\"\n className={cn(iconWrapper, \"text-success-600\")}\n >\n <RiThumbUpLine size={20} />\n </span>\n );\n case \"warning\":\n return (\n <span\n aria-hidden=\"true\"\n className={cn(iconWrapper, \"text-warning-600\")}\n >\n <RiQuestionLine size={20} />\n </span>\n );\n case \"info\":\n return (\n <span\n aria-hidden=\"true\"\n className={cn(iconWrapper, \"text-primary-600\")}\n >\n <RiErrorWarningLine size={20} />\n </span>\n );\n case \"error\":\n return (\n <span aria-hidden=\"true\" className={cn(iconWrapper, \"text-error-600\")}>\n <RiAlertFill size={20} />\n </span>\n );\n default:\n return (\n <span aria-hidden=\"true\" className={cn(iconWrapper, \"text-gray-600\")}>\n <RiShieldCheckLine size={20} />\n </span>\n );\n }\n};\n\ninterface NoticeProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof noticeVariants> {\n children?: ReactNode;\n noticeTitle?: string;\n variant: \"success\" | \"warning\" | \"info\" | \"error\" | \"default\";\n position?: \"top\" | \"bottom\" | \"center\";\n showIcon?: boolean;\n open: boolean;\n setOpen: (value: boolean) => void;\n}\n\nconst noticeVariants = cva(\n // floating surface: softer radius, a shadow so it lifts off the page, and\n // a width cap so long messages never run edge to edge\n \"p-4 w-fit max-w-[min(32rem,calc(100vw-2rem))] rounded-xl shadow-lg\",\n {\n variants: {\n variant: {\n success: \"bg-success-25 border border-success-300\",\n warning: \"bg-warning-25 border border-warning-300\",\n info: \"bg-primary-25 border border-primary-300\",\n error: \"bg-error-25 border border-error-300\",\n default: \"bg-gray-25 border border-gray-300\",\n },\n position: {\n top: \"top-4 transition-all duration-700 m-auto left-0 right-0\",\n bottom: \"bottom-4 transition-all duration-700 right-4\",\n center: \"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\",\n },\n },\n },\n);\n\n// Same close control as Modal and Drawer: a real button with a visible\n// keyboard focus ring (it was a clickable span).\nconst CloseButton = ({\n onClick,\n className,\n}: {\n onClick: () => void;\n className?: string;\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label=\"Close notice\"\n className={cn(\n \"inline-flex shrink-0 items-center justify-center rounded-lg p-1 cursor-pointer\",\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-black/5 hover:text-gray-800 active:bg-black/10\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n className,\n )}\n >\n <RiCloseLine size={20} aria-hidden=\"true\" />\n </button>\n);\n\nconst Notice = ({\n children,\n variant,\n position,\n noticeTitle,\n open,\n setOpen,\n showIcon = true,\n}: NoticeProps) => {\n const handleClose = () => setOpen(false);\n return (\n <>\n {open && (\n <div\n // errors and warnings interrupt, everything else is announced politely\n role={\n variant === \"error\" || variant === \"warning\" ? \"alert\" : \"status\"\n }\n className={cn(\n noticeVariants({ variant, position }),\n `fixed z-10`,\n position === \"top\" &&\n open &&\n `animate-slide-in-top motion-reduce:animate-none`,\n position === \"bottom\" &&\n open &&\n `animate-slide-in-right motion-reduce:animate-none`,\n position === \"center\" &&\n open &&\n `animate-fade-in motion-reduce:animate-none`,\n )}\n >\n <div className=\"relative\">\n {showIcon ? (\n noticeTitle == \"\" ? (\n <div className=\"flex items-start\">\n <VariantIcon variant={variant} />\n <span className=\"ml-2 mr-8 text-text-sm text-gray-700\">\n {children}\n </span>\n <CloseButton onClick={handleClose} className=\"-my-1 -mr-1\" />\n </div>\n ) : (\n <div className=\"\">\n <section className=\"flex items-start\">\n <VariantIcon variant={variant} />\n <div className=\"ml-2 mr-8 -mt-[3px]\">\n <span className=\"block font-semibold text-gray-900 mb-0.5\">\n {noticeTitle}\n </span>\n <p className=\"text-text-sm text-gray-700\">{children}</p>\n </div>\n </section>\n <CloseButton\n onClick={handleClose}\n className=\"absolute -top-1 -right-1\"\n />\n </div>\n )\n ) : (\n <div className=\"mr-8\">\n <section className=\"flex items-center\">\n <p className=\"font-semibold text-gray-900 mb-0.5\">\n {noticeTitle}\n </p>\n </section>\n <CloseButton\n onClick={handleClose}\n className=\"absolute -top-1 -right-1\"\n />\n <p className=\"text-text-sm text-gray-700\">{children}</p>\n </div>\n )}\n </div>\n </div>\n )}\n </>\n );\n};\n\nexport default Notice;\n","\"use client\";\nimport React, { useRef, useState } from \"react\";\nimport Input from \"./Input\";\n\ninterface OTPInputProps {\n length: number;\n onChange: (otp: string) => void;\n type?: \"text\" | \"password\" | \"number\";\n}\n\nconst OTPInput: React.FC<OTPInputProps> = ({\n length,\n onChange,\n type = \"text\",\n}) => {\n const [otpValues, setOtpValues] = useState<string[]>(Array(length).fill(\"\"));\n const inputsRef = useRef<Array<HTMLInputElement | null>>([]);\n\n const handleChange = (\n e: React.ChangeEvent<HTMLInputElement>,\n idx: number\n ) => {\n let value = e.target.value;\n if (type === \"number\") value = value.replace(/\\D/g, \"\");\n if (!value) return;\n\n const newOtp = [...otpValues];\n newOtp[idx] = value[0];\n setOtpValues(newOtp);\n onChange(newOtp.join(\"\"));\n\n if (idx < length - 1) inputsRef.current[idx + 1]?.focus();\n };\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n idx: number\n ) => {\n if (e.key === \"Backspace\") {\n if (otpValues[idx]) {\n const newOtp = [...otpValues];\n newOtp[idx] = \"\";\n setOtpValues(newOtp);\n onChange(newOtp.join(\"\"));\n } else if (idx > 0) {\n inputsRef.current[idx - 1]?.focus();\n }\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n let pasteData = e.clipboardData.getData(\"Text\");\n if (type === \"number\") pasteData = pasteData.replace(/\\D/g, \"\");\n const newOtp = pasteData\n .split(\"\")\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n setOtpValues(newOtp);\n onChange(newOtp.join(\"\"));\n inputsRef.current[Math.min(pasteData.length, length - 1)]?.focus();\n };\n\n return (\n <div className=\"flex items-center gap-2\">\n {Array.from({ length }).map((_, idx) => (\n <Input\n key={idx}\n type={type}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n maxLength={1}\n value={otpValues[idx]}\n onChange={(e) => handleChange(e, idx)}\n onKeyDown={(e) => handleKeyDown(e, idx)}\n onPaste={handlePaste}\n ref={(el) => {\n inputsRef.current[idx] = el ?? null;\n }}\n className=\"w-[40px] p-3.5\"\n />\n ))}\n </div>\n );\n};\n\nexport default OTPInput;\n","\"use client\";\nimport React, { useRef, useState } from \"react\";\nimport Button from \"./Button\";\nimport {\n RiArrowLeftLine,\n RiArrowRightLine,\n RiArrowDownSLine,\n RiArrowUpSLine,\n RiArrowRightSLine,\n RiArrowLeftSLine,\n RiCheckLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ntype TablePaginationProps = {\n count: number;\n countVariable?: string;\n page: number;\n rowsPerPage: number;\n rowsPerPageOptions: (number | { label: string; value: number })[];\n onPageChange: (newPage: number) => void;\n onRowsPerPageChange: (newRowsPerPage: number) => void;\n className?: string;\n variant?: \"primary\" | \"secondary\";\n itemsPerPage?: boolean;\n};\n\n// Shared focus ring (same as Input, Textarea and FileUpload)\nconst focusRing =\n \"focus-visible:outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\";\n\n// Shared look for the small bordered controls (trigger and page select)\nconst controlSurface = cn(\n \"border border-gray-200 bg-white rounded-lg text-sm font-medium text-gray-900 tabular-nums cursor-pointer\",\n \"shadow-[0px_1px_2px_0px_#1018280D] hover:bg-gray-50 hover:border-gray-300\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n);\n\nconst Pagination: React.FC<TablePaginationProps> = ({\n count,\n page,\n rowsPerPage,\n rowsPerPageOptions,\n onPageChange,\n onRowsPerPageChange,\n className,\n variant = \"primary\",\n countVariable,\n itemsPerPage = true,\n}) => {\n const totalPages = Math.ceil(count / rowsPerPage);\n\n const handlePrevPageClick = () => {\n onPageChange(page - 1);\n };\n\n const handleNextPageClick = () => {\n onPageChange(page + 1);\n };\n const [showOptions, setShowOptions] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const handleOptionClick = (\n option: number | { label: string; value: number },\n ) => {\n if (typeof option === \"number\") {\n onRowsPerPageChange(option);\n } else {\n onRowsPerPageChange(option.value);\n }\n setShowOptions(false);\n // the option unmounts, so hand focus back to the trigger\n triggerRef.current?.focus();\n };\n\n // Display only: show the label of the selected option (so -1 reads \"All\")\n // and a \"1–5 of 40\" range. Callbacks and totalPages are untouched.\n const selectedOption = rowsPerPageOptions?.find(\n (o) => (typeof o === \"number\" ? o : o.value) === rowsPerPage,\n );\n const selectedLabel =\n selectedOption === undefined\n ? rowsPerPage\n : typeof selectedOption === \"number\"\n ? selectedOption\n : selectedOption.label;\n\n const effectiveRows = rowsPerPage > 0 ? rowsPerPage : count;\n const rangeStart = count === 0 ? 0 : page * effectiveRows + 1;\n const rangeEnd = Math.min(count, (page + 1) * effectiveRows);\n\n return (\n <div\n role=\"navigation\"\n aria-label=\"Table pagination\"\n className={cn(\n // flex-wrap lets the two groups stack on narrow screens instead of squeezing\n \"px-3 py-4 flex flex-wrap justify-between items-center gap-x-6 gap-y-3 w-full text-sm\",\n variant === \"primary\" &&\n \"border border-gray-200 bg-gray-25 px-6 py-3.5\",\n className,\n )}\n >\n <section className=\"flex flex-wrap gap-x-5 gap-y-2 items-center\">\n {countVariable && (\n <p className=\"text-gray-500\">\n <span className=\"font-semibold text-gray-900 tabular-nums\">\n {count}\n </span>{\" \"}\n {countVariable ?? \"Items\"}\n </p>\n )}\n {itemsPerPage && (\n <div className=\"flex gap-2 items-center\">\n <span className=\"text-gray-500\">Items per page</span>\n <div\n className=\"relative z-[100]\"\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && showOptions) {\n setShowOptions(false);\n triggerRef.current?.focus();\n }\n }}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n aria-expanded={showOptions}\n aria-label={`Items per page, ${selectedLabel} selected`}\n className={cn(\n controlSurface,\n \"w-[88px] px-2.5 py-1.5 flex items-center justify-between gap-1\",\n focusRing,\n showOptions && \"border-primary-600 ring-4 ring-primary-100\",\n )}\n onClick={() => setShowOptions(!showOptions)}\n >\n {selectedLabel}\n {!showOptions ? (\n <RiArrowDownSLine\n size={16}\n className=\"text-gray-500\"\n aria-hidden=\"true\"\n />\n ) : (\n <RiArrowUpSLine\n size={16}\n className=\"text-gray-500\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n {showOptions && (\n <div className=\"absolute top-full left-0 min-w-full p-1 bg-white rounded-xl border border-gray-200 shadow-lg mt-1.5 z-50\">\n {rowsPerPageOptions?.map((option, index) => {\n const value =\n typeof option === \"number\" ? option : option.value;\n const isSelected = value === rowsPerPage;\n\n return (\n <button\n type=\"button\"\n key={index}\n aria-current={isSelected ? \"true\" : undefined}\n className={cn(\n \"flex w-full items-center justify-between gap-2 text-left px-2.5 py-1.5 rounded-lg cursor-pointer tabular-nums\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n isSelected\n ? \"bg-primary-50 text-primary-700 font-semibold\"\n : \"text-gray-700 font-medium hover:bg-gray-100\",\n )}\n onClick={() => handleOptionClick(option)}\n >\n {typeof option === \"number\" ? option : option.label}\n {isSelected && (\n <RiCheckLine size={16} aria-hidden=\"true\" />\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n )}\n </section>\n <section className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n {variant === \"primary\" ? (\n <>\n <span className=\"hidden sm:inline text-gray-500 tabular-nums\">\n <span className=\"font-semibold text-gray-900\">\n {rangeStart}–{rangeEnd}\n </span>{\" \"}\n of {count}\n </span>\n <span\n aria-hidden=\"true\"\n className=\"hidden sm:block h-5 w-px bg-gray-200\"\n />\n <div className=\"flex items-center gap-2 text-gray-500\">\n <span>Page</span>\n <select\n aria-label=\"Select page\"\n value={page + 1}\n onChange={(e) => onPageChange(parseInt(e.target.value, 10) - 1)}\n className={cn(\n controlSurface,\n \"px-3 py-1.5\",\n \"focus:outline-none focus:border-primary-600 focus:ring-4 focus:ring-primary-100\",\n )}\n >\n {totalPages > 0 &&\n [...Array(totalPages)].map((_, index) => (\n <option key={index + 1} value={index + 1}>\n {index + 1}\n </option>\n ))}\n </select>\n <span className=\"tabular-nums\">\n of {totalPages > 0 ? totalPages : 0}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outlined\"\n intent=\"default-outlined\"\n startIcon={<RiArrowLeftLine size={18} />}\n onClick={handlePrevPageClick}\n disabled={page === 0}\n aria-label=\"Previous page\"\n className=\"h-8 rounded-lg\"\n >\n {/* text hides on small screens, the aria-label still names the button */}\n <span className=\"hidden sm:inline\">Previous</span>\n </Button>\n <Button\n variant=\"outlined\"\n intent=\"default-outlined\"\n endIcon={<RiArrowRightLine size={18} />}\n onClick={handleNextPageClick}\n disabled={page === totalPages - 1}\n aria-label=\"Next page\"\n className=\"h-8 rounded-lg\"\n >\n <span className=\"hidden sm:inline\">Next</span>\n </Button>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5 text-gray-500 mx-1\">\n {/* announced politely when the page changes */}\n <span className=\"tabular-nums\" aria-live=\"polite\">\n <span className=\"font-semibold text-gray-900\">{page + 1}</span>{\" \"}\n of {totalPages > 0 ? totalPages : 0}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n onClick={handlePrevPageClick}\n disabled={page === 0}\n className={cn(\n \"inline-flex rounded-lg border border-gray-200 bg-white p-1 text-gray-600 cursor-pointer\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300 hover:text-gray-900\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-1\",\n \"disabled:pointer-events-none disabled:select-none disabled:opacity-30\",\n )}\n >\n <RiArrowLeftSLine size={20} aria-hidden=\"true\" />\n </button>\n\n <button\n type=\"button\"\n aria-label=\"Next page\"\n onClick={handleNextPageClick}\n disabled={page === totalPages - 1}\n className={cn(\n \"inline-flex rounded-lg border border-gray-200 bg-white p-1 text-gray-600 cursor-pointer\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300 hover:text-gray-900\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-1\",\n \"disabled:pointer-events-none disabled:select-none disabled:opacity-30\",\n )}\n >\n <RiArrowRightSLine size={20} aria-hidden=\"true\" />\n </button>\n </div>\n </>\n )}\n </section>\n </div>\n );\n};\n\nexport default Pagination;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\nexport type ProgressBarProps = {\n progress: number;\n progressText?: string;\n progressColor: string;\n progressTextPosition?: \"top\" | \"bottom\" | \"left\" | \"right\";\n};\n\nconst ProgressBar = ({\n progress,\n progressText = \"\",\n progressColor,\n progressTextPosition,\n}: ProgressBarProps) => {\n const _progress = Math.min(Math.max(0, progress), 100);\n return (\n <div\n className={cn(\n \"rounded\",\n progressTextPosition === \"right\"\n ? \"flex items-center gap-3\"\n : progressTextPosition === \"left\"\n ? \"flex items-center gap-3\"\n : \"\",\n )}\n >\n <span\n className={cn(\n \"text-gray-700 text-text-sm font-medium tabular-nums\",\n progressTextPosition === \"left\"\n ? \"inline-block shrink-0 whitespace-nowrap\"\n : progressTextPosition === \"top\"\n ? \"flex justify-end mb-1.5\"\n : \"hidden\",\n )}\n >\n {progressText}\n </span>\n <div\n // the track clips the fill so both ends stay perfectly rounded\n className=\"w-full min-w-0 h-2 rounded-full bg-gray-200 overflow-hidden\"\n role=\"progressbar\"\n // a progressbar needs an accessible name; the visible text is used\n // when there is one\n aria-label={progressText || \"Progress\"}\n aria-valuenow={Math.round(_progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className={cn(\n progressColor,\n \"h-full rounded-full\",\n // the old 100ms delay is gone, so the bar responds immediately\n \"transition-[width] duration-500 ease-out motion-reduce:transition-none\",\n )}\n style={{ width: `${_progress}%` }}\n ></div>\n </div>\n <span\n className={cn(\n \"text-gray-700 text-text-sm font-medium tabular-nums\",\n progressTextPosition === \"bottom\"\n ? \"flex justify-end mt-1.5\"\n : progressTextPosition === \"top\"\n ? \"hidden\"\n : progressTextPosition === \"right\"\n ? \"flex shrink-0 justify-end whitespace-nowrap\"\n : \"hidden\",\n )}\n >\n {progressText}\n </span>\n </div>\n );\n};\n\nexport default ProgressBar;\n","import React, { InputHTMLAttributes, forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { cva, VariantProps } from \"class-variance-authority\";\n\ninterface RadioProps\n extends\n Omit<InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof radioVariants> {\n size?: \"sm\" | \"lg\";\n disabled?: boolean;\n checked?: boolean;\n children?: never;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Per-intent styles. Class names are written out in full so Tailwind can */\n/* detect them. `primary` is the default, so existing radios stay in the */\n/* primary colour family. Unchecked hover keeps the original behaviour (tinted */\n/* border and fill). Checked: solid fill, one shade darker on hover. */\n/* `checked:hover:` is used so the hover tint never overrides the checked fill.*/\n/* The focus ring follows the intent. */\n/* -------------------------------------------------------------------------- */\nconst intentClasses = {\n primary:\n \"hover:border-primary-600 hover:bg-primary-50 checked:border-primary-600 checked:bg-primary-600 checked:hover:border-primary-700 checked:hover:bg-primary-700 focus-visible:ring-primary-500\",\n success:\n \"hover:border-success-600 hover:bg-success-50 checked:border-success-600 checked:bg-success-600 checked:hover:border-success-700 checked:hover:bg-success-700 focus-visible:ring-success-500\",\n error:\n \"hover:border-error-600 hover:bg-error-50 checked:border-error-600 checked:bg-error-600 checked:hover:border-error-700 checked:hover:bg-error-700 focus-visible:ring-error-500\",\n warning:\n \"hover:border-warning-600 hover:bg-warning-50 checked:border-warning-600 checked:bg-warning-600 checked:hover:border-warning-700 checked:hover:bg-warning-700 focus-visible:ring-warning-500\",\n default:\n \"hover:border-gray-700 hover:bg-gray-100 checked:border-gray-700 checked:bg-gray-700 checked:hover:border-gray-800 checked:hover:bg-gray-800 focus-visible:ring-gray-500\",\n blue: \"hover:border-blue-600 hover:bg-blue-50 checked:border-blue-600 checked:bg-blue-600 checked:hover:border-blue-700 checked:hover:bg-blue-700 focus-visible:ring-blue-500\",\n bluegray:\n \"hover:border-bluegray-600 hover:bg-bluegray-50 checked:border-bluegray-600 checked:bg-bluegray-600 checked:hover:border-bluegray-700 checked:hover:bg-bluegray-700 focus-visible:ring-bluegray-500\",\n bluelight:\n \"hover:border-bluelight-600 hover:bg-bluelight-50 checked:border-bluelight-600 checked:bg-bluelight-600 checked:hover:border-bluelight-700 checked:hover:bg-bluelight-700 focus-visible:ring-bluelight-500\",\n indigo:\n \"hover:border-indigo-600 hover:bg-indigo-50 checked:border-indigo-600 checked:bg-indigo-600 checked:hover:border-indigo-700 checked:hover:bg-indigo-700 focus-visible:ring-indigo-500\",\n purple:\n \"hover:border-purple-600 hover:bg-purple-50 checked:border-purple-600 checked:bg-purple-600 checked:hover:border-purple-700 checked:hover:bg-purple-700 focus-visible:ring-purple-500\",\n violet:\n \"hover:border-violet-600 hover:bg-violet-50 checked:border-violet-600 checked:bg-violet-600 checked:hover:border-violet-700 checked:hover:bg-violet-700 focus-visible:ring-violet-500\",\n pink: \"hover:border-pink-600 hover:bg-pink-50 checked:border-pink-600 checked:bg-pink-600 checked:hover:border-pink-700 checked:hover:bg-pink-700 focus-visible:ring-pink-500\",\n rose: \"hover:border-rose-600 hover:bg-rose-50 checked:border-rose-600 checked:bg-rose-600 checked:hover:border-rose-700 checked:hover:bg-rose-700 focus-visible:ring-rose-500\",\n orange:\n \"hover:border-orange-600 hover:bg-orange-50 checked:border-orange-600 checked:bg-orange-600 checked:hover:border-orange-700 checked:hover:bg-orange-700 focus-visible:ring-orange-500\",\n};\n\nconst radioVariants = cva(\"\", {\n variants: {\n // Circle dimensions are unchanged from the original.\n size: {\n sm: \"h-3 w-3\",\n lg: \"h-4 w-4\",\n },\n // New, optional. Defaults to \"primary\".\n intent: intentClasses,\n },\n defaultVariants: {\n size: \"sm\",\n intent: \"primary\",\n },\n});\n\nconst Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n size,\n intent,\n disabled,\n checked,\n className,\n children,\n id,\n name,\n ...props\n },\n ref,\n ) => {\n return (\n <div className=\"relative inline-flex items-center cursor-pointer\">\n <input\n {...props}\n ref={ref}\n id={id}\n name={name}\n checked={checked}\n disabled={disabled}\n role=\"radio\"\n aria-checked={checked}\n type=\"radio\"\n className={cn(\n // base\n \"peer relative cursor-pointer appearance-none rounded-full border border-gray-300 bg-white\",\n \"shadow-sm checked:shadow-none\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // keyboard-only focus ring (colour is set per intent)\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n // error state via the native attribute, no new prop needed\n \"aria-[invalid=true]:border-error-500\",\n // disabled\n \"disabled:opacity-30 disabled:pointer-events-none disabled:shadow-none\",\n radioVariants({ size, intent, className }),\n )}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute pointer-events-none top-2/4 left-2/4 -translate-y-2/4 -translate-x-2/4\",\n \"h-1.5 w-1.5 bg-white rounded-full\",\n // the dot fades and pops in when checked\n \"opacity-0 scale-50 peer-checked:opacity-100 peer-checked:scale-100\",\n \"transition-[opacity,transform] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n size === \"sm\" && \"h-[4.5px] w-[4.5px]\",\n )}\n ></span>\n </div>\n );\n },\n);\n\nRadio.displayName = \"Radio\";\nexport default Radio;\n","\"use client\";\nimport React, { useId, useRef, useState } from \"react\";\nimport {\n RiDeleteBin6Line,\n RiRefreshLine,\n RiFileLine,\n RiImageLine,\n RiVideoLine,\n RiFileZipLine,\n RiCheckLine,\n RiCloseLine,\n RiFilePdf2Line,\n RiFilePpt2Line,\n RiFileWord2Line,\n RiFileExcel2Line,\n RiMusic2Line,\n RiEyeLine,\n} from \"@remixicon/react\";\nimport Spinner from \"./Spinner\";\nimport { cn } from \"../utils/utils\";\nimport Label from \"./Label\";\nimport Button from \"./Button\";\n\nconst FileSvgIcon = React.memo(function FileSvgIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"40\"\n height=\"55\"\n viewBox=\"0 0 36 47\"\n fill=\"none\"\n >\n <path\n d=\"M0 8.72494C0 5.48487 2.6266 2.85828 5.86667 2.85828H20.5333L33 15.8583V40.9916C33 44.2317 30.3734 46.8583 27.1333 46.8583H5.86667C2.6266 46.8583 0 44.2317 0 40.9916V8.72494Z\"\n fill=\"var(--primary-600)\"\n />\n <g filter=\"url(#filter0_d_5101_541)\">\n <path\n d=\"M20.5334 13.4052V2.85828L33 15.8582L22.974 15.8482C21.6257 15.8469 20.5334 14.7535 20.5334 13.4052Z\"\n fill=\"var(--primary-300)\"\n />\n </g>\n <defs>\n <filter\n id=\"filter0_d_5101_541\"\n x=\"14.7435\"\n y=\"-2.98023e-05\"\n width=\"21.1148\"\n height=\"21.6482\"\n filterUnits=\"userSpaceOnUse\"\n color-interpolation-filters=\"sRGB\"\n >\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\"\n />\n <feOffset dx=\"-1.4658\" dy=\"1.4658\" />\n <feGaussianBlur stdDeviation=\"2.16205\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix\n type=\"matrix\"\n values=\"0 0 0 0 0.0417487 0 0 0 0 0.107741 0 0 0 0 0.401705 0 0 0 0.07 0\"\n />\n <feBlend\n mode=\"normal\"\n in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_5101_541\"\n />\n <feBlend\n mode=\"normal\"\n in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_5101_541\"\n result=\"shape\"\n />\n </filter>\n </defs>\n </svg>\n );\n});\n\n// Types\nexport type UploadStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\n\nexport interface UploadItem {\n id: string;\n file?: File;\n name?: string;\n size?: number;\n progress?: number;\n status?: UploadStatus;\n previewUrl?: string;\n}\n\nexport interface FileUploadControlProps {\n items: UploadItem[];\n onAddFiles: (files: File[]) => void;\n onUpdateItem?: (id: string, updates: Partial<UploadItem>) => void;\n onRejectFiles?: (rejected: { file: File; reason: string }[]) => void;\n onDelete?: (id: string) => void;\n onRetry?: (id: string) => void;\n onPreview?: (id: string) => void;\n onUpload?: (\n file: File,\n onProgress: (progress: number) => void,\n ) => Promise<string>;\n multiple?: boolean;\n accept?: string;\n maxSizeMB?: number;\n className?: string;\n hintText?: React.ReactNode;\n showSizeText?: boolean;\n getFileIcon?: (fileName: string, fileType: string) => React.ReactNode;\n autoUpload?: boolean;\n disabled?: boolean;\n}\n\n// Default file icon function (MATCHED with getIconForMimeType)\nconst defaultGetFileIcon = (fileName: string, fileType: string) => {\n const extension = fileName.split(\".\").pop()?.toLowerCase() || \"\";\n\n // IMAGE FILES\n if (\n fileType.startsWith(\"image/\") ||\n [\"jpg\", \"jpeg\", \"png\", \"gif\", \"svg\", \"webp\", \"bmp\"].includes(extension)\n ) {\n return <RiImageLine className=\"w-5 h-5 text-white\" />;\n }\n\n // AUDIO FILES\n if (\n fileType.startsWith(\"audio/\") ||\n [\"mp3\", \"wav\", \"ogg\", \"m4a\"].includes(extension)\n ) {\n return <RiMusic2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // VIDEO FILES\n if (\n fileType.startsWith(\"video/\") ||\n [\"mp4\", \"avi\", \"mkv\", \"mov\", \"wmv\"].includes(extension)\n ) {\n return <RiVideoLine className=\"w-5 h-5 text-white\" />;\n }\n\n // EXCEL / SPREADSHEET FILES\n if (\n fileType.includes(\"excel\") ||\n [\"xls\", \"xlsx\", \"csv\", \"txt\", \"ods\"].includes(extension)\n ) {\n return <RiFileExcel2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // WORD DOCUMENTS\n if (\n fileType.includes(\"word\") ||\n [\"doc\", \"docx\", \"odt\", \"xml\"].includes(extension)\n ) {\n return <RiFileWord2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // POWERPOINT FILES\n if ([\"pptx\", \"pptm\", \"xps\", \"ppsx\"].includes(extension)) {\n return <RiFilePpt2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // ZIP / ARCHIVE FILES\n if (\n fileType.includes(\"zip\") ||\n [\"zip\", \"rar\", \"7z\", \"tar\", \"gz\"].includes(extension)\n ) {\n return <RiFileZipLine className=\"w-5 h-5 text-white\" />;\n }\n\n // PDF FILES\n if (fileType === \"application/pdf\" || extension === \"pdf\") {\n return <RiFilePdf2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // DEFAULT ICON\n return <RiFileLine className=\"w-5 h-5 text-white\" />;\n};\n\nexport default function FileUploadControl({\n items,\n onAddFiles,\n onUpdateItem,\n onRejectFiles,\n onDelete,\n onRetry,\n onPreview,\n onUpload,\n multiple = true,\n accept = \"image/*\",\n maxSizeMB = 15,\n className = \"\",\n hintText,\n showSizeText = true,\n getFileIcon = defaultGetFileIcon,\n autoUpload = true,\n disabled,\n}: FileUploadControlProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const inputId = useId();\n const [isDragging, setIsDragging] = useState(false);\n const localPreviews = useRef<Map<string, string>>(new Map());\n const uploadProgress = useRef<Map<string, number>>(new Map());\n const dragCounter = useRef(0);\n\n const formatSize = (bytes?: number) => {\n if (!bytes) return \"0 KB\";\n return `${Math.round(bytes / 1024)} KB`;\n };\n\n const getStatusDisplay = (status?: UploadStatus) => {\n switch (status) {\n case \"uploading\":\n return {\n text: \"Uploading\",\n color: \"text-blue-600\",\n showSpinner: true,\n icon: <Spinner size=\"xs\" color=\"gray\" />,\n canPreview: false,\n };\n case \"success\":\n return {\n text: \"Completed\",\n color: \"text-green-600\",\n showSpinner: false,\n icon: <RiCheckLine className=\"w-3 h-3 text-white\" />,\n canPreview: true,\n };\n case \"error\":\n return {\n text: \"Failed\",\n color: \"text-red-600\",\n showSpinner: false,\n icon: <RiCloseLine className=\"w-3 h-3 text-white\" />,\n canPreview: false,\n };\n default:\n return {\n text: \"\",\n color: \"\",\n showSpinner: false,\n icon: null,\n canPreview: false,\n };\n }\n };\n\n const getProgressColor = (status?: UploadStatus) => {\n switch (status) {\n case \"uploading\":\n return \"bg-blue-500\";\n case \"success\":\n return \"bg-green-600\";\n case \"error\":\n return \"bg-red-500\";\n default:\n return \"bg-gray-300\";\n }\n };\n\n // Get file icon for an item\n const getItemFileIcon = (item: UploadItem) => {\n const fileName = item.name || item.file?.name || \"\";\n const fileType = item.file?.type || \"\";\n return getFileIcon(fileName, fileType);\n };\n\n // Handle upload with progress\n const handleUpload = React.useCallback(\n async (item: UploadItem) => {\n if (\n !item.file ||\n !onUpload ||\n item.status === \"success\" ||\n item.status === \"uploading\"\n ) {\n return;\n }\n\n try {\n // Start with 0% progress\n if (onUpdateItem) {\n onUpdateItem(item.id, { status: \"uploading\", progress: 0 });\n }\n\n // Clear any existing progress\n uploadProgress.current.delete(item.id);\n\n // Call upload function\n const previewUrl = await onUpload(item.file, (progress: number) => {\n // Ensure progress doesn't exceed 100\n const clampedProgress = Math.min(100, Math.max(0, progress));\n uploadProgress.current.set(item.id, clampedProgress);\n\n if (onUpdateItem) {\n onUpdateItem(item.id, {\n progress: clampedProgress,\n status: \"uploading\",\n });\n }\n });\n\n // Ensure 100% progress before marking as success\n if (onUpdateItem) {\n onUpdateItem(item.id, {\n progress: 100,\n status: \"success\",\n previewUrl,\n });\n }\n\n // Clear progress tracking\n uploadProgress.current.delete(item.id);\n } catch (error) {\n console.error(\"Upload error:\", error);\n if (onUpdateItem) {\n onUpdateItem(item.id, {\n progress: 0,\n status: \"error\",\n });\n }\n uploadProgress.current.delete(item.id);\n }\n },\n [onUpload, onUpdateItem],\n );\n\n // Get current progress for an item\n const getCurrentProgress = (item: UploadItem) => {\n // If status is success, always show 100%\n if (item.status === \"success\") return 100;\n\n // If status is error, show 0%\n if (item.status === \"error\") return 0;\n\n // Use local progress if available, otherwise use item progress\n return uploadProgress.current.get(item.id) ?? item.progress ?? 0;\n };\n\n // Internal retry handler\n const handleRetry = (id: string) => {\n const item = items.find((item: UploadItem) => item.id === id);\n if (item && onUpload) {\n handleUpload(item);\n } else if (onRetry) {\n onRetry(id);\n }\n };\n\n // Handle delete internally\n const handleDelete = (id: string) => {\n // Clean up local preview URL if it exists\n if (localPreviews.current.has(id)) {\n const url = localPreviews.current.get(id);\n if (url) URL.revokeObjectURL(url);\n localPreviews.current.delete(id);\n }\n\n // Clean up progress tracking\n uploadProgress.current.delete(id);\n\n // Call external onDelete handler if provided\n if (onDelete) {\n onDelete(id);\n }\n };\n\n // Event handlers\n const triggerInput = () => inputRef.current?.click();\n\n const partitionFiles = (files: File[]) => {\n const valid: File[] = [];\n const rejected: { file: File; reason: string }[] = [];\n for (const file of files) {\n if (file.size > maxSizeMB * 1024 * 1024) {\n rejected.push({ file, reason: `Exceeds ${maxSizeMB}MB limit` });\n } else {\n valid.push(file);\n }\n }\n return { valid, rejected };\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0) return;\n\n const { valid, rejected } = partitionFiles(files);\n if (rejected.length > 0) onRejectFiles?.(rejected);\n if (valid.length > 0) onAddFiles(multiple ? valid : [valid[0]]);\n e.target.value = \"\";\n };\n\n const handleDrop = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n dragCounter.current = 0;\n setIsDragging(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length === 0) return;\n\n const { valid, rejected } = partitionFiles(files);\n if (rejected.length > 0) onRejectFiles?.(rejected);\n if (valid.length > 0) onAddFiles(multiple ? valid : [valid[0]]);\n };\n\n const handleDragEnter = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n if (disabled) return;\n dragCounter.current += 1;\n setIsDragging(true);\n };\n\n // Simple drag handlers\n const handleDragOver = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n dragCounter.current -= 1;\n if (dragCounter.current <= 0) {\n dragCounter.current = 0;\n setIsDragging(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n triggerInput();\n }\n };\n\n // Auto-upload files when they're added\n React.useEffect(() => {\n if (autoUpload && onUpload) {\n items.forEach((item: UploadItem) => {\n if (item.status === \"idle\" && item.file) {\n handleUpload(item);\n }\n });\n }\n }, [items, autoUpload, onUpload, handleUpload]);\n\n // Cleanup object URLs on unmount\n React.useEffect(() => {\n const previews = localPreviews?.current;\n return () => {\n previews?.forEach((url: string) => URL?.revokeObjectURL(url));\n };\n }, []);\n\n return (\n <div className={`w-full ${className}`}>\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n hidden\n onChange={handleInputChange}\n disabled={disabled}\n />\n <Label\n htmlFor={inputId}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={triggerInput}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n role=\"button\"\n disabled={disabled}\n aria-label={`Upload ${multiple ? \"images\" : \"an image\"}`}\n className={cn(\n \"max-w-[564px] w-full bg-white py-4 flex items-center justify-center rounded-lg border cursor-pointer transition-all\",\n isDragging\n ? \"border-blue-500 bg-blue-50\"\n : \"border-gray-300 bg-white hover:bg-gray-50\",\n disabled && \"pointer-events-none cursor-not-allowed\",\n )}\n >\n <div className=\"flex items-center gap-3 text-center\">\n <div>\n <p className=\"text-sm text-gray-600\">\n Drag files here or\n <span className=\"text-primary-600 font-semibold ml-1\">\n Upload\n </span>{\" \"}\n <br />\n </p>\n </div>\n </div>\n </Label>\n <span className=\"text-xs\">\n {hintText ?? `Only PNG, JPG, GIF. Max file size ${maxSizeMB}MB`}\n </span>\n\n {/* Upload Items */}\n <div className=\"flex flex-col gap-4 mt-4\">\n {items?.map((item: UploadItem) => {\n const progress = getCurrentProgress(item);\n const statusInfo = getStatusDisplay(item.status);\n const progressColor = getProgressColor(item?.status);\n const fileIcon = getItemFileIcon(item);\n return (\n <div\n key={item?.id}\n className=\"flex items-center gap-4 bg-white max-w-[564px] w-full p-4 rounded-lg border border-gray-200\"\n >\n <div className=\"w-14 h-14 flex-shrink-0 rounded-md overflow-hidden relative\">\n <div className=\"absolute inset-0 w-full h-full object-contain\">\n <FileSvgIcon />\n </div>\n <div className=\"relative z-10 top-2 -left-2.5 flex items-center justify-center w-full h-full text-white\">\n {fileIcon}\n </div>\n </div>\n {/* File Info & Progress */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2 mb-3\">\n <div className=\"min-w-0\">\n <h4 className=\"text-sm font-medium text-gray-900 truncate\">\n {item?.name || item.file?.name || \"Unnamed file\"}\n </h4>\n {showSizeText && (\n <div\n className=\"text-xs text-gray-500 mt-1 flex items-center gap-1\"\n aria-live=\"polite\"\n >\n {formatSize(item?.size || item.file?.size)}\n {statusInfo.text && (\n <div className=\"ml-2 font-medium flex items-center gap-1\">\n {statusInfo?.showSpinner ? (\n <>\n {statusInfo.icon}\n <span className={statusInfo.color}>\n {statusInfo.text}\n </span>\n </>\n ) : (\n <>\n <div\n className={`w-4 h-4 rounded-full flex justify-center items-center ${\n statusInfo?.color === \"text-red-600\"\n ? \"bg-red-600\"\n : statusInfo?.color === \"text-green-600\"\n ? \"bg-green-600\"\n : \"bg-gray-400\"\n }`}\n >\n {statusInfo?.icon}\n </div>\n <span className={statusInfo.color}>\n {statusInfo?.text}\n </span>\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {/* Actions */}\n <div className=\"flex items-center gap-2\">\n {/* Preview Button - Show when upload is successful */}\n {onPreview && item?.status === \"success\" && (\n <button\n type=\"button\"\n onClick={() => onPreview(item.id)}\n className=\"p-2 rounded-md hover:bg-gray-100 transition-colors text-gray-600\"\n title=\"Preview\"\n >\n <RiEyeLine size={16} />\n </button>\n )}\n {item?.status === \"error\" && (\n <>\n {/* Desktop: full button */}\n <span className=\"hidden sm:inline-block\">\n <Button\n variant=\"outlined\"\n intent=\"primary-outlined\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleRetry(item?.id)}\n className=\"whitespace-nowrap h-[30px]\"\n >\n <RiRefreshLine size={16} />\n Try Again\n </Button>\n </span>\n\n {/* Mobile: icon only */}\n <span className=\"sm:hidden\">\n <Button\n variant=\"outlined\"\n intent=\"primary-outlined\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleRetry(item?.id)}\n className=\"h-[30px] px-1 py-1\"\n >\n <RiRefreshLine size={16} />\n </Button>\n </span>\n </>\n )}\n\n {/* Delete button - always shown */}\n <button\n type=\"button\"\n onClick={() => handleDelete(item.id)}\n className=\"p-2 rounded-md hover:bg-gray-100 transition-colors text-gray-600\"\n title=\"Delete\"\n >\n <RiDeleteBin6Line size={16} />\n </button>\n </div>\n </div>\n </div>\n {/* Custom Progress Bar */}\n <div className=\"flex items-center gap-4\">\n <div className=\"flex-1\">\n <div className=\"w-full h-2 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all duration-300 ease-out ${progressColor}`}\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n <div className=\"text-xs text-gray-500 w-12 text-right\">\n {item.status === \"error\"\n ? \"--%\"\n : item.status === \"success\"\n ? \"100%\"\n : `${Math.round(progress)}%`}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// Export the default file icon function for reuse\nexport { defaultGetFileIcon };\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface SpinnerProps {\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n color?: \"primary\" | \"black\" | \"gray\" | string;\n}\n\nconst colorVars: Record<string, { c1: string; c2: string }> = {\n primary: {\n c1: \"var(--primary-500)\",\n c2: \"var(--primary-200)\",\n },\n black: {\n c1: \"rgba(0, 0, 0, 1)\",\n c2: \"rgba(0, 0, 0, 0.5)\",\n },\n gray: {\n c1: \"var(--gray-500)\",\n c2: \"var(--gray-300)\",\n },\n};\n\nconst Spinner = ({ size = \"md\", color = \"primary\" }: SpinnerProps) => {\n const sizeClass = cn({\n \"w-4 h-4\": size === \"xs\",\n \"w-6 h-6\": size === \"sm\",\n \"w-10 h-10\": size === \"md\",\n \"w-16 h-16\": size === \"lg\",\n });\n\n const getColorValues = (color: string) => {\n if (colorVars[color]) {\n return colorVars[color];\n }\n if (color.startsWith('#')) {\n return {\n c1: color,\n c2: `${color}80` \n };\n }\n return colorVars.primary;\n };\n\n const colorValues = getColorValues(color);\n\n return (\n <div className={cn(\"relative\", sizeClass)}>\n <div\n className=\"spinner\"\n style={{\n [\"--spinner-color-1\" as any]: colorValues.c1,\n [\"--spinner-color-2\" as any]: colorValues.c2,\n }}\n />\n </div>\n );\n};\n\nexport default Spinner;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { RiArrowDownSLine, RiCheckLine, RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface SelectOption {\n label: string;\n value: string | number;\n /** Optional. Unselectable and skipped by the keyboard. */\n disabled?: boolean;\n /** Optional. Secondary line under the label. */\n description?: string;\n /** Optional. Icon shown before the label. */\n icon?: JSX.Element;\n}\n\nexport interface SelectGroup {\n label: string;\n options: SelectOption[];\n}\n\nexport interface SelectProps {\n /** Flat options, or groups of options. */\n options: (SelectOption | SelectGroup)[];\n /** Controlled value. Use null for \"nothing selected\". */\n value?: string | number | null;\n /** Uncontrolled initial value. */\n defaultValue?: string | number | null;\n /** Called with the new value (null when cleared) and its option. */\n onChange?: (value: string | number | null, option: SelectOption | null) => void;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. \"sm\" = 320px, \"lg\" = 313px, default = full width (same as Input). */\n size?: \"sm\" | \"lg\";\n /** Optional. Open the list above or below. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. Show a clear button when a value is selected. Defaults to false. */\n clearable?: boolean;\n /** Optional. Max height of the list in px. Defaults to 264. */\n maxHeight?: number;\n /** Optional. Text shown when options is empty. */\n emptyText?: string;\n id?: string;\n /** Optional. Adds a hidden input for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n}\n\nconst isGroup = (o: SelectOption | SelectGroup): o is SelectGroup => \"options\" in o;\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst Select = ({\n options,\n value,\n defaultValue = null,\n onChange,\n placeholder = \"Select an option\",\n disabled = false,\n error = false,\n size,\n placement = \"bottom\",\n clearable = false,\n maxHeight = 264,\n emptyText = \"No options\",\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n}: SelectProps) => {\n const reactId = useId();\n const triggerId = id ?? `select-${reactId}`;\n const listId = `${triggerId}-list`;\n\n const [inner, setInner] = useState<string | number | null>(defaultValue);\n const current = value !== undefined ? value : inner;\n\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(-1);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const typed = useRef({ text: \"\", timer: 0 as unknown as ReturnType<typeof setTimeout> });\n\n // Flatten, remembering which group heading precedes an option\n const flat = useMemo(() => {\n const out: { option: SelectOption; group?: string; first?: boolean }[] = [];\n options.forEach((o) => {\n if (isGroup(o)) o.options.forEach((opt, i) => out.push({ option: opt, group: o.label, first: i === 0 }));\n else out.push({ option: o });\n });\n return out;\n }, [options]);\n\n const selectedIndex = flat.findIndex((f) => f.option.value === current);\n const selected = selectedIndex >= 0 ? flat[selectedIndex].option : null;\n\n const enabledFrom = useCallback(\n (start: number, dir: 1 | -1) => {\n for (let i = start; i >= 0 && i < flat.length; i += dir) if (!flat[i].option.disabled) return i;\n return -1;\n },\n [flat],\n );\n\n const commit = (opt: SelectOption | null) => {\n const next = opt ? opt.value : null;\n if (value === undefined) setInner(next);\n onChange?.(next, opt);\n };\n\n const close = useCallback((returnFocus = true) => {\n setOpen(false);\n if (returnFocus) triggerRef.current?.focus();\n }, []);\n\n const openList = (at?: number) => {\n if (disabled) return;\n const start = at ?? (selectedIndex >= 0 ? selectedIndex : enabledFrom(0, 1));\n setActive(start);\n setOpen(true);\n };\n\n const pick = (i: number) => {\n const f = flat[i];\n if (!f || f.option.disabled) return;\n commit(f.option);\n close();\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) close(false);\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, close]);\n\n // Keep the active option visible inside the list\n useEffect(() => {\n if (!open || active < 0) return;\n const el = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n const list = listRef.current;\n if (!el || !list) return;\n if (el.offsetTop < list.scrollTop) list.scrollTop = el.offsetTop;\n else if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight)\n list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;\n }, [open, active]);\n\n useEffect(() => () => clearTimeout(typed.current.timer), []);\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n const move = (i: number) => {\n if (i >= 0) {\n setActive(i);\n if (!open) openList(i);\n }\n };\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (!open) openList();\n else move(enabledFrom(active + 1, 1) >= 0 ? enabledFrom(active + 1, 1) : active);\n return;\n case \"ArrowUp\":\n e.preventDefault();\n if (!open) openList();\n else move(enabledFrom(active - 1, -1) >= 0 ? enabledFrom(active - 1, -1) : active);\n return;\n case \"Home\":\n if (open) { e.preventDefault(); move(enabledFrom(0, 1)); }\n return;\n case \"End\":\n if (open) { e.preventDefault(); move(enabledFrom(flat.length - 1, -1)); }\n return;\n case \"Enter\":\n case \" \":\n if (open && !(e.key === \" \" && typed.current.text)) {\n e.preventDefault();\n pick(active);\n } else if (!open) {\n e.preventDefault();\n openList();\n }\n return;\n case \"Escape\":\n if (open) { e.preventDefault(); e.stopPropagation(); close(); }\n return;\n case \"Tab\":\n if (open) setOpen(false);\n return;\n }\n // Type-ahead\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n clearTimeout(typed.current.timer);\n typed.current.text += e.key.toLowerCase();\n typed.current.timer = setTimeout(() => (typed.current.text = \"\"), 600);\n const text = typed.current.text;\n const from = text.length === 1 ? Math.max(active, 0) + 1 : Math.max(active, 0);\n const order = flat.map((_, i) => i);\n const rotated = [...order.slice(from), ...order.slice(0, from)];\n const hit = rotated.find(\n (i) => !flat[i].option.disabled && flat[i].option.label.toLowerCase().startsWith(text),\n );\n if (hit !== undefined) {\n if (!open) openList(hit);\n else setActive(hit);\n }\n }\n };\n\n const activeId = open && active >= 0 ? `${triggerId}-opt-${active}` : undefined;\n\n return (\n <div ref={rootRef} className=\"relative inline-block max-w-full\">\n {name && <input type=\"hidden\" name={name} value={current ?? \"\"} />}\n\n <div\n className={cn(\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n open && \"border-primary-600 ring-4 ring-primary-100\",\n disabled && \"opacity-30 bg-gray-300 select-none pointer-events-none shadow-none\",\n size === \"sm\" ? \"w-[320px] h-10\" : size === \"lg\" ? \"w-[313px] h-11\" : \"w-full h-10\",\n error && \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n className,\n )}\n >\n {selected?.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {selected.icon}\n </span>\n )}\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n aria-activedescendant={activeId}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-invalid={error || undefined}\n onClick={() => (open ? close() : openList())}\n onKeyDown={onKeyDown}\n className={cn(\n \"min-w-0 flex-1 truncate bg-transparent text-left text-sm focus:outline-none\",\n selected ? \"text-gray-900\" : \"text-gray-500\",\n )}\n >\n {selected ? selected.label : placeholder}\n </button>\n {clearable && selected && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear selection\"\n onClick={() => {\n commit(null);\n triggerRef.current?.focus();\n }}\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-800\",\n focusRing,\n )}\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n <RiArrowDownSLine\n size={18}\n aria-hidden=\"true\"\n className={cn(\n \"shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none group-hover:text-gray-600\",\n open && \"rotate-180\",\n )}\n />\n </div>\n\n {open && (\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel}\n style={{ maxHeight }}\n className={cn(\n \"absolute left-0 z-50 w-full min-w-[160px] overflow-y-auto rounded-xl border border-gray-200 bg-white p-1 shadow-lg\",\n placement === \"top\" ? \"bottom-full mb-2\" : \"top-full mt-2\",\n )}\n >\n {flat.length === 0 && <p className=\"px-3 py-2 text-sm text-gray-500\">{emptyText}</p>}\n {flat.map((f, i) => {\n const isSel = f.option.value === current;\n const isActive = i === active;\n return (\n <React.Fragment key={`${f.option.value}-${i}`}>\n {f.group && f.first && (\n <div\n role=\"presentation\"\n className={cn(\n \"px-3 pb-1 pt-2 text-xs font-semibold uppercase tracking-wide text-gray-400\",\n i > 0 && \"mt-1 border-t border-gray-100\",\n )}\n >\n {f.group}\n </div>\n )}\n <div\n id={`${triggerId}-opt-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={isSel}\n aria-disabled={f.option.disabled || undefined}\n onMouseMove={() => !f.option.disabled && active !== i && setActive(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => pick(i)}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm text-gray-900\",\n isActive && \"bg-gray-100\",\n isSel && \"font-medium text-primary-700\",\n f.option.disabled && \"cursor-not-allowed opacity-40\",\n )}\n >\n {f.option.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {f.option.icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{f.option.label}</span>\n {f.option.description && (\n <span className=\"block truncate text-xs font-normal text-gray-500\">\n {f.option.description}\n </span>\n )}\n </span>\n {isSel && <RiCheckLine size={16} aria-hidden=\"true\" className=\"shrink-0 text-primary-600\" />}\n </div>\n </React.Fragment>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nSelect.displayName = \"Select\";\n\nexport default Select;\n","\"use client\";\nimport React, { ReactNode, useRef, useState } from \"react\";\nimport Link from \"next/link\";\nimport { cn } from \"../utils/utils\";\nimport Divider from \"@/app/components/Divider\";\nimport { RiArrowDownSLine, RiArrowRightSLine } from \"@remixicon/react\";\nimport { usePathname } from \"next/navigation\";\n\n// -------------------- Types --------------------\n\ninterface NavItem {\n label: string;\n href?: string;\n icon?: React.ReactElement;\n subItems?: NavItem[];\n}\n\ninterface SidebarProps {\n children: React.ReactNode;\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n scroll?: boolean;\n dense?: boolean;\n navItems?: {\n label: string;\n items: NavItem[];\n }[];\n}\n\ninterface SidebarHeaderProps {\n children: ReactNode;\n dense?: boolean;\n}\n\ninterface SidebarMenuProps {\n collapsed: boolean;\n navItems?: {\n label: string;\n items: NavItem[];\n }[];\n scroll?: boolean;\n dense?: boolean;\n}\n\ninterface FooterProps {\n children: React.ReactNode;\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n navItems?: {\n label: string;\n items: NavItem[];\n }[];\n dense?: boolean;\n}\n\n// -------------------- Shared styles --------------------\n\n// Keyboard-only ring, inset so the rows' overflow-hidden never clips it.\nconst linkFocus =\n \"outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\";\n\n// Active row: a soft primary tint instead of the old solid primary block,\n// matching the selected state of Tabs and TreeView.\nconst linkActive = \"bg-primary-50 text-primary-700 hover:bg-primary-100\";\n\n// -------------------- Sidebar --------------------\n// Note: `collapsed` is true while the sidebar is expanded (it is set to true on\n// hover). The prop semantics are unchanged.\n\nconst Sidebar: React.FC<SidebarProps> & {\n Header: React.FC<SidebarHeaderProps>;\n Menu: React.FC<SidebarMenuProps>;\n Footer: React.FC<FooterProps>;\n} = ({ children, collapsed, setCollapsed, dense = false }) => {\n // Tracks the pointer so a blur doesn't collapse the sidebar under the cursor.\n const hovered = useRef(false);\n\n return (\n <div\n onMouseEnter={() => {\n hovered.current = true;\n setCollapsed(true);\n }}\n onMouseLeave={() => {\n hovered.current = false;\n setCollapsed(false);\n }}\n // Keyboard users never trigger hover, so their labels stayed hidden.\n // Focusing anything inside expands the sidebar; it collapses again when\n // focus leaves (unless the pointer is still over it).\n onFocusCapture={() => setCollapsed(true)}\n onBlurCapture={(e) => {\n if (\n !e.currentTarget.contains(e.relatedTarget as Node | null) &&\n !hovered.current\n ) {\n setCollapsed(false);\n }\n }}\n className={cn(\n \"border border-gray-200 bg-white shadow-sm relative flex flex-col min-h-screen cursor-default\",\n \"transition-[width,padding,box-shadow] duration-300 ease-in-out motion-reduce:transition-none\",\n // the expanded sidebar floats a little higher\n collapsed && \"shadow-lg\",\n !collapsed\n ? dense\n ? \"w-[76px] py-[19px] px-[15px]\"\n : \"w-[80px] py-[21px] px-[17px]\"\n : dense\n ? \"w-[304px] py-[20px] px-5\"\n : \"w-[308px] py-[22px] px-6\",\n )}\n >\n <div>{children}</div>\n </div>\n );\n};\n\n// -------------------- SidebarHeader --------------------\n\nconst SidebarHeader: React.FC<SidebarHeaderProps> = ({\n children,\n dense = false,\n}) => {\n return (\n <div className={cn(\"z-20\", dense ? \"mb-3\" : \"mb-4\")}>\n <div className=\"flex justify-between items-center\">\n <span className=\"whitespace-nowrap font-semibold text-gray-900\">\n {children}\n </span>\n </div>\n </div>\n );\n};\n\n// -------------------- SidebarMenu --------------------\nconst SidebarMenu: React.FC<SidebarMenuProps> = ({\n collapsed,\n navItems,\n scroll = false,\n dense = false,\n}) => {\n const [openMenus, setOpenMenus] = useState<Record<string, boolean>>({});\n const currentPath = usePathname();\n\n const toggleMenu = (label: string) => {\n setOpenMenus((prev) => ({ ...prev, [label]: !prev[label] }));\n };\n\n // Close all submenus when sidebar collapses\n React.useEffect(() => {\n if (!collapsed) {\n setOpenMenus({});\n }\n }, [collapsed]);\n\n // Calculate menu height based on footer items\n const getMenuHeight = () => {\n const footerItemsLength =\n navItems?.reduce((acc, item) => acc + item.items.length, 0) || 0;\n if (footerItemsLength <= 1) {\n return \"max-h-[80vh]\";\n } else if (footerItemsLength === 2) {\n return \"max-h-[70vh]\";\n } else {\n return \"max-h-[60vh]\";\n }\n };\n\n // Labels fade with the width animation instead of popping.\n const labelFade =\n \"transition-opacity duration-200 motion-reduce:transition-none\";\n\n const renderMenuItems = (items: NavItem[], level = 0) => {\n return (\n <ul className={level > 0 ? \"ml-5 border-l border-gray-200\" : \"\"}>\n {items?.map((item, index) => {\n const hasSubItems = item.subItems && item.subItems.length > 0;\n const isActive = item.href === currentPath;\n\n const isOpen = openMenus[item.label];\n const paddingLeft =\n level === 0\n ? dense\n ? \"10px\"\n : \"12px\"\n : `${level * 5 + (dense ? 10 : 12)}px`;\n\n return (\n <li key={index}>\n {hasSubItems ? (\n <Link\n href={item.href || \"#\"}\n aria-current={isActive ? \"page\" : undefined}\n aria-expanded={!!isOpen}\n className={cn(\n \"flex items-center justify-between rounded-lg cursor-pointer transition-colors duration-200 motion-reduce:transition-none font-semibold whitespace-nowrap overflow-hidden\",\n linkFocus,\n dense ? \"px-3 py-1.5 mb-1\" : \"px-3 py-2 mb-[6px]\",\n isActive ? linkActive : \"text-gray-700\",\n isOpen ? \"bg-gray-100\" : \"\",\n \"hover:bg-gray-100\",\n level > 0 ? \"text-sm font-medium\" : \"\",\n )}\n style={{ paddingLeft }}\n onClick={(e) => {\n if (collapsed) {\n toggleMenu(item.label);\n }\n if (!item.href) e.preventDefault();\n }}\n >\n <div className=\"flex items-center gap-2\">\n {item.icon && level === 0 && (\n <span className={dense ? \"text-xs\" : \"text-text-sm\"}>\n {item.icon}\n </span>\n )}\n <span\n className={cn(labelFade, !collapsed ? \"opacity-0\" : \"\")}\n >\n {item.label}\n </span>\n </div>\n {collapsed && hasSubItems && (\n <span aria-hidden=\"true\" className=\"text-gray-500\">\n {isOpen ? (\n <RiArrowDownSLine size={dense ? 16 : 18} />\n ) : (\n <RiArrowRightSLine size={dense ? 16 : 18} />\n )}\n </span>\n )}\n </Link>\n ) : (\n <Link\n href={item.href || \"#\"}\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-lg cursor-pointer transition-colors duration-200 motion-reduce:transition-none whitespace-nowrap overflow-hidden\",\n linkFocus,\n \"hover:bg-gray-100\",\n dense ? \"px-3 py-1 mb-1\" : \"px-3 py-2 mb-[6px]\",\n isActive ? linkActive : \"text-gray-700\",\n level > 0 ? \"text-sm font-medium\" : \"font-semibold\",\n )}\n >\n {item.icon && level === 0 && (\n <span className={dense ? \"text-xs\" : \"text-text-sm\"}>\n {item.icon}\n </span>\n )}\n <span\n className={cn(labelFade, !collapsed ? \"opacity-0\" : \"\")}\n >\n {item.label}\n </span>\n </Link>\n )}\n\n {hasSubItems && isOpen && (\n <div className={dense ? \"mt-0.5\" : \"mt-1\"}>\n {renderMenuItems(item.subItems!, level + 1)}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n );\n };\n\n return (\n <nav\n aria-label=\"Main navigation\"\n className={cn(\n getMenuHeight(),\n \"\",\n scroll && collapsed\n ? \"overflow-y-auto customScroll\"\n : \"overflow-hidden\",\n )}\n >\n <ul\n className={cn(\n \"flex flex-col gap-2 items-stretch\",\n dense ? \"my-1.5\" : \"my-2\",\n )}\n >\n {navItems?.map((parentItem, parentIndex) => (\n <li\n key={parentIndex}\n className=\"flex flex-col gap-3 mb-1 whitespace-nowrap overflow-hidden\"\n >\n <p\n className={cn(\n // small uppercase group heading\n \"text-gray-500 font-semibold uppercase tracking-wider\",\n labelFade,\n dense ? \"text-[11px]\" : \"text-[12px]\",\n !collapsed ? \"opacity-0\" : \"\",\n )}\n >\n {parentItem.label}\n </p>\n {renderMenuItems(parentItem.items)}\n </li>\n ))}\n </ul>\n </nav>\n );\n};\n\n// -------------------- Footer --------------------\n\nconst SidebarFooter: React.FC<FooterProps> = ({\n children,\n setCollapsed,\n collapsed,\n navItems,\n dense = false,\n}) => {\n const currentPath = usePathname();\n return (\n <div\n className={cn({\n \"absolute bottom-0 overflow-auto bg-white z-10\": true,\n \"max-h-[226px] py-2.5 w-[85%]\": dense,\n \"max-h-[230px] py-3 w-[85%]\": !dense,\n \"w-[53%]\": !collapsed && dense,\n \"w-[55%]\": !collapsed && !dense,\n })}\n onClick={() => setCollapsed(true)}\n >\n {collapsed && (\n <div className=\"shadow-md\">\n <Divider />\n </div>\n )}\n {navItems && navItems.length > 0 && (\n <nav aria-label=\"Secondary navigation\" className=\"flex-grow w-full\">\n <ul\n className={cn(\n \"flex flex-col gap-2 items-stretch\",\n dense ? \"my-1.5\" : \"my-2\",\n )}\n >\n {navItems?.map((parentItem, parentIndex) => (\n <li\n key={parentIndex}\n className=\"flex flex-col gap-3 mb-1 whitespace-nowrap overflow-hidden\"\n >\n <p\n className={cn({\n \"text-gray-500 font-semibold uppercase tracking-wider\": true,\n \"text-[11px]\": dense,\n \"text-[12px]\": !dense,\n \"w-[35px] text-ellipsis text-white whitespace-nowrap overflow-hidden\":\n !collapsed && dense,\n \"w-[37px] text-ellipsis text-white whitespace-nowrap overflow-hidden\":\n !collapsed && !dense,\n })}\n >\n {parentItem.label}\n </p>\n {\n <ul>\n {parentItem?.items?.map((item, index) => (\n <li key={index}>\n <Link\n aria-current={\n currentPath === item?.href ? \"page\" : undefined\n }\n className={cn({\n \"hover:bg-gray-100 flex items-center cursor-pointer rounded-lg transition-colors duration-200 motion-reduce:transition-none font-semibold whitespace-nowrap overflow-hidden\": true,\n [linkFocus]: true,\n \"px-2 py-1.5 mb-1\": dense,\n \"px-3 py-2 mb-[6px]\": !dense,\n [linkActive]: currentPath === item?.href,\n \"text-gray-700\": currentPath !== item?.href,\n })}\n href={item?.href || \"#\"}\n passHref\n >\n <div\n className={`flex items-center gap-2 whitespace-nowrap`}\n >\n <span\n className={dense ? \"text-xs\" : \"text-text-sm\"}\n >\n {\" \"}\n {item.icon}\n </span>\n <span\n className={cn(\n \"transition-opacity duration-200 motion-reduce:transition-none\",\n !collapsed ? \"opacity-0\" : \"\",\n )}\n >\n {item.label}\n </span>\n </div>\n </Link>\n </li>\n ))}\n </ul>\n }\n </li>\n ))}\n </ul>\n </nav>\n )}\n {children}\n </div>\n );\n};\n\nSidebar.Header = SidebarHeader;\nSidebar.Menu = SidebarMenu;\nSidebar.Footer = SidebarFooter;\n\nexport default Sidebar;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface SkeletonProps {\n width?: string | number;\n height?: string | number;\n circle?: boolean;\n animation?: \"wave\" | \"pulse\" | \"shimmer\";\n}\n\nconst Skeleton: React.FC<SkeletonProps> = ({\n width = \"100%\",\n height = \"100%\",\n circle = false,\n animation = \"shimmer\",\n}) => {\n const style: React.CSSProperties = {\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n borderRadius: circle ? \"50%\" : undefined,\n display: \"block\",\n };\n\n return (\n <span\n // a placeholder carries no information, so it is hidden from screen readers\n aria-hidden=\"true\"\n className={cn(\n // the skeleton* classes come from your global stylesheet and still\n // control the colour and the animation\n \"skeleton rounded-xl\",\n // never squashed in a flex row, never wider than its container\n \"shrink-0 max-w-full\",\n // under prefers-reduced-motion the placeholder stays but stops moving\n \"motion-reduce:[animation:none]\",\n circle ? \"circle\" : \"\",\n animation === \"shimmer\" && \"skeleton-shimmer\",\n animation === \"wave\" && \"skeleton-wave\",\n animation === \"pulse\" && \"skeleton-pulse\",\n )}\n style={style}\n ></span>\n );\n};\n\nexport default Skeleton;\n","import React, { forwardRef, type InputHTMLAttributes } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface SliderProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> {\n value: number;\n min?: number;\n max?: number;\n size?: \"sm\" | \"lg\";\n}\n\nconst Slider = forwardRef<HTMLInputElement, SliderProps>(\n ({ value, min = 0, max = 100, size = \"sm\", ...props }, ref) => {\n const progress = ((value - min) / (max - min)) * 100;\n return (\n <>\n <input\n ref={ref}\n type=\"range\"\n min={min}\n max={max}\n value={value}\n {...props}\n className={cn(\n // existing hook, kept because the thumb styles live under `.slider`\n \"slider\",\n // track\n \"w-full rounded-full appearance-none bg-gray-300 cursor-pointer\",\n \"transition-shadow duration-200 ease-out motion-reduce:transition-none\",\n // keyboard-only focus ring (same ring as Input, Textarea, FileUpload)\n \"focus:outline-none focus-visible:ring-4 focus-visible:ring-primary-100\",\n // error state via the native attribute, no new prop needed\n \"aria-[invalid=true]:focus-visible:ring-error-100\",\n // disabled\n \"disabled:opacity-30 disabled:cursor-not-allowed\",\n // height (unchanged: 6px for sm, 16px for lg)\n size === \"sm\" ? \"h-1.5\" : \"h-4\",\n )}\n style={{\n // the fill uses a stronger shade than before for better contrast,\n // falling back to the original --primary-300 if --primary-500 isn't defined\n background: `linear-gradient(to right, var(--primary-500, var(--primary-300)) ${progress}%, var(--gray-200, var(--gray-300)) ${progress}%)`,\n }}\n />\n </>\n );\n },\n);\n\nSlider.displayName = \"Slider\";\n\nexport default Slider;\n","import React, { forwardRef } from 'react';\n\ninterface SplitButtonProps {\n children: React.ReactNode;\n className?: string;\n size?: 'sm' | 'md' | 'lg';\n appearance?: 'primary' | 'secondary' | 'warning' | 'danger';\n compact?: boolean;\n}\n\nconst SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(\n ({ children, className = '', size = 'md', appearance = 'primary', compact = false, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={`inline-flex ${compact ? 'gap-0' : ''} ${className}`}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSplitButton.displayName = 'SplitButton';\n\nexport default SplitButton;","\"use client\";\nimport React, { useRef } from \"react\";\nimport { RiCheckLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ninterface StepConfig {\n name: string;\n helperName?: string;\n Component: React.ComponentType<any>;\n}\n\ninterface CheckoutStepperProps {\n stepsConfig: StepConfig[];\n currentStep: number;\n setCurrentStep: (step: number) => void;\n isComplete: boolean;\n setIsComplete: (complete: boolean) => void;\n position?: string;\n}\n\nconst Stepper = ({\n stepsConfig,\n currentStep,\n setCurrentStep,\n isComplete,\n setIsComplete,\n position = \"horizontal\",\n}: CheckoutStepperProps) => {\n const stepRef = useRef<(HTMLDivElement | null)[]>([]);\n\n if (!stepsConfig.length) {\n return null;\n }\n\n const ActiveComponent = stepsConfig[currentStep - 1]?.Component;\n\n return (\n <div\n role=\"region\"\n aria-label=\"Step Progress\"\n className={cn(position !== \"horizontal\" && \"flex\")}\n >\n <div\n className={cn(\n \"relative\",\n position === \"horizontal\"\n ? \"flex justify-center items-start\"\n : \"flex flex-col\",\n )}\n role=\"list\"\n aria-label={`Progress: ${currentStep} of ${stepsConfig.length} steps`}\n >\n {stepsConfig?.map((step, index) => {\n const isDone = currentStep > index + 1 || isComplete;\n const isCurrent = currentStep === index + 1;\n\n return (\n <div\n key={index}\n ref={(el: any) => (stepRef.current[index] = el)}\n className={cn(\n position === \"horizontal\"\n ? \"flex gap-4 flex-col\"\n : \"flex gap-6 justify-start\",\n index === stepsConfig.length - 1 ? \"w-auto\" : \"w-full\",\n // kept as a styling hook for consumers\n isDone ? \"complete\" : \"\",\n )}\n role=\"listitem\"\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={`${step.name}${\n step.helperName ? `, ${step.helperName}` : \"\"\n }, ${\n isDone ? \"completed\" : isCurrent ? \"current step\" : \"pending\"\n }`}\n >\n <div\n className={cn(\n \"\",\n position === \"horizontal\"\n ? \"flex items-center\"\n : \"flex flex-col\",\n )}\n >\n <div\n className={cn(\n // size is unchanged (20px), so connectors and labels stay aligned\n \"w-[20px] h-[20px] shrink-0 rounded-full flex justify-center items-center border\",\n \"transition-[background-color,border-color,box-shadow] duration-300 ease-out motion-reduce:transition-none\",\n isDone\n ? \"bg-primary-600 border-transparent\"\n : isCurrent\n ? // soft halo makes the current step easy to spot\n \"bg-white border-primary-600 ring-4 ring-primary-100\"\n : \"bg-white border-gray-300\",\n )}\n role=\"status\"\n aria-label={`Step ${index + 1} ${\n isDone ? \"completed\" : isCurrent ? \"current\" : \"pending\"\n }`}\n >\n {isCurrent && !isComplete && (\n <span\n aria-hidden=\"true\"\n className=\"w-[10px] h-[10px] rounded-full bg-primary-600\"\n ></span>\n )}\n {isDone && (\n <span aria-hidden=\"true\" className=\"inline-flex\">\n <RiCheckLine size={12} color=\"#fff\" />\n </span>\n )}\n </div>\n {index !== stepsConfig.length - 1 && (\n <div\n className={cn(\n \"mx-auto rounded-full bg-gray-200 overflow-hidden\",\n position === \"horizontal\"\n ? \"w-[80%] h-1\"\n : \"h-[100px] w-1 my-2\",\n )}\n aria-hidden=\"true\"\n >\n {/* the fill grows when a step is completed */}\n <p\n className={cn(\n \"rounded-full bg-primary-600\",\n \"transition-[width,height] duration-500 ease-out motion-reduce:transition-none\",\n position === \"horizontal\"\n ? cn(\n \"h-full\",\n currentStep > index + 1 ? \"w-full\" : \"w-0\",\n )\n : cn(\n \"w-full\",\n currentStep > index + 1 ? \"h-full\" : \"h-0\",\n ),\n )}\n ></p>\n </div>\n )}\n </div>\n\n {/* step name */}\n <div\n aria-hidden={!isCurrent}\n className={cn(\n \"whitespace-nowrap\",\n // the label is 20px tall now, so it lines up with the circle\n // without the old negative margin unless there is helper text\n step?.helperName ? \"-mt-1\" : \"\",\n )}\n >\n <span\n aria-label=\"Helper text\"\n className=\"block text-gray-500 text-text-xs\"\n >\n {step?.helperName}\n </span>\n <p\n className={cn(\n \"text-sm leading-5 transition-colors duration-300 motion-reduce:transition-none\",\n isCurrent\n ? \"font-semibold text-primary-700\"\n : isDone\n ? \"font-medium text-gray-900\"\n : \"font-medium text-gray-500\",\n )}\n >\n {step?.name}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n\n {ActiveComponent && (\n <div\n role=\"tabpanel\"\n aria-label={`Current step: ${stepsConfig[currentStep - 1]?.name}`}\n tabIndex={0}\n // keyboard-only ring, since the panel is focusable\n className=\"rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\"\n >\n <ActiveComponent />\n </div>\n )}\n </div>\n );\n};\n\nexport default Stepper;\n","import React, {\n HTMLAttributes,\n ReactNode,\n TableHTMLAttributes,\n TdHTMLAttributes,\n ThHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface TableProps extends TableHTMLAttributes<HTMLTableElement> {\n children?: ReactNode;\n dense?: boolean;\n}\n\ninterface TableHeadProps extends HTMLAttributes<HTMLTableSectionElement> {\n children?: ReactNode;\n}\n\ninterface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n children?: ReactNode;\n indent?: boolean;\n}\n\ninterface TableHeadCellProps extends ThHTMLAttributes<HTMLTableCellElement> {\n children?: ReactNode;\n icon?: JSX.Element;\n sticky?: boolean;\n left?: string;\n right?: string;\n stickyIcon?: JSX.Element;\n shadow?: boolean;\n shadowRight?: boolean;\n}\n\ninterface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n children?: ReactNode;\n icon?: JSX.Element;\n sticky?: boolean;\n left?: string;\n right?: string;\n shadow?: boolean;\n shadowRight?: boolean;\n}\n\nexport const Table = ({ children, className, dense, ...props }: TableProps) => {\n return (\n <table\n {...props}\n className={cn(\n dense && \"group/dense\",\n \"bg-white text-left w-full border\",\n className\n )}\n >\n {children}\n </table>\n );\n};\n\nexport const TableHead = ({\n children,\n className,\n ...props\n}: TableHeadProps) => {\n return (\n <thead\n {...props}\n className={cn(\"bg-gray-50 border border-gray-200\", className)}\n >\n {children}\n </thead>\n );\n};\n\nexport const TableBody = ({\n children,\n className,\n ...props\n}: TableHeadProps) => {\n return (\n <tbody {...props} className={cn(className)}>\n {children}\n </tbody>\n );\n};\n\nexport const TableRow = ({\n children,\n className,\n indent,\n ...props\n}: TableRowProps) => {\n return (\n <tr\n {...props}\n className={cn(\n \"border border-gray-200 hover:bg-gray-50\",\n indent && \"group/indent border-none\",\n className\n )}\n >\n {children}\n </tr>\n );\n};\n\nexport const TableHeadCell = ({\n children,\n className,\n icon,\n sticky,\n shadow,\n left,\n shadowRight,\n right,\n ...props\n}: TableHeadCellProps) => {\n return (\n <th\n {...props}\n className={cn(\n \"px-6 py-3 text-left group-has-[th]/dense:py-2\",\n sticky && `sticky bg-gray-50`,\n sticky && shadow && \"shadow-table\",\n sticky && shadowRight && \"shadow-tableRight\",\n left,\n right,\n className\n )}\n style={{\n left: left,\n right: right,\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-xs\">{children}</span>\n {icon && (\n <span\n className={\n \"hover:bg-gray-200 w-5 h-5 flex items-center justify-center p-1 rounded focus:bg-gray-300 active:bg-gray-300\"\n }\n >\n {icon}\n </span>\n )}\n </div>\n </th>\n );\n};\n\nexport const TableDataCell = ({\n children,\n className,\n icon,\n sticky,\n shadow,\n shadowRight,\n left,\n right,\n ...props\n}: TableCellProps) => {\n return (\n <td\n {...props}\n className={cn(\n \"px-6 py-4 text-sm font-medium group-has-[td]/dense:py-2 first:group-has-[td]/indent:pl-[60px]\",\n sticky && `sticky bg-white`,\n sticky && shadow && \"shadow-table\",\n sticky && shadowRight && \"shadow-tableRight\",\n left,\n right,\n className\n )}\n style={{\n left: left,\n right: right,\n }}\n >\n <span className=\"font-medium text-sm\">{children}</span>\n {icon && (\n <span\n className={\n \"hover:bg-gray-200 w-5 h-5 flex items-center justify-center p-1 rounded focus:bg-gray-300 active:bg-gray-300\"\n }\n >\n {icon}\n </span>\n )}\n </td>\n );\n};\n\nexport default Table;\n","\"use client\";\nimport React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface TabItem {\n label: string;\n value: string;\n}\n\ninterface TabsContainerProps {\n value: string;\n children: React.ReactNode;\n className?: string;\n position?: \"horizontal\" | \"vertical\";\n}\n\ninterface TabListProps extends Partial<TabItem> {\n onChange: (value: string) => void;\n ariaLabel?: string;\n children: React.ReactNode;\n box?: boolean;\n pill?: boolean;\n className?: string;\n position?: \"horizontal\" | \"vertical\";\n persist?: \"url\" | \"localStorage\";\n persistKey?: string;\n}\n\ninterface TabProps extends TabItem {\n onChange: (value: string) => void;\n box?: boolean;\n pill?: boolean;\n content?: React.ReactNode;\n selectedTabValue: string;\n icon?: JSX.Element;\n className?: string;\n tabIndex?: number;\n onKeyDown?: (e: React.KeyboardEvent<HTMLButtonElement>) => void;\n position?: \"horizontal\" | \"vertical\";\n ref?: React.Ref<HTMLButtonElement>;\n}\n\ninterface TabPanelProps {\n value: string;\n currentValue: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const TabsContainer: React.FC<TabsContainerProps> = ({\n children,\n className,\n position = \"horizontal\",\n}) => {\n return (\n <div className={cn(position === \"vertical\" ? \"flex\" : \"block\", className)}>\n {children}\n </div>\n );\n};\n\nexport const TabList: React.FC<TabListProps> = ({\n onChange,\n ariaLabel,\n children,\n box = false,\n pill = false,\n className,\n position = \"horizontal\",\n persist,\n persistKey,\n}) => {\n const [focusIndex, setFocusIndex] = React.useState(0);\n const tabRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\n React.useEffect(() => {\n if (!persist || !persistKey || typeof window === \"undefined\") return;\n\n let storedValue: string | null = null;\n\n if (persist === \"url\") {\n storedValue = new URLSearchParams(window.location.search).get(persistKey);\n } else if (persist === \"localStorage\") {\n storedValue = window.localStorage.getItem(persistKey);\n }\n\n if (storedValue) {\n onChange(storedValue);\n }\n }, [persist, persistKey, onChange]);\n\n const handleChange = React.useCallback(\n (value: string) => {\n if (persist === \"url\" && persistKey && typeof window !== \"undefined\") {\n const url = new URL(window.location.href);\n url.searchParams.set(persistKey, value);\n window.history.replaceState({}, \"\", url.toString());\n } else if (\n persist === \"localStorage\" &&\n persistKey &&\n typeof window !== \"undefined\"\n ) {\n window.localStorage.setItem(persistKey, value);\n }\n onChange(value);\n },\n [persist, persistKey, onChange],\n );\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n const tabCount = React.Children.count(children);\n\n switch (e.key) {\n case \"ArrowRight\":\n if (position === \"horizontal\") {\n e.preventDefault();\n const nextIndex = (index + 1) % tabCount;\n setFocusIndex(nextIndex);\n tabRefs.current[nextIndex]?.focus();\n }\n break;\n case \"ArrowLeft\":\n if (position === \"horizontal\") {\n e.preventDefault();\n const prevIndex = (index - 1 + tabCount) % tabCount;\n setFocusIndex(prevIndex);\n tabRefs.current[prevIndex]?.focus();\n }\n break;\n case \"ArrowDown\":\n if (position === \"vertical\") {\n e.preventDefault();\n const nextIndex = (index + 1) % tabCount;\n setFocusIndex(nextIndex);\n tabRefs.current[nextIndex]?.focus();\n }\n break;\n case \"ArrowUp\":\n if (position === \"vertical\") {\n e.preventDefault();\n const prevIndex = (index - 1 + tabCount) % tabCount;\n setFocusIndex(prevIndex);\n tabRefs.current[prevIndex]?.focus();\n }\n break;\n case \"Home\":\n e.preventDefault();\n setFocusIndex(0);\n tabRefs.current[0]?.focus();\n break;\n case \"End\":\n e.preventDefault();\n const lastIndex = tabCount - 1;\n setFocusIndex(lastIndex);\n tabRefs.current[lastIndex]?.focus();\n break;\n }\n };\n\n return (\n <div\n className={cn(\n position === \"horizontal\"\n ? // scrolls sideways on narrow screens instead of squashing the tabs\n \"flex items-center max-w-full overflow-x-auto\"\n : \"flex flex-col items-stretch\",\n box\n ? \"bg-gray-50 rounded-xl border border-gray-200\"\n : pill\n ? position === \"horizontal\"\n ? \"bg-transparent rounded-lg\"\n : \"bg-gray-100 rounded-2xl p-1\"\n : position === \"horizontal\"\n ? \"border-b border-gray-200\"\n : \"border-r border-gray-200\",\n className,\n )}\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={position}\n >\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const childProps = {\n onChange: handleChange,\n box,\n pill, // Add this line to pass pill prop to Tab\n position,\n onKeyDown: (e: React.KeyboardEvent) => handleKeyDown(e, index),\n tabIndex: index === focusIndex ? 0 : -1,\n };\n\n return React.cloneElement(child, {\n ...childProps,\n ref: (el: HTMLButtonElement | null) => {\n tabRefs.current[index] = el;\n const originalRef = (child as any).ref;\n if (originalRef) {\n if (typeof originalRef === \"function\") {\n originalRef(el);\n } else {\n originalRef.current = el;\n }\n }\n },\n } as any);\n }\n return null;\n })}\n </div>\n );\n};\n\nexport const Tab = React.forwardRef<HTMLButtonElement, TabProps>(\n (\n {\n label,\n value,\n onChange,\n icon,\n content,\n box = false,\n pill = false,\n selectedTabValue,\n className,\n onKeyDown,\n tabIndex,\n position = \"horizontal\",\n },\n ref,\n ) => {\n const isSelected = value === selectedTabValue;\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={`panel-${value}`}\n id={`tab-${value}`}\n tabIndex={tabIndex}\n onKeyDown={onKeyDown}\n className={cn(\n // base\n \"flex shrink-0 items-center gap-2 px-4 py-3 text-text-sm font-medium whitespace-nowrap cursor-pointer select-none outline-none\",\n \"transition-[color,background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n // keyboard focus (inset so it is never clipped by the scroll area)\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n // Default variant (no box, no pill). The transparent border is always\n // present, so selecting a tab no longer makes the row jump by 2px.\n !box &&\n !pill && [\n position === \"horizontal\"\n ? \"border-b-2 rounded-t-lg\"\n : \"border-r-2 rounded-l-lg\",\n \"hover:bg-gray-50\",\n isSelected\n ? \"text-primary-600 border-primary-600\"\n : \"border-transparent text-gray-600 hover:text-gray-900\",\n ],\n // Box variant\n box && [\n position === \"horizontal\"\n ? \"m-1 rounded-lg\"\n : \"mx-1 my-0.5 rounded-lg\",\n isSelected\n ? \"bg-white text-primary-700 shadow-sm ring-1 ring-gray-200\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n ],\n // Pill variant - Horizontal (joined segments)\n pill &&\n position === \"horizontal\" && [\n \"py-1.5 px-3.5 text-sm border -ml-px first:ml-0 first:rounded-l-full last:rounded-r-full\",\n isSelected\n ? \"relative z-10 bg-primary-600 border-primary-600 text-white shadow-sm hover:bg-primary-700\"\n : \"bg-white border-gray-300 text-gray-700 hover:bg-gray-50 hover:text-gray-900\",\n ],\n // Pill variant - Vertical\n pill &&\n position === \"vertical\" && [\n \"py-2 px-4 rounded-full border my-1\",\n isSelected\n ? \"bg-primary-600 border-primary-600 text-white shadow-sm hover:bg-primary-700\"\n : \"bg-transparent border-transparent text-gray-700 hover:bg-gray-200 hover:text-gray-900\",\n ],\n className,\n )}\n onClick={() => onChange(value)}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0\">\n {icon}\n </span>\n )}\n {label}\n {content && (\n <span aria-hidden=\"true\" className=\"font-normal opacity-70\">\n {content}\n </span>\n )}\n </button>\n );\n },\n);\n\nexport const TabPanel: React.FC<TabPanelProps> = ({\n value,\n currentValue,\n children,\n className,\n}) => {\n return value === currentValue ? (\n <div\n role=\"tabpanel\"\n id={`panel-${value}`}\n aria-labelledby={`tab-${value}`}\n tabIndex={0}\n className={cn(\n // keyboard-only ring, since the panel is focusable\n \"rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n className,\n )}\n >\n {children}\n </div>\n ) : null;\n};\n\nexport default TabsContainer;\n\nTab.displayName = \"Tab\";\n","import React, {\n forwardRef,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface TextareaProps extends Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n \"size\"\n> {\n size?: \"sm\" | \"lg\";\n disabled?: boolean;\n rows?: number;\n cols?: number;\n error?: boolean;\n children?: ReactNode;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n { size, className, rows, cols, disabled, error, children, id, ...props },\n ref,\n ) => {\n return (\n <textarea\n aria-invalid={error || undefined}\n {...props}\n ref={ref}\n disabled={disabled}\n rows={rows}\n cols={cols}\n className={cn(\n // existing hooks, kept for compatibility\n \"group flex items-center gap-2\",\n // surface (matches Input)\n \"w-full max-w-full rounded-xl border border-gray-200 bg-white text-sm text-gray-900\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // placeholder\n \"placeholder:text-gray-500 hover:placeholder:text-gray-500\",\n // hover\n \"hover:bg-gray-50 hover:border-gray-300\",\n // focus: border colour change plus a soft outer ring (matches Input)\n \"outline-none focus-within:border-primary-600 focus-within:bg-gray-25 focus-within:ring-4 focus-within:ring-primary-100\",\n \"focus-within:hover:bg-gray-50 focus-within:hover:border-primary-600\",\n // disabled\n \"disabled:bg-gray-300 disabled:select-none disabled:pointer-events-none disabled:opacity-30 disabled:shadow-none\",\n size === \"sm\" ? \"py-2.5 px-3.5\" : \"p-2.5\",\n error &&\n \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100 focus-within:hover:border-error-500\",\n className,\n size,\n )}\n >\n {children}\n </textarea>\n );\n },\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport default Textarea;\n","import { RiCloseCircleLine } from \"@remixicon/react\";\nimport React, { InputHTMLAttributes } from \"react\";\nimport Input from \"./Input\";\nimport Chip from \"./Chip\";\n\ninterface TextInputWithLabelProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n intent?:\n | \"error\"\n | \"default\"\n | \"success\"\n | \"warning\"\n | \"blue\"\n | \"primary\"\n | \"bluegray\"\n | \"bluelight\"\n | \"violet\"\n | \"indigo\"\n | \"purple\"\n | \"pink\"\n | \"rose\"\n | \"orange\";\n placeholder?: string;\n size?: \"sm\" | \"lg\";\n type?:\n | \"number\"\n | \"search\"\n | \"text\"\n | \"url\"\n | \"email\"\n | \"password\"\n | \"tel\"\n | \"time\";\n tags: string[];\n setTags: (tags: string[]) => void;\n}\n\nconst TextInputWithLabel: React.FC<TextInputWithLabelProps> = ({\n intent = \"primary\",\n placeholder = \"Enter tags\",\n type = \"text\",\n size,\n tags,\n setTags,\n ...props\n}) => {\n const handleAddTags = (inputValue: string) => {\n const values = inputValue\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v && !tags.includes(v));\n if (values.length === 0) return;\n setTags([...tags, ...values]);\n };\n\n const handleRemoveTag = (tag: string) => {\n setTags(tags.filter((t) => t !== tag));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const target = e.target as HTMLInputElement;\n handleAddTags(target.value);\n target.value = \"\";\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasteData = e.clipboardData.getData(\"text\");\n handleAddTags(pasteData);\n };\n\n return (\n <div>\n <Input\n type={type}\n size={size}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n className={\"w-full\"}\n {...props}\n />\n <div className=\"flex flex-wrap items-center gap-2 mt-2 transition-all duration-300\">\n {tags?.map((tag, idx) => (\n <Chip\n size=\"md\"\n intent={intent}\n key={`${tag}-${idx}`}\n endIcon={\n <RiCloseCircleLine\n size={14}\n className=\"cursor-pointer hover:text-red-500\"\n onClick={() => handleRemoveTag(tag)}\n />\n }\n >\n {tag}\n </Chip>\n ))}\n </div>\n </div>\n );\n};\n\nexport default TextInputWithLabel;\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport React, { type InputHTMLAttributes, forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface ToggleProps\n extends\n Omit<InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof toggleVariants> {\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n children?: never;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Per-intent styles. Class names are written out in full so Tailwind can */\n/* detect them. `primary` and `success` keep their existing checked colours; */\n/* the other intents are new and match the intents used by Button and Chip. */\n/* The checked hover and focus ring are tinted to match the intent. */\n/* -------------------------------------------------------------------------- */\nconst intentClasses = {\n primary:\n \"peer-checked:bg-primary-600 peer-checked:hover:bg-primary-700 peer-focus-visible:ring-primary-500\",\n success:\n \"peer-checked:bg-success-500 peer-checked:hover:bg-success-600 peer-focus-visible:ring-success-500\",\n error:\n \"peer-checked:bg-error-600 peer-checked:hover:bg-error-700 peer-focus-visible:ring-error-500\",\n warning:\n \"peer-checked:bg-warning-500 peer-checked:hover:bg-warning-600 peer-focus-visible:ring-warning-500\",\n default:\n \"peer-checked:bg-gray-700 peer-checked:hover:bg-gray-800 peer-focus-visible:ring-gray-500\",\n blue: \"peer-checked:bg-blue-600 peer-checked:hover:bg-blue-700 peer-focus-visible:ring-blue-500\",\n bluegray:\n \"peer-checked:bg-bluegray-600 peer-checked:hover:bg-bluegray-700 peer-focus-visible:ring-bluegray-500\",\n bluelight:\n \"peer-checked:bg-bluelight-600 peer-checked:hover:bg-bluelight-700 peer-focus-visible:ring-bluelight-500\",\n indigo:\n \"peer-checked:bg-indigo-600 peer-checked:hover:bg-indigo-700 peer-focus-visible:ring-indigo-500\",\n purple:\n \"peer-checked:bg-purple-600 peer-checked:hover:bg-purple-700 peer-focus-visible:ring-purple-500\",\n violet:\n \"peer-checked:bg-violet-600 peer-checked:hover:bg-violet-700 peer-focus-visible:ring-violet-500\",\n pink: \"peer-checked:bg-pink-600 peer-checked:hover:bg-pink-700 peer-focus-visible:ring-pink-500\",\n rose: \"peer-checked:bg-rose-600 peer-checked:hover:bg-rose-700 peer-focus-visible:ring-rose-500\",\n orange:\n \"peer-checked:bg-orange-600 peer-checked:hover:bg-orange-700 peer-focus-visible:ring-orange-500\",\n};\n\nconst toggleVariants = cva(\"\", {\n variants: {\n // Track and thumb dimensions are unchanged. The thumb travels\n // `translate-x-full` (its own width), which equals the free track\n // space in all three sizes, so don't change one without the other.\n size: {\n sm: \"w-5 h-3 after:w-2 after:h-2\",\n md: \"w-9 h-5 after:w-4 after:h-4\",\n lg: \"w-11 h-6 after:w-5 after:h-5\",\n },\n intent: intentClasses,\n },\n defaultVariants: {\n size: \"md\",\n intent: \"primary\",\n },\n});\n\nconst Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n ({ size, className, intent, disabled, children, id, ...props }, ref) => {\n return (\n <label\n className={cn(\n \"inline-flex items-center cursor-pointer\",\n disabled && \"opacity-30 pointer-events-none\",\n )}\n htmlFor={id}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n ref={ref}\n id={id}\n role=\"switch\"\n aria-checked={props?.checked}\n {...props}\n className=\"sr-only peer\"\n />\n <span\n className={cn(\n // track\n \"relative w-11 h-7 rounded-full peer\",\n \"bg-gray-300 hover:bg-gray-400 shadow-inner\",\n \"transition-colors duration-200 ease-out\",\n // focus (keyboard only; colour is set per intent)\n \"peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-offset-2\",\n // thumb\n \"after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:h-5 after:w-5\",\n \"after:bg-white after:rounded-full after:shadow-[0_1px_3px_0_rgb(16_24_40/0.3)]\",\n \"after:transition-transform after:duration-200 after:ease-out\",\n \"peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full\",\n // reduced motion\n \"motion-reduce:transition-none motion-reduce:after:transition-none\",\n toggleVariants({\n intent,\n size,\n }),\n className,\n )}\n aria-hidden=\"true\"\n >\n {children}\n </span>\n </label>\n );\n },\n);\n\nToggle.displayName = \"Toggle\";\n\nexport default Toggle;\n","import { VariantProps, cva } from \"class-variance-authority\";\nimport { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport React from \"react\";\n\n// The tooltip shows while the trigger is hovered (as before) and now also\n// while something inside it has keyboard focus (group-focus-within), so\n// keyboard users can read it too.\nconst tooltipVariants = cva(\n [\n // surface: same radius, hairline border and shadow family as Modal, Dropdown and Accordion\n \"absolute hidden group-hover:block group-focus-within:block z-10 p-3 w-max whitespace-normal\",\n \"bg-white text-gray-700 cursor-default rounded-xl border border-gray-200 shadow-lg\",\n // never wider than the screen on phones\n \"max-w-[min(328px,calc(100vw-2rem))]\",\n // Fade and slide in. The old 2s hover delay plus 1s transition meant a\n // tooltip took 3 seconds to appear; it now waits 300ms and fades in over 150ms.\n \"opacity-0 group-hover:opacity-100 group-focus-within:opacity-100\",\n \"transform transition-[opacity,transform] duration-150 ease-out group-hover:delay-300 motion-reduce:transition-none\",\n ],\n {\n variants: {\n position: {\n top: \"bottom-[calc(100%+8px)] translate-y-[-10px] group-hover:translate-y-0 group-focus-within:translate-y-0\",\n right:\n \"top-1/2 -translate-y-1/2 left-[calc(100%+8px)] translate-x-[-10px] group-hover:translate-x-0 group-focus-within:translate-x-0\",\n bottom:\n \"top-[calc(100%+8px)] translate-y-[10px] group-hover:translate-y-0 group-focus-within:translate-y-0\",\n left: \"top-1/2 -translate-y-1/2 right-[calc(100%+8px)] translate-x-[10px] group-hover:translate-x-0 group-focus-within:translate-x-0\",\n },\n },\n },\n);\n\n// The arrow is a small rotated square that shares the panel's border and\n// background, so the pointer matches the border (the old CSS-triangle arrow\n// was white only and could not carry a border). Only the two edges that form\n// the visible tip have a border.\nconst arrowVariants = cva(\n \"absolute h-2.5 w-2.5 rotate-45 bg-white border-gray-200 pointer-events-none\",\n {\n variants: {\n position: {\n // tooltip above the trigger, arrow on the bottom edge pointing down\n top: \"-bottom-[5px] left-4 -translate-x-1/2 border-b border-r\",\n // tooltip right of the trigger, arrow on the left edge pointing left\n right: \"-left-[5px] top-1/2 -translate-y-1/2 border-b border-l\",\n // tooltip below the trigger, arrow on the top edge pointing up\n bottom: \"-top-[5px] left-4 -translate-x-1/2 border-l border-t\",\n // tooltip left of the trigger, arrow on the right edge pointing right\n left: \"-right-[5px] top-1/2 -translate-y-1/2 border-r border-t\",\n },\n },\n },\n);\n\ninterface TooltipProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, \"content\">,\n VariantProps<typeof tooltipVariants> {\n children: ReactNode;\n position: \"top\" | \"right\" | \"bottom\" | \"left\";\n content: JSX.Element | string;\n}\n\nconst Tooltip: React.FC<TooltipProps> = ({\n position,\n content,\n children,\n className,\n ...props\n}) => {\n return (\n <div {...props} className=\"relative cursor-pointer text-sm group w-fit\">\n <div>{children}</div>\n <div\n role=\"tooltip\"\n className={cn(tooltipVariants({ position }), className)}\n >\n {content}\n <div aria-hidden=\"true\" className={cn(arrowVariants({ position }))} />\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","\"use client\";\nimport React, { useState } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { RiArrowRightSFill } from \"@remixicon/react\";\n\n// -------------------- Types --------------------\n\ninterface TreeViewProps {\n children: React.ReactNode;\n \"aria-label\": string;\n flat?: boolean;\n className?: string;\n /** Optional array of IDs to expand initially */\n defaultExpandedIds?: string[];\n /** Controlled expansion (useful if parent manages state externally) */\n expandedIds?: string[];\n /** Callback for when expanded nodes change */\n onExpandedChange?: (expanded: string[]) => void;\n /** Allow multiple nodes to be expanded simultaneously */\n allowMultiple?: boolean;\n /** Automatically expand all top-level items by default */\n expandTopLevelByDefault?: boolean;\n}\n\ninterface TreeViewItemProps {\n id: string;\n children: React.ReactNode;\n current?: boolean;\n className?: string;\n onSelect?: (id: string) => void;\n level?: number;\n expanded?: boolean;\n onToggle?: (id: string) => void;\n selected?: boolean;\n flat?: boolean;\n}\n\ninterface TreeViewSubTreeProps {\n children: React.ReactNode;\n state?: \"loading\";\n count?: number;\n className?: string;\n expanded?: boolean;\n flat?: boolean;\n}\n\n// -------------------- Main TreeView --------------------\n\nexport const TreeView: React.FC<TreeViewProps> & {\n Item: React.FC<TreeViewItemProps>;\n SubTree: typeof TreeViewSubTree;\n LeadingVisual: typeof TreeViewLeadingVisual;\n TrailingVisual: typeof TreeViewTrailingVisual;\n} = ({\n children,\n \"aria-label\": ariaLabel,\n flat = false,\n className,\n defaultExpandedIds = [],\n expandedIds,\n onExpandedChange,\n allowMultiple = true,\n expandTopLevelByDefault = false,\n}) => {\n // Extract all top-level IDs if needed for default expansion\n const topLevelIds = React.Children.toArray(children)\n .map((child) =>\n React.isValidElement<TreeViewItemProps>(child) ? child.props.id : null,\n )\n .filter(Boolean) as string[];\n\n const [internalExpanded, setInternalExpanded] = useState<Set<string>>(\n () =>\n new Set(\n defaultExpandedIds.length\n ? defaultExpandedIds\n : expandTopLevelByDefault\n ? topLevelIds\n : [],\n ),\n );\n\n const expandedNodes = expandedIds ? new Set(expandedIds) : internalExpanded;\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n // Handle node toggle\n const toggleNode = (id: string) => {\n const updateSet = (set: Set<string>): Set<string> => {\n const next = new Set(set);\n if (allowMultiple) {\n next.has(id) ? next.delete(id) : next.add(id);\n } else {\n next.clear();\n next.add(id);\n }\n return next;\n };\n\n if (expandedIds && onExpandedChange) {\n // Controlled mode\n const newExpanded = updateSet(expandedNodes);\n onExpandedChange(Array.from(newExpanded));\n } else {\n // Uncontrolled mode\n setInternalExpanded((prev) => updateSet(prev));\n }\n };\n\n const handleSelect = (id: string) => setSelectedId(id);\n\n // Recursively enhance children\n const enhanceChildren = (\n nodes: React.ReactNode,\n level = 0,\n ): React.ReactNode =>\n React.Children.map(nodes, (child) => {\n if (React.isValidElement<TreeViewItemProps>(child)) {\n return React.cloneElement(child, {\n level,\n expanded: expandedNodes.has(child.props.id),\n onToggle: toggleNode,\n onSelect: handleSelect,\n selected: selectedId === child.props.id,\n flat,\n children: enhanceChildren(child.props.children, level + 1),\n });\n }\n return child;\n });\n\n return (\n <ul\n role=\"tree\"\n aria-label={ariaLabel}\n className={cn(\"list-none p-0 m-0 text-sm\", className)}\n >\n {enhanceChildren(children)}\n </ul>\n );\n};\n\n// -------------------- Item --------------------\n\n// One chevron that rotates when a node opens. The old version swapped between\n// a \"down\" and a \"right\" icon, so the transition class on it never animated.\nconst DefaultExpandIcon: React.FC<{ expanded?: boolean }> = ({ expanded }) => (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex shrink-0 text-gray-500 transition-transform duration-200 ease-out motion-reduce:transition-none\",\n expanded && \"rotate-90\",\n )}\n >\n <RiArrowRightSFill size={18} />\n </span>\n);\n\nconst TreeViewItem: React.FC<TreeViewItemProps> = ({\n id,\n children,\n current = false,\n className,\n onSelect,\n expanded = false,\n onToggle,\n selected = false,\n level = 0,\n flat = false,\n}) => {\n const leading: React.ReactNode[] = [];\n const trailing: React.ReactNode[] = [];\n const content: React.ReactNode[] = [];\n let subTree: React.ReactElement | null = null;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n if (child.type === TreeViewLeadingVisual) leading.push(child);\n else if (child.type === TreeViewTrailingVisual) trailing.push(child);\n else if (child.type === TreeViewSubTree) subTree = child;\n else content.push(child);\n } else content.push(child);\n });\n\n const hasSubTree = !!subTree;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (hasSubTree && !flat && onToggle) onToggle(id);\n if (onSelect) onSelect(id);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"Enter\":\n case \" \":\n e.preventDefault();\n handleClick(e as any);\n break;\n case \"ArrowRight\":\n if (hasSubTree && !expanded && !flat && onToggle) {\n e.preventDefault();\n onToggle(id);\n }\n break;\n case \"ArrowLeft\":\n if (hasSubTree && expanded && !flat && onToggle) {\n e.preventDefault();\n onToggle(id);\n }\n break;\n }\n };\n\n const processedSubTree =\n subTree && React.isValidElement(subTree)\n ? React.cloneElement(subTree, { expanded, flat })\n : null;\n\n return (\n <>\n <li\n role=\"treeitem\"\n aria-expanded={hasSubTree && !flat ? expanded : undefined}\n aria-selected={selected}\n aria-current={current ? \"true\" : undefined}\n className={cn(\n \"flex items-center gap-2 px-2 py-1.5 cursor-pointer select-none rounded-lg text-gray-700 outline-none\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-100 active:bg-gray-200\",\n // keyboard-only ring, inset so a scrolling parent never clips it\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n // the current item is subtly marked, a selected item is highlighted\n current && !selected && \"bg-gray-50 font-medium text-gray-900\",\n // uses the primary tokens like the rest of the library (it was blue-*)\n selected &&\n \"bg-primary-50 text-primary-700 font-medium hover:bg-primary-100\",\n className,\n )}\n style={{ paddingLeft: `${level * 16 + 8}px` }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n >\n <span className=\"flex items-center gap-1\">\n {/* Show arrow only if there is no custom leading visual */}\n {!leading.length && hasSubTree && !flat && (\n <DefaultExpandIcon expanded={expanded} />\n )}\n {leading}\n </span>\n\n <span className=\"min-w-0 flex-1\">{content}</span>\n {trailing}\n </li>\n {processedSubTree}\n </>\n );\n};\n\n// -------------------- SubTree --------------------\n\nconst TreeViewSubTree: React.FC<TreeViewSubTreeProps> = ({\n children,\n state,\n count,\n className,\n expanded = false,\n flat = false,\n}) => {\n if (flat) return null;\n if (state === \"loading\") {\n return (\n <ul role=\"group\" className={cn(\"list-none m-0\", className)}>\n <li role=\"status\" className=\"text-gray-500 italic p-1 pl-6\">\n Loading{count ? ` ${count} items...` : \"...\"}\n </li>\n </ul>\n );\n }\n\n return (\n <ul\n role=\"group\"\n className={cn(\n \"list-none m-0 pl-0 overflow-hidden\",\n \"transition-[max-height,opacity,visibility] duration-300 ease-in-out motion-reduce:transition-none\",\n // invisible keeps the items of a collapsed node out of the tab order\n // (they were only faded out, so Tab still landed on them)\n expanded\n ? \"max-h-96 opacity-100 visible\"\n : \"max-h-0 opacity-0 invisible\",\n className,\n )}\n >\n {children}\n </ul>\n );\n};\n\n// -------------------- Visuals --------------------\n\nconst TreeViewLeadingVisual: React.FC<{\n children: React.ReactNode;\n className?: string;\n}> = ({ children, className }) => (\n <span className={cn(\"flex items-center flex-shrink-0\", className)}>\n {children}\n </span>\n);\n\nconst TreeViewTrailingVisual: React.FC<{\n children: React.ReactNode;\n label?: string;\n className?: string;\n}> = ({ children, label, className }) => (\n <span\n className={cn(\"flex items-center ml-auto flex-shrink-0\", className)}\n // a label on a plain span is ignored by assistive tech, so give the\n // visual an image role when there is a label\n role={label ? \"img\" : undefined}\n aria-label={label}\n >\n {children}\n </span>\n);\n\n// Attach subcomponents\nTreeView.Item = TreeViewItem;\nTreeView.SubTree = TreeViewSubTree;\nTreeView.LeadingVisual = TreeViewLeadingVisual;\nTreeView.TrailingVisual = TreeViewTrailingVisual;\n\nexport default TreeView;\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport React, {\n type ElementType,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface TypographyProps\n extends HTMLAttributes<HTMLHeadingElement | HTMLParagraphElement>,\n VariantProps<typeof typographyVariant> {\n as?: ElementType;\n children: ReactNode;\n intent?: \"primary\" | \"success\" | \"error\" | \"warning\" | \"default\";\n}\n\nconst typographyVariant = cva(\"text-dark\", {\n variants: {\n variant: {\n h1: \"text-8xl font-bold\",\n h2: \"text-7xl font-bold\",\n h3: \"text-5xl font-bold\",\n h4: \"text-[32px] font-bold\",\n h5: \"text-2xl font-bold\",\n h6: \"text-xl font-semibold\",\n\n b1: \"text-xl font-normal\",\n b2: \"text-lg font-normal\",\n b3: \"text-base font-normal\",\n b4: \"text-sm font-normal\",\n b5: \"text-xs font-normal\",\n },\n intent: {\n primary: \"text-primary-600\",\n success: \"text-success-600\",\n error: \"text-error-600\",\n warning: \"text-warning-600\",\n default: \"text-black\",\n },\n },\n defaultVariants: {\n variant: \"h1\",\n intent: \"default\",\n },\n});\n\nconst Typography = ({\n as,\n variant = \"h1\",\n intent = \"default\",\n children,\n className,\n ...props\n}: TypographyProps) => {\n const Component =\n as || (variant?.startsWith(\"b\") ? \"p\" : (variant as ElementType));\n return (\n <Component\n className={cn(typographyVariant({ variant, intent, className }))}\n {...props}\n >\n {children}\n </Component>\n );\n};\n\nexport default Typography;\n","\"use client\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n THEME_MODE_ATTRIBUTE,\n generateScale,\n isThemeMode,\n isThemeScale,\n normalizeHex,\n themeModeStorageKey,\n themeToCss,\n type ThemeMode,\n type ThemeScale,\n} from \"../utils/theme\";\n\n// useLayoutEffect warns during SSR, so fall back to useEffect on the server.\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\ninterface ThemeState {\n color: string;\n scale: ThemeScale;\n}\n\ninterface ThemeContextValue {\n /** The brand colour currently applied, or null while the stylesheet defaults are in use. */\n color: string | null;\n /** The full 25 to 900 scale currently applied, or null while the defaults are in use. */\n scale: ThemeScale | null;\n /**\n * Applies `hex` as the new primary colour everywhere. Pass `options.scale`\n * to use an exact, pre-designed scale instead of deriving one from `hex`.\n * Invalid hex values are ignored.\n */\n setThemeColor: (hex: string, options?: { scale?: ThemeScale }) => void;\n /** Goes back to `defaultColor` (or the stylesheet defaults) and clears the saved choice. */\n resetTheme: () => void;\n /** The user's choice: \"light\", \"dark\" or \"system\" (the \"Default\" option). */\n mode: ThemeMode;\n /** What is actually shown. Differs from `mode` only when `mode` is \"system\". */\n resolvedMode: \"light\" | \"dark\";\n /** Changes the mode and remembers it. */\n setMode: (mode: ThemeMode) => void;\n}\n\ninterface ThemeProviderProps {\n children: ReactNode;\n /**\n * Optional starting brand colour (hex). It is rendered on the server, so\n * there is no flash. Leave it out to keep the colours from globals.css.\n */\n defaultColor?: string;\n /**\n * localStorage key used to remember the user's choice. Pass `null` to turn\n * persistence off. Defaults to \"picaso-ui-theme\".\n */\n storageKey?: string | null;\n /** CSP nonce for the injected <style> element. */\n nonce?: string;\n /**\n * Starting mode before the user chooses one. Defaults to \"system\", which\n * follows the device setting.\n */\n defaultMode?: ThemeMode;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nconst buildState = (\n hex: string | undefined,\n scale?: ThemeScale,\n): ThemeState | null => {\n const color = normalizeHex(hex);\n if (!color) return null;\n return { color, scale: scale ?? generateScale(color) };\n};\n\n// Storage can throw (private mode, blocked cookies, quota), so every access is guarded.\nconst readStored = (key: string): ThemeState | null => {\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { color?: unknown; scale?: unknown };\n const color =\n typeof parsed.color === \"string\" ? normalizeHex(parsed.color) : null;\n if (!color) return null;\n return {\n color,\n scale: isThemeScale(parsed.scale) ? parsed.scale : generateScale(color),\n };\n } catch {\n return null;\n }\n};\n\nconst writeStored = (key: string, state: ThemeState | null) => {\n try {\n if (state) window.localStorage.setItem(key, JSON.stringify(state));\n else window.localStorage.removeItem(key);\n } catch {\n /* ignore: the theme still applies for this session */\n }\n};\n\n/**\n * Re-colours every component that uses the `primary` scale.\n *\n * Renders no wrapper element, so it does not change the DOM your app already\n * has. Place it around the existing `theme-primary` container:\n *\n * ```tsx\n * <ThemeProvider>\n * <div className=\"theme-primary\">{children}</div>\n * </ThemeProvider>\n * ```\n */\nconst ThemeProvider = ({\n children,\n defaultColor,\n storageKey = \"picaso-ui-theme\",\n nonce,\n defaultMode = \"system\",\n}: ThemeProviderProps) => {\n // Server and first client render both use `defaultColor`, so hydration matches.\n const [initial] = useState(() => buildState(defaultColor));\n const [state, setState] = useState<ThemeState | null>(initial);\n\n // A saved choice can only be read in the browser, so it is restored after mount.\n useEffect(() => {\n if (!storageKey) return;\n const stored = readStored(storageKey);\n if (stored) setState(stored);\n }, [storageKey]);\n\n const setThemeColor = useCallback(\n (hex: string, options?: { scale?: ThemeScale }) => {\n const next = buildState(hex, options?.scale);\n if (!next) return;\n setState(next);\n if (storageKey) writeStored(storageKey, next);\n },\n [storageKey],\n );\n\n const resetTheme = useCallback(() => {\n setState(initial);\n if (storageKey) writeStored(storageKey, null);\n }, [initial, storageKey]);\n\n /* ------------------------------ light / dark ----------------------------- */\n\n const [mode, setModeState] = useState<ThemeMode>(defaultMode);\n const [resolvedMode, setResolvedMode] = useState<\"light\" | \"dark\">(\n defaultMode === \"dark\" ? \"dark\" : \"light\",\n );\n\n // Restore a saved mode before the first paint so there is no flash.\n useIsomorphicLayoutEffect(() => {\n if (!storageKey) return;\n try {\n const saved = window.localStorage.getItem(\n themeModeStorageKey(storageKey),\n );\n if (isThemeMode(saved)) setModeState(saved);\n } catch {\n /* storage unavailable: keep defaultMode */\n }\n }, [storageKey]);\n\n // Resolve \"system\" to light/dark, mark <html>, and follow OS changes live.\n useIsomorphicLayoutEffect(() => {\n const root = document.documentElement;\n const apply = (dark: boolean) => {\n const next = dark ? \"dark\" : \"light\";\n root.setAttribute(THEME_MODE_ATTRIBUTE, next);\n setResolvedMode(next);\n };\n\n if (mode !== \"system\") {\n apply(mode === \"dark\");\n return;\n }\n const query = window.matchMedia(\"(prefers-color-scheme: dark)\");\n apply(query.matches);\n const onChange = (event: MediaQueryListEvent) => apply(event.matches);\n query.addEventListener(\"change\", onChange);\n return () => query.removeEventListener(\"change\", onChange);\n }, [mode]);\n\n const setMode = useCallback(\n (next: ThemeMode) => {\n if (!isThemeMode(next)) return;\n setModeState(next);\n if (!storageKey) return;\n try {\n window.localStorage.setItem(themeModeStorageKey(storageKey), next);\n } catch {\n /* ignore: the mode still applies for this session */\n }\n },\n [storageKey],\n );\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n color: state?.color ?? null,\n scale: state?.scale ?? null,\n setThemeColor,\n resetTheme,\n mode,\n resolvedMode,\n setMode,\n }),\n [state, setThemeColor, resetTheme, mode, resolvedMode, setMode],\n );\n\n return (\n <ThemeContext.Provider value={value}>\n {state && (\n <style\n data-picaso-ui-theme=\"\"\n nonce={nonce}\n dangerouslySetInnerHTML={{ __html: themeToCss(state.scale) }}\n />\n )}\n {children}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n\nconst useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useTheme must be used inside <ThemeProvider>.\");\n }\n return context;\n};\n\nexport type { ThemeContextValue, ThemeProviderProps };\nexport { useTheme };\nexport default ThemeProvider;\n","/**\n * Theme helpers for re-colouring the `primary` scale at runtime.\n *\n * Pure functions only: no `window` / `document` access, so this file is safe to\n * import from server components, client components and during SSR.\n */\n\nexport const THEME_SHADES = [\n 25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900,\n] as const;\n\nexport type ThemeShade = (typeof THEME_SHADES)[number];\nexport type ThemeScale = Record<ThemeShade, string>;\n\n/**\n * The shade components use for their \"main\" brand colour (solid buttons,\n * borders, links, focus borders are all `primary-600`). A colour chosen by the\n * user becomes this shade; the others are derived from it.\n */\nexport const THEME_ANCHOR_SHADE: ThemeShade = 600;\n\n/** \"system\" is the \"Default\" option: it follows the device's light/dark setting. */\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\nexport const THEME_MODES: readonly ThemeMode[] = [\"light\", \"dark\", \"system\"];\n\n/** Attribute set on <html> with the resolved mode (\"light\" or \"dark\"). */\nexport const THEME_MODE_ATTRIBUTE = \"data-picaso-ui-mode\";\n\nexport const isThemeMode = (value: unknown): value is ThemeMode =>\n value === \"light\" || value === \"dark\" || value === \"system\";\n\n/** The mode is stored next to the colour, under `<storageKey>-mode`. */\nexport const themeModeStorageKey = (storageKey: string) => `${storageKey}-mode`;\n\nconst HEX_RE = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n/** Returns a lowercase `#rrggbb` string, or null when the input isn't a hex colour. */\nexport const normalizeHex = (\n input: string | undefined | null,\n): string | null => {\n if (!input) return null;\n const match = input.trim().match(HEX_RE);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n return `#${hex}`;\n};\n\ntype RGB = [number, number, number];\n\nconst hexToRgb = (hex: string): RGB => {\n const n = parseInt(hex.slice(1), 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n};\n\nconst rgbToHex = ([r, g, b]: RGB): string =>\n `#${[r, g, b]\n .map((v) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\"),\n )\n .join(\"\")}`;\n\nconst mix = (from: RGB, to: RGB, amount: number): RGB => [\n from[0] + (to[0] - from[0]) * amount,\n from[1] + (to[1] - from[1]) * amount,\n from[2] + (to[2] - from[2]) * amount,\n];\n\nconst WHITE: RGB = [255, 255, 255];\nconst BLACK: RGB = [0, 0, 0];\n\n/**\n * How far each shade sits from the anchor (600): lighter shades are mixed with\n * white, darker shades with black. Tuned against the library's default blue\n * scale so that anchoring on `#1570ef` lands close to the shipped values.\n */\nconst TINT_AMOUNT: Partial<Record<ThemeShade, number>> = {\n 25: 0.97,\n 50: 0.94,\n 100: 0.82,\n 200: 0.68,\n 300: 0.5,\n 400: 0.3,\n 500: 0.14,\n};\nconst SHADE_AMOUNT: Partial<Record<ThemeShade, number>> = {\n 700: 0.15,\n 800: 0.3,\n 900: 0.42,\n};\n\n/** Builds a full 25 to 900 scale from a single brand colour (used as shade 600). */\nexport const generateScale = (hex: string): ThemeScale => {\n const base = normalizeHex(hex);\n if (!base)\n throw new Error(`generateScale: \"${hex}\" is not a valid hex colour`);\n const rgb = hexToRgb(base);\n\n const scale = {} as ThemeScale;\n for (const shade of THEME_SHADES) {\n const tint = TINT_AMOUNT[shade];\n const dark = SHADE_AMOUNT[shade];\n if (tint !== undefined) scale[shade] = rgbToHex(mix(rgb, WHITE, tint));\n else if (dark !== undefined) scale[shade] = rgbToHex(mix(rgb, BLACK, dark));\n else scale[shade] = base;\n }\n return scale;\n};\n\n/** True when `value` has a valid hex for every shade. Used to validate stored data. */\nexport const isThemeScale = (value: unknown): value is ThemeScale => {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n return THEME_SHADES.every(\n (shade) =>\n typeof record[shade] === \"string\" &&\n normalizeHex(record[shade] as string) !== null,\n );\n};\n\nconst channel = (v: number) => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n};\n\nconst luminance = (hex: string) => {\n const [r, g, b] = hexToRgb(hex);\n return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b);\n};\n\n/** WCAG contrast ratio between two hex colours (1 to 21). */\nexport const contrastRatio = (a: string, b: string): number => {\n const x = normalizeHex(a);\n const y = normalizeHex(b);\n if (!x || !y) return 1;\n const [hi, lo] = [luminance(x), luminance(y)].sort((m, n) => n - m);\n return (hi + 0.05) / (lo + 0.05);\n};\n\nconst DARK_SURFACE: RGB = hexToRgb(\"#0c111d\");\n\n/** How much of the brand colour each tint keeps once it is blended into the dark surface. */\nconst DARK_TINT_KEEP: Partial<Record<ThemeShade, number>> = {\n 25: 0.08,\n 50: 0.13,\n 100: 0.22,\n 200: 0.36,\n 300: 0.55,\n};\n/** Text shades get lighter in dark mode so `text-primary-700` stays readable. */\nconst DARK_LIGHTEN: Partial<Record<ThemeShade, number>> = {\n 700: 0.22,\n 800: 0.38,\n 900: 0.52,\n};\n\n/**\n * Dark-mode version of a scale. Solid shades (400 to 600) are kept so buttons\n * and focus rings look the same; light tints become deep tints of the same\n * hue; dark text shades become light.\n */\nexport const generateDarkScale = (scale: ThemeScale): ThemeScale => {\n const brand = hexToRgb(scale[600]);\n const out = {} as ThemeScale;\n for (const shade of THEME_SHADES) {\n const keep = DARK_TINT_KEEP[shade];\n const lighten = DARK_LIGHTEN[shade];\n if (keep !== undefined)\n out[shade] = rgbToHex(mix(DARK_SURFACE, brand, keep));\n else if (lighten !== undefined)\n out[shade] = rgbToHex(mix(brand, WHITE, lighten));\n else out[shade] = scale[shade];\n }\n return out;\n};\n\nconst declarations = (name: string, scale: ThemeScale) =>\n THEME_SHADES.map((s) => `--${name}-${s}:${scale[s]};`).join(\"\");\n\n/**\n * CSS that overrides the `--primary-*` variables, for light and dark mode.\n *\n * globals.css declares them on `.theme-primary` (specificity 0,2,0 once the\n * native nesting is resolved), so a plain `:root { ... }` override would lose.\n * `:root:root .theme-primary` (0,3,0) wins without `!important`, and the bare\n * `:root:root` also covers content rendered outside a `.theme-primary` wrapper.\n * The dark rule adds the mode attribute (0,4,0), so it wins in dark mode.\n */\nexport const themeToCss = (scale: ThemeScale): string => {\n const dark = `:root:root[${THEME_MODE_ATTRIBUTE}=\"dark\"]`;\n return (\n `:root:root,:root:root .theme-primary{${declarations(\"primary\", scale)}}` +\n `${dark},${dark} .theme-primary{${declarations(\"primary\", generateDarkScale(scale))}}`\n );\n};\n","\"use client\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { RiRestartLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport {\n THEME_ANCHOR_SHADE,\n contrastRatio,\n normalizeHex,\n type ThemeScale,\n} from \"../utils/theme\";\nimport ColorPicker, {\n COLOR_PALETTE,\n COLOR_SHADES,\n type ColorFamily,\n type ColorPickerProps,\n type ColorPickerToken,\n} from \"./ColorPicker\";\nimport { useTheme } from \"./ThemeProvider\";\n\ninterface ThemeColorPickerProps\n extends Omit<ColorPickerProps, \"value\" | \"defaultValue\" | \"onChange\" | \"name\"> {\n /** Called after the theme has been updated, with the same arguments as ColorPicker. */\n onChange?: (value: string, token?: ColorPickerToken) => void;\n /** Show a \"Reset to default\" button once the theme has been changed. Defaults to true. */\n showReset?: boolean;\n}\n\n/**\n * Reads the exact scale of a palette family. Families that are CSS variables\n * in globals.css (gray, error, warning, success) are read live; the rest come\n * from the palette (they are fixed values in tailwind.config.ts).\n */\nconst readFamilyScale = (family: ColorFamily): ThemeScale => {\n const def = COLOR_PALETTE[family];\n const styles = getComputedStyle(document.documentElement);\n const scale = {} as ThemeScale;\n COLOR_SHADES.forEach((shade, index) => {\n const live = def.themed\n ? normalizeHex(styles.getPropertyValue(`--${family}-${shade}`))\n : null;\n scale[shade] = live ?? def.colors[index];\n });\n return scale;\n};\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-primary-100\";\n\n/**\n * A ColorPicker that re-colours the whole library. Everything that uses the\n * `primary` scale (buttons, inputs, focus rings, tabs, toggles, ...) updates\n * as soon as a colour is chosen.\n *\n * - Choosing a swatch at shade 600 from a family (e.g. Purple 600) applies that\n * family's complete, hand-tuned scale.\n * - Choosing any other swatch, or typing / picking a custom hex, makes that\n * colour the main brand colour (`primary-600`) and derives the other shades.\n *\n * Must be rendered inside `<ThemeProvider>`.\n */\nconst ThemeColorPicker = ({\n onChange,\n showReset = true,\n className,\n placeholder = \"Select brand color\",\n ...props\n}: ThemeColorPickerProps) => {\n const { color, scale, setThemeColor, resetTheme } = useTheme();\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Read back what is actually applied, so a stylesheet-level override of the\n // defaults is respected too. Done in an effect to keep SSR and hydration clean.\n const [applied, setApplied] = useState(\"\");\n useEffect(() => {\n if (!wrapperRef.current) return;\n const live = getComputedStyle(wrapperRef.current).getPropertyValue(\n `--primary-${THEME_ANCHOR_SHADE}`,\n );\n setApplied(normalizeHex(live) ?? \"\");\n }, [color, scale]);\n\n const handleChange = (hex: string, token?: ColorPickerToken) => {\n if (token?.family === \"primary\" && token.shade === THEME_ANCHOR_SHADE) {\n // That is the colour already applied; re-deriving it would only blur the scale.\n onChange?.(hex, token);\n return;\n }\n const exactScale =\n token && token.shade === THEME_ANCHOR_SHADE && token.family !== \"primary\"\n ? readFamilyScale(token.family)\n : undefined;\n setThemeColor(hex, exactScale ? { scale: exactScale } : undefined);\n onChange?.(hex, token);\n };\n\n const lowContrast = applied !== \"\" && contrastRatio(\"#ffffff\", applied) < 4.5;\n\n return (\n <div ref={wrapperRef} className=\"w-full\">\n <ColorPicker\n {...props}\n className={className}\n placeholder={placeholder}\n value={applied}\n onChange={handleChange}\n />\n\n {showReset && color !== null && !props.disabled && (\n <button\n type=\"button\"\n onClick={resetTheme}\n className={cn(\n \"mt-2 inline-flex items-center gap-1.5 rounded-md px-1 py-0.5 text-xs font-medium cursor-pointer\",\n \"text-gray-600 hover:text-gray-900\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n )}\n >\n <RiRestartLine aria-hidden=\"true\" size={14} />\n Reset to default\n </button>\n )}\n\n <p\n role=\"status\"\n className={cn(\"mt-1.5 text-xs text-warning-700\", !lowContrast && \"sr-only\")}\n >\n {lowContrast\n ? \"White text on this color has low contrast. Pick a darker color for readable buttons.\"\n : \"\"}\n </p>\n </div>\n );\n};\n\nThemeColorPicker.displayName = \"ThemeColorPicker\";\n\nexport type { ThemeColorPickerProps };\nexport default ThemeColorPicker;\n","\"use client\";\nimport React, { type HTMLAttributes, type KeyboardEvent } from \"react\";\nimport { RiComputerLine, RiMoonLine, RiSunLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport type { ThemeMode } from \"../utils/theme\";\nimport { useTheme } from \"./ThemeProvider\";\n\ninterface ThemeModeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\" | \"children\"> {\n /** Called after the mode has been changed. */\n onChange?: (mode: ThemeMode) => void;\n /** Show the text next to each icon. Set to false for a compact, icon-only switch. Defaults to true. */\n showLabels?: boolean;\n}\n\nconst OPTIONS = [\n { value: \"light\", label: \"Light\", hint: \"Always use the light theme\", Icon: RiSunLine },\n { value: \"dark\", label: \"Dark\", hint: \"Always use the dark theme\", Icon: RiMoonLine },\n { value: \"system\", label: \"Default\", hint: \"Follow your device setting\", Icon: RiComputerLine },\n] as const;\n\n/**\n * Light / Dark / Default switch. \"Default\" follows the device setting and\n * updates live if the device changes. Must be rendered inside `<ThemeProvider>`.\n */\nconst ThemeModeSwitch = ({\n onChange,\n showLabels = true,\n className,\n \"aria-label\": ariaLabel = \"Color mode\",\n ...props\n}: ThemeModeSwitchProps) => {\n const { mode, setMode } = useTheme();\n\n const choose = (next: ThemeMode) => {\n setMode(next);\n onChange?.(next);\n };\n\n // Arrow keys / Home / End move between the options, like a native radio group.\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const keys = [\"ArrowRight\", \"ArrowDown\", \"ArrowLeft\", \"ArrowUp\", \"Home\", \"End\"];\n if (!keys.includes(event.key)) return;\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>('button[role=\"radio\"]'),\n );\n const index = items.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n event.preventDefault();\n let next = index;\n if (event.key === \"Home\") next = 0;\n else if (event.key === \"End\") next = items.length - 1;\n else if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\")\n next = (index + 1) % items.length;\n else next = (index - 1 + items.length) % items.length;\n items[next].focus();\n items[next].click();\n };\n\n return (\n <div\n {...props}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n onKeyDown={(e) => {\n props.onKeyDown?.(e);\n handleKeyDown(e);\n }}\n className={cn(\n \"inline-flex items-center gap-1 rounded-xl border border-gray-200 bg-gray-50 p-1\",\n className,\n )}\n >\n {OPTIONS.map(({ value, label, hint, Icon }) => {\n const checked = mode === value;\n return (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n aria-label={showLabels ? undefined : label}\n title={hint}\n tabIndex={checked ? 0 : -1}\n onClick={() => choose(value)}\n className={cn(\n \"inline-flex h-8 items-center justify-center gap-1.5 rounded-lg text-sm font-medium cursor-pointer\",\n showLabels ? \"px-3\" : \"w-8\",\n \"transition-[background-color,color,box-shadow] duration-150 motion-reduce:transition-none\",\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-primary-100\",\n checked\n ? \"bg-white text-primary-700 shadow-sm ring-1 ring-gray-200\"\n : \"text-gray-600 hover:text-gray-900\",\n )}\n >\n <Icon aria-hidden=\"true\" size={16} />\n {showLabels && <span>{label}</span>}\n </button>\n );\n })}\n </div>\n );\n};\n\nThemeModeSwitch.displayName = \"ThemeModeSwitch\";\n\nexport type { ThemeModeSwitchProps };\nexport default ThemeModeSwitch;\n","import React from \"react\";\nimport {\n THEME_MODE_ATTRIBUTE,\n themeModeStorageKey,\n type ThemeMode,\n} from \"../utils/theme\";\n\ninterface ThemeScriptProps {\n /** Must match `ThemeProvider`'s `defaultMode`. Defaults to \"system\". */\n defaultMode?: ThemeMode;\n /** Must match `ThemeProvider`'s `storageKey`. Defaults to \"picaso-ui-theme\". Pass `null` if persistence is off. */\n storageKey?: string | null;\n /** CSP nonce for the inline script. */\n nonce?: string;\n}\n\n/**\n * Optional. Put it in <head> to apply the saved light/dark mode before the\n * page paints, so a dark-mode user never sees a white flash on reload.\n * It is a server component (no hooks, no browser APIs at render time).\n *\n * The script changes an attribute on <html> before React hydrates, so add\n * `suppressHydrationWarning` to your <html> tag.\n */\nconst ThemeScript = ({\n defaultMode = \"system\",\n storageKey = \"picaso-ui-theme\",\n nonce,\n}: ThemeScriptProps) => {\n const read = storageKey\n ? `var s=localStorage.getItem(${JSON.stringify(themeModeStorageKey(storageKey))});` +\n `if(s===\"light\"||s===\"dark\"||s===\"system\")m=s;`\n : \"\";\n const code =\n `(function(){try{var m=${JSON.stringify(defaultMode)};${read}` +\n `var d=m===\"dark\"||(m===\"system\"&&window.matchMedia(\"(prefers-color-scheme: dark)\").matches);` +\n `document.documentElement.setAttribute(\"${THEME_MODE_ATTRIBUTE}\",d?\"dark\":\"light\")}catch(e){}})();`;\n\n return <script nonce={nonce} dangerouslySetInnerHTML={{ __html: code }} />;\n};\n\nexport type { ThemeScriptProps };\nexport default ThemeScript;\n"],"mappings":";AACA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,wBAAwB;;;ACFjC,OAAO,UAA0B;AACjC,SAAS,eAAe;AACjB,IAAM,KAAK,IAAI,YAA0B,QAAQ,KAAK,GAAG,OAAO,CAAC;;;ADWzD,SAAR,UAA2B;AAAA,EAChC,OAAO;AAAA,EACP,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,WAAW,YAAY,IAAI,SAAmB,MAAM;AACzD,UAAM,cAAwB,CAAC;AAC/B,UAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC1C,UAAI,MAAM,eAAe,KAAK,GAAG;AAC/B,cAAM,eAAe,MAAM,SAAS,QAAQ,MAAM,MAAM,QAAQ,EAAE,CAAC;AACnE,YACE,MAAM,eAAe,YAAY,KACjC,aAAa,MAAM,aACnB;AACA,sBAAY,KAAM,MAAM,MAA6B,KAAK;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AAGD,YAAU,MAAM;AACd,QAAI,aAAa,QAAW;AAC1B,UAAI,UAAU;AAEZ,cAAM,YAAsB,CAAC;AAC7B,cAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC1C,cAAI,MAAM,eAAe,KAAK,GAAG;AAC/B,sBAAU,KAAM,MAAM,MAA6B,KAAK;AAAA,UAC1D;AAAA,QACF,CAAC;AACD,qBAAa,SAAS;AAAA,MACxB,OAAO;AAEL,qBAAa,CAAC,CAAC;AAAA,MACjB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,QAAQ,CAAC;AAEvB,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,SAAS,UAAU;AACrB;AAAA,QAAa,CAAC,SACZ,KAAK,SAAS,KAAK,IAAK,cAAc,CAAC,IAAI,OAAQ,CAAC,KAAK;AAAA,MAC3D;AAAA,IACF,OAAO;AACL;AAAA,QAAa,CAAC,SACZ,KAAK,SAAS,KAAK,IACf,KAAK,OAAO,CAAC,SAAS,SAAS,KAAK,IACpC,CAAC,GAAG,MAAM,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SACE,oCAAC,SAAI,WAAsB,MAAK,UAAS,cAAW,eACjD,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU;AACvC,QAAI,MAAM,eAAe,KAAK,GAAG;AAC/B,aAAO,MAAM;AAAA,QACX;AAAA,QAIA;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC,CACH;AAEJ;AAWO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,SAAS,uCAAW,SAAS;AACnC,QAAM,WAAW,oBAAoB,KAAK;AAC1C,QAAM,YAAY,qBAAqB,KAAK;AAE5C,QAAM,SAAS,MAAM;AACnB,QAAI,CAAC,YAAY,cAAc;AAC7B,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA;AAAA,QAET;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,QACV;AAAA,MACF;AAAA;AAAA,IAEC,YAAY,MAAM,QAAQ,QAAQ,IACjC,0DACE;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,MAAK;AAAA,QACL,UAAU,WAAW,KAAK;AAAA,QAC1B,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,IAAI;AAAA,QACJ,WAAW;AAAA,UACT;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA,UAAU;AAAA,QACZ;AAAA;AAAA,MAEC,MAAM,aAAa,SAAS,CAAC,GAAyB,EAAE,OAAO,CAAC;AAAA,IACnE,GACA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,mBAAiB;AAAA,QACjB,WAAW;AAAA,UACT;AAAA;AAAA,UAEA,SACI,gEACA;AAAA,QACN;AAAA,QACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA;AAAA,MAElC,oCAAC,SAAI,WAAU,WAAS,SAAS,CAAC,CAAE;AAAA,IACtC,CACF,IAEA;AAAA,EAEJ;AAEJ;AAUO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA,cAAc,oCAAC,oBAAiB,MAAM,IAAI,WAAU,iBAAgB;AACtE,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF;AAAA;AAAA,IAEA,oCAAC,UAAK,WAAU,aAAW,QAAS;AAAA,IACpC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,SAAS,eAAe;AAAA,QAC1B;AAAA,QACA,eAAY;AAAA;AAAA,MAEX;AAAA,IACH;AAAA,EACF;AAEJ;AAMO,SAAS,iBAAiB,EAAE,SAAS,GAA0B;AACpE,SAAO,oCAAC,SAAI,WAAU,qCAAmC,QAAS;AACpE;;;AE/NA,OAAO,WAAW;AAClB,OAAOA,UAAS,kBAAkB;AAoClC,IAAM,SAAS,WAAwC,CAAC,OAAO,QAAQ;AACrE,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,EACnB,IAAI;AAEJ,QAAM,QAAQ;AAAA,IACZ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAGA,QAAM,aAAa,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAO;AAExD,QAAM,cACJ,SAAS,UAAU,MAAM,OACrB,MAAM,KAAK,WAAW,IACpB,MAAM,KAAK,YAAY,IACvB,MAAM,KACH,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,CAAC,EAC1C,KAAK,EAAE,EACP,MAAM,GAAG,CAAC,IACf;AAIN,QAAM,cAAc,UAChB;AAAA,IACE,MAAM;AAAA,IACN,UAAU,WAAW,KAAK;AAAA,IAC1B,iBAAiB,YAAY;AAAA,IAC7B,WAAW,CAAC,MAA2B;AACrC,UAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,UAAE,eAAe;AACjB,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,IACA,CAAC;AAEL,QAAM,qBAAqB,UACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA;AAEJ,SACE,gBAAAC,OAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,cAAc;AAAA,MAChB;AAAA;AAAA,IAEC,SAAS,WACR,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,WAAW;AAAA;AAAA;AAAA,UAGT;AAAA,UACA;AAAA,UACA,MAAM,IAAI;AAAA,UACV;AAAA,QACF;AAAA,QACA;AAAA;AAAA,MAEA,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAI;AAAA,UACJ,OAAO,WAAW,IAAI;AAAA,UACtB,WAAW;AAAA,YACT;AAAA,YACA,WAAW;AAAA,YACX;AAAA,UACF;AAAA,UACA,KAAM,MAAqB;AAAA,UAC3B,KAAM,MAAqB,OAAO;AAAA;AAAA,MACpC;AAAA,IACF;AAAA,IAED,SAAS,UACR,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,WAAW;AAAA;AAAA;AAAA,UAGT;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,MAAM,IAAI;AAAA,QACZ;AAAA,QACA;AAAA;AAAA,MAEE,MAAoB;AAAA,IACxB;AAAA,IAED,SAAS,UACR,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QAEJ,MAAM,UAAU,WAAW;AAAA,QAC3B,cAAa,MAAoB;AAAA,QACjC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,MAAM,IAAI;AAAA,UACV,SAAS,QAAQ;AAAA,UACjB,SAAS,QAAQ;AAAA,UACjB,SAAS,QAAQ;AAAA,QACnB;AAAA;AAAA,MAEC;AAAA,IACH;AAAA,IAED,cACC,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA;AAAA,UAEA,mBAAmB,iBACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,cACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,kBACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,eACjB,SAAS,QACT,SAAS,WACT;AAAA;AAAA,UAEF,mBAAmB,iBACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,cACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,kBACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,eACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA;AAAA,UAEF,mBAAmB,iBACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,cACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,kBACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,eACjB,SAAS,QACT,SAAS,WACT;AAAA;AAAA,UAEF,mBAAmB,iBACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,cACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,kBACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,eACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA;AAAA,UAEF,mBAAmB,iBACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,cACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,kBACjB,SAAS,QACT,SAAS,WACT;AAAA,UACF,mBAAmB,eACjB,SAAS,QACT,SAAS,WACT;AAAA;AAAA,UAEF,mBAAmB,iBACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,cACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,kBACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,UACF,mBAAmB,eACjB,SAAS,SACR,SAAS,UAAU,SAAS,WAC7B;AAAA,QACJ;AAAA;AAAA,MAEC;AAAA,IACH;AAAA,EAEJ;AAEJ,CAAC;AAED,OAAO,cAAc;AAErB,IAAO,iBAAQ;;;ACrSf,OAAOC,UAAS,cAAAC,mBAAkB;AAgBlC,IAAM,cAAcC;AAAA,EAClB,CAAC,EAAE,SAAS,OAAO,MAAM,KAAK,UAAU,GAAG,QAAQ;AACjD,UAAM,iBAAiB,MAAM,QAAQ,MAAM,GAAG,GAAG,IAAI;AACrD,UAAM,iBAAiB,MAAM,QAAQ,SAAS,MAAM;AAEpD,WACE,gBAAAC,OAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,uCAAuC,SAAS;AAAA;AAAA,MAE7D,eAAe,IAAI,CAAC,QAAQ,UAC3B,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,KAAK;AAAA;AAAA,QAEL,gBAAAA,OAAA,cAAC,kBAAQ,GAAG,QAAQ,MAAY;AAAA,MAClC,CACD;AAAA,MACA,iBAAiB,KAChB,gBAAAA,OAAA,cAAC,aACC,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAM,IAAI,cAAc;AAAA,UACxB;AAAA,UACA,SAAO;AAAA,UACP,WAAU;AAAA;AAAA,MACZ,CACF;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;AAE1B,IAAO,sBAAQ;;;ACrDf,OAAOC,YAAW;AAYlB,IAAM,WACJ;AAGF,IAAM,kBACJ;AAEF,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AACF,MAAwB;AACtB,QAAM,QAAQC,OAAM,SAAS,MAAM,QAAQ;AAE3C,QAAM,QAAQA,OAAM,SAAS,QAAQ,QAAQ,EAAE,IAAI,CAAC,OAAO,UAAU;AACnE,UAAM,SAAS,UAAU,QAAQ;AAKjC,UAAM,UACJ,UAAUA,OAAM,eAAe,KAAK,IAChCA,OAAM,aAAa,OAAkC;AAAA,MACnD,gBAAiB,MAAM,MAAc,cAAc,KAAK;AAAA,IAC1D,CAAC,IACD;AAEN,WACE,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,gBACE,UAAU,CAACA,OAAM,eAAe,KAAK,IAAI,SAAS;AAAA,QAEpD,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,SACI,gCACA,GAAG,6BAA6B,eAAe;AAAA,QACrD;AAAA;AAAA,MAEC;AAAA,MACA,CAAC,UACA,gBAAAA,OAAA,cAAC,UAAK,eAAY,QAAO,WAAU,0BAChC,SACH;AAAA,IAEJ;AAAA,EAEJ,CAAC;AAED,SACE,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MAEZ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAEA,IAAO,qBAAQ;;;AC9Ef,OAAOC,YAA4D;AAEnE,SAAS,WAAyB;AAkDlC,IAAM,YAAyC;AAAA,EAC7C,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AAAA,EACF,SACE;AAAA,EACF,SACE;AAAA,EACF,MAAM;AAAA,EACN,UACE;AAAA,EACF,WACE;AAAA,EACF,QACE;AAAA,EACF,QACE;AAAA,EACF,QACE;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QACE;AACJ;AAEA,IAAM,aACJ;AAEF,IAAM,aAA0C;AAAA,EAC9C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAM,YACJ;AAEF,IAAM,YAAyC;AAAA,EAC7C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UACE;AAAA,EACF,WACE;AAAA,EACF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAM,eAAe,OAAO,KAAK,SAAS;AAE1C,IAAM,iBAAiB;AAAA,EACrB;AAAA;AAAA,IAEE;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,QACE;AAAA,QACF,UACE;AAAA;AAAA,QAEF,MAAM;AAAA,QACN,OACE;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,QACN,SACE;AAAA,QACF,SACE;AAAA,QACF,OACE;AAAA,QACF,SACE;AAAA,QACF,SACE;AAAA,QACF,MAAM;AAAA,QACN,UACE;AAAA,QACF,WACE;AAAA,QACF,QACE;AAAA,QACF,QACE;AAAA,QACF,QACE;AAAA,QACF,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QACE;AAAA,QACF,oBACE;AAAA,QACF,oBACE;AAAA,QACF,kBACE;AAAA,QACF,oBACE;AAAA,QACF,oBACE;AAAA,QACF,iBACE;AAAA,QACF,qBACE;AAAA,QACF,sBACE;AAAA,QACF,mBACE;AAAA,QACF,mBACE;AAAA,QACF,mBACE;AAAA,QACF,iBACE;AAAA,QACF,iBACE;AAAA,QACF,mBACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA;AAAA,QAEJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA;AAAA,MAEA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA;AAAA,MAEhB,EAAE,UAAU,MAAM,MAAM,MAAM,WAAW,QAAQ;AAAA,MACjD,EAAE,UAAU,MAAM,MAAM,MAAM,WAAW,MAAM;AAAA,MAC/C,EAAE,UAAU,MAAM,MAAM,MAAM,WAAW,QAAQ;AAAA,MACjD,EAAE,UAAU,MAAM,MAAM,MAAM,WAAW,MAAM;AAAA,MAC/C,EAAE,UAAU,MAAM,MAAM,MAAM,WAAW,QAAQ;AAAA;AAAA,MAEjD,GAAG,aAAa,IAAI,CAAC,YAAY;AAAA,QAC/B,SAAS;AAAA,QACT;AAAA,QACA,WAAW,UAAU,MAAM;AAAA,MAC7B,EAAE;AAAA,MACF,GAAG,aAAa,IAAI,CAAC,YAAY;AAAA,QAC/B,SAAS;AAAA,QACT;AAAA,QACA,WAAW,GAAG,UAAU,IAAI,WAAW,MAAM,CAAC;AAAA,MAChD,EAAE;AAAA,MACF,GAAG,aAAa,IAAI,CAAC,YAAY;AAAA,QAC/B,SAAS;AAAA,QACT;AAAA,QACA,WAAW,GAAG,SAAS,IAAI,UAAU,MAAM,CAAC;AAAA,MAC9C,EAAE;AAAA,IACJ;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,IAAM,cAAc;AAGpB,IAAM,UAAU,MACd,gBAAAC,OAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,WAAU;AAAA;AAAA,EAEV,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,IAAG;AAAA,MACH,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,WAAU;AAAA;AAAA,EACZ;AAAA,EACA,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA;AAAA,EAChB;AACF;AAGF,IAAM,SAASA,OAAM;AAAA,EACnB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAGH,UAAM,cAAc,CAAC,UAAyC;AAC5D,UAAI,SAAS;AACX,cAAM,eAAe;AACrB;AAAA,MACF;AACA,yCAAU;AAAA,IACZ;AAEA,UAAM,YACJ,gBAAAA,OAAA,cAAC,UAAK,eAAY,QAAO,WAAW,eACjC,oBAAoB,gBAAAA,OAAA,cAAC,aAAQ,CAChC;AAGF,UAAM,YACJ,WAAW,oBAAoB,UAC3B,YACA,aACE,gBAAAA,OAAA,cAAC,UAAK,eAAY,QAAO,WAAW,eACjC,SACH;AAGR,UAAM,UACJ,WAAW,oBAAoB,QAC3B,YACA,WACE,gBAAAA,OAAA,cAAC,UAAK,eAAY,QAAO,WAAW,eACjC,OACH;AAGR,UAAM,kBAAkB,WAAW,oBAAoB;AAEvD,WACE,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,iBAAe,UAAU,OAAO;AAAA,QAChC,aAAW,WAAW;AAAA,QACtB;AAAA,QACA,WAAW;AAAA,UACT,aAAa;AAAA,UACb,eAAe,EAAE,QAAQ,WAAW,SAAS,MAAM,SAAS,CAAC;AAAA,UAC7D;AAAA,UACA,WAAW;AAAA,UACX,mBAAmB;AAAA,QACrB;AAAA;AAAA,MAEC,kBACC,gBAAAA,OAAA,cAAAA,OAAA,gBAEE,gBAAAA,OAAA,cAAC,UAAK,WAAU,6DACb,aAAa,gBAAAA,OAAA,cAAC,UAAK,WAAW,eAAc,SAAU,GACtD,UACA,WAAW,gBAAAA,OAAA,cAAC,UAAK,WAAW,eAAc,OAAQ,CACrD,GACA,gBAAAA,OAAA,cAAC,UAAK,WAAU,uDACb,SACH,CACF,IAEA,gBAAAA,OAAA,cAAAA,OAAA,gBACG,WACA,UACA,OACH;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;AAIrB,IAAO,iBAAQ;;;AC5Xf,OAAOC,UAAS,aAAa,aAAAC,YAAW,SAAS,QAAQ,YAAAC,iBAAgB;AACzE,SAAS,kBAAkB,yBAAyB;AA+DpD,IAAM,aAAa,CAAC,MAAY,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;AACnF,IAAM,UAAU,CAAC,GAAS,MACxB,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,IAAI,CAAC;AACzD,IAAM,YAAY,CAAC,GAAS,MAAc;AACxC,QAAM,IAAI,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,IAAI,GAAG,CAAC;AACvD,QAAM,OAAO,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,IAAI,GAAG,CAAC,EAAE,QAAQ;AACpE,SAAO,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,KAAK,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;AAC5E;AACA,IAAM,UAAU,CAAC,GAAiB,MAChC,CAAC,CAAC,KACF,CAAC,CAAC,KACF,EAAE,YAAY,MAAM,EAAE,YAAY,KAClC,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAC5B,IAAM,MAAM,CAAC,MACX,GAAG,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACzG,IAAM,aAAa,CAAC,MAAY,EAAE,YAAY,IAAI,KAAK,EAAE,SAAS;AAElE,IAAM,YACJ;AACF,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,IAAM,WAAW,CAAC,UAAyB;AACzC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,SAAS;AAAA,IACT;AAAA,IACA,cAAc,YAAY;AAAA,EAC5B,IAAI;AACJ,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,QAAQ,QAAQ,MAAM,WAAW,oBAAI,KAAK,CAAC,GAAG,CAAC,CAAC;AAGtD,QAAM,CAAC,aAAa,cAAc,IAAIC;AAAA,IACpC,SAAS,WAAa,MAAM,gBAA4C,OAAQ;AAAA,EAClF;AACA,QAAM,CAAC,YAAY,aAAa,IAAIA;AAAA,IAClC,SAAS,aAAe,MAAM,gBAAuC,CAAC,IAAK,CAAC;AAAA,EAC9E;AACA,QAAM,CAAC,YAAY,aAAa,IAAIA;AAAA,IAClC,SAAS,UACH,MAAM,gBAA8C,EAAE,OAAO,MAAM,KAAK,KAAK,IAC/E,EAAE,OAAO,MAAM,KAAK,KAAK;AAAA,EAC/B;AACA,QAAM,SAAS,SAAS,WAAY,MAAM,UAAU,SAAa,MAAM,QAAwB,cAAe;AAC9G,QAAM,QAAQ,SAAS,aAAc,MAAM,UAAU,SAAa,MAAM,QAAmB,aAAc,CAAC;AAC1G,QAAM,QACJ,SAAS,UACL,MAAM,UAAU,SACb,MAAM,QACP,aACF,EAAE,OAAO,MAAM,KAAK,KAAK;AAG/B,QAAM,SACJ,MAAM,iBACL,SAAS,WAAW,SAAS,SAAS,UAAU,MAAM,QAAQ,MAAM,CAAC,MACtE;AACF,QAAM,CAAC,YAAY,aAAa,IAAIA;AAAA,IAClC,IAAI,KAAK,OAAO,YAAY,GAAG,OAAO,SAAS,GAAG,CAAC;AAAA,EACrD;AACA,QAAM,YAAY,MAAM,QACpB,IAAI,KAAK,MAAM,MAAM,YAAY,GAAG,MAAM,MAAM,SAAS,GAAG,CAAC,IAC7D;AACJ,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAe,MAAM;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAe,WAAW,MAAM,CAAC;AAC/D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAsB,IAAI;AACpD,QAAM,cAAc,OAAO,KAAK;AAChC,QAAM,UAAU,OAAuB,IAAI;AAE3C,QAAM,UAAU;AAAA,IACd,CAAC,MAAY;AArJjB;AAsJM,YAAM,QAAQ,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,CAAC;AACvD,UAAI,CAAC,MAAM,MAAO,eAAc,KAAK;AACrC,kBAAM,kBAAN,+BAAsB;AAAA,IACxB;AAAA;AAAA,IAEA,CAAC,MAAM,OAAO,MAAM,aAAa;AAAA,EACnC;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,MAAY;AACX,YAAM,MAAM,WAAW,CAAC;AACxB,UAAI,OAAO,MAAM,WAAW,GAAG,EAAG,QAAO;AACzC,UAAI,OAAO,MAAM,WAAW,GAAG,EAAG,QAAO;AACzC,aAAO,CAAC,EAAC,iDAAiB;AAAA,IAC5B;AAAA,IACA,CAAC,KAAK,KAAK,cAAc;AAAA,EAC3B;AAEA,QAAM,SAAS,QAAQ,MAAM,IAAI,KAAK,eAAe,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;AAGjF,QAAM,SAAS,CAAC,MAAY;AA3K9B;AA4KI,QAAI,YAAY,CAAC,EAAG;AACpB,UAAM,MAAM,WAAW,CAAC;AACxB,QAAI,SAAS,UAAU;AACrB,YAAM,IAAI;AACV,UAAI,EAAE,UAAU,OAAW,gBAAe,GAAG;AAC7C,cAAE,aAAF,2BAAa;AAAA,IACf,WAAW,SAAS,YAAY;AAC9B,YAAM,IAAI;AACV,YAAM,SAAS,MAAM,KAAK,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAChD,YAAM,OAAO,SAAS,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG;AAC5E,UAAI,EAAE,UAAU,OAAW,eAAc,IAAI;AAC7C,cAAE,aAAF,2BAAa;AAAA,IACf,OAAO;AACL,YAAM,IAAI;AACV,UAAI;AACJ,UAAI,CAAC,MAAM,SAAS,MAAM,IAAK,QAAO,EAAE,OAAO,KAAK,KAAK,KAAK;AAAA;AAE5D,eACE,MAAM,MAAM,QACR,EAAE,OAAO,KAAK,KAAK,MAAM,MAAM,IAC/B,EAAE,OAAO,MAAM,OAAO,KAAK,IAAI;AACvC,UAAI,EAAE,UAAU,OAAW,eAAc,IAAI;AAC7C,cAAE,aAAF,2BAAa;AAAA,IACf;AAAA,EACF;AAGA,QAAM,YAAY,CAAC,SAAe;AAChC,gBAAY,UAAU;AACtB,UAAM,WAAW,MAAM;AACrB,YAAM,MAAM,WAAW,IAAI;AAC3B,UAAI,OAAO,MAAM,WAAW,GAAG,EAAG,QAAO,WAAW,GAAG;AACvD,UAAI,OAAO,MAAM,WAAW,GAAG,EAAG,QAAO,WAAW,GAAG;AACvD,aAAO;AAAA,IACT,GAAG;AACH,eAAW,OAAO;AAClB,UAAM,OAAO,WAAW,OAAO,IAAI,WAAW,SAAS;AACvD,QAAI,OAAO,EAAG,SAAQ,OAAO;AAAA,aACpB,QAAQ,eAAgB,SAAQ,UAAU,SAAS,EAAE,iBAAiB,EAAE,CAAC;AAAA,EACpF;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,UAAM,UAAU,QAAQ,OAAO,IAAI,eAAe,KAAK;AACvD,QAAI;AACJ,YAAQ,EAAE,KAAK;AAAA,MACb,KAAK;AAAa,eAAO,QAAQ,SAAS,EAAE;AAAG;AAAA,MAC/C,KAAK;AAAc,eAAO,QAAQ,SAAS,CAAC;AAAG;AAAA,MAC/C,KAAK;AAAW,eAAO,QAAQ,SAAS,EAAE;AAAG;AAAA,MAC7C,KAAK;AAAa,eAAO,QAAQ,SAAS,CAAC;AAAG;AAAA,MAC9C,KAAK;AAAQ,eAAO,QAAQ,SAAS,CAAC,MAAM;AAAG;AAAA,MAC/C,KAAK;AAAO,eAAO,QAAQ,SAAS,IAAI,MAAM;AAAG;AAAA,MACjD,KAAK;AAAU,eAAO,UAAU,SAAS,EAAE,WAAW,MAAM,EAAE;AAAG;AAAA,MACjE,KAAK;AAAY,eAAO,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAG;AAAA,MACjE;AAAS;AAAA,IACX;AACA,MAAE,eAAe;AACjB,cAAU,IAAI;AAAA,EAChB;AAEA,EAAAC,WAAU,MAAM;AAvOlB;AAwOI,QAAI,CAAC,YAAY,WAAW,SAAS,OAAQ;AAC7C,gBAAY,UAAU;AACtB,wBAAQ,YAAR,mBACI,cAAiC,eAAe,IAAI,OAAO,CAAC,UADhE,mBAEI;AAAA,EACN,GAAG,CAAC,SAAS,WAAW,IAAI,CAAC;AAG7B,QAAM,WAAW,QAAQ,MAAM;AAC7B,UAAM,QAAQ,IAAI,KAAK,eAAe,QAAQ,EAAE,SAAS,QAAQ,CAAC;AAClE,UAAM,OAAO,IAAI,KAAK,eAAe,QAAQ,EAAE,SAAS,OAAO,CAAC;AAChE,WAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM;AACzC,YAAM,IAAI,IAAI,KAAK,MAAM,GAAG,KAAM,IAAI,gBAAgB,CAAE;AACxD,aAAO,EAAE,OAAO,MAAM,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,EAAE;AAAA,IACpE,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,YAAY,CAAC;AACzB,QAAM,WAAW,IAAI,KAAK,eAAe,QAAQ,EAAE,OAAO,QAAQ,MAAM,UAAU,CAAC;AACnF,QAAM,WAAW,IAAI,KAAK,eAAe,QAAQ,EAAE,WAAW,OAAO,CAAC;AACtE,QAAM,gBAAgB,KAAK,MAAM,UAAU,YAAY,IAAI,EAAE,IAAI;AAGjE,QAAM,aAAa,SAAS,UAAW,MAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAS;AACpF,QAAM,KAAK,SAAS,WAAW,MAAM,SAAS,aAAc,MAAM,QAAQ,aAAa,MAAM,QAAQ,aAAc;AACnH,QAAM,KAAK,SAAS,WAAW,MAAM,SAAS,aAAc,MAAM,QAAQ,aAAa,aAAa,MAAM,QAAS;AAEnH,QAAM,aAAa,CAAC,MAClB,SAAS,WACL,QAAQ,GAAG,MAAM,IACjB,SAAS,aACP,MAAM,KAAK,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAC/B,QAAQ,GAAG,MAAM,MAAM,KAAK,KAAK,QAAQ,GAAG,EAAE;AACtD,QAAM,UAAU,CAAC,MAAY,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,MAAM,WAAW,CAAC,IAAI;AAEnF,QAAM,UAAU,CAAC,MAAY;AAC3B,UAAM,QAAQ,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,CAAC;AACvD,UAAM,UAAU,MAAM,OAAO,IAAI,eAAe,KAAK;AACrD,UAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM;AACpC,WAAO,MAAM;AAAA,MAAK,EAAE,QAAQ,EAAE;AAAA,MAAG,CAAC,GAAG,MACnC,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAACC,IAAG,MAAM,QAAQ,OAAO,IAAI,IAAI,CAAC,CAAC;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,eAAe,GAAG,CAAC,GAAG,MAAM,UAAU,WAAW,CAAC,CAAC;AAEvF,QAAM,cACJ,SAAS,SACL,mBAAmB,IACjB,SAAS,OAAO,SAAS,IACzB,GAAG,SAAS,OAAO,OAAO,CAAC,CAAC,CAAC,WAAM,SAAS,OAAO,OAAO,iBAAiB,CAAC,CAAC,CAAC,KAChF,SAAS,WACP,OAAO,UAAU,YAAY,CAAC,IAC9B,GAAG,aAAa,WAAM,gBAAgB,EAAE;AAEhD,QAAM,OAAO,SAAS,SAAS,IAAI,SAAS,WAAW,KAAK;AAE5D,SACE,gBAAAC,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA,mBAAmB,IAAI,yBAAyB;AAAA,QAChD;AAAA,MACF;AAAA;AAAA,IAEA,gBAAAA,OAAA,cAAC,SAAI,WAAU,4CACb,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,cAAY,SAAS,SAAS,mBAAmB,SAAS,WAAW,kBAAkB;AAAA,QACvF,SAAS,MAAM,QAAQ,UAAU,WAAW,CAAC,IAAI,CAAC;AAAA;AAAA,MAElD,gBAAAA,OAAA,cAAC,oBAAiB,MAAM,IAAI,eAAY,QAAO;AAAA,IACjD,GACA,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAU;AAAA,QACV,SAAS,MAAM,QAAQ,SAAS,SAAS,WAAW,SAAS,WAAW,UAAU,MAAM;AAAA,QACxF,WAAW,GAAG,8EAA8E,SAAS;AAAA;AAAA,MAEpG;AAAA,IACH,GACA,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,cAAY,SAAS,SAAS,eAAe,SAAS,WAAW,cAAc;AAAA,QAC/E,SAAS,MAAM,QAAQ,UAAU,WAAW,IAAI,CAAC;AAAA;AAAA,MAEjD,gBAAAA,OAAA,cAAC,qBAAkB,MAAM,IAAI,eAAY,QAAO;AAAA,IAClD,CACF;AAAA,IAEC,SAAS,UACR,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,cAAc,mBAAmB,IAAI,gBAAgB,aAAa;AAAA,QAChF,WAAW;AAAA,QACX,cAAc,MAAM,SAAS,IAAI;AAAA;AAAA,MAEhC,OAAO,IAAI,CAAC,MACX,gBAAAA,OAAA,cAAC,SAAI,KAAK,IAAI,CAAC,GAAG,MAAK,QAAO,cAAY,SAAS,OAAO,CAAC,KACxD,iBAAiB,KAChB,gBAAAA,OAAA,cAAC,OAAE,WAAU,wDAAsD,SAAS,OAAO,CAAC,CAAE,GAExF,gBAAAA,OAAA,cAAC,SAAI,MAAK,OAAM,WAAU,2BACvB,SAAS,IAAI,CAAC,MACb,gBAAAA,OAAA,cAAC,SAAI,KAAK,EAAE,MAAM,MAAK,gBAAe,cAAY,EAAE,MAAM,WAAU,4EACjE,EAAE,KACL,CACD,CACH,GACC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,OACrB,gBAAAA,OAAA,cAAC,SAAI,KAAK,IAAI,MAAK,OAAM,WAAU,sBAChC,KAAK,IAAI,CAAC,MAAM;AACf,cAAM,UAAU,EAAE,SAAS,MAAM,EAAE,SAAS;AAC5C,YAAI,YAAY,CAAC,mBAAmB,iBAAiB;AACnD,iBAAO,gBAAAA,OAAA,cAAC,SAAI,KAAK,IAAI,CAAC,GAAG,MAAK,YAAW,WAAU,QAAO;AAC5D,cAAM,MAAM,YAAY,CAAC;AACzB,cAAM,MAAM,WAAW,CAAC;AACxB,cAAM,MAAM,QAAQ,CAAC;AACrB,cAAM,UAAU,QAAQ,GAAG,KAAK;AAChC,eACE,gBAAAA,OAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,IAAI,CAAC;AAAA,YACV,MAAK;AAAA,YACL,iBAAe,OAAO,OAAO;AAAA,YAC7B,WAAW;AAAA,cACT;AAAA,cACA,OAAO;AAAA,cACP,SAAS,WAAW,MAAM,MAAM,CAAC,QAAQ,IAAI,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK;AAAA,cACtE,SAAS,WAAW,MAAM,MAAM,CAAC,QAAQ,IAAI,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK;AAAA,YACxE;AAAA;AAAA,UAEA,gBAAAA,OAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAW,IAAI,CAAC;AAAA,cAChB,UAAU,QAAQ,GAAG,OAAO,IAAI,IAAI;AAAA,cACpC,UAAU;AAAA,cACV,cAAY,SAAS,OAAO,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,iBAAiB;AAAA,cACxE,gBAAc,UAAU,SAAS;AAAA,cACjC,SAAS,MAAM;AACb,2BAAW,WAAW,CAAC,CAAC;AACxB,uBAAO,CAAC;AAAA,cACV;AAAA,cACA,cAAc,MAAM,SAAS,WAAW,CAAC,CAAC;AAAA,cAC1C,SAAS,MAAM;AACb,oBAAI,CAAC,QAAQ,GAAG,OAAO,EAAG,YAAW,WAAW,CAAC,CAAC;AAAA,cACpD;AAAA,cACA,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,MACI,iEACA,UACE,oCACA;AAAA,gBACN,CAAC,OAAO,WAAW;AAAA,gBACnB,OAAO;AAAA,cACT;AAAA;AAAA,YAEC,EAAE,QAAQ;AAAA,YACV,OAAO,IAAI,IAAI,CAAC,CAAC,KAChB,gBAAAA,OAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAW;AAAA,kBACT;AAAA,kBACA,MAAM,aAAa;AAAA,gBACrB;AAAA;AAAA,YACF;AAAA,UAEJ;AAAA,QACF;AAAA,MAEJ,CAAC,CACH,CACD,CACH,CACD;AAAA,IACH;AAAA,IAGD,SAAS,YACR,gBAAAA,OAAA,cAAC,SAAI,WAAU,4BACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM;AACpC,YAAM,QAAQ,IAAI,KAAK,eAAe,QAAQ,EAAE,OAAO,QAAQ,CAAC,EAAE,OAAO,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC;AAC7F,YAAM,QAAQ,IAAI,KAAK,UAAU,YAAY,GAAG,GAAG,CAAC;AACpD,YAAM,OAAO,IAAI,KAAK,UAAU,YAAY,GAAG,IAAI,GAAG,CAAC;AACvD,YAAM,MAAO,CAAC,CAAC,OAAO,OAAO,WAAW,GAAG,KAAO,CAAC,CAAC,OAAO,QAAQ,WAAW,GAAG;AACjF,YAAM,UAAU,MAAM,UAAU,SAAS;AACzC,aACE,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,UAAU;AAAA,UACV,SAAS,MAAM;AACb,oBAAQ,KAAK;AACb,uBAAW,IAAI,KAAK,MAAM,YAAY,GAAG,GAAG,KAAK,IAAI,QAAQ,QAAQ,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;AACxF,oBAAQ,MAAM;AAAA,UAChB;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,UAAU,4CAA4C;AAAA,YACtD,OAAO;AAAA,UACT;AAAA;AAAA,QAEC;AAAA,MACH;AAAA,IAEJ,CAAC,CACH;AAAA,IAGD,SAAS,WACR,gBAAAA,OAAA,cAAC,SAAI,WAAU,4BACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM;AACpC,YAAM,IAAI,gBAAgB;AAC1B,YAAM,MAAO,CAAC,CAAC,OAAO,IAAI,IAAI,YAAY,KAAO,CAAC,CAAC,OAAO,IAAI,IAAI,YAAY;AAC9E,aACE,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,UAAU;AAAA,UACV,SAAS,MAAM;AACb,oBAAQ,IAAI,KAAK,GAAG,UAAU,SAAS,GAAG,CAAC,CAAC;AAC5C,oBAAQ,QAAQ;AAAA,UAClB;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,MAAM,UAAU,YAAY,IAAI,4CAA4C;AAAA,YAC5E,OAAO;AAAA,UACT;AAAA;AAAA,QAEC;AAAA,MACH;AAAA,IAEJ,CAAC,CACH;AAAA,EAEJ;AAEJ;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;AC/df,SAAS,OAAAC,YAA8B;AACvC,OAAOC,YAA0B;AAGjC,IAAM,kBAAkBC;AAAA;AAAA;AAAA,EAGtB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA;AAAA;AAAA,MAGhB;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AACF;AASA,IAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAC,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,QACT,gBAAgB,EAAE,SAAS,QAAQ,KAAK,CAAC;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAGA,gBAAAA,OAAA,cAAC,SAAI,WAAU,qCACZ,aACC,gBAAAA,OAAA,cAAC,UAAK,eAAY,QAAO,WAAU,0BAChC,SACH,GAED,QACH;AAAA,IAEC,WAAW,gBAAAA,OAAA,cAAC,UAAK,WAAU,0BAAwB,OAAQ;AAAA,EAC9D;AAEJ;AAEA,IAAO,kBAAQ;;;ACtIf,OAAOC,YAAW;AAwCH,SAAR,KAAsB,EAAE,UAAU,WAAW,GAAG,MAAM,GAAc;AACzE,SACE,gBAAAC,OAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA;AAAA,QAET;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAEO,IAAM,aAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AAGJ,SACE,gBAAAA,OAAA,cAAC,SAAK,GAAG,OAAO,WAAW,GAAG,kBAAkB,SAAS,KACtD,QACH;AAEJ;AAEO,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAEO,IAAM,kBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AAGJ,SACE,gBAAAA,OAAA,cAAC,OAAG,GAAG,OAAO,WAAW,GAAG,mCAAmC,SAAS,KACrE,QACH;AAEJ;AAEO,IAAM,aAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE,gBAAAA,OAAA,cAAC,SAAK,GAAG,OAAO,WAAW,GAAG,QAAQ,SAAS,KAC5C,QACH;AAEJ;AAEO,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE,gBAAAA,OAAA,cAAC,SAAK,GAAG,OAAO,WAAW,GAAG,kBAAkB,SAAS,KACtD,QACH;AAEJ;AAEO,IAAM,aAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE,gBAAAA,OAAA,cAAC,SAAK,GAAG,OAAO,WAAW,GAAG,kBAAkB,SAAS,KACtD,QACH;AAEJ;;;ACvIA,OAAOC,UAAS,cAAAC,mBAAkB;AAElC,SAAS,OAAAC,YAAyB;AAUlC,IAAM,gBAAgB;AAAA,EACpB,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AAAA,EACF,SACE;AAAA,EACF,SACE;AAAA,EACF,MAAM;AAAA,EACN,UACE;AAAA,EACF,WACE;AAAA,EACF,QACE;AAAA,EACF,QACE;AAAA,EACF,QACE;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QACE;AACJ;AAEA,IAAM,kBAAkBA;AAAA,EACtB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA;AAAA,MAER,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA;AAAA,MAEA,QAAQ;AAAA,IACV;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAGA,IAAM,gBAAgB;AAAA,EACpB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AASA,IAAM,WAAWC;AAAA,EACf,CAAC,EAAE,MAAM,QAAQ,WAAW,SAAS,GAAG,MAAM,GAAG,QAAQ;AACvD,WACE,gBAAAC,OAAA,cAAC,SAAI,WAAU,uCACb,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACJ,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC3C,GAAG;AAAA,QACJ,WAAW,GAAG,QAAQ,gBAAgB,EAAE,MAAM,QAAQ,UAAU,CAAC,CAAC;AAAA;AAAA,IACpE,GACA,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAW;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,WAAW,cAAc,QAAQ,IAAI;AAAA,UACrC,SAAQ;AAAA,UACR,MAAK;AAAA;AAAA,QAEL,gBAAAA,OAAA;AAAA,UAAC;AAAA;AAAA,YACC,UAAS;AAAA,YACT,GAAE;AAAA,YACF,UAAS;AAAA;AAAA,QACX;AAAA,MACF;AAAA,IACF,CACF;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;AC7Hf,OAAOC,aAA0C;AAEjD,SAAS,OAAAC,YAAyB;AAoClC,IAAM,QAGF;AAAA,EACF,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AACF;AAEA,IAAM,UAAU,OAAO,KAAK,KAAK;AAEjC,IAAM,eAAeA;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA;AAAA,MAER,SAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA,MAChB,GAAG,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC1B,SAAS;AAAA,QACT;AAAA,QACA,WAAW,MAAM,MAAM,EAAE;AAAA,MAC3B,EAAE;AAAA,MACF,GAAG,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC1B,SAAS;AAAA,QACT;AAAA,QACA,WAAW,MAAM,MAAM,EAAE;AAAA,MAC3B,EAAE;AAAA,MACF,GAAG,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC1B,SAAS;AAAA,QACT;AAAA,QACA,WAAW,MAAM,MAAM,EAAE;AAAA,MAC3B,EAAE;AAAA,IACJ;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,IAAM,mBAA2C;AAAA,EAC/C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAMC,eAAc;AAEpB,IAAM,OAAO,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAiB;AACf,QAAM,iBAAiB,UAAU;AAIjC,QAAM,aACJ,YAAY,UACR,gBACA,iBAAiB,cAAc,KAAK;AAE1C,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT,aAAa,EAAE,QAAQ,gBAAgB,MAAM,QAAQ,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEH,aACC,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAWD,gBACjC,SACH;AAAA,IAGD,CAAC,aAAa,OACb,gBAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAW;AAAA,UACT;AAAA,UACA,SAAS,OAAO,YAAY;AAAA,UAC5B,YAAY;AAAA,QACd;AAAA;AAAA,IACF;AAAA,IAGD;AAAA,IAEA,WACC,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAWD,gBACjC,OACH;AAAA,EAEJ;AAEJ;AAEA,IAAO,eAAQ;;;AC5Pf,OAAOE,aAAW;AAUlB,IAAM,sBAAsB,CAAC;AAAA,EAC3B;AAAA,EACA,OAAO;AAAA,EACP,cAAc;AAAA,EACd;AAAA,EACA;AACF,MAAgC;AAC9B,QAAM,UAAU,OAAO,eAAe;AACtC,QAAM,UAAU,OAAO,IAAI,IAAI,IAAI;AACnC,QAAM,YAAY,SAAS,KAAK,KAAK;AACrC,QAAM,aAAa,YAAa,aAAa,cAAc,KAAM;AAEjE,SACE,gBAAAA,QAAA,cAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,WAC9B,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,IAAI,OAAO;AAAA,MACX,IAAI,OAAO;AAAA,MACX,GAAG;AAAA,MACH,aAAa,GAAG,WAAW;AAAA;AAAA,EAC7B,GACA,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,IAAI,OAAO;AAAA,MACX,IAAI,OAAO;AAAA,MACX,GAAG;AAAA,MACH,eAAc;AAAA,MACd,aAAa,GAAG,WAAW;AAAA,MAC3B,WAAW,cAAc,OAAO,CAAC,IAAI,OAAO,CAAC;AAAA,MAC7C,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,kBAAkB;AAAA,MACpB;AAAA;AAAA,EACF,GACA,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,IAAG;AAAA,MACH,YAAW;AAAA,MACX,MAAK;AAAA,MACL,WAAW,GAAG,aAAa;AAAA;AAAA,IAE1B;AAAA,EACH,CACF;AAEJ;AAEA,IAAO,2BAAQ;;;AC1Df,OAAOC;AAAA,EACL,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAGK;AACP,SAAS,oBAAAC,mBAAkB,aAAa,qBAAqB;;;ACZ7D,OAAOC,WAA8B,cAAAC,mBAAkB;AAuBvD,IAAMC,eAAc;AAEpB,IAAM,QAAQC;AAAA,EACZ,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE,gBAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA;AAAA,UAET;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA,SAAS,OACL,mBACA,SAAS,OACP,mBACA;AAAA,UACN,SACE;AAAA,UACF;AAAA,QACF;AAAA;AAAA,MAEC,aACC,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAW;AAAA,YACTF;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY;AAAA,YACZ,SAAS;AAAA,UACX;AAAA;AAAA,QAEC;AAAA,MACH;AAAA,MAEF,gBAAAE,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,gBAAc,SAAS;AAAA,UACtB,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAY;AAAA,UACZ,oBAAkB;AAAA,UAClB,iBAAe;AAAA,UACf,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACC,WACC,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAW;AAAA,YACTF;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY;AAAA,UACd;AAAA;AAAA,QAEC;AAAA,MACH;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;AAEpB,IAAO,gBAAQ;;;ADzFf,IAAM,SAAS,CAAC,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AACnE,IAAM,sBAAsB,OAAO,QAAQ,GAAG;AAE9C,IAAM,UAAU;AAAA,EACd,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAClI;AACF;AAKA,IAAM,eAAe,OAAO,KAAK,OAAO;AAuCxC,IAAM,SAAS;AACf,IAAM,kBAAkB;AAGxB,IAAM,eAAe,CAAC,UAAoD;AACxE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,MAAM;AACvC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,MAAM,CAAC,EAAE,YAAY;AAC/B,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IACH,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE;AAAA,EACZ;AACA,SAAO,IAAI,GAAG;AAChB;AAGA,IAAM,aAAa,CAAC,QAAgB;AAClC,QAAM,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE;AACnC,QAAM,IAAK,KAAK,KAAM;AACtB,QAAM,IAAK,KAAK,IAAK;AACrB,QAAM,IAAI,IAAI;AACd,SAAO,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,MAAM,YAAY;AAC/D;AAIA,IAAM,QAAQ,CAAC,QAAqB,UAAsB,GAAG,MAAM,IAAI,KAAK;AAO5E,IAAM,iBAAiB,CAAC,YAAsC;AAC5D,QAAM,SAAS,iBAAiB,OAAO;AACvC,QAAM,MAAuB,CAAC;AAC9B,aAAW,UAAU,cAAc;AACjC,UAAM,MAAM,QAAQ,MAAM;AAC1B,WAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,YAAM,UAAU,IAAI,SAChB,aAAa,OAAO,iBAAiB,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC,IAC5D;AACJ,UAAI,MAAM,QAAQ,KAAK,CAAC,IAAI,WAAW,IAAI,OAAO,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,IAAM,YAAY,CAChB,KACA,SACA,aACiC;AACjC,MAAI,CAAC,OAAO,CAAC,QAAS,QAAO;AAC7B,aAAW,UAAU,UAAU;AAC7B,eAAW,SAAS,QAAQ;AAC1B,UAAI,QAAQ,MAAM,QAAQ,KAAK,CAAC,MAAM,IAAK,QAAO,EAAE,QAAQ,MAAM;AAAA,IACpE;AAAA,EACF;AACA,SAAO;AACT;AAGA,IAAMG,aACJ;AAMF,IAAM,cAAcC;AAAA,EAClB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,SAAS,MAAM,EAAE,QAAQ,MAAM,EAAE;AAEvC,UAAM,SAAS,MAAM,gBAAgB,MAAM;AAC3C,UAAM,UAAU,GAAG,MAAM;AAEzB,UAAM,aAAaC,SAAQ,MAAM;AAC/B,YAAM,UAAU,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,KAAK,OAAO;AAC1D,aAAO,OAAO,SAAS,IAAI,SAAS;AAAA,IAGtC,GAAG,CAAC,qCAAU,KAAK,IAAI,CAAC;AAExB,UAAM,eAAe,UAAU;AAC/B,UAAM,CAAC,eAAe,gBAAgB,IAAIC;AAAA,MACxC;AAAA,IACF;AACA,UAAM,aAAa,aAAa,eAAe,QAAQ,aAAa;AAEpE,UAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,CAAC,cAAc,eAAe,IAAIA;AAAA,MACtC,WAAW,CAAC;AAAA,IACd;AACA,UAAM,cAAc,WAAW,SAAS,YAAY,IAChD,eACA,WAAW,CAAC;AAGhB,UAAM,CAAC,SAAS,UAAU,IAAIA,UAAiC,IAAI;AAEnE,UAAM,UAAUC,QAAuB,IAAI;AAC3C,UAAM,aAAaA,QAAiC,IAAI;AACxD,UAAM,gBAAgBC;AAAA,MACpB,CAAC,SAAmC;AAClC,mBAAW,UAAU;AACrB,YAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,iBAC9B;AACP,UAAC,IAAyD,UACxD;AAAA,MACN;AAAA,MACA,CAAC,GAAG;AAAA,IACN;AAGA,UAAM,CAAC,OAAO,QAAQ,IAAIF,UAAS,cAAc,EAAE;AACnD,IAAAG,WAAU,MAAM;AACd,eAAS,cAAc,EAAE;AAAA,IAC3B,GAAG,CAAC,UAAU,CAAC;AACf,UAAM,eAAe,MAAM,KAAK,MAAM,MAAM,aAAa,KAAK,MAAM;AAGpE,IAAAA,WAAU,MAAM;AACd,UAAI,CAAC,UAAU,CAAC,QAAQ,QAAS;AACjC,YAAM,WAAW,eAAe,QAAQ,OAAO;AAC/C,iBAAW,QAAQ;AACnB,YAAM,QAAQ,UAAU,YAAY,UAAU,UAAU;AACxD,UAAI,MAAO,iBAAgB,MAAM,MAAM;AAAA,IAGzC,GAAG,CAAC,MAAM,CAAC;AAGX,IAAAA,WAAU,MAAM;AACd,UAAI,CAAC,OAAQ;AACb,YAAM,UAAU,CAAC,UAAiB;AAChC,YACE,QAAQ,WACR,CAAC,QAAQ,QAAQ,SAAS,MAAM,MAAc,GAC9C;AACA,kBAAQ,KAAK;AAAA,QACf;AAAA,MACF;AACA,eAAS,iBAAiB,eAAe,OAAO;AAChD,eAAS,iBAAiB,WAAW,OAAO;AAC5C,aAAO,MAAM;AACX,iBAAS,oBAAoB,eAAe,OAAO;AACnD,iBAAS,oBAAoB,WAAW,OAAO;AAAA,MACjD;AAAA,IACF,GAAG,CAAC,MAAM,CAAC;AAEX,UAAM,SAAS,CAAC,KAAa,UAA6B;AACxD,UAAI,CAAC,aAAc,kBAAiB,GAAG;AACvC,2CAAW,KAAK,SAAS,UAAU,KAAK,SAAS,YAAY;AAAA,IAC/D;AAEA,UAAM,aAAa,CAAC,QAAqB,UAAsB;AAE7D,YAAM,OAAO,QAAQ,UAAU,eAAe,QAAQ,OAAO,IAAI;AACjE,YAAM,MAAM,6BAAO,MAAM,QAAQ,KAAK;AACtC,UAAI,CAAC,IAAK;AACV,iBAAW,IAAI;AACf,aAAO,KAAK,EAAE,QAAQ,MAAM,CAAC;AAAA,IAC/B;AAEA,UAAM,oBAAoB,CAAC,SAAiB;AAC1C,eAAS,IAAI;AAEb,UAAI,gBAAgB,KAAK,KAAK,KAAK,CAAC,GAAG;AACrC,cAAM,MAAM,aAAa,IAAI;AAC7B,YAAI,OAAO,QAAQ,WAAY,QAAO,GAAG;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM;AAC9B,YAAM,MAAM,aAAa,KAAK;AAC9B,UAAI,KAAK;AACP,YAAI,QAAQ,WAAY,QAAO,GAAG;AAClC,iBAAS,GAAG;AAAA,MACd,OAAO;AACL,iBAAS,cAAc,EAAE;AAAA,MAC3B;AAAA,IACF;AAGA,UAAM,kBAAkB,CAAC,UAAyC;AAChE,YAAM,OAAO;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,KAAK,SAAS,MAAM,GAAG,EAAG;AAC/B,YAAM,QAAQ,MAAM;AAAA,QAClB,MAAM,cAAc;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,QAAQ,SAAS,aAAkC;AACvE,UAAI,QAAQ,EAAG;AACf,YAAM,eAAe;AACrB,UAAI,OAAO;AACX,UAAI,MAAM,QAAQ,OAAQ,QAAO;AAAA,eACxB,MAAM,QAAQ,MAAO,QAAO,MAAM,SAAS;AAAA,eAC3C,MAAM,QAAQ,gBAAgB,MAAM,QAAQ;AACnD,gBAAQ,QAAQ,KAAK,MAAM;AAAA,UACxB,SAAQ,QAAQ,IAAI,MAAM,UAAU,MAAM;AAC/C,YAAM,IAAI,EAAE,MAAM;AAClB,YAAM,IAAI,EAAE,MAAM;AAAA,IACpB;AAEA,UAAM,WAAW,CAAC,QAAqB,UAAsB;AAC3D,YAAM,OAAO,mCAAU,MAAM,QAAQ,KAAK;AAC1C,UAAI,KAAM,QAAO;AACjB,YAAM,WAAW,QAAQ,MAAM,EAAE,OAAO,OAAO,QAAQ,KAAK,CAAC;AAC7D,aAAO,QAAQ,MAAM,EAAE,SACnB,SAAS,MAAM,IAAI,KAAK,KAAK,QAAQ,MACrC;AAAA,IACN;AAEA,UAAM,gBAAgB,SAClB,UAAU,YAAY,SAAS,UAAU,IACzC;AACJ,UAAM,YAAY,QAAQ,WAAW;AACrC,UAAM,gBACJ,+CAAe,YAAW,cAAc,cAAc,QAAQ,OAAO,CAAC;AAExE,WACE,gBAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,KAAK;AAAA,QAGL,WAAW,CAAC,MAAM;AArZ1B;AAsZU,sBAAM,cAAN,+BAAkB;AAClB,cAAI,EAAE,QAAQ,YAAY,QAAQ;AAChC,cAAE,gBAAgB;AAClB,oBAAQ,KAAK;AACb,6BAAW,YAAX,mBAAoB;AAAA,UACtB;AAAA,QACF;AAAA,QACA,WAAW,GAAG,mBAAmB,SAAS;AAAA;AAAA,MAE1C,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,IAAI;AAAA,UACJ,MAAK;AAAA,UACL;AAAA,UACA,iBAAc;AAAA,UACd,iBAAe;AAAA,UACf,iBAAe,SAAS,UAAU;AAAA,UAClC,cAAY;AAAA,UACZ,mBAAiB;AAAA,UACjB,oBAAkB;AAAA,UAClB,SAAS,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI;AAAA,UACtC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACAP;AAAA,YACA,SACI,uFACA;AAAA,YACJ,SACE;AAAA,YACF,SAAS,UAAU;AAAA,YACnB,YACE;AAAA,UACJ;AAAA;AAAA,QAEA,gBAAAO,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAW;AAAA,cACT;AAAA,cACA,CAAC,cAAc;AAAA,YACjB;AAAA,YACA,OAAO,aAAa,EAAE,iBAAiB,WAAW,IAAI;AAAA;AAAA,QACxD;AAAA,QACA,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,aAAa,4BAA4B;AAAA,YAC3C;AAAA;AAAA,UAEC,cAAc;AAAA,QACjB;AAAA,QACA,gBAAAA,QAAA;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,MAAM;AAAA,YACN,WAAW;AAAA,cACT;AAAA,cACA,UAAU;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,MACF;AAAA,MAEC,QAAQ,gBAAAD,QAAA,cAAC,WAAM,MAAK,UAAS,MAAY,OAAO,cAAc,IAAI;AAAA,MAElE,UACC,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,cAAc,QAAQ,qBAAqB;AAAA,UAC7C;AAAA;AAAA,QAGA,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,WAAW;AAAA,YACX,WAAU;AAAA;AAAA,UAET,WAAW,IAAI,CAAC,WAAW;AAC1B,kBAAM,UAAU,WAAW;AAC3B,mBACE,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,gBAAc;AAAA,gBACd,cAAY,QAAQ,MAAM,EAAE;AAAA,gBAC5B,OAAO,QAAQ,MAAM,EAAE;AAAA,gBACvB,UAAU,UAAU,IAAI;AAAA,gBACxB,SAAS,MAAM,gBAAgB,MAAM;AAAA,gBACrC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,WAAW;AAAA,gBACb;AAAA;AAAA,cAEA,gBAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,iBAAiB;AAAA,sBACf;AAAA,sBACA,OAAO,mBAAmB;AAAA,oBAC5B;AAAA,kBACF;AAAA;AAAA,cACF;AAAA,YACF;AAAA,UAEJ,CAAC;AAAA,QACH;AAAA,QAGA,gBAAAA,QAAA,cAAC,SAAI,WAAU,yDACb,gBAAAA,QAAA,cAAC,UAAK,WAAU,iCACb,UAAU,KACb,GACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,iBAAgB,aAAU,YACvC,gBACG,GAAG,QAAQ,cAAc,MAAM,EAAE,KAAK,IAAI,cAAc,KAAK,KAC7D,EACN,CACF;AAAA,QACA,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,GAAG,UAAU,KAAK;AAAA,YAC9B,WAAW;AAAA,YACX,WAAU;AAAA;AAAA,UAET,OAAO,IAAI,CAAC,UAAU;AACrB,kBAAM,OACJ,mCAAU,MAAM,aAAa,KAAK,OAClC,UAAU,OAAO,OAAO,QAAQ,KAAK,CAAC;AACxC,kBAAM,UAAU,eAAe;AAC/B,mBACE,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,gBAAc;AAAA,gBACd,cAAY,GAAG,UAAU,KAAK,IAAI,KAAK;AAAA,gBACvC,OAAO,GAAG,UAAU,KAAK,IAAI,KAAK,SAAM,GAAG;AAAA,gBAC3C,UAAU,UAAU,eAAe,IAAI;AAAA,gBACvC,SAAS,MAAM,WAAW,aAAa,KAAK;AAAA,gBAC5C,OAAO,EAAE,iBAAiB,SAAS,aAAa,KAAK,EAAE;AAAA,gBACvD,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,WAAW;AAAA,gBACb;AAAA;AAAA,cAEC,WACC,gBAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,MAAM;AAAA,kBACN,OAAO,EAAE,OAAO,WAAW,GAAG,EAAE;AAAA;AAAA,cAClC;AAAA,YAEJ;AAAA,UAEJ,CAAC;AAAA,QACH;AAAA,QAGC,mBACC,gBAAAA,QAAA,cAAC,SAAI,WAAU,gEACb,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,aAAY;AAAA,YACZ,YAAY;AAAA,YACZ,cAAa;AAAA,YACb,cAAW;AAAA,YACX,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA,YAEjD,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO;AAAA,YACvC,QAAQ;AAAA,YACR,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,SAAS;AACrB,kBAAE,eAAe;AACjB,kCAAkB;AAAA,cACpB;AAAA,YACF;AAAA,YACA,WAAU;AAAA;AAAA,QACZ,GACA,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA;AAAA,UAEA,gBAAAA,QAAA,cAAC,iBAAc,eAAY,QAAO,MAAM,IAAI;AAAA,UAC5C,gBAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,OAAO,cAAc;AAAA,cACrB,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,MAAM,YAAY,CAAC;AAAA,cACpD,WAAU;AAAA;AAAA,UACZ;AAAA,QACF,CACF;AAAA,MAEJ;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;AAK1B,IAAO,sBAAQ;;;AEvnBf,OAAOE;AAAA,EACL,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP;AAAA,EACE,oBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA4EP,IAAMC,cAAa,CAAC,MAClB,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;AAErD,IAAMC,WAAU,CAAC,GAAS,MACxB,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,IAAI,CAAC;AAGzD,IAAMC,aAAY,CAAC,GAAS,MAAc;AACxC,QAAM,SAAS,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,IAAI,GAAG,CAAC;AAC5D,QAAM,OAAO,IAAI,KAAK,OAAO,YAAY,GAAG,OAAO,SAAS,IAAI,GAAG,CAAC,EAAE,QAAQ;AAC9E,SAAO,IAAI;AAAA,IACT,OAAO,YAAY;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,KAAK,IAAI,EAAE,QAAQ,GAAG,IAAI;AAAA,EAC5B;AACF;AAEA,IAAM,YAAY,CAAC,GAAiB,MAClC,CAAC,CAAC,KACF,CAAC,CAAC,KACF,EAAE,YAAY,MAAM,EAAE,YAAY,KAClC,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAE5B,IAAM,SAAS,CAAC,MACd,GAAG,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI;AAAA,EACjE,EAAE,QAAQ;AACZ,EAAE,SAAS,GAAG,GAAG,CAAC;AAEpB,IAAM,YAAY,CAAC,GAAS,KAAY,QAAe;AACrD,QAAM,MAAMF,YAAW,CAAC;AACxB,MAAI,OAAO,MAAMA,YAAW,GAAG,EAAG,QAAOA,YAAW,GAAG;AACvD,MAAI,OAAO,MAAMA,YAAW,GAAG,EAAG,QAAOA,YAAW,GAAG;AACvD,SAAO;AACT;AAMA,IAAMG,aACJ;AAEF,IAAMC,aAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACAD;AACF;AAEA,IAAM,aACJ,iMACAA;AAQF,IAAM,aAAa,CAAC,UAA2B;AAC7C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,SAAS;AAAA,IACT,gBAAgB,EAAE,KAAK,WAAW,OAAO,SAAS,MAAM,UAAU;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,oBAAoB;AAAA,EACtB,IAAI;AAEJ,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,UAAU,UAAW,MAA+B,UAAU;AACpE,QAAM,UAAUE,OAAM;AACtB,QAAM,YAAY,MAAM,cAAc,OAAO;AAC7C,QAAM,WAAW,GAAG,SAAS;AAG7B,QAAM,CAAC,aAAa,cAAc,IAAIC;AAAA,IACpC,CAAC,UAAY,MAAM,gBAA4C,OAAQ;AAAA,EACzE;AACA,QAAM,CAAC,YAAY,aAAa,IAAIA;AAAA,IAClC,UACM,MAAM,gBAA0C;AAAA,MAChD,OAAO;AAAA,MACP,KAAK;AAAA,IACP,IACA,EAAE,OAAO,MAAM,KAAK,KAAK;AAAA,EAC/B;AAEA,QAAM,SAAsB,CAAC,UACzB,MAAM,UAAU,SACb,MAAM,QACP,cACF;AACJ,QAAM,QAAmB,UACrB,MAAM,UAAU,SACb,MAAM,QACP,aACF,EAAE,OAAO,MAAM,KAAK,KAAK;AAE7B,QAAM,WAAW,UAAU,CAAC,EAAE,MAAM,SAAS,MAAM,OAAO,CAAC,CAAC;AAG5D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAe,MAAM;AAC7C,QAAM,QAAQC,SAAQ,MAAMP,YAAW,oBAAI,KAAK,CAAC,GAAG,CAAC,CAAC;AACtD,QAAM,eAAeQ;AAAA,IACnB,MACE;AAAA,OACG,UAAU,MAAM,QAAQ,WAAW;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAEF,CAAC,SAAS,MAAM,OAAO,QAAQ,OAAO,KAAK,GAAG;AAAA,EAChD;AACA,QAAM,CAAC,SAAS,UAAU,IAAIF,UAAe,YAAY;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAsB,IAAI;AACpD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAElD,QAAM,UAAUG,QAAuB,IAAI;AAC3C,QAAM,aAAaA,QAA0B,IAAI;AACjD,QAAM,UAAUA,QAAuB,IAAI;AAC3C,QAAM,iBAAiBA,QAAO,KAAK;AAEnC,QAAM,cAAcD;AAAA,IAClB,CAAC,MAAY;AACX,YAAM,MAAMR,YAAW,CAAC;AACxB,UAAI,OAAO,MAAMA,YAAW,GAAG,EAAG,QAAO;AACzC,UAAI,OAAO,MAAMA,YAAW,GAAG,EAAG,QAAO;AACzC,aAAO,CAAC,EAAC,iDAAiB;AAAA,IAC5B;AAAA,IACA,CAAC,KAAK,KAAK,cAAc;AAAA,EAC3B;AAEA,QAAM,QAAQQ,aAAY,CAAC,cAAc,SAAS;AA7OpD;AA8OI,YAAQ,KAAK;AACb,aAAS,IAAI;AACb,kBAAc,KAAK;AACnB,QAAI,YAAa,kBAAW,YAAX,mBAAoB;AAAA,EACvC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,MAAM;AACvB,QAAI,SAAU;AACd,eAAW,aAAa,CAAC;AACzB,YAAQ,MAAM;AACd,mBAAe,UAAU;AACzB,YAAQ,IAAI;AAAA,EACd;AAGA,EAAAE,WAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,CAAC,MAAkB;AA/PtC;AAgQM,UAAI,GAAC,aAAQ,YAAR,mBAAiB,SAAS,EAAE,SAAiB,OAAM,KAAK;AAAA,IAC/D;AACA,aAAS,iBAAiB,aAAa,MAAM;AAC7C,WAAO,MAAM,SAAS,oBAAoB,aAAa,MAAM;AAAA,EAC/D,GAAG,CAAC,MAAM,KAAK,CAAC;AAGhB,EAAAA,WAAU,MAAM;AAvQlB;AAwQI,QAAI,CAAC,QAAQ,SAAS,UAAU,CAAC,eAAe,QAAS;AACzD,mBAAe,UAAU;AACzB,wBAAQ,YAAR,mBACI,cAAiC,eAAe,OAAO,OAAO,CAAC,UADnE,mBAEI;AAAA,EACN,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC;AAGxB,QAAM,eAAe,CAAC,MAAmB;AAhR3C;AAiRI,QAAI,MAAM,UAAU,OAAW,gBAAe,CAAC;AAC/C,KAAC,WAAgC,aAAhC,+BAA2C;AAAA,EAC9C;AACA,QAAM,cAAc,CAAC,MAAiB;AApRxC;AAqRI,QAAI,MAAM,UAAU,OAAW,eAAc,CAAC;AAC9C,KAAC,WAA+B,aAA/B,+BAA0C;AAAA,EAC7C;AAEA,QAAM,YAAY,CAAC,MAAY;AAC7B,QAAI,YAAY,CAAC,EAAG;AACpB,UAAM,MAAMV,YAAW,CAAC;AACxB,QAAI,CAAC,SAAS;AACZ,mBAAa,GAAG;AAChB,YAAM;AACN;AAAA,IACF;AACA,QAAI,CAAC,cAAc,CAAC,MAAM,OAAO;AAC/B,kBAAY,EAAE,OAAO,KAAK,KAAK,KAAK,CAAC;AACrC,oBAAc,IAAI;AAClB;AAAA,IACF;AACA,UAAM,CAAC,OAAO,GAAG,IACf,MAAM,MAAM,QAAQ,CAAC,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,OAAO,GAAG;AAC5D,gBAAY,EAAE,OAAO,IAAI,CAAC;AAC1B,UAAM;AAAA,EACR;AAEA,QAAM,QAAQ,MAAM;AA5StB;AA6SI,QAAI,QAAS,aAAY,EAAE,OAAO,MAAM,KAAK,KAAK,CAAC;AAAA,QAC9C,cAAa,IAAI;AACtB,kBAAc,KAAK;AACnB,qBAAW,YAAX,mBAAoB;AAAA,EACtB;AAGA,QAAM,aAAa,IAAI,KAAK,QAAQ,YAAY,GAAG,QAAQ,SAAS,GAAG,CAAC;AAExE,QAAM,WAAWO,SAAQ,MAAM;AAC7B,UAAMI,OAAM,IAAI,KAAK,eAAe,QAAQ,EAAE,SAAS,QAAQ,CAAC;AAChE,UAAM,OAAO,IAAI,KAAK,eAAe,QAAQ,EAAE,SAAS,OAAO,CAAC;AAEhE,WAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM;AACzC,YAAM,IAAI,IAAI,KAAK,MAAM,GAAG,KAAM,IAAI,gBAAgB,CAAE;AACxD,aAAO,EAAE,OAAOA,KAAI,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,EAAE;AAAA,IAClE,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,YAAY,CAAC;AAEzB,QAAM,QAAQJ,SAAQ,MAAM;AAC1B,UAAM,UAAU,WAAW,OAAO,IAAI,eAAe,KAAK;AAC1D,UAAM,QAAQN,SAAQ,YAAY,CAAC,MAAM;AACzC,WAAO,MAAM;AAAA,MAAK,EAAE,QAAQ,EAAE;AAAA,MAAG,CAAC,GAAG,MACnC,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAACW,IAAG,MAAMX,SAAQ,OAAO,IAAI,IAAI,CAAC,CAAC;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,YAAY,YAAY,CAAC;AAE7B,QAAM,aAAa,IAAI,KAAK,eAAe,QAAQ;AAAA,IACjD,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC,EAAE,OAAO,UAAU;AAEpB,QAAM,WAAW,IAAI,KAAK,eAAe,QAAQ,EAAE,WAAW,OAAO,CAAC;AAEtE,QAAM,YAAY,CAAC,SAAe;AAChC,mBAAe,UAAU;AACzB,eAAW,UAAU,MAAM,KAAK,GAAG,CAAC;AAAA,EACtC;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,OAAoB;AACxB,UAAM,UAAU,QAAQ,OAAO,IAAI,eAAe,KAAK;AACvD,YAAQ,EAAE,KAAK;AAAA,MACb,KAAK;AACH,eAAOA,SAAQ,SAAS,EAAE;AAC1B;AAAA,MACF,KAAK;AACH,eAAOA,SAAQ,SAAS,CAAC;AACzB;AAAA,MACF,KAAK;AACH,eAAOA,SAAQ,SAAS,EAAE;AAC1B;AAAA,MACF,KAAK;AACH,eAAOA,SAAQ,SAAS,CAAC;AACzB;AAAA,MACF,KAAK;AACH,eAAOA,SAAQ,SAAS,CAAC,MAAM;AAC/B;AAAA,MACF,KAAK;AACH,eAAOA,SAAQ,SAAS,IAAI,MAAM;AAClC;AAAA,MACF,KAAK;AACH,eAAOC,WAAU,SAAS,EAAE,WAAW,MAAM,EAAE;AAC/C;AAAA,MACF,KAAK;AACH,eAAOA,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAC7C;AAAA,MACF;AACE;AAAA,IACJ;AACA,MAAE,eAAe;AACjB,cAAU,IAAI;AAAA,EAChB;AAEA,QAAM,kBAAkB,CAAC,MAA2B;AAClD,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,gBAAgB;AAClB,UAAI,SAAS,OAAQ,SAAQ,MAAM;AAAA,UAC9B,OAAM;AAAA,IACb;AAAA,EACF;AAGA,QAAM,WAAW,UAAW,MAAM,QAAQ,aAAa,QAAQ,QAAS;AACxE,QAAM,UACJ,WAAW,MAAM,SAAS,WACtB,MAAM,QAAQ,WACZ,MAAM,QACN,WACF;AACN,QAAM,UACJ,WAAW,MAAM,SAAS,WACtB,MAAM,QAAQ,WACZ,WACA,MAAM,QACR;AAEN,QAAM,WAAW,CAAC,MAAY;AAC5B,UAAM,gBAAgB,UAClB,UAAU,GAAG,WAAW,MAAM,KAAK,IACnC,UAAU,GAAG,MAAM;AACvB,UAAM,cAAc,UAAU,UAAU,GAAG,OAAO,IAAI;AACtD,UAAM,UACJ,CAAC,CAAC,WAAW,CAAC,CAAC,WAAWF,YAAW,CAAC,IAAI,WAAWA,YAAW,CAAC,IAAI;AACvE,WAAO,EAAE,UAAU,iBAAiB,aAAa,SAAS,eAAe,YAAY;AAAA,EACvF;AAGA,QAAM,MAAMO;AAAA,IACV,MAAM,IAAI,KAAK,eAAe,QAAQ,aAAa;AAAA,IACnD,CAAC,QAAQ,aAAa;AAAA,EACxB;AACA,QAAM,QAAQ,UACV,MAAM,QACJ,GAAG,IAAI,OAAO,MAAM,KAAK,CAAC,WAAM,MAAM,MAAM,IAAI,OAAO,MAAM,GAAG,IAAI,QAAG,KACvE,KACF,SACE,IAAI,OAAO,MAAM,IACjB;AACN,QAAM,sBACJ,gBAAgB,UAAU,sBAAsB;AAElD,QAAM,cAAc,UAChB,MAAM,QACJ,GAAG,OAAO,MAAM,KAAK,CAAC,IAAI,MAAM,MAAM,OAAO,MAAM,GAAG,IAAI,EAAE,KAC5D,KACF,SACE,OAAO,MAAM,IACb;AAGN,QAAM,gBAAgB,KAAK,MAAM,QAAQ,YAAY,IAAI,EAAE,IAAI;AAE/D,SACE,gBAAAM,QAAA,cAAC,SAAI,KAAK,SAAS,WAAU,sCAC1B,QAAQ,gBAAAA,QAAA,cAAC,WAAM,MAAK,UAAS,MAAY,OAAO,aAAa,GAG9D,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,YACE;AAAA,QACF,SAAS,OACL,mBACA,SAAS,OACP,mBACA;AAAA,QACN,WAAW,CAAC,QAAQ;AAAA,QACpB,SACE;AAAA,QACF;AAAA,MACF;AAAA;AAAA,IAEA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,eAAY;AAAA,QACZ,WAAU;AAAA;AAAA,IACZ;AAAA,IACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,MAAK;AAAA,QACL;AAAA,QACA,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,OAAO,WAAW;AAAA,QACjC,cAAY;AAAA,QACZ,oBAAkB;AAAA,QAClB,gBAAc,SAAS;AAAA,QACvB,SAAS,MAAO,OAAO,MAAM,IAAI,WAAW;AAAA,QAC5C,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,eAAe,CAAC,MAAM;AAClC,cAAE,eAAe;AACjB,uBAAW;AAAA,UACb;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,QAAQ,kBAAkB;AAAA,QAC5B;AAAA;AAAA,MAEC,SAAS;AAAA,IACZ;AAAA,IACC,aAAa,YAAY,CAAC,YACzB,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,SAAS;AAAA,QACT,WAAW;AAAA,UACT;AAAA,UACAV;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAU,QAAA,cAAC,eAAY,MAAM,IAAI,eAAY,QAAO;AAAA,IAC5C;AAAA,EAEJ,GAGC,QACC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,cAAY,UAAU,sBAAsB;AAAA,MAC5C,WAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA,cAAc,QAAQ,qBAAqB;AAAA,MAC7C;AAAA;AAAA,IAGA,gBAAAA,QAAA,cAAC,SAAI,WAAU,4CACb,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWT;AAAA,QACX,cACE,SAAS,SACL,mBACA,SAAS,WACP,kBACA;AAAA,QAER,SAAS,MACP;AAAA,UACE,SAAS,SACLF,WAAU,SAAS,EAAE,IACrB,SAAS,WACPA,WAAU,SAAS,GAAG,IACtBA,WAAU,SAAS,IAAI;AAAA,QAC/B;AAAA;AAAA,MAGF,gBAAAW,QAAA,cAACC,mBAAA,EAAiB,MAAM,IAAI,eAAY,QAAO;AAAA,IACjD,GACA,gBAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAU;AAAA,QACV,SAAS,MACP,QAAQ,SAAS,SAAS,WAAW,SAAS,WAAW,UAAU,MAAM;AAAA,QAE3E,WAAW;AAAA,UACT;AAAA,UACAV;AAAA,QACF;AAAA;AAAA,MAEC,SAAS,SACN,aACA,SAAS,WACP,QAAQ,YAAY,IACpB,GAAG,aAAa,WAAM,gBAAgB,EAAE;AAAA,IAChD,GACA,gBAAAU,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWT;AAAA,QACX,cACE,SAAS,SACL,eACA,SAAS,WACP,cACA;AAAA,QAER,SAAS,MACP;AAAA,UACE,SAAS,SACLF,WAAU,SAAS,CAAC,IACpB,SAAS,WACPA,WAAU,SAAS,EAAE,IACrBA,WAAU,SAAS,GAAG;AAAA,QAC9B;AAAA;AAAA,MAGF,gBAAAW,QAAA,cAACE,oBAAA,EAAkB,MAAM,IAAI,eAAY,QAAO;AAAA,IAClD,CACF;AAAA,IAGC,SAAS,UACR,gBAAAF,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,WAAW;AAAA,QACX,cAAc,MAAM,SAAS,IAAI;AAAA;AAAA,MAEjC,gBAAAA,QAAA,cAAC,SAAI,MAAK,OAAM,WAAU,2BACvB,SAAS,IAAI,CAAC,MACb,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,EAAE;AAAA,UACP,MAAK;AAAA,UACL,cAAY,EAAE;AAAA,UACd,WAAU;AAAA;AAAA,QAET,EAAE;AAAA,MACL,CACD,CACH;AAAA,MACC,MAAM,IAAI,CAAC,MAAM,OAChB,gBAAAA,QAAA,cAAC,SAAI,KAAK,IAAI,MAAK,OAAM,WAAU,sBAChC,KAAK,IAAI,CAAC,MAAM;AACf,cAAM,UAAU,EAAE,SAAS,MAAM,WAAW,SAAS;AACrD,cAAM,MAAM,YAAY,CAAC;AACzB,cAAM,KAAK,SAAS,CAAC;AACrB,cAAM,UAAU,UAAU,GAAG,KAAK;AAClC,eACE,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,OAAO,CAAC;AAAA,YACb,MAAK;AAAA,YACL,iBAAe,GAAG,YAAY,GAAG,WAAW;AAAA,YAC5C,WAAW;AAAA,cACT;AAAA,cACA,GAAG,WAAW;AAAA,cACd,GAAG,iBAAiB,WAAW,CAAC,UAAU,SAAS,OAAO,KAAK;AAAA,cAC/D,GAAG,eAAe;AAAA,YACpB;AAAA;AAAA,UAEA,gBAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAW,OAAO,CAAC;AAAA,cACnB,UAAU,UAAU,GAAG,OAAO,IAAI,IAAI;AAAA,cACtC,UAAU;AAAA,cACV,cAAY,SAAS,OAAO,CAAC;AAAA,cAC7B,gBAAc,UAAU,SAAS;AAAA,cACjC,SAAS,MAAM,UAAU,CAAC;AAAA,cAC1B,cAAc,MAAM,SAASb,YAAW,CAAC,CAAC;AAAA,cAC1C,SAAS,MAAM;AACb,oBAAI,CAAC,UAAU,GAAG,OAAO,EAAG,YAAWA,YAAW,CAAC,CAAC;AAAA,cACtD;AAAA,cACA,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACAG;AAAA,gBACA,GAAG,WACC,iEACA,UACE,oCACA;AAAA,gBACN,CAAC,GAAG,YAAY,WAAW;AAAA,gBAC3B,OAAO;AAAA,cACT;AAAA;AAAA,YAEC,EAAE,QAAQ;AAAA,UACb;AAAA,QACF;AAAA,MAEJ,CAAC,CACH,CACD;AAAA,IACH;AAAA,IAID,SAAS,YACR,gBAAAU,QAAA,cAAC,SAAI,WAAU,4BACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM;AACpC,YAAMG,SAAQ,IAAI,KAAK,eAAe,QAAQ,EAAE,OAAO,QAAQ,CAAC,EAAE;AAAA,QAChE,IAAI,KAAK,MAAM,GAAG,CAAC;AAAA,MACrB;AACA,YAAM,UAAU,MAAM,QAAQ,SAAS;AACvC,YAAM,WAAW,IAAI,KAAK,QAAQ,YAAY,GAAG,IAAI,GAAG,CAAC;AACzD,YAAM,aAAa,IAAI,KAAK,QAAQ,YAAY,GAAG,GAAG,CAAC;AACvD,YAAM,MACH,CAAC,CAAC,OAAO,WAAWhB,YAAW,GAAG,KAClC,CAAC,CAAC,OAAO,aAAaA,YAAW,GAAG;AACvC,aACE,gBAAAa,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,UAAU;AAAA,UACV,SAAS,MAAM;AACb,kBAAM,UAAU,IAAI,KAAK,QAAQ,YAAY,GAAG,IAAI,GAAG,CAAC,EAAE,QAAQ;AAClE;AAAA,cACE;AAAA,gBACE,IAAI,KAAK,QAAQ,YAAY,GAAG,GAAG,KAAK,IAAI,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAAA,gBACvE;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AACA,oBAAQ,MAAM;AAAA,UAChB;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACAV;AAAA,YACA,UACI,4CACA;AAAA,YACJ,OAAO;AAAA,UACT;AAAA;AAAA,QAECa;AAAA,MACH;AAAA,IAEJ,CAAC,CACH;AAAA,IAID,SAAS,WACR,gBAAAH,QAAA,cAAC,SAAI,WAAU,4BACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM;AACpC,YAAM,IAAI,gBAAgB;AAC1B,YAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,YAAM,MACH,CAAC,CAAC,OAAO,IAAI,IAAI,YAAY,KAAO,CAAC,CAAC,OAAO,IAAI,IAAI,YAAY;AACpE,aACE,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,UAAU;AAAA,UACV,SAAS,MAAM;AACb,kBAAM,UAAU,IAAI,KAAK,GAAG,QAAQ,SAAS,IAAI,GAAG,CAAC,EAAE,QAAQ;AAC/D;AAAA,cACE;AAAA,gBACE,IAAI,KAAK,GAAG,QAAQ,SAAS,GAAG,KAAK,IAAI,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAAA,gBACpE;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AACA,oBAAQ,QAAQ;AAAA,UAClB;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACAV;AAAA,YACA,UACI,4CACA;AAAA,YACJ,OAAO;AAAA,UACT;AAAA;AAAA,QAEC;AAAA,MACH;AAAA,IAEJ,CAAC,CACH;AAAA,IAID,WAAW,QAAQ,SAAS,KAC3B,gBAAAU,QAAA,cAAC,SAAI,WAAU,6DACZ,QAAQ,IAAI,CAAC,MACZ,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,EAAE;AAAA,QACP,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACAV;AAAA,QACF;AAAA,QACA,SAAS,MAAM;AACb,sBAAY,EAAE,KAAK;AACnB,gBAAM;AAAA,QACR;AAAA;AAAA,MAEC,EAAE;AAAA,IACL,CACD,CACH;AAAA,KAIA,aAAc,aAAa,aAC3B,gBAAAU,QAAA,cAAC,SAAI,WAAU,0EACZ,YACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,UAAU,YAAY,KAAK;AAAA,QAC3B,SAAS,MAAM;AACb,oBAAU,KAAK;AAAA,QACjB;AAAA;AAAA,MACD;AAAA,IAED,IAEA,gBAAAA,QAAA,cAAC,YAAK,GAEP,aAAa,YACZ,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,GAAG,YAAY,iCAAiC;AAAA,QAC3D,SAAS,MAAM;AACb,gBAAM;AACN,gBAAM,KAAK;AAAA,QACb;AAAA;AAAA,MACD;AAAA,IAED,CAEJ;AAAA,EAEJ,CAEJ;AAEJ;AAEA,WAAW,cAAc;AAEzB,IAAO,qBAAQ;;;AClyBf,OAAOI,WAAS,YAAAC,iBAAgB;;;ACAhC,OAAOC;AAAA,EACL,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP,SAAS,eAAAC,cAAa,kBAAkB;AAwCxC,IAAM,MAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAEpD,IAAM,QAAQ,CAAC,MAAuD;AACpE,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,QAAQ,sBAAsB,KAAK,EAAE,KAAK,CAAC;AACjD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,OAAO,MAAM,CAAC,CAAC;AACzB,QAAM,IAAI,OAAO,MAAM,CAAC,CAAC;AACzB,MAAI,IAAI,MAAM,IAAI,GAAI,QAAO;AAC7B,SAAO,EAAE,GAAG,EAAE;AAChB;AAEA,IAAM,YAAY,CAAC,MAAgC,EAAE,IAAI,KAAK,EAAE;AAChE,IAAM,WAAW,CAAC,MAAgC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAEzE,IAAMC,aACJ;AAEF,IAAMC,cACJ,4JACAD;AAIF,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,SAAS;AAAA,EACT,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,oBAAoB;AACtB,MAAuB;AACrB,QAAM,UAAUE,OAAM;AACtB,QAAM,YAAY,MAAM,cAAc,OAAO;AAC7C,QAAM,WAAW,GAAG,SAAS;AAC7B,QAAM,OAAO,WAAW;AACxB,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,UAAU,KAAK,CAAC,CAAC;AAElE,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAwB,YAAY;AAC9D,QAAM,UAAU,UAAU,SAAY,QAAQ;AAC9C,QAAM,cAAc,MAAM,OAAO;AAEjC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,WAAW;AAE5D,QAAM,UAAUC,QAAuB,IAAI;AAC3C,QAAM,aAAaA,QAA0B,IAAI;AACjD,QAAM,SAASA,QAAuB,IAAI;AAE1C,QAAM,OAAO,MAAM,GAAG;AACtB,QAAM,OAAO,MAAM,GAAG;AAEtB,QAAM,UAAUC;AAAA,IACd,CAAC,MAAa;AACZ,YAAM,IAAI,UAAU,CAAC;AACrB,UAAI,QAAQ,IAAI,UAAU,IAAI,EAAG,QAAO;AACxC,UAAI,QAAQ,IAAI,UAAU,IAAI,EAAG,QAAO;AACxC,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,CAAC,KAAK,GAAG;AAAA,EACX;AAEA,QAAM,UAAUC;AAAA,IACd,MAAM,MAAM,KAAK,EAAE,QAAQ,KAAK,KAAK,KAAK,IAAI,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,IAAI;AAAA,IACrE,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,SAAS,CAAC,MAAoB;AAClC,UAAM,OAAO,IAAI,SAAS,CAAC,IAAI;AAC/B,QAAI,UAAU,OAAW,UAAS,IAAI;AACtC,yCAAW;AAAA,EACb;AAEA,QAAM,QAAQD,aAAY,CAAC,cAAc,SAAS;AAxIpD;AAyII,YAAQ,KAAK;AACb,QAAI,YAAa,kBAAW,YAAX,mBAAoB;AAAA,EACvC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,MAAM;AACvB,QAAI,SAAU;AACd,aAAS,WAAW;AACpB,YAAQ,IAAI;AAAA,EACd;AAEA,EAAAE,WAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,CAAC,MAAkB;AArJtC;AAsJM,UAAI,GAAC,aAAQ,YAAR,mBAAiB,SAAS,EAAE,SAAiB,OAAM,KAAK;AAAA,IAC/D;AACA,aAAS,iBAAiB,aAAa,MAAM;AAC7C,WAAO,MAAM,SAAS,oBAAoB,aAAa,MAAM;AAAA,EAC/D,GAAG,CAAC,MAAM,KAAK,CAAC;AAGhB,QAAM,aAAaH,QAAO,KAAK;AAC/B,EAAAG,WAAU,MAAM;AACd,QAAI,KAAM,YAAW,UAAU;AAAA,EACjC,GAAG,CAAC,IAAI,CAAC;AACT,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,OAAO,QAAS;AAC9B,WAAO,QACJ,iBAA8B,kBAAkB,EAChD,QAAQ,CAAC,QAAQ;AAChB,YAAM,MAAM,IAAI,cAA2B,wBAAwB;AACnE,UAAI,IAAK,KAAI,YAAY,IAAI,YAAY,IAAI,eAAe,IAAI,IAAI,eAAe;AAAA,IACrF,CAAC;AACH,QAAI,WAAW,SAAS;AACtB,iBAAW,UAAU;AACrB,YAAM,SACJ,OAAO,QAAQ,cAA2B,wBAAwB,KAClE,OAAO,QAAQ,cAA2B,iCAAiC;AAC7E,uCAAQ,MAAM,EAAE,eAAe,KAAK;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,MAAM,KAAK,CAAC;AAIhB,QAAM,UAAU,CAAC,MAAa;AAC5B,QAAI,CAAC,KAAM,QAAO,SAAS,CAAC;AAC5B,UAAMC,UAAS,EAAE,KAAK,KAAK,OAAO;AAClC,UAAM,MAAM,EAAE,IAAI,OAAO,IAAI,KAAK,EAAE,IAAI;AACxC,WAAO,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,IAAIA,OAAM;AAAA,EACrC;AAEA,QAAM,SAAsB,SAAS,MAAM,KAAK,KAAK,OAAO;AAE5D,QAAM,QAAQ,OACV,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAO,MAAM,IAAI,KAAK,CAAE,IACvD,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;AAE1C,QAAM,OAAO,CAAC,KAAa,MAAoB,MAAM,MAAO,MAAM,OAAO,KAAK;AAE9E,QAAM,SAAS,CAAC,QAAgB,QAAQ,KAAK,CAAC,MAAM,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAG1E,QAAM,cAAc,CAAC,MAAc;AACjC,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,YAAY,KAAK,GAAG,MAAM;AAChC,QAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,UAAM,QAAQ,KAAK,GAAG,WAAW,OAAO,OAAO,IAAI;AACnD,WAAO,OAAO,KAAK,IAAI,QAAQ;AAAA,EACjC;AAEA,QAAM,eAAe,CAAC,MACpB,OAAO,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAErE,QAAM,iBAAiB,CAAC,MACtB,CAAC,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,KAAK,MAAM,OAAO,KAAK,EAAE,EAAE,KAAK,MAAM;AAE9E,QAAM,UAAU,CAAC,MAAc;AAC7B,UAAM,KAAK,YAAY,CAAC;AACxB,UAAM,IAAI,SAAS,QAAQ,EAAE,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC,IAC5C,MAAM,IACL,QAAQ,KAAK,CAAC,OAAO,QAAQ,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,KAAK;AACxD,aAAS,EAAE,GAAG,IAAI,EAAE,CAAC;AAAA,EACvB;AACA,QAAM,YAAY,CAAC,MAAc,SAAS,EAAE,IAAG,+BAAO,OAAM,OAAO,IAAI,IAAI,EAAE,CAAC;AAC9E,QAAM,YAAY,CAAC,MAAmB;AACpC,UAAM,OAAO,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE;AACnC,UAAM,IAAK,KAAK,IAAI,MAAO,MAAM,OAAO,KAAK;AAC7C,UAAM,IAAI,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAE,CAAC,IAC9B,KAAK,IACJ,QAAQ,KAAK,CAAC,OAAO,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK;AACzD,aAAS,EAAE,GAAG,EAAE,CAAC;AAAA,EACnB;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS,QAAQ,KAAK,EAAG,QAAO,KAAK;AACzC,UAAM;AAAA,EACR;AAEA,QAAM,SAAS,MAAM;AACnB,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,UAAU,KAAK,MAAM,IAAI,WAAW,IAAI,IAAI,IAAI;AACtD,QAAI,IAAI,IAAI,SAAS;AACrB,QAAI,IAAI;AACR,QAAI,KAAK,IAAI;AACX,UAAI;AACJ,WAAK,IAAI,KAAK;AAAA,IAChB;AACA,aAAS,EAAE,GAAG,EAAE,CAAC;AAAA,EACnB;AAIA,QAAM,eAAe,CAAC,MAA2B;AAC/C,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,gBAAgB;AAClB,YAAM;AACN;AAAA,IACF;AACA,UAAM,MAAO,EAAE,OAAuB,QAAqB,iBAAiB;AAC5E,QAAI,CAAC,IAAK;AACV,UAAM,MAAM,IAAI;AAChB,UAAM,OAAO,MAAM,KAAK,OAAO,QAAS,iBAA8B,kBAAkB,CAAC;AACzF,UAAM,OAAO,CAAC,MAAqB,KAAa,QAAgB;AAC9D,eAASC,KAAI,MAAM,KAAKA,MAAK,KAAKA,KAAI,KAAK,QAAQA,MAAK,KAAK;AAC3D,YAAI,CAAE,KAAKA,EAAC,EAAwB,SAAU,QAAO,KAAKA,EAAC;AAAA,MAC7D;AACA,aAAO;AAAA,IACT;AACA,QAAI,OAA2B;AAC/B,UAAM,QAAQ,MAAM,KAAK,IAAI,iBAA8B,iBAAiB,CAAC;AAC7E,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,QAAI,EAAE,QAAQ,YAAa,QAAO,KAAK,OAAO,GAAG,CAAC;AAAA,aACzC,EAAE,QAAQ,UAAW,QAAO,KAAK,OAAO,GAAG,EAAE;AAAA,aAC7C,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,aAAa;AACxD,YAAM,IAAI,KAAK,QAAQ,GAAG,KAAK,EAAE,QAAQ,eAAe,IAAI;AAC5D,YAAM,SAAS,KAAK,CAAC;AACrB,UAAI;AACF,eACE,OAAO,cAA2B,wBAAwB,KAC1D,OAAO,cAA2B,iCAAiC;AAAA,IACzE,MAAO;AACP,MAAE,eAAe;AACjB,iCAAM;AAAA,EACR;AAIA,QAAM,cAAc,CAAC,UAAmB,QACtC;AAAA,IACE;AAAA,IACA;AAAA,IACAT;AAAA,IACA,WACI,iEACA;AAAA,IACJ,OAAO;AAAA,EACT;AAEF,QAAM,SAAS,CACb,OACA,UAEA,gBAAAU,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAU;AAAA;AAAA,IAET,MAAM,IAAI,CAAC,OACV,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,GAAG;AAAA,QACR,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAe,GAAG;AAAA,QAClB,UAAU,GAAG;AAAA,QACb,UAAU,GAAG,WAAW,IAAI;AAAA,QAC5B,SAAS,GAAG;AAAA,QACZ,WAAW,YAAY,GAAG,UAAU,GAAG,QAAQ;AAAA;AAAA,MAE9C,GAAG;AAAA,IACN,CACD;AAAA,EACH;AAGF,QAAM,oBAAoB,QAAS,OAAQ,MAAM,IAAI,OAAO,IAAI,KAAK,MAAM,IAAI,KAAM,MAAM,IAAK;AAEhG,SACE,gBAAAA,QAAA,cAAC,SAAI,KAAK,SAAS,WAAU,sCAC1B,QAAQ,gBAAAA,QAAA,cAAC,WAAM,MAAK,UAAS,MAAY,OAAO,WAAW,IAAI,GAEhE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,SAAS,OAAO,mBAAmB,SAAS,OAAO,mBAAmB;AAAA,QACtE,SACE;AAAA,QACF;AAAA,MACF;AAAA;AAAA,IAEA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,eAAY;AAAA,QACZ,WAAU;AAAA;AAAA,IACZ;AAAA,IACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,MAAK;AAAA,QACL;AAAA,QACA,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,OAAO,WAAW;AAAA,QACjC,cAAY;AAAA,QACZ,oBAAkB;AAAA,QAClB,gBAAc,SAAS;AAAA,QACvB,SAAS,MAAO,OAAO,MAAM,IAAI,WAAW;AAAA,QAC5C,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,eAAe,CAAC,MAAM;AAClC,cAAE,eAAe;AACjB,uBAAW;AAAA,UACb;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,cAAc,kBAAkB;AAAA,QAClC;AAAA;AAAA,MAEC,cAAc,QAAQ,WAAW,IAAI;AAAA,IACxC;AAAA,IACC,aAAa,eAAe,CAAC,YAC5B,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,SAAS,MAAM;AAvX3B;AAwXc,iBAAO,IAAI;AACX,mBAAS,IAAI;AACb,2BAAW,YAAX,mBAAoB;AAAA,QACtB;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACAV;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAU,QAAA,cAACC,cAAA,EAAY,MAAM,IAAI,eAAY,QAAO;AAAA,IAC5C;AAAA,EAEJ,GAEC,QACC,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA,cAAc,QAAQ,qBAAqB;AAAA,MAC7C;AAAA;AAAA,IAEA,gBAAAA,QAAA,cAAC,SAAI,WAAU,wDAAuD,aAAU,YAC7E,QAAQ,QAAQ,KAAK,IAAI,OAC5B;AAAA,IACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,+BACZ;AAAA,MACC;AAAA,MACA,MAAM,IAAI,CAAC,OAAO;AAAA,QAChB,KAAK,OAAO,CAAC;AAAA,QACb,OAAO,OAAO,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,QAC/B,UAAU,sBAAsB;AAAA,QAChC,UAAU,aAAa,CAAC;AAAA,QACxB,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACzB,EAAE;AAAA,IACJ,GACC;AAAA,MACC;AAAA,MACA,QAAQ,IAAI,CAAC,OAAO;AAAA,QAClB,KAAK,OAAO,CAAC;AAAA,QACb,OAAO,IAAI,CAAC;AAAA,QACZ,WAAU,+BAAO,OAAM;AAAA,QACvB,UAAU,QAAQ,CAAC,QAAQ,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI;AAAA,QAChD,QAAQ,MAAM,UAAU,CAAC;AAAA,MAC3B,EAAE;AAAA,IACJ,GACC,QACC;AAAA,MACE;AAAA,MACC,CAAC,MAAM,IAAI,EAAY,IAAI,CAAC,OAAO;AAAA,QAClC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,CAAC,SAAS,WAAW;AAAA,QAChC,UAAU,eAAe,CAAC;AAAA,QAC1B,QAAQ,MAAM,UAAU,CAAC;AAAA,MAC3B,EAAE;AAAA,IACJ,CACJ;AAAA,IACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,0EACZ,UACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,GAAGT,aAAY,sCAAsC;AAAA,QAChE,SAAS;AAAA;AAAA,MACV;AAAA,IAED,IAEA,gBAAAS,QAAA,cAAC,YAAK,GAER,gBAAAA,QAAA,cAAC,SAAI,WAAU,gBACb,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,GAAGT,aAAY,iCAAiC;AAAA,QAC3D,SAAS,MAAM,MAAM;AAAA;AAAA,MACtB;AAAA,IAED,GACA,gBAAAS,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAU,CAAC,SAAS,CAAC,QAAQ,KAAK;AAAA,QAClC,WAAW,GAAGT,aAAY,gDAAgD;AAAA,QAC1E,SAAS;AAAA;AAAA,MACV;AAAA,IAED,CACF,CACF;AAAA,EACF,CAEJ;AAEJ;AAEA,WAAW,cAAc;AAEzB,IAAO,qBAAQ;;;ADhbf,IAAMW,OAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,IAAM,SAAS,CAAC,MAAY,GAAGA,KAAI,EAAE,SAAS,CAAC,CAAC,IAAIA,KAAI,EAAE,WAAW,CAAC,CAAC;AACvE,IAAMC,WAAU,CAAC,GAAS,MACxB,EAAE,YAAY,MAAM,EAAE,YAAY,KAClC,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAC5B,IAAM,MAAM,CAAC,MACX,GAAG,EAAE,YAAY,CAAC,IAAID,KAAI,EAAE,SAAS,IAAI,CAAC,CAAC,IAAIA,KAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;AAE9E,IAAM,UAAU,CAAC,KAAW,SAAiB;AAC3C,QAAM,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AACzC,SAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;AAClF;AAGA,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,SAAS;AAAA,EACT,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,MAA2B;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAsB,YAAY;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAwB,IAAI;AAClE,QAAM,UAAU,UAAU,SAAY,QAAQ;AAE9C,QAAM,OAAO,CAAC,SAAsB;AAClC,QAAI,UAAU,OAAW,UAAS,IAAI;AACtC,yCAAW;AAAA,EACb;AAEA,QAAM,QAAQ,CAAC,MAAY;AACzB,QAAI,OAAO,IAAI,IAAK,QAAO,IAAI,KAAK,GAAG;AACvC,QAAI,OAAO,IAAI,IAAK,QAAO,IAAI,KAAK,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAC,MAAmB;AACjC,QAAI,CAAC,GAAG;AACN,qBAAe,IAAI;AACnB,WAAK,IAAI;AACT;AAAA,IACF;AACA,UAAM,OAAO,UAAU,OAAO,OAAO,IAAK,eAAe;AACzD,mBAAe,IAAI;AACnB,SAAK,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC;AAAA,EAC9B;AAEA,QAAM,SAAS,CAAC,MAAqB;AACnC,QAAI,CAAC,EAAG;AACR,QAAI,QAAS,MAAK,MAAM,QAAQ,SAAS,CAAC,CAAC,CAAC;AAAA,QACvC,gBAAe,CAAC;AAAA,EACvB;AAGA,QAAM,UAAU,OAAO,WAAWD,SAAQ,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI;AACxE,QAAM,UAAU,OAAO,WAAWA,SAAQ,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI;AAExE,QAAM,YAAY,UAAU,OAAO,OAAO,IAAI;AAE9C,SACE,gBAAAE,QAAA,cAAC,SAAI,WAAW,GAAG,oCAAoC,SAAS,KAC7D,QAAQ,gBAAAA,QAAA,cAAC,WAAM,MAAK,UAAS,MAAY,OAAO,UAAU,IAAI,OAAO,IAAI,IAAI,GAC9E,gBAAAA,QAAA,cAAC,SAAI,WAAU,0BACb,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAY,aAAa;AAAA,MACzB,OAAO;AAAA,MACP,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAS;AAAA;AAAA,EACX,CACF,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,mBACb,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,YAAY,GAAG,SAAS,UAAU;AAAA,MAC9C,OAAO;AAAA,MACP,UAAU;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA;AAAA,EACb,CACF,CACF;AAEJ;AAEA,eAAe,cAAc;AAE7B,IAAO,yBAAQ;;;AEnKf,OAAOC,aAAW;AAmBX,IAAM,yBAAyB,CAAC,MAAY,oBAAI,KAAK,MAAyB;AACnF,QAAM,MAAM,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAAC;AACrE,QAAM,UAAU,CAAC,MACf,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,IAAI,CAAC;AAC/D,SAAO;AAAA,IACL,EAAE,OAAO,eAAe,OAAO,EAAE,OAAO,QAAQ,CAAC,GAAG,IAAI,EAAE;AAAA,IAC1D,EAAE,OAAO,gBAAgB,OAAO,EAAE,OAAO,QAAQ,EAAE,GAAG,IAAI,EAAE;AAAA,IAC5D;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,QACL,OAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,CAAC;AAAA,QACpD,KAAK,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAM,kBAAkB,CAAC,UACvB,gBAAAC,QAAA,cAAC,sBAAY,GAAI,OAAkB,MAAK,SAAQ;AAGlD,gBAAgB,cAAc;AAE9B,IAAO,0BAAQ;;;AC5Cf,OAAOC,aAAW;AAUlB,IAAM,UAAU,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,MAAoB;AAClB,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,aAAa,eAAe,mBAAmB;AAAA,QAC/C;AAAA,MACF;AAAA;AAAA,EACD;AAEL;AAEA,IAAO,kBAAQ;;;AC9Bf,OAAOC;AAAA,EAKL,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,OACK;AAEP,SAAS,eAAAC,oBAAmB;AAsB5B,IAAM,YACJ;AAEF,IAAM,SAA0B,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AACtB,MAAM;AACJ,QAAM,WAAWC,QAAuB,IAAI;AAE5C,QAAM,cAAcC,aAAY,MAAM;AACpC,cAAU,KAAK;AAAA,EACjB,GAAG,CAAC,SAAS,CAAC;AAKd,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,WAAW,SAAS,KAAK,MAAM;AACrC,aAAS,KAAK,MAAM,WAAW;AAC/B,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,oBAAoB,SAAS;AACnC,UAAM,QAAQ,SAAS;AAEvB,QAAI,SAAS,CAAC,MAAM,SAAS,SAAS,aAAa,GAAG;AACpD,YAAM,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IACrC;AACA,WAAO,MAAM;AA9EjB;AA+EM,mEAAmB,UAAnB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,UAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAI,EAAE,QAAQ,YAAY,QAAQ;AAChC,oBAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,QAAQ,aAAa,aAAa,CAAC;AAGvC,QAAM,qBAAqB,CAAC,UAA+C;AACzE,QAAI,MAAM,QAAQ,MAAO;AACzB,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,MAAO;AACZ,UAAM,QAAQ,MAAM,KAAK,MAAM,iBAA8B,SAAS,CAAC;AACvE,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,eAAe;AACrB,YAAM,MAAM;AACZ;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,UAAM,SAAS,SAAS;AACxB,QAAI,MAAM,aAAa,WAAW,SAAS,WAAW,QAAQ;AAC5D,YAAM,eAAe;AACrB,WAAK,MAAM;AAAA,IACb,WAAW,CAAC,MAAM,YAAY,WAAW,MAAM;AAC7C,YAAM,eAAe;AACrB,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AAEA,SACE,gBAAAC,QAAA,cAAC,aACC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,SACI,wBACA;AAAA,MACN;AAAA,MACA,SAAS,MAAM,uBAAuB,YAAY;AAAA;AAAA,EACpD,GAEA,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,cAAW;AAAA,MACX,cAAY;AAAA,MACZ,mBAAiB;AAAA,MACjB,oBAAkB;AAAA,MAClB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA;AAAA,QAET;AAAA;AAAA;AAAA,QAGA;AAAA,QACA,aAAa,WACX,iBAAiB,KAAK;AAAA,QACxB,aAAa,UACX,gBAAgB,KAAK;AAAA,QACvB,aAAa,SACX,uBAAuB,MAAM;AAAA,QAC/B,aAAa,YACX,0BAA0B,MAAM;AAAA,QAClC,CAAC,WACE,aAAa,UACV,qBACA,aAAa,SACX,sBACA,aAAa,QACX,sBACA;AAAA,QACV,SAAS,wCAAwC;AAAA,QACjD;AAAA,MACF;AAAA,MACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA;AAAA,IAEjC,mBACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAA,QAAA,cAACJ,cAAA,EAAY,MAAM,IAAI,eAAY,QAAO;AAAA,IAC5C;AAAA,IAGF,gBAAAI,QAAA,cAAC,SAAI,WAAU,+CACZ,QACH;AAAA,EACF,CACF;AAEJ;AAEA,IAAO,iBAAQ;;;AC/Lf,OAAOC;AAAA,EACL,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAAC,mBAAkB,eAAAC,cAAa,oBAAoB;;;ACV5D,SAAS,OAAAC,YAAyB;AAClC,OAAOC,aAA+C;AAatD,IAAM,gBAAgBC,KAAI,mBAAmB;AAAA,EAC3C,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF,CAAC;AAED,IAAM,QAAQ,CAAC;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAkB;AAChB,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,QACjC,aAAa,OACT,+CACA;AAAA,MACN;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA;AAAA,IAEJ,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACZ,UACA,YACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,MAAK;AAAA,QACL,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,MACb;AAAA,IAED,CAEJ;AAAA,EACF;AAEJ;AAEA,IAAO,gBAAQ;;;ADTf,IAAM,oBAAoB,CAAC,WAAmB;AAC5C,SAAO,gBAAAC,QAAA,cAAC,YAAS,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO;AAC7D;AAGA,IAAMC,aACJ;AAGF,IAAMC,cACJ;AAEF,IAAM,WAAWC;AAAA,EACf,CACE;AAAA,IACE,KAAK,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,GACA,QACG;AA7FP;AA8FI,UAAM,CAAC,aAAa,cAAc,IAAIC,UAAiB,EAAE;AACzD,UAAM,CAAC,iBAAiB,kBAAkB,IAAIA;AAAA,MAC5C,WAAW,CAAC;AAAA,IACd;AAEA,UAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,UAAM,cAAcC,QAAuB,IAAI;AAC/C,UAAM,aAAaA,QAA0B,IAAI;AAEjD,wBAAoB,KAAK,MAAM,YAAY,OAAQ;AAEnD,IAAAC,WAAU,MAAM;AACd,UAAI,SAAS;AACX,2BAAmB,OAAO;AAAA,MAC5B;AAAA,IACF,GAAG,CAAC,OAAO,CAAC;AAEZ,UAAM,0BAA0BC,SAAQ,MAAM;AAC5C,UAAI,CAAC,OAAQ,QAAO;AACpB,aAAO,gBAAgB,OAAO,CAAC,WAAW;AACxC,YAAI,OAAO,OAAO,UAAU,UAAU;AACpC,iBAAO,OAAO,MAAM,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC;AAAA,QACtE;AACA,eAAO,OAAO,MAAM,SAAS,EAAE,SAAS,YAAY,YAAY,CAAC;AAAA,MACnE,CAAC;AAAA,IACH,GAAG,CAAC,QAAQ,aAAa,eAAe,CAAC;AAEzC,UAAM,qBAAqBC;AAAA,MACzB,CAAC,MAA2C;AAC1C,uBAAe,EAAE,OAAO,KAAK;AAAA,MAC/B;AAAA,MACA,CAAC;AAAA,IACH;AAEA,UAAM,eAAeA;AAAA,MACnB,CAAC,WAAmB;AAClB,YAAI,YAAY,aAAa;AAC3B;AAAA,YAAY,CAAC,iBACX,aAAa,KAAK,CAAC,SAAS,KAAK,UAAU,OAAO,KAAK,IACnD,aAAa,OAAO,CAAC,SAAS,KAAK,UAAU,OAAO,KAAK,IACzD,CAAC,GAAG,cAAc,MAAM;AAAA,UAC9B;AAAA,QACF,WAAW,aAAa;AACtB,sBAAY,CAAC,MAAM,CAAC;AACpB,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,MACA,CAAC,UAAU,WAAW;AAAA,IACxB;AAEA,UAAM,uBAAuBA;AAAA,MAC3B,CAAC,WAAmB;AAClB,YAAI,YAAY,aAAa;AAC3B;AAAA,YAAY,CAAC,iBACX,aAAa,KAAK,CAAC,SAAS,KAAK,UAAU,OAAO,KAAK,IACnD,aAAa,OAAO,CAAC,SAAS,KAAK,UAAU,OAAO,KAAK,IACzD,CAAC,GAAG,cAAc,MAAM;AAAA,UAC9B;AAAA,QACF,WAAW,aAAa;AACtB,sBAAY,CAAC,MAAM,CAAC;AAAA,QACtB;AAAA,MACF;AAAA,MACA,CAAC,UAAU,WAAW;AAAA,IACxB;AAEA,UAAM,kBAAkB,MAAM;AAC5B,WAAI,qCAAU,YAAW,gBAAgB,QAAQ;AAC/C,mDAAc,CAAC;AAAA,MACjB,OAAO;AACL,mDAAc;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AACxB,UAAI,SAAS;AACX,gBAAQ;AAAA,MACV;AACA,iDAAc,CAAC;AACf,sBAAgB,KAAK;AAAA,IACvB;AAEA,IAAAF,WAAU,MAAM;AACd,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,aAAO,MAAM;AACX,iBAAS,oBAAoB,aAAa,kBAAkB;AAAA,MAC9D;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UACE,YAAY,WACZ,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GAClD;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AAGA,UAAM,cAAc,aACf,qCAAU,WAAU,KAAK,IACxB,GAAG,qCAAU,MAAM,cACnB,iBACF,0CAAW,OAAX,mBAAe,UACb,0CAAW,OAAX,mBAAe,QACf;AACN,UAAM,WAAW,aACZ,qCAAU,WAAU,KAAK,IAC1B,CAAC,GAAC,0CAAW,OAAX,mBAAe;AAErB,WACE,gBAAAN,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,KAAK;AAAA,QAGL,WAAW,CAAC,MAAM;AAjN1B,cAAAS;AAkNU,cAAI,EAAE,QAAQ,YAAY,cAAc;AACtC,cAAE,gBAAgB;AAClB,4BAAgB,KAAK;AACrB,aAAAA,MAAA,WAAW,YAAX,gBAAAA,IAAoB;AAAA,UACtB;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,CAAC,SAAS;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QACA,OAAO;AAAA,UACL;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAT,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,iBAAc;AAAA,UACd,iBAAe;AAAA,UACf,iBAAe,GAAG,EAAE;AAAA,UACpB,mBAAiB,GAAG,EAAE;AAAA,UACtB;AAAA,UACA,SAAS,MAAM,CAAC,YAAY,gBAAgB,CAAC,SAAS,CAAC,IAAI;AAAA,UAC3D,WAAW,CAAC,MAAM;AAChB,gBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,gBAAE,eAAe;AACjB,eAAC,YAAY,gBAAgB,CAAC,SAAS,CAAC,IAAI;AAAA,YAC9C;AAAA,UACF;AAAA,UACA,WAAW;AAAA;AAAA,YAET;AAAA,YACA;AAAA,YACA;AAAA,YACAC;AAAA,YACA,eACI,uFACA;AAAA,YACJ,YACE;AAAA,UACJ;AAAA;AAAA,QAEA,gBAAAD,QAAA,cAAC,aAAQ,WAAU,mEAChB,QACC,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAU,4BAChC,IACH,GAEF,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,GAAG,EAAE;AAAA,YACT,WAAW;AAAA,cACT;AAAA,cACA,WAAW,kBAAkB;AAAA,YAC/B;AAAA;AAAA,UAEC;AAAA,QACH,CACF;AAAA,QACA,gBAAAA,QAAA;AAAA,UAACU;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,MAAM;AAAA,YACN,WAAW;AAAA,cACT;AAAA,cACA,gBAAgB;AAAA,YAClB;AAAA;AAAA,QACF;AAAA,MACF;AAAA,MACA,gBAAAV,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,GAAG,EAAE;AAAA,UACT,MAAK;AAAA,UACL,wBAAsB;AAAA,UACtB,mBAAiB,GAAG,EAAE;AAAA,UACtB,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,aAAa,QAAQ,WAAW;AAAA,YAChC,eACI;AAAA;AAAA,cAEA;AAAA;AAAA,UACN;AAAA;AAAA,QAEC,UACC,gBAAAA,QAAA,cAAC,SAAI,WAAU,8BACb,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,GAAG,EAAE;AAAA,YACT,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,cAAW;AAAA,YACX,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAU;AAAA,YACV,SAAS,gBAAAA,QAAA,cAAC,gBAAa,MAAM,IAAI;AAAA;AAAA,QACnC,CACF;AAAA,QAED,YACC,gBAAAA,QAAA,cAAC,aAAQ,WAAU,iFACjB,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS;AAAA,YACT,WAAW;AAAA,cACTE;AAAA,cACA;AAAA,YACF;AAAA;AAAA,UACD;AAAA,QAED,GACA,gBAAAF,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,MAAK;AAAA,YACL,WAAW;AAAA,cACTE;AAAA,cACA;AAAA,YACF;AAAA,YACA,SAAS;AAAA;AAAA,UACV;AAAA,QAED,CACF;AAAA,QAEF,gBAAAF,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,WAAW,OAAO;AAAA,YAC3B,WAAU;AAAA;AAAA,UAET,UACC,wBAAwB,WAAW,IACjC,gBAAAA,QAAA,cAAC,OAAE,WAAU,sDAAmD,kBAEhE,IAEA,wBAAwB,IAAI,CAAC,QAAQ,MAAM;AAvV3D,gBAAAS;AAwVkB,kBAAM,aACJ,CAAC,CAAC,cAAYA,MAAA,SAAS,CAAC,MAAV,gBAAAA,IAAa,WAAU,OAAO;AAE9C,mBACE,gBAAAT,QAAA,cAACA,QAAM,UAAN,EAAe,KAAK,KAClB,WACC,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA;AAAA,mBACA,iCAAQ,mBACN;AAAA,gBACJ;AAAA,gBACA,SAAS,GAAG,EAAE,aAAa,OAAO,KAAK;AAAA,gBACvC,KAAK;AAAA;AAAA,cAEL,gBAAAA,QAAA,cAAC,aAAQ,WAAU,oDACjB,gBAAAA,QAAA,cAAC,SAAI,WAAU,gBACb,gBAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI,GAAG,EAAE,aAAa,OAAO,KAAK;AAAA,kBAClC,UACE,qCAAU;AAAA,oBACR,CAAC,SAAS,KAAK,UAAU,OAAO;AAAA,wBAC7B;AAAA,kBAEP,UAAU,MAAM,qBAAqB,MAAM;AAAA,kBAC3C,UAAU,iCAAQ;AAAA;AAAA,cACpB,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACb,gBAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,QAAO,iCAAQ,kBACX,YACA,OAAO;AAAA,kBACb;AAAA,kBACA,WAAW;AAAA,oBACT;AAAA,qBACA,iCAAQ,mBAAkB;AAAA,kBAC5B;AAAA;AAAA,gBAEC,WAAW,MAAM;AAAA,cACpB,CACF,CACF,GACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,oCACb,iCAAQ,IACX,CACF;AAAA,cACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,oCACb,iCAAQ,OACX;AAAA,YACF,IAEA,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,SAAS,GAAG,EAAE,aAAa,OAAO,KAAK;AAAA,gBACvC,MAAK;AAAA,gBACL,iBAAe;AAAA,gBACf,kBAAe,iCAAQ,mBAAkB;AAAA,gBACzC,WAAU,iCAAQ,kBAAiB,KAAK;AAAA,gBACxC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,oBACE,kDACE;AAAA,oBACF,oEACE,iCAAQ;AAAA,kBACZ;AAAA,gBACF;AAAA,gBACA,SAAS,MACP,EAAC,iCAAQ,mBAAkB,aAAa,MAAM;AAAA,gBAEhD,WAAW,CAAC,MAA2B;AApajE,sBAAAS;AAqa4B,uBACG,EAAE,QAAQ,WAAW,EAAE,QAAQ,QAChC,EAAC,iCAAQ,iBACT;AACA,sBAAE,eAAe;AACjB,iCAAa,MAAM;AACnB,qBAAAA,MAAA,WAAW,YAAX,gBAAAA,IAAoB;AAAA,kBACtB;AAAA,gBACF;AAAA;AAAA,cAEA,gBAAAT,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,QAAO,iCAAQ,kBACX,YACA,OAAO;AAAA,kBACb;AAAA,kBACA,WAAW;AAAA,oBACT;AAAA,qBACA,iCAAQ,mBAAkB;AAAA,kBAC5B;AAAA;AAAA,gBAEC,WAAW,MAAM;AAAA,cACpB;AAAA,cACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,oDACb,MACA,cACC,gBAAAA,QAAA;AAAA,gBAACW;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,eAAY;AAAA,kBACZ,WAAU;AAAA;AAAA,cACZ,CAEJ;AAAA,YACF,CAEJ;AAAA,UAEJ,CAAC,IAGH;AAAA,QAEJ;AAAA,QACC,gBACC,gBAAAX,QAAA,cAAC,SAAI,WAAU,wCACZ,YACH;AAAA,QAED,kBACC,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAAA,EAEJ;AACF;AAEO,IAAM,WAAoC,CAAC,EAAE,OAAO,SAAS,MAAM;AACxE,SAAO,gBAAAA,QAAA,cAAC,OAAE,WAAU,eAAa,SAAS,QAAS;AACrD;AAOO,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAA,QAAA,cAAC,SAAI,WAAU,qFACb,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,MAAM;AACb,YAAI,SAAS;AACX,kBAAQ;AAAA,QACV;AACA,YAAI,iBAAiB;AACnB,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF;AAAA;AAAA,IACD;AAAA,EAED,CACF;AAEJ;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;AEvgBf,SAAS,oBAAAY,yBAAwB;AACjC,OAAOC;AAAA,EACL,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA+BP,IAAM,kBAAkB,CACtB,OACA,cACY;AACZ,SAAO,MAAM,SAAS;AACxB;AAKe,SAAR,aAA8B;AAAA,EACnC;AACF,GAEG;AACD,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,EAAE;AAEnD,QAAM,aAAaC,QAAuB,IAAI;AAC9C,QAAM,aAAaA,QAAuB,IAAI;AAC9C,QAAM,eAAeA,QAAkC,CAAC,CAAC;AACzD,QAAM,gBAAgBA,QAAO,CAAC;AAE9B,QAAM,eAAeC,aAAY,MAAM;AACrC,UAAM,MAAM,cAAc;AAC1B,kBAAc,WAAW;AACzB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,YAAYA,aAAY,MAAM;AAClC,cAAU,KAAK;AACf,oBAAgB,EAAE;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAA+B;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAEb,UAAM,UAAU,CAAC,MAAkB;AACjC,UACE,WAAW,WACX,WAAW,WACX,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,KAC7C,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,GAC7C;AACA,kBAAU;AAAA,MACZ;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,OAAO;AAC9C,WAAO,MAAM,SAAS,oBAAoB,aAAa,OAAO;AAAA,EAChE,GAAG,CAAC,QAAQ,SAAS,CAAC;AAGtB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAEb,UAAM,UAAU,CAAC,MAAqB;AA7G1C;AA8GM,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,YAAE,eAAe;AACjB,oBAAU;AACV,2BAAW,YAAX,mBAAoB;AACpB;AAAA,QAEF,KAAK;AACH,YAAE,eAAe;AACjB,0BAAgB,CAAC,MAAO,IAAI,cAAc,UAAU,IAAI,IAAI,IAAI,CAAE;AAClE;AAAA,QAEF,KAAK;AACH,YAAE,eAAe;AACjB,0BAAgB,CAAC,MAAO,IAAI,IAAI,IAAI,IAAI,cAAc,UAAU,CAAE;AAClE;AAAA,QAEF,KAAK;AAEH,YAAE,eAAe;AACjB,0BAAgB,CAAC;AACjB;AAAA,QAEF,KAAK;AACH,YAAE,eAAe;AACjB,0BAAgB,cAAc,UAAU,CAAC;AACzC;AAAA,MACJ;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,OAAO;AAC5C,oBAAgB,CAAC;AAEjB,WAAO,MAAM,SAAS,oBAAoB,WAAW,OAAO;AAAA,EAC9D,GAAG,CAAC,QAAQ,SAAS,CAAC;AAGtB,EAAAA,WAAU,MAAM;AAnJlB;AAoJI,QAAI,CAAC,OAAQ;AACb,uBAAa,QAAQ,YAAY,MAAjC,mBAAoC;AAAA,EACtC,GAAG,CAAC,cAAc,MAAM,CAAC;AAGzB,QAAM,mBAAmB,SAAS,IAAI,UAAU,CAAC,UAAU;AACzD,QAAI,CAAC,eAAe,KAAK,EAAG,QAAO;AAGnC,UAAM,uBAAuB,aAAa,OAA6B;AAAA,MACrE,GAAG,MAAM;AAAA,MACT;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,CAAC;AAED,SAAO,gBAAAC,QAAA,cAAC,SAAI,WAAU,2BAAyB,gBAAiB;AAClE;AAKO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,QAAQ,WAAW,WAAW,IAAI,iBAAiB,CAAC;AAE5D,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,MAAK;AAAA,MACL,iBAAc;AAAA,MACd,iBAAe;AAAA,MACf,SAAS,MAAM,uCAAY,CAAC;AAAA,MAG5B,WAAW,CAAC,MAAM;AAChB,YACE,EAAE,WAAW,EAAE,kBACd,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAChC;AACA,YAAE,eAAe;AACjB,iDAAY,CAAC;AAAA,QACf;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT;AAAA;AAAA,QAEA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AACA,oBAAoB,cAAc;AAK3B,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAKG;AACD,QAAM,EAAE,QAAQ,WAAW,IAAI,iBAAiB,CAAC;AACjD,QAAM,CAAC,SAAS,UAAU,IAAIJ,UAAS,KAAK;AAE5C,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,EAAAG,WAAU,MAAM;AACd,QAAI,QAAQ;AACV,iBAAW,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,QAAQ,WAAW,MAAM,WAAW,KAAK,GAAG,GAAG;AACrD,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,kBAAkB;AAAA,IACtB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAGA,QAAM,wBAAwB,CAC5BE,cACoB;AACpB,WAAO,SAAS,IAAIA,WAAU,CAAC,UAAU;AACvC,UAAI,CAAC,eAAe,KAAK,EAAG,QAAO;AAGnC,YAAM,aAAa,gBAAgB,OAAO,gBAAgB;AAC1D,YAAM,YAAY,gBAAgB,OAAO,eAAe;AACxD,UAAI,cAAc,WAAW;AAC3B,eAAO,aAAa,OAA6B;AAAA,UAC/C,GAAG,MAAM;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH;AAGA,UAAI,MAAM,MAAM,UAAU;AACxB,eAAO,aAAa,OAA6B;AAAA,UAC/C,GAAG,MAAM;AAAA,UACT,UAAU,sBAAsB,MAAM,MAAM,QAAQ;AAAA,QACtD,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SACE,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAW;AAAA;AAAA,QAET;AAAA;AAAA,QAEA,UAAU,QAAQ,kBAAkB;AAAA,QACpC;AAAA,QACA,SAAS,0BAA0B;AAAA,QACnC,gBAAgB,KAAK,KAAK,gBAAgB;AAAA,QAC1C;AAAA,MACF;AAAA;AAAA,IAEC,sBAAsB,QAAQ;AAAA,EACjC;AAEJ;AACA,oBAAoB,cAAc;AAK3B,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AACA,kBAAkB,cAAc;AAKzB,SAAS,wBAAwB;AACtC,SAAO,gBAAAA,QAAA,cAAC,SAAI,MAAK,aAAY,WAAU,yBAAwB;AACjE;AACA,sBAAsB,cAAc;AAKpC,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AACF,GAQG;AACD,QAAM,CAAC,KAAK,IAAIJ,UAAS,MAAG;AAtW9B;AAsWiC,iEAAe,iBAAf,2CAAmC;AAAA,GAAE;AACpE,QAAM,MAAMC,QAAuB,IAAI;AAEvC,EAAAE,WAAU,MAAM;AACd,QAAI,SAAS,MAAK,+CAAe,eAAc;AAC7C,oBAAc,aAAa,QAAQ,KAAK,IAAI,IAAI;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,CAAC;AAEzB,QAAM,cAAc,MAAM;AACxB,QAAI,SAAU;AACd;AACA,QAAI,cAAc;AAChB,qDAAe;AAAA,IACjB;AAAA,EACF;AAEA,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,UAAU,WAAW,KAAK;AAAA,MAC1B,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,SAAS;AAAA,MAET,WAAW,CAAC,MAAM;AAChB,YACE,EAAE,WAAW,EAAE,kBACd,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAChC;AACA,YAAE,eAAe;AACjB,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA,QAEA;AAAA,QACA,WACI,qCACA;AAAA,QACJ;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAKO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AACA,iBAAiB,cAAc;AAKxB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,WAAW,YAAY,IAAIJ,UAAS,KAAK;AAEhD,QAAM,eAA6B;AAAA,IACjC;AAAA,IACA;AAAA,EACF;AAGA,QAAM,wBAAwB,CAC5BK,cACoB;AACpB,WAAO,SAAS,IAAIA,WAAU,CAAC,UAAU;AACvC,UAAI,CAAC,eAAe,KAAK,EAAG,QAAO;AAEnC,YAAM,eAAe,gBAAgB,OAAO,sBAAsB;AAClE,YAAM,eAAe,gBAAgB,OAAO,sBAAsB;AAClE,YAAM,aAAa,gBAAgB,OAAO,gBAAgB;AAC1D,YAAM,kBAAkB,gBAAgB,OAAO,eAAe;AAE9D,UAAI,gBAAgB,gBAAgB,cAAc,iBAAiB;AACjE,eAAO,aAAa,OAA6B;AAAA,UAC/C,GAAG,MAAM;AAAA,UACT;AAAA;AAAA,UACA,GAAI,gBAAgB,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,QACzD,CAAC;AAAA,MACH;AAGA,UAAI,MAAM,MAAM,UAAU;AACxB,eAAO,aAAa,OAA6B;AAAA,UAC/C,GAAG,MAAM;AAAA,UACT,UAAU,sBAAsB,MAAM,MAAM,QAAQ;AAAA,QACtD,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,gBAAAD,QAAA,cAAC,SAAI,WAAU,cAAY,sBAAsB,QAAQ,CAAE;AACpE;AACA,gBAAgB,cAAc;AAEvB,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MAGA,cAAc,6CAAc;AAAA,MAC5B,SAAS,MAAM,6CAAc,aAAa,EAAC,6CAAc;AAAA,MACzD,cAAc;AAAA,MACd;AAAA;AAAA,IAEA,gBAAAA,QAAA,cAAC,cAAM,QAAS;AAAA,IAChB,gBAAAA,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAW;AAAA,UACT;AAAA,WACA,6CAAc,aAAY,eAAe;AAAA,QAC3C;AAAA;AAAA,IACF;AAAA,EACF;AAEJ;AACA,uBAAuB,cAAc;AAE9B,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AAED,QAAM,wBAAwB,CAC5BD,cACoB;AACpB,WAAO,SAAS,IAAIA,WAAU,CAAC,UAAU;AACvC,UAAI,CAAC,eAAe,KAAK,EAAG,QAAO;AAEnC,YAAM,aAAa,gBAAgB,OAAO,gBAAgB;AAC1D,YAAM,YAAY,gBAAgB,OAAO,eAAe;AAExD,UAAI,cAAc,WAAW;AAC3B,eAAO,aAAa,OAA6B;AAAA,UAC/C,GAAG,MAAM;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH;AAGA,UAAI,MAAM,MAAM,UAAU;AACxB,eAAO,aAAa,OAA6B;AAAA,UAC/C,GAAG,MAAM;AAAA,UACT,UAAU,sBAAsB,MAAM,MAAM,QAAQ;AAAA,QACtD,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SACE,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA;AAAA,QAET;AAAA,QACA;AAAA,SACA,6CAAc,aACV,8BACA;AAAA,MACN;AAAA;AAAA,IAEC,sBAAsB,QAAQ;AAAA,EACjC;AAEJ;AACA,uBAAuB,cAAc;AAErC,aAAa,cAAc;;;ACpkB3B,OAAOG;AAAA,EACL,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,UAAAC;AAAA,EACA,uBAAAC;AAAA,OACK;AACP,SAAS,gBAAAC,qBAAoB;AAsD7B,IAAMC,qBAAoB,CAAC,WAAmB;AAC5C,SAAO,gBAAAC,QAAA,cAACC,WAAA,EAAS,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO;AAC7D;AAEA,IAAM,mBAAmBC;AAAA,EACvB,CACE;AAAA,IACE,KAAK,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AAAA,IAC5D;AAAA,IACA,WAAW,CAAC;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,IACA,aAAaH;AAAA,IACb;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,GACA,QACG;AACH,UAAM,CAAC,aAAa,cAAc,IAAII,UAAiB,EAAE;AACzD,UAAM,mBAAmBC,QAAuB,IAAI;AACpD,UAAM,CAAC,cAAc,eAAe,IAAID,UAAS,KAAK;AAEtD,IAAAE,qBAAoB,KAAK,MAAM,iBAAiB,OAAQ;AAExD,UAAM,0BAA0BC,SAAQ,MAAM;AAC5C,UAAI,CAAC,OAAQ,QAAO;AACpB,aAAO,mCAAS;AAAA,QACd,CAAC,WAAQ;AAtGjB;AAuGU,yBAAO,iCAAQ,WAAU,cACzB,4CAAQ,UAAR,mBAAe,kBAAf,mBAA8B,SAAS,2CAAa;AAAA;AAAA;AAAA,IAE1D,GAAG,CAAC,QAAQ,aAAa,OAAO,CAAC;AAEjC,UAAM,qBAAqBC;AAAA,MACzB,CAAC,MAA2C;AA7GlD;AA8GQ,wBAAe,4BAAG,WAAH,mBAAW,KAAK;AAAA,MACjC;AAAA,MACA,CAAC;AAAA,IACH;AAEA,UAAM,eAAeA;AAAA,MACnB,CAAC,WAAmB;AAClB,YAAI,YAAY,aAAa;AAC3B;AAAA,YAAY,CAAC,kBACX,6CAAc,KAAK,CAAC,UAAS,6BAAM,YAAU,iCAAQ,WACjD,6CAAc,OAAO,CAAC,UAAS,6BAAM,YAAU,iCAAQ,UACvD,CAAC,GAAG,cAAc,MAAM;AAAA,UAC9B;AAAA,QACF,WAAW,aAAa;AACtB,sBAAY,CAAC,MAAM,CAAC;AACpB,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,MACA,CAAC,UAAU,aAAa,eAAe;AAAA,IACzC;AAEA,UAAM,uBAAuBA;AAAA,MAC3B,CAAC,WAAmB;AAClB,YAAI,YAAY,aAAa;AAC3B;AAAA,YAAY,CAAC,kBACX,6CAAc,KAAK,CAAC,UAAS,6BAAM,YAAU,iCAAQ,WACjD,6CAAc,OAAO,CAAC,UAAS,6BAAM,YAAU,iCAAQ,UACvD,CAAC,GAAG,cAAc,MAAM;AAAA,UAC9B;AAAA,QACF,WAAW,aAAa;AACtB,sBAAY,CAAC,MAAM,CAAC;AAAA,QACtB;AAAA,MACF;AAAA,MACA,CAAC,UAAU,WAAW;AAAA,IACxB;AAEA,UAAM,kBAAkB,MAAM;AAC5B,WAAI,qCAAU,aAAW,mCAAS,SAAQ;AACxC,mDAAc,CAAC;AAAA,MACjB,OAAO;AACL,mDAAc;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AACxB,UAAI,SAAS;AACX,gBAAQ;AAAA,MACV;AACA,iDAAc,CAAC;AACf,sBAAgB,KAAK;AAAA,IACvB;AAEA,IAAAC,WAAU,MAAM;AACd,YAAM,qBAAqB,CAAC,UAAsB;AAnKxD;AAoKQ,aACE,qDAAkB,YAClB,GAAC,0DAAkB,YAAlB,mBAA2B,SAAS,+BAAO,UAC5C;AACA,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF;AAEA,2CAAU,iBAAiB,aAAa;AACxC,aAAO,MAAM;AACX,6CAAU,oBAAoB,aAAa;AAAA,MAC7C;AAAA,IACF,GAAG,CAAC,eAAe,CAAC;AAEpB,WACE,gBAAAR,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,KAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,CAAC,SAAS;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QACA,OAAO;AAAA,UACL;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,iBAAc;AAAA,UACd,iBAAe;AAAA,UACf,mBAAiB,GAAG,EAAE;AAAA,UACtB;AAAA,UACA,SAAS,MAAM,CAAC,YAAY,gBAAgB,CAAC,SAAS,CAAC,IAAI;AAAA,UAC3D,WAAW,CAAC,MAAM;AAChB,gBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,gBAAE,eAAe;AACjB,eAAC,YAAY,gBAAgB,CAAC,SAAS,CAAC,IAAI;AAAA,YAC9C;AAAA,UACF;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA,YAAY;AAAA,YACZ,gBAAgB;AAAA,UAClB;AAAA;AAAA,QAEC;AAAA,QACA,gBACC,gBAAAA,QAAA,cAAC,UAAK,IAAI,GAAG,EAAE,UAAU,WAAU,2BAChC,YACH;AAAA,MAEJ;AAAA,MACA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,wBAAsB;AAAA,UACtB,mBAAiB,GAAG,EAAE;AAAA,UACtB,UAAU;AAAA,UACV,WAAW;AAAA,YACT;AAAA,YACA,eACI,8BACA;AAAA,YACJ,aAAa,QACT,WACA,aAAa,WACb,cACA,aAAa,SACb,WACA,aAAa,UACb,gBACA;AAAA,YACJ,gBACE;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,YACL;AAAA,YACA,UAAU;AAAA,YACV,KAAK;AAAA,UACP;AAAA;AAAA,QAEC,UACC,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,GAAG,EAAE;AAAA,YACT,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,cAAW;AAAA,YACX,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAU;AAAA,YACV,SAAS,gBAAAA,QAAA,cAACS,eAAA,EAAa,MAAM,IAAI;AAAA;AAAA,QACnC;AAAA,QAED,YACC,gBAAAT,QAAA,cAAC,aAAQ,WAAU,0DACjB,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS;AAAA,YACT,WAAU;AAAA;AAAA,UACX;AAAA,QAED,GACA,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA;AAAA,UACV;AAAA,QAED,CACF;AAAA,QAEF,gBAAAA,QAAA,cAAC,aAAQ,OAAO,EAAE,WAAW,OAAO,GAAG,WAAU,iFAC9C,UACG,mEAAyB,IAAI,CAAC,QAAQ,MAAG;AAvRzD;AAwRkB,iCAAAA,QAAA,cAACA,QAAM,UAAN,EAAe,KAAK,KAClB,WACC,gBAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,iBACA,iCAAQ,mBACN;AAAA,cACJ;AAAA,cACA,SAAS,GAAG,EAAE,aAAa,OAAO,KAAK;AAAA,cACvC,KAAK;AAAA;AAAA,YAEL,gBAAAA,QAAA,cAAC,aAAQ,WAAU,oDACjB,gBAAAA,QAAA,cAAC,SAAI,WAAU,gBACb,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,GAAG,EAAE,aAAa,OAAO,KAAK;AAAA,gBAClC,SAAS,qCAAU;AAAA,kBACjB,CAAC,UAAS,6BAAM,YAAU,iCAAQ;AAAA;AAAA,gBAEpC,UAAU,MAAM,qBAAqB,MAAM;AAAA,gBAC3C,UAAU,iCAAQ;AAAA;AAAA,YACpB,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACb,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAO,iCAAQ,kBACX,YACA,OAAO;AAAA,gBACb;AAAA,gBACA,WAAW;AAAA,kBACT;AAAA,mBACA,iCAAQ,mBAAkB;AAAA,gBAC5B;AAAA;AAAA,cAEC,WAAW,MAAM;AAAA,YACpB,CACF,CACF,GACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,mBAAiB,iCAAQ,IAAK,CAChD;AAAA,YACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,oCACb,iCAAQ,OACX;AAAA,UACF,IAEA,gBAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,GAAG,EAAE,aAAa,OAAO,KAAK;AAAA,cACvC,KAAK;AAAA,cACL,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,kBACE,oCACE,cAAY,cAAS,CAAC,MAAV,mBAAa,YAAU,iCAAQ;AAAA,kBAC7C,8DACE,iCAAQ;AAAA,gBACZ;AAAA,cACF;AAAA,cACA,SAAS,MACP,EAAC,iCAAQ,mBAAkB,aAAa,MAAM;AAAA;AAAA,YAGhD,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAO,iCAAQ,kBACX,YACA,OAAO;AAAA,gBACb;AAAA,gBACA,WAAW;AAAA,kBACT;AAAA,mBACA,iCAAQ,mBAAkB;AAAA,gBAC5B;AAAA;AAAA,cAEC,WAAW,MAAM;AAAA,YACpB;AAAA,YACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,mBAAiB,IAAK;AAAA,UACxC,CAEJ;AAAA,aAEF,QACN;AAAA,QACC,gBACC,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BAA2B,YAAa;AAAA,QAExD,kBACC,gBAAAA,QAAA;AAAA,UAACU;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAAA,EAEJ;AACF;AAEO,IAAMT,YAAoC,CAAC,EAAE,OAAO,SAAS,MAAM;AACxE,SAAO,gBAAAD,QAAA,cAAC,OAAE,WAAU,eAAa,SAAS,QAAS;AACrD;AAEA,IAAMU,kBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAV,QAAA,cAAC,SAAI,WAAU,0EACb,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,SAAS,MAAM;AACb,YAAI,SAAS;AACX,kBAAQ;AAAA,QACV;AACA,YAAI,iBAAiB;AACnB,0BAAgB,KAAK;AAAA,QACvB;AAAA,MACF;AAAA;AAAA,IACD;AAAA,EAED,CACF;AAEJ;AAEA,iBAAiB,cAAc;AAE/B,IAAO,2BAAQ;;;ACpZf,OAAOW,WAAS,cAAAC,aAAiC,UAAAC,eAAc;AAM/D,IAAM,eAAeD;AAAA,EACnB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,cAAcC,QAAyB,IAAI;AACjD,UAAM,WAAY,OAA6C;AAE/D,UAAM,cAAc,MAAM;AAZ9B;AAaM,qBAAS,YAAT,mBAAkB;AAAA,IACpB;AAEA,WACE,gBAAAF,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,OAAO,EAAE,SAAS,gBAAgB,QAAQ,UAAU;AAAA;AAAA,MAEpD,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACJ,GAAG;AAAA,UACJ,OAAO,EAAE,SAAS,OAAO;AAAA;AAAA,MAC3B;AAAA,MACC;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,aAAa,cAAc;AAE3B,IAAO,uBAAQ;;;AClCf,OAAOG,WAAS,cAAAC,aAAY,YAAAC,kBAA2B;AAEvD,SAAS,qBAAqB;;;ACH9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAOC,aAA0B;AASjC,IAAM,qBAAqB,CAAC,SAAe;AArB3C;AAsBE,QAAM,WAAW,OAAO,SAAS,WAAW,OAAO,KAAK;AACxD,QAAM,aAAY,cAAS,MAAM,GAAG,EAAE,IAAI,MAAxB,mBAA2B;AAE7C,MAAI;AACJ,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,sBACE,gBAAAA,QAAA,cAAC,eAAY,WAAU,uFAAsF;AAE/G;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,sBACE,gBAAAA,QAAA,cAAC,gBAAa,WAAU,uFAAsF;AAEhH;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,sBACE,gBAAAA,QAAA,cAAC,eAAY,WAAU,uFAAsF;AAE/G;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,sBACE,gBAAAA,QAAA,cAAC,oBAAiB,WAAU,uFAAsF;AAEpH;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,sBACE,gBAAAA,QAAA,cAAC,mBAAgB,WAAU,uFAAsF;AAEnH;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,sBACE,gBAAAA,QAAA,cAAC,kBAAe,WAAU,uFAAsF;AAElH;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,sBACE,gBAAAA,QAAA,cAAC,iBAAc,WAAU,uFAAsF;AAEjH;AAAA,IACF,KAAK;AACH,sBACE,gBAAAA,QAAA,cAAC,kBAAe,WAAU,uFAAsF;AAElH;AAAA,IACF;AAEE,sBACE,gBAAAA,QAAA,cAAC,cAAW,WAAU,uFAAsF;AAE9G;AAAA,EACJ;AACA,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA8B;AAC5B,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA;AAAA,IAEV,gBAAAA,QAAA,cAAC,SAAI,WAAU,oCACZ,mBAAmB,IAAI,GACxB,gBAAAA,QAAA,cAAC,SAAI,WAAU,gCACb,gBAAAA,QAAA,cAAC,OAAE,WAAU,oCACV,OAAO,SAAS,WAAW,OAAO,KAAK,MAAM,GAChD,GACC,YAAY,gBAAAA,QAAA,cAAC,SAAI,WAAU,YAAU,QAAS,CACjD,CACF;AAAA,IACA,gBAAAA,QAAA,cAAC,YAAO,MAAK,UAAS,SAAS,MAAM,qCAAW,UAC9C,gBAAAA,QAAA,cAAC,mBAAgB,WAAU,wCAAuC,CACpE;AAAA,EACF;AAEJ;AAEA,IAAO,4BAAQ;;;ADzGf,IAAM,aAAaC;AAAA,EACjB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,YAAY,aAAa,IAAIC,WAAS,KAAK;AAElD,UAAM,iBAAiB,CAAC,MAAmC;AACzD,QAAE,eAAe;AACjB,UAAI,CAAC,SAAU,eAAc,IAAI;AAAA,IACnC;AAEA,UAAM,kBAAkB,MAAM;AAC5B,oBAAc,KAAK;AAAA,IACrB;AAEA,UAAM,aAAa,CAAC,MAAmC;AACrD,QAAE,eAAe;AACjB,oBAAc,KAAK;AACnB,UAAI,SAAU;AAEd,YAAM,QAAQ,MAAM,KAAK,EAAE,aAAa,KAAK;AAC7C,UAAI,MAAM,WAAW,EAAG;AAExB,UAAI,UAAU;AACZ,2BAAmB,gBAAgB,CAAC,GAAI,gBAAgB,CAAC,GAAI,GAAG,KAAK,CAAC;AAAA,MACxE,OAAO;AACL,2BAAmB,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,WACE,gBAAAC,QAAA,cAAC,SAAI,WAAU,yBACb,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACJ,GAAG;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAM;AAAA,QACN;AAAA;AAAA,IACF,GACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT;AAAA,QACA,MAAK;AAAA,QACL,cAAY,UAAU,WAAW,UAAU,MAAM;AAAA,QACjD,iBAAe,YAAY;AAAA,QAC3B,UAAU;AAAA,QACV,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,cAAE,cAAc,MAAM;AAAA,UACxB;AAAA,QACF;AAAA,QACA,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,WAAW;AAAA;AAAA,UAET;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA,cACE;AAAA;AAAA,UAEF,YAAY;AAAA,UACZ;AAAA,QACF;AAAA;AAAA,MAGA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,UACF;AAAA;AAAA,QAEA,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,cACE;AAAA,YACJ;AAAA;AAAA,UAEA,gBAAAA,QAAA,cAAC,iBAAc,WAAU,WAAU;AAAA,QACrC;AAAA,QACA,gBAAAA,QAAA,cAAC,aACC,gBAAAA,QAAA,cAAC,OAAE,WAAU,uCACX,gBAAAA,QAAA,cAAC,UAAK,WAAU,oCAAiC,kCAEjD,GAAQ,KACR,gBAAAA,QAAA,cAAC,UAAG,GAAE,KAAE,KACV,CACF;AAAA,MACF;AAAA,IACF,GACA,gBAAAA,QAAA,cAAC,aAAQ,WAAW,GAAG,cAAc,oBAAoB,KACtD,6CAAc,IAAI,CAAC,MAAM,UACxB,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,KAAK,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MAEC;AAAA,IACH,EAEJ,CACF;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;AAEzB,IAAO,qBAAQ;;;AE/Jf,OAAOC,WAAS,aAAAC,aAAW,UAAAC,UAAQ,cAAAC,oBAAkB;AAYrD,IAAM,mBAAmBC;AAAA,EACvB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,GACA,QACG;AACH,UAAM,aAAaC,SAAuB,IAAI;AAC9C,UAAM,aAAaA,SAAuB,IAAI;AAI9C,IAAAC,YAAU,MAAM;AACd,UAAI,CAAC,OAAQ;AAEb,YAAM,qBAAqB,CAAC,UAAsB;AAjCxD;AAkCQ,YACE,GAAC,gBAAW,YAAX,mBAAoB,SAAS,MAAM,YACpC,GAAC,gBAAW,YAAX,mBAAoB,SAAS,MAAM,UACpC;AACA,oBAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAEA,YAAM,gBAAgB,CAAC,UAAyB;AA1CtD;AA2CQ,YAAI,MAAM,QAAQ,UAAU;AAC1B,oBAAU,KAAK;AACf,2BAAW,YAAX,mBAAoB;AAAA,QACtB;AAAA,MACF;AAEA,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,eAAS,iBAAiB,WAAW,aAAa;AAClD,aAAO,MAAM;AACX,iBAAS,oBAAoB,aAAa,kBAAkB;AAC5D,iBAAS,oBAAoB,WAAW,aAAa;AAAA,MACvD;AAAA,IACF,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,WACE,gBAAAC,QAAA,cAAC,SAAI,WAAU,kBAAiB,OAC9B,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QAIL,MAAK;AAAA,QACL,UAAU;AAAA,QACV,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,SAAS,MAAM,UAAU,CAAC,MAAM;AAAA,QAChC,WAAW,CAAC,MAAM;AAChB,cACE,EAAE,WAAW,EAAE,kBACd,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAChC;AACA,cAAE,eAAe;AACjB,sBAAU,CAAC,MAAM;AAAA,UACnB;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,QACF;AAAA;AAAA,MAEC;AAAA,IACH,GACC,UACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAW;AAAA;AAAA,UAET;AAAA;AAAA;AAAA,UAGA;AAAA;AAAA;AAAA;AAAA,UAIA,YAAY,iBAAiB;AAAA,UAC7B,YAAY,kBAAkB;AAAA,UAC9B,YAAY,cAAc;AAAA,UAC1B,YAAY,eAAe;AAAA,UAC3B;AAAA,QACF;AAAA;AAAA,MAEC;AAAA,IACH,CAEJ;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;AAE/B,IAAO,2BAAQ;;;ACnHf,OAAOC,aAA0C;AASjD,IAAM,aAAa,CAAC,EAAE,UAAU,WAAW,MAAM,MAAM,MAAuB;AAC5E,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,SAAS,OAAO,YAAY;AAAA,MAC9B;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAEA,IAAO,qBAAQ;;;ACvBf,OAAOC,WAAS,YAAAC,kBAAgB;AAChC,SAAS,oBAAAC,mBAAkB,qBAAAC,0BAAyB;AAYpD,IAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAa,KAAK,KAAK,QAAQ,WAAW;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAS,KAAK;AAE9C,QAAM,cAAc,MAAM;AACxB,QAAI,cAAc,KAAK,UAAU;AAC/B,aAAO,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,CAAC,GAAG,MACpC,gBAAAC,QAAA,cAAC,WAAQ,KAAK,GAAG,GAAM,MAAY,cAA4B,CAChE;AAAA,IACH;AAEA,UAAM,QAAQ,CAAC,GAAG,CAAC;AACnB,UAAM,MAAM,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE;AAAA,MACrC,CAAC,MAAM,IAAI,KAAK,IAAI,aAAa;AAAA,IACnC;AACA,UAAM,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;AAE3C,UAAM,QAAQ,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;AAC5D,WAAO,MAAM;AAAA,MAAI,CAAC,GAAG,QACnB,OAAO,MAAM,MAAM,CAAC,MAAM,YAAY,IAAI,MAAM,MAAM,CAAC,IAAI,IACzD,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,QAAQ,CAAC;AAAA,UACd,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,cAAW;AAAA,UACX,WAAU;AAAA,UACV,SAAS,MAAM,YAAY,IAAI;AAAA;AAAA,QAChC;AAAA,MAED,IAEA,gBAAAA,QAAA,cAAC,WAAQ,KAAK,GAAG,GAAM,MAAY,cAA4B;AAAA,IAEnE;AAAA,EACF;AAEA,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW,GAAG,2BAA2B,SAAS;AAAA;AAAA,IAElD,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAM,gBAAAA,QAAA,cAACC,mBAAA,EAAiB,MAAM,IAAI;AAAA,QAClC,SAAS,MAAM,aAAa,OAAO,CAAC;AAAA,QACpC,UAAU,SAAS;AAAA;AAAA,IACrB;AAAA,IAEA,gBAAAD,QAAA,cAAC,SAAI,WAAU,kEACZ,YAAY,CACf;AAAA,IACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAM,gBAAAA,QAAA,cAACE,oBAAA,EAAkB,MAAM,IAAI;AAAA,QACnC,SAAS,MAAM,aAAa,OAAO,CAAC;AAAA,QACpC,UAAU,SAAS,aAAa;AAAA;AAAA,IAClC;AAAA,EACF;AAEJ;AAEA,IAAM,UAAU,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,QAAM,WAAW,MAAM;AAEvB,SACE,gBAAAF,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MAEL,SAAS,WAAW,WAAW;AAAA,MAC/B,cAAY,QAAQ,IAAI,CAAC;AAAA,MACzB,gBAAc,WAAW,SAAS;AAAA,MAClC,WAAU;AAAA,MACV,SAAS,MAAM,aAAa,CAAC;AAAA;AAAA,IAE5B,IAAI;AAAA,EACP;AAEJ;AAEA,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAME,gBAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,WAAU;AAAA;AACZ;AAGF,IAAO,yBAAQ;;;AClIf,OAAOG,aAAW;AAUlB,IAAM,UAAU,CAAC,EAAE,OAAO,QAAQ,aAAa,QAAQ,MAAoB;AACzE,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MAGC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA;AAAA;AAAA,QAGA;AAAA,QACA,YAAY,UAAU,aAAa;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA;AAAA;AAAA,QAGA,GAAI,cACA;AAAA,UACE,aAAa,sBAAsB,WAAW;AAAA,UAC9C,gBAAgB;AAAA,QAClB,IACA,CAAC;AAAA,MACP;AAAA;AAAA,EACD;AAEL;AAEA,IAAO,kBAAQ;;;ACvCf,OAAOC,WAAoB,aAAAC,aAAW,UAAAC,gBAAc;AACpD,SAAS,eAAAC,oBAAmB;AAqB5B,IAAMC,aACJ;AAEa,SAAR,MAAuB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AACtB,GAAe;AACb,QAAM,YAAYC,SAAuB,IAAI;AAC7C,QAAM,yBAAyBA,SAAO,KAAK;AAG3C,EAAAC,YAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,WAAW,SAAS,KAAK,MAAM;AACrC,aAAS,KAAK,MAAM,WAAW;AAC/B,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAGd,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,oBAAoB,SAAS;AACnC,UAAM,SAAS,UAAU;AAEzB,QAAI,UAAU,CAAC,OAAO,SAAS,SAAS,aAAa,GAAG;AACtD,aAAO,MAAM;AAAA,IACf;AACA,WAAO,MAAM;AA7DjB;AA8DM,mEAAmB,UAAnB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAGd,EAAAA,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,CAAC,cAAe;AAClC,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,SAAU,cAAa,KAAK;AAAA,IAChD;AACA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM,SAAS,oBAAoB,WAAW,SAAS;AAAA,EAChE,GAAG,CAAC,WAAW,eAAe,YAAY,CAAC;AAG3C,QAAM,sBAAsB,CAAC,UAA+C;AAC1E,QAAI,MAAM,QAAQ,MAAO;AACzB,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,MAAM,KAAK,OAAO,iBAA8BF,UAAS,CAAC;AACxE,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,eAAe;AACrB,aAAO,MAAM;AACb;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,UAAM,SAAS,SAAS;AACxB,QAAI,MAAM,aAAa,WAAW,SAAS,WAAW,SAAS;AAC7D,YAAM,eAAe;AACrB,WAAK,MAAM;AAAA,IACb,WAAW,CAAC,MAAM,YAAY,WAAW,MAAM;AAC7C,YAAM,eAAe;AACrB,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AAIA,QAAM,0BAA0B,CAAC,UAA4C;AAC3E,2BAAuB,UAAU,MAAM,WAAW,MAAM;AAAA,EAC1D;AAEA,QAAM,qBAAqB,CAAC,UAA4C;AACtE,QACE,MAAM,WAAW,MAAM,iBACvB,uBAAuB,WACvB,qBACA;AACA,mBAAa,KAAK;AAAA,IACpB;AACA,2BAAuB,UAAU;AAAA,EACnC;AAEA,SACE,gBAAAG,QAAA,cAAAA,QAAA,gBACG,aACC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAU;AAAA;AAAA,IAEV,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,cAAW;AAAA,QACX,cAAY;AAAA,QACZ,mBAAiB;AAAA,QACjB,oBAAkB;AAAA,QAClB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,OAAO;AAAA,UACL;AAAA;AAAA,UAEA,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QACA,WAAW;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAA,QAAA,cAAC,aAAK,QAAS;AAAA,MACd,cACC,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,SAAS,MAAM,aAAa,KAAK;AAAA,UACjC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA;AAAA,QAEA,gBAAAA,QAAA,cAACC,cAAA,EAAY,MAAM,IAAI,eAAY,QAAO;AAAA,MAC5C;AAAA,IAEJ;AAAA,EACF,CAEJ;AAEJ;;;ACxKA,SAAuB,OAAAC,YAAW;AAElC,OAAOC,aAAW;AAElB;AAAA,EACE;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,IAAMC,eAAc;AAEpB,IAAM,cAAc,CAAC,EAAE,QAAQ,MAAwB;AACrD,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aACE,gBAAAC,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAW,GAAGD,cAAa,kBAAkB;AAAA;AAAA,QAE7C,gBAAAC,QAAA,cAAC,iBAAc,MAAM,IAAI;AAAA,MAC3B;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAW,GAAGD,cAAa,kBAAkB;AAAA;AAAA,QAE7C,gBAAAC,QAAA,cAAC,kBAAe,MAAM,IAAI;AAAA,MAC5B;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAW,GAAGD,cAAa,kBAAkB;AAAA;AAAA,QAE7C,gBAAAC,QAAA,cAAC,sBAAmB,MAAM,IAAI;AAAA,MAChC;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAW,GAAGD,cAAa,gBAAgB,KAClE,gBAAAC,QAAA,cAAC,eAAY,MAAM,IAAI,CACzB;AAAA,IAEJ;AACE,aACE,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAW,GAAGD,cAAa,eAAe,KACjE,gBAAAC,QAAA,cAAC,qBAAkB,MAAM,IAAI,CAC/B;AAAA,EAEN;AACF;AAaA,IAAM,iBAAiBC;AAAA;AAAA;AAAA,EAGrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AAAA,MACA,UAAU;AAAA,QACR,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAIA,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA;AACF,MAIE,gBAAAD,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL;AAAA,IACA,cAAW;AAAA,IACX,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAEA,gBAAAA,QAAA,cAACF,cAAA,EAAY,MAAM,IAAI,eAAY,QAAO;AAC5C;AAGF,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,MAAmB;AACjB,QAAM,cAAc,MAAM,QAAQ,KAAK;AACvC,SACE,gBAAAE,QAAA,cAAAA,QAAA,gBACG,QACC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MAEC,MACE,YAAY,WAAW,YAAY,YAAY,UAAU;AAAA,MAE3D,WAAW;AAAA,QACT,eAAe,EAAE,SAAS,SAAS,CAAC;AAAA,QACpC;AAAA,QACA,aAAa,SACX,QACA;AAAA,QACF,aAAa,YACX,QACA;AAAA,QACF,aAAa,YACX,QACA;AAAA,MACJ;AAAA;AAAA,IAEA,gBAAAA,QAAA,cAAC,SAAI,WAAU,cACZ,WACC,eAAe,KACb,gBAAAA,QAAA,cAAC,SAAI,WAAU,sBACb,gBAAAA,QAAA,cAAC,eAAY,SAAkB,GAC/B,gBAAAA,QAAA,cAAC,UAAK,WAAU,0CACb,QACH,GACA,gBAAAA,QAAA,cAAC,eAAY,SAAS,aAAa,WAAU,eAAc,CAC7D,IAEA,gBAAAA,QAAA,cAAC,SAAI,WAAU,MACb,gBAAAA,QAAA,cAAC,aAAQ,WAAU,sBACjB,gBAAAA,QAAA,cAAC,eAAY,SAAkB,GAC/B,gBAAAA,QAAA,cAAC,SAAI,WAAU,yBACb,gBAAAA,QAAA,cAAC,UAAK,WAAU,8CACb,WACH,GACA,gBAAAA,QAAA,cAAC,OAAE,WAAU,gCAA8B,QAAS,CACtD,CACF,GACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA;AAAA,IACZ,CACF,IAGF,gBAAAA,QAAA,cAAC,SAAI,WAAU,UACb,gBAAAA,QAAA,cAAC,aAAQ,WAAU,uBACjB,gBAAAA,QAAA,cAAC,OAAE,WAAU,wCACV,WACH,CACF,GACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA;AAAA,IACZ,GACA,gBAAAA,QAAA,cAAC,OAAE,WAAU,gCAA8B,QAAS,CACtD,CAEJ;AAAA,EACF,CAEJ;AAEJ;AAEA,IAAO,iBAAQ;;;AC3Mf,OAAOE,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;AASxC,IAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA,OAAO;AACT,MAAM;AACJ,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAmB,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3E,QAAM,YAAYC,SAAuC,CAAC,CAAC;AAE3D,QAAM,eAAe,CACnB,GACA,QACG;AArBP;AAsBI,QAAI,QAAQ,EAAE,OAAO;AACrB,QAAI,SAAS,SAAU,SAAQ,MAAM,QAAQ,OAAO,EAAE;AACtD,QAAI,CAAC,MAAO;AAEZ,UAAM,SAAS,CAAC,GAAG,SAAS;AAC5B,WAAO,GAAG,IAAI,MAAM,CAAC;AACrB,iBAAa,MAAM;AACnB,aAAS,OAAO,KAAK,EAAE,CAAC;AAExB,QAAI,MAAM,SAAS,EAAG,iBAAU,QAAQ,MAAM,CAAC,MAAzB,mBAA4B;AAAA,EACpD;AAEA,QAAM,gBAAgB,CACpB,GACA,QACG;AArCP;AAsCI,QAAI,EAAE,QAAQ,aAAa;AACzB,UAAI,UAAU,GAAG,GAAG;AAClB,cAAM,SAAS,CAAC,GAAG,SAAS;AAC5B,eAAO,GAAG,IAAI;AACd,qBAAa,MAAM;AACnB,iBAAS,OAAO,KAAK,EAAE,CAAC;AAAA,MAC1B,WAAW,MAAM,GAAG;AAClB,wBAAU,QAAQ,MAAM,CAAC,MAAzB,mBAA4B;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,MAA8C;AAlDrE;AAmDI,MAAE,eAAe;AACjB,QAAI,YAAY,EAAE,cAAc,QAAQ,MAAM;AAC9C,QAAI,SAAS,SAAU,aAAY,UAAU,QAAQ,OAAO,EAAE;AAC9D,UAAM,SAAS,UACZ,MAAM,EAAE,EACR,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAC7B,MAAM,GAAG,MAAM;AAClB,iBAAa,MAAM;AACnB,aAAS,OAAO,KAAK,EAAE,CAAC;AACxB,oBAAU,QAAQ,KAAK,IAAI,UAAU,QAAQ,SAAS,CAAC,CAAC,MAAxD,mBAA2D;AAAA,EAC7D;AAEA,SACE,gBAAAC,QAAA,cAAC,SAAI,WAAU,6BACZ,MAAM,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,QAC9B,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,WAAW,SAAS,WAAW,YAAY;AAAA,MAC3C,WAAW;AAAA,MACX,OAAO,UAAU,GAAG;AAAA,MACpB,UAAU,CAAC,MAAM,aAAa,GAAG,GAAG;AAAA,MACpC,WAAW,CAAC,MAAM,cAAc,GAAG,GAAG;AAAA,MACtC,SAAS;AAAA,MACT,KAAK,CAAC,OAAO;AACX,kBAAU,QAAQ,GAAG,IAAI,MAAM;AAAA,MACjC;AAAA,MACA,WAAU;AAAA;AAAA,EACZ,CACD,CACH;AAEJ;AAEA,IAAO,mBAAQ;;;ACpFf,OAAOC,WAAS,UAAAC,UAAQ,YAAAC,kBAAgB;AAExC;AAAA,EACE;AAAA,EACA;AAAA,EACA,oBAAAC;AAAA,EACA;AAAA,EACA,qBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,eAAAC;AAAA,OACK;AAiBP,IAAMC,aACJ;AAGF,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,aAA6C,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,eAAe;AACjB,MAAM;AACJ,QAAM,aAAa,KAAK,KAAK,QAAQ,WAAW;AAEhD,QAAM,sBAAsB,MAAM;AAChC,iBAAa,OAAO,CAAC;AAAA,EACvB;AAEA,QAAM,sBAAsB,MAAM;AAChC,iBAAa,OAAO,CAAC;AAAA,EACvB;AACA,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,KAAK;AACpD,QAAM,aAAaC,SAA0B,IAAI;AAEjD,QAAM,oBAAoB,CACxB,WACG;AAhEP;AAiEI,QAAI,OAAO,WAAW,UAAU;AAC9B,0BAAoB,MAAM;AAAA,IAC5B,OAAO;AACL,0BAAoB,OAAO,KAAK;AAAA,IAClC;AACA,mBAAe,KAAK;AAEpB,qBAAW,YAAX,mBAAoB;AAAA,EACtB;AAIA,QAAM,iBAAiB,yDAAoB;AAAA,IACzC,CAAC,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE,WAAW;AAAA;AAEnD,QAAM,gBACJ,mBAAmB,SACf,cACA,OAAO,mBAAmB,WACxB,iBACA,eAAe;AAEvB,QAAM,gBAAgB,cAAc,IAAI,cAAc;AACtD,QAAM,aAAa,UAAU,IAAI,IAAI,OAAO,gBAAgB;AAC5D,QAAM,WAAW,KAAK,IAAI,QAAQ,OAAO,KAAK,aAAa;AAE3D,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW;AAAA;AAAA,QAET;AAAA,QACA,YAAY,aACV;AAAA,QACF;AAAA,MACF;AAAA;AAAA,IAEA,gBAAAA,QAAA,cAAC,aAAQ,WAAU,iDAChB,iBACC,gBAAAA,QAAA,cAAC,OAAE,WAAU,mBACX,gBAAAA,QAAA,cAAC,UAAK,WAAU,8CACb,KACH,GAAQ,KACP,iBAAiB,OACpB,GAED,gBACC,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACb,gBAAAA,QAAA,cAAC,UAAK,WAAU,mBAAgB,gBAAc,GAC9C,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,WAAW,CAAC,MAAM;AArHhC;AAsHgB,cAAI,EAAE,QAAQ,YAAY,aAAa;AACrC,2BAAe,KAAK;AACpB,6BAAW,YAAX,mBAAoB;AAAA,UACtB;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,cAAY,mBAAmB,aAAa;AAAA,UAC5C,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACAH;AAAA,YACA,eAAe;AAAA,UACjB;AAAA,UACA,SAAS,MAAM,eAAe,CAAC,WAAW;AAAA;AAAA,QAEzC;AAAA,QACA,CAAC,cACA,gBAAAG,QAAA;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACd,IAEA,gBAAAD,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACd;AAAA,MAEJ;AAAA,MACC,eACC,gBAAAA,QAAA,cAAC,SAAI,WAAU,8GACZ,yDAAoB,IAAI,CAAC,QAAQ,UAAU;AAC1C,cAAM,QACJ,OAAO,WAAW,WAAW,SAAS,OAAO;AAC/C,cAAM,aAAa,UAAU;AAE7B,eACE,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,gBAAc,aAAa,SAAS;AAAA,YACpC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,aACI,iDACA;AAAA,YACN;AAAA,YACA,SAAS,MAAM,kBAAkB,MAAM;AAAA;AAAA,UAEtC,OAAO,WAAW,WAAW,SAAS,OAAO;AAAA,UAC7C,cACC,gBAAAA,QAAA,cAACE,cAAA,EAAY,MAAM,IAAI,eAAY,QAAO;AAAA,QAE9C;AAAA,MAEJ,EACF;AAAA,IAEJ,CACF,CAEJ;AAAA,IACA,gBAAAF,QAAA,cAAC,aAAQ,WAAU,iDAChB,YAAY,YACX,gBAAAA,QAAA,cAAAA,QAAA,gBACE,gBAAAA,QAAA,cAAC,UAAK,WAAU,iDACd,gBAAAA,QAAA,cAAC,UAAK,WAAU,iCACb,YAAW,UAAE,QAChB,GAAQ,KAAI,OACR,KACN,GACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA;AAAA,IACZ,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,2CACb,gBAAAA,QAAA,cAAC,cAAK,MAAI,GACV,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,OAAO,OAAO;AAAA,QACd,UAAU,CAAC,MAAM,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC;AAAA,QAC9D,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEC,aAAa,KACZ,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,CAAC,GAAG,UAC7B,gBAAAA,QAAA,cAAC,YAAO,KAAK,QAAQ,GAAG,OAAO,QAAQ,KACpC,QAAQ,CACX,CACD;AAAA,IACL,GACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,kBAAe,OACzB,aAAa,IAAI,aAAa,CACpC,CACF,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACb,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,QAAO;AAAA,QACP,WAAW,gBAAAA,QAAA,cAAC,mBAAgB,MAAM,IAAI;AAAA,QACtC,SAAS;AAAA,QACT,UAAU,SAAS;AAAA,QACnB,cAAW;AAAA,QACX,WAAU;AAAA;AAAA,MAGV,gBAAAA,QAAA,cAAC,UAAK,WAAU,sBAAmB,UAAQ;AAAA,IAC7C,GACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,QAAO;AAAA,QACP,SAAS,gBAAAA,QAAA,cAAC,oBAAiB,MAAM,IAAI;AAAA,QACrC,SAAS;AAAA,QACT,UAAU,SAAS,aAAa;AAAA,QAChC,cAAW;AAAA,QACX,WAAU;AAAA;AAAA,MAEV,gBAAAA,QAAA,cAAC,UAAK,WAAU,sBAAmB,MAAI;AAAA,IACzC,CACF,CACF,IAEA,gBAAAA,QAAA,cAAAA,QAAA,gBACE,gBAAAA,QAAA,cAAC,SAAI,WAAU,kDAEb,gBAAAA,QAAA,cAAC,UAAK,WAAU,gBAAe,aAAU,YACvC,gBAAAA,QAAA,cAAC,UAAK,WAAU,iCAA+B,OAAO,CAAE,GAAQ,KAAI,OAChE,aAAa,IAAI,aAAa,CACpC,CACF,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACb,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,SAAS;AAAA,QACT,UAAU,SAAS;AAAA,QACnB,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAA,QAAA,cAACG,mBAAA,EAAiB,MAAM,IAAI,eAAY,QAAO;AAAA,IACjD,GAEA,gBAAAH,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,SAAS;AAAA,QACT,UAAU,SAAS,aAAa;AAAA,QAChC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAA,QAAA,cAACI,oBAAA,EAAkB,MAAM,IAAI,eAAY,QAAO;AAAA,IAClD,CACF,CACF,CAEJ;AAAA,EACF;AAEJ;AAEA,IAAO,qBAAQ;;;AC5Sf,OAAOC,aAAW;AAUlB,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,YAAY,KAAK,IAAI,KAAK,IAAI,GAAG,QAAQ,GAAG,GAAG;AACrD,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,yBAAyB,UACrB,4BACA,yBAAyB,SACvB,4BACA;AAAA,MACR;AAAA;AAAA,IAEA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,yBAAyB,SACrB,4CACA,yBAAyB,QACvB,4BACA;AAAA,QACR;AAAA;AAAA,MAEC;AAAA,IACH;AAAA,IACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,MAAK;AAAA,QAGL,cAAY,gBAAgB;AAAA,QAC5B,iBAAe,KAAK,MAAM,SAAS;AAAA,QACnC,iBAAe;AAAA,QACf,iBAAe;AAAA;AAAA,MAEf,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA;AAAA,YAEA;AAAA,UACF;AAAA,UACA,OAAO,EAAE,OAAO,GAAG,SAAS,IAAI;AAAA;AAAA,MACjC;AAAA,IACH;AAAA,IACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,yBAAyB,WACrB,4BACA,yBAAyB,QACvB,WACA,yBAAyB,UACvB,gDACA;AAAA,QACV;AAAA;AAAA,MAEC;AAAA,IACH;AAAA,EACF;AAEJ;AAEA,IAAO,mBAAQ;;;AC/Ef,OAAOC,WAA8B,cAAAC,oBAAkB;AAEvD,SAAS,OAAAC,YAAyB;AAoBlC,IAAMC,iBAAgB;AAAA,EACpB,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AAAA,EACF,SACE;AAAA,EACF,SACE;AAAA,EACF,MAAM;AAAA,EACN,UACE;AAAA,EACF,WACE;AAAA,EACF,QACE;AAAA,EACF,QACE;AAAA,EACF,QACE;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QACE;AACJ;AAEA,IAAM,gBAAgBD,KAAI,IAAI;AAAA,EAC5B,UAAU;AAAA;AAAA,IAER,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA;AAAA,IAEA,QAAQC;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF,CAAC;AAED,IAAM,QAAQC;AAAA,EACZ,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE,gBAAAC,QAAA,cAAC,SAAI,WAAU,sDACb,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL,gBAAc;AAAA,QACd,MAAK;AAAA,QACL,WAAW;AAAA;AAAA,UAET;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA,UACA,cAAc,EAAE,MAAM,QAAQ,UAAU,CAAC;AAAA,QAC3C;AAAA;AAAA,IACF,GACA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAW;AAAA,UACT;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,QAAQ;AAAA,QACnB;AAAA;AAAA,IACD,CACH;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;AACpB,IAAO,gBAAQ;;;AC7Hf,OAAOC,WAAS,SAAAC,QAAO,UAAAC,UAAQ,YAAAC,kBAAgB;AAC/C;AAAA,EACE;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,OACK;;;ACjBP,OAAOC,aAAW;AAQlB,IAAM,YAAwD;AAAA,EAC5D,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACF;AAEA,IAAMC,WAAU,CAAC,EAAE,OAAO,MAAM,QAAQ,UAAU,MAAoB;AACpE,QAAM,YAAY,GAAG;AAAA,IACnB,WAAW,SAAS;AAAA,IACpB,WAAW,SAAS;AAAA,IACpB,aAAa,SAAS;AAAA,IACtB,aAAa,SAAS;AAAA,EACxB,CAAC;AAED,QAAM,iBAAiB,CAACC,WAAkB;AACxC,QAAI,UAAUA,MAAK,GAAG;AACpB,aAAO,UAAUA,MAAK;AAAA,IACxB;AACA,QAAIA,OAAM,WAAW,GAAG,GAAG;AACzB,aAAO;AAAA,QACL,IAAIA;AAAA,QACJ,IAAI,GAAGA,MAAK;AAAA,MACd;AAAA,IACF;AACA,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,cAAc,eAAe,KAAK;AAExC,SACE,gBAAAC,QAAA,cAAC,SAAI,WAAW,GAAG,YAAY,SAAS,KACtC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,CAAC,mBAA0B,GAAG,YAAY;AAAA,QAC1C,CAAC,mBAA0B,GAAG,YAAY;AAAA,MAC5C;AAAA;AAAA,EACF,CACF;AAEJ;AAEA,IAAO,kBAAQF;;;ADpCf,IAAM,cAAcG,QAAM,KAAK,SAASC,eAAc;AACpD,SACE,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA;AAAA,IAEL,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA,IACA,gBAAAA,QAAA,cAAC,OAAE,QAAO,8BACR,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP,CACF;AAAA,IACA,gBAAAA,QAAA,cAAC,cACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,+BAA4B;AAAA;AAAA,MAE5B,gBAAAA,QAAA,cAAC,aAAQ,iBAAc,KAAI,QAAO,sBAAqB;AAAA,MACvD,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAO;AAAA,UACP,QAAO;AAAA;AAAA,MACT;AAAA,MACA,gBAAAA,QAAA,cAAC,cAAS,IAAG,WAAU,IAAG,UAAS;AAAA,MACnC,gBAAAA,QAAA,cAAC,oBAAe,cAAa,WAAU;AAAA,MACvC,gBAAAA,QAAA,cAAC,iBAAY,KAAI,aAAY,UAAS,OAAM;AAAA,MAC5C,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACT;AAAA,MACA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAI;AAAA,UACJ,QAAO;AAAA;AAAA,MACT;AAAA,MACA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,IAAG;AAAA,UACH,KAAI;AAAA,UACJ,QAAO;AAAA;AAAA,MACT;AAAA,IACF,CACF;AAAA,EACF;AAEJ,CAAC;AAuCD,IAAM,qBAAqB,CAAC,UAAkB,aAAqB;AAxHnE;AAyHE,QAAM,cAAY,cAAS,MAAM,GAAG,EAAE,IAAI,MAAxB,mBAA2B,kBAAiB;AAG9D,MACE,SAAS,WAAW,QAAQ,KAC5B,CAAC,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,KAAK,EAAE,SAAS,SAAS,GACtE;AACA,WAAO,gBAAAA,QAAA,cAACE,cAAA,EAAY,WAAU,sBAAqB;AAAA,EACrD;AAGA,MACE,SAAS,WAAW,QAAQ,KAC5B,CAAC,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,SAAS,GAC/C;AACA,WAAO,gBAAAF,QAAA,cAACG,eAAA,EAAa,WAAU,sBAAqB;AAAA,EACtD;AAGA,MACE,SAAS,WAAW,QAAQ,KAC5B,CAAC,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,SAAS,GACtD;AACA,WAAO,gBAAAH,QAAA,cAACI,cAAA,EAAY,WAAU,sBAAqB;AAAA,EACrD;AAGA,MACE,SAAS,SAAS,OAAO,KACzB,CAAC,OAAO,QAAQ,OAAO,OAAO,KAAK,EAAE,SAAS,SAAS,GACvD;AACA,WAAO,gBAAAJ,QAAA,cAACK,mBAAA,EAAiB,WAAU,sBAAqB;AAAA,EAC1D;AAGA,MACE,SAAS,SAAS,MAAM,KACxB,CAAC,OAAO,QAAQ,OAAO,KAAK,EAAE,SAAS,SAAS,GAChD;AACA,WAAO,gBAAAL,QAAA,cAACM,kBAAA,EAAgB,WAAU,sBAAqB;AAAA,EACzD;AAGA,MAAI,CAAC,QAAQ,QAAQ,OAAO,MAAM,EAAE,SAAS,SAAS,GAAG;AACvD,WAAO,gBAAAN,QAAA,cAACO,iBAAA,EAAe,WAAU,sBAAqB;AAAA,EACxD;AAGA,MACE,SAAS,SAAS,KAAK,KACvB,CAAC,OAAO,OAAO,MAAM,OAAO,IAAI,EAAE,SAAS,SAAS,GACpD;AACA,WAAO,gBAAAP,QAAA,cAACQ,gBAAA,EAAc,WAAU,sBAAqB;AAAA,EACvD;AAGA,MAAI,aAAa,qBAAqB,cAAc,OAAO;AACzD,WAAO,gBAAAR,QAAA,cAACS,iBAAA,EAAe,WAAU,sBAAqB;AAAA,EACxD;AAGA,SAAO,gBAAAT,QAAA,cAACU,aAAA,EAAW,WAAU,sBAAqB;AACpD;AAEe,SAAR,kBAAmC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb;AACF,GAA2B;AACzB,QAAM,WAAWC,SAAyB,IAAI;AAC9C,QAAM,UAAUC,OAAM;AACtB,QAAM,CAAC,YAAY,aAAa,IAAIC,WAAS,KAAK;AAClD,QAAM,gBAAgBF,SAA4B,oBAAI,IAAI,CAAC;AAC3D,QAAM,iBAAiBA,SAA4B,oBAAI,IAAI,CAAC;AAC5D,QAAM,cAAcA,SAAO,CAAC;AAE5B,QAAM,aAAa,CAAC,UAAmB;AACrC,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,EACpC;AAEA,QAAM,mBAAmB,CAAC,WAA0B;AAClD,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,MAAM,gBAAAX,QAAA,cAAC,mBAAQ,MAAK,MAAK,OAAM,QAAO;AAAA,UACtC,YAAY;AAAA,QACd;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,MAAM,gBAAAA,QAAA,cAACc,cAAA,EAAY,WAAU,sBAAqB;AAAA,UAClD,YAAY;AAAA,QACd;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,MAAM,gBAAAd,QAAA,cAACe,cAAA,EAAY,WAAU,sBAAqB;AAAA,UAClD,YAAY;AAAA,QACd;AAAA,MACF;AACE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,MAAM;AAAA,UACN,YAAY;AAAA,QACd;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,WAA0B;AAClD,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAGA,QAAM,kBAAkB,CAAC,SAAqB;AA3QhD;AA4QI,UAAM,WAAW,KAAK,UAAQ,UAAK,SAAL,mBAAW,SAAQ;AACjD,UAAM,aAAW,UAAK,SAAL,mBAAW,SAAQ;AACpC,WAAO,YAAY,UAAU,QAAQ;AAAA,EACvC;AAGA,QAAM,eAAef,QAAM;AAAA,IACzB,OAAO,SAAqB;AAC1B,UACE,CAAC,KAAK,QACN,CAAC,YACD,KAAK,WAAW,aAChB,KAAK,WAAW,aAChB;AACA;AAAA,MACF;AAEA,UAAI;AAEF,YAAI,cAAc;AAChB,uBAAa,KAAK,IAAI,EAAE,QAAQ,aAAa,UAAU,EAAE,CAAC;AAAA,QAC5D;AAGA,uBAAe,QAAQ,OAAO,KAAK,EAAE;AAGrC,cAAM,aAAa,MAAM,SAAS,KAAK,MAAM,CAAC,aAAqB;AAEjE,gBAAM,kBAAkB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC3D,yBAAe,QAAQ,IAAI,KAAK,IAAI,eAAe;AAEnD,cAAI,cAAc;AAChB,yBAAa,KAAK,IAAI;AAAA,cACpB,UAAU;AAAA,cACV,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAGD,YAAI,cAAc;AAChB,uBAAa,KAAK,IAAI;AAAA,YACpB,UAAU;AAAA,YACV,QAAQ;AAAA,YACR;AAAA,UACF,CAAC;AAAA,QACH;AAGA,uBAAe,QAAQ,OAAO,KAAK,EAAE;AAAA,MACvC,SAAS,OAAO;AACd,gBAAQ,MAAM,iBAAiB,KAAK;AACpC,YAAI,cAAc;AAChB,uBAAa,KAAK,IAAI;AAAA,YACpB,UAAU;AAAA,YACV,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,uBAAe,QAAQ,OAAO,KAAK,EAAE;AAAA,MACvC;AAAA,IACF;AAAA,IACA,CAAC,UAAU,YAAY;AAAA,EACzB;AAGA,QAAM,qBAAqB,CAAC,SAAqB;AAE/C,QAAI,KAAK,WAAW,UAAW,QAAO;AAGtC,QAAI,KAAK,WAAW,QAAS,QAAO;AAGpC,WAAO,eAAe,QAAQ,IAAI,KAAK,EAAE,KAAK,KAAK,YAAY;AAAA,EACjE;AAGA,QAAM,cAAc,CAAC,OAAe;AAClC,UAAM,OAAO,MAAM,KAAK,CAACgB,UAAqBA,MAAK,OAAO,EAAE;AAC5D,QAAI,QAAQ,UAAU;AACpB,mBAAa,IAAI;AAAA,IACnB,WAAW,SAAS;AAClB,cAAQ,EAAE;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,eAAe,CAAC,OAAe;AAEnC,QAAI,cAAc,QAAQ,IAAI,EAAE,GAAG;AACjC,YAAM,MAAM,cAAc,QAAQ,IAAI,EAAE;AACxC,UAAI,IAAK,KAAI,gBAAgB,GAAG;AAChC,oBAAc,QAAQ,OAAO,EAAE;AAAA,IACjC;AAGA,mBAAe,QAAQ,OAAO,EAAE;AAGhC,QAAI,UAAU;AACZ,eAAS,EAAE;AAAA,IACb;AAAA,EACF;AAGA,QAAM,eAAe,MAAG;AAtX1B;AAsX6B,0BAAS,YAAT,mBAAkB;AAAA;AAE7C,QAAM,iBAAiB,CAAC,UAAkB;AACxC,UAAM,QAAgB,CAAC;AACvB,UAAM,WAA6C,CAAC;AACpD,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,OAAO,YAAY,OAAO,MAAM;AACvC,iBAAS,KAAK,EAAE,MAAM,QAAQ,WAAW,SAAS,WAAW,CAAC;AAAA,MAChE,OAAO;AACL,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AACA,WAAO,EAAE,OAAO,SAAS;AAAA,EAC3B;AAEA,QAAM,oBAAoB,CAAC,MAA2C;AACpE,UAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,SAAS,CAAC,CAAC;AAC7C,QAAI,MAAM,WAAW,EAAG;AAExB,UAAM,EAAE,OAAO,SAAS,IAAI,eAAe,KAAK;AAChD,QAAI,SAAS,SAAS,EAAG,gDAAgB;AACzC,QAAI,MAAM,SAAS,EAAG,YAAW,WAAW,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,MAAE,OAAO,QAAQ;AAAA,EACnB;AAEA,QAAM,aAAa,CAAC,MAAyC;AAC3D,MAAE,eAAe;AACjB,gBAAY,UAAU;AACtB,kBAAc,KAAK;AACnB,QAAI,SAAU;AAEd,UAAM,QAAQ,MAAM,KAAK,EAAE,aAAa,KAAK;AAC7C,QAAI,MAAM,WAAW,EAAG;AAExB,UAAM,EAAE,OAAO,SAAS,IAAI,eAAe,KAAK;AAChD,QAAI,SAAS,SAAS,EAAG,gDAAgB;AACzC,QAAI,MAAM,SAAS,EAAG,YAAW,WAAW,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,EAChE;AAEA,QAAM,kBAAkB,CAAC,MAAyC;AAChE,MAAE,eAAe;AACjB,QAAI,SAAU;AACd,gBAAY,WAAW;AACvB,kBAAc,IAAI;AAAA,EACpB;AAGA,QAAM,iBAAiB,CAAC,MAAyC;AAC/D,MAAE,eAAe;AACjB,QAAI,CAAC,SAAU,eAAc,IAAI;AAAA,EACnC;AAEA,QAAM,kBAAkB,CAAC,MAAyC;AAChE,MAAE,eAAe;AACjB,gBAAY,WAAW;AACvB,QAAI,YAAY,WAAW,GAAG;AAC5B,kBAAY,UAAU;AACtB,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,QAAE,eAAe;AACjB,mBAAa;AAAA,IACf;AAAA,EACF;AAGA,EAAAhB,QAAM,UAAU,MAAM;AACpB,QAAI,cAAc,UAAU;AAC1B,YAAM,QAAQ,CAAC,SAAqB;AAClC,YAAI,KAAK,WAAW,UAAU,KAAK,MAAM;AACvC,uBAAa,IAAI;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,UAAU,YAAY,CAAC;AAG9C,EAAAA,QAAM,UAAU,MAAM;AACpB,UAAM,WAAW,+CAAe;AAChC,WAAO,MAAM;AACX,2CAAU,QAAQ,CAAC,QAAgB,2BAAK,gBAAgB;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAA,QAAA,cAAC,SAAI,WAAW,UAAU,SAAS,MACjC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA;AAAA,EACF,GACA,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,MAAK;AAAA,MACL;AAAA,MACA,cAAY,UAAU,WAAW,WAAW,UAAU;AAAA,MACtD,WAAW;AAAA,QACT;AAAA,QACA,aACI,+BACA;AAAA,QACJ,YAAY;AAAA,MACd;AAAA;AAAA,IAEA,gBAAAA,QAAA,cAAC,SAAI,WAAU,yCACb,gBAAAA,QAAA,cAAC,aACC,gBAAAA,QAAA,cAAC,OAAE,WAAU,2BAAwB,sBAEnC,gBAAAA,QAAA,cAAC,UAAK,WAAU,yCAAsC,QAEtD,GAAQ,KACR,gBAAAA,QAAA,cAAC,UAAG,CACN,CACF,CACF;AAAA,EACF,GACA,gBAAAA,QAAA,cAAC,UAAK,WAAU,aACb,YAAY,qCAAqC,SAAS,IAC7D,GAGA,gBAAAA,QAAA,cAAC,SAAI,WAAU,8BACZ,+BAAO,IAAI,CAAC,SAAqB;AA/f1C;AAggBU,UAAM,WAAW,mBAAmB,IAAI;AACxC,UAAM,aAAa,iBAAiB,KAAK,MAAM;AAC/C,UAAM,gBAAgB,iBAAiB,6BAAM,MAAM;AACnD,UAAM,WAAW,gBAAgB,IAAI;AACrC,WACE,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,6BAAM;AAAA,QACX,WAAU;AAAA;AAAA,MAEV,gBAAAA,QAAA,cAAC,SAAI,WAAU,iEACb,gBAAAA,QAAA,cAAC,SAAI,WAAU,mDACb,gBAAAA,QAAA,cAAC,iBAAY,CACf,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,8FACZ,QACH,CACF;AAAA,MAEA,gBAAAA,QAAA,cAAC,SAAI,WAAU,oBACb,gBAAAA,QAAA,cAAC,SAAI,WAAU,iDACb,gBAAAA,QAAA,cAAC,SAAI,WAAU,aACb,gBAAAA,QAAA,cAAC,QAAG,WAAU,iDACX,6BAAM,WAAQ,UAAK,SAAL,mBAAW,SAAQ,cACpC,GACC,gBACC,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,aAAU;AAAA;AAAA,QAET,YAAW,6BAAM,WAAQ,UAAK,SAAL,mBAAW,KAAI;AAAA,QACxC,WAAW,QACV,gBAAAA,QAAA,cAAC,SAAI,WAAU,+CACZ,yCAAY,eACX,gBAAAA,QAAA,cAAAA,QAAA,gBACG,WAAW,MACZ,gBAAAA,QAAA,cAAC,UAAK,WAAW,WAAW,SACzB,WAAW,IACd,CACF,IAEA,gBAAAA,QAAA,cAAAA,QAAA,gBACE,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,0DACT,yCAAY,WAAU,iBAClB,gBACA,yCAAY,WAAU,mBACpB,iBACA,aACR;AAAA;AAAA,UAEC,yCAAY;AAAA,QACf,GACA,gBAAAA,QAAA,cAAC,UAAK,WAAW,WAAW,SACzB,yCAAY,IACf,CACF,CAEJ;AAAA,MAEJ,CAEJ,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BAEb,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BAEZ,cAAa,6BAAM,YAAW,aAC7B,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,UAAU,KAAK,EAAE;AAAA,UAChC,WAAU;AAAA,UACV,OAAM;AAAA;AAAA,QAEN,gBAAAA,QAAA,cAAC,aAAU,MAAM,IAAI;AAAA,MACvB,IAED,6BAAM,YAAW,WAChB,gBAAAA,QAAA,cAAAA,QAAA,gBAEE,gBAAAA,QAAA,cAAC,UAAK,WAAU,4BACd,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,QAAO;AAAA,UACP,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAS,MAAM,YAAY,6BAAM,EAAE;AAAA,UACnC,WAAU;AAAA;AAAA,QAEV,gBAAAA,QAAA,cAAC,iBAAc,MAAM,IAAI;AAAA,QAAE;AAAA,MAE7B,CACF,GAGA,gBAAAA,QAAA,cAAC,UAAK,WAAU,eACd,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,QAAO;AAAA,UACP,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAS,MAAM,YAAY,6BAAM,EAAE;AAAA,UACnC,WAAU;AAAA;AAAA,QAEV,gBAAAA,QAAA,cAAC,iBAAc,MAAM,IAAI;AAAA,MAC3B,CACF,CACF,GAIF,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,KAAK,EAAE;AAAA,UACnC,WAAU;AAAA,UACV,OAAM;AAAA;AAAA,QAEN,gBAAAA,QAAA,cAAC,oBAAiB,MAAM,IAAI;AAAA,MAC9B,CACF,CACF,CACF,GAEA,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACb,gBAAAA,QAAA,cAAC,SAAI,WAAU,YACb,gBAAAA,QAAA,cAAC,SAAI,WAAU,yDACb,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,4DAA4D,aAAa;AAAA,UACpF,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI;AAAA;AAAA,MACjC,CACF,CACF,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,2CACZ,KAAK,WAAW,UACb,QACA,KAAK,WAAW,YACd,SACA,GAAG,KAAK,MAAM,QAAQ,CAAC,GAC/B,CACF,CACF;AAAA,IACF;AAAA,EAEJ,EACF,CACF;AAEJ;;;AEjpBA,OAAOiB,WAAS,eAAAC,cAAa,aAAAC,aAAW,SAAAC,QAAO,WAAAC,UAAS,UAAAC,UAAQ,YAAAC,kBAAgB;AAChF,SAAS,oBAAAC,mBAAkB,eAAAC,cAAa,eAAAC,oBAAmB;AAiD3D,IAAM,UAAU,CAAC,MAAoD,aAAa;AAElF,IAAMC,aACJ;AAEF,IAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,oBAAoB;AACtB,MAAmB;AACjB,QAAM,UAAUC,OAAM;AACtB,QAAM,YAAY,MAAM,UAAU,OAAO;AACzC,QAAM,SAAS,GAAG,SAAS;AAE3B,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAiC,YAAY;AACvE,QAAM,UAAU,UAAU,SAAY,QAAQ;AAE9C,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,KAAK;AACtC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,EAAE;AAEvC,QAAM,UAAUC,SAAuB,IAAI;AAC3C,QAAM,aAAaA,SAA0B,IAAI;AACjD,QAAM,UAAUA,SAAuB,IAAI;AAC3C,QAAM,QAAQA,SAAO,EAAE,MAAM,IAAI,OAAO,EAA8C,CAAC;AAGvF,QAAM,OAAOC,SAAQ,MAAM;AACzB,UAAM,MAAmE,CAAC;AAC1E,YAAQ,QAAQ,CAAC,MAAM;AACrB,UAAI,QAAQ,CAAC,EAAG,GAAE,QAAQ,QAAQ,CAAC,KAAK,MAAM,IAAI,KAAK,EAAE,QAAQ,KAAK,OAAO,EAAE,OAAO,OAAO,MAAM,EAAE,CAAC,CAAC;AAAA,UAClG,KAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,gBAAgB,KAAK,UAAU,CAAC,MAAM,EAAE,OAAO,UAAU,OAAO;AACtE,QAAM,WAAW,iBAAiB,IAAI,KAAK,aAAa,EAAE,SAAS;AAEnE,QAAM,cAAcC;AAAA,IAClB,CAAC,OAAe,QAAgB;AAC9B,eAAS,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAK,KAAI,CAAC,KAAK,CAAC,EAAE,OAAO,SAAU,QAAO;AAC9F,aAAO;AAAA,IACT;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,SAAS,CAAC,QAA6B;AAC3C,UAAM,OAAO,MAAM,IAAI,QAAQ;AAC/B,QAAI,UAAU,OAAW,UAAS,IAAI;AACtC,yCAAW,MAAM;AAAA,EACnB;AAEA,QAAM,QAAQA,aAAY,CAAC,cAAc,SAAS;AArHpD;AAsHI,YAAQ,KAAK;AACb,QAAI,YAAa,kBAAW,YAAX,mBAAoB;AAAA,EACvC,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,CAAC,OAAgB;AAChC,QAAI,SAAU;AACd,UAAM,QAAQ,OAAO,iBAAiB,IAAI,gBAAgB,YAAY,GAAG,CAAC;AAC1E,cAAU,KAAK;AACf,YAAQ,IAAI;AAAA,EACd;AAEA,QAAM,OAAO,CAAC,MAAc;AAC1B,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,CAAC,KAAK,EAAE,OAAO,SAAU;AAC7B,WAAO,EAAE,MAAM;AACf,UAAM;AAAA,EACR;AAEA,EAAAC,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,CAAC,MAAkB;AA1ItC;AA2IM,UAAI,GAAC,aAAQ,YAAR,mBAAiB,SAAS,EAAE,SAAiB,OAAM,KAAK;AAAA,IAC/D;AACA,aAAS,iBAAiB,aAAa,MAAM;AAC7C,WAAO,MAAM,SAAS,oBAAoB,aAAa,MAAM;AAAA,EAC/D,GAAG,CAAC,MAAM,KAAK,CAAC;AAGhB,EAAAA,YAAU,MAAM;AAlJlB;AAmJI,QAAI,CAAC,QAAQ,SAAS,EAAG;AACzB,UAAM,MAAK,aAAQ,YAAR,mBAAiB,cAA2B,gBAAgB,MAAM;AAC7E,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,MAAM,CAAC,KAAM;AAClB,QAAI,GAAG,YAAY,KAAK,UAAW,MAAK,YAAY,GAAG;AAAA,aAC9C,GAAG,YAAY,GAAG,eAAe,KAAK,YAAY,KAAK;AAC9D,WAAK,YAAY,GAAG,YAAY,GAAG,eAAe,KAAK;AAAA,EAC3D,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,EAAAA,YAAU,MAAM,MAAM,aAAa,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AAE3D,QAAM,YAAY,CAAC,MAA2B;AAC5C,QAAI,SAAU;AACd,UAAM,OAAO,CAAC,MAAc;AAC1B,UAAI,KAAK,GAAG;AACV,kBAAU,CAAC;AACX,YAAI,CAAC,KAAM,UAAS,CAAC;AAAA,MACvB;AAAA,IACF;AACA,YAAQ,EAAE,KAAK;AAAA,MACb,KAAK;AACH,UAAE,eAAe;AACjB,YAAI,CAAC,KAAM,UAAS;AAAA,YACf,MAAK,YAAY,SAAS,GAAG,CAAC,KAAK,IAAI,YAAY,SAAS,GAAG,CAAC,IAAI,MAAM;AAC/E;AAAA,MACF,KAAK;AACH,UAAE,eAAe;AACjB,YAAI,CAAC,KAAM,UAAS;AAAA,YACf,MAAK,YAAY,SAAS,GAAG,EAAE,KAAK,IAAI,YAAY,SAAS,GAAG,EAAE,IAAI,MAAM;AACjF;AAAA,MACF,KAAK;AACH,YAAI,MAAM;AAAE,YAAE,eAAe;AAAG,eAAK,YAAY,GAAG,CAAC,CAAC;AAAA,QAAG;AACzD;AAAA,MACF,KAAK;AACH,YAAI,MAAM;AAAE,YAAE,eAAe;AAAG,eAAK,YAAY,KAAK,SAAS,GAAG,EAAE,CAAC;AAAA,QAAG;AACxE;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,QAAQ,EAAE,EAAE,QAAQ,OAAO,MAAM,QAAQ,OAAO;AAClD,YAAE,eAAe;AACjB,eAAK,MAAM;AAAA,QACb,WAAW,CAAC,MAAM;AAChB,YAAE,eAAe;AACjB,mBAAS;AAAA,QACX;AACA;AAAA,MACF,KAAK;AACH,YAAI,MAAM;AAAE,YAAE,eAAe;AAAG,YAAE,gBAAgB;AAAG,gBAAM;AAAA,QAAG;AAC9D;AAAA,MACF,KAAK;AACH,YAAI,KAAM,SAAQ,KAAK;AACvB;AAAA,IACJ;AAEA,QAAI,EAAE,IAAI,WAAW,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ;AAC/D,mBAAa,MAAM,QAAQ,KAAK;AAChC,YAAM,QAAQ,QAAQ,EAAE,IAAI,YAAY;AACxC,YAAM,QAAQ,QAAQ,WAAW,MAAO,MAAM,QAAQ,OAAO,IAAK,GAAG;AACrE,YAAM,OAAO,MAAM,QAAQ;AAC3B,YAAM,OAAO,KAAK,WAAW,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,KAAK,IAAI,QAAQ,CAAC;AAC7E,YAAM,QAAQ,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC;AAClC,YAAM,UAAU,CAAC,GAAG,MAAM,MAAM,IAAI,GAAG,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAC9D,YAAM,MAAM,QAAQ;AAAA,QAClB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,YAAY,KAAK,CAAC,EAAE,OAAO,MAAM,YAAY,EAAE,WAAW,IAAI;AAAA,MACvF;AACA,UAAI,QAAQ,QAAW;AACrB,YAAI,CAAC,KAAM,UAAS,GAAG;AAAA,YAClB,WAAU,GAAG;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,UAAU,IAAI,GAAG,SAAS,QAAQ,MAAM,KAAK;AAEtE,SACE,gBAAAC,QAAA,cAAC,SAAI,KAAK,SAAS,WAAU,sCAC1B,QAAQ,gBAAAA,QAAA,cAAC,WAAM,MAAK,UAAS,MAAY,OAAO,WAAW,IAAI,GAEhE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,SAAS,OAAO,mBAAmB,SAAS,OAAO,mBAAmB;AAAA,QACtE,SAAS;AAAA,QACT;AAAA,MACF;AAAA;AAAA,KAEC,qCAAU,SACT,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAU,wCAChC,SAAS,IACZ;AAAA,IAEF,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,MAAK;AAAA,QACL;AAAA,QACA,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,OAAO,SAAS;AAAA,QAC/B,yBAAuB;AAAA,QACvB,cAAY;AAAA,QACZ,oBAAkB;AAAA,QAClB,gBAAc,SAAS;AAAA,QACvB,SAAS,MAAO,OAAO,MAAM,IAAI,SAAS;AAAA,QAC1C;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,WAAW,kBAAkB;AAAA,QAC/B;AAAA;AAAA,MAEC,WAAW,SAAS,QAAQ;AAAA,IAC/B;AAAA,IACC,aAAa,YAAY,CAAC,YACzB,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,SAAS,MAAM;AA9Q3B;AA+Qc,iBAAO,IAAI;AACX,2BAAW,YAAX,mBAAoB;AAAA,QACtB;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACAP;AAAA,QACF;AAAA;AAAA,MAEA,gBAAAO,QAAA,cAACC,cAAA,EAAY,MAAM,IAAI,eAAY,QAAO;AAAA,IAC5C;AAAA,IAEF,gBAAAD,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,eAAY;AAAA,QACZ,WAAW;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA;AAAA,IACF;AAAA,EACF,GAEC,QACC,gBAAAF,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,OAAO,EAAE,UAAU;AAAA,MACnB,WAAW;AAAA,QACT;AAAA,QACA,cAAc,QAAQ,qBAAqB;AAAA,MAC7C;AAAA;AAAA,IAEC,KAAK,WAAW,KAAK,gBAAAA,QAAA,cAAC,OAAE,WAAU,qCAAmC,SAAU;AAAA,IAC/E,KAAK,IAAI,CAAC,GAAG,MAAM;AAClB,YAAM,QAAQ,EAAE,OAAO,UAAU;AACjC,YAAM,WAAW,MAAM;AACvB,aACE,gBAAAA,QAAA,cAACA,QAAM,UAAN,EAAe,KAAK,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC,MACxC,EAAE,SAAS,EAAE,SACZ,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW;AAAA,YACT;AAAA,YACA,IAAI,KAAK;AAAA,UACX;AAAA;AAAA,QAEC,EAAE;AAAA,MACL,GAEF,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,GAAG,SAAS,QAAQ,CAAC;AAAA,UACzB,cAAY;AAAA,UACZ,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,iBAAe,EAAE,OAAO,YAAY;AAAA,UACpC,aAAa,MAAM,CAAC,EAAE,OAAO,YAAY,WAAW,KAAK,UAAU,CAAC;AAAA,UACpE,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,UACrC,SAAS,MAAM,KAAK,CAAC;AAAA,UACrB,WAAW;AAAA,YACT;AAAA,YACA,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,EAAE,OAAO,YAAY;AAAA,UACvB;AAAA;AAAA,QAEC,EAAE,OAAO,QACR,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAU,wCAChC,EAAE,OAAO,IACZ;AAAA,QAEF,gBAAAA,QAAA,cAAC,UAAK,WAAU,oBACd,gBAAAA,QAAA,cAAC,UAAK,WAAU,oBAAkB,EAAE,OAAO,KAAM,GAChD,EAAE,OAAO,eACR,gBAAAA,QAAA,cAAC,UAAK,WAAU,sDACb,EAAE,OAAO,WACZ,CAEJ;AAAA,QACC,SAAS,gBAAAA,QAAA,cAACG,cAAA,EAAY,MAAM,IAAI,eAAY,QAAO,WAAU,6BAA4B;AAAA,MAC5F,CACF;AAAA,IAEJ,CAAC;AAAA,EACH,CAEJ;AAEJ;AAEA,OAAO,cAAc;AAErB,IAAO,iBAAQ;;;AC1Wf,OAAOC,WAAoB,UAAAC,UAAQ,YAAAC,kBAAgB;AACnD,OAAO,UAAU;AAGjB,SAAS,oBAAAC,mBAAkB,qBAAAC,0BAAyB;AACpD,SAAS,mBAAmB;AAoD5B,IAAM,YACJ;AAIF,IAAM,aAAa;AAMnB,IAAM,UAIF,CAAC,EAAE,UAAU,WAAW,cAAc,QAAQ,MAAM,MAAM;AAE5D,QAAM,UAAUC,SAAO,KAAK;AAE5B,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,MAAM;AAClB,gBAAQ,UAAU;AAClB,qBAAa,IAAI;AAAA,MACnB;AAAA,MACA,cAAc,MAAM;AAClB,gBAAQ,UAAU;AAClB,qBAAa,KAAK;AAAA,MACpB;AAAA,MAIA,gBAAgB,MAAM,aAAa,IAAI;AAAA,MACvC,eAAe,CAAC,MAAM;AACpB,YACE,CAAC,EAAE,cAAc,SAAS,EAAE,aAA4B,KACxD,CAAC,QAAQ,SACT;AACA,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA,QAEA,aAAa;AAAA,QACb,CAAC,YACG,QACE,iCACA,iCACF,QACE,6BACA;AAAA,MACR;AAAA;AAAA,IAEA,gBAAAA,QAAA,cAAC,aAAK,QAAS;AAAA,EACjB;AAEJ;AAIA,IAAM,gBAA8C,CAAC;AAAA,EACnD;AAAA,EACA,QAAQ;AACV,MAAM;AACJ,SACE,gBAAAA,QAAA,cAAC,SAAI,WAAW,GAAG,QAAQ,QAAQ,SAAS,MAAM,KAChD,gBAAAA,QAAA,cAAC,SAAI,WAAU,uCACb,gBAAAA,QAAA,cAAC,UAAK,WAAU,mDACb,QACH,CACF,CACF;AAEJ;AAGA,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,QAAQ;AACV,MAAM;AACJ,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAkC,CAAC,CAAC;AACtE,QAAM,cAAc,YAAY;AAEhC,QAAM,aAAa,CAAC,UAAkB;AACpC,iBAAa,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,EAAE,EAAE;AAAA,EAC7D;AAGA,EAAAD,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,WAAW;AACd,mBAAa,CAAC,CAAC;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,gBAAgB,MAAM;AAC1B,UAAM,qBACJ,qCAAU,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,MAAM,QAAQ,OAAM;AACjE,QAAI,qBAAqB,GAAG;AAC1B,aAAO;AAAA,IACT,WAAW,sBAAsB,GAAG;AAClC,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,YACJ;AAEF,QAAM,kBAAkB,CAAC,OAAkB,QAAQ,MAAM;AACvD,WACE,gBAAAA,QAAA,cAAC,QAAG,WAAW,QAAQ,IAAI,kCAAkC,MAC1D,+BAAO,IAAI,CAAC,MAAM,UAAU;AAC3B,YAAM,cAAc,KAAK,YAAY,KAAK,SAAS,SAAS;AAC5D,YAAM,WAAW,KAAK,SAAS;AAE/B,YAAM,SAAS,UAAU,KAAK,KAAK;AACnC,YAAM,cACJ,UAAU,IACN,QACE,SACA,SACF,GAAG,QAAQ,KAAK,QAAQ,KAAK,GAAG;AAEtC,aACE,gBAAAA,QAAA,cAAC,QAAG,KAAK,SACN,cACC,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,KAAK,QAAQ;AAAA,UACnB,gBAAc,WAAW,SAAS;AAAA,UAClC,iBAAe,CAAC,CAAC;AAAA,UACjB,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,QAAQ,qBAAqB;AAAA,YAC7B,WAAW,aAAa;AAAA,YACxB,SAAS,gBAAgB;AAAA,YACzB;AAAA,YACA,QAAQ,IAAI,wBAAwB;AAAA,UACtC;AAAA,UACA,OAAO,EAAE,YAAY;AAAA,UACrB,SAAS,CAAC,MAAM;AACd,gBAAI,WAAW;AACb,yBAAW,KAAK,KAAK;AAAA,YACvB;AACA,gBAAI,CAAC,KAAK,KAAM,GAAE,eAAe;AAAA,UACnC;AAAA;AAAA,QAEA,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACZ,KAAK,QAAQ,UAAU,KACtB,gBAAAA,QAAA,cAAC,UAAK,WAAW,QAAQ,YAAY,kBAClC,KAAK,IACR,GAEF,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,WAAW,CAAC,YAAY,cAAc,EAAE;AAAA;AAAA,UAErD,KAAK;AAAA,QACR,CACF;AAAA,QACC,aAAa,eACZ,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAU,mBAChC,SACC,gBAAAA,QAAA,cAACH,mBAAA,EAAiB,MAAM,QAAQ,KAAK,IAAI,IAEzC,gBAAAG,QAAA,cAACF,oBAAA,EAAkB,MAAM,QAAQ,KAAK,IAAI,CAE9C;AAAA,MAEJ,IAEA,gBAAAE,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,KAAK,QAAQ;AAAA,UACnB,gBAAc,WAAW,SAAS;AAAA,UAClC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,mBAAmB;AAAA,YAC3B,WAAW,aAAa;AAAA,YACxB,QAAQ,IAAI,wBAAwB;AAAA,UACtC;AAAA;AAAA,QAEC,KAAK,QAAQ,UAAU,KACtB,gBAAAA,QAAA,cAAC,UAAK,WAAW,QAAQ,YAAY,kBAClC,KAAK,IACR;AAAA,QAEF,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,WAAW,CAAC,YAAY,cAAc,EAAE;AAAA;AAAA,UAErD,KAAK;AAAA,QACR;AAAA,MACF,GAGD,eAAe,UACd,gBAAAA,QAAA,cAAC,SAAI,WAAW,QAAQ,WAAW,UAChC,gBAAgB,KAAK,UAAW,QAAQ,CAAC,CAC5C,CAEJ;AAAA,IAEJ,EACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,WAAW;AAAA,QACT,cAAc;AAAA,QACd;AAAA,QACA,UAAU,YACN,iCACA;AAAA,MACN;AAAA;AAAA,IAEA,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,QAAQ,WAAW;AAAA,QACrB;AAAA;AAAA,MAEC,qCAAU,IAAI,CAAC,YAAY,gBAC1B,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA;AAAA,QAEV,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA;AAAA,cAET;AAAA,cACA;AAAA,cACA,QAAQ,gBAAgB;AAAA,cACxB,CAAC,YAAY,cAAc;AAAA,YAC7B;AAAA;AAAA,UAEC,WAAW;AAAA,QACd;AAAA,QACC,gBAAgB,WAAW,KAAK;AAAA,MACnC;AAAA,IAEJ;AAAA,EACF;AAEJ;AAIA,IAAM,gBAAuC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACV,MAAM;AACJ,QAAM,cAAc,YAAY;AAChC,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG;AAAA,QACZ,iDAAiD;AAAA,QACjD,gCAAgC;AAAA,QAChC,8BAA8B,CAAC;AAAA,QAC/B,WAAW,CAAC,aAAa;AAAA,QACzB,WAAW,CAAC,aAAa,CAAC;AAAA,MAC5B,CAAC;AAAA,MACD,SAAS,MAAM,aAAa,IAAI;AAAA;AAAA,IAE/B,aACC,gBAAAA,QAAA,cAAC,SAAI,WAAU,eACb,gBAAAA,QAAA,cAAC,qBAAQ,CACX;AAAA,IAED,YAAY,SAAS,SAAS,KAC7B,gBAAAA,QAAA,cAAC,SAAI,cAAW,wBAAuB,WAAU,sBAC/C,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,QAAQ,WAAW;AAAA,QACrB;AAAA;AAAA,MAEC,qCAAU,IAAI,CAAC,YAAY,gBAAa;AA3VrD;AA4Vc,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA;AAAA,UAEV,gBAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,GAAG;AAAA,gBACZ,wDAAwD;AAAA,gBACxD,eAAe;AAAA,gBACf,eAAe,CAAC;AAAA,gBAChB,uEACE,CAAC,aAAa;AAAA,gBAChB,uEACE,CAAC,aAAa,CAAC;AAAA,cACnB,CAAC;AAAA;AAAA,YAEA,WAAW;AAAA,UACd;AAAA,UAEE,gBAAAA,QAAA,cAAC,aACE,8CAAY,UAAZ,mBAAmB,IAAI,CAAC,MAAM,UAC7B,gBAAAA,QAAA,cAAC,QAAG,KAAK,SACP,gBAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,gBACE,iBAAgB,6BAAM,QAAO,SAAS;AAAA,cAExC,WAAW,GAAG;AAAA,gBACZ,8KAA8K;AAAA,gBAC9K,CAAC,SAAS,GAAG;AAAA,gBACb,oBAAoB;AAAA,gBACpB,sBAAsB,CAAC;AAAA,gBACvB,CAAC,UAAU,GAAG,iBAAgB,6BAAM;AAAA,gBACpC,iBAAiB,iBAAgB,6BAAM;AAAA,cACzC,CAAC;AAAA,cACD,OAAM,6BAAM,SAAQ;AAAA,cACpB,UAAQ;AAAA;AAAA,YAER,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA;AAAA,cAEX,gBAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,QAAQ,YAAY;AAAA;AAAA,gBAE9B;AAAA,gBACA,KAAK;AAAA,cACR;AAAA,cACA,gBAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,CAAC,YAAY,cAAc;AAAA,kBAC7B;AAAA;AAAA,gBAEC,KAAK;AAAA,cACR;AAAA,YACF;AAAA,UACF,CACF,EAEJ;AAAA,QAEJ;AAAA;AAAA,IAEJ,CACF;AAAA,IAED;AAAA,EACH;AAEJ;AAEA,QAAQ,SAAS;AACjB,QAAQ,OAAO;AACf,QAAQ,SAAS;AAEjB,IAAO,kBAAQ;;;ACraf,OAAOE,aAAW;AAUlB,IAAM,WAAoC,CAAC;AAAA,EACzC,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AACd,MAAM;AACJ,QAAM,QAA6B;AAAA,IACjC,OAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,IAClD,QAAQ,OAAO,WAAW,WAAW,GAAG,MAAM,OAAO;AAAA,IACrD,cAAc,SAAS,QAAQ;AAAA,IAC/B,SAAS;AAAA,EACX;AAEA,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MAEC,eAAY;AAAA,MACZ,WAAW;AAAA;AAAA;AAAA,QAGT;AAAA;AAAA,QAEA;AAAA;AAAA,QAEA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,cAAc,aAAa;AAAA,QAC3B,cAAc,UAAU;AAAA,QACxB,cAAc,WAAW;AAAA,MAC3B;AAAA,MACA;AAAA;AAAA,EACD;AAEL;AAEA,IAAO,mBAAQ;;;AC7Cf,OAAOC,WAAS,cAAAC,oBAA4C;AAa5D,IAAM,SAASC;AAAA,EACb,CAAC,EAAE,OAAO,MAAM,GAAG,MAAM,KAAK,OAAO,MAAM,GAAG,MAAM,GAAG,QAAQ;AAC7D,UAAM,YAAa,QAAQ,QAAQ,MAAM,OAAQ;AACjD,WACE,gBAAAC,QAAA,cAAAA,QAAA,gBACE,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA,QACJ,WAAW;AAAA;AAAA,UAET;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA,SAAS,OAAO,UAAU;AAAA,QAC5B;AAAA,QACA,OAAO;AAAA;AAAA;AAAA,UAGL,YAAY,oEAAoE,QAAQ,uCAAuC,QAAQ;AAAA,QACzI;AAAA;AAAA,IACF,CACF;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;AAErB,IAAO,iBAAQ;;;ACrDf,OAAOC,WAAS,cAAAC,oBAAkB;AAUlC,IAAM,cAAcA;AAAA,EAClB,CAAC,EAAE,UAAU,YAAY,IAAI,OAAO,MAAM,aAAa,WAAW,UAAU,OAAO,GAAG,MAAM,GAAG,QAAQ;AACrG,WACE,gBAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,eAAe,UAAU,UAAU,EAAE,IAAI,SAAS;AAAA,QAC5D,GAAG;AAAA;AAAA,MAEH;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;AAE1B,IAAO,sBAAQ;;;ACzBf,OAAOE,WAAS,UAAAC,gBAAc;AAC9B,SAAS,eAAAC,oBAAmB;AAkB5B,IAAM,UAAU,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,MAA4B;AA3B5B;AA4BE,QAAM,UAAUC,SAAkC,CAAC,CAAC;AAEpD,MAAI,CAAC,YAAY,QAAQ;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,mBAAkB,iBAAY,cAAc,CAAC,MAA3B,mBAA8B;AAEtD,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW,GAAG,aAAa,gBAAgB,MAAM;AAAA;AAAA,IAEjD,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,aAAa,eACT,oCACA;AAAA,QACN;AAAA,QACA,MAAK;AAAA,QACL,cAAY,aAAa,WAAW,OAAO,YAAY,MAAM;AAAA;AAAA,MAE5D,2CAAa,IAAI,CAAC,MAAM,UAAU;AACjC,cAAM,SAAS,cAAc,QAAQ,KAAK;AAC1C,cAAM,YAAY,gBAAgB,QAAQ;AAE1C,eACE,gBAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK,CAAC,OAAa,QAAQ,QAAQ,KAAK,IAAI;AAAA,YAC5C,WAAW;AAAA,cACT,aAAa,eACT,wBACA;AAAA,cACJ,UAAU,YAAY,SAAS,IAAI,WAAW;AAAA;AAAA,cAE9C,SAAS,aAAa;AAAA,YACxB;AAAA,YACA,MAAK;AAAA,YACL,gBAAc,YAAY,SAAS;AAAA,YACnC,cAAY,GAAG,KAAK,IAAI,GACtB,KAAK,aAAa,KAAK,KAAK,UAAU,KAAK,EAC7C,KACE,SAAS,cAAc,YAAY,iBAAiB,SACtD;AAAA;AAAA,UAEA,gBAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,aAAa,eACT,sBACA;AAAA,cACN;AAAA;AAAA,YAEA,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA;AAAA,kBAET;AAAA,kBACA;AAAA,kBACA,SACI,sCACA;AAAA;AAAA,oBAEE;AAAA,sBACA;AAAA,gBACR;AAAA,gBACA,MAAK;AAAA,gBACL,cAAY,QAAQ,QAAQ,CAAC,IAC3B,SAAS,cAAc,YAAY,YAAY,SACjD;AAAA;AAAA,cAEC,aAAa,CAAC,cACb,gBAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAU;AAAA;AAAA,cACX;AAAA,cAEF,UACC,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAU,iBACjC,gBAAAA,QAAA,cAACC,cAAA,EAAY,MAAM,IAAI,OAAM,QAAO,CACtC;AAAA,YAEJ;AAAA,YACC,UAAU,YAAY,SAAS,KAC9B,gBAAAD,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,aAAa,eACT,gBACA;AAAA,gBACN;AAAA,gBACA,eAAY;AAAA;AAAA,cAGZ,gBAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,oBACA,aAAa,eACT;AAAA,sBACE;AAAA,sBACA,cAAc,QAAQ,IAAI,WAAW;AAAA,oBACvC,IACA;AAAA,sBACE;AAAA,sBACA,cAAc,QAAQ,IAAI,WAAW;AAAA,oBACvC;AAAA,kBACN;AAAA;AAAA,cACD;AAAA,YACH;AAAA,UAEJ;AAAA,UAGA,gBAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAa,CAAC;AAAA,cACd,WAAW;AAAA,gBACT;AAAA;AAAA;AAAA,iBAGA,6BAAM,cAAa,UAAU;AAAA,cAC/B;AAAA;AAAA,YAEA,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,cAAW;AAAA,gBACX,WAAU;AAAA;AAAA,cAET,6BAAM;AAAA,YACT;AAAA,YACA,gBAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,YACI,mCACA,SACE,8BACA;AAAA,gBACR;AAAA;AAAA,cAEC,6BAAM;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAAA,IAEC,mBACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,kBAAiB,iBAAY,cAAc,CAAC,MAA3B,mBAA8B,IAAI;AAAA,QAC/D,UAAU;AAAA,QAEV,WAAU;AAAA;AAAA,MAEV,gBAAAA,QAAA,cAAC,qBAAgB;AAAA,IACnB;AAAA,EAEJ;AAEJ;AAEA,IAAO,kBAAQ;;;AChMf,OAAOE,aAMA;AAsCA,IAAM,QAAQ,CAAC,EAAE,UAAU,WAAW,OAAO,GAAG,MAAM,MAAkB;AAC7E,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAEO,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAsB;AACpB,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,GAAG,qCAAqC,SAAS;AAAA;AAAA,IAE3D;AAAA,EACH;AAEJ;AAEO,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAsB;AACpB,SACE,gBAAAA,QAAA,cAAC,WAAO,GAAG,OAAO,WAAW,GAAG,SAAS,KACtC,QACH;AAEJ;AAEO,IAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAqB;AACnB,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAEO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA0B;AACxB,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,UAAU,UAAU;AAAA,QACpB,UAAU,eAAe;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEA,gBAAAA,QAAA,cAAC,SAAI,WAAU,6BACb,gBAAAA,QAAA,cAAC,UAAK,WAAU,yBAAuB,QAAS,GAC/C,QACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WACE;AAAA;AAAA,MAGD;AAAA,IACH,CAEJ;AAAA,EACF;AAEJ;AAEO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAsB;AACpB,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,UAAU,UAAU;AAAA,QACpB,UAAU,eAAe;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEA,gBAAAA,QAAA,cAAC,UAAK,WAAU,yBAAuB,QAAS;AAAA,IAC/C,QACC,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WACE;AAAA;AAAA,MAGD;AAAA,IACH;AAAA,EAEJ;AAEJ;AAEA,IAAO,0BAAQ;;;AC/Lf,OAAOC,aAAW;AAgDX,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA,WAAW;AACb,MAAM;AACJ,SACE,gBAAAC,QAAA,cAAC,SAAI,WAAW,GAAG,aAAa,aAAa,SAAS,SAAS,SAAS,KACrE,QACH;AAEJ;AAEO,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,IAAIA,QAAM,SAAS,CAAC;AACpD,QAAM,UAAUA,QAAM,OAAqC,CAAC,CAAC;AAE7D,EAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,WAAW,CAAC,cAAc,OAAO,WAAW,YAAa;AAE9D,QAAI,cAA6B;AAEjC,QAAI,YAAY,OAAO;AACrB,oBAAc,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,UAAU;AAAA,IAC1E,WAAW,YAAY,gBAAgB;AACrC,oBAAc,OAAO,aAAa,QAAQ,UAAU;AAAA,IACtD;AAEA,QAAI,aAAa;AACf,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,SAAS,YAAY,QAAQ,CAAC;AAElC,QAAM,eAAeA,QAAM;AAAA,IACzB,CAAC,UAAkB;AACjB,UAAI,YAAY,SAAS,cAAc,OAAO,WAAW,aAAa;AACpE,cAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,YAAI,aAAa,IAAI,YAAY,KAAK;AACtC,eAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAAA,MACpD,WACE,YAAY,kBACZ,cACA,OAAO,WAAW,aAClB;AACA,eAAO,aAAa,QAAQ,YAAY,KAAK;AAAA,MAC/C;AACA,eAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,SAAS,YAAY,QAAQ;AAAA,EAChC;AAEA,QAAM,gBAAgB,CAAC,GAAwB,UAAkB;AA7GnE;AA8GI,UAAM,WAAWA,QAAM,SAAS,MAAM,QAAQ;AAE9C,YAAQ,EAAE,KAAK;AAAA,MACb,KAAK;AACH,YAAI,aAAa,cAAc;AAC7B,YAAE,eAAe;AACjB,gBAAM,aAAa,QAAQ,KAAK;AAChC,wBAAc,SAAS;AACvB,wBAAQ,QAAQ,SAAS,MAAzB,mBAA4B;AAAA,QAC9B;AACA;AAAA,MACF,KAAK;AACH,YAAI,aAAa,cAAc;AAC7B,YAAE,eAAe;AACjB,gBAAM,aAAa,QAAQ,IAAI,YAAY;AAC3C,wBAAc,SAAS;AACvB,wBAAQ,QAAQ,SAAS,MAAzB,mBAA4B;AAAA,QAC9B;AACA;AAAA,MACF,KAAK;AACH,YAAI,aAAa,YAAY;AAC3B,YAAE,eAAe;AACjB,gBAAM,aAAa,QAAQ,KAAK;AAChC,wBAAc,SAAS;AACvB,wBAAQ,QAAQ,SAAS,MAAzB,mBAA4B;AAAA,QAC9B;AACA;AAAA,MACF,KAAK;AACH,YAAI,aAAa,YAAY;AAC3B,YAAE,eAAe;AACjB,gBAAM,aAAa,QAAQ,IAAI,YAAY;AAC3C,wBAAc,SAAS;AACvB,wBAAQ,QAAQ,SAAS,MAAzB,mBAA4B;AAAA,QAC9B;AACA;AAAA,MACF,KAAK;AACH,UAAE,eAAe;AACjB,sBAAc,CAAC;AACf,sBAAQ,QAAQ,CAAC,MAAjB,mBAAoB;AACpB;AAAA,MACF,KAAK;AACH,UAAE,eAAe;AACjB,cAAM,YAAY,WAAW;AAC7B,sBAAc,SAAS;AACvB,sBAAQ,QAAQ,SAAS,MAAzB,mBAA4B;AAC5B;AAAA,IACJ;AAAA,EACF;AAEA,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT,aAAa;AAAA;AAAA,UAET;AAAA,YACA;AAAA,QACJ,MACI,iDACA,OACE,aAAa,eACX,8BACA,gCACF,aAAa,eACX,6BACA;AAAA,QACR;AAAA,MACF;AAAA,MACA,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,oBAAkB;AAAA;AAAA,IAEjBA,QAAM,SAAS,IAAI,UAAU,CAAC,OAAO,UAAU;AAC9C,UAAIA,QAAM,eAAe,KAAK,GAAG;AAC/B,cAAM,aAAa;AAAA,UACjB,UAAU;AAAA,UACV;AAAA,UACA;AAAA;AAAA,UACA;AAAA,UACA,WAAW,CAAC,MAA2B,cAAc,GAAG,KAAK;AAAA,UAC7D,UAAU,UAAU,aAAa,IAAI;AAAA,QACvC;AAEA,eAAOA,QAAM,aAAa,OAAO;AAAA,UAC/B,GAAG;AAAA,UACH,KAAK,CAAC,OAAiC;AACrC,oBAAQ,QAAQ,KAAK,IAAI;AACzB,kBAAM,cAAe,MAAc;AACnC,gBAAI,aAAa;AACf,kBAAI,OAAO,gBAAgB,YAAY;AACrC,4BAAY,EAAE;AAAA,cAChB,OAAO;AACL,4BAAY,UAAU;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAQ;AAAA,MACV;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEJ;AAEO,IAAM,MAAMA,QAAM;AAAA,EACvB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,GACA,QACG;AACH,UAAM,aAAa,UAAU;AAE7B,WACE,gBAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe,SAAS,KAAK;AAAA,QAC7B,IAAI,OAAO,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA,WAAW;AAAA;AAAA,UAET;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA;AAAA,UAGA,CAAC,OACC,CAAC,QAAQ;AAAA,YACP,aAAa,eACT,4BACA;AAAA,YACJ;AAAA,YACA,aACI,wCACA;AAAA,UACN;AAAA;AAAA,UAEF,OAAO;AAAA,YACL,aAAa,eACT,mBACA;AAAA,YACJ,aACI,6DACA;AAAA,UACN;AAAA;AAAA,UAEA,QACE,aAAa,gBAAgB;AAAA,YAC3B;AAAA,YACA,aACI,8FACA;AAAA,UACN;AAAA;AAAA,UAEF,QACE,aAAa,cAAc;AAAA,YACzB;AAAA,YACA,aACI,gFACA;AAAA,UACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,SAAS,MAAM,SAAS,KAAK;AAAA;AAAA,MAE5B,QACC,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAU,0BAChC,IACH;AAAA,MAED;AAAA,MACA,WACC,gBAAAA,QAAA,cAAC,UAAK,eAAY,QAAO,WAAU,4BAChC,OACH;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEO,IAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SAAO,UAAU,eACf,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,IAAI,SAAS,KAAK;AAAA,MAClB,mBAAiB,OAAO,KAAK;AAAA,MAC7B,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,QAET;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH,IACE;AACN;AAEA,IAAO,eAAQ;AAEf,IAAI,cAAc;;;AC1UlB,OAAOC;AAAA,EACL,cAAAC;AAAA,OAGK;AAeP,IAAM,WAAWC;AAAA,EACf,CACE,EAAE,MAAM,WAAW,MAAM,MAAM,UAAU,OAAO,UAAU,IAAI,GAAG,MAAM,GACvE,QACG;AACH,WACE,gBAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,gBAAc,SAAS;AAAA,QACtB,GAAG;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA;AAAA,UAET;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA,SAAS,OAAO,kBAAkB;AAAA,UAClC,SACE;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MAEC;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;AChEf,SAAS,yBAAyB;AAClC,OAAOC,aAAoC;AAoC3C,IAAM,qBAAwD,CAAC;AAAA,EAC7D,SAAS;AAAA,EACT,cAAc;AAAA,EACd,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,gBAAgB,CAAC,eAAuB;AAC5C,UAAM,SAAS,WACZ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;AACvC,QAAI,OAAO,WAAW,EAAG;AACzB,YAAQ,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;AAAA,EAC9B;AAEA,QAAM,kBAAkB,CAAC,QAAgB;AACvC,YAAQ,KAAK,OAAO,CAAC,MAAM,MAAM,GAAG,CAAC;AAAA,EACvC;AAEA,QAAM,gBAAgB,CAAC,MAA6C;AAClE,QAAI,EAAE,QAAQ,SAAS;AACrB,QAAE,eAAe;AACjB,YAAM,SAAS,EAAE;AACjB,oBAAc,OAAO,KAAK;AAC1B,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,MAA8C;AACjE,MAAE,eAAe;AACjB,UAAM,YAAY,EAAE,cAAc,QAAQ,MAAM;AAChD,kBAAc,SAAS;AAAA,EACzB;AAEA,SACE,gBAAAC,QAAA,cAAC,aACC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,MACA,WAAW;AAAA,MACV,GAAG;AAAA;AAAA,EACN,GACA,gBAAAA,QAAA,cAAC,SAAI,WAAU,wEACZ,6BAAM,IAAI,CAAC,KAAK,QACf,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,KAAK,GAAG,GAAG,IAAI,GAAG;AAAA,MAClB,SACE,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACV,SAAS,MAAM,gBAAgB,GAAG;AAAA;AAAA,MACpC;AAAA;AAAA,IAGD;AAAA,EACH,EAEJ,CACF;AAEJ;AAEA,IAAO,6BAAQ;;;AC3Gf,SAAS,OAAAC,YAA8B;AACvC,OAAOC,WAAmC,cAAAC,oBAAkB;AAkB5D,IAAMC,iBAAgB;AAAA,EACpB,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AAAA,EACF,SACE;AAAA,EACF,SACE;AAAA,EACF,MAAM;AAAA,EACN,UACE;AAAA,EACF,WACE;AAAA,EACF,QACE;AAAA,EACF,QACE;AAAA,EACF,QACE;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QACE;AACJ;AAEA,IAAM,iBAAiBC,KAAI,IAAI;AAAA,EAC7B,UAAU;AAAA;AAAA;AAAA;AAAA,IAIR,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,QAAQD;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF,CAAC;AAED,IAAM,SAASE;AAAA,EACb,CAAC,EAAE,MAAM,WAAW,QAAQ,UAAU,UAAU,IAAI,GAAG,MAAM,GAAG,QAAQ;AACtE,WACE,gBAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,YAAY;AAAA,QACd;AAAA,QACA,SAAS;AAAA;AAAA,MAET,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAK;AAAA,UACL,gBAAc,+BAAO;AAAA,UACpB,GAAG;AAAA,UACJ,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA;AAAA,YAET;AAAA,YACA;AAAA,YACA;AAAA;AAAA,YAEA;AAAA;AAAA,YAEA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,YAEA;AAAA,YACA,eAAe;AAAA,cACb;AAAA,cACA;AAAA,YACF,CAAC;AAAA,YACD;AAAA,UACF;AAAA,UACA,eAAY;AAAA;AAAA,QAEX;AAAA,MACH;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;AAErB,IAAO,iBAAQ;;;ACrHf,SAAuB,OAAAC,YAAW;AAGlC,OAAOC,aAAW;AAKlB,IAAM,kBAAkBC;AAAA,EACtB;AAAA;AAAA,IAEE;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,UAAU;AAAA,QACR,KAAK;AAAA,QACL,OACE;AAAA,QACF,QACE;AAAA,QACF,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAMA,IAAM,gBAAgBA;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,UAAU;AAAA;AAAA,QAER,KAAK;AAAA;AAAA,QAEL,OAAO;AAAA;AAAA,QAEP,QAAQ;AAAA;AAAA,QAER,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAWA,IAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE,gBAAAD,QAAA,cAAC,SAAK,GAAG,OAAO,WAAU,iDACxB,gBAAAA,QAAA,cAAC,aAAK,QAAS,GACf,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,GAAG,gBAAgB,EAAE,SAAS,CAAC,GAAG,SAAS;AAAA;AAAA,IAErD;AAAA,IACD,gBAAAA,QAAA,cAAC,SAAI,eAAY,QAAO,WAAW,GAAG,cAAc,EAAE,SAAS,CAAC,CAAC,GAAG;AAAA,EACtE,CACF;AAEJ;AAEA,IAAO,kBAAQ;;;ACrFf,OAAOE,WAAS,YAAAC,kBAAgB;AAEhC,SAAS,yBAAyB;AA6C3B,IAAM,WAKT,CAAC;AAAA,EACH;AAAA,EACA,cAAc;AAAA,EACd,OAAO;AAAA,EACP;AAAA,EACA,qBAAqB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,0BAA0B;AAC5B,MAAM;AAEJ,QAAM,cAAcC,QAAM,SAAS,QAAQ,QAAQ,EAChD;AAAA,IAAI,CAAC,UACJA,QAAM,eAAkC,KAAK,IAAI,MAAM,MAAM,KAAK;AAAA,EACpE,EACC,OAAO,OAAO;AAEjB,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC;AAAA,IAC9C,MACE,IAAI;AAAA,MACF,mBAAmB,SACf,qBACA,0BACE,cACA,CAAC;AAAA,IACT;AAAA,EACJ;AAEA,QAAM,gBAAgB,cAAc,IAAI,IAAI,WAAW,IAAI;AAC3D,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAwB,IAAI;AAGhE,QAAM,aAAa,CAAC,OAAe;AACjC,UAAM,YAAY,CAAC,QAAkC;AACnD,YAAM,OAAO,IAAI,IAAI,GAAG;AACxB,UAAI,eAAe;AACjB,aAAK,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,MAC9C,OAAO;AACL,aAAK,MAAM;AACX,aAAK,IAAI,EAAE;AAAA,MACb;AACA,aAAO;AAAA,IACT;AAEA,QAAI,eAAe,kBAAkB;AAEnC,YAAM,cAAc,UAAU,aAAa;AAC3C,uBAAiB,MAAM,KAAK,WAAW,CAAC;AAAA,IAC1C,OAAO;AAEL,0BAAoB,CAAC,SAAS,UAAU,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,OAAe,cAAc,EAAE;AAGrD,QAAM,kBAAkB,CACtB,OACA,QAAQ,MAERD,QAAM,SAAS,IAAI,OAAO,CAAC,UAAU;AACnC,QAAIA,QAAM,eAAkC,KAAK,GAAG;AAClD,aAAOA,QAAM,aAAa,OAAO;AAAA,QAC/B;AAAA,QACA,UAAU,cAAc,IAAI,MAAM,MAAM,EAAE;AAAA,QAC1C,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU,eAAe,MAAM,MAAM;AAAA,QACrC;AAAA,QACA,UAAU,gBAAgB,MAAM,MAAM,UAAU,QAAQ,CAAC;AAAA,MAC3D,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,CAAC;AAEH,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAW,GAAG,6BAA6B,SAAS;AAAA;AAAA,IAEnD,gBAAgB,QAAQ;AAAA,EAC3B;AAEJ;AAMA,IAAM,oBAAsD,CAAC,EAAE,SAAS,MACtE,gBAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,WAAW;AAAA,MACT;AAAA,MACA,YAAY;AAAA,IACd;AAAA;AAAA,EAEA,gBAAAA,QAAA,cAAC,qBAAkB,MAAM,IAAI;AAC/B;AAGF,IAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AACT,MAAM;AACJ,QAAM,UAA6B,CAAC;AACpC,QAAM,WAA8B,CAAC;AACrC,QAAM,UAA6B,CAAC;AACpC,MAAI,UAAqC;AAEzC,EAAAA,QAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC1C,QAAIA,QAAM,eAAe,KAAK,GAAG;AAC/B,UAAI,MAAM,SAAS,sBAAuB,SAAQ,KAAK,KAAK;AAAA,eACnD,MAAM,SAAS,uBAAwB,UAAS,KAAK,KAAK;AAAA,eAC1D,MAAM,SAAS,gBAAiB,WAAU;AAAA,UAC9C,SAAQ,KAAK,KAAK;AAAA,IACzB,MAAO,SAAQ,KAAK,KAAK;AAAA,EAC3B,CAAC;AAED,QAAM,aAAa,CAAC,CAAC;AAErB,QAAM,cAAc,CAAC,MAAwB;AAC3C,MAAE,gBAAgB;AAClB,QAAI,cAAc,CAAC,QAAQ,SAAU,UAAS,EAAE;AAChD,QAAI,SAAU,UAAS,EAAE;AAAA,EAC3B;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,YAAQ,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AACH,UAAE,eAAe;AACjB,oBAAY,CAAQ;AACpB;AAAA,MACF,KAAK;AACH,YAAI,cAAc,CAAC,YAAY,CAAC,QAAQ,UAAU;AAChD,YAAE,eAAe;AACjB,mBAAS,EAAE;AAAA,QACb;AACA;AAAA,MACF,KAAK;AACH,YAAI,cAAc,YAAY,CAAC,QAAQ,UAAU;AAC/C,YAAE,eAAe;AACjB,mBAAS,EAAE;AAAA,QACb;AACA;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,mBACJ,WAAWA,QAAM,eAAe,OAAO,IACnCA,QAAM,aAAa,SAAS,EAAE,UAAU,KAAK,CAAC,IAC9C;AAEN,SACE,gBAAAA,QAAA,cAAAA,QAAA,gBACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,iBAAe,cAAc,CAAC,OAAO,WAAW;AAAA,MAChD,iBAAe;AAAA,MACf,gBAAc,UAAU,SAAS;AAAA,MACjC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA;AAAA;AAAA,QAEA,WAAW,CAAC,YAAY;AAAA;AAAA,QAExB,YACE;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,EAAE,aAAa,GAAG,QAAQ,KAAK,CAAC,KAAK;AAAA,MAC5C,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA;AAAA,IAEV,gBAAAA,QAAA,cAAC,UAAK,WAAU,6BAEb,CAAC,QAAQ,UAAU,cAAc,CAAC,QACjC,gBAAAA,QAAA,cAAC,qBAAkB,UAAoB,GAExC,OACH;AAAA,IAEA,gBAAAA,QAAA,cAAC,UAAK,WAAU,oBAAkB,OAAQ;AAAA,IACzC;AAAA,EACH,GACC,gBACH;AAEJ;AAIA,IAAM,kBAAkD,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AACT,MAAM;AACJ,MAAI,KAAM,QAAO;AACjB,MAAI,UAAU,WAAW;AACvB,WACE,gBAAAA,QAAA,cAAC,QAAG,MAAK,SAAQ,WAAW,GAAG,iBAAiB,SAAS,KACvD,gBAAAA,QAAA,cAAC,QAAG,MAAK,UAAS,WAAU,mCAAgC,WAClD,QAAQ,IAAI,KAAK,cAAc,KACzC,CACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA;AAAA,QAGA,WACI,iCACA;AAAA,QACJ;AAAA,MACF;AAAA;AAAA,IAEC;AAAA,EACH;AAEJ;AAIA,IAAM,wBAGD,CAAC,EAAE,UAAU,UAAU,MAC1B,gBAAAA,QAAA,cAAC,UAAK,WAAW,GAAG,mCAAmC,SAAS,KAC7D,QACH;AAGF,IAAM,yBAID,CAAC,EAAE,UAAU,OAAO,UAAU,MACjC,gBAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,2CAA2C,SAAS;AAAA,IAGlE,MAAM,QAAQ,QAAQ;AAAA,IACtB,cAAY;AAAA;AAAA,EAEX;AACH;AAIF,SAAS,OAAO;AAChB,SAAS,UAAU;AACnB,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAE1B,IAAO,mBAAQ;;;AC5Uf,SAAS,OAAAE,aAA8B;AACvC,OAAOC,aAIA;AAWP,IAAM,oBAAoBC,MAAI,aAAa;AAAA,EACzC,UAAU;AAAA,IACR,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MAEJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF,CAAC;AAED,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAuB;AACrB,QAAM,YACJ,QAAO,mCAAS,WAAW,QAAO,MAAO;AAC3C,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,kBAAkB,EAAE,SAAS,QAAQ,UAAU,CAAC,CAAC;AAAA,MAC9D,GAAG;AAAA;AAAA,IAEH;AAAA,EACH;AAEJ;AAEA,IAAO,qBAAQ;;;ACjEf,OAAOC;AAAA,EACL;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;;;ACHA,IAAM,eAAe;AAAA,EAC1B;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAClD;AAUO,IAAM,qBAAiC;AAOvC,IAAM,uBAAuB;AAE7B,IAAM,cAAc,CAAC,UAC1B,UAAU,WAAW,UAAU,UAAU,UAAU;AAG9C,IAAM,sBAAsB,CAAC,eAAuB,GAAG,UAAU;AAExE,IAAMC,UAAS;AAGR,IAAMC,gBAAe,CAC1B,UACkB;AAClB,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,MAAM,KAAK,EAAE,MAAMD,OAAM;AACvC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,MAAM,CAAC,EAAE,YAAY;AAC/B,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IACH,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE;AAAA,EACZ;AACA,SAAO,IAAI,GAAG;AAChB;AAIA,IAAM,WAAW,CAAC,QAAqB;AACrC,QAAM,IAAI,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE;AACnC,SAAO,CAAE,KAAK,KAAM,KAAM,KAAK,IAAK,KAAK,IAAI,GAAG;AAClD;AAEA,IAAM,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC,MACxB,IAAI,CAAC,GAAG,GAAG,CAAC,EACT;AAAA,EAAI,CAAC,MACJ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EACrC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB,EACC,KAAK,EAAE,CAAC;AAEb,IAAM,MAAM,CAAC,MAAW,IAAS,WAAwB;AAAA,EACvD,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK;AAAA,EAC9B,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK;AAAA,EAC9B,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK;AAChC;AAEA,IAAM,QAAa,CAAC,KAAK,KAAK,GAAG;AACjC,IAAM,QAAa,CAAC,GAAG,GAAG,CAAC;AAO3B,IAAM,cAAmD;AAAA,EACvD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AACA,IAAM,eAAoD;AAAA,EACxD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAGO,IAAM,gBAAgB,CAAC,QAA4B;AACxD,QAAM,OAAOC,cAAa,GAAG;AAC7B,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,mBAAmB,GAAG,6BAA6B;AACrE,QAAM,MAAM,SAAS,IAAI;AAEzB,QAAM,QAAQ,CAAC;AACf,aAAW,SAAS,cAAc;AAChC,UAAM,OAAO,YAAY,KAAK;AAC9B,UAAM,OAAO,aAAa,KAAK;AAC/B,QAAI,SAAS,OAAW,OAAM,KAAK,IAAI,SAAS,IAAI,KAAK,OAAO,IAAI,CAAC;AAAA,aAC5D,SAAS,OAAW,OAAM,KAAK,IAAI,SAAS,IAAI,KAAK,OAAO,IAAI,CAAC;AAAA,QACrE,OAAM,KAAK,IAAI;AAAA,EACtB;AACA,SAAO;AACT;AAGO,IAAM,eAAe,CAAC,UAAwC;AACnE,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,SAAS;AACf,SAAO,aAAa;AAAA,IAClB,CAAC,UACC,OAAO,OAAO,KAAK,MAAM,YACzBA,cAAa,OAAO,KAAK,CAAW,MAAM;AAAA,EAC9C;AACF;AAEA,IAAM,UAAU,CAAC,MAAc;AAC7B,QAAM,IAAI,IAAI;AACd,SAAO,KAAK,UAAU,IAAI,QAAQ,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG;AACrE;AAEA,IAAM,YAAY,CAAC,QAAgB;AACjC,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,GAAG;AAC9B,SAAO,SAAS,QAAQ,CAAC,IAAI,SAAS,QAAQ,CAAC,IAAI,SAAS,QAAQ,CAAC;AACvE;AAGO,IAAM,gBAAgB,CAAC,GAAW,MAAsB;AAC7D,QAAM,IAAIA,cAAa,CAAC;AACxB,QAAM,IAAIA,cAAa,CAAC;AACxB,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,QAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAClE,UAAQ,KAAK,SAAS,KAAK;AAC7B;AAEA,IAAM,eAAoB,SAAS,SAAS;AAG5C,IAAM,iBAAsD;AAAA,EAC1D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEA,IAAM,eAAoD;AAAA,EACxD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAOO,IAAM,oBAAoB,CAAC,UAAkC;AAClE,QAAM,QAAQ,SAAS,MAAM,GAAG,CAAC;AACjC,QAAM,MAAM,CAAC;AACb,aAAW,SAAS,cAAc;AAChC,UAAM,OAAO,eAAe,KAAK;AACjC,UAAM,UAAU,aAAa,KAAK;AAClC,QAAI,SAAS;AACX,UAAI,KAAK,IAAI,SAAS,IAAI,cAAc,OAAO,IAAI,CAAC;AAAA,aAC7C,YAAY;AACnB,UAAI,KAAK,IAAI,SAAS,IAAI,OAAO,OAAO,OAAO,CAAC;AAAA,QAC7C,KAAI,KAAK,IAAI,MAAM,KAAK;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,MAAc,UAClC,aAAa,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE;AAWzD,IAAM,aAAa,CAAC,UAA8B;AACvD,QAAM,OAAO,cAAc,oBAAoB;AAC/C,SACE,wCAAwC,aAAa,WAAW,KAAK,CAAC,IACnE,IAAI,IAAI,IAAI,mBAAmB,aAAa,WAAW,kBAAkB,KAAK,CAAC,CAAC;AAEvF;;;ADjLA,IAAM,4BACJ,OAAO,WAAW,cAAc,kBAAkBC;AAiDpD,IAAM,eAAe,cAAwC,IAAI;AAEjE,IAAM,aAAa,CACjB,KACA,UACsB;AACtB,QAAM,QAAQC,cAAa,GAAG;AAC9B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,EAAE,OAAO,OAAO,SAAS,cAAc,KAAK,EAAE;AACvD;AAGA,IAAM,aAAa,CAACC,SAAmC;AACrD,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQA,IAAG;AAC3C,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,QACJ,OAAO,OAAO,UAAU,WAAWD,cAAa,OAAO,KAAK,IAAI;AAClE,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO;AAAA,MACL;AAAA,MACA,OAAO,aAAa,OAAO,KAAK,IAAI,OAAO,QAAQ,cAAc,KAAK;AAAA,IACxE;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,cAAc,CAACC,MAAa,UAA6B;AAC7D,MAAI;AACF,QAAI,MAAO,QAAO,aAAa,QAAQA,MAAK,KAAK,UAAU,KAAK,CAAC;AAAA,QAC5D,QAAO,aAAa,WAAWA,IAAG;AAAA,EACzC,QAAQ;AAAA,EAER;AACF;AAcA,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,cAAc;AAChB,MAA0B;AAExB,QAAM,CAAC,OAAO,IAAIC,WAAS,MAAM,WAAW,YAAY,CAAC;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAA4B,OAAO;AAG7D,EAAAH,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,UAAM,SAAS,WAAW,UAAU;AACpC,QAAI,OAAQ,UAAS,MAAM;AAAA,EAC7B,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,gBAAgBI;AAAA,IACpB,CAAC,KAAa,YAAqC;AACjD,YAAM,OAAO,WAAW,KAAK,mCAAS,KAAK;AAC3C,UAAI,CAAC,KAAM;AACX,eAAS,IAAI;AACb,UAAI,WAAY,aAAY,YAAY,IAAI;AAAA,IAC9C;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,aAAaA,cAAY,MAAM;AACnC,aAAS,OAAO;AAChB,QAAI,WAAY,aAAY,YAAY,IAAI;AAAA,EAC9C,GAAG,CAAC,SAAS,UAAU,CAAC;AAIxB,QAAM,CAAC,MAAM,YAAY,IAAID,WAAoB,WAAW;AAC5D,QAAM,CAAC,cAAc,eAAe,IAAIA;AAAA,IACtC,gBAAgB,SAAS,SAAS;AAAA,EACpC;AAGA,4BAA0B,MAAM;AAC9B,QAAI,CAAC,WAAY;AACjB,QAAI;AACF,YAAM,QAAQ,OAAO,aAAa;AAAA,QAChC,oBAAoB,UAAU;AAAA,MAChC;AACA,UAAI,YAAY,KAAK,EAAG,cAAa,KAAK;AAAA,IAC5C,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAGf,4BAA0B,MAAM;AAC9B,UAAM,OAAO,SAAS;AACtB,UAAM,QAAQ,CAAC,SAAkB;AAC/B,YAAM,OAAO,OAAO,SAAS;AAC7B,WAAK,aAAa,sBAAsB,IAAI;AAC5C,sBAAgB,IAAI;AAAA,IACtB;AAEA,QAAI,SAAS,UAAU;AACrB,YAAM,SAAS,MAAM;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,WAAW,8BAA8B;AAC9D,UAAM,MAAM,OAAO;AACnB,UAAM,WAAW,CAAC,UAA+B,MAAM,MAAM,OAAO;AACpE,UAAM,iBAAiB,UAAU,QAAQ;AACzC,WAAO,MAAM,MAAM,oBAAoB,UAAU,QAAQ;AAAA,EAC3D,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,UAAUC;AAAA,IACd,CAAC,SAAoB;AACnB,UAAI,CAAC,YAAY,IAAI,EAAG;AACxB,mBAAa,IAAI;AACjB,UAAI,CAAC,WAAY;AACjB,UAAI;AACF,eAAO,aAAa,QAAQ,oBAAoB,UAAU,GAAG,IAAI;AAAA,MACnE,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,QAAQC;AAAA,IACZ,OAAO;AAAA,MACL,QAAO,+BAAO,UAAS;AAAA,MACvB,QAAO,+BAAO,UAAS;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,eAAe,YAAY,MAAM,cAAc,OAAO;AAAA,EAChE;AAEA,SACE,gBAAAC,QAAA,cAAC,aAAa,UAAb,EAAsB,SACpB,SACC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,wBAAqB;AAAA,MACrB;AAAA,MACA,yBAAyB,EAAE,QAAQ,WAAW,MAAM,KAAK,EAAE;AAAA;AAAA,EAC7D,GAED,QACH;AAEJ;AAEA,cAAc,cAAc;AAE5B,IAAM,WAAW,MAAyB;AACxC,QAAM,UAAU,WAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO;AACT;AAIA,IAAO,wBAAQ;;;AEzPf,OAAOC,WAAS,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AACnD,SAAS,qBAAqB;AA8B9B,IAAM,kBAAkB,CAAC,WAAoC;AAC3D,QAAM,MAAM,QAAc,MAAM;AAChC,QAAM,SAAS,iBAAiB,SAAS,eAAe;AACxD,QAAM,QAAQ,CAAC;AACf,SAAa,QAAQ,CAAC,OAAO,UAAU;AACrC,UAAM,OAAO,IAAI,SACbC,cAAa,OAAO,iBAAiB,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC,IAC5D;AACJ,UAAM,KAAK,IAAI,QAAQ,IAAI,OAAO,KAAK;AAAA,EACzC,CAAC;AACD,SAAO;AACT;AAEA,IAAMC,aACJ;AAcF,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,MAA6B;AAC3B,QAAM,EAAE,OAAO,OAAO,eAAe,WAAW,IAAI,SAAS;AAC7D,QAAM,aAAaC,SAAuB,IAAI;AAI9C,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,EAAE;AACzC,EAAAC,YAAU,MAAM;AACd,QAAI,CAAC,WAAW,QAAS;AACzB,UAAM,OAAO,iBAAiB,WAAW,OAAO,EAAE;AAAA,MAChD,aAAa,kBAAkB;AAAA,IACjC;AACA,eAAWJ,cAAa,IAAI,KAAK,EAAE;AAAA,EACrC,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,QAAM,eAAe,CAAC,KAAa,UAA6B;AAC9D,SAAI,+BAAO,YAAW,aAAa,MAAM,UAAU,oBAAoB;AAErE,2CAAW,KAAK;AAChB;AAAA,IACF;AACA,UAAM,aACJ,SAAS,MAAM,UAAU,sBAAsB,MAAM,WAAW,YAC5D,gBAAgB,MAAM,MAAM,IAC5B;AACN,kBAAc,KAAK,aAAa,EAAE,OAAO,WAAW,IAAI,MAAS;AACjE,yCAAW,KAAK;AAAA,EAClB;AAEA,QAAM,cAAc,YAAY,MAAM,cAAc,WAAW,OAAO,IAAI;AAE1E,SACE,gBAAAK,QAAA,cAAC,SAAI,KAAK,YAAY,WAAU,YAC9B,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA;AAAA,EACZ,GAEC,aAAa,UAAU,QAAQ,CAAC,MAAM,YACrC,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACAJ;AAAA,MACF;AAAA;AAAA,IAEA,gBAAAI,QAAA,cAAC,iBAAc,eAAY,QAAO,MAAM,IAAI;AAAA,IAAE;AAAA,EAEhD,GAGF,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,GAAG,mCAAmC,CAAC,eAAe,SAAS;AAAA;AAAA,IAEzE,cACG,yFACA;AAAA,EACN,CACF;AAEJ;AAEA,iBAAiB,cAAc;AAG/B,IAAO,2BAAQ;;;ACzIf,OAAOC,aAAwD;AAC/D,SAAS,gBAAgB,YAAY,iBAAiB;AAatD,IAAM,UAAU;AAAA,EACd,EAAE,OAAO,SAAS,OAAO,SAAS,MAAM,8BAA8B,MAAM,UAAU;AAAA,EACtF,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,6BAA6B,MAAM,WAAW;AAAA,EACpF,EAAE,OAAO,UAAU,OAAO,WAAW,MAAM,8BAA8B,MAAM,eAAe;AAChG;AAMA,IAAM,kBAAkB,CAAC;AAAA,EACvB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B,GAAG;AACL,MAA4B;AAC1B,QAAM,EAAE,MAAM,QAAQ,IAAI,SAAS;AAEnC,QAAM,SAAS,CAAC,SAAoB;AAClC,YAAQ,IAAI;AACZ,yCAAW;AAAA,EACb;AAGA,QAAM,gBAAgB,CAAC,UAAyC;AAC9D,UAAM,OAAO,CAAC,cAAc,aAAa,aAAa,WAAW,QAAQ,KAAK;AAC9E,QAAI,CAAC,KAAK,SAAS,MAAM,GAAG,EAAG;AAC/B,UAAM,QAAQ,MAAM;AAAA,MAClB,MAAM,cAAc,iBAAoC,sBAAsB;AAAA,IAChF;AACA,UAAM,QAAQ,MAAM,QAAQ,SAAS,aAAkC;AACvE,QAAI,QAAQ,EAAG;AACf,UAAM,eAAe;AACrB,QAAI,OAAO;AACX,QAAI,MAAM,QAAQ,OAAQ,QAAO;AAAA,aACxB,MAAM,QAAQ,MAAO,QAAO,MAAM,SAAS;AAAA,aAC3C,MAAM,QAAQ,gBAAgB,MAAM,QAAQ;AACnD,cAAQ,QAAQ,KAAK,MAAM;AAAA,QACxB,SAAQ,QAAQ,IAAI,MAAM,UAAU,MAAM;AAC/C,UAAM,IAAI,EAAE,MAAM;AAClB,UAAM,IAAI,EAAE,MAAM;AAAA,EACpB;AAEA,SACE,gBAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAW,CAAC,MAAM;AAhExB;AAiEQ,oBAAM,cAAN,+BAAkB;AAClB,sBAAc,CAAC;AAAA,MACjB;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC,QAAQ,IAAI,CAAC,EAAE,OAAO,OAAO,MAAM,KAAK,MAAM;AAC7C,YAAM,UAAU,SAAS;AACzB,aACE,gBAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,MAAK;AAAA,UACL,gBAAc;AAAA,UACd,cAAY,aAAa,SAAY;AAAA,UACrC,OAAO;AAAA,UACP,UAAU,UAAU,IAAI;AAAA,UACxB,SAAS,MAAM,OAAO,KAAK;AAAA,UAC3B,WAAW;AAAA,YACT;AAAA,YACA,aAAa,SAAS;AAAA,YACtB;AAAA,YACA;AAAA,YACA,UACI,6DACA;AAAA,UACN;AAAA;AAAA,QAEA,gBAAAA,QAAA,cAAC,QAAK,eAAY,QAAO,MAAM,IAAI;AAAA,QAClC,cAAc,gBAAAA,QAAA,cAAC,cAAM,KAAM;AAAA,MAC9B;AAAA,IAEJ,CAAC;AAAA,EACH;AAEJ;AAEA,gBAAgB,cAAc;AAG9B,IAAO,0BAAQ;;;AC3Gf,OAAOC,aAAW;AAwBlB,IAAM,cAAc,CAAC;AAAA,EACnB,cAAc;AAAA,EACd,aAAa;AAAA,EACb;AACF,MAAwB;AACtB,QAAM,OAAO,aACT,8BAA8B,KAAK,UAAU,oBAAoB,UAAU,CAAC,CAAC,oDAE7E;AACJ,QAAM,OACJ,yBAAyB,KAAK,UAAU,WAAW,CAAC,IAAI,IAAI,sIAElB,oBAAoB;AAEhE,SAAO,gBAAAC,QAAA,cAAC,YAAO,OAAc,yBAAyB,EAAE,QAAQ,KAAK,GAAG;AAC1E;AAGA,IAAO,sBAAQ;","names":["React","React","React","forwardRef","forwardRef","React","React","React","React","React","React","useEffect","useState","useState","useEffect","_","React","cva","React","cva","React","React","React","React","forwardRef","cva","forwardRef","React","React","cva","iconWrapper","React","React","React","forwardRef","useCallback","useEffect","useMemo","useRef","useState","RiArrowDownSLine","React","forwardRef","iconWrapper","forwardRef","React","focusRing","forwardRef","useMemo","useState","useRef","useCallback","useEffect","React","RiArrowDownSLine","React","useCallback","useEffect","useId","useMemo","useRef","useState","RiArrowLeftSLine","RiArrowRightSLine","startOfDay","addDays","addMonths","focusRing","navButton","useId","useState","useMemo","useCallback","useRef","useEffect","fmt","_","React","RiArrowLeftSLine","RiArrowRightSLine","label","React","useState","React","useCallback","useEffect","useId","useMemo","useRef","useState","RiCloseLine","focusRing","textButton","useId","useState","useRef","useCallback","useMemo","useEffect","period","i","React","RiCloseLine","pad","sameDay","useState","React","React","React","React","React","React","useCallback","useEffect","useRef","RiCloseLine","useRef","useCallback","useEffect","React","React","useEffect","useState","useMemo","useCallback","forwardRef","useRef","RiArrowDownSLine","RiCheckLine","cva","React","cva","React","React","focusRing","textButton","forwardRef","useState","useRef","useEffect","useMemo","useCallback","_a","RiArrowDownSLine","RiCheckLine","RiArrowDownSLine","React","useState","useRef","useEffect","useCallback","useState","useRef","useCallback","useEffect","React","children","RiArrowDownSLine","React","useEffect","useState","useMemo","forwardRef","useCallback","useRef","useImperativeHandle","RiSearchLine","defaultRenderItem","React","MenuItem","forwardRef","useState","useRef","useImperativeHandle","useMemo","useCallback","useEffect","RiSearchLine","DropdownFooter","React","forwardRef","useRef","React","forwardRef","useState","React","forwardRef","useState","React","React","useEffect","useRef","forwardRef","forwardRef","useRef","useEffect","React","React","React","React","useState","RiArrowLeftSLine","RiArrowRightSLine","useState","React","RiArrowLeftSLine","RiArrowRightSLine","React","React","React","useEffect","useRef","RiCloseLine","FOCUSABLE","useRef","useEffect","React","RiCloseLine","cva","React","RiCloseLine","iconWrapper","React","cva","React","useRef","useState","useState","useRef","React","React","useRef","useState","RiArrowDownSLine","RiArrowRightSLine","RiArrowLeftSLine","RiCheckLine","focusRing","useState","useRef","React","RiArrowDownSLine","RiCheckLine","RiArrowLeftSLine","RiArrowRightSLine","React","React","React","forwardRef","cva","intentClasses","forwardRef","React","React","useId","useRef","useState","RiFileLine","RiImageLine","RiVideoLine","RiFileZipLine","RiCheckLine","RiCloseLine","RiFilePdf2Line","RiFilePpt2Line","RiFileWord2Line","RiFileExcel2Line","RiMusic2Line","React","Spinner","color","React","React","FileSvgIcon","RiImageLine","RiMusic2Line","RiVideoLine","RiFileExcel2Line","RiFileWord2Line","RiFilePpt2Line","RiFileZipLine","RiFilePdf2Line","RiFileLine","useRef","useId","useState","RiCheckLine","RiCloseLine","item","React","useCallback","useEffect","useId","useMemo","useRef","useState","RiArrowDownSLine","RiCheckLine","RiCloseLine","focusRing","useId","useState","useRef","useMemo","useCallback","useEffect","React","RiCloseLine","RiArrowDownSLine","RiCheckLine","React","useRef","useState","RiArrowDownSLine","RiArrowRightSLine","useRef","React","useState","React","React","React","forwardRef","forwardRef","React","React","forwardRef","React","useRef","RiCheckLine","useRef","React","RiCheckLine","React","React","React","React","React","forwardRef","forwardRef","React","React","React","cva","React","forwardRef","intentClasses","cva","forwardRef","React","cva","React","cva","React","useState","React","useState","cva","React","cva","React","React","useCallback","useEffect","useMemo","useState","HEX_RE","normalizeHex","useEffect","normalizeHex","key","useState","useCallback","useMemo","React","React","useEffect","useRef","useState","normalizeHex","focusRing","useRef","useState","useEffect","React","React","React","React","React"]}
1
+ {"version":3,"sources":["../app/components/Accordion.tsx","../app/utils/utils.tsx","../app/components/Alert.tsx","../app/components/Avatar.tsx","../app/components/AvatarGroup.tsx","../app/components/Badge.tsx","../app/components/Breadcrumb.tsx","../app/components/Button.tsx","../app/components/Calendar.tsx","../app/components/Callout.tsx","../app/components/Card.tsx","../app/components/Checkbox.tsx","../app/components/Chip.tsx","../app/components/CircularProgress.tsx","../app/components/Combobox.tsx","../app/components/ColorPicker.tsx","../app/components/Input.tsx","../app/components/DatePicker.tsx","../app/components/DateTimePicker.tsx","../app/components/TimePicker.tsx","../app/components/DateRangePicker.tsx","../app/components/ContextMenu.tsx","../app/components/CommandPalette.tsx","../app/components/Menubar.tsx","../app/components/Navbar.tsx","../app/components/Timeline.tsx","../app/components/Carousel.tsx","../app/components/ImageGallery.tsx","../app/components/EmptyState.tsx","../app/components/DataGrid.tsx","../app/components/TableToolbar.tsx","../app/components/Form.tsx","../app/components/NumberInput.tsx","../app/components/PasswordInput.tsx","../app/components/SearchInput.tsx","../app/components/RichTextEditor.tsx","../app/components/CodeBlock.tsx","../app/components/Kbd.tsx","../app/components/Link.tsx","../app/components/Collapsible.tsx","../app/components/ResizablePanels.tsx","../app/components/ScrollArea.tsx","../app/components/BottomSheet.tsx","../app/components/ConfirmDialog.tsx","../app/components/Modal.tsx","../app/components/TagInput.tsx","../app/components/StatCard.tsx","../app/components/Charts.tsx","../app/components/CopyButton.tsx","../app/components/Overlay.tsx","../app/components/Portal.tsx","../app/components/VisuallyHidden.tsx","../app/components/SkipLink.tsx","../app/components/LoadMore.tsx","../app/components/CursorPagination.tsx","../app/components/InfiniteScroll.tsx","../app/components/Tour.tsx","../app/components/SignaturePad.tsx","../app/components/Divider.tsx","../app/components/Drawer.tsx","../app/components/Dropdown.tsx","../app/components/Label.tsx","../app/components/DropdownMenu.tsx","../app/components/DropdownWithIcon.tsx","../app/components/FileSelector.tsx","../app/components/FileUpload.tsx","../app/components/FileUploadPreview.tsx","../app/components/GlobalNavigation.tsx","../app/components/HelperText.tsx","../app/components/ListPagination.tsx","../app/components/Loading.tsx","../app/components/MultiSelect.tsx","../app/components/Notice.tsx","../app/components/OTPInput.tsx","../app/components/Pagination.tsx","../app/components/Popover.tsx","../app/components/Progress.tsx","../app/components/Radio.tsx","../app/components/Rating.tsx","../app/components/FileUploadControl.tsx","../app/components/Spinner.tsx","../app/components/SegmentedControl.tsx","../app/components/Select.tsx","../app/components/Sidebar.tsx","../app/components/Skeleton.tsx","../app/components/Slider.tsx","../app/components/SplitButton.tsx","../app/components/Stepper.tsx","../app/components/TableComponents.tsx","../app/components/Toast.tsx","../app/components/Tabs.tsx","../app/components/Textarea.tsx","../app/components/TextInputWithLabel.tsx","../app/components/Toggle.tsx","../app/components/Tooltip.tsx","../app/components/TreeView.tsx","../app/components/Typography.tsx","../app/components/ThemeProvider.tsx","../app/utils/theme.ts","../app/components/ThemeColorPicker.tsx","../app/components/ThemeModeSwitch.tsx","../app/components/ThemeScript.tsx"],"sourcesContent":["\"use client\";\nimport React, { useState, useEffect } from \"react\";\nimport { RiArrowDownSLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ntype AccordionProps = {\n type?: \"single\" | \"multiple\";\n collapsible?: boolean;\n className?: string;\n children: React.ReactNode;\n expanded?: boolean;\n};\n\nexport default function Accordion({\n type = \"single\",\n collapsible = true,\n className,\n children,\n expanded,\n}: AccordionProps) {\n const [openItems, setOpenItems] = useState<string[]>(() => {\n const defaultOpen: string[] = [];\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const triggerChild = React.Children.toArray(child.props.children)[0];\n if (\n React.isValidElement(triggerChild) &&\n triggerChild.props.defaultOpen\n ) {\n defaultOpen.push((child.props as AccordionItemProps).value);\n }\n }\n });\n return defaultOpen;\n });\n\n // Handle expanded prop changes\n useEffect(() => {\n if (expanded !== undefined) {\n if (expanded) {\n // Open all items\n const allValues: string[] = [];\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n allValues.push((child.props as AccordionItemProps).value);\n }\n });\n setOpenItems(allValues);\n } else {\n // Collapse all items\n setOpenItems([]);\n }\n }\n }, [expanded, children]);\n\n const handleToggle = (value: string) => {\n if (type === \"single\") {\n setOpenItems((prev) =>\n prev.includes(value) ? (collapsible ? [] : prev) : [value],\n );\n } else {\n setOpenItems((prev) =>\n prev.includes(value)\n ? prev.filter((item) => item !== value)\n : [...prev, value],\n );\n }\n };\n\n return (\n <div className={className} role=\"region\" aria-label=\"Accordion\">\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(\n child as React.ReactElement<{\n openItems: string[];\n handleToggle: (value: string) => void;\n }>,\n {\n openItems,\n handleToggle,\n },\n );\n }\n return child;\n })}\n </div>\n );\n}\n\ntype AccordionItemProps = {\n value: string;\n disabled?: boolean;\n openItems?: string[];\n handleToggle?: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n};\n\nexport function AccordionItem({\n value,\n disabled = false,\n openItems,\n handleToggle,\n children,\n className,\n}: AccordionItemProps) {\n const isOpen = openItems?.includes(value);\n const headerId = `accordion-header-${value}`;\n const contentId = `accordion-content-${value}`;\n\n const toggle = () => {\n if (!disabled && handleToggle) {\n handleToggle(value);\n }\n };\n\n return (\n <div\n className={cn(\n // same radius and border language as Input, Dropdown and Modal\n \"bg-white rounded-xl border border-gray-200 shadow-sm\",\n \"transition-[border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:border-gray-300\",\n disabled && \"opacity-50 pointer-events-none select-none\",\n isOpen && \"border-gray-300 shadow-md\",\n className,\n )}\n >\n {children && Array.isArray(children) ? (\n <>\n <div\n onClick={toggle}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggle();\n }\n }}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-expanded={isOpen}\n aria-disabled={disabled}\n aria-controls={contentId}\n id={headerId}\n className={cn(\n \"cursor-pointer rounded-xl outline-none\",\n // keyboard-only ring, inset so the item border never clips it\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n // the header joins the panel below it while open\n isOpen && \"rounded-b-none\",\n )}\n >\n {React.cloneElement(children[0] as React.ReactElement, { isOpen })}\n </div>\n <div\n id={contentId}\n role=\"region\"\n aria-labelledby={headerId}\n className={cn(\n \"overflow-hidden transition-[max-height,opacity,visibility] duration-300 ease-in-out motion-reduce:transition-none\",\n // invisible keeps collapsed content out of the tab order\n isOpen\n ? \"max-h-[1000px] opacity-100 visible border-t border-gray-100\"\n : \"max-h-0 opacity-0 invisible\",\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"p-3.5\">{children[1]}</div>\n </div>\n </>\n ) : (\n children\n )}\n </div>\n );\n}\n\ntype AccordionTriggerProps = {\n isOpen?: boolean;\n children: React.ReactNode;\n defaultOpen?: boolean;\n className?: string;\n triggerIcon?: React.ReactNode;\n};\n\nexport function AccordionTrigger({\n isOpen,\n children,\n className,\n // the muted color is on the default icon only, so a custom triggerIcon\n // still inherits the colour set through className\n triggerIcon = <RiArrowDownSLine size={18} className=\"text-gray-500\" />,\n}: AccordionTriggerProps) {\n return (\n <div\n className={cn(\n \"flex gap-3 p-3.5 text-base text-gray-900 rounded-xl bg-white hover:bg-gray-50 justify-between items-center font-semibold\",\n \"transition-colors duration-200 ease-out motion-reduce:transition-none\",\n isOpen && \"bg-gray-50 rounded-b-none\",\n className,\n )}\n >\n <span className=\"min-w-0\">{children}</span>\n <span\n className={cn(\n \"inline-flex shrink-0 transition-transform duration-300 ease-out motion-reduce:transition-none\",\n isOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n aria-hidden=\"true\"\n >\n {triggerIcon}\n </span>\n </div>\n );\n}\n\ntype AccordionContentProps = {\n children: React.ReactNode;\n};\n\nexport function AccordionContent({ children }: AccordionContentProps) {\n return <div className=\"text-sm leading-6 text-gray-600\">{children}</div>;\n}\n","import clsx, { ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nexport const cn = (...classes: ClassValue[]) => twMerge(clsx(...classes));\n","\"use client\";\nimport React, { useState } from \"react\";\nimport {\n RiCheckboxCircleLine,\n RiCloseCircleLine,\n RiCloseLine,\n RiErrorWarningLine,\n RiInformationLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ntype Intent = \"primary\" | \"success\" | \"warning\" | \"error\" | \"default\";\n\nexport interface AlertProps {\n /** Optional. Bold first line. */\n title?: React.ReactNode;\n /** Optional. Message text. */\n children?: React.ReactNode;\n /** Optional. Defaults to \"primary\". */\n intent?: Intent;\n /** Optional. \"soft\" = tinted, \"solid\" = strong filled bar (good for announcements). Defaults to \"soft\". */\n appearance?: \"soft\" | \"solid\";\n /** Optional. Full-width page banner: no rounded corners and no side borders. Defaults to false. */\n banner?: boolean;\n /** Optional. Custom icon, or false to hide the icon. Defaults to an icon matching the intent. */\n icon?: JSX.Element | false;\n /** Optional. Buttons or links shown at the end (or under the text on small screens). */\n actions?: React.ReactNode;\n /** Optional. Show a close button. Defaults to false. */\n dismissible?: boolean;\n /** Optional. Called when the close button is pressed. */\n onDismiss?: () => void;\n /** Optional. Controlled visibility. When omitted, the alert hides itself after dismiss. */\n open?: boolean;\n /** Optional. Center the content (usual for banners). Defaults to false. */\n centered?: boolean;\n /** Optional. Override the ARIA role. Errors and warnings default to \"alert\", others to \"status\". */\n role?: \"alert\" | \"status\" | \"region\";\n className?: string;\n id?: string;\n}\n\nconst defaultIcon: Record<Intent, JSX.Element> = {\n primary: <RiInformationLine size={20} />,\n default: <RiInformationLine size={20} />,\n success: <RiCheckboxCircleLine size={20} />,\n warning: <RiErrorWarningLine size={20} />,\n error: <RiCloseCircleLine size={20} />,\n};\n\nconst soft: Record<Intent, { box: string; icon: string; title: string; text: string; close: string }> = {\n primary: { box: \"bg-primary-50 border-primary-200\", icon: \"text-primary-600\", title: \"text-primary-900\", text: \"text-primary-800\", close: \"text-primary-700 hover:bg-primary-100\" },\n success: { box: \"bg-success-50 border-success-200\", icon: \"text-success-600\", title: \"text-success-900\", text: \"text-success-800\", close: \"text-success-700 hover:bg-success-100\" },\n warning: { box: \"bg-warning-50 border-warning-200\", icon: \"text-warning-600\", title: \"text-warning-900\", text: \"text-warning-800\", close: \"text-warning-700 hover:bg-warning-100\" },\n error: { box: \"bg-error-50 border-error-200\", icon: \"text-error-600\", title: \"text-error-900\", text: \"text-error-800\", close: \"text-error-700 hover:bg-error-100\" },\n default: { box: \"bg-gray-50 border-gray-200\", icon: \"text-gray-600\", title: \"text-gray-900\", text: \"text-gray-700\", close: \"text-gray-600 hover:bg-gray-100\" },\n};\n\nconst solid: Record<Intent, { box: string; close: string }> = {\n primary: { box: \"bg-primary-600 border-primary-600\", close: \"hover:bg-primary-700\" },\n success: { box: \"bg-success-600 border-success-600\", close: \"hover:bg-success-700\" },\n warning: { box: \"bg-warning-600 border-warning-600\", close: \"hover:bg-warning-700\" },\n error: { box: \"bg-error-600 border-error-600\", close: \"hover:bg-error-700\" },\n default: { box: \"bg-gray-800 border-gray-800\", close: \"hover:bg-gray-700\" },\n};\n\nconst Alert = ({\n title,\n children,\n intent = \"primary\",\n appearance = \"soft\",\n banner = false,\n icon,\n actions,\n dismissible = false,\n onDismiss,\n open,\n centered = false,\n role,\n className,\n id,\n}: AlertProps) => {\n const [hidden, setHidden] = useState(false);\n const visible = open !== undefined ? open : !hidden;\n if (!visible) return null;\n\n const isSolid = appearance === \"solid\";\n const t = soft[intent];\n const resolvedRole = role ?? (intent === \"error\" || intent === \"warning\" ? \"alert\" : \"status\");\n\n const handleDismiss = () => {\n if (open === undefined) setHidden(true);\n onDismiss?.();\n };\n\n const iconEl = icon === false ? null : (icon ?? defaultIcon[intent]);\n\n return (\n <div\n id={id}\n role={resolvedRole}\n className={cn(\n \"flex w-full flex-wrap items-start gap-x-3 gap-y-2 border px-4 py-3 text-sm\",\n banner ? \"rounded-none border-x-0\" : \"rounded-xl\",\n isSolid ? cn(solid[intent].box, \"text-white\") : t.box,\n centered && \"justify-center text-center\",\n className,\n )}\n >\n {iconEl && (\n <span aria-hidden=\"true\" className={cn(\"mt-0.5 inline-flex shrink-0\", isSolid ? \"text-white\" : t.icon)}>\n {iconEl}\n </span>\n )}\n <div className={cn(\"min-w-0 flex-1\", centered && \"flex-none\")}>\n {title && <p className={cn(\"font-semibold\", !isSolid && t.title)}>{title}</p>}\n {children && (\n <div className={cn(title && \"mt-0.5\", isSolid ? \"text-white/90\" : t.text)}>{children}</div>\n )}\n </div>\n {actions && <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div>}\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={handleDismiss}\n className={cn(\n \"-my-1 -mr-1 inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n isSolid ? cn(\"text-white\", solid[intent].close) : t.close,\n )}\n >\n <RiCloseLine size={18} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n};\n\nAlert.displayName = \"Alert\";\n\nexport default Alert;\n","import Image from \"next/image\";\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface BaseProps {\n type: \"image\" | \"icon\" | \"text\";\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n onClick?: () => void;\n rounded?: boolean;\n border?: boolean;\n borderColor?: string;\n borderWidth?: string;\n radius?: string;\n disabled?: boolean;\n statusIcon?: JSX.Element;\n statusPosition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\n}\n\nexport interface ImageProps extends BaseProps {\n type: \"image\";\n src: string;\n alt?: string;\n}\n\nexport interface IconProps extends BaseProps {\n type: \"icon\";\n icon: JSX.Element;\n}\n\nexport interface TextProps extends BaseProps {\n type: \"text\";\n text: string;\n}\n\ntype AvatarProps = ImageProps | IconProps | TextProps;\n\nconst Avatar = forwardRef<HTMLDivElement, AvatarProps>((props, ref) => {\n const {\n type,\n size = \"md\",\n className,\n onClick,\n rounded,\n border,\n borderColor,\n borderWidth,\n radius,\n disabled,\n statusIcon,\n statusPosition = \"bottom-right\",\n } = props;\n\n const sizes = {\n sm: \"w-8 h-8\",\n md: \"w-12 h-12\",\n lg: \"w-16 h-16\",\n };\n\n // Matches the rendered box so next/image can pick a sensible source size.\n const imageSizes = { sm: \"32px\", md: \"48px\", lg: \"64px\" };\n\n const displayText =\n type === \"text\" && props.text\n ? props.text.length === 2\n ? props.text.toUpperCase()\n : props.text\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase())\n .join(\"\")\n .slice(0, 2)\n : \"\";\n\n // An avatar with onClick used to be a bare div: not focusable and not\n // operable from the keyboard. It is now exposed as a button.\n const interactive = onClick\n ? {\n role: \"button\" as const,\n tabIndex: disabled ? -1 : 0,\n \"aria-disabled\": disabled || undefined,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n },\n }\n : {};\n\n const interactiveClasses = onClick\n ? cn(\n \"outline-none transition-opacity duration-200 motion-reduce:transition-none\",\n \"hover:opacity-90 active:opacity-80\",\n \"focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n )\n : \"\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"relative\",\n rounded && \"rounded-full\",\n border && \"border border-gray-200\",\n disabled && \"opacity-50 pointer-events-none select-none\",\n onClick && \"cursor-pointer\",\n )}\n style={{\n borderColor: borderColor,\n borderWidth: borderWidth,\n borderRadius: radius,\n }}\n >\n {type === \"image\" && (\n <div\n {...interactive}\n className={cn(\n // rounded-[inherit] makes the content follow the outer shape,\n // including a custom `radius`\n \"relative flex items-center justify-center rounded-[inherit]\",\n interactiveClasses,\n sizes[size],\n className,\n )}\n onClick={onClick}\n >\n <Image\n fill\n sizes={imageSizes[size]}\n className={cn(\n \"rounded-[inherit]\",\n rounded && \"rounded-full\",\n \"object-cover\",\n )}\n src={(props as ImageProps).src}\n alt={(props as ImageProps).alt || \"\"}\n />\n </div>\n )}\n {type === \"icon\" && (\n <div\n {...interactive}\n className={cn(\n // soft tinted background so an icon avatar reads as an avatar;\n // a className such as bg-primary-50 overrides it\n \"flex items-center justify-center rounded-[inherit] bg-gray-100 text-gray-600\",\n interactiveClasses,\n rounded && \"rounded-full\",\n className,\n sizes[size],\n )}\n onClick={onClick}\n >\n {(props as IconProps).icon}\n </div>\n )}\n {type === \"text\" && (\n <p\n {...interactive}\n // initials are shortened visually, so expose the full text\n role={onClick ? \"button\" : \"img\"}\n aria-label={(props as TextProps).text}\n onClick={onClick}\n className={cn(\n \"flex items-center justify-center rounded-[inherit] bg-gray-100 text-sm font-semibold tracking-wide text-gray-700 select-none\",\n interactiveClasses,\n rounded && \"rounded-full\",\n className,\n sizes[size],\n size === \"sm\" && \"text-xs\",\n size === \"lg\" && \"text-xl\",\n size === \"md\" && \"text-base\",\n )}\n >\n {displayText}\n </p>\n )}\n {statusIcon && (\n <span\n className={cn(\n \"absolute w-2 h-2\",\n // small\n statusPosition === \"bottom-left\" &&\n size === \"sm\" &&\n type === \"image\" &&\n \"bottom-0\",\n statusPosition === \"top-left\" &&\n size === \"sm\" &&\n type === \"image\" &&\n \"top-0 -left-1.5\",\n statusPosition === \"bottom-right\" &&\n size === \"sm\" &&\n type === \"image\" &&\n \"bottom-0.5 right-0.5\",\n statusPosition === \"top-right\" &&\n size === \"sm\" &&\n type === \"image\" &&\n \"-top-[1.1px] right-0\",\n // sm text and icon\n statusPosition === \"bottom-left\" &&\n size === \"sm\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-0\",\n statusPosition === \"top-left\" &&\n size === \"sm\" &&\n (type === \"text\" || type === \"icon\") &&\n \"-top-1 left-0\",\n statusPosition === \"bottom-right\" &&\n size === \"sm\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-0 right-1.5\",\n statusPosition === \"top-right\" &&\n size === \"sm\" &&\n (type === \"text\" || type === \"icon\") &&\n \"top-0 right-0.5\",\n // medium\n statusPosition === \"bottom-left\" &&\n size === \"md\" &&\n type === \"image\" &&\n \"bottom-1\",\n statusPosition === \"top-left\" &&\n size === \"md\" &&\n type === \"image\" &&\n \"-top-1 left-0.5\",\n statusPosition === \"bottom-right\" &&\n size === \"md\" &&\n type === \"image\" &&\n \"bottom-1 right-2\",\n statusPosition === \"top-right\" &&\n size === \"md\" &&\n type === \"image\" &&\n \"top-0 right-1\",\n // medium text and icon\n statusPosition === \"bottom-left\" &&\n size === \"md\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-1\",\n statusPosition === \"top-left\" &&\n size === \"md\" &&\n (type === \"text\" || type === \"icon\") &&\n \"-top-1 left-1\",\n statusPosition === \"bottom-right\" &&\n size === \"md\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-1 right-2\",\n statusPosition === \"top-right\" &&\n size === \"md\" &&\n (type === \"text\" || type === \"icon\") &&\n \"top-0 right-1.5\",\n // large\n statusPosition === \"bottom-left\" &&\n size === \"lg\" &&\n type === \"image\" &&\n \"bottom-2 left-0\",\n statusPosition === \"top-left\" &&\n size === \"lg\" &&\n type === \"image\" &&\n \"top-0 left-0.5\",\n statusPosition === \"bottom-right\" &&\n size === \"lg\" &&\n type === \"image\" &&\n \"bottom-2.5 right-2\",\n statusPosition === \"top-right\" &&\n size === \"lg\" &&\n type === \"image\" &&\n \"top-0 right-2\",\n // large text and icon\n statusPosition === \"bottom-left\" &&\n size === \"lg\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-1.5 left-1.5\",\n statusPosition === \"top-left\" &&\n size === \"lg\" &&\n (type === \"text\" || type === \"icon\") &&\n \"top-0 left-1\",\n statusPosition === \"bottom-right\" &&\n size === \"lg\" &&\n (type === \"text\" || type === \"icon\") &&\n \"bottom-2 right-2.5\",\n statusPosition === \"top-right\" &&\n size === \"lg\" &&\n (type === \"text\" || type === \"icon\") &&\n \"top-0 right-2.5\",\n )}\n >\n {statusIcon}\n </span>\n )}\n </div>\n );\n});\n\nAvatar.displayName = \"Avatar\";\n\nexport default Avatar;\n","// AvatarGroup.tsx\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport Avatar, { ImageProps, IconProps, TextProps } from \"./Avatar\";\n\ntype AvatarItemProps =\n | Omit<ImageProps, \"size\">\n | Omit<IconProps, \"size\">\n | Omit<TextProps, \"size\">;\n\ninterface AvatarGroupProps {\n avatars: AvatarItemProps[];\n size?: \"sm\" | \"md\" | \"lg\";\n max?: number;\n className?: string;\n}\n\nconst AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(\n ({ avatars, size = \"md\", max, className }, ref) => {\n const displayAvatars = max ? avatars.slice(0, max) : avatars;\n const remainingCount = max ? avatars.length - max : 0;\n\n return (\n <div\n ref={ref}\n className={cn(\"flex -space-x-6 rtl:space-x-reverse\", className)}\n >\n {displayAvatars.map((avatar, index) => (\n <div\n className=\"hover:-translate-x-3 transition-all duration-200\"\n key={index}\n >\n <Avatar {...avatar} size={size} />\n </div>\n ))}\n {remainingCount > 0 && (\n <div>\n <Avatar\n type=\"text\"\n text={`+${remainingCount}`}\n size={size}\n rounded\n className=\"bg-gray-100\"\n />\n </div>\n )}\n </div>\n );\n }\n);\n\nAvatarGroup.displayName = \"AvatarGroup\";\n\nexport default AvatarGroup;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface BadgeProps {\n /** Optional. Element the badge is attached to (icon, avatar, button…). Omit for a standalone badge. */\n children?: React.ReactNode;\n /** Optional. Number or short text shown in the badge. */\n content?: number | string;\n /** Optional. Show a small dot instead of content. Defaults to false. */\n dot?: boolean;\n /** Optional. Numbers above this show as \"max+\" (e.g. 99+). Defaults to 99. */\n max?: number;\n /** Optional. Show the badge when content is 0. Defaults to false. */\n showZero?: boolean;\n /** Optional. Hide the badge without unmounting it. */\n invisible?: boolean;\n /** Optional. Defaults to \"error\". */\n intent?: \"primary\" | \"error\" | \"success\" | \"warning\" | \"default\";\n /** Optional. Defaults to \"md\". */\n size?: \"sm\" | \"md\";\n /** Optional. Corner of the child where the badge sits. Defaults to \"top-right\". */\n placement?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\n /** Optional. Pulsing ring, useful for a dot that needs attention. Defaults to false. */\n pulse?: boolean;\n /** Optional. Text for screen readers, e.g. \"3 unread messages\". Defaults to the content. */\n label?: string;\n className?: string;\n}\n\nconst tone = {\n primary: \"bg-primary-600 text-white\",\n error: \"bg-error-600 text-white\",\n success: \"bg-success-600 text-white\",\n warning: \"bg-warning-500 text-white\",\n default: \"bg-gray-700 text-white\",\n} as const;\n\nconst pulseTone = {\n primary: \"bg-primary-600\",\n error: \"bg-error-600\",\n success: \"bg-success-600\",\n warning: \"bg-warning-500\",\n default: \"bg-gray-700\",\n} as const;\n\nconst position = {\n \"top-right\": \"right-0 top-0 translate-x-1/2 -translate-y-1/2\",\n \"top-left\": \"left-0 top-0 -translate-x-1/2 -translate-y-1/2\",\n \"bottom-right\": \"bottom-0 right-0 translate-x-1/2 translate-y-1/2\",\n \"bottom-left\": \"bottom-0 left-0 -translate-x-1/2 translate-y-1/2\",\n} as const;\n\nconst Badge = ({\n children,\n content,\n dot = false,\n max = 99,\n showZero = false,\n invisible = false,\n intent = \"error\",\n size = \"md\",\n placement = \"top-right\",\n pulse = false,\n label,\n className,\n}: BadgeProps) => {\n const isNumber = typeof content === \"number\";\n const text =\n isNumber && (content as number) > max ? `${max}+` : content !== undefined ? String(content) : \"\";\n const hidden =\n invisible || (!dot && (content === undefined || content === \"\" || (isNumber && content === 0 && !showZero)));\n const srText = label ?? (dot ? undefined : text);\n\n const indicator = hidden ? null : (\n <span\n className={cn(\n \"inline-flex items-center justify-center font-semibold leading-none\",\n tone[intent],\n dot\n ? size === \"sm\"\n ? \"h-2 w-2 rounded-full\"\n : \"h-2.5 w-2.5 rounded-full\"\n : size === \"sm\"\n ? \"h-4 min-w-4 rounded-full px-1 text-[10px]\"\n : \"h-5 min-w-5 rounded-full px-1.5 text-xs\",\n children && \"absolute ring-2 ring-white\",\n children && position[placement],\n !children && className,\n )}\n >\n {!dot && <span aria-hidden=\"true\">{text}</span>}\n {srText && <span className=\"sr-only\">{srText}</span>}\n {pulse && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 -z-10 animate-ping rounded-full opacity-60 motion-reduce:animate-none\",\n pulseTone[intent],\n )}\n />\n )}\n </span>\n );\n\n if (!children) return indicator;\n\n return (\n <span className={cn(\"relative inline-flex shrink-0\", className)}>\n {children}\n {indicator}\n </span>\n );\n};\n\nBadge.displayName = \"Badge\";\n\nexport default Badge;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ntype BreadcrumbsProps = {\n children: React.ReactNode;\n separator?: React.ReactNode;\n \"aria-label\": string;\n containerClasses?: string;\n};\n\n// Styles applied to links (<a>) that are direct children of an item.\n// Written out in full so Tailwind can detect them.\nconst linkBase =\n \"[&>a]:inline-flex [&>a]:items-center [&>a]:rounded-md [&>a]:px-1.5 [&>a]:py-0.5 [&>a]:transition-colors [&>a]:duration-200 motion-reduce:[&>a]:transition-none \" +\n \"[&>a:focus-visible]:outline-none [&>a:focus-visible]:ring-2 [&>a:focus-visible]:ring-primary-500\";\n\nconst linkInteractive =\n \"[&>a:hover]:bg-gray-100 [&>a:hover]:text-gray-900 [&>a:active]:bg-gray-200\";\n\nconst Breadcrumbs = ({\n children,\n separator = \"/\",\n \"aria-label\": ariaLabel,\n containerClasses,\n}: BreadcrumbsProps) => {\n const count = React.Children.count(children);\n\n const items = React.Children.toArray(children).map((child, index) => {\n const isLast = index === count - 1;\n\n // Mark the current page for screen readers. A link child gets\n // aria-current directly (unless the consumer already set it);\n // anything else is marked on its wrapper.\n const content =\n isLast && React.isValidElement(child)\n ? React.cloneElement(child as React.ReactElement<any>, {\n \"aria-current\": (child.props as any)[\"aria-current\"] ?? \"page\",\n })\n : child;\n\n return (\n <span\n key={index}\n aria-current={\n isLast && !React.isValidElement(child) ? \"page\" : undefined\n }\n className={cn(\n \"flex items-center whitespace-nowrap text-text-xs\",\n linkBase,\n isLast\n ? \"text-gray-900 font-semibold\"\n : cn(\"text-gray-500 font-medium\", linkInteractive),\n )}\n >\n {content}\n {!isLast && (\n <span aria-hidden=\"true\" className=\"mx-0.5 text-gray-400\">\n {separator}\n </span>\n )}\n </span>\n );\n });\n\n return (\n <nav\n aria-label={ariaLabel}\n // flex-wrap lets long trails wrap on narrow screens instead of overflowing\n className={cn(\n \"flex flex-wrap items-center gap-y-1 text-text-xs text-gray-700 font-semibold\",\n containerClasses,\n )}\n >\n {items}\n </nav>\n );\n};\n\nexport default Breadcrumbs;\n","import React, { ButtonHTMLAttributes, MouseEvent, ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { cva, VariantProps } from \"class-variance-authority\";\n\ninterface ButtonProps\n extends\n ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n children?: ReactNode;\n startIcon?: JSX.Element;\n endIcon?: JSX.Element;\n disabled?: boolean;\n fullWidth?: boolean;\n type?: \"submit\" | \"reset\" | \"button\";\n /**\n * Optional. Shows a spinner and blocks clicks / form submission while true.\n * Defaults to false, so existing usages are unaffected.\n */\n loading?: boolean;\n /**\n * Optional. Where the spinner appears while `loading` is true.\n * \"start\" / \"end\" replace the matching icon (or add the spinner if there is\n * no icon). \"center\" overlays the spinner and keeps the button width stable.\n * Defaults to \"start\".\n */\n loadingPosition?: \"start\" | \"center\" | \"end\";\n /** Optional. Custom indicator shown instead of the default spinner. */\n loadingIndicator?: ReactNode;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Tone maps for the new \"soft\", \"ghost\" and \"link\" variants. */\n/* Class names are written out in full so Tailwind can detect them. */\n/* These pair with the solid intents (primary, success, error, ...). */\n/* -------------------------------------------------------------------------- */\n\ntype SolidIntent =\n | \"primary\"\n | \"success\"\n | \"error\"\n | \"warning\"\n | \"default\"\n | \"blue\"\n | \"bluegray\"\n | \"bluelight\"\n | \"indigo\"\n | \"purple\"\n | \"violet\"\n | \"pink\"\n | \"rose\"\n | \"orange\";\n\nconst softTones: Record<SolidIntent, string> = {\n primary:\n \"bg-primary-50 text-primary-700 border-primary-100 hover:bg-primary-100 hover:border-primary-200 hover:text-primary-800 active:bg-primary-200 active:border-primary-300\",\n success:\n \"bg-success-50 text-success-700 border-success-100 hover:bg-success-100 hover:border-success-200 hover:text-success-800 active:bg-success-200 active:border-success-300\",\n error:\n \"bg-error-50 text-error-700 border-error-100 hover:bg-error-100 hover:border-error-200 hover:text-error-800 active:bg-error-200 active:border-error-300\",\n warning:\n \"bg-warning-50 text-warning-700 border-warning-100 hover:bg-warning-100 hover:border-warning-200 hover:text-warning-800 active:bg-warning-200 active:border-warning-300\",\n default:\n \"bg-gray-100 text-gray-700 border-gray-200 hover:bg-gray-200 hover:border-gray-300 hover:text-gray-800 active:bg-gray-300 active:border-gray-300\",\n blue: \"bg-blue-50 text-blue-700 border-blue-100 hover:bg-blue-100 hover:border-blue-200 hover:text-blue-800 active:bg-blue-200 active:border-blue-300\",\n bluegray:\n \"bg-bluegray-50 text-bluegray-700 border-bluegray-100 hover:bg-bluegray-100 hover:border-bluegray-200 hover:text-bluegray-800 active:bg-bluegray-200 active:border-bluegray-300\",\n bluelight:\n \"bg-bluelight-50 text-bluelight-700 border-bluelight-100 hover:bg-bluelight-100 hover:border-bluelight-200 hover:text-bluelight-800 active:bg-bluelight-200 active:border-bluelight-300\",\n indigo:\n \"bg-indigo-50 text-indigo-700 border-indigo-100 hover:bg-indigo-100 hover:border-indigo-200 hover:text-indigo-800 active:bg-indigo-200 active:border-indigo-300\",\n purple:\n \"bg-purple-50 text-purple-700 border-purple-100 hover:bg-purple-100 hover:border-purple-200 hover:text-purple-800 active:bg-purple-200 active:border-purple-300\",\n violet:\n \"bg-violet-50 text-violet-700 border-violet-100 hover:bg-violet-100 hover:border-violet-200 hover:text-violet-800 active:bg-violet-200 active:border-violet-300\",\n pink: \"bg-pink-50 text-pink-700 border-pink-100 hover:bg-pink-100 hover:border-pink-200 hover:text-pink-800 active:bg-pink-200 active:border-pink-300\",\n rose: \"bg-rose-50 text-rose-700 border-rose-100 hover:bg-rose-100 hover:border-rose-200 hover:text-rose-800 active:bg-rose-200 active:border-rose-300\",\n orange:\n \"bg-orange-50 text-orange-700 border-orange-100 hover:bg-orange-100 hover:border-orange-200 hover:text-orange-800 active:bg-orange-200 active:border-orange-300\",\n};\n\nconst ghostReset =\n \"bg-transparent border-transparent hover:border-transparent active:border-transparent\";\n\nconst ghostTones: Record<SolidIntent, string> = {\n primary: \"text-primary-700 hover:bg-primary-50 active:bg-primary-100\",\n success: \"text-success-700 hover:bg-success-50 active:bg-success-100\",\n error: \"text-error-700 hover:bg-error-50 active:bg-error-100\",\n warning: \"text-warning-700 hover:bg-warning-50 active:bg-warning-100\",\n default: \"text-gray-700 hover:bg-gray-100 active:bg-gray-200\",\n blue: \"text-blue-700 hover:bg-blue-50 active:bg-blue-100\",\n bluegray: \"text-bluegray-700 hover:bg-bluegray-50 active:bg-bluegray-100\",\n bluelight: \"text-bluelight-700 hover:bg-bluelight-50 active:bg-bluelight-100\",\n indigo: \"text-indigo-700 hover:bg-indigo-50 active:bg-indigo-100\",\n purple: \"text-purple-700 hover:bg-purple-50 active:bg-purple-100\",\n violet: \"text-violet-700 hover:bg-violet-50 active:bg-violet-100\",\n pink: \"text-pink-700 hover:bg-pink-50 active:bg-pink-100\",\n rose: \"text-rose-700 hover:bg-rose-50 active:bg-rose-100\",\n orange: \"text-orange-700 hover:bg-orange-50 active:bg-orange-100\",\n};\n\nconst linkReset =\n \"bg-transparent border-transparent hover:bg-transparent active:bg-transparent hover:border-transparent active:border-transparent\";\n\nconst linkTones: Record<SolidIntent, string> = {\n primary: \"text-primary-700 hover:text-primary-800 active:text-primary-900\",\n success: \"text-success-700 hover:text-success-800 active:text-success-900\",\n error: \"text-error-700 hover:text-error-800 active:text-error-900\",\n warning: \"text-warning-700 hover:text-warning-800 active:text-warning-900\",\n default: \"text-gray-700 hover:text-gray-800 active:text-gray-900\",\n blue: \"text-blue-700 hover:text-blue-800 active:text-blue-900\",\n bluegray:\n \"text-bluegray-700 hover:text-bluegray-800 active:text-bluegray-900\",\n bluelight:\n \"text-bluelight-700 hover:text-bluelight-800 active:text-bluelight-900\",\n indigo: \"text-indigo-700 hover:text-indigo-800 active:text-indigo-900\",\n purple: \"text-purple-700 hover:text-purple-800 active:text-purple-900\",\n violet: \"text-violet-700 hover:text-violet-800 active:text-violet-900\",\n pink: \"text-pink-700 hover:text-pink-800 active:text-pink-900\",\n rose: \"text-rose-700 hover:text-rose-800 active:text-rose-900\",\n orange: \"text-orange-700 hover:text-orange-800 active:text-orange-900\",\n};\n\nconst solidIntents = Object.keys(softTones) as SolidIntent[];\n\nconst buttonVariants = cva(\n [\n // layout & typography\n \"rounded-xl font-semibold tracking-[-0.005em] select-none touch-manipulation\",\n // interaction\n \"cursor-pointer disabled:select-none\",\n \"transition-[background-color,border-color,color,box-shadow,transform] duration-200 ease-out\",\n \"hover:-translate-y-px active:translate-y-0 active:scale-[0.98]\",\n \"motion-reduce:transition-none motion-reduce:transform-none motion-reduce:hover:transform-none motion-reduce:active:transform-none\",\n // elevation\n \"shadow-sm hover:shadow-md active:shadow-sm disabled:shadow-none\",\n // focus (ring colour is refined per intent below)\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n ],\n {\n variants: {\n variant: {\n filled:\n \"bg-primary-600 text-white active:bg-primary-900 active:border-primary-900 hover:bg-primary-700 hover:border-primary-700 border border-primary-600 shadow-[inset_0_1px_0_0_rgb(255_255_255/0.18),0_1px_2px_0_rgb(16_24_40/0.08)] hover:shadow-[inset_0_1px_0_0_rgb(255_255_255/0.18),0_4px_10px_-2px_rgb(16_24_40/0.18)] active:shadow-[inset_0_1px_2px_0_rgb(0_0_0/0.2)] disabled:opacity-[30%] disabled:pointer-events-none\",\n outlined:\n \"border border-primary-600 bg-white disabled:opacity-[30%] disabled:pointer-events-none text-primary-600 hover:bg-primary-100 active:bg-primary-200 active:border-primary-700\",\n // New, additive variants. Pair with the solid intents.\n soft: \"border border-primary-100 bg-primary-50 text-primary-700 hover:bg-primary-100 hover:border-primary-200 active:bg-primary-200 active:border-primary-300 shadow-none hover:shadow-none active:shadow-none hover:translate-y-0 disabled:opacity-[30%] disabled:pointer-events-none\",\n ghost:\n \"border border-transparent bg-transparent text-primary-700 hover:bg-primary-50 active:bg-primary-100 shadow-none hover:shadow-none active:shadow-none hover:translate-y-0 disabled:opacity-[30%] disabled:pointer-events-none\",\n link: \"border border-transparent bg-transparent text-primary-700 hover:text-primary-800 active:text-primary-900 hover:underline underline-offset-4 shadow-none hover:shadow-none active:shadow-none hover:translate-y-0 active:scale-100 disabled:opacity-[30%] disabled:pointer-events-none\",\n },\n intent: {\n primary:\n \"bg-primary-600 border-primary-600 active:bg-primary-900 active:border-primary-900 hover:bg-primary-700 hover:border-primary-700 focus-visible:ring-primary-500\",\n success:\n \"bg-success-600 border-success-600 active:bg-success-900 active:border-success-900 hover:bg-success-700 hover:border-success-700 focus-visible:ring-success-500\",\n error:\n \"bg-error-700 border-error-700 active:bg-error-900 active:border-error-900 hover:bg-error-800 hover:border-error-800 focus-visible:ring-error-500\",\n warning:\n \"bg-warning-600 border-warning-600 active:bg-warning-900 active:border-warning-900 hover:bg-warning-700 hover:border-warning-700 focus-visible:ring-warning-500\",\n default:\n \"bg-gray-600 border-gray-600 active:bg-gray-900 active:border-gray-900 hover:bg-gray-700 hover:border-gray-700 focus-visible:ring-gray-500\",\n blue: \"bg-blue-600 border-blue-600 active:bg-blue-900 active:border-blue-900 hover:bg-blue-700 hover:border-blue-700 focus-visible:ring-blue-500\",\n bluegray:\n \"bg-bluegray-600 border-bluegray-600 active:bg-bluegray-900 active:border-bluegray-900 hover:bg-bluegray-700 hover:border-bluegray-700 focus-visible:ring-bluegray-500\",\n bluelight:\n \"bg-bluelight-600 border-bluelight-600 active:bg-bluelight-900 active:border-bluelight-900 hover:bg-bluelight-700 hover:border-bluelight-700 focus-visible:ring-bluelight-500\",\n indigo:\n \"bg-indigo-600 border-indigo-600 active:bg-indigo-900 active:border-indigo-900 hover:bg-indigo-700 hover:border-indigo-700 focus-visible:ring-indigo-500\",\n purple:\n \"bg-purple-600 border-purple-600 active:bg-purple-900 active:border-purple-900 hover:bg-purple-700 hover:border-purple-700 focus-visible:ring-purple-500\",\n violet:\n \"bg-violet-600 border-violet-600 active:bg-violet-900 active:border-violet-900 hover:bg-violet-700 hover:border-violet-700 focus-visible:ring-violet-500\",\n pink: \"bg-pink-600 border-pink-600 active:bg-pink-900 active:border-pink-900 hover:bg-pink-700 hover:border-pink-700 focus-visible:ring-pink-500\",\n rose: \"bg-rose-600 border-rose-600 active:bg-rose-900 active:border-rose-900 hover:bg-rose-700 hover:border-rose-700 focus-visible:ring-rose-500\",\n orange:\n \"bg-orange-600 border-orange-600 active:bg-orange-900 active:border-orange-900 hover:bg-orange-700 hover:border-orange-700 focus-visible:ring-orange-500\",\n \"primary-outlined\":\n \"border-primary-600 text-primary-600 hover:bg-primary-100 active:bg-primary-200 active:border-primary-700 focus-visible:ring-primary-500\",\n \"success-outlined\":\n \"border-success-600 text-success-600 hover:bg-success-50 hover:border-success-700 hover:text-success-700 active:bg-success-100 active:text-success-900 active:border-success-900 focus-visible:ring-success-500\",\n \"error-outlined\":\n \"border-error-700 text-error-700 hover:bg-error-100 hover:border-error-700 hover:text-error-700 active:bg-error-200 active:text-error-700 active:border-error-800 focus-visible:ring-error-500\",\n \"warning-outlined\":\n \"border-warning-500 text-warning-500 hover:bg-warning-50 hover:border-warning-600 hover:text-warning-600 active:bg-warning-100 active:text-warning-700 active:border-warning-700 focus-visible:ring-warning-500\",\n \"default-outlined\":\n \"border-gray-700 text-gray-700 hover:bg-gray-100 hover:border-gray-700 hover:text-gray-700 active:bg-gray-300 active:text-gray-800 active:border-gray-800 focus-visible:ring-gray-500\",\n \"blue-outlined\":\n \"border-blue-600 text-blue-600 hover:bg-blue-50 hover:border-blue-700 hover:text-blue-700 active:bg-blue-100 active:text-blue-900 active:border-blue-900 focus-visible:ring-blue-500\",\n \"bluegray-outlined\":\n \"border-bluegray-600 text-bluegray-600 hover:bg-bluegray-50 hover:border-bluegray-700 hover:text-bluegray-700 active:bg-bluegray-100 active:text-bluegray-900 active:border-bluegray-900 focus-visible:ring-bluegray-500\",\n \"bluelight-outlined\":\n \"border-bluelight-600 text-bluelight-600 hover:bg-bluelight-50 hover:border-bluelight-700 hover:text-bluelight-700 active:bg-bluelight-100 active:text-bluelight-900 active:border-bluelight-900 focus-visible:ring-bluelight-500\",\n \"indigo-outlined\":\n \"border-indigo-600 text-indigo-600 hover:bg-indigo-50 hover:border-indigo-700 hover:text-indigo-700 active:bg-indigo-100 active:text-indigo-900 active:border-indigo-900 focus-visible:ring-indigo-500\",\n \"purple-outlined\":\n \"border-purple-600 text-purple-600 hover:bg-purple-50 hover:border-purple-700 hover:text-purple-700 active:bg-purple-100 active:text-purple-900 active:border-purple-900 focus-visible:ring-purple-500\",\n \"violet-outlined\":\n \"border-violet-600 text-violet-600 hover:bg-violet-50 hover:border-violet-700 hover:text-violet-700 active:bg-violet-100 active:text-violet-900 active:border-violet-900 focus-visible:ring-violet-500\",\n \"pink-outlined\":\n \"border-pink-600 text-pink-600 hover:bg-pink-50 hover:border-pink-700 hover:text-pink-700 active:bg-pink-100 active:text-pink-900 active:border-pink-900 focus-visible:ring-pink-500\",\n \"rose-outlined\":\n \"border-rose-600 text-rose-600 hover:bg-rose-50 hover:border-rose-700 hover:text-rose-700 active:bg-rose-100 active:text-rose-900 active:border-rose-900 focus-visible:ring-rose-500\",\n \"orange-outlined\":\n \"border-orange-600 text-orange-600 hover:bg-orange-50 hover:border-orange-700 hover:text-orange-700 active:bg-orange-100 active:text-orange-900 active:border-orange-900 focus-visible:ring-orange-500\",\n },\n size: {\n // xs and xl are new, additive sizes. sm / md / lg are unchanged.\n xs: \"text-xs px-3 py-1.5\",\n sm: \"text-sm px-3.5 py-2\",\n md: \"text-sm px-4 py-2.5\",\n lg: \"text-base px-[18px] py-2.5\",\n xl: \"text-base px-5 py-3\",\n },\n // New, optional. Square button for a single icon. Needs an aria-label.\n iconOnly: {\n true: \"aspect-square\",\n false: \"\",\n },\n },\n compoundVariants: [\n // icon-only padding per size (overrides the horizontal/vertical padding)\n { iconOnly: true, size: \"xs\", className: \"p-1.5\" },\n { iconOnly: true, size: \"sm\", className: \"p-2\" },\n { iconOnly: true, size: \"md\", className: \"p-2.5\" },\n { iconOnly: true, size: \"lg\", className: \"p-3\" },\n { iconOnly: true, size: \"xl\", className: \"p-3.5\" },\n // per-intent colours for the new variants\n ...solidIntents.map((intent) => ({\n variant: \"soft\" as const,\n intent,\n className: softTones[intent],\n })),\n ...solidIntents.map((intent) => ({\n variant: \"ghost\" as const,\n intent,\n className: `${ghostReset} ${ghostTones[intent]}`,\n })),\n ...solidIntents.map((intent) => ({\n variant: \"link\" as const,\n intent,\n className: `${linkReset} ${linkTones[intent]}`,\n })),\n ],\n defaultVariants: {\n variant: \"filled\",\n size: \"sm\",\n },\n },\n);\n\nconst iconWrapper = \"inline-flex shrink-0 items-center\";\n\n// Sized in em so it scales with the button's font size.\nconst Spinner = () => (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className=\"h-[1.15em] w-[1.15em] shrink-0 animate-spin motion-reduce:animate-none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M21 12a9 9 0 0 0-9-9\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n variant,\n intent,\n fullWidth = false,\n startIcon,\n disabled,\n endIcon,\n size,\n iconOnly,\n type = \"button\",\n loading = false,\n loadingPosition = \"start\",\n loadingIndicator,\n onClick,\n ...props\n },\n ref,\n ) => {\n // While loading the button stays natively enabled (so it keeps its normal\n // colours and focus), but clicks and form submission are blocked.\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n };\n\n const indicator = (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {loadingIndicator ?? <Spinner />}\n </span>\n );\n\n const startNode =\n loading && loadingPosition === \"start\"\n ? indicator\n : startIcon && (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {startIcon}\n </span>\n );\n\n const endNode =\n loading && loadingPosition === \"end\"\n ? indicator\n : endIcon && (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {endIcon}\n </span>\n );\n\n const isCenterLoading = loading && loadingPosition === \"center\";\n\n return (\n <button\n {...props}\n ref={ref}\n onClick={handleClick}\n disabled={disabled}\n aria-disabled={loading ? true : disabled}\n aria-busy={loading || undefined}\n type={type}\n className={cn(\n fullWidth && \"w-full\",\n buttonVariants({ intent, className, variant, size, iconOnly }),\n \"flex items-center text-center justify-center gap-2\",\n loading && \"cursor-wait hover:translate-y-0 active:scale-100\",\n isCenterLoading && \"relative\",\n )}\n >\n {isCenterLoading ? (\n <>\n {/* opacity-0 (not invisible) keeps the label in the accessibility tree */}\n <span className=\"inline-flex items-center justify-center gap-2 opacity-0\">\n {startIcon && <span className={iconWrapper}>{startIcon}</span>}\n {children}\n {endIcon && <span className={iconWrapper}>{endIcon}</span>}\n </span>\n <span className=\"absolute inset-0 flex items-center justify-center\">\n {indicator}\n </span>\n </>\n ) : (\n <>\n {startNode}\n {children}\n {endNode}\n </>\n )}\n </button>\n );\n },\n);\n\nButton.displayName = \"Button\";\n\nexport type { ButtonProps };\nexport { buttonVariants };\nexport default Button;\n","\"use client\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { RiArrowLeftSLine, RiArrowRightSLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface CalendarRange {\n start: Date | null;\n end: Date | null;\n}\n\ninterface CalendarBaseProps {\n /** Optional. Visible month (controlled). Any day inside the month works. */\n month?: Date;\n /** Optional. Initial visible month (uncontrolled). Defaults to the selected date or today. */\n defaultMonth?: Date;\n /** Optional. Called when the user navigates to another month. */\n onMonthChange?: (month: Date) => void;\n /** Optional. Earliest selectable date (inclusive). */\n min?: Date;\n /** Optional. Latest selectable date (inclusive). */\n max?: Date;\n /** Optional. Return true to make a date unselectable. */\n isDateDisabled?: (date: Date) => boolean;\n /** Optional. Days that get a small dot under the number (events, deadlines…). */\n markedDates?: Date[];\n /** Optional. Show 1 or 2 months side by side. Defaults to 1. */\n numberOfMonths?: 1 | 2;\n /** Optional. Show days of neighbouring months (single-month view only). Defaults to true. */\n showOutsideDays?: boolean;\n /** Optional. First day of the week: 0 = Sunday, 1 = Monday. Defaults to 0. */\n weekStartsOn?: 0 | 1;\n /** Optional. BCP 47 locale for month and weekday names. Defaults to \"en-US\". */\n locale?: string;\n className?: string;\n \"aria-label\"?: string;\n}\n\ninterface CalendarSingleProps extends CalendarBaseProps {\n mode?: \"single\";\n value?: Date | null;\n defaultValue?: Date | null;\n onChange?: (date: Date | null) => void;\n}\n\ninterface CalendarMultipleProps extends CalendarBaseProps {\n mode: \"multiple\";\n value?: Date[];\n defaultValue?: Date[];\n onChange?: (dates: Date[]) => void;\n}\n\ninterface CalendarRangeProps extends CalendarBaseProps {\n mode: \"range\";\n value?: CalendarRange;\n defaultValue?: CalendarRange;\n onChange?: (range: CalendarRange) => void;\n}\n\nexport type CalendarProps =\n | CalendarSingleProps\n | CalendarMultipleProps\n | CalendarRangeProps;\n\n/* ------------------------------ date helpers ------------------------------ */\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\nconst addDays = (d: Date, n: number) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\nconst addMonths = (d: Date, n: number) => {\n const t = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const last = new Date(t.getFullYear(), t.getMonth() + 1, 0).getDate();\n return new Date(t.getFullYear(), t.getMonth(), Math.min(d.getDate(), last));\n};\nconst sameDay = (a?: Date | null, b?: Date | null) =>\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\nconst key = (d: Date) =>\n `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\nconst monthIndex = (d: Date) => d.getFullYear() * 12 + d.getMonth();\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\nconst navButton = cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-lg text-gray-600\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-100 hover:text-gray-900 disabled:pointer-events-none disabled:opacity-30\",\n focusRing,\n);\n\ntype View = \"days\" | \"months\" | \"years\";\n\nconst Calendar = (props: CalendarProps) => {\n const {\n min,\n max,\n isDateDisabled,\n markedDates,\n numberOfMonths = 1,\n showOutsideDays = true,\n weekStartsOn = 0,\n locale = \"en-US\",\n className,\n \"aria-label\": ariaLabel = \"Calendar\",\n } = props;\n const mode = props.mode ?? \"single\";\n const today = useMemo(() => startOfDay(new Date()), []);\n\n /* ----- value (controlled or not) ----- */\n const [innerSingle, setInnerSingle] = useState<Date | null>(\n mode === \"single\" ? ((props.defaultValue as Date | null | undefined) ?? null) : null,\n );\n const [innerMulti, setInnerMulti] = useState<Date[]>(\n mode === \"multiple\" ? ((props.defaultValue as Date[] | undefined) ?? []) : [],\n );\n const [innerRange, setInnerRange] = useState<CalendarRange>(\n mode === \"range\"\n ? ((props.defaultValue as CalendarRange | undefined) ?? { start: null, end: null })\n : { start: null, end: null },\n );\n const single = mode === \"single\" ? (props.value !== undefined ? (props.value as Date | null) : innerSingle) : null;\n const multi = mode === \"multiple\" ? (props.value !== undefined ? (props.value as Date[]) : innerMulti) : [];\n const range: CalendarRange =\n mode === \"range\"\n ? props.value !== undefined\n ? (props.value as CalendarRange)\n : innerRange\n : { start: null, end: null };\n\n /* ----- navigation state ----- */\n const anchor =\n props.defaultMonth ??\n (mode === \"single\" ? single : mode === \"range\" ? range.start : multi[0]) ??\n today;\n const [innerMonth, setInnerMonth] = useState<Date>(\n new Date(anchor.getFullYear(), anchor.getMonth(), 1),\n );\n const viewMonth = props.month\n ? new Date(props.month.getFullYear(), props.month.getMonth(), 1)\n : innerMonth;\n const [view, setView] = useState<View>(\"days\");\n const [focused, setFocused] = useState<Date>(startOfDay(anchor));\n const [hover, setHover] = useState<Date | null>(null);\n const shouldFocus = useRef(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const goMonth = useCallback(\n (d: Date) => {\n const first = new Date(d.getFullYear(), d.getMonth(), 1);\n if (!props.month) setInnerMonth(first);\n props.onMonthChange?.(first);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [props.month, props.onMonthChange],\n );\n\n const disabledDay = useCallback(\n (d: Date) => {\n const day = startOfDay(d);\n if (min && day < startOfDay(min)) return true;\n if (max && day > startOfDay(max)) return true;\n return !!isDateDisabled?.(day);\n },\n [min, max, isDateDisabled],\n );\n\n const marked = useMemo(() => new Set((markedDates ?? []).map(key)), [markedDates]);\n\n /* ----- selection ----- */\n const select = (d: Date) => {\n if (disabledDay(d)) return;\n const day = startOfDay(d);\n if (mode === \"single\") {\n const p = props as CalendarSingleProps;\n if (p.value === undefined) setInnerSingle(day);\n p.onChange?.(day);\n } else if (mode === \"multiple\") {\n const p = props as CalendarMultipleProps;\n const exists = multi.some((x) => sameDay(x, day));\n const next = exists ? multi.filter((x) => !sameDay(x, day)) : [...multi, day];\n if (p.value === undefined) setInnerMulti(next);\n p.onChange?.(next);\n } else {\n const p = props as CalendarRangeProps;\n let next: CalendarRange;\n if (!range.start || range.end) next = { start: day, end: null };\n else\n next =\n day < range.start\n ? { start: day, end: range.start }\n : { start: range.start, end: day };\n if (p.value === undefined) setInnerRange(next);\n p.onChange?.(next);\n }\n };\n\n /* ----- keyboard ----- */\n const moveFocus = (next: Date) => {\n shouldFocus.current = true;\n const clamped = (() => {\n const day = startOfDay(next);\n if (min && day < startOfDay(min)) return startOfDay(min);\n if (max && day > startOfDay(max)) return startOfDay(max);\n return day;\n })();\n setFocused(clamped);\n const diff = monthIndex(clamped) - monthIndex(viewMonth);\n if (diff < 0) goMonth(clamped);\n else if (diff >= numberOfMonths) goMonth(addMonths(clamped, -(numberOfMonths - 1)));\n };\n\n const onGridKeyDown = (e: React.KeyboardEvent) => {\n const offset = (focused.getDay() - weekStartsOn + 7) % 7;\n let next: Date;\n switch (e.key) {\n case \"ArrowLeft\": next = addDays(focused, -1); break;\n case \"ArrowRight\": next = addDays(focused, 1); break;\n case \"ArrowUp\": next = addDays(focused, -7); break;\n case \"ArrowDown\": next = addDays(focused, 7); break;\n case \"Home\": next = addDays(focused, -offset); break;\n case \"End\": next = addDays(focused, 6 - offset); break;\n case \"PageUp\": next = addMonths(focused, e.shiftKey ? -12 : -1); break;\n case \"PageDown\": next = addMonths(focused, e.shiftKey ? 12 : 1); break;\n default: return;\n }\n e.preventDefault();\n moveFocus(next);\n };\n\n useEffect(() => {\n if (!shouldFocus.current || view !== \"days\") return;\n shouldFocus.current = false;\n rootRef.current\n ?.querySelector<HTMLButtonElement>(`[data-date=\"${key(focused)}\"]`)\n ?.focus();\n }, [focused, viewMonth, view]);\n\n /* ----- labels ----- */\n const weekdays = useMemo(() => {\n const short = new Intl.DateTimeFormat(locale, { weekday: \"short\" });\n const long = new Intl.DateTimeFormat(locale, { weekday: \"long\" });\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(2023, 0, 1 + ((i + weekStartsOn) % 7));\n return { short: short.format(d).slice(0, 2), long: long.format(d) };\n });\n }, [locale, weekStartsOn]);\n const monthFmt = new Intl.DateTimeFormat(locale, { month: \"long\", year: \"numeric\" });\n const fullDate = new Intl.DateTimeFormat(locale, { dateStyle: \"full\" });\n const yearPageStart = Math.floor(viewMonth.getFullYear() / 12) * 12;\n\n /* ----- range preview ----- */\n const previewEnd = mode === \"range\" ? (range.end ?? (range.start ? hover : null)) : null;\n const lo = mode === \"range\" && range.start && previewEnd ? (range.start < previewEnd ? range.start : previewEnd) : null;\n const hi = mode === \"range\" && range.start && previewEnd ? (range.start < previewEnd ? previewEnd : range.start) : null;\n\n const isSelected = (d: Date) =>\n mode === \"single\"\n ? sameDay(d, single)\n : mode === \"multiple\"\n ? multi.some((x) => sameDay(x, d))\n : sameDay(d, lo ?? range.start) || sameDay(d, hi);\n const inRange = (d: Date) => !!lo && !!hi && startOfDay(d) > lo && startOfDay(d) < hi;\n\n const weeksOf = (m: Date) => {\n const first = new Date(m.getFullYear(), m.getMonth(), 1);\n const offset = (first.getDay() - weekStartsOn + 7) % 7;\n const start = addDays(first, -offset);\n return Array.from({ length: 6 }, (_, w) =>\n Array.from({ length: 7 }, (_, d) => addDays(start, w * 7 + d)),\n );\n };\n\n const months = Array.from({ length: numberOfMonths }, (_, i) => addMonths(viewMonth, i));\n\n const headerLabel =\n view === \"days\"\n ? numberOfMonths === 1\n ? monthFmt.format(viewMonth)\n : `${monthFmt.format(months[0])} – ${monthFmt.format(months[numberOfMonths - 1])}`\n : view === \"months\"\n ? String(viewMonth.getFullYear())\n : `${yearPageStart} – ${yearPageStart + 11}`;\n\n const step = view === \"days\" ? 1 : view === \"months\" ? 12 : 144;\n\n return (\n <div\n ref={rootRef}\n role=\"group\"\n aria-label={ariaLabel}\n className={cn(\n \"inline-block rounded-xl border border-gray-200 bg-white p-3\",\n numberOfMonths === 2 ? \"w-[600px] max-w-full\" : \"w-[296px]\",\n className,\n )}\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n className={navButton}\n aria-label={view === \"days\" ? \"Previous month\" : view === \"months\" ? \"Previous year\" : \"Previous years\"}\n onClick={() => goMonth(addMonths(viewMonth, -step))}\n >\n <RiArrowLeftSLine size={18} aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n aria-live=\"polite\"\n onClick={() => setView(view === \"days\" ? \"months\" : view === \"months\" ? \"years\" : \"days\")}\n className={cn(\"rounded-lg px-2 py-1 text-sm font-semibold text-gray-900 hover:bg-gray-100\", focusRing)}\n >\n {headerLabel}\n </button>\n <button\n type=\"button\"\n className={navButton}\n aria-label={view === \"days\" ? \"Next month\" : view === \"months\" ? \"Next year\" : \"Next years\"}\n onClick={() => goMonth(addMonths(viewMonth, step))}\n >\n <RiArrowRightSLine size={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n {view === \"days\" && (\n <div\n className={cn(\"grid gap-4\", numberOfMonths === 2 ? \"grid-cols-2\" : \"grid-cols-1\")}\n onKeyDown={onGridKeyDown}\n onMouseLeave={() => setHover(null)}\n >\n {months.map((m) => (\n <div key={key(m)} role=\"grid\" aria-label={monthFmt.format(m)}>\n {numberOfMonths > 1 && (\n <p className=\"mb-1 text-center text-xs font-medium text-gray-500\">{monthFmt.format(m)}</p>\n )}\n <div role=\"row\" className=\"mb-1 grid grid-cols-7\">\n {weekdays.map((w) => (\n <div key={w.long} role=\"columnheader\" aria-label={w.long} className=\"flex h-8 items-center justify-center text-xs font-medium text-gray-500\">\n {w.short}\n </div>\n ))}\n </div>\n {weeksOf(m).map((week, wi) => (\n <div key={wi} role=\"row\" className=\"grid grid-cols-7\">\n {week.map((d) => {\n const outside = d.getMonth() !== m.getMonth();\n if (outside && (!showOutsideDays || numberOfMonths > 1))\n return <div key={key(d)} role=\"gridcell\" className=\"h-10\" />;\n const off = disabledDay(d);\n const sel = isSelected(d);\n const mid = inRange(d);\n const isToday = sameDay(d, today);\n return (\n <div\n key={key(d)}\n role=\"gridcell\"\n aria-selected={sel || mid || undefined}\n className={cn(\n \"flex items-center justify-center py-0.5\",\n mid && \"bg-primary-50\",\n mode === \"range\" && hi && lo && !sameDay(lo, hi) && sameDay(d, lo) && \"rounded-l-full bg-primary-50\",\n mode === \"range\" && hi && lo && !sameDay(lo, hi) && sameDay(d, hi) && \"rounded-r-full bg-primary-50\",\n )}\n >\n <button\n type=\"button\"\n data-date={key(d)}\n tabIndex={sameDay(d, focused) ? 0 : -1}\n disabled={off}\n aria-label={fullDate.format(d) + (marked.has(key(d)) ? \", has events\" : \"\")}\n aria-current={isToday ? \"date\" : undefined}\n onClick={() => {\n setFocused(startOfDay(d));\n select(d);\n }}\n onMouseEnter={() => setHover(startOfDay(d))}\n onFocus={() => {\n if (!sameDay(d, focused)) setFocused(startOfDay(d));\n }}\n className={cn(\n \"relative inline-flex h-9 w-9 items-center justify-center rounded-full text-sm\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n sel\n ? \"bg-primary-600 font-semibold text-white hover:bg-primary-700\"\n : outside\n ? \"text-gray-400 hover:bg-gray-100\"\n : \"text-gray-900 hover:bg-gray-100\",\n !sel && isToday && \"border border-primary-600 font-semibold text-primary-700\",\n off && \"pointer-events-none text-gray-300 line-through hover:bg-transparent\",\n )}\n >\n {d.getDate()}\n {marked.has(key(d)) && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute bottom-1 h-1 w-1 rounded-full\",\n sel ? \"bg-white\" : \"bg-primary-600\",\n )}\n />\n )}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {view === \"months\" && (\n <div className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, i) => {\n const label = new Intl.DateTimeFormat(locale, { month: \"short\" }).format(new Date(2023, i, 1));\n const first = new Date(viewMonth.getFullYear(), i, 1);\n const last = new Date(viewMonth.getFullYear(), i + 1, 0);\n const off = (!!min && last < startOfDay(min)) || (!!max && first > startOfDay(max));\n const current = i === viewMonth.getMonth();\n return (\n <button\n key={i}\n type=\"button\"\n disabled={off}\n onClick={() => {\n goMonth(first);\n setFocused(new Date(first.getFullYear(), i, Math.min(focused.getDate(), last.getDate())));\n setView(\"days\");\n }}\n className={cn(\n \"h-10 rounded-lg text-sm transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n current ? \"bg-primary-600 font-semibold text-white\" : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n )}\n\n {view === \"years\" && (\n <div className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, i) => {\n const y = yearPageStart + i;\n const off = (!!min && y < min.getFullYear()) || (!!max && y > max.getFullYear());\n return (\n <button\n key={y}\n type=\"button\"\n disabled={off}\n onClick={() => {\n goMonth(new Date(y, viewMonth.getMonth(), 1));\n setView(\"months\");\n }}\n className={cn(\n \"h-10 rounded-lg text-sm transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n y === viewMonth.getFullYear() ? \"bg-primary-600 font-semibold text-white\" : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n )}\n >\n {y}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nCalendar.displayName = \"Calendar\";\n\nexport default Calendar;\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport React, { ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\n\nconst calloutVariants = cva(\n // Every callout now has a 1px border (filled ones use a faint tint of their\n // own colour), so filled and outlined callouts have the same height.\n \"py-3 px-4 font-medium rounded-xl border\",\n {\n variants: {\n variant: {\n filled: \"\",\n outlined: \"\",\n },\n intent: {\n primary: \"\",\n warning: \"\",\n error: \"\",\n success: \"\",\n default: \"\",\n },\n size: {\n xs: \"text-xs\",\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n },\n },\n compoundVariants: [\n // Text uses the 700 shade for readable contrast on the pale backgrounds\n // (600 on warning-50 in particular was low contrast).\n {\n variant: \"filled\",\n intent: \"primary\",\n className: \"bg-primary-50 border-primary-100 text-primary-700\",\n },\n {\n variant: \"outlined\",\n intent: \"primary\",\n className: \"border-primary-300 text-primary-700 bg-transparent\",\n },\n\n {\n variant: \"filled\",\n intent: \"warning\",\n className: \"bg-warning-50 border-warning-100 text-warning-700\",\n },\n {\n variant: \"outlined\",\n intent: \"warning\",\n className: \"border-warning-300 text-warning-700 bg-transparent\",\n },\n\n {\n variant: \"filled\",\n intent: \"error\",\n className: \"bg-error-50 border-error-100 text-error-700\",\n },\n {\n variant: \"outlined\",\n intent: \"error\",\n className: \"border-error-300 text-error-700 bg-transparent\",\n },\n\n {\n variant: \"filled\",\n intent: \"success\",\n className: \"bg-success-50 border-success-100 text-success-700\",\n },\n {\n variant: \"outlined\",\n intent: \"success\",\n className: \"border-success-300 text-success-700 bg-transparent\",\n },\n\n {\n variant: \"filled\",\n intent: \"default\",\n className: \"bg-gray-50 border-gray-100 text-gray-700\",\n },\n {\n variant: \"outlined\",\n intent: \"default\",\n className: \"border-gray-300 text-gray-700 bg-transparent\",\n },\n ],\n defaultVariants: {\n variant: \"filled\",\n intent: \"primary\",\n size: \"sm\",\n },\n },\n);\n\ninterface CalloutProps extends VariantProps<typeof calloutVariants> {\n children: ReactNode;\n startIcon?: JSX.Element;\n endIcon?: JSX.Element;\n className?: string;\n}\n\nconst Callout: React.FC<CalloutProps> = ({\n children,\n variant,\n intent,\n size,\n startIcon,\n endIcon,\n className,\n}) => {\n return (\n <div\n role=\"alert\"\n className={cn(\n calloutVariants({ variant, intent, size }),\n \"flex items-center justify-between gap-3\",\n className,\n )}\n >\n {/* min-w-0 lets long text wrap instead of pushing the end icon out */}\n <div className=\"flex min-w-0 items-center gap-2\">\n {startIcon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0\">\n {startIcon}\n </span>\n )}\n {children}\n </div>\n {/* not aria-hidden: the end slot may hold a button */}\n {endIcon && <span className=\"inline-flex shrink-0\">{endIcon}</span>}\n </div>\n );\n};\n\nexport default Callout;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\n// Every part now also accepts the native attributes of its element (id,\n// aria-*, data-*, onClick...). children and className are unchanged.\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardActionProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\ninterface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n}\n\nexport default function Card({ children, className, ...props }: CardProps) {\n return (\n <div\n {...props}\n className={cn(\n // same radius, border and shadow family as Modal, Accordion and Dropdown\n \"bg-white rounded-xl border border-gray-200 shadow-sm\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nexport const CardHeader: React.FC<CardHeaderProps> = ({\n children,\n className,\n ...props\n}) => {\n // The header used 16px side padding while the content and footer used 24px,\n // so their text did not line up. All three now share 24px.\n return (\n <div {...props} className={cn(\"px-6 pt-6 pb-4\", className)}>\n {children}\n </div>\n );\n};\n\nexport const CardTitle: React.FC<CardTitleProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <h3\n {...props}\n className={cn(\n \"text-lg font-semibold leading-7 tracking-tight text-gray-900 mb-1\",\n className,\n )}\n >\n {children}\n </h3>\n );\n};\n\nexport const CardDescription: React.FC<CardDescriptionProps> = ({\n children,\n className,\n ...props\n}) => {\n // No bottom margin: the header's padding (and CardAction's own top margin)\n // set the spacing, so a description no longer doubles the gap to the content.\n return (\n <p {...props} className={cn(\"text-sm leading-5 text-gray-600\", className)}>\n {children}\n </p>\n );\n};\n\nexport const CardAction: React.FC<CardActionProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <div {...props} className={cn(\"mt-4\", className)}>\n {children}\n </div>\n );\n};\n\nexport const CardContent: React.FC<CardContentProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <div {...props} className={cn(\"px-6 pb-6 pt-0\", className)}>\n {children}\n </div>\n );\n};\n\nexport const CardFooter: React.FC<CardFooterProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <div {...props} className={cn(\"px-6 pb-6 pt-0\", className)}>\n {children}\n </div>\n );\n};\n","import React, { forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { cva, VariantProps } from \"class-variance-authority\";\n\n/* -------------------------------------------------------------------------- */\n/* Per-intent styles. Class names are written out in full so Tailwind can */\n/* detect them. `primary` is the default, so existing checkboxes stay in the */\n/* primary colour family. Checked: solid fill, one shade darker on hover. */\n/* Unchecked hover: a light tint of the intent. The focus ring follows the */\n/* intent. `checked:hover:` is used so the hover tint never overrides the */\n/* checked fill. */\n/* -------------------------------------------------------------------------- */\nconst intentClasses = {\n primary:\n \"hover:bg-primary-50 checked:border-primary-600 checked:bg-primary-600 checked:hover:border-primary-700 checked:hover:bg-primary-700 focus-visible:ring-primary-500\",\n success:\n \"hover:bg-success-50 checked:border-success-600 checked:bg-success-600 checked:hover:border-success-700 checked:hover:bg-success-700 focus-visible:ring-success-500\",\n error:\n \"hover:bg-error-50 checked:border-error-600 checked:bg-error-600 checked:hover:border-error-700 checked:hover:bg-error-700 focus-visible:ring-error-500\",\n warning:\n \"hover:bg-warning-50 checked:border-warning-600 checked:bg-warning-600 checked:hover:border-warning-700 checked:hover:bg-warning-700 focus-visible:ring-warning-500\",\n default:\n \"hover:bg-gray-100 checked:border-gray-700 checked:bg-gray-700 checked:hover:border-gray-800 checked:hover:bg-gray-800 focus-visible:ring-gray-500\",\n blue: \"hover:bg-blue-50 checked:border-blue-600 checked:bg-blue-600 checked:hover:border-blue-700 checked:hover:bg-blue-700 focus-visible:ring-blue-500\",\n bluegray:\n \"hover:bg-bluegray-50 checked:border-bluegray-600 checked:bg-bluegray-600 checked:hover:border-bluegray-700 checked:hover:bg-bluegray-700 focus-visible:ring-bluegray-500\",\n bluelight:\n \"hover:bg-bluelight-50 checked:border-bluelight-600 checked:bg-bluelight-600 checked:hover:border-bluelight-700 checked:hover:bg-bluelight-700 focus-visible:ring-bluelight-500\",\n indigo:\n \"hover:bg-indigo-50 checked:border-indigo-600 checked:bg-indigo-600 checked:hover:border-indigo-700 checked:hover:bg-indigo-700 focus-visible:ring-indigo-500\",\n purple:\n \"hover:bg-purple-50 checked:border-purple-600 checked:bg-purple-600 checked:hover:border-purple-700 checked:hover:bg-purple-700 focus-visible:ring-purple-500\",\n violet:\n \"hover:bg-violet-50 checked:border-violet-600 checked:bg-violet-600 checked:hover:border-violet-700 checked:hover:bg-violet-700 focus-visible:ring-violet-500\",\n pink: \"hover:bg-pink-50 checked:border-pink-600 checked:bg-pink-600 checked:hover:border-pink-700 checked:hover:bg-pink-700 focus-visible:ring-pink-500\",\n rose: \"hover:bg-rose-50 checked:border-rose-600 checked:bg-rose-600 checked:hover:border-rose-700 checked:hover:bg-rose-700 focus-visible:ring-rose-500\",\n orange:\n \"hover:bg-orange-50 checked:border-orange-600 checked:bg-orange-600 checked:hover:border-orange-700 checked:hover:bg-orange-700 focus-visible:ring-orange-500\",\n};\n\nconst checkboxVariant = cva(\n [\n \"peer relative cursor-pointer appearance-none rounded-[4px] border border-gray-300 bg-white\",\n \"shadow-sm hover:border-gray-400 checked:shadow-none\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // keyboard-only focus ring (colour is set per intent)\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n // error state via the native attribute, no new prop needed\n \"aria-[invalid=true]:border-error-500\",\n \"disabled:opacity-30 disabled:pointer-events-none disabled:shadow-none\",\n ],\n {\n variants: {\n // Box dimensions are unchanged from the original.\n size: {\n sm: \"h-3 w-3\",\n lg: \"h-3.5 w-3.5\",\n xl: \"h-4 w-4\",\n },\n // New, optional. Defaults to \"primary\".\n intent: intentClasses,\n },\n defaultVariants: {\n size: \"lg\",\n intent: \"primary\",\n },\n },\n);\n\n// The tick scales with the box so it never touches the border.\nconst checkIconSize = {\n sm: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\",\n xl: \"w-3 h-3\",\n};\n\ninterface CheckboxProps\n extends\n Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof checkboxVariant> {\n size?: \"sm\" | \"lg\" | \"xl\";\n}\n\nconst Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ size, intent, className, checked, ...props }, ref) => {\n return (\n <div className=\"inline-flex relative items-center\">\n <input\n ref={ref}\n type=\"checkbox\"\n {...(checked !== undefined ? { checked } : {})}\n {...props}\n className={cn(\"peer\", checkboxVariant({ size, intent, className }))}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute text-white pointer-events-none top-2/4 left-2/4 -translate-y-2/4 -translate-x-2/4\",\n // the tick fades and pops in when checked\n \"opacity-0 scale-50 peer-checked:opacity-100 peer-checked:scale-100\",\n \"transition-[opacity,transform] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={checkIconSize[size ?? \"lg\"]}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n </div>\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n\nexport default Checkbox;\n","import React, { ReactNode, HTMLAttributes } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { cva, VariantProps } from \"class-variance-authority\";\n\ninterface ChipProps\n extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof chipVariants> {\n children: ReactNode;\n dot?: boolean;\n dotColor?: string;\n startIcon?: JSX.Element;\n endIcon?: JSX.Element;\n}\n\ntype ChipIntent =\n | \"default\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"blue\"\n | \"primary\"\n | \"bluegray\"\n | \"bluelight\"\n | \"violet\"\n | \"indigo\"\n | \"purple\"\n | \"pink\"\n | \"rose\"\n | \"orange\";\n\n/* -------------------------------------------------------------------------- */\n/* Per-intent styles. Class names are written out in full so Tailwind can */\n/* detect them. */\n/* - soft: the default look (same background as before) plus a hairline */\n/* inset ring for definition */\n/* - outlined: new, white background with a coloured ring */\n/* - solid: new, filled with the strong shade and white text */\n/* -------------------------------------------------------------------------- */\n\nconst tones: Record<\n ChipIntent,\n { soft: string; outlined: string; solid: string }\n> = {\n default: {\n soft: \"ring-gray-200\",\n outlined: \"bg-white text-gray-700 ring-gray-300\",\n solid: \"bg-gray-600 text-white ring-gray-600\",\n },\n success: {\n soft: \"ring-success-200\",\n outlined: \"bg-white text-success-700 ring-success-300\",\n solid: \"bg-success-600 text-white ring-success-600\",\n },\n warning: {\n soft: \"ring-warning-200\",\n outlined: \"bg-white text-warning-700 ring-warning-300\",\n solid: \"bg-warning-600 text-white ring-warning-600\",\n },\n error: {\n soft: \"ring-error-200\",\n outlined: \"bg-white text-error-700 ring-error-300\",\n solid: \"bg-error-700 text-white ring-error-700\",\n },\n blue: {\n soft: \"ring-blue-200\",\n outlined: \"bg-white text-blue-700 ring-blue-300\",\n solid: \"bg-blue-600 text-white ring-blue-600\",\n },\n primary: {\n soft: \"ring-primary-200\",\n outlined: \"bg-white text-primary-700 ring-primary-300\",\n solid: \"bg-primary-600 text-white ring-primary-600\",\n },\n bluegray: {\n soft: \"ring-bluegray-200\",\n outlined: \"bg-white text-bluegray-700 ring-bluegray-300\",\n solid: \"bg-bluegray-600 text-white ring-bluegray-600\",\n },\n bluelight: {\n soft: \"ring-bluelight-200\",\n outlined: \"bg-white text-bluelight-700 ring-bluelight-300\",\n solid: \"bg-bluelight-600 text-white ring-bluelight-600\",\n },\n violet: {\n soft: \"ring-violet-200\",\n outlined: \"bg-white text-violet-700 ring-violet-300\",\n solid: \"bg-violet-600 text-white ring-violet-600\",\n },\n indigo: {\n soft: \"ring-indigo-200\",\n outlined: \"bg-white text-indigo-700 ring-indigo-300\",\n solid: \"bg-indigo-600 text-white ring-indigo-600\",\n },\n purple: {\n soft: \"ring-purple-200\",\n outlined: \"bg-white text-purple-700 ring-purple-300\",\n solid: \"bg-purple-600 text-white ring-purple-600\",\n },\n pink: {\n soft: \"ring-pink-200\",\n outlined: \"bg-white text-pink-700 ring-pink-300\",\n solid: \"bg-pink-600 text-white ring-pink-600\",\n },\n rose: {\n soft: \"ring-rose-200\",\n outlined: \"bg-white text-rose-700 ring-rose-300\",\n solid: \"bg-rose-600 text-white ring-rose-600\",\n },\n orange: {\n soft: \"ring-orange-200\",\n outlined: \"bg-white text-orange-700 ring-orange-300\",\n solid: \"bg-orange-600 text-white ring-orange-600\",\n },\n};\n\nconst intents = Object.keys(tones) as ChipIntent[];\n\nconst chipVariants = cva(\n [\n \"inline-flex items-center w-fit gap-1.5 rounded-full capitalize\",\n \"font-medium whitespace-nowrap align-middle select-none\",\n \"ring-1 ring-inset\",\n ],\n {\n variants: {\n // New, optional. \"soft\" is the default and keeps the existing look.\n variant: {\n soft: \"\",\n outlined: \"\",\n solid: \"\",\n },\n intent: {\n default: \"bg-gray-50 text-gray-700\",\n success: \"bg-success-50 text-success-700\",\n warning: \"bg-warning-50 text-warning-700\",\n error: \"bg-error-50 text-error-700\",\n blue: \"bg-blue-50 text-blue-700\",\n primary: \"bg-primary-50 text-primary-700\",\n bluegray: \"bg-bluegray-50 text-bluegray-700\",\n bluelight: \"bg-bluelight-50 text-bluelight-700\",\n violet: \"bg-violet-50 text-violet-700\",\n indigo: \"bg-indigo-50 text-indigo-700\",\n purple: \"bg-purple-50 text-purple-700\",\n pink: \"bg-pink-25 text-pink-700\",\n rose: \"bg-rose-50 text-rose-700\",\n orange: \"bg-orange-50 text-orange-700\",\n },\n size: {\n sm: \"text-xs px-2 py-0.5\",\n md: \"text-sm px-2.5 py-0.5\",\n lg: \"text-base px-3 py-1\",\n },\n },\n compoundVariants: [\n ...intents.map((intent) => ({\n variant: \"soft\" as const,\n intent,\n className: tones[intent].soft,\n })),\n ...intents.map((intent) => ({\n variant: \"outlined\" as const,\n intent,\n className: tones[intent].outlined,\n })),\n ...intents.map((intent) => ({\n variant: \"solid\" as const,\n intent,\n className: tones[intent].solid,\n })),\n ],\n defaultVariants: {\n variant: \"soft\",\n intent: \"default\",\n size: \"md\",\n },\n },\n);\n\nconst dotColorVariants: Record<string, string> = {\n default: \"bg-gray-600\",\n success: \"bg-success-600\",\n warning: \"bg-warning-600\",\n error: \"bg-error-600\",\n blue: \"bg-blue-600\",\n primary: \"bg-primary-600\",\n bluegray: \"bg-bluegray-500\",\n bluelight: \"bg-bluelight-600\",\n violet: \"bg-violet-700\",\n indigo: \"bg-indigo-700\",\n purple: \"bg-purple-700\",\n pink: \"bg-pink-700\",\n rose: \"bg-rose-600\",\n orange: \"bg-orange-600\",\n};\n\nconst iconWrapper = \"inline-flex shrink-0 items-center\";\n\nconst Chip = ({\n children,\n className,\n size,\n variant,\n intent = \"default\",\n dot,\n dotColor,\n startIcon,\n endIcon,\n ...rest\n}: ChipProps) => {\n const resolvedIntent = intent ?? \"default\";\n\n // On a solid chip the intent-coloured dot would be invisible, so it\n // defaults to white there. An explicit `dotColor` always wins.\n const defaultDot =\n variant === \"solid\"\n ? \"bg-white/90\"\n : dotColorVariants[resolvedIntent] || \"bg-primary-600\";\n\n return (\n <span\n className={cn(\n chipVariants({ intent: resolvedIntent, size, variant }),\n className,\n )}\n {...rest}\n >\n {startIcon && (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {startIcon}\n </span>\n )}\n\n {!startIcon && dot && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"shrink-0 rounded-full\",\n size === \"lg\" ? \"w-2 h-2\" : \"w-1.5 h-1.5\",\n dotColor || defaultDot,\n )}\n />\n )}\n\n {children}\n\n {endIcon && (\n <span aria-hidden=\"true\" className={iconWrapper}>\n {endIcon}\n </span>\n )}\n </span>\n );\n};\n\nexport default Chip;\n","import { cn } from \"../utils/utils\";\nimport React from \"react\";\n\ninterface CircularProgressBarProps {\n strokeWidth?: number;\n size?: number;\n percentage: number;\n text?: string;\n textClassName?: string;\n}\n\nconst CircularProgressBar = ({\n percentage,\n size = 160,\n strokeWidth = 8,\n text,\n textClassName,\n}: CircularProgressBarProps) => {\n const radius = (size - strokeWidth) / 2;\n const viewBox = `0 0 ${size} ${size}`;\n const dashArray = radius * Math.PI * 2;\n const dashOffset = dashArray - (dashArray * (percentage || 0)) / 100;\n\n return (\n <svg width={size} height={size} viewBox={viewBox}>\n <circle\n className=\"fill-none stroke-gray-200\"\n cx={size / 2}\n cy={size / 2}\n r={radius}\n strokeWidth={`${strokeWidth}px`}\n />\n <circle\n className=\"fill-none stroke-primary-600 transition-all delay-200 ease-in\"\n cx={size / 2}\n cy={size / 2}\n r={radius}\n strokeLinecap=\"round\"\n strokeWidth={`${strokeWidth}px`}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n style={{\n strokeDasharray: dashArray,\n strokeDashoffset: dashOffset,\n }}\n />\n <text\n x=\"50%\"\n y=\"50%\"\n dy=\".3em\"\n textAnchor=\"middle\"\n fill=\"currentColor\"\n className={cn(textClassName)}\n >\n {text}\n </text>\n </svg>\n );\n};\n\nexport default CircularProgressBar;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { RiArrowDownSLine, RiCheckLine, RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport type { SelectGroup, SelectOption } from \"./Select\";\n\nexport type ComboboxOption = SelectOption;\nexport type ComboboxGroup = SelectGroup;\n\nexport interface ComboboxProps {\n /** Flat options, or groups of options. */\n options: (ComboboxOption | ComboboxGroup)[];\n /** Controlled value. Use null for \"nothing selected\". */\n value?: string | number | null;\n /** Uncontrolled initial value. */\n defaultValue?: string | number | null;\n /** Called with the new value (null when cleared) and its option. */\n onChange?: (value: string | number | null, option: ComboboxOption | null) => void;\n /** Optional. Called whenever the user types. Use it to fetch options from a server. */\n onInputChange?: (query: string) => void;\n /**\n * Optional. Custom matcher, or false to turn off client-side filtering\n * (when you filter on the server). Defaults to a case-insensitive \"contains\" match on the label.\n */\n filter?: ((option: ComboboxOption, query: string) => boolean) | false;\n /** Optional. Shows a \"Loading…\" row. */\n loading?: boolean;\n /** Optional. Offer a \"Create …\" row when the typed text matches no option. */\n allowCreate?: boolean;\n /** Optional. Called when the user chooses the \"Create …\" row. Add the option and set the value yourself. */\n onCreate?: (label: string) => void;\n placeholder?: string;\n /** Optional. Text shown when nothing matches. */\n emptyText?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. \"sm\" = 320px, \"lg\" = 313px, default = full width (same as Input). */\n size?: \"sm\" | \"lg\";\n /** Optional. Open the list above or below. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. Show a clear button when a value is selected. Defaults to true. */\n clearable?: boolean;\n /** Optional. Max height of the list in px. Defaults to 264. */\n maxHeight?: number;\n id?: string;\n /** Optional. Adds a hidden input for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n}\n\nconst isGroup = (o: ComboboxOption | ComboboxGroup): o is ComboboxGroup => \"options\" in o;\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\ntype Row =\n | { kind: \"option\"; option: ComboboxOption; group?: string; first?: boolean }\n | { kind: \"create\"; label: string };\n\nconst highlight = (text: string, query: string) => {\n const q = query.trim();\n if (!q) return text;\n const i = text.toLowerCase().indexOf(q.toLowerCase());\n if (i < 0) return text;\n return (\n <>\n {text.slice(0, i)}\n <mark className=\"rounded-sm bg-primary-100 text-inherit\">{text.slice(i, i + q.length)}</mark>\n {text.slice(i + q.length)}\n </>\n );\n};\n\nconst Combobox = ({\n options,\n value,\n defaultValue = null,\n onChange,\n onInputChange,\n filter,\n loading = false,\n allowCreate = false,\n onCreate,\n placeholder = \"Search or select\",\n emptyText = \"No results\",\n disabled = false,\n error = false,\n size,\n placement = \"bottom\",\n clearable = true,\n maxHeight = 264,\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n}: ComboboxProps) => {\n const reactId = useId();\n const inputId = id ?? `combobox-${reactId}`;\n const listId = `${inputId}-list`;\n\n const [inner, setInner] = useState<string | number | null>(defaultValue);\n const current = value !== undefined ? value : inner;\n\n const flatAll = useMemo(() => {\n const out: { option: ComboboxOption; group?: string; first?: boolean }[] = [];\n options.forEach((o) => {\n if (isGroup(o)) o.options.forEach((opt, i) => out.push({ option: opt, group: o.label, first: i === 0 }));\n else out.push({ option: o });\n });\n return out;\n }, [options]);\n\n const selected = flatAll.find((f) => f.option.value === current)?.option ?? null;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(selected?.label ?? \"\");\n const [dirty, setDirty] = useState(false); // user typed since opening\n const [active, setActive] = useState(-1);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n // Keep the text in sync with the selected option when closed\n useEffect(() => {\n if (!open) setQuery(selected?.label ?? \"\");\n }, [selected, open]);\n\n const matcher = useCallback(\n (o: ComboboxOption, q: string) =>\n filter === false\n ? true\n : filter\n ? filter(o, q)\n : o.label.toLowerCase().includes(q.trim().toLowerCase()),\n [filter],\n );\n\n const rows: Row[] = useMemo(() => {\n const base = dirty && query.trim() ? flatAll.filter((f) => matcher(f.option, query)) : flatAll;\n const out: Row[] = [];\n let lastGroup: string | undefined;\n base.forEach((f) => {\n out.push({ kind: \"option\", option: f.option, group: f.group, first: f.group !== lastGroup });\n lastGroup = f.group;\n });\n const q = query.trim();\n if (\n allowCreate &&\n dirty &&\n q &&\n !flatAll.some((f) => f.option.label.toLowerCase() === q.toLowerCase())\n )\n out.push({ kind: \"create\", label: q });\n return out;\n }, [flatAll, dirty, query, matcher, allowCreate]);\n\n const isEnabled = (r: Row) => r.kind === \"create\" || !r.option.disabled;\n const firstEnabled = useCallback(() => rows.findIndex(isEnabled), [rows]);\n\n const commit = (opt: ComboboxOption | null) => {\n const next = opt ? opt.value : null;\n if (value === undefined) setInner(next);\n onChange?.(next, opt);\n };\n\n const close = useCallback(() => {\n setOpen(false);\n setDirty(false);\n setActive(-1);\n }, []);\n\n const openList = () => {\n if (disabled || open) return;\n setOpen(true);\n setDirty(false);\n const idx = flatAll.findIndex((f) => f.option.value === current);\n setActive(idx >= 0 ? idx : -1);\n };\n\n const pick = (i: number) => {\n const r = rows[i];\n if (!r) return;\n if (r.kind === \"create\") {\n onCreate?.(r.label);\n close();\n return;\n }\n if (r.option.disabled) return;\n commit(r.option);\n setQuery(r.option.label);\n close();\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) close();\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, close]);\n\n // When the filtered rows change, point at the first enabled one\n useEffect(() => {\n if (open && dirty) setActive(firstEnabled());\n }, [rows, open, dirty, firstEnabled]);\n\n useEffect(() => {\n if (!open || active < 0) return;\n const el = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n const list = listRef.current;\n if (!el || !list) return;\n if (el.offsetTop < list.scrollTop) list.scrollTop = el.offsetTop;\n else if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight)\n list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;\n }, [open, active]);\n\n const step = (dir: 1 | -1) => {\n if (!open) {\n openList();\n return;\n }\n for (let i = active + dir; i >= 0 && i < rows.length; i += dir) {\n if (isEnabled(rows[i])) {\n setActive(i);\n return;\n }\n }\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n step(1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n step(-1);\n break;\n case \"Enter\":\n if (open && active >= 0) {\n e.preventDefault();\n pick(active);\n }\n break;\n case \"Escape\":\n if (open) {\n e.preventDefault();\n e.stopPropagation();\n setQuery(selected?.label ?? \"\");\n close();\n }\n break;\n case \"Tab\":\n if (open) close();\n break;\n }\n };\n\n const activeId = open && active >= 0 ? `${inputId}-opt-${active}` : undefined;\n const showClear = clearable && !disabled && (selected || (open && query));\n\n return (\n <div ref={rootRef} className=\"relative inline-block max-w-full\">\n {name && <input type=\"hidden\" name={name} value={current ?? \"\"} />}\n\n <div\n className={cn(\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n disabled && \"opacity-30 bg-gray-300 select-none pointer-events-none shadow-none\",\n size === \"sm\" ? \"w-[320px] h-10\" : size === \"lg\" ? \"w-[313px] h-11\" : \"w-full h-10\",\n error && \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n className,\n )}\n >\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n disabled={disabled}\n value={query}\n placeholder={placeholder}\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n aria-activedescendant={activeId}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-invalid={error || undefined}\n onFocus={(e) => {\n openList();\n e.currentTarget.select();\n }}\n onClick={openList}\n onChange={(e) => {\n setQuery(e.target.value);\n setDirty(true);\n if (!open) setOpen(true);\n onInputChange?.(e.target.value);\n }}\n onKeyDown={onKeyDown}\n className=\"w-full min-w-0 rounded-md bg-transparent text-sm text-gray-900 placeholder:text-gray-500 focus:outline-none\"\n />\n {showClear && (\n <button\n type=\"button\"\n aria-label=\"Clear\"\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (selected) commit(null);\n setQuery(\"\");\n setDirty(true);\n onInputChange?.(\"\");\n inputRef.current?.focus();\n }}\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-800\",\n focusRing,\n )}\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={open ? \"Close options\" : \"Open options\"}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (open) close();\n else {\n inputRef.current?.focus();\n openList();\n }\n }}\n className=\"inline-flex shrink-0 text-gray-500 group-hover:text-gray-600\"\n >\n <RiArrowDownSLine\n size={18}\n aria-hidden=\"true\"\n className={cn(\"transition-transform duration-200 motion-reduce:transition-none\", open && \"rotate-180\")}\n />\n </button>\n </div>\n\n {open && (\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n style={{ maxHeight }}\n className={cn(\n \"absolute left-0 z-50 w-full min-w-[160px] overflow-y-auto rounded-xl border border-gray-200 bg-white p-1 shadow-lg\",\n placement === \"top\" ? \"bottom-full mb-2\" : \"top-full mt-2\",\n )}\n >\n {loading && (\n <div role=\"presentation\" className=\"px-3 py-2 text-sm text-gray-500\">\n Loading…\n </div>\n )}\n {!loading && rows.length === 0 && (\n <div role=\"presentation\" className=\"px-3 py-2 text-sm text-gray-500\">\n {emptyText}\n </div>\n )}\n {rows.map((r, i) => {\n const isActive = i === active;\n if (r.kind === \"create\") {\n return (\n <div\n key=\"__create\"\n id={`${inputId}-opt-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={false}\n onMouseDown={(e) => e.preventDefault()}\n onMouseMove={() => active !== i && setActive(i)}\n onClick={() => pick(i)}\n className={cn(\n \"cursor-pointer rounded-lg px-3 py-2 text-sm font-medium text-primary-700\",\n isActive && \"bg-gray-100\",\n )}\n >\n Create “{r.label}”\n </div>\n );\n }\n const o = r.option;\n const isSel = o.value === current;\n return (\n <React.Fragment key={`${o.value}-${i}`}>\n {r.group && r.first && (\n <div\n role=\"presentation\"\n className={cn(\n \"px-3 pb-1 pt-2 text-xs font-semibold uppercase tracking-wide text-gray-400\",\n i > 0 && \"mt-1 border-t border-gray-100\",\n )}\n >\n {r.group}\n </div>\n )}\n <div\n id={`${inputId}-opt-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={isSel}\n aria-disabled={o.disabled || undefined}\n onMouseDown={(e) => e.preventDefault()}\n onMouseMove={() => !o.disabled && active !== i && setActive(i)}\n onClick={() => pick(i)}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm text-gray-900\",\n isActive && \"bg-gray-100\",\n isSel && \"font-medium text-primary-700\",\n o.disabled && \"cursor-not-allowed opacity-40\",\n )}\n >\n {o.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {o.icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{dirty ? highlight(o.label, query) : o.label}</span>\n {o.description && (\n <span className=\"block truncate text-xs font-normal text-gray-500\">{o.description}</span>\n )}\n </span>\n {isSel && <RiCheckLine size={16} aria-hidden=\"true\" className=\"shrink-0 text-primary-600\" />}\n </div>\n </React.Fragment>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nCombobox.displayName = \"Combobox\";\n\nexport default Combobox;\n","\"use client\";\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n} from \"react\";\nimport { RiArrowDownSLine, RiCheckLine, RiPaletteLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Input from \"./Input\";\n\n/* -------------------------------------------------------------------------- */\n/* Palette */\n/* */\n/* Mirrors the colour scales in globals.css (primary, gray, error, warning, */\n/* success are CSS variables, so a consuming app can re-theme them) and in */\n/* tailwind.config.ts (the remaining families are fixed hex values). */\n/* */\n/* `themed` families are read from their CSS variable at runtime; the hex */\n/* listed here is only the fallback used when the variable isn't defined. */\n/* Order matches SHADES below. */\n/* -------------------------------------------------------------------------- */\n\nconst SHADES = [25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900] as const;\nconst DEFAULT_SHADE_INDEX = SHADES.indexOf(500);\n\nconst PALETTE = {\n primary: {\n label: \"Primary\",\n themed: true,\n colors: [\"#f5faff\", \"#eff8ff\", \"#d1e9ff\", \"#b2ddff\", \"#84caff\", \"#53b1fd\", \"#2e90fa\", \"#1570ef\", \"#175cd3\", \"#1849a9\", \"#194185\"],\n },\n gray: {\n label: \"Gray\",\n themed: true,\n colors: [\"#ffffff\", \"#f9fafb\", \"#f2f4f7\", \"#eaecf0\", \"#d0d5dd\", \"#98a2b3\", \"#667085\", \"#475467\", \"#344054\", \"#1d2939\", \"#101828\"],\n },\n error: {\n label: \"Error\",\n themed: true,\n colors: [\"#fffbfa\", \"#fef3f2\", \"#fee4e2\", \"#fecdca\", \"#fda29b\", \"#f97066\", \"#f04438\", \"#d92d20\", \"#b42318\", \"#912018\", \"#7a271a\"],\n },\n warning: {\n label: \"Warning\",\n themed: true,\n colors: [\"#fffdf5\", \"#fffaeb\", \"#fef0c7\", \"#fedf89\", \"#fec84b\", \"#fdb022\", \"#f79009\", \"#dc6803\", \"#b54708\", \"#93370d\", \"#7a2e0e\"],\n },\n success: {\n label: \"Success\",\n themed: true,\n colors: [\"#f6fef9\", \"#ecfdf3\", \"#d1fadf\", \"#a6f4c5\", \"#6ce9a6\", \"#32d583\", \"#12b76a\", \"#039855\", \"#027a48\", \"#05603a\", \"#054f31\"],\n },\n blue: {\n label: \"Blue\",\n themed: false,\n colors: [\"#f5faff\", \"#eff8ff\", \"#d1e9ff\", \"#b2ddff\", \"#84caff\", \"#53b1fd\", \"#2e90fa\", \"#1570ef\", \"#175cd3\", \"#1849a9\", \"#194185\"],\n },\n bluegray: {\n label: \"Blue gray\",\n themed: false,\n colors: [\"#fcfcfd\", \"#f8f9fc\", \"#eaecf5\", \"#d5d9eb\", \"#afb5d9\", \"#717bbc\", \"#4e5ba6\", \"#3e4784\", \"#363f72\", \"#293056\", \"#101323\"],\n },\n bluelight: {\n label: \"Blue light\",\n themed: false,\n colors: [\"#f5fbff\", \"#f0f9ff\", \"#e0f2fe\", \"#b9e6fe\", \"#7cd4fd\", \"#36bffa\", \"#0ba5ec\", \"#0086c9\", \"#026aa2\", \"#065986\", \"#0b4a6f\"],\n },\n indigo: {\n label: \"Indigo\",\n themed: false,\n colors: [\"#f5f8ff\", \"#eef4ff\", \"#e0eaff\", \"#c7d7fe\", \"#a4bcfd\", \"#8098f9\", \"#6172f3\", \"#444ce7\", \"#3538cd\", \"#2d31a6\", \"#2d3282\"],\n },\n purple: {\n label: \"Purple\",\n themed: false,\n colors: [\"#fafaff\", \"#f4f3ff\", \"#ebe9fe\", \"#d9d6fe\", \"#bdb4fe\", \"#9b8afb\", \"#7a5af8\", \"#6938ef\", \"#5925dc\", \"#4a1fb8\", \"#3e1c96\"],\n },\n violet: {\n label: \"Violet\",\n themed: false,\n colors: [\"#fcfaff\", \"#f9f5ff\", \"#f4ebff\", \"#e9d7fe\", \"#d6bbfb\", \"#b692f6\", \"#9e77ed\", \"#7f56d9\", \"#6941c6\", \"#53389e\", \"#42307d\"],\n },\n pink: {\n label: \"Pink\",\n themed: false,\n colors: [\"#fef6fb\", \"#fdf2fa\", \"#fce7f6\", \"#fcceee\", \"#faa7e0\", \"#f670c7\", \"#ee46bc\", \"#dd2590\", \"#c11574\", \"#9e165f\", \"#851651\"],\n },\n rose: {\n label: \"Rose\",\n themed: false,\n colors: [\"#fff5f6\", \"#fff1f3\", \"#ffe4e8\", \"#fecdd6\", \"#fea3b4\", \"#fd6f8e\", \"#f63d68\", \"#e31b54\", \"#c01048\", \"#a11043\", \"#89123e\"],\n },\n orange: {\n label: \"Orange\",\n themed: false,\n colors: [\"#fffaf5\", \"#fff6ed\", \"#ffead5\", \"#fddcab\", \"#feb273\", \"#fd853a\", \"#fb6514\", \"#ec4a0a\", \"#c4320a\", \"#9c2a10\", \"#7e2410\"],\n },\n} as const;\n\ntype ColorFamily = keyof typeof PALETTE;\ntype ColorShade = (typeof SHADES)[number];\n\nconst ALL_FAMILIES = Object.keys(PALETTE) as ColorFamily[];\n\ninterface ColorPickerToken {\n family: ColorFamily;\n shade: ColorShade;\n}\n\ninterface ColorPickerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\" | \"placeholder\"\n> {\n /** Selected colour as a hex string (`#rgb` or `#rrggbb`). Makes the component controlled. */\n value?: string;\n /** Initial colour when uncontrolled. */\n defaultValue?: string;\n /**\n * Called with the new colour as a lowercase `#rrggbb` string. When the colour\n * is one of the theme swatches, the second argument names it\n * (e.g. `{ family: \"primary\", shade: 600 }`).\n */\n onChange?: (value: string, token?: ColorPickerToken) => void;\n /** Limit which colour families are offered. Defaults to all theme families. */\n families?: ColorFamily[];\n /** Show the hex field and native colour input for colours outside the palette. Defaults to true. */\n showCustomColor?: boolean;\n /** Text shown in the trigger while no colour is selected. */\n placeholder?: string;\n /** Which side of the trigger the panel opens on. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n disabled?: boolean;\n error?: boolean;\n /** When set, a hidden input carries the hex value so the picker works inside native forms. */\n name?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nconst HEX_RE = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\nconst HEX_COMPLETE_RE = /^#?[0-9a-f]{6}$/i;\n\n/** Returns a lowercase `#rrggbb` string, or null when the input isn't a hex colour. */\nconst normalizeHex = (input: string | undefined | null): string | null => {\n if (!input) return null;\n const match = input.trim().match(HEX_RE);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n return `#${hex}`;\n};\n\n/** Picks a readable check-mark colour for a given swatch. */\nconst checkColor = (hex: string) => {\n const n = parseInt(hex.slice(1), 16);\n const r = (n >> 16) & 255;\n const g = (n >> 8) & 255;\n const b = n & 255;\n return 0.299 * r + 0.587 * g + 0.114 * b > 160 ? \"#101828\" : \"#ffffff\";\n};\n\ntype ResolvedPalette = Record<string, string>;\n\nconst keyOf = (family: ColorFamily, shade: ColorShade) => `${family}-${shade}`;\n\n/**\n * Reads the live colours for every family. Themed families come from their CSS\n * variable on `element` (so overridden themes are respected); anything missing\n * or not a hex falls back to the default value above.\n */\nconst resolvePalette = (element: Element): ResolvedPalette => {\n const styles = getComputedStyle(element);\n const out: ResolvedPalette = {};\n for (const family of ALL_FAMILIES) {\n const def = PALETTE[family];\n SHADES.forEach((shade, i) => {\n const fromVar = def.themed\n ? normalizeHex(styles.getPropertyValue(`--${family}-${shade}`))\n : null;\n out[keyOf(family, shade)] = fromVar ?? def.colors[i];\n });\n }\n return out;\n};\n\nconst findToken = (\n hex: string | null,\n palette: ResolvedPalette | null,\n families: ColorFamily[],\n): ColorPickerToken | undefined => {\n if (!hex || !palette) return undefined;\n for (const family of families) {\n for (const shade of SHADES) {\n if (palette[keyOf(family, shade)] === hex) return { family, shade };\n }\n }\n return undefined;\n};\n\n// Shared focus ring (same family as Input, Dropdown and Pagination)\nconst focusRing =\n \"focus-visible:outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\";\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nconst ColorPicker = forwardRef<HTMLButtonElement, ColorPickerProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n families,\n showCustomColor = true,\n placeholder = \"Select color\",\n placement = \"bottom\",\n disabled = false,\n error = false,\n name,\n id,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ...props\n },\n ref,\n ) => {\n const autoId = useId().replace(/:/g, \"\");\n // `id` goes on the trigger so `<Label htmlFor={id}>` works, like a native control.\n const baseId = id ?? `color-picker-${autoId}`;\n const panelId = `${baseId}-panel`;\n\n const familyList = useMemo(() => {\n const wanted = (families ?? []).filter((f) => f in PALETTE);\n return wanted.length > 0 ? wanted : ALL_FAMILIES;\n // join() keeps the memo stable when callers pass a new array each render\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [families?.join(\",\")]);\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string | undefined>(\n defaultValue,\n );\n const currentHex = normalizeHex(isControlled ? value : internalValue);\n\n const [open, setOpen] = useState(false);\n const isOpen = open && !disabled;\n const [activeFamily, setActiveFamily] = useState<ColorFamily>(\n familyList[0],\n );\n const shownFamily = familyList.includes(activeFamily)\n ? activeFamily\n : familyList[0];\n\n // Resolved lazily on open, so nothing touches `window` during SSR/hydration.\n const [palette, setPalette] = useState<ResolvedPalette | null>(null);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const setTriggerRef = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLButtonElement | null>).current =\n node;\n },\n [ref],\n );\n\n // Draft text for the hex field (kept separate so partial input is allowed).\n const [draft, setDraft] = useState(currentHex ?? \"\");\n useEffect(() => {\n setDraft(currentHex ?? \"\");\n }, [currentHex]);\n const draftInvalid = draft.trim() !== \"\" && normalizeHex(draft) === null;\n\n // Read the theme and jump to the family of the current colour on open.\n useEffect(() => {\n if (!isOpen || !rootRef.current) return;\n const resolved = resolvePalette(rootRef.current);\n setPalette(resolved);\n const match = findToken(currentHex, resolved, familyList);\n if (match) setActiveFamily(match.family);\n // Only on open: later value changes shouldn't yank the user between families.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n // Close on outside pointer / focus leaving the picker.\n useEffect(() => {\n if (!isOpen) return;\n const outside = (event: Event) => {\n if (\n rootRef.current &&\n !rootRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", outside);\n document.addEventListener(\"focusin\", outside);\n return () => {\n document.removeEventListener(\"pointerdown\", outside);\n document.removeEventListener(\"focusin\", outside);\n };\n }, [isOpen]);\n\n const commit = (hex: string, token?: ColorPickerToken) => {\n if (!isControlled) setInternalValue(hex);\n onChange?.(hex, token ?? findToken(hex, palette, ALL_FAMILIES));\n };\n\n const pickSwatch = (family: ColorFamily, shade: ColorShade) => {\n // Read fresh so a theme change between open and click is respected.\n const live = rootRef.current ? resolvePalette(rootRef.current) : palette;\n const hex = live?.[keyOf(family, shade)];\n if (!hex) return;\n setPalette(live);\n commit(hex, { family, shade });\n };\n\n const handleDraftChange = (next: string) => {\n setDraft(next);\n // Commit as soon as a full 6-digit colour is typed or pasted.\n if (HEX_COMPLETE_RE.test(next.trim())) {\n const hex = normalizeHex(next);\n if (hex && hex !== currentHex) commit(hex);\n }\n };\n\n const handleDraftSettle = () => {\n const hex = normalizeHex(draft);\n if (hex) {\n if (hex !== currentHex) commit(hex);\n setDraft(hex);\n } else {\n setDraft(currentHex ?? \"\");\n }\n };\n\n // Arrow / Home / End move between the swatches of a radio group.\n const handleRadioKeys = (event: KeyboardEvent<HTMLDivElement>) => {\n const keys = [\n \"ArrowRight\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowUp\",\n \"Home\",\n \"End\",\n ];\n if (!keys.includes(event.key)) return;\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button[role=\"radio\"]',\n ),\n );\n const index = items.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n event.preventDefault();\n let next = index;\n if (event.key === \"Home\") next = 0;\n else if (event.key === \"End\") next = items.length - 1;\n else if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\")\n next = (index + 1) % items.length;\n else next = (index - 1 + items.length) % items.length;\n items[next].focus();\n items[next].click();\n };\n\n const swatchBg = (family: ColorFamily, shade: ColorShade) => {\n const live = palette?.[keyOf(family, shade)];\n if (live) return live;\n const fallback = PALETTE[family].colors[SHADES.indexOf(shade)];\n return PALETTE[family].themed\n ? `var(--${family}-${shade}, ${fallback})`\n : fallback;\n };\n\n const selectedToken = isOpen\n ? findToken(currentHex, palette, familyList)\n : undefined;\n const familyDef = PALETTE[shownFamily];\n const shadeTabStop =\n selectedToken?.family === shownFamily ? selectedToken.shade : SHADES[0];\n\n return (\n <div\n {...props}\n ref={rootRef}\n // Escape closes the panel and hands focus back to the trigger. It is\n // stopped here so an enclosing Modal doesn't also close.\n onKeyDown={(e) => {\n props.onKeyDown?.(e);\n if (e.key === \"Escape\" && isOpen) {\n e.stopPropagation();\n setOpen(false);\n triggerRef.current?.focus();\n }\n }}\n className={cn(\"relative w-full\", className)}\n >\n <button\n ref={setTriggerRef}\n id={baseId}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? panelId : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n onClick={() => setOpen((prev) => !prev)}\n className={cn(\n \"flex h-10 w-full items-center gap-2.5 rounded-xl border bg-white px-3.5 text-sm cursor-pointer\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n focusRing,\n isOpen\n ? \"border-primary-600 ring-4 ring-primary-100 hover:border-primary-600 hover:bg-white\"\n : \"border-gray-200\",\n error &&\n \"border-error-500 hover:border-error-600 focus-visible:border-error-500 focus-visible:ring-error-100\",\n error && isOpen && \"border-error-500 ring-error-100\",\n disabled &&\n \"bg-gray-300 hover:bg-gray-300 hover:border-gray-200 opacity-50 cursor-not-allowed shadow-none\",\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n \"h-5 w-5 shrink-0 rounded-md border border-black/10\",\n !currentHex && \"bg-gray-100\",\n )}\n style={currentHex ? { backgroundColor: currentHex } : undefined}\n />\n <span\n className={cn(\n \"min-w-0 flex-1 truncate text-left\",\n currentHex ? \"font-mono text-gray-900\" : \"text-gray-500\",\n )}\n >\n {currentHex ?? placeholder}\n </span>\n <RiArrowDownSLine\n aria-hidden=\"true\"\n size={18}\n className={cn(\n \"shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {name && <input type=\"hidden\" name={name} value={currentHex ?? \"\"} />}\n\n {isOpen && (\n <div\n id={panelId}\n role=\"dialog\"\n aria-label=\"Choose a color\"\n className={cn(\n \"absolute left-0 z-[1000] w-[304px] max-w-[calc(100vw-2rem)] rounded-xl border border-gray-200 bg-white p-3 shadow-lg\",\n \"fade-in-grow motion-reduce:[animation:none]\",\n placement === \"top\" ? \"bottom-full mb-1\" : \"top-full mt-1\",\n )}\n >\n {/* Family */}\n <div\n role=\"radiogroup\"\n aria-label=\"Color family\"\n onKeyDown={handleRadioKeys}\n className=\"grid grid-cols-7 gap-1\"\n >\n {familyList.map((family) => {\n const checked = family === shownFamily;\n return (\n <button\n key={family}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n aria-label={PALETTE[family].label}\n title={PALETTE[family].label}\n tabIndex={checked ? 0 : -1}\n onClick={() => setActiveFamily(family)}\n className={cn(\n \"flex h-8 items-center justify-center rounded-lg cursor-pointer\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-100\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n checked && \"bg-primary-50 ring-1 ring-primary-300\",\n )}\n >\n <span\n aria-hidden=\"true\"\n className=\"h-5 w-5 rounded-full border border-black/10\"\n style={{\n backgroundColor: swatchBg(\n family,\n SHADES[DEFAULT_SHADE_INDEX],\n ),\n }}\n />\n </button>\n );\n })}\n </div>\n\n {/* Shades */}\n <div className=\"mb-2 mt-3 flex items-center justify-between text-xs\">\n <span className=\"font-semibold text-gray-700\">\n {familyDef.label}\n </span>\n <span className=\"text-gray-500\" aria-live=\"polite\">\n {selectedToken\n ? `${PALETTE[selectedToken.family].label} ${selectedToken.shade}`\n : \"\"}\n </span>\n </div>\n <div\n role=\"radiogroup\"\n aria-label={`${familyDef.label} shades`}\n onKeyDown={handleRadioKeys}\n className=\"grid grid-cols-6 gap-1.5\"\n >\n {SHADES.map((shade) => {\n const hex =\n palette?.[keyOf(shownFamily, shade)] ??\n familyDef.colors[SHADES.indexOf(shade)];\n const checked = currentHex === hex;\n return (\n <button\n key={shade}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n aria-label={`${familyDef.label} ${shade}`}\n title={`${familyDef.label} ${shade} · ${hex}`}\n tabIndex={shade === shadeTabStop ? 0 : -1}\n onClick={() => pickSwatch(shownFamily, shade)}\n style={{ backgroundColor: swatchBg(shownFamily, shade) }}\n className={cn(\n \"flex h-8 items-center justify-center rounded-lg border border-black/10 cursor-pointer\",\n \"transition-transform duration-150 hover:scale-105 motion-reduce:transition-none motion-reduce:hover:scale-100\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-1\",\n checked && \"ring-2 ring-gray-900 ring-offset-1\",\n )}\n >\n {checked && (\n <RiCheckLine\n aria-hidden=\"true\"\n size={16}\n style={{ color: checkColor(hex) }}\n />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Custom colour */}\n {showCustomColor && (\n <div className=\"mt-3 flex items-center gap-2 border-t border-gray-100 pt-3\">\n <Input\n type=\"text\"\n value={draft}\n placeholder=\"#000000\"\n spellCheck={false}\n autoComplete=\"off\"\n aria-label=\"Hex color\"\n error={draftInvalid}\n onChange={(e) => handleDraftChange(e.target.value)}\n // select on focus so typing or pasting replaces the whole code\n onFocus={(e) => e.currentTarget.select()}\n onBlur={handleDraftSettle}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleDraftSettle();\n }\n }}\n className=\"min-w-0 flex-1 font-mono\"\n />\n <label\n title=\"Pick a custom color\"\n className={cn(\n \"relative inline-flex h-10 w-10 shrink-0 cursor-pointer items-center justify-center rounded-xl border border-gray-200 bg-white text-gray-600\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n )}\n >\n <RiPaletteLine aria-hidden=\"true\" size={18} />\n <input\n type=\"color\"\n aria-label=\"Custom color\"\n value={currentHex ?? \"#000000\"}\n onChange={(e) => commit(e.target.value.toLowerCase())}\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n />\n </label>\n </div>\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nColorPicker.displayName = \"ColorPicker\";\n\nexport type { ColorPickerProps, ColorPickerToken, ColorFamily, ColorShade };\n// Shared with ThemeColorPicker so both read the same palette definition.\nexport { PALETTE as COLOR_PALETTE, SHADES as COLOR_SHADES };\nexport default ColorPicker;\n","import React, { InputHTMLAttributes, forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface InputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> {\n size?: \"sm\" | \"lg\";\n startIcon?: JSX.Element;\n endIcon?: JSX.Element;\n disabled?: boolean;\n error?: boolean;\n type:\n | \"text\"\n | \"url\"\n | \"email\"\n | \"password\"\n | \"number\"\n | \"tel\"\n | \"search\"\n | \"time\";\n}\n\nconst iconWrapper = \"inline-flex shrink-0 items-center\";\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size,\n startIcon,\n endIcon,\n className,\n type,\n error,\n disabled,\n id,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n ...props\n },\n ref,\n ) => {\n return (\n <div\n className={cn(\n // layout (padding, heights and widths below are unchanged)\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n // surface\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // hover\n \"hover:bg-gray-50 hover:border-gray-300\",\n // focus: border colour change plus a soft outer ring\n \"focus-within:border-primary-600 focus-within:bg-gray-25 focus-within:ring-4 focus-within:ring-primary-100\",\n \"focus-within:hover:bg-gray-50 focus-within:hover:border-primary-600\",\n // disabled\n \"has-[:disabled]:opacity-30 has-[:disabled]:bg-gray-300 has-[:disabled]:select-none has-[:disabled]:pointer-events-none has-[:disabled]:shadow-none\",\n size === \"sm\"\n ? \"w-[320px] h-10\"\n : size === \"lg\"\n ? \"w-[313px] h-11\"\n : \"w-full h-10\",\n error &&\n \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100 focus-within:hover:border-error-500\",\n className,\n )}\n >\n {startIcon && (\n <span\n aria-hidden=\"true\"\n className={cn(\n iconWrapper,\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"group-hover:text-gray-600 group-focus-within:text-gray-600\",\n disabled && \"text-gray-900\",\n error && \"text-error-500\",\n )}\n >\n {startIcon}\n </span>\n )}\n <input\n aria-invalid={error || undefined}\n {...props}\n ref={ref}\n id={id}\n disabled={disabled}\n type={type}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-disabled={disabled}\n className={cn(\n \"w-full min-w-0 text-sm text-gray-900 focus:outline-none focus:ring-offset-0 bg-transparent disabled:text-gray-900 placeholder:text-gray-500 group-hover:placeholder:text-gray-500 rounded-md\",\n size,\n )}\n />\n {endIcon && (\n <span\n aria-hidden=\"true\"\n className={cn(\n iconWrapper,\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"group-hover:text-gray-600 group-focus-within:text-gray-600\",\n disabled && \"text-gray-900\",\n )}\n >\n {endIcon}\n </span>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n\nexport default Input;\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n RiArrowLeftSLine,\n RiArrowRightSLine,\n RiCalendarLine,\n RiCloseLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n}\n\ninterface DatePickerBaseProps {\n /** Optional. Earliest selectable date (inclusive). */\n min?: Date;\n /** Optional. Latest selectable date (inclusive). */\n max?: Date;\n /** Optional. Return true to make a specific date unselectable (e.g. weekends, holidays). */\n isDateDisabled?: (date: Date) => boolean;\n /** Optional. Text shown when nothing is selected. */\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. \"sm\" = 320px, \"lg\" = 313px, default = full width (same as Input). */\n size?: \"sm\" | \"lg\";\n /** Optional. Open the calendar above or below the field. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. Show a clear button when a value is selected. Defaults to true. */\n clearable?: boolean;\n /** Optional. Show a \"Today\" shortcut in the footer. Defaults to true. */\n showToday?: boolean;\n /** Optional. First day of the week: 0 = Sunday, 1 = Monday. Defaults to 0. */\n weekStartsOn?: 0 | 1;\n /** Optional. BCP 47 locale used for month and weekday names. Defaults to \"en-US\". */\n locale?: string;\n /** Optional. Intl.DateTimeFormat options for the text shown in the field. */\n formatOptions?: Intl.DateTimeFormatOptions;\n id?: string;\n /** Optional. Adds a hidden input (ISO date, or \"start/end\" for ranges) for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n}\n\ninterface DatePickerSingleProps extends DatePickerBaseProps {\n mode?: \"single\";\n /** Controlled value. */\n value?: Date | null;\n /** Uncontrolled initial value. */\n defaultValue?: Date | null;\n onChange?: (date: Date | null) => void;\n}\n\nexport interface DateRangePreset {\n label: string;\n range: DateRange;\n}\n\ninterface DatePickerRangeProps extends DatePickerBaseProps {\n mode: \"range\";\n /** Optional. Shortcut buttons (e.g. \"Last 7 days\") shown above the footer. */\n presets?: DateRangePreset[];\n /** Controlled value. */\n value?: DateRange;\n /** Uncontrolled initial value. */\n defaultValue?: DateRange;\n onChange?: (range: DateRange) => void;\n}\n\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n/* -------------------------------------------------------------------------- */\n/* Date utilities */\n/* -------------------------------------------------------------------------- */\n\nconst startOfDay = (d: Date) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\nconst addDays = (d: Date, n: number) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);\n\n/** Adds months and clamps the day (Jan 31 + 1 month = Feb 28/29). */\nconst addMonths = (d: Date, n: number) => {\n const target = new Date(d.getFullYear(), d.getMonth() + n, 1);\n const last = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();\n return new Date(\n target.getFullYear(),\n target.getMonth(),\n Math.min(d.getDate(), last),\n );\n};\n\nconst isSameDay = (a?: Date | null, b?: Date | null) =>\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\nconst dayKey = (d: Date) =>\n `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(\n d.getDate(),\n ).padStart(2, \"0\")}`;\n\nconst clampDate = (d: Date, min?: Date, max?: Date) => {\n const day = startOfDay(d);\n if (min && day < startOfDay(min)) return startOfDay(min);\n if (max && day > startOfDay(max)) return startOfDay(max);\n return day;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Shared styles */\n/* -------------------------------------------------------------------------- */\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst navButton = cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-lg text-gray-600\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-100 hover:text-gray-900 disabled:pointer-events-none disabled:opacity-30\",\n focusRing,\n);\n\nconst textButton =\n \"rounded-md px-2 py-1 text-sm font-medium text-primary-700 transition-colors duration-150 motion-reduce:transition-none hover:bg-primary-50 disabled:pointer-events-none disabled:opacity-30 \" +\n focusRing;\n\ntype View = \"days\" | \"months\" | \"years\";\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nconst DatePicker = (props: DatePickerProps) => {\n const {\n min,\n max,\n isDateDisabled,\n placeholder,\n disabled = false,\n error = false,\n size,\n placement = \"bottom\",\n clearable = true,\n showToday = true,\n weekStartsOn = 0,\n locale = \"en-US\",\n formatOptions = { day: \"numeric\", month: \"short\", year: \"numeric\" },\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n } = props;\n\n const isRange = props.mode === \"range\";\n const presets = isRange ? (props as DatePickerRangeProps).presets : undefined;\n const reactId = useId();\n const triggerId = id ?? `datepicker-${reactId}`;\n const dialogId = `${triggerId}-dialog`;\n\n /* ----- value (controlled or not) ----- */\n const [innerSingle, setInnerSingle] = useState<Date | null>(\n !isRange ? ((props.defaultValue as Date | null | undefined) ?? null) : null,\n );\n const [innerRange, setInnerRange] = useState<DateRange>(\n isRange\n ? ((props.defaultValue as DateRange | undefined) ?? {\n start: null,\n end: null,\n })\n : { start: null, end: null },\n );\n\n const single: Date | null = !isRange\n ? props.value !== undefined\n ? (props.value as Date | null)\n : innerSingle\n : null;\n const range: DateRange = isRange\n ? props.value !== undefined\n ? (props.value as DateRange)\n : innerRange\n : { start: null, end: null };\n\n const hasValue = isRange ? !!(range.start || range.end) : !!single;\n\n /* ----- popover state ----- */\n const [open, setOpen] = useState(false);\n const [view, setView] = useState<View>(\"days\");\n const today = useMemo(() => startOfDay(new Date()), []);\n const initialFocus = useCallback(\n () =>\n clampDate(\n (isRange ? range.start : single) ?? today,\n min,\n max,\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isRange, range.start, single, today, min, max],\n );\n const [focused, setFocused] = useState<Date>(initialFocus);\n const [hover, setHover] = useState<Date | null>(null);\n const [pickingEnd, setPickingEnd] = useState(false);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const shouldFocusDay = useRef(false);\n\n const disabledDay = useCallback(\n (d: Date) => {\n const day = startOfDay(d);\n if (min && day < startOfDay(min)) return true;\n if (max && day > startOfDay(max)) return true;\n return !!isDateDisabled?.(day);\n },\n [min, max, isDateDisabled],\n );\n\n const close = useCallback((returnFocus = true) => {\n setOpen(false);\n setHover(null);\n setPickingEnd(false);\n if (returnFocus) triggerRef.current?.focus();\n }, []);\n\n const openPicker = () => {\n if (disabled) return;\n setFocused(initialFocus());\n setView(\"days\");\n shouldFocusDay.current = true;\n setOpen(true);\n };\n\n // Click outside closes\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) close(false);\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, close]);\n\n // Move DOM focus to the focused day after keyboard navigation / opening\n useEffect(() => {\n if (!open || view !== \"days\" || !shouldFocusDay.current) return;\n shouldFocusDay.current = false;\n gridRef.current\n ?.querySelector<HTMLButtonElement>(`[data-date=\"${dayKey(focused)}\"]`)\n ?.focus();\n }, [open, view, focused]);\n\n /* ----- commit helpers ----- */\n const commitSingle = (d: Date | null) => {\n if (props.value === undefined) setInnerSingle(d);\n (props as DatePickerSingleProps).onChange?.(d);\n };\n const commitRange = (r: DateRange) => {\n if (props.value === undefined) setInnerRange(r);\n (props as DatePickerRangeProps).onChange?.(r);\n };\n\n const selectDay = (d: Date) => {\n if (disabledDay(d)) return;\n const day = startOfDay(d);\n if (!isRange) {\n commitSingle(day);\n close();\n return;\n }\n if (!pickingEnd || !range.start) {\n commitRange({ start: day, end: null });\n setPickingEnd(true);\n return;\n }\n const [start, end] =\n day < range.start ? [day, range.start] : [range.start, day];\n commitRange({ start, end });\n close();\n };\n\n const clear = () => {\n if (isRange) commitRange({ start: null, end: null });\n else commitSingle(null);\n setPickingEnd(false);\n triggerRef.current?.focus();\n };\n\n /* ----- calendar grid ----- */\n const monthStart = new Date(focused.getFullYear(), focused.getMonth(), 1);\n\n const weekdays = useMemo(() => {\n const fmt = new Intl.DateTimeFormat(locale, { weekday: \"short\" });\n const long = new Intl.DateTimeFormat(locale, { weekday: \"long\" });\n // 2023-01-01 is a Sunday\n return Array.from({ length: 7 }, (_, i) => {\n const d = new Date(2023, 0, 1 + ((i + weekStartsOn) % 7));\n return { short: fmt.format(d).slice(0, 2), long: long.format(d) };\n });\n }, [locale, weekStartsOn]);\n\n const weeks = useMemo(() => {\n const offset = (monthStart.getDay() - weekStartsOn + 7) % 7;\n const first = addDays(monthStart, -offset);\n return Array.from({ length: 6 }, (_, w) =>\n Array.from({ length: 7 }, (_, d) => addDays(first, w * 7 + d)),\n );\n }, [monthStart, weekStartsOn]);\n\n const monthLabel = new Intl.DateTimeFormat(locale, {\n month: \"long\",\n year: \"numeric\",\n }).format(monthStart);\n\n const fullDate = new Intl.DateTimeFormat(locale, { dateStyle: \"full\" });\n\n const moveFocus = (next: Date) => {\n shouldFocusDay.current = true;\n setFocused(clampDate(next, min, max));\n };\n\n const onGridKeyDown = (e: React.KeyboardEvent) => {\n let next: Date | null = null;\n const offset = (focused.getDay() - weekStartsOn + 7) % 7;\n switch (e.key) {\n case \"ArrowLeft\":\n next = addDays(focused, -1);\n break;\n case \"ArrowRight\":\n next = addDays(focused, 1);\n break;\n case \"ArrowUp\":\n next = addDays(focused, -7);\n break;\n case \"ArrowDown\":\n next = addDays(focused, 7);\n break;\n case \"Home\":\n next = addDays(focused, -offset);\n break;\n case \"End\":\n next = addDays(focused, 6 - offset);\n break;\n case \"PageUp\":\n next = addMonths(focused, e.shiftKey ? -12 : -1);\n break;\n case \"PageDown\":\n next = addMonths(focused, e.shiftKey ? 12 : 1);\n break;\n default:\n return;\n }\n e.preventDefault();\n moveFocus(next);\n };\n\n const onDialogKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n if (view !== \"days\") setView(\"days\");\n else close();\n }\n };\n\n /* ----- day state helpers ----- */\n const rangeEnd = isRange ? (range.end ?? (pickingEnd ? hover : null)) : null;\n const rangeLo =\n isRange && range.start && rangeEnd\n ? range.start < rangeEnd\n ? range.start\n : rangeEnd\n : null;\n const rangeHi =\n isRange && range.start && rangeEnd\n ? range.start < rangeEnd\n ? rangeEnd\n : range.start\n : null;\n\n const dayState = (d: Date) => {\n const selectedStart = isRange\n ? isSameDay(d, rangeLo ?? range.start)\n : isSameDay(d, single);\n const selectedEnd = isRange ? isSameDay(d, rangeHi) : false;\n const inRange =\n !!rangeLo && !!rangeHi && startOfDay(d) > rangeLo && startOfDay(d) < rangeHi;\n return { selected: selectedStart || selectedEnd, inRange, selectedStart, selectedEnd };\n };\n\n /* ----- trigger text ----- */\n const fmt = useMemo(\n () => new Intl.DateTimeFormat(locale, formatOptions),\n [locale, formatOptions],\n );\n const label = isRange\n ? range.start\n ? `${fmt.format(range.start)} – ${range.end ? fmt.format(range.end) : \"…\"}`\n : \"\"\n : single\n ? fmt.format(single)\n : \"\";\n const resolvedPlaceholder =\n placeholder ?? (isRange ? \"Select date range\" : \"Select date\");\n\n const hiddenValue = isRange\n ? range.start\n ? `${dayKey(range.start)}/${range.end ? dayKey(range.end) : \"\"}`\n : \"\"\n : single\n ? dayKey(single)\n : \"\";\n\n /* ----- months / years views ----- */\n const yearPageStart = Math.floor(focused.getFullYear() / 12) * 12;\n\n return (\n <div ref={rootRef} className=\"relative inline-block max-w-full\">\n {name && <input type=\"hidden\" name={name} value={hiddenValue} />}\n\n {/* Trigger — same surface as <Input /> */}\n <div\n className={cn(\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n open && \"border-primary-600 ring-4 ring-primary-100\",\n disabled &&\n \"opacity-30 bg-gray-300 select-none pointer-events-none shadow-none\",\n size === \"sm\"\n ? \"w-[320px] h-10\"\n : size === \"lg\"\n ? \"w-[313px] h-11\"\n : \"w-full h-10\",\n isRange && !size && \"min-w-[280px]\",\n error &&\n \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n className,\n )}\n >\n <RiCalendarLine\n size={18}\n aria-hidden=\"true\"\n className=\"shrink-0 text-gray-500 group-hover:text-gray-600\"\n />\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? dialogId : undefined}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-invalid={error || undefined}\n onClick={() => (open ? close() : openPicker())}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\" && !open) {\n e.preventDefault();\n openPicker();\n }\n }}\n className={cn(\n \"min-w-0 flex-1 truncate bg-transparent text-left text-sm focus:outline-none\",\n label ? \"text-gray-900\" : \"text-gray-500\",\n )}\n >\n {label || resolvedPlaceholder}\n </button>\n {clearable && hasValue && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear date\"\n onClick={clear}\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-800\",\n focusRing,\n )}\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {/* Popover */}\n {open && (\n <div\n id={dialogId}\n role=\"dialog\"\n aria-label={isRange ? \"Choose date range\" : \"Choose date\"}\n onKeyDown={onDialogKeyDown}\n className={cn(\n \"absolute left-0 z-50 w-[296px] rounded-xl border border-gray-200 bg-white p-3 shadow-lg\",\n placement === \"top\" ? \"bottom-full mb-2\" : \"top-full mt-2\",\n )}\n >\n {/* Header */}\n <div className=\"mb-2 flex items-center justify-between\">\n <button\n type=\"button\"\n className={navButton}\n aria-label={\n view === \"days\"\n ? \"Previous month\"\n : view === \"months\"\n ? \"Previous year\"\n : \"Previous years\"\n }\n onClick={() =>\n setFocused(\n view === \"days\"\n ? addMonths(focused, -1)\n : view === \"months\"\n ? addMonths(focused, -12)\n : addMonths(focused, -144),\n )\n }\n >\n <RiArrowLeftSLine size={18} aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n aria-live=\"polite\"\n onClick={() =>\n setView(view === \"days\" ? \"months\" : view === \"months\" ? \"years\" : \"days\")\n }\n className={cn(\n \"rounded-lg px-2 py-1 text-sm font-semibold text-gray-900 hover:bg-gray-100\",\n focusRing,\n )}\n >\n {view === \"days\"\n ? monthLabel\n : view === \"months\"\n ? focused.getFullYear()\n : `${yearPageStart} – ${yearPageStart + 11}`}\n </button>\n <button\n type=\"button\"\n className={navButton}\n aria-label={\n view === \"days\"\n ? \"Next month\"\n : view === \"months\"\n ? \"Next year\"\n : \"Next years\"\n }\n onClick={() =>\n setFocused(\n view === \"days\"\n ? addMonths(focused, 1)\n : view === \"months\"\n ? addMonths(focused, 12)\n : addMonths(focused, 144),\n )\n }\n >\n <RiArrowRightSLine size={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Days */}\n {view === \"days\" && (\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={monthLabel}\n onKeyDown={onGridKeyDown}\n onMouseLeave={() => setHover(null)}\n >\n <div role=\"row\" className=\"mb-1 grid grid-cols-7\">\n {weekdays.map((w) => (\n <div\n key={w.long}\n role=\"columnheader\"\n aria-label={w.long}\n className=\"flex h-8 items-center justify-center text-xs font-medium text-gray-500\"\n >\n {w.short}\n </div>\n ))}\n </div>\n {weeks.map((week, wi) => (\n <div key={wi} role=\"row\" className=\"grid grid-cols-7\">\n {week.map((d) => {\n const outside = d.getMonth() !== monthStart.getMonth();\n const off = disabledDay(d);\n const st = dayState(d);\n const isToday = isSameDay(d, today);\n return (\n <div\n key={dayKey(d)}\n role=\"gridcell\"\n aria-selected={st.selected || st.inRange || undefined}\n className={cn(\n \"flex items-center justify-center py-0.5\",\n st.inRange && \"bg-primary-50\",\n st.selectedStart && rangeHi && !isSameDay(rangeLo, rangeHi) && \"rounded-l-full bg-primary-50\",\n st.selectedEnd && \"rounded-r-full bg-primary-50\",\n )}\n >\n <button\n type=\"button\"\n data-date={dayKey(d)}\n tabIndex={isSameDay(d, focused) ? 0 : -1}\n disabled={off}\n aria-label={fullDate.format(d)}\n aria-current={isToday ? \"date\" : undefined}\n onClick={() => selectDay(d)}\n onMouseEnter={() => setHover(startOfDay(d))}\n onFocus={() => {\n if (!isSameDay(d, focused)) setFocused(startOfDay(d));\n }}\n className={cn(\n \"inline-flex h-9 w-9 items-center justify-center rounded-full text-sm\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n st.selected\n ? \"bg-primary-600 font-semibold text-white hover:bg-primary-700\"\n : outside\n ? \"text-gray-400 hover:bg-gray-100\"\n : \"text-gray-900 hover:bg-gray-100\",\n !st.selected && isToday && \"border border-primary-600 font-semibold text-primary-700\",\n off && \"pointer-events-none text-gray-300 line-through hover:bg-transparent\",\n )}\n >\n {d.getDate()}\n </button>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n )}\n\n {/* Months */}\n {view === \"months\" && (\n <div className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, m) => {\n const label = new Intl.DateTimeFormat(locale, { month: \"short\" }).format(\n new Date(2023, m, 1),\n );\n const current = m === focused.getMonth();\n const monthEnd = new Date(focused.getFullYear(), m + 1, 0);\n const monthBegin = new Date(focused.getFullYear(), m, 1);\n const off =\n (!!min && monthEnd < startOfDay(min)) ||\n (!!max && monthBegin > startOfDay(max));\n return (\n <button\n key={m}\n type=\"button\"\n disabled={off}\n onClick={() => {\n const lastDay = new Date(focused.getFullYear(), m + 1, 0).getDate();\n setFocused(\n clampDate(\n new Date(focused.getFullYear(), m, Math.min(focused.getDate(), lastDay)),\n min,\n max,\n ),\n );\n setView(\"days\");\n }}\n className={cn(\n \"h-10 rounded-lg text-sm transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n current\n ? \"bg-primary-600 font-semibold text-white\"\n : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Years */}\n {view === \"years\" && (\n <div className=\"grid grid-cols-3 gap-1\">\n {Array.from({ length: 12 }, (_, i) => {\n const y = yearPageStart + i;\n const current = y === focused.getFullYear();\n const off =\n (!!min && y < min.getFullYear()) || (!!max && y > max.getFullYear());\n return (\n <button\n key={y}\n type=\"button\"\n disabled={off}\n onClick={() => {\n const lastDay = new Date(y, focused.getMonth() + 1, 0).getDate();\n setFocused(\n clampDate(\n new Date(y, focused.getMonth(), Math.min(focused.getDate(), lastDay)),\n min,\n max,\n ),\n );\n setView(\"months\");\n }}\n className={cn(\n \"h-10 rounded-lg text-sm transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n current\n ? \"bg-primary-600 font-semibold text-white\"\n : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n )}\n >\n {y}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Presets */}\n {presets && presets.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1 border-t border-gray-100 pt-2\">\n {presets.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n className={cn(\n \"rounded-full border border-gray-200 px-2.5 py-1 text-xs font-medium text-gray-700 hover:bg-gray-50\",\n focusRing,\n )}\n onClick={() => {\n commitRange(p.range);\n close();\n }}\n >\n {p.label}\n </button>\n ))}\n </div>\n )}\n\n {/* Footer */}\n {(showToday || (clearable && hasValue)) && (\n <div className=\"mt-2 flex items-center justify-between border-t border-gray-100 pt-2\">\n {showToday ? (\n <button\n type=\"button\"\n className={textButton}\n disabled={disabledDay(today)}\n onClick={() => {\n selectDay(today);\n }}\n >\n Today\n </button>\n ) : (\n <span />\n )}\n {clearable && hasValue && (\n <button\n type=\"button\"\n className={cn(textButton, \"text-gray-600 hover:bg-gray-100\")}\n onClick={() => {\n clear();\n close(false);\n }}\n >\n Clear\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nDatePicker.displayName = \"DatePicker\";\n\nexport default DatePicker;\n","\"use client\";\nimport React, { useState } from \"react\";\nimport DatePicker from \"./DatePicker\";\nimport TimePicker from \"./TimePicker\";\nimport { cn } from \"../utils/utils\";\n\nexport interface DateTimePickerProps {\n /** Controlled value: a Date carrying both day and time, or null. */\n value?: Date | null;\n /** Uncontrolled initial value. */\n defaultValue?: Date | null;\n /** Called with a Date (local time) or null when cleared. */\n onChange?: (value: Date | null) => void;\n /** Optional. Earliest selectable moment (date and time). */\n min?: Date;\n /** Optional. Latest selectable moment (date and time). */\n max?: Date;\n /** Optional. Return true to block a specific day. */\n isDateDisabled?: (date: Date) => boolean;\n /** Optional. Time used when a date is picked before any time. Defaults to \"00:00\". */\n defaultTime?: string;\n /** Optional. Time display format. Defaults to \"12h\". */\n format?: \"12h\" | \"24h\";\n /** Optional. Minutes between time options. Defaults to 5. */\n minuteStep?: number;\n datePlaceholder?: string;\n timePlaceholder?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. Open the popovers above or below. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. First day of week: 0 = Sunday, 1 = Monday. Defaults to 0. */\n weekStartsOn?: 0 | 1;\n /** Optional. BCP 47 locale for month and weekday names. Defaults to \"en-US\". */\n locale?: string;\n /** Optional. Intl options for the date text. */\n formatOptions?: Intl.DateTimeFormatOptions;\n /** Optional. Adds a hidden input with a local ISO value (\"YYYY-MM-DDTHH:mm\"). */\n name?: string;\n id?: string;\n className?: string;\n \"aria-label\"?: string;\n}\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\nconst timeOf = (d: Date) => `${pad(d.getHours())}:${pad(d.getMinutes())}`;\nconst sameDay = (a: Date, b: Date) =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\nconst iso = (d: Date) =>\n `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${timeOf(d)}`;\n\nconst combine = (day: Date, time: string) => {\n const [h, m] = time.split(\":\").map(Number);\n return new Date(day.getFullYear(), day.getMonth(), day.getDate(), h || 0, m || 0);\n};\n\n/** Date + time in one control. Composes DatePicker and TimePicker around a single Date value. */\nconst DateTimePicker = ({\n value,\n defaultValue = null,\n onChange,\n min,\n max,\n isDateDisabled,\n defaultTime = \"00:00\",\n format = \"12h\",\n minuteStep = 5,\n datePlaceholder = \"Select date\",\n timePlaceholder = \"Select time\",\n disabled,\n error,\n placement = \"bottom\",\n weekStartsOn = 0,\n locale = \"en-US\",\n formatOptions,\n name,\n id,\n className,\n \"aria-label\": ariaLabel,\n}: DateTimePickerProps) => {\n const [inner, setInner] = useState<Date | null>(defaultValue);\n const [pendingTime, setPendingTime] = useState<string | null>(null);\n const current = value !== undefined ? value : inner;\n\n const emit = (next: Date | null) => {\n if (value === undefined) setInner(next);\n onChange?.(next);\n };\n\n const clamp = (d: Date) => {\n if (min && d < min) return new Date(min);\n if (max && d > max) return new Date(max);\n return d;\n };\n\n const onDate = (d: Date | null) => {\n if (!d) {\n setPendingTime(null);\n emit(null);\n return;\n }\n const time = current ? timeOf(current) : (pendingTime ?? defaultTime);\n setPendingTime(null);\n emit(clamp(combine(d, time)));\n };\n\n const onTime = (t: string | null) => {\n if (!t) return;\n if (current) emit(clamp(combine(current, t)));\n else setPendingTime(t);\n };\n\n // When the chosen day is the min/max day, restrict the time list too.\n const timeMin = min && current && sameDay(current, min) ? timeOf(min) : undefined;\n const timeMax = max && current && sameDay(current, max) ? timeOf(max) : undefined;\n\n const timeValue = current ? timeOf(current) : pendingTime;\n\n return (\n <div className={cn(\"flex flex-wrap items-start gap-3\", className)}>\n {name && <input type=\"hidden\" name={name} value={current ? iso(current) : \"\"} />}\n <div className=\"min-w-[200px] flex-1\">\n <DatePicker\n id={id}\n aria-label={ariaLabel ?? \"Date\"}\n value={current}\n onChange={onDate}\n min={min}\n max={max}\n isDateDisabled={isDateDisabled}\n placeholder={datePlaceholder}\n disabled={disabled}\n error={error}\n placement={placement}\n weekStartsOn={weekStartsOn}\n locale={locale}\n formatOptions={formatOptions}\n showToday\n />\n </div>\n <div className=\"w-40 shrink-0\">\n <TimePicker\n aria-label={ariaLabel ? `${ariaLabel} time` : \"Time\"}\n value={timeValue}\n onChange={onTime}\n min={timeMin}\n max={timeMax}\n format={format}\n minuteStep={minuteStep}\n placeholder={timePlaceholder}\n disabled={disabled}\n error={error}\n placement={placement}\n clearable={false}\n />\n </div>\n </div>\n );\n};\n\nDateTimePicker.displayName = \"DateTimePicker\";\n\nexport default DateTimePicker;\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { RiCloseLine, RiTimeLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/** Time is stored as a 24-hour \"HH:mm\" string, e.g. \"09:30\" or \"17:05\". */\nexport interface TimePickerProps {\n /** Controlled value (\"HH:mm\", 24-hour) or null for empty. */\n value?: string | null;\n /** Uncontrolled initial value (\"HH:mm\"). */\n defaultValue?: string | null;\n /** Called with \"HH:mm\" (24-hour) or null when cleared. */\n onChange?: (time: string | null) => void;\n /** Optional. Display and picker format. Defaults to \"12h\". */\n format?: \"12h\" | \"24h\";\n /** Optional. Minutes between options (1, 5, 10, 15, 30 …). Defaults to 5. */\n minuteStep?: number;\n /** Optional. Earliest selectable time (\"HH:mm\"). */\n min?: string;\n /** Optional. Latest selectable time (\"HH:mm\"). */\n max?: string;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. \"sm\" = 320px, \"lg\" = 313px, default = full width (same as Input). */\n size?: \"sm\" | \"lg\";\n /** Optional. Open the picker above or below the field. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. Show a clear button when a value is set. Defaults to true. */\n clearable?: boolean;\n /** Optional. Show a \"Now\" shortcut. Defaults to true. */\n showNow?: boolean;\n id?: string;\n /** Optional. Adds a hidden input (\"HH:mm\") for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n}\n\n/* ------------------------------ time helpers ------------------------------ */\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nconst parse = (t?: string | null): { h: number; m: number } | null => {\n if (!t) return null;\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(t.trim());\n if (!match) return null;\n const h = Number(match[1]);\n const m = Number(match[2]);\n if (h > 23 || m > 59) return null;\n return { h, m };\n};\n\nconst toMinutes = (t: { h: number; m: number }) => t.h * 60 + t.m;\nconst toString = (t: { h: number; m: number }) => `${pad(t.h)}:${pad(t.m)}`;\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst textButton =\n \"rounded-md px-2 py-1 text-sm font-medium transition-colors duration-150 motion-reduce:transition-none disabled:pointer-events-none disabled:opacity-30 \" +\n focusRing;\n\ntype Draft = { h: number; m: number };\n\nconst TimePicker = ({\n value,\n defaultValue = null,\n onChange,\n format = \"12h\",\n minuteStep = 5,\n min,\n max,\n placeholder = \"Select time\",\n disabled = false,\n error = false,\n size,\n placement = \"bottom\",\n clearable = true,\n showNow = true,\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n}: TimePickerProps) => {\n const reactId = useId();\n const triggerId = id ?? `timepicker-${reactId}`;\n const dialogId = `${triggerId}-dialog`;\n const is12 = format === \"12h\";\n const step = Math.max(1, Math.min(60, Math.floor(minuteStep) || 1));\n\n const [inner, setInner] = useState<string | null>(defaultValue);\n const current = value !== undefined ? value : inner;\n const currentTime = parse(current);\n\n const [open, setOpen] = useState(false);\n const [draft, setDraft] = useState<Draft | null>(currentTime);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const popRef = useRef<HTMLDivElement>(null);\n\n const minT = parse(min);\n const maxT = parse(max);\n\n const inRange = useCallback(\n (t: Draft) => {\n const v = toMinutes(t);\n if (minT && v < toMinutes(minT)) return false;\n if (maxT && v > toMinutes(maxT)) return false;\n return true;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [min, max],\n );\n\n const minutes = useMemo(\n () => Array.from({ length: Math.ceil(60 / step) }, (_, i) => i * step),\n [step],\n );\n\n const commit = (t: Draft | null) => {\n const next = t ? toString(t) : null;\n if (value === undefined) setInner(next);\n onChange?.(next);\n };\n\n const close = useCallback((returnFocus = true) => {\n setOpen(false);\n if (returnFocus) triggerRef.current?.focus();\n }, []);\n\n const openPicker = () => {\n if (disabled) return;\n setDraft(currentTime);\n setOpen(true);\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) close(false);\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, close]);\n\n // Scroll selected options into view (inside their own column) and focus one on open\n const justOpened = useRef(false);\n useEffect(() => {\n if (open) justOpened.current = true;\n }, [open]);\n useEffect(() => {\n if (!open || !popRef.current) return;\n popRef.current\n .querySelectorAll<HTMLElement>('[role=\"listbox\"]')\n .forEach((col) => {\n const sel = col.querySelector<HTMLElement>('[aria-selected=\"true\"]');\n if (sel) col.scrollTop = sel.offsetTop - col.clientHeight / 2 + sel.clientHeight / 2;\n });\n if (justOpened.current) {\n justOpened.current = false;\n const target =\n popRef.current.querySelector<HTMLElement>('[aria-selected=\"true\"]') ??\n popRef.current.querySelector<HTMLElement>('[role=\"option\"]:not([disabled])');\n target?.focus({ preventScroll: true });\n }\n }, [open, draft]);\n\n /* ---------------------------- display + drafting --------------------------- */\n\n const display = (t: Draft) => {\n if (!is12) return toString(t);\n const period = t.h >= 12 ? \"PM\" : \"AM\";\n const h12 = t.h % 12 === 0 ? 12 : t.h % 12;\n return `${h12}:${pad(t.m)} ${period}`;\n };\n\n const period: \"AM\" | \"PM\" = draft && draft.h >= 12 ? \"PM\" : \"AM\";\n\n const hours = is12\n ? Array.from({ length: 12 }, (_, i) => (i === 0 ? 12 : i)) // 12,1..11\n : Array.from({ length: 24 }, (_, i) => i);\n\n const to24 = (h12: number, p: \"AM\" | \"PM\") => (h12 % 12) + (p === \"PM\" ? 12 : 0);\n\n const hourOk = (h24: number) => minutes.some((m) => inRange({ h: h24, m }));\n\n /** 24-hour value for a picker hour, preferring the current AM/PM when valid. */\n const resolveHour = (h: number) => {\n if (!is12) return h;\n const preferred = to24(h, period);\n if (hourOk(preferred)) return preferred;\n const other = to24(h, period === \"AM\" ? \"PM\" : \"AM\");\n return hourOk(other) ? other : preferred;\n };\n\n const hourDisabled = (h: number) =>\n is12 ? !hourOk(to24(h, \"AM\")) && !hourOk(to24(h, \"PM\")) : !hourOk(h);\n\n const periodDisabled = (p: \"AM\" | \"PM\") =>\n !Array.from({ length: 12 }, (_, i) => i + (p === \"PM\" ? 12 : 0)).some(hourOk);\n\n const setHour = (h: number) => {\n const hh = resolveHour(h);\n const m = draft && inRange({ h: hh, m: draft.m })\n ? draft.m\n : (minutes.find((mm) => inRange({ h: hh, m: mm })) ?? 0);\n setDraft({ h: hh, m });\n };\n const setMinute = (m: number) => setDraft({ h: draft?.h ?? (is12 ? 0 : 0), m });\n const setPeriod = (p: \"AM\" | \"PM\") => {\n const base = draft ?? { h: 0, m: 0 };\n const h = (base.h % 12) + (p === \"PM\" ? 12 : 0);\n const m = inRange({ h, m: base.m })\n ? base.m\n : (minutes.find((mm) => inRange({ h, m: mm })) ?? base.m);\n setDraft({ h, m });\n };\n\n const confirm = () => {\n if (draft && inRange(draft)) commit(draft);\n close();\n };\n\n const setNow = () => {\n const now = new Date();\n const rounded = Math.round(now.getMinutes() / step) * step;\n let h = now.getHours();\n let m = rounded;\n if (m >= 60) {\n m = 0;\n h = (h + 1) % 24;\n }\n setDraft({ h, m });\n };\n\n /* -------------------------------- keyboard -------------------------------- */\n\n const onPopKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n close();\n return;\n }\n const opt = (e.target as HTMLElement).closest<HTMLElement>('[role=\"option\"]');\n if (!opt) return;\n const col = opt.parentElement as HTMLElement;\n const cols = Array.from(popRef.current!.querySelectorAll<HTMLElement>('[role=\"listbox\"]'));\n const move = (list: HTMLElement[], idx: number, dir: 1 | -1) => {\n for (let i = idx + dir; i >= 0 && i < list.length; i += dir) {\n if (!(list[i] as HTMLButtonElement).disabled) return list[i];\n }\n return null;\n };\n let next: HTMLElement | null = null;\n const items = Array.from(col.querySelectorAll<HTMLElement>('[role=\"option\"]'));\n const i = items.indexOf(opt);\n if (e.key === \"ArrowDown\") next = move(items, i, 1);\n else if (e.key === \"ArrowUp\") next = move(items, i, -1);\n else if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\n const c = cols.indexOf(col) + (e.key === \"ArrowRight\" ? 1 : -1);\n const target = cols[c];\n if (target)\n next =\n target.querySelector<HTMLElement>('[aria-selected=\"true\"]') ??\n target.querySelector<HTMLElement>('[role=\"option\"]:not([disabled])');\n } else return;\n e.preventDefault();\n next?.focus();\n };\n\n /* --------------------------------- render --------------------------------- */\n\n const optionClass = (selected: boolean, off: boolean) =>\n cn(\n \"flex h-8 w-full items-center justify-center rounded-md text-sm\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n selected\n ? \"bg-primary-600 font-semibold text-white hover:bg-primary-700\"\n : \"text-gray-900 hover:bg-gray-100\",\n off && \"pointer-events-none opacity-30\",\n );\n\n const column = (\n label: string,\n items: { key: string; label: string; selected: boolean; disabled: boolean; onPick: () => void }[],\n ) => (\n <div\n role=\"listbox\"\n aria-label={label}\n className=\"h-52 w-16 space-y-0.5 overflow-y-auto overscroll-contain px-1 [scrollbar-width:thin]\"\n >\n {items.map((it) => (\n <button\n key={it.key}\n type=\"button\"\n role=\"option\"\n aria-selected={it.selected}\n disabled={it.disabled}\n tabIndex={it.selected ? 0 : -1}\n onClick={it.onPick}\n className={optionClass(it.selected, it.disabled)}\n >\n {it.label}\n </button>\n ))}\n </div>\n );\n\n const selectedHourLabel = draft ? (is12 ? (draft.h % 12 === 0 ? 12 : draft.h % 12) : draft.h) : null;\n\n return (\n <div ref={rootRef} className=\"relative inline-block max-w-full\">\n {name && <input type=\"hidden\" name={name} value={current ?? \"\"} />}\n\n <div\n className={cn(\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n open && \"border-primary-600 ring-4 ring-primary-100\",\n disabled && \"opacity-30 bg-gray-300 select-none pointer-events-none shadow-none\",\n size === \"sm\" ? \"w-[320px] h-10\" : size === \"lg\" ? \"w-[313px] h-11\" : \"w-full h-10\",\n error &&\n \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n className,\n )}\n >\n <RiTimeLine\n size={18}\n aria-hidden=\"true\"\n className=\"shrink-0 text-gray-500 group-hover:text-gray-600\"\n />\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? dialogId : undefined}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-invalid={error || undefined}\n onClick={() => (open ? close() : openPicker())}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\" && !open) {\n e.preventDefault();\n openPicker();\n }\n }}\n className={cn(\n \"min-w-0 flex-1 truncate bg-transparent text-left text-sm focus:outline-none\",\n currentTime ? \"text-gray-900\" : \"text-gray-500\",\n )}\n >\n {currentTime ? display(currentTime) : placeholder}\n </button>\n {clearable && currentTime && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear time\"\n onClick={() => {\n commit(null);\n setDraft(null);\n triggerRef.current?.focus();\n }}\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-800\",\n focusRing,\n )}\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {open && (\n <div\n ref={popRef}\n id={dialogId}\n role=\"dialog\"\n aria-label=\"Choose time\"\n onKeyDown={onPopKeyDown}\n className={cn(\n \"absolute left-0 z-50 rounded-xl border border-gray-200 bg-white p-3 shadow-lg\",\n placement === \"top\" ? \"bottom-full mb-2\" : \"top-full mt-2\",\n )}\n >\n <div className=\"mb-2 text-center text-sm font-semibold text-gray-900\" aria-live=\"polite\">\n {draft ? display(draft) : \"--:--\"}\n </div>\n <div className=\"flex justify-center gap-1\">\n {column(\n \"Hours\",\n hours.map((h) => ({\n key: String(h),\n label: is12 ? String(h) : pad(h),\n selected: selectedHourLabel === h,\n disabled: hourDisabled(h),\n onPick: () => setHour(h),\n })),\n )}\n {column(\n \"Minutes\",\n minutes.map((m) => ({\n key: String(m),\n label: pad(m),\n selected: draft?.m === m,\n disabled: draft ? !inRange({ h: draft.h, m }) : false,\n onPick: () => setMinute(m),\n })),\n )}\n {is12 &&\n column(\n \"AM or PM\",\n ([\"AM\", \"PM\"] as const).map((p) => ({\n key: p,\n label: p,\n selected: !!draft && period === p,\n disabled: periodDisabled(p),\n onPick: () => setPeriod(p),\n })),\n )}\n </div>\n <div className=\"mt-2 flex items-center justify-between border-t border-gray-100 pt-2\">\n {showNow ? (\n <button\n type=\"button\"\n className={cn(textButton, \"text-primary-700 hover:bg-primary-50\")}\n onClick={setNow}\n >\n Now\n </button>\n ) : (\n <span />\n )}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n className={cn(textButton, \"text-gray-600 hover:bg-gray-100\")}\n onClick={() => close()}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={!draft || !inRange(draft)}\n className={cn(textButton, \"bg-primary-600 text-white hover:bg-primary-700\")}\n onClick={confirm}\n >\n OK\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nTimePicker.displayName = \"TimePicker\";\n\nexport default TimePicker;\n","\"use client\";\nimport React from \"react\";\nimport DatePicker, { DateRange, DateRangePreset } from \"./DatePicker\";\n\ntype SharedProps = Omit<\n React.ComponentProps<typeof DatePicker>,\n \"mode\" | \"value\" | \"defaultValue\" | \"onChange\"\n>;\n\nexport interface DateRangePickerProps extends SharedProps {\n /** Controlled value. */\n value?: DateRange;\n /** Uncontrolled initial value. */\n defaultValue?: DateRange;\n onChange?: (range: DateRange) => void;\n /** Optional. Shortcut buttons such as \"Last 7 days\". See getDefaultRangePresets(). */\n presets?: DateRangePreset[];\n}\n\n/** Common presets: Last 7 / 30 days and This month. */\nexport const getDefaultRangePresets = (now: Date = new Date()): DateRangePreset[] => {\n const end = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const daysAgo = (n: number) =>\n new Date(end.getFullYear(), end.getMonth(), end.getDate() - n);\n return [\n { label: \"Last 7 days\", range: { start: daysAgo(6), end } },\n { label: \"Last 30 days\", range: { start: daysAgo(29), end } },\n {\n label: \"This month\",\n range: {\n start: new Date(end.getFullYear(), end.getMonth(), 1),\n end: new Date(end.getFullYear(), end.getMonth() + 1, 0),\n },\n },\n ];\n};\n\n/** DatePicker locked to range mode. */\nconst DateRangePicker = (props: DateRangePickerProps) => (\n <DatePicker {...(props as object)} mode=\"range\" />\n);\n\nDateRangePicker.displayName = \"DateRangePicker\";\n\nexport default DateRangePicker;\n","\"use client\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { RiArrowRightSLine, RiCheckLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/* -------------------------------------------------------------------------- */\n/* Context */\n/* -------------------------------------------------------------------------- */\n\ninterface RootCtx {\n open: boolean;\n point: { x: number; y: number };\n openAt: (x: number, y: number) => void;\n close: () => void;\n triggerRef: React.RefObject<HTMLDivElement>;\n disabled: boolean;\n}\n\nconst Root = createContext<RootCtx | null>(null);\nconst useRoot = (name: string) => {\n const c = useContext(Root);\n if (!c) throw new Error(`<${name}> must be used inside <ContextMenu>.`);\n return c;\n};\n\nconst MARGIN = 8;\nconst PANEL_ATTR = \"data-genesis-contextmenu\";\nconst ITEM_SELECTOR = '[role^=\"menuitem\"]:not([aria-disabled=\"true\"])';\n\nconst portalTarget = (el: Element | null) =>\n (el?.closest(\".theme-primary\") as HTMLElement | null) ?? document.body;\n\n/* -------------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------------- */\n\nexport interface ContextMenuProps {\n children: React.ReactNode;\n /** Optional. Called when the menu opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /** Optional. Turn the custom menu off so the browser's own context menu shows. */\n disabled?: boolean;\n}\n\nexport const ContextMenu = ({ children, onOpenChange, disabled = false }: ContextMenuProps) => {\n const [open, setOpen] = useState(false);\n const [point, setPoint] = useState({ x: 0, y: 0 });\n const triggerRef = useRef<HTMLDivElement>(null);\n\n const change = useCallback(\n (next: boolean) => {\n setOpen(next);\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n const openAt = useCallback(\n (x: number, y: number) => {\n setPoint({ x, y });\n change(true);\n },\n [change],\n );\n const close = useCallback(() => change(false), [change]);\n\n return (\n <Root.Provider value={{ open, point, openAt, close, triggerRef, disabled }}>{children}</Root.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Trigger */\n/* -------------------------------------------------------------------------- */\n\nexport interface ContextMenuTriggerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Optional. Press-and-hold time in ms that opens the menu on touch screens. Defaults to 600. */\n longPressMs?: number;\n}\n\nexport const ContextMenuTrigger = ({\n children,\n className,\n longPressMs = 600,\n onContextMenu,\n onKeyDown,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n ...rest\n}: ContextMenuTriggerProps) => {\n const { openAt, triggerRef, disabled } = useRoot(\"ContextMenuTrigger\");\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const start = useRef({ x: 0, y: 0 });\n\n const clear = () => clearTimeout(timer.current);\n useEffect(() => clear, []);\n\n return (\n <div\n ref={triggerRef}\n {...rest}\n className={className}\n style={{ WebkitTouchCallout: \"none\", ...rest.style }}\n onContextMenu={(e) => {\n onContextMenu?.(e);\n if (disabled || e.defaultPrevented) return;\n e.preventDefault();\n clear();\n openAt(e.clientX, e.clientY);\n }}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (disabled || e.defaultPrevented) return;\n if (e.key === \"ContextMenu\" || (e.shiftKey && e.key === \"F10\")) {\n e.preventDefault();\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect();\n openAt(r.left + Math.min(24, r.width / 2), r.top + Math.min(24, r.height / 2));\n }\n }}\n onPointerDown={(e) => {\n onPointerDown?.(e);\n if (disabled || e.pointerType !== \"touch\") return;\n start.current = { x: e.clientX, y: e.clientY };\n clear();\n timer.current = setTimeout(() => openAt(start.current.x, start.current.y), longPressMs);\n }}\n onPointerMove={(e) => {\n onPointerMove?.(e);\n if (Math.hypot(e.clientX - start.current.x, e.clientY - start.current.y) > 10) clear();\n }}\n onPointerUp={(e) => {\n onPointerUp?.(e);\n clear();\n }}\n onPointerCancel={(e) => {\n onPointerCancel?.(e);\n clear();\n }}\n >\n {children}\n </div>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Panels */\n/* -------------------------------------------------------------------------- */\n\nconst panelClass =\n \"fixed z-[70] min-w-[180px] max-w-[min(320px,calc(100vw-1rem))] rounded-xl border border-gray-200 bg-white p-1 text-sm text-gray-900 shadow-lg focus:outline-none\";\n\n/** Shared keyboard handling for a menu panel and its submenus. */\nfunction useMenuKeys(\n panelRef: React.RefObject<HTMLDivElement>,\n opts: { onEscape: () => void; onLeft?: () => void },\n) {\n return (e: React.KeyboardEvent<HTMLDivElement>) => {\n const panel = panelRef.current;\n // Ignore events that bubble up from a submenu rendered in a portal\n if (!panel || !panel.contains(e.target as Node)) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>(`:scope > ${ITEM_SELECTOR}`));\n const idx = items.indexOf(document.activeElement as HTMLElement);\n const focus = (i: number) => items[(i + items.length) % items.length]?.focus();\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n focus(idx < 0 ? 0 : idx + 1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n focus(idx < 0 ? items.length - 1 : idx - 1);\n break;\n case \"Home\":\n e.preventDefault();\n focus(0);\n break;\n case \"End\":\n e.preventDefault();\n focus(items.length - 1);\n break;\n case \"ArrowLeft\":\n if (opts.onLeft) {\n e.preventDefault();\n opts.onLeft();\n }\n break;\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation();\n opts.onEscape();\n break;\n case \"Tab\":\n e.preventDefault();\n break;\n default:\n // type-ahead\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n const ch = e.key.toLowerCase();\n const from = idx + 1;\n const order = [...items.slice(from), ...items.slice(0, from)];\n order.find((el) => (el.textContent ?? \"\").trim().toLowerCase().startsWith(ch))?.focus();\n }\n }\n };\n}\n\nexport interface ContextMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n \"aria-label\"?: string;\n}\n\nexport const ContextMenuContent = ({ children, className, style, ...rest }: ContextMenuContentProps) => {\n const { open, point, close, triggerRef } = useRoot(\"ContextMenuContent\");\n const ref = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top: number } | null>(null);\n const [mounted, setMounted] = useState(false);\n const previouslyFocused = useRef<HTMLElement | null>(null);\n\n useEffect(() => setMounted(true), []);\n\n useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const el = ref.current;\n if (!el) return;\n const { offsetWidth: w, offsetHeight: h } = el;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let left = point.x + w + MARGIN > vw ? point.x - w : point.x;\n let top = point.y + h + MARGIN > vh ? point.y - h : point.y;\n left = Math.max(MARGIN, Math.min(left, vw - w - MARGIN));\n top = Math.max(MARGIN, Math.min(top, vh - h - MARGIN));\n setPos({ left, top });\n }, [open, point]);\n\n // Focus management\n useEffect(() => {\n if (!open || !pos) return;\n previouslyFocused.current = document.activeElement as HTMLElement | null;\n ref.current?.focus({ preventScroll: true });\n return () => {\n const prev = previouslyFocused.current;\n if (prev && document.contains(prev)) prev.focus({ preventScroll: true });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, pos === null]);\n\n // Dismissal\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!(e.target as Element).closest?.(`[${PANEL_ATTR}]`)) close();\n };\n const onOther = () => close();\n document.addEventListener(\"mousedown\", onDown, true);\n window.addEventListener(\"blur\", onOther);\n window.addEventListener(\"resize\", onOther);\n window.addEventListener(\"scroll\", onOther, true);\n return () => {\n document.removeEventListener(\"mousedown\", onDown, true);\n window.removeEventListener(\"blur\", onOther);\n window.removeEventListener(\"resize\", onOther);\n window.removeEventListener(\"scroll\", onOther, true);\n };\n }, [open, close]);\n\n const onKeyDown = useMenuKeys(ref, { onEscape: close });\n\n if (!mounted || !open) return null;\n\n return createPortal(\n <div\n ref={ref}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n {...{ [PANEL_ATTR]: \"\" }}\n {...rest}\n onKeyDown={onKeyDown}\n onContextMenu={(e) => e.preventDefault()}\n style={{ left: pos?.left ?? point.x, top: pos?.top ?? point.y, visibility: pos ? \"visible\" : \"hidden\", ...style }}\n className={cn(panelClass, \"animate-[genesis-menu-in_120ms_ease-out] motion-reduce:animate-none\", className)}\n >\n <style>{`@keyframes genesis-menu-in{from{opacity:0;transform:scale(.97)}to{opacity:1;transform:scale(1)}}`}</style>\n {children}\n </div>,\n portalTarget(triggerRef.current),\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Items */\n/* -------------------------------------------------------------------------- */\n\nconst itemBase =\n \"relative flex w-full cursor-default select-none items-center gap-2 rounded-lg px-3 py-2 text-left text-sm outline-none transition-colors duration-100 motion-reduce:transition-none\";\n\ninterface BaseItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n /** Optional. Icon shown before the label. */\n icon?: JSX.Element;\n /** Optional. Shortcut hint shown at the end, such as \"Ctrl+C\". Display only. */\n shortcut?: string;\n disabled?: boolean;\n /** Optional. Use \"danger\" for destructive actions. */\n intent?: \"default\" | \"danger\";\n /** Optional. Close the menu after selecting. Defaults to true for items, false for checkbox items. */\n closeOnSelect?: boolean;\n}\n\nconst itemTone = (intent: \"default\" | \"danger\", disabled?: boolean) =>\n cn(\n disabled\n ? \"cursor-not-allowed opacity-40\"\n : intent === \"danger\"\n ? \"text-error-700 focus:bg-error-50 hover:bg-error-50\"\n : \"text-gray-900 focus:bg-gray-100 hover:bg-gray-100\",\n );\n\nconst handleKey = (e: React.KeyboardEvent<HTMLElement>, activate: () => void) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n activate();\n }\n};\n\nexport interface ContextMenuItemProps extends BaseItemProps {\n /** Called when the item is chosen by click, Enter or Space. */\n onSelect?: () => void;\n}\n\nexport const ContextMenuItem = ({\n children,\n icon,\n shortcut,\n disabled,\n intent = \"default\",\n closeOnSelect = true,\n onSelect,\n className,\n ...rest\n}: ContextMenuItemProps) => {\n const { close } = useRoot(\"ContextMenuItem\");\n const activate = () => {\n if (disabled) return;\n onSelect?.();\n if (closeOnSelect) close();\n };\n return (\n <div\n role=\"menuitem\"\n tabIndex={-1}\n aria-disabled={disabled || undefined}\n {...rest}\n onClick={activate}\n onKeyDown={(e) => handleKey(e, activate)}\n onMouseMove={(e) => !disabled && e.currentTarget.focus({ preventScroll: true })}\n className={cn(itemBase, itemTone(intent, disabled), className)}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n {shortcut && <span aria-hidden=\"true\" className=\"ml-4 shrink-0 text-xs text-gray-400\">{shortcut}</span>}\n </div>\n );\n};\n\nexport interface ContextMenuCheckboxItemProps extends BaseItemProps {\n checked: boolean;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const ContextMenuCheckboxItem = ({\n children,\n checked,\n onCheckedChange,\n icon,\n shortcut,\n disabled,\n intent = \"default\",\n closeOnSelect = false,\n className,\n ...rest\n}: ContextMenuCheckboxItemProps) => {\n const { close } = useRoot(\"ContextMenuCheckboxItem\");\n const activate = () => {\n if (disabled) return;\n onCheckedChange?.(!checked);\n if (closeOnSelect) close();\n };\n return (\n <div\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n tabIndex={-1}\n aria-disabled={disabled || undefined}\n {...rest}\n onClick={activate}\n onKeyDown={(e) => handleKey(e, activate)}\n onMouseMove={(e) => !disabled && e.currentTarget.focus({ preventScroll: true })}\n className={cn(itemBase, itemTone(intent, disabled), className)}\n >\n <span aria-hidden=\"true\" className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-primary-600\">\n {checked && <RiCheckLine size={16} />}\n </span>\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n {shortcut && <span aria-hidden=\"true\" className=\"ml-4 shrink-0 text-xs text-gray-400\">{shortcut}</span>}\n </div>\n );\n};\n\nexport const ContextMenuLabel = ({ children, className, ...rest }: React.HTMLAttributes<HTMLDivElement>) => (\n <div role=\"presentation\" {...rest} className={cn(\"px-3 pb-1 pt-2 text-xs font-semibold uppercase tracking-wide text-gray-400\", className)}>\n {children}\n </div>\n);\n\nexport const ContextMenuSeparator = ({ className, ...rest }: React.HTMLAttributes<HTMLDivElement>) => (\n <div role=\"separator\" aria-orientation=\"horizontal\" {...rest} className={cn(\"-mx-1 my-1 h-px bg-gray-100\", className)} />\n);\n\n/* -------------------------------------------------------------------------- */\n/* Submenus */\n/* -------------------------------------------------------------------------- */\n\ninterface SubCtx {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerEl: React.MutableRefObject<HTMLDivElement | null>;\n scheduleClose: () => void;\n cancelClose: () => void;\n viaKeyboard: React.MutableRefObject<boolean>;\n}\nconst Sub = createContext<SubCtx | null>(null);\n\nexport const ContextMenuSub = ({ children }: { children: React.ReactNode }) => {\n const [open, setOpen] = useState(false);\n const triggerEl = useRef<HTMLDivElement | null>(null);\n const viaKeyboard = useRef(false);\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const cancelClose = () => clearTimeout(timer.current);\n const scheduleClose = () => {\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setOpen(false), 150);\n };\n useEffect(() => () => clearTimeout(timer.current), []);\n return <Sub.Provider value={{ open, setOpen, triggerEl, scheduleClose, cancelClose, viaKeyboard }}>{children}</Sub.Provider>;\n};\n\nexport const ContextMenuSubTrigger = ({\n children,\n icon,\n disabled,\n className,\n ...rest\n}: Omit<BaseItemProps, \"shortcut\" | \"intent\" | \"closeOnSelect\">) => {\n const sub = useContext(Sub);\n if (!sub) throw new Error(\"<ContextMenuSubTrigger> must be used inside <ContextMenuSub>.\");\n const open = () => !disabled && sub.setOpen(true);\n return (\n <div\n ref={(el) => {\n sub.triggerEl.current = el;\n }}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={sub.open}\n aria-disabled={disabled || undefined}\n tabIndex={-1}\n {...rest}\n onClick={open}\n onMouseEnter={(e) => {\n if (disabled) return;\n sub.cancelClose();\n e.currentTarget.focus({ preventScroll: true });\n open();\n }}\n onMouseLeave={sub.scheduleClose}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n sub.viaKeyboard.current = true;\n open();\n }\n }}\n className={cn(itemBase, itemTone(\"default\", disabled), sub.open && \"bg-gray-100\", className)}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n <RiArrowRightSLine size={16} aria-hidden=\"true\" className=\"shrink-0 text-gray-400\" />\n </div>\n );\n};\n\nexport const ContextMenuSubContent = ({ children, className, style, ...rest }: ContextMenuContentProps) => {\n const sub = useContext(Sub);\n const { triggerRef } = useRoot(\"ContextMenuSubContent\");\n const ref = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top: number } | null>(null);\n if (!sub) throw new Error(\"<ContextMenuSubContent> must be used inside <ContextMenuSub>.\");\n\n const closeAndFocus = () => {\n sub.setOpen(false);\n sub.triggerEl.current?.focus({ preventScroll: true });\n };\n\n useLayoutEffect(() => {\n if (!sub.open) {\n setPos(null);\n return;\n }\n const t = sub.triggerEl.current?.getBoundingClientRect();\n const el = ref.current;\n if (!t || !el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let left = t.right - 4;\n if (left + w + MARGIN > vw) left = t.left - w + 4;\n let top = t.top - 4;\n top = Math.max(MARGIN, Math.min(top, vh - h - MARGIN));\n setPos({ left: Math.max(MARGIN, left), top });\n }, [sub.open, sub.triggerEl]);\n\n // When opened by keyboard, move focus to the first item\n useEffect(() => {\n if (!sub.open) {\n sub.viaKeyboard.current = false;\n return;\n }\n if (pos && sub.viaKeyboard.current) {\n sub.viaKeyboard.current = false;\n ref.current?.querySelector<HTMLElement>(`:scope > ${ITEM_SELECTOR}`)?.focus({ preventScroll: true });\n }\n }, [sub.open, pos, sub.viaKeyboard]);\n\n const onKeyDown = useMenuKeys(ref, { onEscape: closeAndFocus, onLeft: closeAndFocus });\n\n if (!sub.open) return null;\n\n return createPortal(\n <div\n ref={ref}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n {...{ [PANEL_ATTR]: \"\" }}\n {...rest}\n onMouseEnter={sub.cancelClose}\n onMouseLeave={sub.scheduleClose}\n onKeyDown={onKeyDown}\n onContextMenu={(e) => e.preventDefault()}\n style={{ left: pos?.left ?? 0, top: pos?.top ?? 0, visibility: pos ? \"visible\" : \"hidden\", ...style }}\n className={cn(panelClass, \"z-[71]\", className)}\n >\n {children}\n </div>,\n portalTarget(triggerRef.current),\n );\n};\n\nexport default ContextMenu;\n","\"use client\";\nimport React, { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { RiSearchLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface CommandItem {\n /** Unique id for the command. */\n id: string;\n /** Text shown and searched. */\n label: string;\n /** Optional. Secondary text shown under the label and searched too. */\n description?: string;\n /** Optional. Icon shown before the label. */\n icon?: JSX.Element;\n /** Optional. Shortcut hint shown at the end, such as \"Ctrl+N\". Display only. */\n shortcut?: string;\n /** Optional. Extra words that should match this command in search. */\n keywords?: string[];\n disabled?: boolean;\n /** Called when the command is chosen. */\n onSelect?: () => void;\n}\n\nexport interface CommandGroup {\n /** Optional. Heading shown above the group. */\n heading?: string;\n items: CommandItem[];\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** The commands, organised in groups. */\n groups: CommandGroup[];\n /** Optional. Placeholder in the search field. Defaults to \"Search commands…\". */\n placeholder?: string;\n /** Optional. Message when nothing matches. Defaults to \"No results found.\" */\n emptyMessage?: string;\n /** Optional. Accessible name for the dialog. Defaults to \"Command palette\". */\n \"aria-label\"?: string;\n /** Optional. Global key combo that toggles the palette, such as \"mod+k\" (mod = Ctrl on Windows/Linux, Cmd on Mac). */\n hotkey?: string;\n /** Optional. Close after a command is chosen. Defaults to true. */\n closeOnSelect?: boolean;\n /** Optional. Replace the built-in search. Return true to keep the item. */\n filter?: (item: CommandItem, query: string) => boolean;\n /** Optional. Class name for the panel. */\n className?: string;\n}\n\nconst score = (item: CommandItem, q: string) => {\n const label = item.label.toLowerCase();\n if (label.startsWith(q)) return 3;\n if (label.includes(q)) return 2;\n if ([item.description, ...(item.keywords ?? [])].some((t) => t?.toLowerCase().includes(q))) return 1;\n // subsequence match, e.g. \"nf\" -> \"New file\"\n let i = 0;\n for (const c of label) if (c === q[i]) i++;\n return i === q.length ? 0.5 : 0;\n};\n\nconst matchesHotkey = (e: KeyboardEvent, combo: string) => {\n const parts = combo.toLowerCase().split(\"+\").map((s) => s.trim());\n const key = parts[parts.length - 1];\n const mods = parts.slice(0, -1);\n const want = (m: string) => mods.includes(m);\n const mod = want(\"mod\");\n return (\n e.key.toLowerCase() === key &&\n (mod ? e.metaKey || e.ctrlKey : e.metaKey === want(\"meta\") && e.ctrlKey === want(\"ctrl\")) &&\n e.shiftKey === want(\"shift\") &&\n e.altKey === want(\"alt\")\n );\n};\n\nexport const CommandPalette = ({\n open,\n onOpenChange,\n groups,\n placeholder = \"Search commands…\",\n emptyMessage = \"No results found.\",\n \"aria-label\": ariaLabel = \"Command palette\",\n hotkey,\n closeOnSelect = true,\n filter,\n className,\n}: CommandPaletteProps) => {\n const uid = useId();\n const listId = `${uid}-list`;\n const [query, setQuery] = useState(\"\");\n const [active, setActive] = useState(0);\n const [mounted, setMounted] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const prevFocus = useRef<HTMLElement | null>(null);\n\n useEffect(() => setMounted(true), []);\n\n // Global hotkey\n useEffect(() => {\n if (!hotkey) return;\n const onKey = (e: KeyboardEvent) => {\n if (matchesHotkey(e, hotkey)) {\n e.preventDefault();\n onOpenChange(!open);\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [hotkey, open, onOpenChange]);\n\n // Filter + rank\n const visible = useMemo(() => {\n const q = query.trim().toLowerCase();\n return groups\n .map((g) => {\n let items = g.items;\n if (q) {\n items = filter\n ? items.filter((i) => filter(i, q))\n : items\n .map((i) => ({ i, s: score(i, q) }))\n .filter((x) => x.s > 0)\n .sort((a, b) => b.s - a.s)\n .map((x) => x.i);\n }\n return { ...g, items };\n })\n .filter((g) => g.items.length);\n }, [groups, query, filter]);\n\n const flat = useMemo(() => visible.flatMap((g) => g.items), [visible]);\n\n useEffect(() => {\n const first = flat.findIndex((i) => !i.disabled);\n setActive(first < 0 ? 0 : first);\n }, [query, open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Open/close: reset, focus, scroll lock\n useLayoutEffect(() => {\n if (!open) return;\n prevFocus.current = document.activeElement as HTMLElement | null;\n setQuery(\"\");\n const overflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n inputRef.current?.focus();\n return () => {\n document.body.style.overflow = overflow;\n const p = prevFocus.current;\n if (p && document.contains(p)) p.focus({ preventScroll: true });\n };\n }, [open]);\n\n // keep active option in view\n useEffect(() => {\n if (!open) return;\n listRef.current?.querySelector(`[data-index=\"${active}\"]`)?.scrollIntoView({ block: \"nearest\" });\n }, [active, open]);\n\n if (!mounted || !open) return null;\n\n const choose = (item?: CommandItem) => {\n if (!item || item.disabled) return;\n item.onSelect?.();\n if (closeOnSelect) onOpenChange(false);\n };\n\n const move = (dir: 1 | -1) => {\n if (!flat.length) return;\n let i = active;\n for (let n = 0; n < flat.length; n++) {\n i = (i + dir + flat.length) % flat.length;\n if (!flat[i].disabled) break;\n }\n setActive(i);\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n move(1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n move(-1);\n break;\n case \"Home\":\n if (e.target === inputRef.current && !query) {\n e.preventDefault();\n setActive(Math.max(0, flat.findIndex((i) => !i.disabled)));\n }\n break;\n case \"End\":\n if (e.target === inputRef.current && !query) {\n e.preventDefault();\n let last = flat.length - 1;\n while (last > 0 && flat[last].disabled) last--;\n setActive(Math.max(0, last));\n }\n break;\n case \"Enter\":\n e.preventDefault();\n choose(flat[active]);\n break;\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation();\n onOpenChange(false);\n break;\n case \"Tab\":\n e.preventDefault();\n break;\n }\n };\n\n const target = (document.querySelector(\".theme-primary\") as HTMLElement | null) ?? document.body;\n let index = -1;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[80] flex items-start justify-center bg-gray-900/50 px-4 pt-[12vh]\" onMouseDown={(e) => e.target === e.currentTarget && onOpenChange(false)}>\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n onKeyDown={onKeyDown}\n className={cn(\n \"flex max-h-[min(30rem,76vh)] w-full max-w-xl flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white text-gray-900 shadow-2xl\",\n className,\n )}\n >\n <div className=\"flex items-center gap-3 border-b border-gray-100 px-4\">\n <RiSearchLine size={18} aria-hidden=\"true\" className=\"shrink-0 text-gray-400\" />\n <input\n ref={inputRef}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={flat[active] ? `${uid}-opt-${flat[active].id}` : undefined}\n aria-label={placeholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"h-14 w-full bg-transparent text-base text-gray-900 placeholder:text-gray-400 focus:outline-none\"\n />\n <kbd className=\"hidden shrink-0 rounded border border-gray-200 px-1.5 py-0.5 text-xs text-gray-400 sm:block\">Esc</kbd>\n </div>\n\n <div ref={listRef} id={listId} role=\"listbox\" aria-label=\"Commands\" className=\"overflow-y-auto p-2\">\n {visible.map((g, gi) => (\n <div key={g.heading ?? gi} role=\"group\" aria-labelledby={g.heading ? `${uid}-g-${gi}` : undefined}>\n {g.heading && (\n <div id={`${uid}-g-${gi}`} className=\"px-3 pb-1 pt-2 text-xs font-semibold uppercase tracking-wide text-gray-400\">\n {g.heading}\n </div>\n )}\n {g.items.map((item) => {\n index++;\n const i = index;\n const isActive = i === active;\n return (\n <div\n key={item.id}\n id={`${uid}-opt-${item.id}`}\n role=\"option\"\n data-index={i}\n aria-selected={isActive}\n aria-disabled={item.disabled || undefined}\n onMouseMove={() => !item.disabled && active !== i && setActive(i)}\n onClick={() => choose(item)}\n className={cn(\n \"flex cursor-default items-center gap-3 rounded-lg px-3 py-2.5 text-sm\",\n item.disabled ? \"cursor-not-allowed opacity-40\" : isActive && \"bg-primary-50 text-primary-900\",\n )}\n >\n {item.icon && (\n <span aria-hidden=\"true\" className={cn(\"inline-flex shrink-0\", isActive ? \"text-primary-600\" : \"text-gray-500\")}>\n {item.icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{item.label}</span>\n {item.description && <span className=\"block truncate text-xs text-gray-500\">{item.description}</span>}\n </span>\n {item.shortcut && (\n <kbd aria-hidden=\"true\" className=\"shrink-0 rounded border border-gray-200 bg-white px-1.5 py-0.5 text-xs text-gray-500\">\n {item.shortcut}\n </kbd>\n )}\n </div>\n );\n })}\n </div>\n ))}\n {!flat.length && <div className=\"px-3 py-10 text-center text-sm text-gray-500\">{emptyMessage}</div>}\n </div>\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {flat.length ? `${flat.length} result${flat.length === 1 ? \"\" : \"s\"} available` : emptyMessage}\n </div>\n </div>\n </div>,\n target,\n );\n};\n\nexport default CommandPalette;\n","\"use client\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { RiArrowRightSLine, RiCheckLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/* ------------------------------- Contexts -------------------------------- */\n\ninterface BarCtx {\n openId: string | null;\n setOpenId: (id: string | null, viaKeyboard?: \"first\" | \"last\" | false) => void;\n barRef: React.RefObject<HTMLDivElement>;\n /** Focus the previous/next trigger; if a menu is open, open that one instead. */\n step: (from: HTMLElement | null, dir: 1 | -1) => void;\n keyboardOpen: React.MutableRefObject<\"first\" | \"last\" | false>;\n}\nconst Bar = createContext<BarCtx | null>(null);\nconst useBar = (n: string) => {\n const c = useContext(Bar);\n if (!c) throw new Error(`<${n}> must be used inside <Menubar>.`);\n return c;\n};\n\ninterface MenuCtx {\n id: string;\n open: boolean;\n triggerRef: React.MutableRefObject<HTMLButtonElement | null>;\n}\nconst Menu = createContext<MenuCtx | null>(null);\nconst useMenu = (n: string) => {\n const c = useContext(Menu);\n if (!c) throw new Error(`<${n}> must be used inside <MenubarMenu>.`);\n return c;\n};\n\nconst PANEL_ATTR = \"data-genesis-menubar-panel\";\nconst ITEM_SELECTOR = '[role^=\"menuitem\"]:not([aria-disabled=\"true\"])';\nconst MARGIN = 8;\n\n/* -------------------------------- Menubar -------------------------------- */\n\nexport interface MenubarProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Accessible name for the menu bar. */\n \"aria-label\"?: string;\n}\n\nexport const Menubar = ({ children, className, ...rest }: MenubarProps) => {\n const [openId, setOpen] = useState<string | null>(null);\n const barRef = useRef<HTMLDivElement>(null);\n const keyboardOpen = useRef<\"first\" | \"last\" | false>(false);\n\n const setOpenId = useCallback((id: string | null, kb: \"first\" | \"last\" | false = false) => {\n keyboardOpen.current = kb;\n setOpen(id);\n }, []);\n\n const triggers = () => Array.from(barRef.current?.querySelectorAll<HTMLElement>(\"[data-menubar-trigger]:not(:disabled)\") ?? []);\n\n const step = useCallback(\n (from: HTMLElement | null, dir: 1 | -1) => {\n const list = triggers();\n if (!list.length) return;\n const i = Math.max(0, list.indexOf(from as HTMLElement));\n const next = list[(i + dir + list.length) % list.length];\n next.focus();\n if (openId !== null) next.click();\n },\n [openId], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n // outside click closes\n useEffect(() => {\n if (openId === null) return;\n const onDown = (e: MouseEvent) => {\n const t = e.target as Element;\n if (!barRef.current?.contains(t) && !t.closest?.(`[${PANEL_ATTR}]`)) setOpenId(null);\n };\n const onOther = () => setOpenId(null);\n document.addEventListener(\"mousedown\", onDown, true);\n window.addEventListener(\"blur\", onOther);\n window.addEventListener(\"resize\", onOther);\n return () => {\n document.removeEventListener(\"mousedown\", onDown, true);\n window.removeEventListener(\"blur\", onOther);\n window.removeEventListener(\"resize\", onOther);\n };\n }, [openId, setOpenId]);\n\n // roving tabindex: only one trigger is tabbable\n useEffect(() => {\n const list = triggers();\n if (!list.length) return;\n if (!list.some((t) => t.tabIndex === 0)) list[0].tabIndex = 0;\n });\n\n return (\n <Bar.Provider value={{ openId, setOpenId, barRef, step, keyboardOpen }}>\n <div\n ref={barRef}\n role=\"menubar\"\n aria-orientation=\"horizontal\"\n {...rest}\n className={cn(\"inline-flex items-center gap-1 rounded-xl border border-gray-200 bg-white p-1 shadow-xs\", className)}\n onFocusCapture={(e) => {\n const t = (e.target as HTMLElement).closest<HTMLElement>(\"[data-menubar-trigger]\");\n if (!t) return;\n triggers().forEach((el) => (el.tabIndex = el === t ? 0 : -1));\n }}\n >\n {children}\n </div>\n </Bar.Provider>\n );\n};\n\n/* ---------------------------------- Menu --------------------------------- */\n\nexport const MenubarMenu = ({ children }: { children: React.ReactNode }) => {\n const id = useId();\n const { openId } = useBar(\"MenubarMenu\");\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n return <Menu.Provider value={{ id, open: openId === id, triggerRef }}>{children}</Menu.Provider>;\n};\n\nexport interface MenubarTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n}\n\nexport const MenubarTrigger = ({ children, className, onClick, onKeyDown, onMouseEnter, ...rest }: MenubarTriggerProps) => {\n const bar = useBar(\"MenubarTrigger\");\n const { id, open, triggerRef } = useMenu(\"MenubarTrigger\");\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n data-menubar-trigger=\"\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n tabIndex={-1}\n {...rest}\n ref={triggerRef}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n bar.setOpenId(open ? null : id, bar.keyboardOpen.current && !open ? bar.keyboardOpen.current : false);\n }}\n onMouseEnter={(e) => {\n onMouseEnter?.(e);\n if (bar.openId !== null && bar.openId !== id && !rest.disabled) bar.setOpenId(id, false);\n }}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n switch (e.key) {\n case \"ArrowRight\":\n e.preventDefault();\n bar.step(e.currentTarget, 1);\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n bar.step(e.currentTarget, -1);\n break;\n case \"ArrowDown\":\n case \"Enter\":\n case \" \":\n e.preventDefault();\n bar.setOpenId(id, \"first\");\n break;\n case \"ArrowUp\":\n e.preventDefault();\n bar.setOpenId(id, \"last\");\n break;\n case \"Escape\":\n if (open) {\n e.preventDefault();\n bar.setOpenId(null);\n }\n break;\n }\n }}\n className={cn(\n \"rounded-lg px-3 py-1.5 text-sm font-medium text-gray-700 outline-none transition-colors motion-reduce:transition-none\",\n \"hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary-500 disabled:cursor-not-allowed disabled:opacity-40\",\n open && \"bg-gray-100 text-gray-900\",\n className,\n )}\n >\n {children}\n </button>\n );\n};\n\n/* -------------------------------- Keyboard -------------------------------- */\n\nfunction useMenuKeys(\n panelRef: React.RefObject<HTMLDivElement>,\n o: { onEscape: () => void; onLeft?: () => void; onRight?: () => void },\n) {\n return (e: React.KeyboardEvent<HTMLDivElement>) => {\n const panel = panelRef.current;\n if (!panel || !panel.contains(e.target as Node)) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>(`:scope > ${ITEM_SELECTOR}`));\n const idx = items.indexOf(document.activeElement as HTMLElement);\n const focus = (i: number) => items[(i + items.length) % items.length]?.focus();\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n focus(idx < 0 ? 0 : idx + 1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n focus(idx < 0 ? items.length - 1 : idx - 1);\n break;\n case \"Home\":\n e.preventDefault();\n focus(0);\n break;\n case \"End\":\n e.preventDefault();\n focus(items.length - 1);\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n o.onLeft?.();\n break;\n case \"ArrowRight\":\n e.preventDefault();\n o.onRight?.();\n break;\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation();\n o.onEscape();\n break;\n case \"Tab\":\n e.preventDefault();\n o.onEscape();\n break;\n default:\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n const ch = e.key.toLowerCase();\n const order = [...items.slice(idx + 1), ...items.slice(0, idx + 1)];\n order.find((el) => (el.textContent ?? \"\").trim().toLowerCase().startsWith(ch))?.focus();\n }\n }\n };\n}\n\nconst panelClass =\n \"fixed z-[70] min-w-[200px] max-w-[min(320px,calc(100vw-1rem))] rounded-xl border border-gray-200 bg-white p-1 text-sm text-gray-900 shadow-lg focus:outline-none\";\n\nconst portalTarget = (el: Element | null) => (el?.closest(\".theme-primary\") as HTMLElement | null) ?? document.body;\n\n/* -------------------------------- Content -------------------------------- */\n\nexport interface MenubarContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n \"aria-label\"?: string;\n}\n\nexport const MenubarContent = ({ children, className, style, ...rest }: MenubarContentProps) => {\n const bar = useBar(\"MenubarContent\");\n const { open, triggerRef } = useMenu(\"MenubarContent\");\n const ref = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top: number } | null>(null);\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n\n useLayoutEffect(() => {\n if (!open) return setPos(null);\n const t = triggerRef.current?.getBoundingClientRect();\n const el = ref.current;\n if (!t || !el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n let left = Math.min(t.left, window.innerWidth - w - MARGIN);\n let top = t.bottom + 4;\n if (top + h + MARGIN > window.innerHeight && t.top - h - 4 > MARGIN) top = t.top - h - 4;\n setPos({ left: Math.max(MARGIN, left), top });\n }, [open, triggerRef]);\n\n // focus management\n useEffect(() => {\n if (!open || !pos) return;\n const kb = bar.keyboardOpen.current;\n const items = ref.current?.querySelectorAll<HTMLElement>(`:scope > ${ITEM_SELECTOR}`);\n if (kb && items?.length) (kb === \"last\" ? items[items.length - 1] : items[0]).focus({ preventScroll: true });\n else ref.current?.focus({ preventScroll: true });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, pos === null]);\n\n const closeAndFocus = () => {\n bar.setOpenId(null);\n triggerRef.current?.focus();\n };\n\n const onKeyDown = useMenuKeys(ref, {\n onEscape: closeAndFocus,\n onLeft: () => bar.step(triggerRef.current, -1),\n onRight: () => bar.step(triggerRef.current, 1),\n });\n\n if (!mounted || !open) return null;\n\n return createPortal(\n <div\n ref={ref}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n {...{ [PANEL_ATTR]: \"\" }}\n {...rest}\n onKeyDown={onKeyDown}\n style={{ left: pos?.left ?? 0, top: pos?.top ?? 0, visibility: pos ? \"visible\" : \"hidden\", ...style }}\n className={cn(panelClass, className)}\n >\n <MenuClose.Provider value={closeAndFocus}>{children}</MenuClose.Provider>\n </div>,\n portalTarget(bar.barRef.current),\n );\n};\n\nconst MenuClose = createContext<() => void>(() => {});\n\n/* --------------------------------- Items --------------------------------- */\n\nconst itemBase =\n \"relative flex w-full cursor-default select-none items-center gap-2 rounded-lg px-3 py-2 text-left text-sm outline-none transition-colors duration-100 motion-reduce:transition-none\";\nconst tone = (intent: \"default\" | \"danger\", disabled?: boolean) =>\n disabled\n ? \"cursor-not-allowed opacity-40\"\n : intent === \"danger\"\n ? \"text-error-700 hover:bg-error-50 focus:bg-error-50\"\n : \"text-gray-900 hover:bg-gray-100 focus:bg-gray-100\";\n\ninterface BaseProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n /** Optional. Icon shown before the label. */\n icon?: JSX.Element;\n /** Optional. Shortcut hint, display only. */\n shortcut?: string;\n disabled?: boolean;\n /** Optional. Use \"danger\" for destructive actions. */\n intent?: \"default\" | \"danger\";\n /** Optional. Close the menu after selecting. Defaults to true for items, false for checkbox items. */\n closeOnSelect?: boolean;\n}\n\nconst activateKey = (e: React.KeyboardEvent, fn: () => void) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n fn();\n }\n};\n\nconst Row = ({ icon, shortcut, children, check }: { icon?: JSX.Element; shortcut?: string; children: React.ReactNode; check?: boolean | null }) => (\n <>\n {check !== undefined && (\n <span aria-hidden=\"true\" className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-primary-600\">\n {check && <RiCheckLine size={16} />}\n </span>\n )}\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n {shortcut && <span aria-hidden=\"true\" className=\"ml-6 shrink-0 text-xs text-gray-400\">{shortcut}</span>}\n </>\n);\n\nexport interface MenubarItemProps extends BaseProps {\n /** Called when the item is chosen by click, Enter or Space. */\n onSelect?: () => void;\n}\n\nexport const MenubarItem = ({ children, icon, shortcut, disabled, intent = \"default\", closeOnSelect = true, onSelect, className, ...rest }: MenubarItemProps) => {\n const close = useContext(MenuClose);\n const go = () => {\n if (disabled) return;\n onSelect?.();\n if (closeOnSelect) close();\n };\n return (\n <div\n role=\"menuitem\"\n tabIndex={-1}\n aria-disabled={disabled || undefined}\n {...rest}\n onClick={go}\n onKeyDown={(e) => activateKey(e, go)}\n onMouseMove={(e) => !disabled && e.currentTarget.focus({ preventScroll: true })}\n className={cn(itemBase, tone(intent, disabled), className)}\n >\n <Row icon={icon} shortcut={shortcut}>{children}</Row>\n </div>\n );\n};\n\nexport interface MenubarCheckboxItemProps extends BaseProps {\n checked: boolean;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const MenubarCheckboxItem = ({ children, checked, onCheckedChange, icon, shortcut, disabled, intent = \"default\", closeOnSelect = false, className, ...rest }: MenubarCheckboxItemProps) => {\n const close = useContext(MenuClose);\n const go = () => {\n if (disabled) return;\n onCheckedChange?.(!checked);\n if (closeOnSelect) close();\n };\n return (\n <div\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n tabIndex={-1}\n aria-disabled={disabled || undefined}\n {...rest}\n onClick={go}\n onKeyDown={(e) => activateKey(e, go)}\n onMouseMove={(e) => !disabled && e.currentTarget.focus({ preventScroll: true })}\n className={cn(itemBase, tone(intent, disabled), className)}\n >\n <Row icon={icon} shortcut={shortcut} check={checked}>{children}</Row>\n </div>\n );\n};\n\nexport const MenubarLabel = ({ children, className, ...rest }: React.HTMLAttributes<HTMLDivElement>) => (\n <div role=\"presentation\" {...rest} className={cn(\"px-3 pb-1 pt-2 text-xs font-semibold uppercase tracking-wide text-gray-400\", className)}>\n {children}\n </div>\n);\n\nexport const MenubarSeparator = ({ className, ...rest }: React.HTMLAttributes<HTMLDivElement>) => (\n <div role=\"separator\" aria-orientation=\"horizontal\" {...rest} className={cn(\"-mx-1 my-1 h-px bg-gray-100\", className)} />\n);\n\n/* -------------------------------- Submenus ------------------------------- */\n\ninterface SubCtx {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerEl: React.MutableRefObject<HTMLDivElement | null>;\n scheduleClose: () => void;\n cancelClose: () => void;\n viaKeyboard: React.MutableRefObject<boolean>;\n}\nconst Sub = createContext<SubCtx | null>(null);\n\nexport const MenubarSub = ({ children }: { children: React.ReactNode }) => {\n const [open, setOpen] = useState(false);\n const triggerEl = useRef<HTMLDivElement | null>(null);\n const viaKeyboard = useRef(false);\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const cancelClose = () => clearTimeout(timer.current);\n const scheduleClose = () => {\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setOpen(false), 150);\n };\n useEffect(() => () => clearTimeout(timer.current), []);\n return <Sub.Provider value={{ open, setOpen, triggerEl, scheduleClose, cancelClose, viaKeyboard }}>{children}</Sub.Provider>;\n};\n\nexport const MenubarSubTrigger = ({ children, icon, disabled, className, ...rest }: Omit<BaseProps, \"shortcut\" | \"intent\" | \"closeOnSelect\">) => {\n const sub = useContext(Sub);\n if (!sub) throw new Error(\"<MenubarSubTrigger> must be used inside <MenubarSub>.\");\n const open = () => !disabled && sub.setOpen(true);\n return (\n <div\n ref={(el) => {\n sub.triggerEl.current = el;\n }}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={sub.open}\n aria-disabled={disabled || undefined}\n tabIndex={-1}\n {...rest}\n onClick={open}\n onMouseEnter={(e) => {\n if (disabled) return;\n sub.cancelClose();\n e.currentTarget.focus({ preventScroll: true });\n open();\n }}\n onMouseLeave={sub.scheduleClose}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation(); // do not move to the next top-level menu\n sub.viaKeyboard.current = true;\n open();\n }\n }}\n className={cn(itemBase, tone(\"default\", disabled), sub.open && \"bg-gray-100\", className)}\n >\n <Row icon={icon}>{children}</Row>\n <RiArrowRightSLine size={16} aria-hidden=\"true\" className=\"shrink-0 text-gray-400\" />\n </div>\n );\n};\n\nexport const MenubarSubContent = ({ children, className, style, ...rest }: MenubarContentProps) => {\n const sub = useContext(Sub);\n const bar = useBar(\"MenubarSubContent\");\n const ref = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top: number } | null>(null);\n if (!sub) throw new Error(\"<MenubarSubContent> must be used inside <MenubarSub>.\");\n\n const closeSub = () => {\n sub.setOpen(false);\n sub.triggerEl.current?.focus({ preventScroll: true });\n };\n\n useLayoutEffect(() => {\n if (!sub.open) return setPos(null);\n const t = sub.triggerEl.current?.getBoundingClientRect();\n const el = ref.current;\n if (!t || !el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n let left = t.right - 4;\n if (left + w + MARGIN > window.innerWidth) left = t.left - w + 4;\n const top = Math.max(MARGIN, Math.min(t.top - 4, window.innerHeight - h - MARGIN));\n setPos({ left: Math.max(MARGIN, left), top });\n }, [sub.open, sub.triggerEl]);\n\n useEffect(() => {\n if (!sub.open) {\n sub.viaKeyboard.current = false;\n return;\n }\n if (pos && sub.viaKeyboard.current) {\n sub.viaKeyboard.current = false;\n ref.current?.querySelector<HTMLElement>(`:scope > ${ITEM_SELECTOR}`)?.focus({ preventScroll: true });\n }\n }, [sub.open, pos, sub.viaKeyboard]);\n\n const onKeyDown = useMenuKeys(ref, {\n onEscape: closeSub,\n onLeft: closeSub,\n onRight: () => {},\n });\n\n if (!sub.open) return null;\n\n return createPortal(\n <div\n ref={ref}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n {...{ [PANEL_ATTR]: \"\" }}\n {...rest}\n onMouseEnter={sub.cancelClose}\n onMouseLeave={sub.scheduleClose}\n onKeyDown={(e) => {\n onKeyDown(e);\n // keep sub-panel keys from reaching the parent panel through the React tree\n if ([\"ArrowLeft\", \"ArrowRight\", \"Escape\"].includes(e.key)) e.stopPropagation();\n }}\n style={{ left: pos?.left ?? 0, top: pos?.top ?? 0, visibility: pos ? \"visible\" : \"hidden\", ...style }}\n className={cn(panelClass, \"z-[71]\", className)}\n >\n {children}\n </div>,\n portalTarget(bar.barRef.current),\n );\n};\n\nexport default Menubar;\n","\"use client\";\nimport React, { useEffect, useId, useRef, useState } from \"react\";\nimport { RiCloseLine, RiMenuLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface NavbarItem {\n /** Unique id. */\n id: string;\n label: string;\n /** Optional. Link target. Items without an href render as buttons. */\n href?: string;\n /** Optional. Icon shown before the label. */\n icon?: JSX.Element;\n /** Optional. Marks the current page (adds aria-current=\"page\"). */\n active?: boolean;\n disabled?: boolean;\n /** Optional. Called when the item is clicked. */\n onClick?: (e: React.MouseEvent) => void;\n}\n\nexport interface NavbarLinkRenderProps {\n href: string;\n className: string;\n children: React.ReactNode;\n onClick?: (e: React.MouseEvent) => void;\n \"aria-current\"?: \"page\";\n}\n\nexport interface NavbarProps extends Omit<React.HTMLAttributes<HTMLElement>, \"children\"> {\n /** Optional. Logo or product name shown at the start. */\n brand?: React.ReactNode;\n /** Optional. Navigation links. */\n items?: NavbarItem[];\n /** Optional. Content at the end, such as buttons, a search field or an avatar. */\n actions?: React.ReactNode;\n /** Optional. Extra content in the middle, between the links and the actions. */\n children?: React.ReactNode;\n /** Optional. Visual style. Defaults to \"default\". */\n variant?: \"default\" | \"transparent\" | \"primary\";\n /** Optional. Stick to the top of the page while scrolling. Defaults to false. */\n sticky?: boolean;\n /** Optional. Show a bottom border. Defaults to true. */\n bordered?: boolean;\n /** Optional. Width at which the links collapse into a menu button. Defaults to \"md\". */\n collapseBelow?: \"sm\" | \"md\" | \"lg\";\n /** Optional. Maximum content width. Defaults to \"7xl\". */\n maxWidth?: \"3xl\" | \"5xl\" | \"7xl\" | \"full\";\n /** Optional. Accessible name for the navigation. Defaults to \"Main\". */\n \"aria-label\"?: string;\n /** Optional. Render links with your router's Link component, for example Next.js Link. */\n renderLink?: (props: NavbarLinkRenderProps) => React.ReactNode;\n}\n\nconst widths = { \"3xl\": \"max-w-3xl\", \"5xl\": \"max-w-5xl\", \"7xl\": \"max-w-7xl\", full: \"max-w-none\" } as const;\n\nconst show = {\n sm: { row: \"hidden sm:flex\", burger: \"sm:hidden\", panel: \"sm:hidden\" },\n md: { row: \"hidden md:flex\", burger: \"md:hidden\", panel: \"md:hidden\" },\n lg: { row: \"hidden lg:flex\", burger: \"lg:hidden\", panel: \"lg:hidden\" },\n} as const;\nconst query = { sm: \"(min-width: 640px)\", md: \"(min-width: 768px)\", lg: \"(min-width: 1024px)\" } as const;\n\nexport const Navbar = ({\n brand,\n items = [],\n actions,\n children,\n variant = \"default\",\n sticky = false,\n bordered = true,\n collapseBelow = \"md\",\n maxWidth = \"7xl\",\n \"aria-label\": ariaLabel = \"Main\",\n renderLink,\n className,\n ...rest\n}: NavbarProps) => {\n const [open, setOpen] = useState(false);\n const uid = useId();\n const btnRef = useRef<HTMLButtonElement>(null);\n const bp = show[collapseBelow];\n const primary = variant === \"primary\";\n\n // close the mobile panel when the viewport grows to desktop\n useEffect(() => {\n const mq = window.matchMedia(query[collapseBelow]);\n const on = () => mq.matches && setOpen(false);\n mq.addEventListener(\"change\", on);\n return () => mq.removeEventListener(\"change\", on);\n }, [collapseBelow]);\n\n const linkClass = (item: NavbarItem, mobile: boolean) =>\n cn(\n \"inline-flex items-center gap-2 rounded-lg text-sm font-medium outline-none transition-colors motion-reduce:transition-none\",\n \"focus-visible:ring-2 focus-visible:ring-primary-500\",\n primary ? \"focus-visible:ring-white\" : \"\",\n mobile ? \"w-full px-3 py-2.5\" : \"px-3 py-2\",\n item.disabled && \"pointer-events-none opacity-40\",\n primary\n ? item.active\n ? \"bg-white/20 text-white\"\n : \"text-primary-50 hover:bg-white/10 hover:text-white\"\n : item.active\n ? \"bg-primary-50 text-primary-700\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n );\n\n const renderItem = (item: NavbarItem, mobile: boolean) => {\n const cls = linkClass(item, mobile);\n const onClick = (e: React.MouseEvent) => {\n if (item.disabled) return e.preventDefault();\n item.onClick?.(e);\n if (mobile) setOpen(false);\n };\n const content = (\n <>\n {item.icon && <span aria-hidden=\"true\" className=\"inline-flex shrink-0\">{item.icon}</span>}\n {item.label}\n </>\n );\n const current = item.active ? (\"page\" as const) : undefined;\n if (item.href) {\n if (renderLink) return renderLink({ href: item.href, className: cls, children: content, onClick, \"aria-current\": current });\n return (\n <a href={item.href} className={cls} onClick={onClick} aria-current={current} aria-disabled={item.disabled || undefined} tabIndex={item.disabled ? -1 : undefined}>\n {content}\n </a>\n );\n }\n return (\n <button type=\"button\" className={cls} onClick={onClick} aria-current={current} disabled={item.disabled}>\n {content}\n </button>\n );\n };\n\n return (\n <header\n {...rest}\n className={cn(\n \"z-40 w-full\",\n sticky && \"sticky top-0\",\n variant === \"default\" && \"bg-white/90 backdrop-blur supports-[backdrop-filter]:bg-white/80\",\n variant === \"primary\" && \"bg-primary-600 text-white\",\n variant === \"transparent\" && \"bg-transparent\",\n bordered && (primary ? \"border-b border-primary-700\" : \"border-b border-gray-200\"),\n className,\n )}\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && open) {\n setOpen(false);\n btnRef.current?.focus();\n }\n }}\n >\n <nav aria-label={ariaLabel} className={cn(\"mx-auto flex h-16 w-full items-center gap-4 px-4 sm:px-6\", widths[maxWidth])}>\n {brand && <div className={cn(\"flex shrink-0 items-center font-semibold\", primary ? \"text-white\" : \"text-gray-900\")}>{brand}</div>}\n\n {items.length > 0 && (\n <ul className={cn(\"ml-2 items-center gap-1\", bp.row)}>\n {items.map((item) => (\n <li key={item.id}>{renderItem(item, false)}</li>\n ))}\n </ul>\n )}\n\n {children && <div className=\"min-w-0 flex-1\">{children}</div>}\n {!children && <div className=\"flex-1\" />}\n\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n\n {items.length > 0 && (\n <button\n ref={btnRef}\n type=\"button\"\n aria-label={open ? \"Close menu\" : \"Open menu\"}\n aria-expanded={open}\n aria-controls={`${uid}-panel`}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n \"inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n primary ? \"text-white hover:bg-white/10 focus-visible:ring-white\" : \"text-gray-700 hover:bg-gray-100\",\n bp.burger,\n )}\n >\n {open ? <RiCloseLine size={22} aria-hidden=\"true\" /> : <RiMenuLine size={22} aria-hidden=\"true\" />}\n </button>\n )}\n </nav>\n\n {items.length > 0 && open && (\n <div id={`${uid}-panel`} className={cn(\"border-t px-4 pb-4 pt-2\", primary ? \"border-primary-700 bg-primary-600\" : \"border-gray-100 bg-white\", bp.panel)}>\n <ul className=\"flex flex-col gap-1\">\n {items.map((item) => (\n <li key={item.id}>{renderItem(item, true)}</li>\n ))}\n </ul>\n </div>\n )}\n </header>\n );\n};\n\nexport default Navbar;\n","import React from \"react\";\nimport { RiCheckLine, RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport type TimelineStatus = \"completed\" | \"current\" | \"upcoming\" | \"error\";\n\nexport interface TimelineItem {\n /** Unique id. */\n id: string;\n /** Short heading for the event. */\n title: React.ReactNode;\n /** Optional. Supporting text under the title. */\n description?: React.ReactNode;\n /** Optional. Date or time label, such as \"2 hours ago\". */\n time?: string;\n /** Optional. Machine-readable date for the time element, such as \"2026-11-05\". */\n dateTime?: string;\n /** Optional. Replaces the default marker (check, cross or dot). */\n icon?: JSX.Element;\n /** Optional. Controls the marker colour. Defaults to \"completed\". */\n status?: TimelineStatus;\n /** Optional. Extra content below the description, such as a card or attachment. */\n content?: React.ReactNode;\n}\n\nexport interface TimelineProps extends Omit<React.OlHTMLAttributes<HTMLOListElement>, \"children\"> {\n items: TimelineItem[];\n /** Optional. Layout direction. Defaults to \"vertical\". */\n orientation?: \"vertical\" | \"horizontal\";\n /** Optional. Marker size. Defaults to \"md\". */\n size?: \"sm\" | \"md\";\n /** Optional. Put the time on the left of the marker in vertical layouts. Defaults to false. */\n timeOnSide?: boolean;\n /** Optional. Accessible name for the list. */\n \"aria-label\"?: string;\n}\n\nconst statusText: Record<TimelineStatus, string> = {\n completed: \"Completed\",\n current: \"Current\",\n upcoming: \"Upcoming\",\n error: \"Failed\",\n};\n\nconst markerTone: Record<TimelineStatus, string> = {\n completed: \"border-primary-600 bg-primary-600 text-white\",\n current: \"border-primary-600 bg-white text-primary-600 ring-4 ring-primary-100\",\n upcoming: \"border-gray-300 bg-white text-gray-400\",\n error: \"border-error-600 bg-error-600 text-white\",\n};\n\nconst lineTone = (s: TimelineStatus) => (s === \"completed\" ? \"bg-primary-600\" : \"bg-gray-200\");\n\nexport const Timeline = ({\n items,\n orientation = \"vertical\",\n size = \"md\",\n timeOnSide = false,\n className,\n ...rest\n}: TimelineProps) => {\n const dim = size === \"sm\" ? \"h-6 w-6\" : \"h-8 w-8\";\n const iconSize = size === \"sm\" ? 14 : 16;\n const horizontal = orientation === \"horizontal\";\n\n const marker = (item: TimelineItem) => {\n const status = item.status ?? \"completed\";\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\"relative z-10 inline-flex shrink-0 items-center justify-center rounded-full border-2\", dim, markerTone[status])}\n >\n {item.icon ??\n (status === \"completed\" ? (\n <RiCheckLine size={iconSize} />\n ) : status === \"error\" ? (\n <RiCloseLine size={iconSize} />\n ) : (\n <span className={cn(\"rounded-full\", size === \"sm\" ? \"h-1.5 w-1.5\" : \"h-2 w-2\", status === \"current\" ? \"bg-primary-600\" : \"bg-gray-300\")} />\n ))}\n </span>\n );\n };\n\n const body = (item: TimelineItem, status: TimelineStatus) => (\n <>\n <div className=\"flex flex-wrap items-baseline gap-x-2\">\n <p className={cn(\"text-sm font-semibold\", status === \"upcoming\" ? \"text-gray-500\" : \"text-gray-900\")}>\n {item.title}\n <span className=\"sr-only\">{`, ${statusText[status]}`}</span>\n </p>\n {item.time && !timeOnSide && (\n <time dateTime={item.dateTime} className=\"text-xs text-gray-500\">\n {item.time}\n </time>\n )}\n </div>\n {item.description && <div className=\"mt-0.5 text-sm text-gray-600\">{item.description}</div>}\n {item.content && <div className=\"mt-2\">{item.content}</div>}\n </>\n );\n\n if (horizontal) {\n return (\n <ol {...rest} className={cn(\"flex w-full\", className)}>\n {items.map((item, i) => {\n const status = item.status ?? \"completed\";\n const last = i === items.length - 1;\n return (\n <li key={item.id} aria-current={status === \"current\" ? \"step\" : undefined} className=\"relative flex-1\">\n <div className=\"flex items-center\">\n {marker(item)}\n {!last && <span aria-hidden=\"true\" className={cn(\"h-0.5 flex-1\", lineTone(status))} />}\n </div>\n <div className=\"mt-3 pr-4\">{body(item, status)}</div>\n </li>\n );\n })}\n </ol>\n );\n }\n\n return (\n <ol {...rest} className={cn(\"flex flex-col\", className)}>\n {items.map((item, i) => {\n const status = item.status ?? \"completed\";\n const last = i === items.length - 1;\n return (\n <li key={item.id} aria-current={status === \"current\" ? \"step\" : undefined} className=\"relative flex gap-4\">\n {timeOnSide && (\n <div className=\"w-24 shrink-0 pt-1 text-right\">\n {item.time && (\n <time dateTime={item.dateTime} className=\"text-xs text-gray-500\">\n {item.time}\n </time>\n )}\n </div>\n )}\n <div className=\"flex flex-col items-center\">\n {marker(item)}\n {!last && <span aria-hidden=\"true\" className={cn(\"-mb-px mt-1 w-0.5 flex-1\", lineTone(status))} />}\n </div>\n <div className={cn(\"min-w-0 flex-1\", last ? \"pb-0\" : \"pb-8\", size === \"sm\" ? \"pt-0\" : \"pt-1\")}>{body(item, status)}</div>\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default Timeline;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { RiArrowLeftSLine, RiArrowRightSLine, RiPauseLine, RiPlayLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"children\"> {\n /** The slides. Each child becomes one slide. */\n children: React.ReactNode;\n /** Optional. Controlled index of the first visible slide. */\n index?: number;\n /** Optional. Starting index when uncontrolled. Defaults to 0. */\n defaultIndex?: number;\n /** Optional. Called when the visible slide changes. */\n onIndexChange?: (index: number) => void;\n /** Optional. Slides visible at once. Defaults to 1. */\n slidesPerView?: 1 | 2 | 3 | 4;\n /** Optional. Space between slides in pixels. Defaults to 16. */\n gap?: number;\n /** Optional. Wrap from the last slide to the first and back. Defaults to false. */\n loop?: boolean;\n /** Optional. Show previous and next buttons. Defaults to true. */\n arrows?: boolean;\n /** Optional. Show dot indicators. Defaults to true. */\n dots?: boolean;\n /** Optional. Milliseconds between automatic slides. 0 turns autoplay off. Defaults to 0. */\n autoplay?: number;\n /** Optional. Allow dragging or swiping. Defaults to true. */\n swipe?: boolean;\n /** Optional. Accessible name for the carousel. Defaults to \"Carousel\". */\n \"aria-label\"?: string;\n /** Optional. Class name for the sliding area. */\n viewportClassName?: string;\n}\n\nexport const Carousel = ({\n children,\n index: controlled,\n defaultIndex = 0,\n onIndexChange,\n slidesPerView = 1,\n gap = 16,\n loop = false,\n arrows = true,\n dots = true,\n autoplay = 0,\n swipe = true,\n \"aria-label\": ariaLabel = \"Carousel\",\n className,\n viewportClassName,\n ...rest\n}: CarouselProps) => {\n const slides = React.Children.toArray(children);\n const count = slides.length;\n const maxIndex = Math.max(0, count - slidesPerView);\n const uid = useId();\n\n const [inner, setInner] = useState(defaultIndex);\n const isControlled = controlled !== undefined;\n const current = Math.min(Math.max(isControlled ? controlled! : inner, 0), maxIndex);\n\n const go = useCallback(\n (next: number) => {\n let n = next;\n if (loop) n = next > maxIndex ? 0 : next < 0 ? maxIndex : next;\n else n = Math.min(Math.max(next, 0), maxIndex);\n if (n === current) return;\n if (!isControlled) setInner(n);\n onIndexChange?.(n);\n },\n [loop, maxIndex, current, isControlled, onIndexChange],\n );\n\n // ----- autoplay -----\n const [userPaused, setUserPaused] = useState(false);\n const [hover, setHover] = useState(false);\n const [focusIn, setFocusIn] = useState(false);\n const [reduced, setReduced] = useState(false);\n const [hidden, setHidden] = useState(false);\n useEffect(() => {\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setReduced(mq.matches);\n const on = () => setReduced(mq.matches);\n mq.addEventListener(\"change\", on);\n const vis = () => setHidden(document.hidden);\n document.addEventListener(\"visibilitychange\", vis);\n return () => {\n mq.removeEventListener(\"change\", on);\n document.removeEventListener(\"visibilitychange\", vis);\n };\n }, []);\n\n const autoplayOn = autoplay > 0 && !reduced;\n const playing = autoplayOn && !userPaused && !hover && !focusIn && !hidden && maxIndex > 0;\n const goRef = useRef(go);\n goRef.current = go;\n const currentRef = useRef(current);\n currentRef.current = current;\n useEffect(() => {\n if (!playing) return;\n const t = setInterval(() => goRef.current(loop || currentRef.current < maxIndex ? currentRef.current + 1 : 0), autoplay);\n return () => clearInterval(t);\n }, [playing, autoplay, loop, maxIndex]);\n\n // ----- swipe -----\n const viewportRef = useRef<HTMLDivElement>(null);\n const drag = useRef<{ x: number; id: number } | null>(null);\n const [dx, setDx] = useState(0);\n const [dragging, setDragging] = useState(false);\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (!swipe || e.pointerType === \"mouse\" && e.button !== 0 || maxIndex === 0) return;\n if ((e.target as Element).closest(\"a,button,input,select,textarea\")) return;\n drag.current = { x: e.clientX, id: e.pointerId };\n };\n const onPointerMove = (e: React.PointerEvent) => {\n if (!drag.current) return;\n const d = e.clientX - drag.current.x;\n if (!dragging && Math.abs(d) > 6) {\n setDragging(true);\n viewportRef.current?.setPointerCapture(drag.current.id);\n }\n if (Math.abs(d) > 6) setDx(d);\n };\n const end = (e: React.PointerEvent) => {\n if (!drag.current) return;\n const d = e.clientX - drag.current.x;\n const w = viewportRef.current?.offsetWidth ?? 300;\n drag.current = null;\n setDragging(false);\n setDx(0);\n if (Math.abs(d) > Math.min(60, w * 0.15)) go(current + (d < 0 ? 1 : -1));\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.target !== e.currentTarget && (e.target as Element).closest(\"input,textarea,select\")) return;\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n go(current + 1);\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n go(current - 1);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n go(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n go(maxIndex);\n }\n };\n\n const slideWidth = `calc((100% - ${(slidesPerView - 1) * gap}px) / ${slidesPerView})`;\n const offset = `calc(${current} * (${slideWidth} + ${gap}px) * -1 + ${dx}px)`;\n\n const btn =\n \"inline-flex h-9 w-9 items-center justify-center rounded-full border border-gray-200 bg-white/95 text-gray-700 shadow-sm outline-none transition hover:bg-white focus-visible:ring-2 focus-visible:ring-primary-500 disabled:cursor-not-allowed disabled:opacity-40 motion-reduce:transition-none\";\n\n return (\n <div\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={ariaLabel}\n {...rest}\n className={cn(\"relative\", className)}\n onKeyDown={(e) => {\n rest.onKeyDown?.(e);\n onKeyDown(e);\n }}\n onMouseEnter={(e) => {\n rest.onMouseEnter?.(e);\n setHover(true);\n }}\n onMouseLeave={(e) => {\n rest.onMouseLeave?.(e);\n setHover(false);\n }}\n onFocus={(e) => {\n rest.onFocus?.(e);\n setFocusIn(true);\n }}\n onBlur={(e) => {\n rest.onBlur?.(e);\n if (!e.currentTarget.contains(e.relatedTarget as Node)) setFocusIn(false);\n }}\n >\n <div\n ref={viewportRef}\n tabIndex={0}\n className={cn(\"overflow-hidden rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-primary-500\", swipe && maxIndex > 0 && \"touch-pan-y\", dragging && \"cursor-grabbing select-none\", viewportClassName)}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={end}\n onPointerCancel={end}\n aria-live={playing ? \"off\" : \"polite\"}\n aria-atomic=\"false\"\n aria-label={`${ariaLabel} slides`}\n aria-roledescription=\"slides\"\n role=\"group\"\n >\n <div\n className={cn(\"flex\", !dragging && \"transition-transform duration-300 ease-out motion-reduce:transition-none\")}\n style={{ gap, transform: `translateX(${offset})` }}\n >\n {slides.map((slide, i) => {\n const visible = i >= current && i < current + slidesPerView;\n return (\n <div\n key={i}\n id={`${uid}-slide-${i}`}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${i + 1} of ${count}`}\n aria-hidden={!visible || undefined}\n // @ts-expect-error `inert` is valid HTML but missing from React 18 types\n inert={!visible ? \"\" : undefined}\n className=\"shrink-0 grow-0\"\n style={{ width: slideWidth }}\n >\n {slide}\n </div>\n );\n })}\n </div>\n </div>\n\n {arrows && maxIndex > 0 && (\n <>\n <button type=\"button\" aria-label=\"Previous slide\" disabled={!loop && current === 0} onClick={() => go(current - 1)} className={cn(btn, \"absolute left-3 top-1/2 -translate-y-1/2\")}>\n <RiArrowLeftSLine size={20} aria-hidden=\"true\" />\n </button>\n <button type=\"button\" aria-label=\"Next slide\" disabled={!loop && current === maxIndex} onClick={() => go(current + 1)} className={cn(btn, \"absolute right-3 top-1/2 -translate-y-1/2\")}>\n <RiArrowRightSLine size={20} aria-hidden=\"true\" />\n </button>\n </>\n )}\n\n {(dots || autoplay > 0) && maxIndex > 0 && (\n <div className=\"mt-3 flex items-center justify-center gap-3\">\n {autoplay > 0 && (\n <button\n type=\"button\"\n aria-label={userPaused ? \"Start automatic slide show\" : \"Pause automatic slide show\"}\n onClick={() => setUserPaused((v) => !v)}\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-full text-gray-600 outline-none hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary-500\"\n >\n {userPaused || reduced ? <RiPlayLine size={16} aria-hidden=\"true\" /> : <RiPauseLine size={16} aria-hidden=\"true\" />}\n </button>\n )}\n {dots && (\n <div role=\"group\" aria-label=\"Choose slide\" className=\"flex items-center gap-1.5\">\n {Array.from({ length: maxIndex + 1 }, (_, i) => (\n <button\n key={i}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n aria-current={i === current || undefined}\n onClick={() => go(i)}\n className=\"group inline-flex h-5 w-5 items-center justify-center rounded-full outline-none focus-visible:ring-2 focus-visible:ring-primary-500\"\n >\n <span className={cn(\"block rounded-full transition-all motion-reduce:transition-none\", i === current ? \"h-2 w-5 bg-primary-600\" : \"h-2 w-2 bg-gray-300 group-hover:bg-gray-400\")} />\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default Carousel;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n RiArrowLeftSLine,\n RiArrowRightSLine,\n RiCloseLine,\n RiZoomInLine,\n RiZoomOutLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface GalleryImage {\n /** Full size image URL. */\n src: string;\n /** Text description of the image. Use \"\" only for purely decorative images. */\n alt: string;\n /** Optional. Smaller image used in the grid and thumbnail strip. Defaults to src. */\n thumbnail?: string;\n /** Optional. Caption shown in the lightbox. */\n caption?: React.ReactNode;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Lightbox */\n/* -------------------------------------------------------------------------- */\n\nexport interface LightboxProps {\n images: GalleryImage[];\n open: boolean;\n /** Index of the image being shown. */\n index: number;\n /** Called when the user moves to another image. */\n onIndexChange: (index: number) => void;\n /** Called when the lightbox should close. */\n onClose: () => void;\n /** Optional. Wrap around at the first and last image. Defaults to false. */\n loop?: boolean;\n /** Optional. Show the thumbnail strip. Defaults to true. */\n showThumbnails?: boolean;\n /** Optional. Show the zoom button. Defaults to true. */\n zoom?: boolean;\n /** Optional. Accessible name for the dialog. Defaults to \"Image viewer\". */\n \"aria-label\"?: string;\n}\n\nconst iconBtn =\n \"inline-flex h-10 w-10 items-center justify-center rounded-full bg-white/10 text-white outline-none transition hover:bg-white/20 focus-visible:ring-2 focus-visible:ring-white disabled:cursor-not-allowed disabled:opacity-30 motion-reduce:transition-none\";\n\nexport const Lightbox = ({\n images,\n open,\n index,\n onIndexChange,\n onClose,\n loop = false,\n showThumbnails = true,\n zoom = true,\n \"aria-label\": ariaLabel = \"Image viewer\",\n}: LightboxProps) => {\n const uid = useId();\n const [mounted, setMounted] = useState(false);\n const [zoomed, setZoomed] = useState(false);\n const dialogRef = useRef<HTMLDivElement>(null);\n const prevFocus = useRef<HTMLElement | null>(null);\n const touch = useRef<number | null>(null);\n const count = images.length;\n const i = Math.min(Math.max(index, 0), Math.max(count - 1, 0));\n const img = images[i];\n\n useEffect(() => setMounted(true), []);\n useEffect(() => setZoomed(false), [i, open]);\n\n const go = useCallback(\n (n: number) => {\n if (!count) return;\n const next = loop ? (n + count) % count : Math.min(Math.max(n, 0), count - 1);\n if (next !== i) onIndexChange(next);\n },\n [count, loop, i, onIndexChange],\n );\n\n // focus + scroll lock\n useLayoutEffect(() => {\n if (!open) return;\n prevFocus.current = document.activeElement as HTMLElement | null;\n const overflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n dialogRef.current?.querySelector<HTMLElement>(\"[data-autofocus]\")?.focus();\n return () => {\n document.body.style.overflow = overflow;\n const p = prevFocus.current;\n if (p && document.contains(p)) p.focus({ preventScroll: true });\n };\n }, [open]);\n\n // preload neighbours\n useEffect(() => {\n if (!open) return;\n [images[i - 1], images[i + 1]].forEach((m) => {\n if (m) new Image().src = m.src;\n });\n }, [open, i, images]);\n\n if (!mounted || !open || !img) return null;\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation();\n onClose();\n break;\n case \"ArrowRight\":\n e.preventDefault();\n go(i + 1);\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n go(i - 1);\n break;\n case \"Home\":\n e.preventDefault();\n go(0);\n break;\n case \"End\":\n e.preventDefault();\n go(count - 1);\n break;\n case \"Tab\": {\n const f = Array.from(\n dialogRef.current?.querySelectorAll<HTMLElement>(\"button:not(:disabled),[href],[tabindex]:not([tabindex='-1'])\") ?? [],\n );\n if (!f.length) return e.preventDefault();\n const first = f[0];\n const last = f[f.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n };\n\n const target = (document.querySelector(\".theme-primary\") as HTMLElement | null) ?? document.body;\n\n return createPortal(\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n aria-label={ariaLabel}\n aria-describedby={img.caption ? `${uid}-cap` : undefined}\n onKeyDown={onKeyDown}\n className=\"fixed inset-0 z-[90] flex flex-col bg-black/90 text-white outline-none\"\n >\n {/* top bar */}\n <div className=\"flex items-center justify-between gap-3 px-4 py-3\">\n <p className=\"text-sm tabular-nums text-white/80\" aria-live=\"polite\">\n {i + 1} / {count}\n </p>\n <div className=\"flex items-center gap-2\">\n {zoom && (\n <button type=\"button\" className={iconBtn} aria-pressed={zoomed} aria-label={zoomed ? \"Zoom out\" : \"Zoom in\"} onClick={() => setZoomed((z) => !z)}>\n {zoomed ? <RiZoomOutLine size={20} aria-hidden=\"true\" /> : <RiZoomInLine size={20} aria-hidden=\"true\" />}\n </button>\n )}\n <button type=\"button\" data-autofocus className={iconBtn} aria-label=\"Close\" onClick={onClose}>\n <RiCloseLine size={22} aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n\n {/* stage */}\n <div\n className=\"relative flex min-h-0 flex-1 items-center justify-center px-4 sm:px-16\"\n onClick={(e) => e.target === e.currentTarget && onClose()}\n onTouchStart={(e) => (touch.current = e.touches[0].clientX)}\n onTouchEnd={(e) => {\n if (touch.current === null || zoomed) return;\n const d = e.changedTouches[0].clientX - touch.current;\n touch.current = null;\n if (Math.abs(d) > 50) go(i + (d < 0 ? 1 : -1));\n }}\n >\n {count > 1 && (\n <button type=\"button\" className={cn(iconBtn, \"absolute left-2 top-1/2 z-10 -translate-y-1/2 sm:left-4\")} aria-label=\"Previous image\" disabled={!loop && i === 0} onClick={() => go(i - 1)}>\n <RiArrowLeftSLine size={24} aria-hidden=\"true\" />\n </button>\n )}\n <div\n className={cn(\"flex h-full w-full items-center justify-center\", zoomed ? \"overflow-auto\" : \"overflow-hidden\")}\n onClick={(e) => e.target === e.currentTarget && !zoomed && onClose()}\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n key={img.src}\n src={img.src}\n alt={img.alt}\n draggable={false}\n onClick={(e) => {\n // The <img> box can be larger than the picture drawn inside it (object-contain),\n // so a click on the empty letterbox area counts as a click on the backdrop.\n const el = e.currentTarget;\n if (!zoomed && el.naturalWidth && el.naturalHeight) {\n const r = el.getBoundingClientRect();\n const scale = Math.min(r.width / el.naturalWidth, r.height / el.naturalHeight);\n const w = el.naturalWidth * scale;\n const h = el.naturalHeight * scale;\n const x = e.clientX - (r.left + (r.width - w) / 2);\n const y = e.clientY - (r.top + (r.height - h) / 2);\n if (x < 0 || y < 0 || x > w || y > h) return onClose();\n }\n if (zoom) setZoomed((z) => !z);\n }}\n className={cn(\"select-none rounded-md object-contain\", zoom && (zoomed ? \"cursor-zoom-out\" : \"cursor-zoom-in\"))}\n style={zoomed ? { maxWidth: \"none\", maxHeight: \"none\", width: \"200%\", margin: \"auto\" } : { maxWidth: \"100%\", maxHeight: \"100%\" }}\n />\n </div>\n {count > 1 && (\n <button type=\"button\" className={cn(iconBtn, \"absolute right-2 top-1/2 z-10 -translate-y-1/2 sm:right-4\")} aria-label=\"Next image\" disabled={!loop && i === count - 1} onClick={() => go(i + 1)}>\n <RiArrowRightSLine size={24} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {/* caption + thumbs */}\n <div className=\"px-4 pb-4 pt-3\">\n {img.caption && (\n <p id={`${uid}-cap`} className=\"mx-auto mb-3 max-w-2xl text-center text-sm text-white/90\">\n {img.caption}\n </p>\n )}\n {showThumbnails && count > 1 && (\n <div className=\"mx-auto flex max-w-full justify-center gap-2 overflow-x-auto py-1\" role=\"group\" aria-label=\"Choose image\">\n {images.map((m, n) => (\n <button\n key={m.src + n}\n type=\"button\"\n aria-label={`Show image ${n + 1}${m.alt ? `: ${m.alt}` : \"\"}`}\n aria-current={n === i || undefined}\n onClick={() => onIndexChange(n)}\n className={cn(\n \"h-12 w-16 shrink-0 overflow-hidden rounded-md outline-none ring-offset-2 ring-offset-black focus-visible:ring-2 focus-visible:ring-white\",\n n === i ? \"ring-2 ring-white\" : \"opacity-60 hover:opacity-100\",\n )}\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img src={m.thumbnail ?? m.src} alt=\"\" className=\"h-full w-full object-cover\" />\n </button>\n ))}\n </div>\n )}\n </div>\n </div>,\n target,\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Gallery */\n/* -------------------------------------------------------------------------- */\n\nexport interface ImageGalleryProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n images: GalleryImage[];\n /** Optional. Number of columns on wide screens. Defaults to 3. */\n columns?: 2 | 3 | 4 | 5;\n /** Optional. Shape of each thumbnail. Defaults to \"square\". */\n aspect?: \"square\" | \"video\" | \"portrait\";\n /** Optional. Open images in a lightbox when clicked. Defaults to true. */\n lightbox?: boolean;\n /** Optional. Wrap around in the lightbox. Defaults to false. */\n loop?: boolean;\n /** Optional. Show thumbnails in the lightbox. Defaults to true. */\n showThumbnails?: boolean;\n /** Optional. Called when a thumbnail is clicked. */\n onImageClick?: (index: number) => void;\n}\n\nconst cols = {\n 2: \"grid-cols-2\",\n 3: \"grid-cols-2 sm:grid-cols-3\",\n 4: \"grid-cols-2 sm:grid-cols-3 lg:grid-cols-4\",\n 5: \"grid-cols-2 sm:grid-cols-3 lg:grid-cols-5\",\n} as const;\nconst ratio = { square: \"aspect-square\", video: \"aspect-video\", portrait: \"aspect-[3/4]\" } as const;\n\nexport const ImageGallery = ({\n images,\n columns = 3,\n aspect = \"square\",\n lightbox = true,\n loop = false,\n showThumbnails = true,\n onImageClick,\n className,\n ...rest\n}: ImageGalleryProps) => {\n const [open, setOpen] = useState(false);\n const [index, setIndex] = useState(0);\n\n return (\n <>\n <div role=\"list\" {...rest} className={cn(\"grid gap-3\", cols[columns], className)}>\n {images.map((m, n) => (\n <div role=\"listitem\" key={m.src + n}>\n <button\n type=\"button\"\n disabled={!lightbox && !onImageClick}\n aria-haspopup={lightbox ? \"dialog\" : undefined}\n aria-label={lightbox ? `View larger: ${m.alt || `image ${n + 1}`}` : undefined}\n onClick={() => {\n onImageClick?.(n);\n if (lightbox) {\n setIndex(n);\n setOpen(true);\n }\n }}\n className={cn(\n \"group relative block w-full overflow-hidden rounded-xl bg-gray-100 outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n ratio[aspect],\n !lightbox && !onImageClick && \"cursor-default\",\n )}\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={m.thumbnail ?? m.src}\n alt={lightbox ? \"\" : m.alt}\n loading=\"lazy\"\n className=\"h-full w-full object-cover transition-transform duration-300 group-hover:scale-105 motion-reduce:transition-none motion-reduce:group-hover:scale-100\"\n />\n </button>\n </div>\n ))}\n </div>\n {lightbox && (\n <Lightbox images={images} open={open} index={index} onIndexChange={setIndex} onClose={() => setOpen(false)} loop={loop} showThumbnails={showThumbnails} />\n )}\n </>\n );\n};\n\nexport default ImageGallery;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Short heading, such as \"No results found\". */\n title: React.ReactNode;\n /** Optional. Supporting text that explains why it is empty and what to do next. */\n description?: React.ReactNode;\n /** Optional. Icon or illustration shown above the title. */\n icon?: JSX.Element;\n /** Optional. Main action, such as a Button. */\n action?: React.ReactNode;\n /** Optional. Secondary action shown next to the main one. */\n secondaryAction?: React.ReactNode;\n /** Optional. Spacing and text size. Defaults to \"md\". */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Optional. \"plain\" has no frame, \"dashed\" draws a dashed border, \"card\" a solid bordered card. Defaults to \"plain\". */\n variant?: \"plain\" | \"dashed\" | \"card\";\n /** Optional. Heading element to use so the page outline stays correct. Defaults to \"h3\". */\n headingLevel?: \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\";\n}\n\nconst sizes = {\n sm: { pad: \"px-4 py-8\", icon: \"h-10 w-10\", iconSvg: \"[&>svg]:h-5 [&>svg]:w-5\", title: \"text-sm\", desc: \"text-xs\", gap: \"mt-3\" },\n md: { pad: \"px-6 py-12\", icon: \"h-12 w-12\", iconSvg: \"[&>svg]:h-6 [&>svg]:w-6\", title: \"text-base\", desc: \"text-sm\", gap: \"mt-4\" },\n lg: { pad: \"px-8 py-16\", icon: \"h-16 w-16\", iconSvg: \"[&>svg]:h-8 [&>svg]:w-8\", title: \"text-lg\", desc: \"text-base\", gap: \"mt-5\" },\n} as const;\n\nconst frames = {\n plain: \"\",\n dashed: \"rounded-2xl border-2 border-dashed border-gray-300\",\n card: \"rounded-2xl border border-gray-200 bg-white shadow-xs\",\n} as const;\n\nexport const EmptyState = ({\n title,\n description,\n icon,\n action,\n secondaryAction,\n size = \"md\",\n variant = \"plain\",\n headingLevel: Heading = \"h3\",\n className,\n ...rest\n}: EmptyStateProps) => {\n const s = sizes[size];\n return (\n <div {...rest} className={cn(\"mx-auto flex w-full flex-col items-center text-center\", s.pad, frames[variant], className)}>\n {icon && (\n <div\n aria-hidden=\"true\"\n className={cn(\"flex items-center justify-center rounded-full bg-primary-50 text-primary-600\", s.icon, s.iconSvg)}\n >\n {icon}\n </div>\n )}\n <Heading className={cn(\"font-semibold text-gray-900\", s.title, icon && s.gap)}>{title}</Heading>\n {description && <p className={cn(\"mt-1 max-w-md text-gray-600\", s.desc)}>{description}</p>}\n {(action || secondaryAction) && (\n <div className={cn(\"flex flex-wrap items-center justify-center gap-3\", s.gap)}>\n {secondaryAction}\n {action}\n </div>\n )}\n </div>\n );\n};\n\nexport default EmptyState;\n","\"use client\";\nimport React, { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport {\n RiArrowDownSLine,\n RiArrowLeftSLine,\n RiArrowRightSLine,\n RiArrowUpSLine,\n RiExpandUpDownLine,\n RiSearchLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport type SortDirection = \"asc\" | \"desc\";\nexport interface DataGridSort {\n columnId: string;\n direction: SortDirection;\n}\n\nexport interface DataGridColumn<T> {\n /** Unique column id. */\n id: string;\n /** Column heading. Use a string so the filter box gets a good accessible name. */\n header: string;\n /** Optional. Property name or function that reads the cell value from a row. Defaults to the id. */\n accessor?: keyof T | ((row: T) => unknown);\n /** Optional. Custom cell renderer. */\n cell?: (value: unknown, row: T) => React.ReactNode;\n /** Optional. Let people sort by this column. Defaults to false. */\n sortable?: boolean;\n /** Optional. Show a filter box for this column when columnFilters is on. Defaults to true. */\n filterable?: boolean;\n /** Optional. Custom sort comparison for this column. */\n sortFn?: (a: T, b: T) => number;\n /** Optional. Custom filter test. Return true to keep the row. */\n filterFn?: (value: unknown, query: string, row: T) => boolean;\n /** Optional. Column width, such as \"120px\" or \"20%\". */\n width?: string;\n /** Optional. Text alignment. Defaults to \"left\". */\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport interface DataGridProps<T> {\n data: T[];\n columns: DataGridColumn<T>[];\n /** Optional. Returns a stable unique id for a row. Defaults to row.id, then the row index. */\n getRowId?: (row: T, index: number) => string;\n /** Optional. Row selection: \"none\", \"single\" (radio) or \"multiple\" (checkboxes). Defaults to \"none\". */\n selectionMode?: \"none\" | \"single\" | \"multiple\";\n /** Optional. Controlled selected row ids. */\n selectedIds?: string[];\n /** Optional. Initially selected row ids when uncontrolled. */\n defaultSelectedIds?: string[];\n /** Optional. Called when the selection changes. */\n onSelectionChange?: (ids: string[]) => void;\n /** Optional. Controlled sort. Use null for no sort. */\n sort?: DataGridSort | null;\n /** Optional. Initial sort when uncontrolled. */\n defaultSort?: DataGridSort | null;\n /** Optional. Called when the sort changes. */\n onSortChange?: (sort: DataGridSort | null) => void;\n /** Optional. Rows per page. 0 shows every row without pagination. Defaults to 0. */\n pageSize?: number;\n /** Optional. Show a search box that filters all columns. Defaults to false. */\n searchable?: boolean;\n /** Optional. Show a filter box under each sortable/filterable heading. Defaults to false. */\n columnFilters?: boolean;\n /** Optional. Message when there are no rows. Defaults to \"No data\". */\n emptyMessage?: React.ReactNode;\n /** Optional. Shows a loading state. */\n loading?: boolean;\n /** Optional. Alternate row backgrounds. */\n striped?: boolean;\n /** Optional. Row height. Defaults to \"comfortable\". */\n density?: \"compact\" | \"comfortable\";\n /** Optional. Keep the header visible while the body scrolls. Needs maxHeight. */\n stickyHeader?: boolean;\n /** Optional. Maximum height of the scrolling area, such as \"400px\". */\n maxHeight?: string;\n /** Optional. Called when a row is clicked. */\n onRowClick?: (row: T) => void;\n /** Optional. Extra content in the toolbar, such as buttons. */\n toolbar?: React.ReactNode;\n /** Accessible name for the table. */\n \"aria-label\": string;\n className?: string;\n}\n\nconst valueOf = <T,>(row: T, col: DataGridColumn<T>) => {\n const a = col.accessor ?? (col.id as keyof T);\n return typeof a === \"function\" ? (a as (r: T) => unknown)(row) : row[a as keyof T];\n};\n\nconst compare = (a: unknown, b: unknown) => {\n const an = a === null || a === undefined || a === \"\";\n const bn = b === null || b === undefined || b === \"\";\n if (an || bn) return an === bn ? 0 : an ? 1 : -1; // empty values go last\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === \"boolean\" && typeof b === \"boolean\") return Number(a) - Number(b);\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: \"base\" });\n};\n\nconst text = (v: unknown) => (v instanceof Date ? v.toLocaleDateString() : String(v ?? \"\")).toLowerCase();\n\nconst Check = ({\n checked,\n indeterminate,\n onChange,\n label,\n type = \"checkbox\",\n name,\n}: {\n checked: boolean;\n indeterminate?: boolean;\n onChange: () => void;\n label: string;\n type?: \"checkbox\" | \"radio\";\n name?: string;\n}) => {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (ref.current) ref.current.indeterminate = !!indeterminate;\n }, [indeterminate]);\n return (\n <input\n ref={ref}\n type={type}\n name={name}\n checked={checked}\n onChange={onChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={label}\n className=\"h-4 w-4 cursor-pointer rounded border-gray-300 accent-primary-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500\"\n />\n );\n};\n\nexport function DataGrid<T>({\n data,\n columns,\n getRowId,\n selectionMode = \"none\",\n selectedIds,\n defaultSelectedIds = [],\n onSelectionChange,\n sort: sortProp,\n defaultSort = null,\n onSortChange,\n pageSize = 0,\n searchable = false,\n columnFilters = false,\n emptyMessage = \"No data\",\n loading = false,\n striped = false,\n density = \"comfortable\",\n stickyHeader = false,\n maxHeight,\n onRowClick,\n toolbar,\n \"aria-label\": ariaLabel,\n className,\n}: DataGridProps<T>) {\n const uid = useId();\n\n /* ---------------- state ---------------- */\n const [sortInner, setSortInner] = useState<DataGridSort | null>(defaultSort);\n const sort = sortProp !== undefined ? sortProp : sortInner;\n const [selInner, setSelInner] = useState<string[]>(defaultSelectedIds);\n const selected = selectedIds ?? selInner;\n const [search, setSearch] = useState(\"\");\n const [filters, setFilters] = useState<Record<string, string>>({});\n const [page, setPage] = useState(0);\n\n const idOf = (row: T, i: number) => (getRowId ? getRowId(row, i) : String((row as { id?: unknown }).id ?? i));\n\n const setSort = (s: DataGridSort | null) => {\n if (sortProp === undefined) setSortInner(s);\n onSortChange?.(s);\n };\n const setSelected = (ids: string[]) => {\n if (selectedIds === undefined) setSelInner(ids);\n onSelectionChange?.(ids);\n };\n\n /* ---------------- data pipeline ---------------- */\n const rows = useMemo(() => {\n const indexed = data.map((row, i) => ({ row, id: idOf(row, i) }));\n const q = search.trim().toLowerCase();\n let out = indexed.filter(({ row }) => {\n if (q && !columns.some((c) => (c.filterFn ? c.filterFn(valueOf(row, c), q, row) : text(valueOf(row, c)).includes(q)))) return false;\n return columns.every((c) => {\n const f = (filters[c.id] ?? \"\").trim().toLowerCase();\n if (!f) return true;\n return c.filterFn ? c.filterFn(valueOf(row, c), f, row) : text(valueOf(row, c)).includes(f);\n });\n });\n if (sort) {\n const col = columns.find((c) => c.id === sort.columnId);\n if (col) {\n const dir = sort.direction === \"asc\" ? 1 : -1;\n out = [...out].sort((a, b) => dir * (col.sortFn ? col.sortFn(a.row, b.row) : compare(valueOf(a.row, col), valueOf(b.row, col))));\n }\n }\n return out;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, columns, search, filters, sort]);\n\n const pages = pageSize > 0 ? Math.max(1, Math.ceil(rows.length / pageSize)) : 1;\n const safePage = Math.min(page, pages - 1);\n const visible = pageSize > 0 ? rows.slice(safePage * pageSize, safePage * pageSize + pageSize) : rows;\n\n useEffect(() => setPage(0), [search, filters]);\n\n /* ---------------- selection ---------------- */\n const selSet = new Set(selected);\n const filteredIds = rows.map((r) => r.id);\n const selectedInView = filteredIds.filter((id) => selSet.has(id)).length;\n const allSelected = filteredIds.length > 0 && selectedInView === filteredIds.length;\n const toggleAll = () => {\n if (allSelected) setSelected(selected.filter((id) => !filteredIds.includes(id)));\n else setSelected(Array.from(new Set([...selected, ...filteredIds])));\n };\n const toggleRow = (id: string) => {\n if (selectionMode === \"single\") return setSelected([id]);\n setSelected(selSet.has(id) ? selected.filter((x) => x !== id) : [...selected, id]);\n };\n\n /* ---------------- sorting ---------------- */\n const cycleSort = (colId: string) => {\n if (!sort || sort.columnId !== colId) setSort({ columnId: colId, direction: \"asc\" });\n else if (sort.direction === \"asc\") setSort({ columnId: colId, direction: \"desc\" });\n else setSort(null);\n };\n\n const hasSelect = selectionMode !== \"none\";\n const colCount = columns.length + (hasSelect ? 1 : 0);\n const pad = density === \"compact\" ? \"px-3 py-1.5\" : \"px-4 py-3\";\n const alignCls = (a?: string) => (a === \"right\" ? \"text-right\" : a === \"center\" ? \"text-center\" : \"text-left\");\n const showFilterRow = columnFilters && columns.some((c) => c.filterable !== false);\n\n const status = loading\n ? \"Loading\"\n : `${rows.length} ${rows.length === 1 ? \"row\" : \"rows\"}${sort ? `, sorted by ${columns.find((c) => c.id === sort.columnId)?.header} ${sort.direction === \"asc\" ? \"ascending\" : \"descending\"}` : \"\"}`;\n\n const start = rows.length ? safePage * pageSize + 1 : 0;\n const end = Math.min(rows.length, safePage * pageSize + pageSize);\n\n return (\n <div className={cn(\"w-full\", className)}>\n {(searchable || toolbar || hasSelect) && (\n <div className=\"mb-3 flex flex-wrap items-center gap-3\">\n {searchable && (\n <label className=\"relative block w-full sm:w-64\">\n <span className=\"sr-only\">Search table</span>\n <RiSearchLine size={16} aria-hidden=\"true\" className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400\" />\n <input\n type=\"search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search…\"\n className=\"h-10 w-full rounded-lg border border-gray-300 bg-white pl-9 pr-3 text-sm text-gray-900 placeholder:text-gray-400 focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-200\"\n />\n </label>\n )}\n {selectionMode === \"multiple\" && (\n <p className=\"text-sm text-gray-600\" aria-live=\"polite\">\n {selected.length} selected\n </p>\n )}\n {toolbar && <div className=\"ml-auto flex items-center gap-2\">{toolbar}</div>}\n </div>\n )}\n\n <div\n className=\"overflow-auto rounded-xl border border-gray-200 bg-white\"\n style={maxHeight ? { maxHeight } : undefined}\n // scrollable regions must be keyboard focusable\n tabIndex={maxHeight ? 0 : undefined}\n role={maxHeight ? \"region\" : undefined}\n aria-label={maxHeight ? `${ariaLabel} (scrollable)` : undefined}\n >\n <table className=\"w-full border-collapse text-sm\" aria-label={ariaLabel} aria-busy={loading || undefined} aria-rowcount={rows.length + 1}>\n <thead className={cn(\"bg-gray-50\", stickyHeader && \"sticky top-0 z-10\")}>\n <tr>\n {hasSelect && (\n <th scope=\"col\" className={cn(pad, \"w-10 border-b border-gray-200\")}>\n {selectionMode === \"multiple\" ? (\n <Check checked={allSelected} indeterminate={selectedInView > 0 && !allSelected} onChange={toggleAll} label={allSelected ? \"Deselect all rows\" : \"Select all rows\"} />\n ) : (\n <span className=\"sr-only\">Select</span>\n )}\n </th>\n )}\n {columns.map((c) => {\n const active = sort?.columnId === c.id;\n const ariaSort = c.sortable ? (active ? (sort!.direction === \"asc\" ? \"ascending\" : \"descending\") : \"none\") : undefined;\n return (\n <th\n key={c.id}\n scope=\"col\"\n aria-sort={ariaSort}\n style={{ width: c.width }}\n className={cn(\"border-b border-gray-200 text-xs font-semibold uppercase tracking-wide text-gray-500\", pad, alignCls(c.align))}\n >\n {c.sortable ? (\n <button\n type=\"button\"\n onClick={() => cycleSort(c.id)}\n className={cn(\n \"-mx-1 inline-flex items-center gap-1 rounded px-1 uppercase tracking-wide outline-none hover:text-gray-900 focus-visible:ring-2 focus-visible:ring-primary-500\",\n active && \"text-gray-900\",\n )}\n >\n {c.header}\n <span aria-hidden=\"true\" className=\"inline-flex\">\n {active ? sort!.direction === \"asc\" ? <RiArrowUpSLine size={14} /> : <RiArrowDownSLine size={14} /> : <RiExpandUpDownLine size={14} className=\"text-gray-400\" />}\n </span>\n </button>\n ) : (\n c.header\n )}\n </th>\n );\n })}\n </tr>\n {showFilterRow && (\n <tr>\n {hasSelect && <th className=\"border-b border-gray-200 bg-gray-50\" aria-hidden=\"true\" />}\n {columns.map((c) => (\n <th key={c.id} className=\"border-b border-gray-200 bg-gray-50 px-3 pb-2 pt-0 font-normal\">\n {c.filterable !== false && (\n <input\n type=\"search\"\n aria-label={`Filter ${c.header}`}\n placeholder=\"Filter\"\n value={filters[c.id] ?? \"\"}\n onChange={(e) => setFilters((f) => ({ ...f, [c.id]: e.target.value }))}\n className=\"h-8 w-full rounded-md border border-gray-300 bg-white px-2 text-xs font-normal normal-case tracking-normal text-gray-900 placeholder:text-gray-400 focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-200\"\n />\n )}\n </th>\n ))}\n </tr>\n )}\n </thead>\n <tbody>\n {loading ? (\n Array.from({ length: Math.min(pageSize || 4, 5) }, (_, i) => (\n <tr key={i} aria-hidden=\"true\">\n <td colSpan={colCount} className={cn(pad, \"border-b border-gray-100\")}>\n <div className=\"h-4 w-full animate-pulse rounded bg-gray-100 motion-reduce:animate-none\" />\n </td>\n </tr>\n ))\n ) : visible.length === 0 ? (\n <tr>\n <td colSpan={colCount} className=\"px-4 py-12 text-center text-gray-500\">\n {emptyMessage}\n </td>\n </tr>\n ) : (\n visible.map(({ row, id }, ri) => {\n const isSel = selSet.has(id);\n return (\n <tr\n key={id}\n aria-selected={hasSelect ? isSel : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(\n \"border-b border-gray-100 last:border-0\",\n striped && ri % 2 === 1 && \"bg-gray-50/60\",\n isSel && \"bg-primary-50\",\n onRowClick && \"cursor-pointer hover:bg-gray-50\",\n )}\n >\n {hasSelect && (\n <td className={cn(pad, \"w-10\")}>\n <Check\n type={selectionMode === \"single\" ? \"radio\" : \"checkbox\"}\n name={`${uid}-sel`}\n checked={isSel}\n onChange={() => toggleRow(id)}\n label={`Select row ${(safePage * pageSize || 0) + ri + 1}`}\n />\n </td>\n )}\n {columns.map((c) => {\n const v = valueOf(row, c);\n return (\n <td key={c.id} className={cn(\"text-gray-800\", pad, alignCls(c.align))}>\n {c.cell ? c.cell(v, row) : v instanceof Date ? v.toLocaleDateString() : (v as React.ReactNode) ?? \"\"}\n </td>\n );\n })}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {pageSize > 0 && (\n <div className=\"mt-3 flex items-center justify-between gap-3 text-sm text-gray-600\">\n <span>\n {start}–{end} of {rows.length}\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={safePage === 0}\n onClick={() => setPage(safePage - 1)}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-lg border border-gray-300 bg-white outline-none hover:bg-gray-50 focus-visible:ring-2 focus-visible:ring-primary-500 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <RiArrowLeftSLine size={16} aria-hidden=\"true\" />\n </button>\n <span aria-current=\"page\">\n Page {safePage + 1} of {pages}\n </span>\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={safePage >= pages - 1}\n onClick={() => setPage(safePage + 1)}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-lg border border-gray-300 bg-white outline-none hover:bg-gray-50 focus-visible:ring-2 focus-visible:ring-primary-500 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <RiArrowRightSLine size={16} aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n )}\n\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {status}\n </div>\n </div>\n );\n}\n\nexport default DataGrid;\n","\"use client\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { RiCloseLine, RiSearchLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface ActiveFilter {\n /** Unique id for the filter. */\n id: string;\n /** Name of the filter, such as \"Status\". */\n label: string;\n /** Optional. Chosen value, such as \"Active\". Shown as \"Status: Active\". */\n value?: string;\n}\n\nexport interface TableToolbarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Optional. Current search text. Pass with onSearchChange to show the search box. */\n searchValue?: string;\n /** Optional. Called with the new search text (after debounceMs, if set). */\n onSearchChange?: (value: string) => void;\n /** Optional. Placeholder in the search box. Defaults to \"Search…\". */\n searchPlaceholder?: string;\n /** Optional. Wait this many milliseconds after typing before calling onSearchChange. Defaults to 0. */\n debounceMs?: number;\n /** Optional. Filter controls, such as Select or Dropdown components. */\n filters?: React.ReactNode;\n /** Optional. Filters currently applied, shown as removable chips. */\n activeFilters?: ActiveFilter[];\n /** Optional. Called when a chip's remove button is used. */\n onRemoveFilter?: (id: string) => void;\n /** Optional. Called by \"Clear all\". The button shows when there is search text or more than one filter. */\n onClearAll?: () => void;\n /** Optional. Number of rows after filtering. Shown and announced to screen readers. */\n resultCount?: number;\n /** Optional. Word for the results. Defaults to \"results\". Use the plural. */\n resultLabel?: string;\n /** Optional. Content on the right, such as Export or Add buttons. */\n actions?: React.ReactNode;\n /** Optional. Number of selected rows. When above 0 the toolbar switches to bulk mode. */\n selectedCount?: number;\n /** Optional. Actions for the selected rows, shown in bulk mode. */\n bulkActions?: React.ReactNode;\n /** Optional. Called by the Clear selection button in bulk mode. */\n onClearSelection?: () => void;\n /** Optional. Accessible name for the search and filter group. Defaults to \"Filter table\". */\n \"aria-label\"?: string;\n}\n\nexport const TableToolbar = ({\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Search…\",\n debounceMs = 0,\n filters,\n activeFilters = [],\n onRemoveFilter,\n onClearAll,\n resultCount,\n resultLabel = \"results\",\n actions,\n selectedCount = 0,\n bulkActions,\n onClearSelection,\n \"aria-label\": ariaLabel = \"Filter table\",\n className,\n ...rest\n}: TableToolbarProps) => {\n const [local, setLocal] = useState(searchValue ?? \"\");\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const lastSent = useRef(searchValue ?? \"\");\n\n // keep the box in step when the parent changes the value (for example \"Clear all\")\n useEffect(() => {\n if (searchValue !== undefined && searchValue !== lastSent.current) {\n setLocal(searchValue);\n lastSent.current = searchValue;\n }\n }, [searchValue]);\n useEffect(() => () => clearTimeout(timer.current), []);\n\n const change = (v: string) => {\n setLocal(v);\n clearTimeout(timer.current);\n const send = () => {\n lastSent.current = v;\n onSearchChange?.(v);\n };\n if (debounceMs > 0) timer.current = setTimeout(send, debounceMs);\n else send();\n };\n\n const bulk = selectedCount > 0;\n const showClear = !!onClearAll && (local.trim() !== \"\" || activeFilters.length > 1 || (activeFilters.length > 0 && local.trim() !== \"\"));\n const searchable = onSearchChange !== undefined;\n\n const buttonBase =\n \"inline-flex h-9 items-center rounded-lg px-3 text-sm font-medium outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\n return (\n <div {...rest} className={cn(\"w-full space-y-3\", className)}>\n {bulk ? (\n <div className=\"flex flex-wrap items-center gap-3 rounded-xl border border-primary-200 bg-primary-50 px-4 py-2.5\">\n <p className=\"text-sm font-medium text-primary-900\" role=\"status\" aria-live=\"polite\">\n {selectedCount} selected\n </p>\n <div className=\"flex flex-wrap items-center gap-2\">{bulkActions}</div>\n {onClearSelection && (\n <button type=\"button\" onClick={onClearSelection} className={cn(buttonBase, \"ml-auto text-primary-800 hover:bg-primary-100\")}>\n Clear selection\n </button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-wrap items-center gap-3\">\n {(searchable || filters) && (\n <div role=\"search\" aria-label={ariaLabel} className=\"flex min-w-0 flex-1 flex-wrap items-center gap-3\">\n {searchable && (\n <label className=\"relative block w-full sm:w-72\">\n <span className=\"sr-only\">Search</span>\n <RiSearchLine size={16} aria-hidden=\"true\" className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400\" />\n <input\n type=\"search\"\n value={local}\n onChange={(e) => change(e.target.value)}\n placeholder={searchPlaceholder}\n autoComplete=\"off\"\n className=\"h-10 w-full rounded-lg border border-gray-300 bg-white pl-9 pr-3 text-sm text-gray-900 placeholder:text-gray-400 focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-200\"\n />\n </label>\n )}\n {filters && <div className=\"flex flex-wrap items-center gap-2\">{filters}</div>}\n </div>\n )}\n {actions && <div className=\"ml-auto flex flex-wrap items-center gap-2\">{actions}</div>}\n </div>\n )}\n\n {(activeFilters.length > 0 || showClear || resultCount !== undefined) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {activeFilters.length > 0 && (\n <ul className=\"flex flex-wrap items-center gap-2\" aria-label=\"Applied filters\">\n {activeFilters.map((f) => {\n const text = f.value ? `${f.label}: ${f.value}` : f.label;\n return (\n <li key={f.id} className=\"inline-flex items-center gap-1 rounded-full border border-gray-200 bg-gray-50 py-1 pl-3 pr-1 text-sm text-gray-800\">\n <span>{text}</span>\n <button\n type=\"button\"\n aria-label={`Remove filter ${text}`}\n onClick={() => onRemoveFilter?.(f.id)}\n className=\"inline-flex h-5 w-5 items-center justify-center rounded-full text-gray-500 outline-none hover:bg-gray-200 hover:text-gray-900 focus-visible:ring-2 focus-visible:ring-primary-500\"\n >\n <RiCloseLine size={14} aria-hidden=\"true\" />\n </button>\n </li>\n );\n })}\n </ul>\n )}\n {showClear && (\n <button type=\"button\" onClick={onClearAll} className={cn(buttonBase, \"h-8 px-2 text-primary-700 hover:bg-primary-50\")}>\n Clear all\n </button>\n )}\n {resultCount !== undefined && (\n <p className=\"ml-auto text-sm text-gray-600\">\n {resultCount} {resultCount === 1 && resultLabel.endsWith(\"s\") ? resultLabel.slice(0, -1) : resultLabel}\n </p>\n )}\n </div>\n )}\n\n {resultCount !== undefined && (\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {resultCount} {resultLabel} found\n </div>\n )}\n </div>\n );\n};\n\nexport default TableToolbar;\n","\"use client\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { RiErrorWarningLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/* -------------------------------------------------------------------------- */\n/* Validators */\n/* -------------------------------------------------------------------------- */\n\nexport type FieldValidator = (value: any, values: Record<string, any>) => string | undefined | null | false;\n\nconst isEmpty = (v: unknown) => v === undefined || v === null || v === false || (typeof v === \"string\" && v.trim() === \"\") || (Array.isArray(v) && v.length === 0);\n\n/** Ready-made validators to pass to FormField's `validate` prop. Combine them with `compose`. */\nexport const validators = {\n required: (message = \"This field is required\"): FieldValidator => (v) => (isEmpty(v) ? message : undefined),\n email: (message = \"Enter a valid email address\"): FieldValidator => (v) =>\n isEmpty(v) || /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(String(v)) ? undefined : message,\n minLength: (n: number, message?: string): FieldValidator => (v) =>\n isEmpty(v) || String(v).length >= n ? undefined : message ?? `Use at least ${n} characters`,\n maxLength: (n: number, message?: string): FieldValidator => (v) =>\n isEmpty(v) || String(v).length <= n ? undefined : message ?? `Use ${n} characters or fewer`,\n pattern: (re: RegExp, message = \"Invalid format\"): FieldValidator => (v) =>\n isEmpty(v) || re.test(String(v)) ? undefined : message,\n min: (n: number, message?: string): FieldValidator => (v) =>\n isEmpty(v) || Number(v) >= n ? undefined : message ?? `Enter ${n} or more`,\n max: (n: number, message?: string): FieldValidator => (v) =>\n isEmpty(v) || Number(v) <= n ? undefined : message ?? `Enter ${n} or less`,\n matches: (otherField: string, message = \"Values do not match\"): FieldValidator => (v, all) =>\n v === all[otherField] ? undefined : message,\n};\n\n/** Run validators in order and return the first error message. */\nexport const compose =\n (...fns: FieldValidator[]): FieldValidator =>\n (v, all) => {\n for (const fn of fns) {\n const m = fn(v, all);\n if (m) return m;\n }\n return undefined;\n };\n\n/* -------------------------------------------------------------------------- */\n/* Context */\n/* -------------------------------------------------------------------------- */\n\nexport type FormErrors = Record<string, string | undefined>;\n\nexport interface FormState<V extends Record<string, any> = Record<string, any>> {\n values: V;\n /** All current errors, whether or not they are shown yet. */\n errors: FormErrors;\n touched: Record<string, boolean>;\n isSubmitting: boolean;\n /** True when there are no errors at all. */\n isValid: boolean;\n /** True when any value differs from the initial values. */\n isDirty: boolean;\n submitCount: number;\n setValue: (name: string, value: any) => void;\n setValues: (patch: Partial<V>) => void;\n setTouched: (name: string, touched?: boolean) => void;\n /** Restore the initial values and clear touched, submit count and any submit error. */\n reset: (values?: V) => void;\n}\n\ninterface Ctx extends FormState {\n register: (name: string, info: { validate?: FieldValidator; required?: string | boolean; label?: string }) => () => void;\n showError: (name: string) => string | undefined;\n /** Whether field-level validation is displayed (after touch or after a submit attempt). */\n validateOn: \"blur\" | \"change\" | \"submit\";\n idFor: (name: string) => string;\n}\n\nconst FormCtx = createContext<Ctx | null>(null);\n\n/** Read form state and helpers from anywhere inside a <Form>. */\nexport function useFormContext<V extends Record<string, any> = Record<string, any>>(): FormState<V> {\n const c = useContext(FormCtx);\n if (!c) throw new Error(\"useFormContext must be used inside <Form>.\");\n return c as unknown as FormState<V>;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Form */\n/* -------------------------------------------------------------------------- */\n\nexport interface FormProps<V extends Record<string, any> = Record<string, any>>\n extends Omit<React.FormHTMLAttributes<HTMLFormElement>, \"onSubmit\" | \"children\"> {\n /** Starting values, keyed by field name. */\n initialValues: V;\n /** Called with the values when the form is valid. May be async; a thrown error is shown as a form error. */\n onSubmit: (values: V) => void | Promise<void>;\n /** Optional. Form-level validation, for rules that involve several fields. Return an object of messages keyed by field name. */\n validate?: (values: V) => FormErrors | undefined;\n /** Optional. When field errors appear: after the field loses focus (\"blur\"), as soon as it changes (\"change\"), or only after a submit attempt (\"submit\"). Defaults to \"blur\". */\n validateOn?: \"blur\" | \"change\" | \"submit\";\n /** Optional. Show a summary of errors at the top after a failed submit. Defaults to true. */\n errorSummary?: boolean;\n /** Optional. Heading of the error summary. Defaults to \"Please fix the following\". */\n errorSummaryTitle?: string;\n /** Form contents, or a function that receives the form state. */\n children: React.ReactNode | ((state: FormState<V>) => React.ReactNode);\n}\n\nexport function Form<V extends Record<string, any> = Record<string, any>>({\n initialValues,\n onSubmit,\n validate,\n validateOn = \"blur\",\n errorSummary = true,\n errorSummaryTitle = \"Please fix the following\",\n children,\n className,\n ...rest\n}: FormProps<V>) {\n const uid = useId();\n const [values, setValuesState] = useState<V>(initialValues);\n const [touched, setTouchedState] = useState<Record<string, boolean>>({});\n const [submitCount, setSubmitCount] = useState(0);\n const [isSubmitting, setSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [version, setVersion] = useState(0);\n const registry = useRef(new Map<string, { validate?: FieldValidator; required?: string | boolean; label?: string }>());\n const summaryRef = useRef<HTMLDivElement>(null);\n const formRef = useRef<HTMLFormElement>(null);\n const initialRef = useRef(initialValues);\n\n const register = useCallback<Ctx[\"register\"]>((name, info) => {\n registry.current.set(name, info);\n setVersion((v) => v + 1);\n return () => {\n registry.current.delete(name);\n setVersion((v) => v + 1);\n };\n }, []);\n\n // Errors are derived from the current values, so they are never stale.\n const errors = useMemo<FormErrors>(() => {\n const out: FormErrors = { ...(validate?.(values) ?? {}) };\n registry.current.forEach((info, name) => {\n if (out[name]) return;\n const v = values[name];\n if (info.required && isEmpty(v)) {\n out[name] = typeof info.required === \"string\" ? info.required : info.label ? `${info.label} is required` : \"This field is required\";\n return;\n }\n const m = info.validate?.(v, values);\n if (m) out[name] = m;\n });\n return out;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [values, validate, version]);\n\n const errorNames = Object.keys(errors).filter((k) => errors[k]);\n const isValid = errorNames.length === 0;\n const submitted = submitCount > 0;\n\n const showError = (name: string) => {\n if (!errors[name]) return undefined;\n if (submitted || (validateOn !== \"submit\" && touched[name])) return errors[name];\n return undefined;\n };\n\n const setValue = useCallback((name: string, value: any) => {\n setValuesState((v) => ({ ...v, [name]: value }));\n if (validateOn === \"change\") setTouchedState((t) => (t[name] ? t : { ...t, [name]: true }));\n }, [validateOn]);\n\n const setTouched = useCallback((name: string, t = true) => setTouchedState((s) => (s[name] === t ? s : { ...s, [name]: t })), []);\n\n const reset = useCallback((next?: V) => {\n setValuesState(next ?? initialRef.current);\n if (next) initialRef.current = next;\n setTouchedState({});\n setSubmitCount(0);\n setSubmitError(null);\n }, []);\n\n const state: Ctx = {\n values,\n errors,\n touched,\n isSubmitting,\n isValid,\n isDirty: JSON.stringify(values) !== JSON.stringify(initialRef.current),\n submitCount,\n setValue,\n setValues: (patch) => setValuesState((v) => ({ ...v, ...patch })),\n setTouched,\n reset: reset as Ctx[\"reset\"],\n register,\n showError,\n validateOn,\n idFor: (n) => `${uid}-${n}`,\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (isSubmitting) return;\n setSubmitCount((c) => c + 1);\n setSubmitError(null);\n if (!isValid) {\n // move focus so keyboard and screen reader users land on the problem\n requestAnimationFrame(() => {\n if (errorSummary) summaryRef.current?.focus();\n else formRef.current?.querySelector<HTMLElement>(\"[aria-invalid='true']\")?.focus();\n });\n return;\n }\n setSubmitting(true);\n try {\n await onSubmit(values);\n } catch (err) {\n setSubmitError(err instanceof Error ? err.message : \"Something went wrong. Please try again.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n const focusField = (name: string) => {\n const el = formRef.current?.querySelector<HTMLElement>(`#${CSS.escape(`${uid}-${name}`)}`) ?? formRef.current?.querySelector<HTMLElement>(`[name=\"${CSS.escape(name)}\"]`);\n el?.focus();\n };\n\n const labelOf = (name: string) => registry.current.get(name)?.label ?? name;\n const summaryVisible = errorSummary && submitted && !isValid;\n\n return (\n <FormCtx.Provider value={state}>\n <form {...rest} ref={formRef} noValidate onSubmit={handleSubmit} className={cn(\"space-y-5\", className)} aria-busy={isSubmitting || undefined}>\n {summaryVisible && (\n <div\n ref={summaryRef}\n role=\"alert\"\n tabIndex={-1}\n className=\"rounded-xl border border-error-200 bg-error-50 p-4 text-sm text-error-900 outline-none focus-visible:ring-2 focus-visible:ring-error-500\"\n >\n <p className=\"font-semibold\">{errorSummaryTitle}</p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {errorNames.map((n) => (\n <li key={n}>\n <a\n href={`#${uid}-${n}`}\n className=\"underline\"\n onClick={(e) => {\n e.preventDefault();\n focusField(n);\n }}\n >\n {errors[n]}\n </a>\n <span className=\"sr-only\">{` (${labelOf(n)})`}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n {submitError && (\n <div role=\"alert\" className=\"flex items-start gap-2 rounded-xl border border-error-200 bg-error-50 p-4 text-sm text-error-900\">\n <RiErrorWarningLine size={18} aria-hidden=\"true\" className=\"mt-0.5 shrink-0\" />\n <p>{submitError}</p>\n </div>\n )}\n {typeof children === \"function\" ? (children as (s: FormState<V>) => React.ReactNode)(state as unknown as FormState<V>) : children}\n </form>\n </FormCtx.Provider>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* FormField */\n/* -------------------------------------------------------------------------- */\n\nexport interface FieldControlProps {\n id: string;\n name: string;\n value: any;\n checked?: boolean;\n onChange: (eventOrValue: any) => void;\n onBlur: () => void;\n \"aria-invalid\": true | undefined;\n \"aria-required\": true | undefined;\n \"aria-describedby\": string | undefined;\n}\n\nexport interface FormFieldProps {\n /** Key of this field in the form values. */\n name: string;\n /** Label shown above the control. */\n label: string;\n /** Optional. Help text shown under the label. */\n description?: React.ReactNode;\n /** Optional. Mark the field as required. Pass a string to set the error message. */\n required?: boolean | string;\n /** Optional. Validation for this field. Return an error message, or nothing when valid. Combine rules with compose(). */\n validate?: FieldValidator;\n /** Optional. Use \"checked\" for checkbox and switch controls so their boolean value is passed as `checked`. Defaults to \"value\". */\n valueProp?: \"value\" | \"checked\";\n /** Optional. Hide the label visually but keep it for screen readers. */\n hideLabel?: boolean;\n className?: string;\n /** The control. A function receives the props to spread onto it plus `error` text and `invalid`. A plain element receives the props directly. */\n children: React.ReactElement | ((control: FieldControlProps & { error?: string; invalid: boolean }) => React.ReactNode);\n}\n\nconst readValue = (arg: any, valueProp: \"value\" | \"checked\") => {\n if (arg && typeof arg === \"object\" && \"target\" in arg && arg.target) {\n const t = arg.target as HTMLInputElement;\n return valueProp === \"checked\" || t.type === \"checkbox\" ? t.checked : t.value;\n }\n return arg;\n};\n\nexport const FormField = ({ name, label, description, required, validate, valueProp = \"value\", hideLabel, className, children }: FormFieldProps) => {\n const f = useContext(FormCtx);\n if (!f) throw new Error(\"<FormField> must be used inside <Form>.\");\n const { register } = f;\n\n const validateRef = useRef(validate);\n validateRef.current = validate;\n useEffect(\n () => register(name, { validate: (v, all) => validateRef.current?.(v, all) as any, required, label }),\n [register, name, required, label],\n );\n\n const id = f.idFor(name);\n const error = f.showError(name);\n const descId = description ? `${id}-desc` : undefined;\n const errId = `${id}-error`;\n const raw = f.values[name];\n\n const control: FieldControlProps = {\n id,\n name,\n ...(valueProp === \"checked\" ? { checked: !!raw, value: undefined } : { value: raw ?? \"\" }),\n onChange: (arg) => f.setValue(name, readValue(arg, valueProp)),\n onBlur: () => f.setTouched(name),\n \"aria-invalid\": error ? true : undefined,\n \"aria-required\": required ? true : undefined,\n \"aria-describedby\": [descId, error ? errId : undefined].filter(Boolean).join(\" \") || undefined,\n } as FieldControlProps;\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)}>\n <label htmlFor={id} className={cn(\"text-sm font-medium text-gray-800\", hideLabel && \"sr-only\")}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"ml-0.5 text-error-600\">\n *\n </span>\n )}\n </label>\n {description && (\n <p id={descId} className=\"text-sm text-gray-500\">\n {description}\n </p>\n )}\n {typeof children === \"function\" ? children({ ...control, error, invalid: !!error }) : React.cloneElement(children, control as any)}\n <p id={errId} aria-live=\"polite\" className={cn(\"flex items-start gap-1.5 text-sm text-error-700\", !error && \"sr-only\")}>\n {error && (\n <>\n <RiErrorWarningLine size={16} aria-hidden=\"true\" className=\"mt-0.5 shrink-0\" />\n <span>{error}</span>\n </>\n )}\n </p>\n </div>\n );\n};\n\nexport default Form;\n","\"use client\";\nimport React, { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { RiAddLine, RiArrowDownSLine, RiArrowUpSLine, RiSubtractLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface NumberInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"value\" | \"defaultValue\" | \"onChange\" | \"size\" | \"min\" | \"max\" | \"step\" | \"type\" | \"prefix\"> {\n /** Controlled value. Use null (or an empty string) for empty. */\n value?: number | null | \"\";\n /** Optional. Starting value when uncontrolled. */\n defaultValue?: number | null;\n /** Called with the new number, or null when the field is empty. Fires while typing and when the buttons are used. */\n onChange?: (value: number | null) => void;\n /** Optional. Smallest allowed value. */\n min?: number;\n /** Optional. Largest allowed value. */\n max?: number;\n /** Optional. Amount added or removed by the buttons and arrow keys. Defaults to 1. */\n step?: number;\n /** Optional. Digits shown after the decimal point. Values are rounded to this. Defaults to 0. */\n precision?: number;\n /** Optional. Where to put the +/- buttons: on both \"sides\", \"stacked\" at the end, or \"none\". Defaults to \"sides\". */\n controls?: \"sides\" | \"stacked\" | \"none\";\n /** Optional. Text or icon before the number, such as \"$\". */\n prefix?: React.ReactNode;\n /** Optional. Text after the number, such as \"kg\" or \"%\". */\n suffix?: React.ReactNode;\n /** Optional. Field height. Defaults to \"lg\". */\n size?: \"sm\" | \"lg\";\n /** Optional. Show the error style. */\n error?: boolean;\n /** Optional. Turns the field off. */\n disabled?: boolean;\n /** Optional. Make it read-only. */\n readOnly?: boolean;\n /** Optional. Class name for the outer wrapper. */\n className?: string;\n}\n\nconst decimalsOf = (n: number) => {\n const s = String(n);\n if (s.includes(\"e-\")) return parseInt(s.split(\"e-\")[1], 10);\n return s.includes(\".\") ? s.split(\".\")[1].length : 0;\n};\nconst clamp = (n: number, min?: number, max?: number) => Math.min(max ?? Infinity, Math.max(min ?? -Infinity, n));\n\nexport const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n value,\n defaultValue = null,\n onChange,\n min,\n max,\n step = 1,\n precision = 0,\n controls = \"sides\",\n prefix,\n suffix,\n size = \"lg\",\n error,\n disabled,\n readOnly,\n className,\n onBlur,\n onKeyDown,\n onFocus,\n ...rest\n },\n ref,\n ) => {\n const digits = Math.max(precision, decimalsOf(step));\n const round = (n: number) => Number(n.toFixed(Math.min(precision || digits, 12)));\n const fmt = (n: number | null) => (n === null ? \"\" : n.toFixed(precision));\n\n const controlled = value !== undefined;\n const norm = (v: number | null | \"\" | undefined) => (v === \"\" || v === undefined || v === null || Number.isNaN(v) ? null : (v as number));\n const [inner, setInner] = useState<number | null>(defaultValue);\n const current = controlled ? norm(value) : inner;\n const [text, setText] = useState(fmt(current));\n const focused = useRef(false);\n const currentRef = useRef(current);\n currentRef.current = current;\n\n // keep the text in step with outside changes, but never while the user is typing\n useEffect(() => {\n if (focused.current) return;\n setText(fmt(current));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [current, precision]);\n\n const emit = (n: number | null) => {\n if (!controlled) setInner(n);\n onChange?.(n);\n };\n\n const parse = (s: string): number | null => {\n if (s.trim() === \"\" || s === \"-\" || s === \".\" || s === \"-.\") return null;\n const n = Number(s);\n return Number.isFinite(n) ? n : null;\n };\n\n const commit = () => {\n const n = parse(text);\n if (n === null) {\n setText(\"\");\n if (current !== null) emit(null);\n return;\n }\n const c = round(clamp(n, min, max));\n setText(fmt(c));\n if (c !== current) emit(c);\n };\n\n const stepBy = (dir: 1 | -1, mult = 1) => {\n if (disabled || readOnly) return;\n const from = currentRef.current ?? parse(text) ?? (dir > 0 ? (min !== undefined && min > 0 ? min - step : 0) : max !== undefined && max < 0 ? max + step : 0);\n const next = round(clamp(from + dir * step * mult, min, max));\n currentRef.current = next;\n setText(fmt(next));\n emit(next);\n };\n\n // press and hold to repeat\n const hold = useRef<{ t?: ReturnType<typeof setTimeout>; i?: ReturnType<typeof setInterval> }>({});\n const stopHold = () => {\n clearTimeout(hold.current.t);\n clearInterval(hold.current.i);\n };\n useEffect(() => stopHold, []);\n const startHold = (dir: 1 | -1) => (e: React.PointerEvent) => {\n if (e.button !== 0) return;\n e.preventDefault(); // keep focus where it is\n stepBy(dir);\n stopHold();\n hold.current.t = setTimeout(() => {\n hold.current.i = setInterval(() => stepBy(dir), 70);\n }, 400);\n };\n const holdProps = (dir: 1 | -1) => ({\n onPointerDown: startHold(dir),\n onPointerUp: stopHold,\n onPointerLeave: stopHold,\n onPointerCancel: stopHold,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n stepBy(dir);\n }\n },\n });\n\n const atMin = min !== undefined && current !== null && current <= min;\n const atMax = max !== undefined && current !== null && current >= max;\n\n const btn = (dir: 1 | -1, cls?: string, icon?: JSX.Element) => {\n const dis = disabled || readOnly || (dir > 0 ? atMax : atMin);\n return (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={dir > 0 ? \"Increase\" : \"Decrease\"}\n disabled={dis}\n {...holdProps(dir)}\n className={cn(\n \"inline-flex shrink-0 select-none items-center justify-center text-gray-600 outline-none transition-colors hover:bg-gray-100 active:bg-gray-200 disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent motion-reduce:transition-none\",\n cls,\n )}\n >\n {icon ?? (dir > 0 ? <RiAddLine size={16} aria-hidden=\"true\" /> : <RiSubtractLine size={16} aria-hidden=\"true\" />)}\n </button>\n );\n };\n\n const h = size === \"sm\" ? \"h-10\" : \"h-11\";\n const allowNeg = min === undefined || min < 0;\n const allowDec = precision > 0;\n\n return (\n <div\n className={cn(\n \"inline-flex w-full max-w-[220px] items-stretch overflow-hidden rounded-xl border bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[border-color,box-shadow] duration-200 motion-reduce:transition-none\",\n \"focus-within:ring-4\",\n error ? \"border-error-500 focus-within:border-error-600 focus-within:ring-error-100\" : \"border-gray-200 focus-within:border-primary-600 focus-within:ring-primary-100 hover:border-gray-300\",\n disabled && \"pointer-events-none opacity-40\",\n h,\n className,\n )}\n >\n {controls === \"sides\" && btn(-1, \"w-10 border-r border-gray-200\")}\n <div className=\"flex min-w-0 flex-1 items-center gap-1.5 px-3\">\n {prefix && <span className=\"shrink-0 text-sm text-gray-500\">{prefix}</span>}\n <input\n ref={ref}\n {...rest}\n type=\"text\"\n role=\"spinbutton\"\n inputMode={allowDec ? \"decimal\" : \"numeric\"}\n autoComplete=\"off\"\n value={text}\n disabled={disabled}\n readOnly={readOnly}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={current ?? undefined}\n aria-valuetext={current === null ? \"Empty\" : fmt(current)}\n aria-invalid={rest[\"aria-invalid\"] ?? (error || undefined)}\n onFocus={(e) => {\n focused.current = true;\n onFocus?.(e);\n }}\n onBlur={(e) => {\n focused.current = false;\n commit();\n onBlur?.(e);\n }}\n onChange={(e) => {\n const v = e.target.value;\n const re = new RegExp(`^${allowNeg ? \"-?\" : \"\"}\\\\d*${allowDec ? \"\\\\.?\\\\d*\" : \"\"}$`);\n if (!re.test(v)) return;\n setText(v);\n const n = parse(v);\n if (n !== null) {\n const r = allowDec ? n : Math.trunc(n);\n currentRef.current = r;\n emit(r);\n } else if (v === \"\" && current !== null) {\n currentRef.current = null;\n emit(null);\n }\n }}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented || disabled || readOnly) return;\n const big = e.shiftKey ? 10 : 1;\n switch (e.key) {\n case \"ArrowUp\":\n e.preventDefault();\n stepBy(1, big);\n break;\n case \"ArrowDown\":\n e.preventDefault();\n stepBy(-1, big);\n break;\n case \"PageUp\":\n e.preventDefault();\n stepBy(1, 10);\n break;\n case \"PageDown\":\n e.preventDefault();\n stepBy(-1, 10);\n break;\n case \"Home\":\n if (min !== undefined) {\n e.preventDefault();\n setText(fmt(min));\n emit(min);\n }\n break;\n case \"End\":\n if (max !== undefined) {\n e.preventDefault();\n setText(fmt(max));\n emit(max);\n }\n break;\n case \"Enter\":\n commit();\n break;\n }\n }}\n className={cn(\"min-w-0 flex-1 bg-transparent text-sm text-gray-900 outline-none placeholder:text-gray-400\", controls === \"sides\" && \"text-center\")}\n />\n {suffix && <span className=\"shrink-0 text-sm text-gray-500\">{suffix}</span>}\n </div>\n {controls === \"sides\" && btn(1, \"w-10 border-l border-gray-200\")}\n {controls === \"stacked\" && (\n <div className=\"flex w-8 shrink-0 flex-col border-l border-gray-200\">\n {btn(1, \"h-1/2 border-b border-gray-200\", <RiArrowUpSLine size={14} aria-hidden=\"true\" />)}\n {btn(-1, \"h-1/2\", <RiArrowDownSLine size={14} aria-hidden=\"true\" />)}\n </div>\n )}\n </div>\n );\n },\n);\nNumberInput.displayName = \"NumberInput\";\n\nexport default NumberInput;\n","\"use client\";\nimport React, { forwardRef, useId, useState } from \"react\";\nimport { RiCheckLine, RiCircleLine, RiEyeLine, RiEyeOffLine, RiLockLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface PasswordStrength {\n /** 0 (empty) to 4 (strong). */\n score: 0 | 1 | 2 | 3 | 4;\n label: \"\" | \"Weak\" | \"Fair\" | \"Good\" | \"Strong\";\n /** The rules and whether each is met. */\n checks: { id: string; label: string; met: boolean }[];\n}\n\n/** Score a password from 0 to 4 and list which rules it meets. Exported so you can reuse it in validation. */\nexport const getPasswordStrength = (password: string): PasswordStrength => {\n const checks = [\n { id: \"length\", label: \"At least 8 characters\", met: password.length >= 8 },\n { id: \"case\", label: \"Upper and lower case letters\", met: /[a-z]/.test(password) && /[A-Z]/.test(password) },\n { id: \"number\", label: \"A number\", met: /\\d/.test(password) },\n { id: \"symbol\", label: \"A symbol\", met: /[^A-Za-z0-9]/.test(password) },\n ];\n if (!password) return { score: 0, label: \"\", checks };\n const met = checks.filter((c) => c.met).length;\n let score: number;\n if (password.length < 8) score = 1; // too short, whatever else it contains\n else if (met === 4 && password.length >= 12) score = 4;\n else score = Math.min(Math.max(met, 2), 3);\n const s = score as 1 | 2 | 3 | 4;\n return { score: s, label: ([\"\", \"Weak\", \"Fair\", \"Good\", \"Strong\"] as const)[s], checks };\n};\n\nexport interface PasswordInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"prefix\"> {\n /** Optional. Field height. Defaults to \"lg\". */\n size?: \"sm\" | \"lg\";\n /** Optional. Show the error style. */\n error?: boolean;\n /** Optional. Show a lock icon at the start. Defaults to false. */\n showLockIcon?: boolean;\n /** Optional. Controlled visibility of the password. */\n visible?: boolean;\n /** Optional. Start with the password shown. Defaults to false. */\n defaultVisible?: boolean;\n /** Optional. Called when the password is shown or hidden. */\n onVisibleChange?: (visible: boolean) => void;\n /** Optional. Show a strength meter under the field. Use when people create a password. Defaults to false. */\n showStrength?: boolean;\n /** Optional. Show the list of rules under the meter. Needs showStrength. Defaults to false. */\n showRequirements?: boolean;\n /** Optional. Warn when Caps Lock is on while typing. Defaults to true. */\n capsLockWarning?: boolean;\n /** Optional. Class name for the outer wrapper. */\n className?: string;\n}\n\nconst segColors = [\"\", \"bg-error-500\", \"bg-warning-500\", \"bg-primary-500\", \"bg-success-500\"];\n\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n (\n {\n size = \"lg\",\n error,\n showLockIcon = false,\n visible,\n defaultVisible = false,\n onVisibleChange,\n showStrength = false,\n showRequirements = false,\n capsLockWarning = true,\n className,\n disabled,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n onKeyUp,\n onBlur,\n autoComplete,\n id: idProp,\n ...rest\n },\n ref,\n ) => {\n const uid = useId();\n const id = idProp ?? `${uid}-pw`;\n const [innerVisible, setInnerVisible] = useState(defaultVisible);\n const shown = visible ?? innerVisible;\n const [inner, setInner] = useState(String(defaultValue ?? \"\"));\n const text = value !== undefined ? String(value) : inner;\n const [caps, setCaps] = useState(false);\n\n const toggle = () => {\n const next = !shown;\n if (visible === undefined) setInnerVisible(next);\n onVisibleChange?.(next);\n };\n\n const strength = getPasswordStrength(text);\n const meterId = `${id}-strength`;\n const capsId = `${id}-caps`;\n const describedBy = [rest[\"aria-describedby\"], showStrength ? meterId : undefined, caps ? capsId : undefined].filter(Boolean).join(\" \") || undefined;\n\n return (\n <div className={cn(\"w-full max-w-sm\", className)}>\n <div\n className={cn(\n \"group flex items-center gap-2 rounded-xl border bg-white px-3.5 shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[border-color,box-shadow,background-color] duration-200 motion-reduce:transition-none\",\n \"focus-within:ring-4\",\n size === \"sm\" ? \"h-10\" : \"h-11\",\n error\n ? \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\"\n : \"border-gray-200 hover:border-gray-300 hover:bg-gray-50 focus-within:border-primary-600 focus-within:bg-white focus-within:ring-primary-100\",\n disabled && \"pointer-events-none opacity-30\",\n )}\n >\n {showLockIcon && <RiLockLine size={18} aria-hidden=\"true\" className=\"shrink-0 text-gray-500\" />}\n <input\n ref={ref}\n aria-invalid={error || undefined}\n {...rest}\n id={id}\n type={shown ? \"text\" : \"password\"}\n disabled={disabled}\n value={value}\n defaultValue={value === undefined ? defaultValue : undefined}\n autoComplete={autoComplete ?? (showStrength ? \"new-password\" : \"current-password\")}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck={false}\n aria-describedby={describedBy}\n onChange={(e) => {\n if (value === undefined) setInner(e.target.value);\n onChange?.(e);\n }}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (capsLockWarning && e.getModifierState) setCaps(e.getModifierState(\"CapsLock\"));\n }}\n onKeyUp={(e) => {\n onKeyUp?.(e);\n if (capsLockWarning && e.getModifierState) setCaps(e.getModifierState(\"CapsLock\"));\n }}\n onBlur={(e) => {\n setCaps(false);\n onBlur?.(e);\n }}\n className=\"min-w-0 flex-1 bg-transparent text-sm text-gray-900 outline-none placeholder:text-gray-500\"\n />\n <button\n type=\"button\"\n aria-label=\"Show password\"\n aria-pressed={shown}\n aria-controls={id}\n disabled={disabled}\n onClick={toggle}\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-gray-500 outline-none transition-colors hover:bg-gray-100 hover:text-gray-800 focus-visible:ring-2 focus-visible:ring-primary-500 motion-reduce:transition-none\"\n >\n {shown ? <RiEyeOffLine size={18} aria-hidden=\"true\" /> : <RiEyeLine size={18} aria-hidden=\"true\" />}\n </button>\n </div>\n\n {capsLockWarning && (\n <p id={capsId} role=\"status\" className={cn(\"mt-1.5 text-sm text-warning-700\", !caps && \"sr-only\")}>\n {caps ? \"Caps Lock is on\" : \"\"}\n </p>\n )}\n\n {showStrength && (\n <div className=\"mt-3\">\n <div\n role=\"meter\"\n aria-label=\"Password strength\"\n aria-valuemin={0}\n aria-valuemax={4}\n aria-valuenow={strength.score}\n aria-valuetext={strength.label || \"Empty\"}\n className=\"flex gap-1.5\"\n >\n {[1, 2, 3, 4].map((n) => (\n <span key={n} className={cn(\"h-1.5 flex-1 rounded-full transition-colors motion-reduce:transition-none\", n <= strength.score ? segColors[strength.score] : \"bg-gray-200\")} />\n ))}\n </div>\n <p id={meterId} className=\"mt-1.5 text-sm text-gray-600\" aria-live=\"polite\">\n {strength.label ? `Password strength: ${strength.label}` : \"Password strength\"}\n </p>\n {showRequirements && (\n <ul className=\"mt-2 space-y-1\">\n {strength.checks.map((c) => (\n <li key={c.id} className={cn(\"flex items-center gap-2 text-sm\", c.met ? \"text-success-700\" : \"text-gray-500\")}>\n {c.met ? <RiCheckLine size={16} aria-hidden=\"true\" /> : <RiCircleLine size={16} aria-hidden=\"true\" />}\n <span>{c.label}</span>\n <span className=\"sr-only\">{c.met ? \"(met)\" : \"(not met)\"}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n );\n },\n);\nPasswordInput.displayName = \"PasswordInput\";\n\nexport default PasswordInput;\n","\"use client\";\nimport React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport { RiCloseLine, RiSearchLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface SearchInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"value\" | \"defaultValue\" | \"onChange\" | \"prefix\"> {\n /** Controlled search text. */\n value?: string;\n /** Optional. Starting text when uncontrolled. */\n defaultValue?: string;\n /** Called with the new text on every keystroke and when the text is cleared. */\n onChange?: (value: string) => void;\n /** Optional. Called when the person presses Enter, clears the box, or (with debounceMs) pauses typing. */\n onSearch?: (value: string) => void;\n /** Optional. Wait this many milliseconds after typing stops, then call onSearch. 0 means only Enter and clear call it. Defaults to 0. */\n debounceMs?: number;\n /** Optional. Show a spinner while results load. */\n loading?: boolean;\n /** Optional. Show the clear button when there is text. Defaults to true. */\n clearable?: boolean;\n /** Optional. Global key that focuses the field, such as \"/\" or \"k\". Ignored while typing in another field. */\n hotkey?: string;\n /** Optional. Field height. Defaults to \"lg\". */\n size?: \"sm\" | \"lg\";\n /** Optional. Show the error style. */\n error?: boolean;\n /** Optional. Class name for the outer wrapper. */\n className?: string;\n}\n\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\n (\n {\n value,\n defaultValue = \"\",\n onChange,\n onSearch,\n debounceMs = 0,\n loading = false,\n clearable = true,\n hotkey,\n size = \"lg\",\n error,\n disabled,\n placeholder = \"Search…\",\n className,\n onKeyDown,\n ...rest\n },\n ref,\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current as HTMLInputElement);\n const [inner, setInner] = useState(defaultValue);\n const text = value !== undefined ? value : inner;\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const onSearchRef = useRef(onSearch);\n onSearchRef.current = onSearch;\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n // global hotkey\n useEffect(() => {\n if (!hotkey) return;\n const on = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() !== hotkey.toLowerCase() || e.ctrlKey || e.metaKey || e.altKey) return;\n const t = e.target as HTMLElement;\n if (t && (t.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))) return;\n e.preventDefault();\n inputRef.current?.focus();\n inputRef.current?.select();\n };\n window.addEventListener(\"keydown\", on);\n return () => window.removeEventListener(\"keydown\", on);\n }, [hotkey]);\n\n const set = (v: string) => {\n if (value === undefined) setInner(v);\n onChange?.(v);\n };\n\n const scheduleSearch = (v: string) => {\n clearTimeout(timer.current);\n if (debounceMs > 0) timer.current = setTimeout(() => onSearchRef.current?.(v), debounceMs);\n };\n\n const clear = () => {\n clearTimeout(timer.current);\n set(\"\");\n onSearch?.(\"\");\n inputRef.current?.focus();\n };\n\n const showClear = clearable && text.length > 0 && !disabled;\n const showHint = !!hotkey && text.length === 0 && !disabled;\n\n return (\n <div role=\"search\" className={cn(\"w-full max-w-sm\", className)}>\n <div\n className={cn(\n \"group flex items-center gap-2 rounded-xl border bg-white px-3.5 shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[border-color,box-shadow,background-color] duration-200 motion-reduce:transition-none focus-within:ring-4\",\n size === \"sm\" ? \"h-10\" : \"h-11\",\n error\n ? \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\"\n : \"border-gray-200 hover:border-gray-300 hover:bg-gray-50 focus-within:border-primary-600 focus-within:bg-white focus-within:ring-primary-100\",\n disabled && \"pointer-events-none opacity-30\",\n )}\n >\n <RiSearchLine size={18} aria-hidden=\"true\" className=\"shrink-0 text-gray-500 group-focus-within:text-gray-700\" />\n <input\n ref={inputRef}\n aria-invalid={error || undefined}\n aria-busy={loading || undefined}\n {...rest}\n type=\"search\"\n enterKeyHint=\"search\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n placeholder={placeholder}\n value={text}\n onChange={(e) => {\n set(e.target.value);\n scheduleSearch(e.target.value);\n }}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key === \"Enter\") {\n e.preventDefault();\n clearTimeout(timer.current);\n onSearch?.(text);\n } else if (e.key === \"Escape\" && text) {\n e.preventDefault();\n e.stopPropagation();\n clear();\n }\n }}\n // hide the browser's own clear button so there is only one\n className=\"min-w-0 flex-1 bg-transparent text-sm text-gray-900 outline-none placeholder:text-gray-500 [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden\"\n />\n {loading && (\n <span\n aria-hidden=\"true\"\n className=\"h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-gray-300 border-t-primary-600 motion-reduce:animate-none\"\n />\n )}\n {showClear && (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={clear}\n className=\"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 outline-none transition-colors hover:bg-gray-100 hover:text-gray-800 focus-visible:ring-2 focus-visible:ring-primary-500 motion-reduce:transition-none\"\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n {showHint && (\n <kbd aria-hidden=\"true\" className=\"shrink-0 rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 text-xs text-gray-500\">\n {hotkey!.length === 1 ? hotkey!.toUpperCase() : hotkey}\n </kbd>\n )}\n </div>\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {loading ? \"Searching\" : \"\"}\n </div>\n </div>\n );\n },\n);\nSearchInput.displayName = \"SearchInput\";\n\nexport default SearchInput;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport {\n RiBold,\n RiDeleteBinLine,\n RiDoubleQuotesL,\n RiFormatClear,\n RiItalic,\n RiLink,\n RiListOrdered,\n RiListUnordered,\n RiStrikethrough,\n RiUnderline,\n RiArrowGoBackLine,\n RiArrowGoForwardLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/* -------------------------------------------------------------------------- */\n/* Sanitizer */\n/* -------------------------------------------------------------------------- */\n\nconst MAP: Record<string, string> = { b: \"strong\", i: \"em\", strike: \"s\", del: \"s\", div: \"p\" };\nconst ALLOWED = new Set([\"p\", \"br\", \"strong\", \"em\", \"u\", \"s\", \"h1\", \"h2\", \"h3\", \"h4\", \"ul\", \"ol\", \"li\", \"blockquote\", \"a\", \"code\", \"pre\"]);\nconst DROP = new Set([\"script\", \"style\", \"iframe\", \"object\", \"embed\", \"noscript\", \"template\", \"svg\", \"math\", \"head\", \"title\", \"meta\", \"link\"]);\nconst SAFE_URL = /^(https?:\\/\\/|mailto:)/i;\n\nconst cleanInto = (src: Node, out: Node, doc: Document) => {\n src.childNodes.forEach((n) => {\n if (n.nodeType === 3) return void out.appendChild(doc.createTextNode(n.textContent ?? \"\"));\n if (n.nodeType !== 1) return;\n const el = n as Element;\n const raw = el.tagName.toLowerCase();\n if (DROP.has(raw)) return;\n const tag = MAP[raw] ?? raw;\n if (!ALLOWED.has(tag)) return cleanInto(el, out, doc); // unwrap unknown tags, keep their text\n // a paragraph cannot contain lists, quotes or other blocks: drop the wrapper and keep the children\n if (tag === \"p\" && el.querySelector(\"ul,ol,blockquote,h1,h2,h3,h4,pre,p,div\")) return cleanInto(el, out, doc);\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\") ?? \"\";\n if (!SAFE_URL.test(href.trim())) return cleanInto(el, out, doc);\n const a = doc.createElement(\"a\");\n a.setAttribute(\"href\", href.trim());\n a.setAttribute(\"rel\", \"noopener noreferrer\");\n cleanInto(el, a, doc);\n return void out.appendChild(a);\n }\n const copy = doc.createElement(tag);\n if (tag !== \"br\") cleanInto(el, copy, doc);\n out.appendChild(copy);\n });\n};\n\nconst BLOCKS = new Set([\"p\", \"ul\", \"ol\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"pre\"]);\n\n/** Wrap loose top-level text and inline tags in paragraphs, so the output is always a list of blocks. */\nconst wrapLoose = (box: HTMLElement, doc: Document) => {\n let run: HTMLElement | null = null;\n Array.from(box.childNodes).forEach((n) => {\n const isBlock = n.nodeType === 1 && BLOCKS.has((n as Element).tagName.toLowerCase());\n if (isBlock) {\n run = null;\n return;\n }\n if (n.nodeType === 3 && !(n.textContent ?? \"\").trim() && !run) return; // ignore stray whitespace between blocks\n if (!run) {\n run = doc.createElement(\"p\");\n box.insertBefore(run, n);\n }\n run.appendChild(n);\n });\n};\n\n/** Strip everything except a small set of safe formatting tags. Use it before rendering saved editor HTML elsewhere. */\nexport const sanitizeHtml = (html: string): string => {\n if (typeof DOMParser === \"undefined\") return \"\";\n const doc = new DOMParser().parseFromString(html || \"\", \"text/html\");\n const box = doc.createElement(\"div\");\n cleanInto(doc.body, box, doc);\n wrapLoose(box, doc);\n return box.innerHTML;\n};\n\n/** Sanitize the live editor element directly. Re-parsing its HTML as a string would split invalid nesting such as a list inside a paragraph. */\nconst sanitizeElement = (el: Element): string => {\n const doc = el.ownerDocument;\n const box = doc.createElement(\"div\");\n cleanInto(el, box, doc);\n wrapLoose(box, doc);\n return box.innerHTML;\n};\n\nconst isBlank = (html: string) => {\n if (typeof DOMParser === \"undefined\") return !html;\n const d = new DOMParser().parseFromString(html, \"text/html\");\n return (d.body.textContent ?? \"\").trim() === \"\";\n};\n\n/* -------------------------------------------------------------------------- */\n/* Editor */\n/* -------------------------------------------------------------------------- */\n\nexport type RichTextToolbarItem =\n | \"bold\" | \"italic\" | \"underline\" | \"strike\" | \"style\" | \"bulletList\" | \"numberList\" | \"quote\" | \"link\" | \"undo\" | \"redo\" | \"clear\" | \"|\";\n\nexport interface RichTextEditorProps {\n /** Controlled content as HTML. */\n value?: string;\n /** Optional. Starting HTML when uncontrolled. */\n defaultValue?: string;\n /** Called with the new HTML, or an empty string when there is no text. The HTML only contains safe formatting tags. */\n onChange?: (html: string) => void;\n /** Optional. Hint shown while empty. */\n placeholder?: string;\n /** Optional. Which tools to show, in order. Use \"|\" for a divider. Defaults to all. */\n toolbar?: RichTextToolbarItem[];\n /** Optional. Smallest height of the writing area, in pixels. Defaults to 140. */\n minHeight?: number;\n /** Optional. Largest height before the area scrolls, in pixels. */\n maxHeight?: number;\n /** Optional. Stop typing after this many characters and show a counter. */\n maxLength?: number;\n /** Optional. Show the error style. */\n error?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n /** Optional. Called when the editor loses focus. */\n onBlur?: () => void;\n /** Optional. id of the writing area, so a label can point to it. */\n id?: string;\n name?: string;\n /** Accessible name when there is no visible label. */\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: boolean;\n \"aria-required\"?: boolean;\n className?: string;\n}\n\nconst ALL: RichTextToolbarItem[] = [\"style\", \"|\", \"bold\", \"italic\", \"underline\", \"strike\", \"|\", \"bulletList\", \"numberList\", \"quote\", \"|\", \"link\", \"|\", \"undo\", \"redo\", \"clear\"];\n\nconst exec = (cmd: string, arg?: string) => document.execCommand(cmd, false, arg);\n\nconst contentStyles = [\n \"[&_h1]:mb-2 [&_h1]:text-2xl [&_h1]:font-bold\",\n \"[&_h2]:mb-2 [&_h2]:text-xl [&_h2]:font-semibold\",\n \"[&_h3]:mb-2 [&_h3]:text-lg [&_h3]:font-semibold\",\n \"[&_h4]:mb-2 [&_h4]:font-semibold\",\n \"[&_p]:mb-2 [&>div]:mb-2\",\n \"[&_ul]:mb-2 [&_ul]:list-disc [&_ul]:pl-6\",\n \"[&_ol]:mb-2 [&_ol]:list-decimal [&_ol]:pl-6\",\n \"[&_blockquote]:mb-2 [&_blockquote]:border-l-4 [&_blockquote]:border-gray-300 [&_blockquote]:pl-4 [&_blockquote]:italic [&_blockquote]:text-gray-600\",\n \"[&_a]:text-primary-700 [&_a]:underline\",\n \"[&_code]:rounded [&_code]:bg-gray-100 [&_code]:px-1 [&_code]:text-[0.9em]\",\n \"[&_pre]:mb-2 [&_pre]:overflow-auto [&_pre]:rounded-lg [&_pre]:bg-gray-100 [&_pre]:p-3\",\n].join(\" \");\n\nexport const RichTextEditor = ({\n value,\n defaultValue = \"\",\n onChange,\n placeholder,\n toolbar = ALL,\n minHeight = 140,\n maxHeight,\n maxLength,\n error,\n disabled,\n readOnly,\n onBlur,\n id: idProp,\n name,\n className,\n ...aria\n}: RichTextEditorProps) => {\n const uid = useId();\n const id = idProp ?? `${uid}-editor`;\n const ref = useRef<HTMLDivElement>(null);\n const lastEmitted = useRef<string | null>(null);\n const savedRange = useRef<Range | null>(null);\n const [active, setActive] = useState<Record<string, boolean>>({});\n const [block, setBlock] = useState(\"p\");\n const [empty, setEmpty] = useState(true);\n const [count, setCount] = useState(0);\n const [linkOpen, setLinkOpen] = useState(false);\n const [linkUrl, setLinkUrl] = useState(\"\");\n const [hasLink, setHasLink] = useState(false);\n const [focusIdx, setFocusIdx] = useState(0);\n const toolbarRef = useRef<HTMLDivElement>(null);\n const linkInputRef = useRef<HTMLInputElement>(null);\n const editable = !disabled && !readOnly;\n\n /* ---- initial + external content ---- */\n const setContent = (html: string) => {\n const el = ref.current;\n if (!el) return;\n const clean = sanitizeHtml(html);\n const next = clean || \"<div><br></div>\";\n if (el.innerHTML !== next) el.innerHTML = next;\n setEmpty(isBlank(clean));\n setCount((el.textContent ?? \"\").length);\n };\n useLayoutEffect(() => {\n setContent(value ?? defaultValue);\n lastEmitted.current = value ?? defaultValue;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n useEffect(() => {\n if (value === undefined || value === lastEmitted.current) return;\n lastEmitted.current = value;\n setContent(value);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n // Keep every line inside a block, so lists, headings and quotes behave the same everywhere.\n const ensureBlock = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n const only = el.childNodes.length === 1 ? el.firstChild : null;\n if (!el.firstChild || (only && only.nodeName === \"BR\")) {\n el.innerHTML = \"<div><br></div>\";\n const sel = window.getSelection();\n if (sel && document.activeElement === el) {\n const r = document.createRange();\n r.setStart(el.firstChild as Node, 0);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n }\n } else if (el.firstChild.nodeType === 3 && document.activeElement === el) {\n exec(\"formatBlock\", \"div\");\n }\n }, []);\n\n const emit = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n ensureBlock();\n const html = isBlank(el.innerHTML) && !/<(ul|ol|blockquote|pre)/.test(el.innerHTML) ? \"\" : sanitizeElement(el);\n setEmpty(html === \"\");\n setCount((el.textContent ?? \"\").length);\n if (html !== lastEmitted.current) {\n lastEmitted.current = html;\n onChange?.(html);\n }\n }, [onChange, ensureBlock]);\n\n // React's onBeforeInput is not the native event, so listen directly to stop typing at the limit\n useEffect(() => {\n const el = ref.current;\n if (!el || maxLength === undefined) return;\n const on = (e: Event) => {\n const t = (e as InputEvent).inputType ?? \"\";\n if (t.startsWith(\"insert\") && t !== \"insertParagraph\" && (el.textContent ?? \"\").length >= maxLength) e.preventDefault();\n };\n el.addEventListener(\"beforeinput\", on);\n return () => el.removeEventListener(\"beforeinput\", on);\n }, [maxLength]);\n\n /* ---- toolbar state follows the caret ---- */\n useEffect(() => {\n const update = () => {\n const el = ref.current;\n const sel = window.getSelection();\n if (!el || !sel || !sel.rangeCount || !el.contains(sel.anchorNode)) return;\n const q = (c: string) => {\n try {\n return document.queryCommandState(c);\n } catch {\n return false;\n }\n };\n // block-level state comes from the DOM, which stays correct after list commands\n let inUl = false, inOl = false, quote = false, heading = \"p\", inLink = false;\n // when the caret sits on an element boundary, look at the node next to it\n let n: Node | null = sel.anchorNode;\n if (n && n.nodeType === 1 && n !== el) n = n.childNodes[sel.anchorOffset] ?? n.childNodes[sel.anchorOffset - 1] ?? n;\n while (n && n !== el) {\n const t = (n as Element).tagName;\n if (t === \"UL\") inUl = true;\n else if (t === \"OL\") inOl = true;\n else if (t === \"BLOCKQUOTE\") quote = true;\n else if (t === \"A\") inLink = true;\n else if (t === \"H2\" || t === \"H3\" || t === \"H4\") heading = t.toLowerCase();\n n = n.parentNode;\n }\n setActive({ bold: q(\"bold\"), italic: q(\"italic\"), underline: q(\"underline\"), strike: q(\"strikeThrough\"), bulletList: inUl, numberList: inOl, quote });\n setBlock(heading);\n setHasLink(inLink);\n };\n document.addEventListener(\"selectionchange\", update);\n return () => document.removeEventListener(\"selectionchange\", update);\n }, []);\n\n /* ---- commands ---- */\n const run = (fn: () => void, keepCaret = false) => {\n if (!editable) return;\n if (document.activeElement !== ref.current) ref.current?.focus();\n const sel = window.getSelection();\n const before = keepCaret && sel && sel.rangeCount ? sel.getRangeAt(0).cloneRange() : null;\n fn();\n // some browsers drop the caret to the start of the line after a list command; put it back\n if (before && before.collapsed && before.startContainer.isConnected && ref.current?.contains(before.startContainer)) {\n sel!.removeAllRanges();\n sel!.addRange(before);\n }\n emit();\n };\n\n const toggleQuote = () => run(() => exec(\"formatBlock\", active.quote ? \"div\" : \"blockquote\"));\n\n const openLink = () => {\n const sel = window.getSelection();\n if (sel && sel.rangeCount && ref.current?.contains(sel.anchorNode)) savedRange.current = sel.getRangeAt(0).cloneRange();\n let existing = \"\";\n let n: Node | null = sel?.anchorNode ?? null;\n while (n && n !== ref.current) {\n if ((n as Element).tagName === \"A\") existing = (n as HTMLAnchorElement).getAttribute(\"href\") ?? \"\";\n n = n.parentNode;\n }\n setLinkUrl(existing);\n setLinkOpen(true);\n requestAnimationFrame(() => linkInputRef.current?.focus());\n };\n\n const restoreSelection = () => {\n ref.current?.focus();\n const sel = window.getSelection();\n if (savedRange.current && sel) {\n sel.removeAllRanges();\n sel.addRange(savedRange.current);\n }\n };\n\n const applyLink = () => {\n let url = linkUrl.trim();\n if (!url) return removeLink();\n if (!/^[a-z][a-z0-9+.-]*:/i.test(url)) url = `https://${url}`;\n if (!SAFE_URL.test(url)) return;\n restoreSelection();\n const sel = window.getSelection();\n if (sel && sel.isCollapsed) exec(\"insertHTML\", `<a href=\"${url.replace(/\"/g, \"&quot;\")}\">${url.replace(/</g, \"&lt;\")}</a>`);\n else exec(\"createLink\", url);\n setLinkOpen(false);\n emit();\n };\n\n const removeLink = () => {\n restoreSelection();\n exec(\"unlink\");\n setLinkOpen(false);\n emit();\n };\n\n const closeLink = () => {\n setLinkOpen(false);\n restoreSelection();\n };\n\n const items = toolbar;\n const buttons = items.filter((t) => t !== \"|\");\n\n const meta: Record<string, { label: string; icon: JSX.Element; on: () => void; pressed?: boolean; disabled?: boolean }> = {\n bold: { label: \"Bold\", icon: <RiBold size={16} />, on: () => run(() => exec(\"bold\")), pressed: active.bold },\n italic: { label: \"Italic\", icon: <RiItalic size={16} />, on: () => run(() => exec(\"italic\")), pressed: active.italic },\n underline: { label: \"Underline\", icon: <RiUnderline size={16} />, on: () => run(() => exec(\"underline\")), pressed: active.underline },\n strike: { label: \"Strikethrough\", icon: <RiStrikethrough size={16} />, on: () => run(() => exec(\"strikeThrough\")), pressed: active.strike },\n bulletList: { label: \"Bulleted list\", icon: <RiListUnordered size={16} />, on: () => run(() => exec(\"insertUnorderedList\"), true), pressed: active.bulletList },\n numberList: { label: \"Numbered list\", icon: <RiListOrdered size={16} />, on: () => run(() => exec(\"insertOrderedList\"), true), pressed: active.numberList },\n quote: { label: \"Quote\", icon: <RiDoubleQuotesL size={16} />, on: toggleQuote, pressed: active.quote },\n link: { label: hasLink ? \"Edit link\" : \"Add link\", icon: <RiLink size={16} />, on: openLink, pressed: hasLink },\n undo: { label: \"Undo\", icon: <RiArrowGoBackLine size={16} />, on: () => run(() => exec(\"undo\")) },\n redo: { label: \"Redo\", icon: <RiArrowGoForwardLine size={16} />, on: () => run(() => exec(\"redo\")) },\n clear: { label: \"Clear formatting\", icon: <RiFormatClear size={16} />, on: () => run(() => { exec(\"removeFormat\"); exec(\"unlink\"); exec(\"formatBlock\", \"p\"); }) },\n };\n\n /* ---- toolbar keyboard (roving tabindex) ---- */\n const onToolbarKey = (e: React.KeyboardEvent) => {\n const els = Array.from(toolbarRef.current?.querySelectorAll<HTMLElement>(\"[data-tb]\") ?? []);\n const i = els.indexOf(document.activeElement as HTMLElement);\n if (i < 0) return;\n let n = -1;\n if (e.key === \"ArrowRight\") n = (i + 1) % els.length;\n else if (e.key === \"ArrowLeft\") n = (i - 1 + els.length) % els.length;\n else if (e.key === \"Home\") n = 0;\n else if (e.key === \"End\") n = els.length - 1;\n if (n >= 0) {\n e.preventDefault();\n setFocusIdx(n);\n els[n].focus();\n }\n };\n\n const btnCls = (pressed?: boolean) =>\n cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-md text-gray-700 outline-none transition-colors hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary-500 disabled:cursor-not-allowed disabled:opacity-40 motion-reduce:transition-none\",\n pressed && \"bg-primary-50 text-primary-700\",\n );\n\n let tbIndex = -1;\n const over = maxLength !== undefined && count > maxLength;\n\n return (\n <div\n className={cn(\n \"w-full rounded-xl border bg-white shadow-[0px_1px_2px_0px_#1018280D] transition-[border-color,box-shadow] motion-reduce:transition-none focus-within:ring-4\",\n error || over ? \"border-error-500 focus-within:border-error-500 focus-within:ring-error-100\" : \"border-gray-200 focus-within:border-primary-600 focus-within:ring-primary-100\",\n disabled && \"opacity-50\",\n className,\n )}\n >\n {editable && (\n <div\n ref={toolbarRef}\n role=\"toolbar\"\n aria-label=\"Text formatting\"\n aria-controls={id}\n onKeyDown={onToolbarKey}\n className=\"flex flex-wrap items-center gap-0.5 border-b border-gray-200 px-2 py-1.5\"\n onMouseDown={(e) => {\n // keep the selection in the editor when clicking tools\n if ((e.target as HTMLElement).tagName !== \"SELECT\" && (e.target as HTMLElement).tagName !== \"OPTION\") e.preventDefault();\n }}\n >\n {items.map((t, k) => {\n if (t === \"|\") return <span key={k} aria-hidden=\"true\" className=\"mx-1 h-5 w-px bg-gray-200\" />;\n tbIndex++;\n const idx = tbIndex;\n if (t === \"style\") {\n return (\n <select\n key={k}\n data-tb\n aria-label=\"Text style\"\n tabIndex={focusIdx === idx ? 0 : -1}\n value={block}\n onFocus={() => setFocusIdx(idx)}\n onChange={(e) => run(() => exec(\"formatBlock\", e.target.value))}\n className=\"h-8 rounded-md border-0 bg-transparent px-2 text-sm text-gray-800 outline-none hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary-500\"\n >\n <option value=\"p\">Paragraph</option>\n <option value=\"h2\">Heading 1</option>\n <option value=\"h3\">Heading 2</option>\n <option value=\"h4\">Heading 3</option>\n </select>\n );\n }\n const m = meta[t];\n return (\n <button\n key={k}\n type=\"button\"\n data-tb\n aria-label={m.label}\n aria-pressed={m.pressed !== undefined && t !== \"undo\" && t !== \"redo\" && t !== \"clear\" ? !!m.pressed : undefined}\n aria-haspopup={t === \"link\" ? \"dialog\" : undefined}\n aria-expanded={t === \"link\" ? linkOpen : undefined}\n tabIndex={focusIdx === idx ? 0 : -1}\n onFocus={() => setFocusIdx(idx)}\n onClick={m.on}\n className={btnCls(m.pressed)}\n >\n <span aria-hidden=\"true\" className=\"inline-flex\">{m.icon}</span>\n </button>\n );\n })}\n </div>\n )}\n\n {linkOpen && (\n <div role=\"dialog\" aria-label=\"Link\" className=\"flex flex-wrap items-center gap-2 border-b border-gray-200 bg-gray-50 px-3 py-2\" onKeyDown={(e) => e.key === \"Escape\" && (e.stopPropagation(), closeLink())}>\n <label className=\"sr-only\" htmlFor={`${id}-url`}>\n Link address\n </label>\n <input\n id={`${id}-url`}\n ref={linkInputRef}\n type=\"url\"\n inputMode=\"url\"\n value={linkUrl}\n placeholder=\"https://example.com\"\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && (e.preventDefault(), applyLink())}\n className=\"h-9 min-w-0 flex-1 rounded-lg border border-gray-300 bg-white px-3 text-sm outline-none focus:border-primary-500 focus:ring-2 focus:ring-primary-200\"\n />\n <button type=\"button\" onClick={applyLink} className=\"h-9 rounded-lg bg-primary-600 px-3 text-sm font-medium text-white outline-none hover:bg-primary-700 focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\">\n Apply\n </button>\n {hasLink && (\n <button type=\"button\" onClick={removeLink} className=\"inline-flex h-9 items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 text-sm text-gray-700 outline-none hover:bg-gray-50 focus-visible:ring-2 focus-visible:ring-primary-500\">\n <RiDeleteBinLine size={14} aria-hidden=\"true\" /> Remove\n </button>\n )}\n <button type=\"button\" onClick={closeLink} className=\"h-9 rounded-lg px-3 text-sm text-gray-700 outline-none hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary-500\">\n Cancel\n </button>\n </div>\n )}\n\n <div className=\"relative\">\n {empty && placeholder && (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute left-4 top-3 text-sm text-gray-500\">\n {placeholder}\n </div>\n )}\n <div\n ref={ref}\n id={id}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-readonly={readOnly || undefined}\n aria-disabled={disabled || undefined}\n aria-label={aria[\"aria-label\"]}\n aria-describedby={aria[\"aria-describedby\"]}\n aria-invalid={aria[\"aria-invalid\"] ?? (error || over || undefined)}\n aria-required={aria[\"aria-required\"]}\n contentEditable={editable}\n suppressContentEditableWarning\n spellCheck\n onFocus={() => {\n try {\n exec(\"defaultParagraphSeparator\", \"div\");\n exec(\"styleWithCSS\", \"false\");\n ensureBlock();\n } catch {\n /* older browsers */\n }\n }}\n onInput={emit}\n onBlur={() => {\n emit();\n onBlur?.();\n }}\n onKeyDown={(e) => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"k\" && editable) {\n e.preventDefault();\n openLink();\n }\n }}\n onPaste={(e) => {\n if (!editable) return;\n e.preventDefault();\n const html = e.clipboardData.getData(\"text/html\");\n const text = e.clipboardData.getData(\"text/plain\");\n let insert = html ? sanitizeHtml(html) : \"\";\n // a single pasted paragraph goes in as inline text, so it does not nest inside headings or list items\n const single = insert.match(/^<p>((?:(?!<\\/?p>)[\\s\\S])*)<\\/p>$/);\n if (single) insert = single[1];\n let plain = text;\n if (maxLength !== undefined) {\n const room = Math.max(0, maxLength - (ref.current?.textContent ?? \"\").length);\n if (room === 0) return;\n if (plain.length > room) {\n plain = plain.slice(0, room);\n insert = \"\"; // fall back to trimmed plain text\n }\n }\n if (insert) exec(\"insertHTML\", insert);\n else exec(\"insertText\", plain);\n emit();\n }}\n style={{ minHeight, maxHeight }}\n className={cn(\n \"w-full overflow-auto px-4 py-3 text-sm leading-6 text-gray-900 outline-none\",\n contentStyles,\n !editable && \"cursor-default\",\n )}\n />\n </div>\n\n {name && <input type=\"hidden\" name={name} value={value ?? lastEmitted.current ?? \"\"} />}\n\n {(maxLength !== undefined || !editable) && maxLength !== undefined && (\n <div className=\"flex justify-end border-t border-gray-100 px-3 py-1.5\">\n <span aria-live=\"polite\" className={cn(\"text-xs\", over || count >= maxLength ? \"text-error-700\" : \"text-gray-500\")}>\n {count} / {maxLength}\n </span>\n </div>\n )}\n </div>\n );\n};\n\nexport default RichTextEditor;\n","\"use client\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { RiCheckLine, RiFileCopyLine, RiTextWrap } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\n/* -------------------------------------------------------------------------- */\n/* Tiny syntax highlighter */\n/* -------------------------------------------------------------------------- */\n\ntype TokenType = \"comment\" | \"string\" | \"number\" | \"keyword\" | \"tag\" | \"plain\";\ninterface Token {\n text: string;\n type: TokenType;\n}\n\nconst JS_KEYWORDS =\n \"abstract|as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|private|protected|public|readonly|return|set|static|super|switch|this|throw|true|try|type|typeof|undefined|var|void|while|with|yield\";\nconst PY_KEYWORDS =\n \"and|as|assert|async|await|break|class|continue|def|del|elif|else|except|False|finally|for|from|global|if|import|in|is|lambda|None|nonlocal|not|or|pass|raise|return|True|try|while|with|yield|print\";\nconst SH_KEYWORDS = \"if|then|else|elif|fi|for|while|do|done|case|esac|function|in|echo|cd|ls|mkdir|rm|cp|mv|export|npm|npx|yarn|pnpm|git|node|curl|sudo|cat|grep\";\n\nconst LANGS: Record<string, RegExp> = {\n js: new RegExp(`(\\\\/\\\\/[^\\\\n]*|\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)|(\"(?:\\\\\\\\.|[^\"\\\\\\\\\\\\n])*\"|'(?:\\\\\\\\.|[^'\\\\\\\\\\\\n])*'|\\`(?:\\\\\\\\.|[^\\`\\\\\\\\])*\\`)|(\\\\b\\\\d[\\\\d_]*(?:\\\\.\\\\d+)?\\\\b)|(\\\\b(?:${JS_KEYWORDS})\\\\b)|(<\\\\/?[A-Za-z][\\\\w.]*)`, \"g\"),\n json: /()(\"(?:\\\\.|[^\"\\\\\\n])*\")|(-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b)|(\\b(?:true|false|null)\\b)/g,\n css: /(\\/\\*[\\s\\S]*?\\*\\/)|(\"(?:\\\\.|[^\"\\\\\\n])*\"|'(?:\\\\.|[^'\\\\\\n])*')|(#[0-9a-fA-F]{3,8}\\b|-?\\b\\d+(?:\\.\\d+)?(?:px|rem|em|%|vh|vw|s|ms|deg)?\\b)|(@[\\w-]+|!important)/g,\n html: /(<!--[\\s\\S]*?-->)|(\"[^\"\\n]*\"|'[^'\\n]*')|()()(<\\/?[A-Za-z][\\w:-]*|\\/?>)/g,\n python: new RegExp(`(#[^\\\\n]*)|(\"\"\"[\\\\s\\\\S]*?\"\"\"|'''[\\\\s\\\\S]*?'''|\"(?:\\\\\\\\.|[^\"\\\\\\\\\\\\n])*\"|'(?:\\\\\\\\.|[^'\\\\\\\\\\\\n])*')|(\\\\b\\\\d[\\\\d_]*(?:\\\\.\\\\d+)?\\\\b)|(\\\\b(?:${PY_KEYWORDS})\\\\b)`, \"g\"),\n bash: new RegExp(`(#[^\\\\n]*)|(\"(?:\\\\\\\\.|[^\"\\\\\\\\\\\\n])*\"|'[^'\\\\n]*')|((?<=\\\\s)--?[A-Za-z][\\\\w-]*)|(\\\\b(?:${SH_KEYWORDS})\\\\b)`, \"g\"),\n};\n\nconst ALIASES: Record<string, string> = {\n js: \"js\", javascript: \"js\", jsx: \"js\", ts: \"js\", typescript: \"js\", tsx: \"js\", mjs: \"js\",\n json: \"json\", css: \"css\", scss: \"css\", html: \"html\", xml: \"html\", svg: \"html\", vue: \"html\",\n py: \"python\", python: \"python\", bash: \"bash\", sh: \"bash\", shell: \"bash\", zsh: \"bash\", console: \"bash\",\n};\n\nconst tokenize = (code: string, language?: string): Token[] => {\n const key = ALIASES[(language ?? \"\").toLowerCase()];\n if (!key) return [{ text: code, type: \"plain\" }];\n const re = new RegExp(LANGS[key].source, \"g\");\n const out: Token[] = [];\n let last = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(code))) {\n if (m[0] === \"\") {\n re.lastIndex++;\n continue;\n }\n if (m.index > last) out.push({ text: code.slice(last, m.index), type: \"plain\" });\n // groups: 1 comment, 2 string, 3 number, 4 keyword, 5 tag\n const type: TokenType = m[1] ? \"comment\" : m[2] ? \"string\" : m[3] ? (key === \"bash\" ? \"keyword\" : \"number\") : m[4] ? \"keyword\" : \"tag\";\n out.push({ text: m[0], type });\n last = m.index + m[0].length;\n }\n if (last < code.length) out.push({ text: code.slice(last), type: \"plain\" });\n return out;\n};\n\n/** Split a token list into lines, so multi-line comments and strings keep their colour on every line. */\nconst toLines = (tokens: Token[]): Token[][] => {\n const lines: Token[][] = [[]];\n tokens.forEach((t) => {\n const parts = t.text.split(\"\\n\");\n parts.forEach((part, i) => {\n if (i > 0) lines.push([]);\n if (part) lines[lines.length - 1].push({ text: part, type: t.type });\n });\n });\n return lines;\n};\n\nconst parseRange = (r?: number[] | string): Set<number> => {\n const set = new Set<number>();\n if (!r) return set;\n if (Array.isArray(r)) return new Set(r);\n r.split(\",\").forEach((part) => {\n const [a, b] = part.trim().split(\"-\").map(Number);\n if (Number.isFinite(a)) for (let i = a; i <= (Number.isFinite(b) ? b : a); i++) set.add(i);\n });\n return set;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nexport interface CodeBlockProps extends Omit<React.HTMLAttributes<HTMLElement>, \"children\" | \"title\" | \"onCopy\"> {\n /** The code to show. */\n code: string;\n /** Optional. Language for colouring: js, jsx, ts, tsx, json, css, html, bash, python. Other values show plain text. */\n language?: string;\n /** Optional. File name or heading shown above the code. Defaults to the language name. */\n title?: React.ReactNode;\n /** Optional. Show line numbers. Defaults to false. */\n showLineNumbers?: boolean;\n /** Optional. First line number. Defaults to 1. */\n startLine?: number;\n /** Optional. Lines to highlight, as numbers or a string such as \"1,3-5\". Numbers follow startLine. */\n highlightLines?: number[] | string;\n /** Optional. Wrap long lines instead of scrolling sideways. Defaults to false. */\n wrap?: boolean;\n /** Optional. Show a button that toggles wrapping. Defaults to false. */\n wrapToggle?: boolean;\n /** Optional. Show the copy button. Defaults to true. */\n copyable?: boolean;\n /** Optional. Called after the code is copied. */\n onCodeCopy?: (code: string) => void;\n /** Optional. Maximum height before the code scrolls, such as \"320px\". */\n maxHeight?: string;\n /** Optional. Colour scheme. Defaults to \"dark\". */\n theme?: \"dark\" | \"light\";\n /** Optional. Colour the code. Set false for plain text. Defaults to true. */\n highlight?: boolean;\n}\n\nconst palette = {\n dark: {\n frame: \"border-gray-800 bg-gray-900 text-gray-100\",\n head: \"border-gray-800 bg-gray-900/60 text-gray-300\",\n btn: \"text-gray-300 hover:bg-gray-800 hover:text-white focus-visible:ring-primary-400\",\n gutter: \"before:text-gray-600\",\n line: \"bg-white/10\",\n token: { comment: \"italic text-gray-500\", string: \"text-success-300\", number: \"text-warning-300\", keyword: \"text-primary-300\", tag: \"text-error-300\", plain: \"\" },\n },\n light: {\n frame: \"border-gray-200 bg-gray-50 text-gray-900\",\n head: \"border-gray-200 bg-white text-gray-600\",\n btn: \"text-gray-600 hover:bg-gray-100 hover:text-gray-900 focus-visible:ring-primary-500\",\n gutter: \"before:text-gray-400\",\n line: \"bg-primary-100\",\n token: { comment: \"italic text-gray-500\", string: \"text-success-700\", number: \"text-warning-700\", keyword: \"text-primary-700\", tag: \"text-error-700\", plain: \"\" },\n },\n} as const;\n\nexport const CodeBlock = ({\n code,\n language,\n title,\n showLineNumbers = false,\n startLine = 1,\n highlightLines,\n wrap: wrapProp = false,\n wrapToggle = false,\n copyable = true,\n onCodeCopy,\n maxHeight,\n theme = \"dark\",\n highlight = true,\n className,\n ...rest\n}: CodeBlockProps) => {\n const p = palette[theme];\n const text = code.replace(/\\n$/, \"\");\n const lines = useMemo(() => toLines(highlight ? tokenize(text, language) : [{ text, type: \"plain\" }]), [text, language, highlight]);\n const marked = useMemo(() => parseRange(highlightLines), [highlightLines]);\n const [copied, setCopied] = useState(false);\n const [failed, setFailed] = useState(false);\n const [wrap, setWrap] = useState(wrapProp);\n const timer = useRef<ReturnType<typeof setTimeout>>();\n useEffect(() => setWrap(wrapProp), [wrapProp]);\n useEffect(() => () => clearTimeout(timer.current), []);\n\n const copy = async () => {\n let ok = false;\n try {\n await navigator.clipboard.writeText(text);\n ok = true;\n } catch {\n // fall back for insecure contexts and older browsers\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.setAttribute(\"readonly\", \"\");\n ta.style.cssText = \"position:fixed;top:0;left:0;opacity:0\";\n document.body.appendChild(ta);\n ta.select();\n try {\n ok = document.execCommand(\"copy\");\n } catch {\n ok = false;\n }\n document.body.removeChild(ta);\n }\n setCopied(ok);\n setFailed(!ok);\n if (ok) onCodeCopy?.(text);\n clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n setCopied(false);\n setFailed(false);\n }, 2000);\n };\n\n const heading = title ?? (language ? language.toLowerCase() : null);\n const hasHeader = !!heading || copyable || wrapToggle;\n const label = typeof heading === \"string\" ? `${heading} code` : \"Code\";\n const gutterWidth = `${String(startLine + lines.length - 1).length + 1}ch`;\n\n return (\n <figure {...rest} className={cn(\"w-full overflow-hidden rounded-xl border text-sm\", p.frame, className)}>\n {hasHeader && (\n <div className={cn(\"flex items-center justify-between gap-3 border-b px-4 py-2\", p.head)}>\n <figcaption className=\"min-w-0 truncate font-mono text-xs\">{heading}</figcaption>\n <div className=\"flex shrink-0 items-center gap-1\">\n {wrapToggle && (\n <button\n type=\"button\"\n aria-label=\"Wrap long lines\"\n aria-pressed={wrap}\n onClick={() => setWrap((w) => !w)}\n className={cn(\"inline-flex h-7 w-7 items-center justify-center rounded-md outline-none transition-colors focus-visible:ring-2 motion-reduce:transition-none\", p.btn, wrap && (theme === \"dark\" ? \"bg-gray-800 text-white\" : \"bg-gray-100 text-gray-900\"))}\n >\n <RiTextWrap size={16} aria-hidden=\"true\" />\n </button>\n )}\n {copyable && (\n <button\n type=\"button\"\n onClick={copy}\n aria-label=\"Copy code\"\n className={cn(\"inline-flex h-7 items-center gap-1.5 rounded-md px-2 text-xs font-medium outline-none transition-colors focus-visible:ring-2 motion-reduce:transition-none\", p.btn)}\n >\n {copied ? <RiCheckLine size={14} aria-hidden=\"true\" /> : <RiFileCopyLine size={14} aria-hidden=\"true\" />}\n <span aria-hidden=\"true\">{copied ? \"Copied\" : failed ? \"Failed\" : \"Copy\"}</span>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* scrollable regions must be reachable by keyboard */}\n <pre\n tabIndex={0}\n aria-label={label}\n className=\"m-0 overflow-auto py-3 font-mono text-[13px] leading-6 outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\"\n style={maxHeight ? { maxHeight } : undefined}\n >\n <code className=\"block min-w-full w-max\" style={wrap ? { width: \"auto\", whiteSpace: \"pre-wrap\", wordBreak: \"break-word\" } : undefined}>\n {lines.map((tokens, i) => {\n const n = startLine + i;\n return (\n <span\n key={i}\n data-line={n}\n className={cn(\n \"block px-4\",\n marked.has(n) && p.line,\n showLineNumbers && cn(\"relative pl-[calc(var(--gw)+1.75rem)] before:absolute before:left-4 before:w-[var(--gw)] before:select-none before:text-right before:content-[attr(data-line)]\", p.gutter),\n )}\n style={showLineNumbers ? ({ \"--gw\": gutterWidth } as React.CSSProperties) : undefined}\n >\n {tokens.length ? tokens.map((t, k) => (t.type === \"plain\" ? <React.Fragment key={k}>{t.text}</React.Fragment> : <span key={k} className={p.token[t.type]}>{t.text}</span>)) : \"\\n\"}\n </span>\n );\n })}\n </code>\n </pre>\n\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {copied ? \"Code copied to clipboard\" : failed ? \"Could not copy the code\" : \"\"}\n </div>\n </figure>\n );\n};\n\nexport default CodeBlock;\n","\"use client\";\nimport React, { useEffect, useState } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface KeyInfo {\n /** Text drawn on the key. */\n glyph: string;\n /** Full name read out by screen readers. */\n name: string;\n}\n\nconst isMac = () =>\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPad|iPod/i.test((navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData?.platform ?? navigator.platform ?? navigator.userAgent);\n\n/** Turn a friendly key name into what is drawn and what is announced. */\nconst describe = (raw: string, mac: boolean): KeyInfo => {\n const k = raw.trim();\n const l = k.toLowerCase();\n switch (l) {\n case \"mod\":\n return mac ? { glyph: \"⌘\", name: \"Command\" } : { glyph: \"Ctrl\", name: \"Control\" };\n case \"cmd\":\n case \"command\":\n case \"meta\":\n return { glyph: \"⌘\", name: \"Command\" };\n case \"ctrl\":\n case \"control\":\n return mac ? { glyph: \"⌃\", name: \"Control\" } : { glyph: \"Ctrl\", name: \"Control\" };\n case \"alt\":\n case \"option\":\n case \"opt\":\n return mac ? { glyph: \"⌥\", name: \"Option\" } : { glyph: \"Alt\", name: \"Alt\" };\n case \"shift\":\n return mac ? { glyph: \"⇧\", name: \"Shift\" } : { glyph: \"Shift\", name: \"Shift\" };\n case \"enter\":\n case \"return\":\n return { glyph: \"↵\", name: \"Enter\" };\n case \"esc\":\n case \"escape\":\n return { glyph: \"Esc\", name: \"Escape\" };\n case \"tab\":\n return { glyph: \"Tab\", name: \"Tab\" };\n case \"backspace\":\n return { glyph: \"⌫\", name: \"Backspace\" };\n case \"delete\":\n case \"del\":\n return { glyph: \"Del\", name: \"Delete\" };\n case \"space\":\n return { glyph: \"Space\", name: \"Space\" };\n case \"up\":\n case \"arrowup\":\n return { glyph: \"↑\", name: \"Up arrow\" };\n case \"down\":\n case \"arrowdown\":\n return { glyph: \"↓\", name: \"Down arrow\" };\n case \"left\":\n case \"arrowleft\":\n return { glyph: \"←\", name: \"Left arrow\" };\n case \"right\":\n case \"arrowright\":\n return { glyph: \"→\", name: \"Right arrow\" };\n case \"pageup\":\n return { glyph: \"PgUp\", name: \"Page Up\" };\n case \"pagedown\":\n return { glyph: \"PgDn\", name: \"Page Down\" };\n default:\n return { glyph: k.length === 1 ? k.toUpperCase() : k, name: k.length === 1 ? k.toUpperCase() : k };\n }\n};\n\nexport interface KbdProps extends Omit<React.HTMLAttributes<HTMLElement>, \"children\"> {\n /** A single key, such as \"K\", \"Enter\" or \"mod\". Friendly names are converted: mod, cmd, ctrl, alt, shift, enter, esc, tab, space, up, down, left, right. */\n children?: React.ReactNode;\n /** Optional. A shortcut as a list of keys, such as [\"mod\", \"K\"]. Use this instead of children. */\n keys?: string[];\n /** Optional. Text between the keys of a shortcut. Defaults to \"+\". Use \"\" for none. */\n separator?: string;\n /** Optional. Show symbols (⌘ ⇧ ⌥) on Mac and words on other systems. Set false to always show words. Defaults to true. */\n platformAware?: boolean;\n /** Optional. Key size. Defaults to \"md\". */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Optional. Look of the keys. \"default\" is a raised key, \"outlined\" a flat border, \"subtle\" a plain grey chip. Defaults to \"default\". */\n variant?: \"default\" | \"outlined\" | \"subtle\";\n}\n\nconst sizes = {\n sm: \"min-h-5 min-w-5 px-1 text-[11px]\",\n md: \"min-h-6 min-w-6 px-1.5 text-xs\",\n lg: \"min-h-7 min-w-7 px-2 text-sm\",\n} as const;\n\nconst looks = {\n default: \"border border-gray-200 border-b-2 bg-gray-50 text-gray-700 shadow-xs\",\n outlined: \"border border-gray-300 bg-white text-gray-700\",\n subtle: \"bg-gray-100 text-gray-700\",\n} as const;\n\nconst Key = ({ info, size, variant, className, ...rest }: { info: KeyInfo; size: NonNullable<KbdProps[\"size\"]>; variant: NonNullable<KbdProps[\"variant\"]>; className?: string } & React.HTMLAttributes<HTMLElement>) => (\n <kbd\n {...rest}\n className={cn(\n \"inline-flex items-center justify-center rounded-md font-sans font-medium leading-none\",\n sizes[size],\n looks[variant],\n className,\n )}\n >\n <span aria-hidden=\"true\">{info.glyph}</span>\n <span className=\"sr-only\">{info.name}</span>\n </kbd>\n);\n\nexport const Kbd = ({ children, keys, separator = \"+\", platformAware = true, size = \"md\", variant = \"default\", className, ...rest }: KbdProps) => {\n // Start with the non-Mac form so server and first client render match, then switch after mount.\n const [mac, setMac] = useState(false);\n useEffect(() => setMac(platformAware && isMac()), [platformAware]);\n\n if (keys && keys.length > 0) {\n return (\n <kbd {...rest} className={cn(\"inline-flex items-center gap-1 font-sans\", className)}>\n {keys.map((k, i) => (\n <React.Fragment key={`${k}-${i}`}>\n {i > 0 && separator && (\n <span aria-hidden=\"true\" className=\"text-xs text-gray-400\">\n {separator}\n </span>\n )}\n {i > 0 && <span className=\"sr-only\"> plus </span>}\n <Key info={describe(k, mac)} size={size} variant={variant} />\n </React.Fragment>\n ))}\n </kbd>\n );\n }\n\n // single key: plain text children are described too, other nodes are shown as they are\n if (typeof children === \"string\") return <Key {...rest} info={describe(children, mac)} size={size} variant={variant} className={className} />;\n return (\n <kbd {...rest} className={cn(\"inline-flex items-center justify-center rounded-md font-sans font-medium leading-none\", sizes[size], looks[variant], className)}>\n {children}\n </kbd>\n );\n};\n\nexport default Kbd;\n","import React, { forwardRef } from \"react\";\nimport { RiExternalLinkLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface LinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"color\"> {\n /** Where the link goes. Without an href (and not disabled) a button that looks like a link is rendered. */\n href?: string;\n /** Optional. Colour of the link. \"inherit\" uses the surrounding text colour. Defaults to \"primary\". */\n variant?: \"primary\" | \"neutral\" | \"inherit\";\n /** Optional. When the underline shows. Keep \"always\" inside paragraphs so links do not rely on colour alone. Defaults to \"always\". */\n underline?: \"always\" | \"hover\" | \"none\";\n /** Optional. Text size. \"inherit\" matches the surrounding text. Defaults to \"inherit\". */\n size?: \"sm\" | \"md\" | \"lg\" | \"inherit\";\n /** Optional. Opens in a new tab with safe rel values, shows an icon and tells screen readers. Defaults to false. */\n external?: boolean;\n /** Optional. Show the arrow icon on external links. Defaults to true. */\n showExternalIcon?: boolean;\n /** Optional. Marks the link to the page you are on (aria-current=\"page\") and makes it bolder. */\n current?: boolean;\n /** Optional. Turns the link off. It stays visible but cannot be used. */\n disabled?: boolean;\n /** Optional. Icon before the text. */\n startIcon?: JSX.Element;\n /** Optional. Icon after the text. */\n endIcon?: JSX.Element;\n /** Optional. Component to render instead of a plain anchor, such as Next.js Link or React Router Link. It receives the same props. */\n component?: React.ElementType;\n}\n\nconst colors = {\n primary: \"text-primary-700 hover:text-primary-800 visited:text-primary-900\",\n neutral: \"text-gray-700 hover:text-gray-900\",\n inherit: \"text-inherit\",\n} as const;\n\nconst underlines = {\n always: \"underline underline-offset-2\",\n hover: \"no-underline hover:underline underline-offset-2\",\n none: \"no-underline\",\n} as const;\n\nconst sizes = { sm: \"text-sm\", md: \"text-base\", lg: \"text-lg\", inherit: \"\" } as const;\n\nexport const Link = forwardRef<HTMLElement, LinkProps>(\n (\n {\n href,\n variant = \"primary\",\n underline = \"always\",\n size = \"inherit\",\n external = false,\n showExternalIcon = true,\n current = false,\n disabled = false,\n startIcon,\n endIcon,\n component,\n className,\n children,\n onClick,\n target,\n rel,\n ...rest\n },\n ref,\n ) => {\n const classes = cn(\n \"inline-flex items-baseline gap-1 rounded-sm font-medium outline-none transition-colors motion-reduce:transition-none\",\n \"focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n colors[variant],\n underlines[underline],\n sizes[size],\n current && \"font-semibold\",\n disabled && \"cursor-not-allowed opacity-50 no-underline hover:no-underline\",\n className,\n );\n\n const content = (\n <>\n {startIcon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 self-center\">\n {startIcon}\n </span>\n )}\n <span>{children}</span>\n {endIcon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 self-center\">\n {endIcon}\n </span>\n )}\n {external && (\n <>\n {showExternalIcon && <RiExternalLinkLine size=\"0.9em\" aria-hidden=\"true\" className=\"shrink-0 self-center\" />}\n <span className=\"sr-only\"> (opens in a new tab)</span>\n </>\n )}\n </>\n );\n\n // A disabled link has no destination, so it is only announced, never followed.\n if (disabled) {\n return (\n <span ref={ref as React.Ref<HTMLSpanElement>} role=\"link\" aria-disabled=\"true\" className={classes}>\n {content}\n </span>\n );\n }\n\n // No destination: behave as a button but look like a link.\n if (!href && !component) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onClick as unknown as React.MouseEventHandler<HTMLButtonElement>}\n aria-current={current ? \"true\" : undefined}\n className={classes}\n {...(rest as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {content}\n </button>\n );\n }\n\n const Comp: React.ElementType = component ?? \"a\";\n return (\n <Comp\n ref={ref}\n href={href}\n onClick={onClick}\n target={external ? \"_blank\" : target}\n rel={external ? Array.from(new Set(`${rel ?? \"\"} noopener noreferrer`.trim().split(/\\s+/))).join(\" \") : rel}\n aria-current={current ? \"page\" : undefined}\n className={classes}\n {...rest}\n >\n {content}\n </Comp>\n );\n },\n);\nLink.displayName = \"Link\";\n\nexport default Link;\n","\"use client\";\nimport React, { createContext, useContext, useId, useState } from \"react\";\nimport { RiArrowDownSLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ninterface Ctx {\n open: boolean;\n setOpen: (v: boolean) => void;\n disabled: boolean;\n triggerId: string;\n contentId: string;\n}\nconst CollapsibleCtx = createContext<Ctx | null>(null);\nconst useCollapsible = (name: string) => {\n const c = useContext(CollapsibleCtx);\n if (!c) throw new Error(`<${name}> must be used inside <Collapsible>.`);\n return c;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------------- */\n\nexport interface CollapsibleProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** Controlled open state. */\n open?: boolean;\n /** Optional. Starting state when uncontrolled. Defaults to false. */\n defaultOpen?: boolean;\n /** Called when the section opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /** Optional. Stops the section from being toggled. */\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Collapsible = ({ open: openProp, defaultOpen = false, onOpenChange, disabled = false, className, children, ...rest }: CollapsibleProps) => {\n const uid = useId();\n const [inner, setInner] = useState(defaultOpen);\n const open = openProp ?? inner;\n const setOpen = (v: boolean) => {\n if (disabled) return;\n if (openProp === undefined) setInner(v);\n onOpenChange?.(v);\n };\n return (\n <CollapsibleCtx.Provider value={{ open, setOpen, disabled, triggerId: `${uid}-trigger`, contentId: `${uid}-content` }}>\n <div {...rest} data-state={open ? \"open\" : \"closed\"} className={className}>\n {children}\n </div>\n </CollapsibleCtx.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Trigger */\n/* -------------------------------------------------------------------------- */\n\nexport interface CollapsibleTriggerProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n /** The label, or a function that receives the open state, for text that changes such as \"Show more\" and \"Show less\". */\n children: React.ReactNode | ((open: boolean) => React.ReactNode);\n /** Optional. Hide the chevron. Defaults to false. */\n hideIndicator?: boolean;\n /** Optional. Put the chevron before the label. Defaults to false. */\n indicatorStart?: boolean;\n}\n\nexport const CollapsibleTrigger = ({ children, hideIndicator = false, indicatorStart = false, className, onClick, ...rest }: CollapsibleTriggerProps) => {\n const { open, setOpen, disabled, triggerId, contentId } = useCollapsible(\"CollapsibleTrigger\");\n const chevron = !hideIndicator && (\n <RiArrowDownSLine\n size={18}\n aria-hidden=\"true\"\n className={cn(\"shrink-0 transition-transform duration-200 motion-reduce:transition-none\", open && \"rotate-180\")}\n />\n );\n return (\n <button\n type=\"button\"\n {...rest}\n id={triggerId}\n aria-expanded={open}\n aria-controls={contentId}\n disabled={disabled || rest.disabled}\n data-state={open ? \"open\" : \"closed\"}\n onClick={(e) => {\n onClick?.(e);\n if (!e.defaultPrevented) setOpen(!open);\n }}\n className={cn(\n \"inline-flex items-center gap-2 rounded-lg text-sm font-medium text-gray-900 outline-none transition-colors motion-reduce:transition-none\",\n \"hover:text-primary-700 focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:text-gray-900\",\n className,\n )}\n >\n {indicatorStart && chevron}\n {typeof children === \"function\" ? children(open) : children}\n {!indicatorStart && chevron}\n </button>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Content */\n/* -------------------------------------------------------------------------- */\n\nexport interface CollapsibleContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Optional. Keep the content in the page while closed (hidden from everyone). Defaults to true, which keeps state and allows the animation. Set false to remove it from the page when closed. */\n keepMounted?: boolean;\n}\n\nexport const CollapsibleContent = ({ keepMounted = true, className, children, ...rest }: CollapsibleContentProps) => {\n const { open, triggerId, contentId } = useCollapsible(\"CollapsibleContent\");\n if (!keepMounted && !open) return null;\n return (\n <div\n id={contentId}\n role=\"region\"\n aria-labelledby={triggerId}\n data-state={open ? \"open\" : \"closed\"}\n // grid rows animate between 0 and the content's own height; invisible removes closed content from tab order and screen readers\n className={cn(\n \"grid transition-[grid-template-rows,visibility] duration-200 ease-out motion-reduce:transition-none\",\n open ? \"visible grid-rows-[1fr]\" : \"invisible grid-rows-[0fr]\",\n )}\n >\n <div className=\"min-h-0 overflow-hidden\">\n <div {...rest} className={className}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Collapsible;\n","\"use client\";\nimport React, { createContext, useContext, useId, useRef, useState } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ntype Direction = \"horizontal\" | \"vertical\";\n\ninterface GroupCtx {\n direction: Direction;\n sizes: number[];\n setPair: (index: number, a: number, b: number) => void;\n reset: (index: number) => void;\n containerRef: React.RefObject<HTMLDivElement>;\n limits: { min: number; max: number }[];\n panelIds: string[];\n}\nconst GroupContext = createContext<GroupCtx | null>(null);\nconst ItemContext = createContext<number>(0);\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\n/* -------------------------------------------------------------------------- */\n/* Panel */\n/* -------------------------------------------------------------------------- */\n\nexport interface ResizablePanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Optional. Starting size as a percent of the group. Panels without one share the remaining space equally. */\n defaultSize?: number;\n /** Optional. Smallest size in percent. Defaults to 10. */\n minSize?: number;\n /** Optional. Largest size in percent. Defaults to 100. */\n maxSize?: number;\n children?: React.ReactNode;\n}\n\nexport const ResizablePanel = ({ defaultSize: _d, minSize: _mi, maxSize: _ma, className, children, ...rest }: ResizablePanelProps) => {\n const group = useContext(GroupContext);\n const index = useContext(ItemContext);\n if (!group) throw new Error(\"<ResizablePanel> must be used inside <ResizablePanelGroup>.\");\n return (\n <div\n {...rest}\n id={group.panelIds[index]}\n data-panel=\"\"\n style={{ ...rest.style, flex: `${group.sizes[index]} 1 0px` }}\n className={cn(\"min-h-0 min-w-0 overflow-auto\", className)}\n >\n {children}\n </div>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Handle */\n/* -------------------------------------------------------------------------- */\n\nexport interface ResizableHandleProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Optional. Show a grip so the handle is easy to spot. Defaults to false. */\n withHandle?: boolean;\n /** Optional. Stops this divider from being moved. */\n disabled?: boolean;\n /** Optional. Accessible name. Defaults to \"Resize\". */\n \"aria-label\"?: string;\n}\n\nexport const ResizableHandle = ({ withHandle = false, disabled = false, className, onKeyDown, ...rest }: ResizableHandleProps) => {\n const g = useContext(GroupContext);\n const i = useContext(ItemContext);\n const drag = useRef<{ pos: number; a: number; b: number } | null>(null);\n const [dragging, setDragging] = useState(false);\n if (!g) throw new Error(\"<ResizableHandle> must be used inside <ResizablePanelGroup>.\");\n const horizontal = g.direction === \"horizontal\";\n const a = g.sizes[i];\n const b = g.sizes[i + 1];\n\n const move = (delta: number, from = { a, b }) => {\n // limit the move so neither neighbour passes its min or max\n const lo = Math.max(g.limits[i].min - from.a, from.b - g.limits[i + 1].max);\n const hi = Math.min(g.limits[i].max - from.a, from.b - g.limits[i + 1].min);\n const d = clamp(delta, lo, hi);\n g.setPair(i, from.a + d, from.b - d);\n };\n\n return (\n <div\n aria-label=\"Resize\"\n {...rest}\n role=\"separator\"\n aria-orientation={horizontal ? \"vertical\" : \"horizontal\"}\n aria-valuenow={Math.round(a)}\n aria-valuemin={Math.round(g.limits[i].min)}\n aria-valuemax={Math.round(g.limits[i].max)}\n aria-controls={g.panelIds[i]}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n data-dragging={dragging || undefined}\n onPointerDown={(e) => {\n if (disabled || e.button !== 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n drag.current = { pos: horizontal ? e.clientX : e.clientY, a, b };\n setDragging(true);\n }}\n onPointerMove={(e) => {\n if (!drag.current || !g.containerRef.current) return;\n const rect = g.containerRef.current.getBoundingClientRect();\n const total = horizontal ? rect.width : rect.height;\n if (!total) return;\n const px = (horizontal ? e.clientX : e.clientY) - drag.current.pos;\n move((px / total) * 100, drag.current);\n }}\n onPointerUp={(e) => {\n drag.current = null;\n setDragging(false);\n if (e.currentTarget.hasPointerCapture(e.pointerId)) e.currentTarget.releasePointerCapture(e.pointerId);\n }}\n onPointerCancel={() => {\n drag.current = null;\n setDragging(false);\n }}\n onDoubleClick={() => !disabled && g.reset(i)}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented || disabled) return;\n const step = e.shiftKey ? 10 : 1;\n const less = horizontal ? \"ArrowLeft\" : \"ArrowUp\";\n const more = horizontal ? \"ArrowRight\" : \"ArrowDown\";\n if (e.key === less) move(-step);\n else if (e.key === more) move(step);\n else if (e.key === \"Home\") move(-100);\n else if (e.key === \"End\") move(100);\n else if (e.key === \"Enter\") g.reset(i);\n else return;\n e.preventDefault();\n }}\n className={cn(\n \"relative flex shrink-0 touch-none select-none items-center justify-center bg-gray-200 outline-none transition-colors motion-reduce:transition-none\",\n horizontal ? \"w-px cursor-col-resize after:absolute after:inset-y-0 after:-left-1.5 after:-right-1.5\" : \"h-px cursor-row-resize after:absolute after:inset-x-0 after:-bottom-1.5 after:-top-1.5\",\n !disabled && \"hover:bg-primary-400 focus-visible:bg-primary-500 focus-visible:ring-2 focus-visible:ring-primary-500 data-[dragging]:bg-primary-500\",\n disabled && \"cursor-default\",\n className,\n )}\n >\n {withHandle && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"z-10 flex items-center justify-center rounded-md border border-gray-300 bg-white shadow-sm\",\n horizontal ? \"h-6 w-3 flex-col gap-0.5\" : \"h-3 w-6 gap-0.5\",\n )}\n >\n <span className=\"h-1 w-1 rounded-full bg-gray-400\" />\n <span className=\"h-1 w-1 rounded-full bg-gray-400\" />\n <span className=\"h-1 w-1 rounded-full bg-gray-400\" />\n </span>\n )}\n </div>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Group */\n/* -------------------------------------------------------------------------- */\n\nexport interface ResizablePanelGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** Optional. \"horizontal\" puts panels side by side, \"vertical\" stacks them. Defaults to \"horizontal\". */\n direction?: Direction;\n /** Called with every panel's size in percent as the layout changes. */\n onLayout?: (sizes: number[]) => void;\n /** Put ResizablePanel and ResizableHandle children in alternating order. */\n children: React.ReactNode;\n}\n\nexport const ResizablePanelGroup = ({ direction = \"horizontal\", onLayout, className, children, ...rest }: ResizablePanelGroupProps) => {\n const uid = useId();\n const containerRef = useRef<HTMLDivElement>(null);\n const items = React.Children.toArray(children).filter(React.isValidElement) as React.ReactElement[];\n const panels = items.filter((c) => c.type === ResizablePanel) as React.ReactElement<ResizablePanelProps>[];\n\n const initial = () => {\n const set = panels.reduce((n, p) => n + (p.props.defaultSize ?? 0), 0);\n const unset = panels.filter((p) => p.props.defaultSize === undefined).length;\n const each = unset ? Math.max(0, 100 - set) / unset : 0;\n const raw = panels.map((p) => p.props.defaultSize ?? each);\n const sum = raw.reduce((a, b) => a + b, 0) || 1;\n return raw.map((v) => (v / sum) * 100);\n };\n const [start] = useState(initial);\n const [sizes, setSizes] = useState(start);\n\n const limits = panels.map((p) => ({ min: p.props.minSize ?? 10, max: p.props.maxSize ?? 100 }));\n const panelIds = panels.map((_, i) => `${uid}-panel-${i}`);\n\n const commit = (next: number[]) => {\n setSizes(next);\n onLayout?.(next);\n };\n const setPair = (index: number, a: number, b: number) => {\n const next = [...sizes];\n next[index] = a;\n next[index + 1] = b;\n commit(next);\n };\n const reset = (index: number) => {\n const total = sizes[index] + sizes[index + 1];\n const share = start[index] + start[index + 1] || 1;\n const a = clamp((start[index] / share) * total, limits[index].min, limits[index].max);\n setPair(index, a, total - a);\n };\n\n let panelIndex = -1;\n return (\n <GroupContext.Provider value={{ direction, sizes, setPair, reset, containerRef, limits, panelIds }}>\n <div\n {...rest}\n ref={containerRef}\n data-direction={direction}\n className={cn(\"flex h-full w-full overflow-hidden\", direction === \"vertical\" && \"flex-col\", className)}\n >\n {items.map((child, k) => {\n if (child.type === ResizablePanel) panelIndex += 1;\n // a handle belongs to the panel before it\n const idx = child.type === ResizablePanel ? panelIndex : panelIndex;\n return (\n <ItemContext.Provider key={child.key ?? k} value={idx}>\n {child}\n </ItemContext.Provider>\n );\n })}\n </div>\n </GroupContext.Provider>\n );\n};\n\nexport default ResizablePanelGroup;\n","\"use client\";\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ntype Axis = \"vertical\" | \"horizontal\";\n\nexport interface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Optional. Which directions can scroll. Defaults to \"vertical\". */\n orientation?: Axis | \"both\";\n /** Optional. When the custom scrollbar shows. \"hover\" on pointer over, focus or scroll; \"scroll\" only while scrolling; \"auto\" and \"always\" whenever there is overflow. Defaults to \"hover\". */\n type?: \"hover\" | \"scroll\" | \"auto\" | \"always\";\n /** Optional. Milliseconds the scrollbar stays visible after scrolling stops. Defaults to 600. */\n scrollHideDelay?: number;\n /** Optional. Classes for the scrolling viewport, for example padding. */\n viewportClassName?: string;\n /** Accessible name for the scrollable region. Recommended, because the viewport can be focused with the keyboard. */\n \"aria-label\"?: string;\n children?: React.ReactNode;\n}\n\ninterface Metrics {\n overflow: boolean;\n thumb: number;\n offset: number;\n}\nconst empty: Metrics = { overflow: false, thumb: 0, offset: 0 };\nconst MIN_THUMB = 24;\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(function ScrollArea(\n { orientation = \"vertical\", type = \"hover\", scrollHideDelay = 600, className, viewportClassName, children, \"aria-label\": ariaLabel, ...rest },\n ref,\n) {\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const drag = useRef<{ axis: Axis; pointer: number; scroll: number } | null>(null);\n const [v, setV] = useState<Metrics>(empty);\n const [h, setH] = useState<Metrics>(empty);\n const [hovering, setHovering] = useState(false);\n const [scrolling, setScrolling] = useState(false);\n const [dragging, setDragging] = useState(false);\n\n useImperativeHandle(ref, () => viewportRef.current as HTMLDivElement);\n\n const measure = useCallback(() => {\n const el = viewportRef.current;\n if (!el) return;\n const calc = (client: number, total: number, pos: number, track: number): Metrics => {\n if (total <= client + 1) return empty;\n const thumb = Math.max(MIN_THUMB, (client / total) * track);\n const max = total - client;\n return { overflow: true, thumb, offset: (pos / max) * (track - thumb) };\n };\n setV(calc(el.clientHeight, el.scrollHeight, el.scrollTop, el.clientHeight));\n setH(calc(el.clientWidth, el.scrollWidth, el.scrollLeft, el.clientWidth));\n }, []);\n\n useEffect(() => {\n measure();\n const ro = new ResizeObserver(measure);\n if (viewportRef.current) ro.observe(viewportRef.current);\n if (contentRef.current) ro.observe(contentRef.current);\n return () => {\n ro.disconnect();\n clearTimeout(timer.current);\n };\n }, [measure]);\n\n const onScroll = () => {\n measure();\n setScrolling(true);\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setScrolling(false), scrollHideDelay);\n };\n\n const show = (overflow: boolean) =>\n overflow && (type === \"always\" || type === \"auto\" || dragging || scrolling || (type === \"hover\" && hovering));\n\n const bar = (axis: Axis, m: Metrics) => {\n const vertical = axis === \"vertical\";\n const visible = show(m.overflow);\n return (\n <div\n aria-hidden=\"true\"\n data-orientation={axis}\n data-state={visible ? \"visible\" : \"hidden\"}\n onPointerDown={(e) => {\n // clicking the track jumps one page toward the click\n const el = viewportRef.current;\n if (!el || e.target !== e.currentTarget) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const at = vertical ? e.clientY - rect.top : e.clientX - rect.left;\n const dir = at < m.offset ? -1 : 1;\n el.scrollBy({ [vertical ? \"top\" : \"left\"]: dir * (vertical ? el.clientHeight : el.clientWidth) * 0.9, behavior: \"smooth\" });\n }}\n className={cn(\n \"absolute z-10 flex touch-none select-none p-0.5 transition-opacity duration-150 motion-reduce:transition-none\",\n vertical ? \"bottom-0 right-0 top-0 w-2.5\" : \"bottom-0 left-0 right-0 h-2.5\",\n orientation === \"both\" && (vertical ? \"bottom-2.5\" : \"right-2.5\"),\n visible ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n >\n <div\n onPointerDown={(e) => {\n const el = viewportRef.current;\n if (!el || e.button !== 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n drag.current = { axis, pointer: vertical ? e.clientY : e.clientX, scroll: vertical ? el.scrollTop : el.scrollLeft };\n setDragging(true);\n }}\n onPointerMove={(e) => {\n const el = viewportRef.current;\n const d = drag.current;\n if (!el || !d) return;\n const client = vertical ? el.clientHeight : el.clientWidth;\n const total = vertical ? el.scrollHeight : el.scrollWidth;\n const free = client - m.thumb;\n if (free <= 0) return;\n const delta = ((vertical ? e.clientY : e.clientX) - d.pointer) * ((total - client) / free);\n if (vertical) el.scrollTop = d.scroll + delta;\n else el.scrollLeft = d.scroll + delta;\n }}\n onPointerUp={(e) => {\n drag.current = null;\n setDragging(false);\n if (e.currentTarget.hasPointerCapture(e.pointerId)) e.currentTarget.releasePointerCapture(e.pointerId);\n }}\n onPointerCancel={() => {\n drag.current = null;\n setDragging(false);\n }}\n data-scroll-thumb={axis}\n style={vertical ? { height: m.thumb, transform: `translateY(${m.offset}px)` } : { width: m.thumb, transform: `translateX(${m.offset}px)` }}\n className={cn(\"rounded-full bg-gray-400 transition-colors hover:bg-gray-500 motion-reduce:transition-none\", dragging && \"bg-gray-500\", vertical ? \"w-full\" : \"h-full\")}\n />\n </div>\n );\n };\n\n const canV = orientation === \"vertical\" || orientation === \"both\";\n const canH = orientation === \"horizontal\" || orientation === \"both\";\n\n return (\n <div\n {...rest}\n onPointerEnter={(e) => {\n rest.onPointerEnter?.(e);\n setHovering(true);\n }}\n onPointerLeave={(e) => {\n rest.onPointerLeave?.(e);\n setHovering(false);\n }}\n onFocus={(e) => {\n rest.onFocus?.(e);\n setHovering(true);\n }}\n onBlur={(e) => {\n rest.onBlur?.(e);\n setHovering(false);\n }}\n className={cn(\"relative overflow-hidden\", className)}\n >\n <div\n ref={viewportRef}\n role=\"region\"\n aria-label={ariaLabel}\n // focusable so keyboard users can scroll with the arrow keys, Page Up and Page Down\n tabIndex={0}\n onScroll={onScroll}\n className={cn(\n \"h-full w-full rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n \"[scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n canV ? \"overflow-y-auto\" : \"overflow-y-hidden\",\n canH ? \"overflow-x-auto\" : \"overflow-x-hidden\",\n )}\n >\n <div ref={contentRef} className={cn(canH && \"w-max min-w-full\", viewportClassName)}>\n {children}\n </div>\n </div>\n {canV && bar(\"vertical\", v)}\n {canH && bar(\"horizontal\", h)}\n </div>\n );\n});\n\nexport default ScrollArea;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface BottomSheetProps {\n /** Whether the sheet is open. */\n open: boolean;\n /** Called when the sheet asks to open or close (Escape, backdrop, swipe down, close button). */\n onOpenChange: (open: boolean) => void;\n /** Heading shown at the top. Also names the dialog for screen readers. */\n title?: React.ReactNode;\n /** Optional. Short text under the title. */\n description?: React.ReactNode;\n /** Optional. Fixed area under the content, for actions. */\n footer?: React.ReactNode;\n /** Optional. Heights the sheet can rest at, as fractions of the screen height, smallest first. Defaults to [0.5]. */\n snapPoints?: number[];\n /** Optional. Which snap point to start at (index). Defaults to 0. */\n defaultSnap?: number;\n /** Called with the new snap index when the sheet settles at another height. */\n onSnapChange?: (index: number) => void;\n /** Optional. Allow closing by Escape, backdrop click and swiping down. Defaults to true. */\n dismissible?: boolean;\n /** Optional. Show a backdrop, trap focus and lock page scroll. Set false for a sheet that sits beside the page. Defaults to true. */\n modal?: boolean;\n /** Optional. Show the drag handle. Defaults to true. */\n showHandle?: boolean;\n /** Optional. Show a close button. Defaults to true. */\n showCloseButton?: boolean;\n /** Optional. Classes for the sheet surface. */\n className?: string;\n /** Optional. Accessible name when there is no title. */\n \"aria-label\"?: string;\n children?: React.ReactNode;\n}\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]):not([type=\"hidden\"]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\nconst DURATION = 300;\n\nexport const BottomSheet = ({\n open,\n onOpenChange,\n title,\n description,\n footer,\n snapPoints = [0.5],\n defaultSnap = 0,\n onSnapChange,\n dismissible = true,\n modal = true,\n showHandle = true,\n showCloseButton = true,\n className,\n \"aria-label\": ariaLabel,\n children,\n}: BottomSheetProps) => {\n const uid = useId();\n const sheetRef = useRef<HTMLDivElement>(null);\n const drag = useRef<{ y: number; t: number; startPx: number; moved: boolean; onHandle: boolean } | null>(null);\n const snaps = [...snapPoints].sort((a, b) => a - b);\n const [snap, setSnap] = useState(Math.min(defaultSnap, snaps.length - 1));\n const [mounted, setMounted] = useState(open);\n const [shown, setShown] = useState(false);\n const [dragPx, setDragPx] = useState<number | null>(null);\n\n const close = useCallback(() => onOpenChange(false), [onOpenChange]);\n\n // mount, then show on the next frame so the slide-in animates; hide, then unmount after the slide-out\n useEffect(() => {\n if (open) {\n setMounted(true);\n setSnap(Math.min(defaultSnap, snaps.length - 1));\n const id = requestAnimationFrame(() => requestAnimationFrame(() => setShown(true)));\n return () => cancelAnimationFrame(id);\n }\n setShown(false);\n const reduce = typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const t = setTimeout(() => setMounted(false), reduce ? 0 : DURATION);\n return () => clearTimeout(t);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useEffect(() => {\n if (!open || !modal) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, [open, modal]);\n\n // focus in on open, back to the opener on close\n useEffect(() => {\n if (!open || !mounted) return;\n const opener = document.activeElement as HTMLElement | null;\n const el = sheetRef.current;\n if (el && !el.contains(document.activeElement)) el.focus({ preventScroll: true });\n return () => opener?.focus?.({ preventScroll: true });\n }, [open, mounted]);\n\n useEffect(() => {\n if (!open || !dismissible) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, dismissible, close]);\n\n if (!mounted || typeof document === \"undefined\") return null;\n\n const heightFor = (i: number) => snaps[i] * window.innerHeight;\n const goTo = (i: number) => {\n setSnap(i);\n onSnapChange?.(i);\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!modal || e.key !== \"Tab\") return;\n const el = sheetRef.current;\n if (!el) return;\n const items = Array.from(el.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (!items.length) {\n e.preventDefault();\n el.focus();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n if (e.shiftKey && (document.activeElement === first || document.activeElement === el)) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n };\n\n const onDown = (e: React.PointerEvent) => {\n if (e.button !== 0 || (e.target as HTMLElement).closest(\"button[data-no-drag]\")) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n drag.current = { y: e.clientY, t: performance.now(), startPx: heightFor(snap), moved: false, onHandle: !!(e.target as HTMLElement).closest(\"[data-sheet-handle]\") };\n };\n const onMove = (e: React.PointerEvent) => {\n const d = drag.current;\n if (!d) return;\n const delta = e.clientY - d.y;\n if (Math.abs(delta) > 4) d.moved = true;\n if (!d.moved) return;\n const max = (snaps[snaps.length - 1] || 1) * window.innerHeight;\n setDragPx(Math.max(0, Math.min(max, d.startPx - delta)));\n };\n const onUp = (e: React.PointerEvent) => {\n const d = drag.current;\n drag.current = null;\n if (e.currentTarget.hasPointerCapture(e.pointerId)) e.currentTarget.releasePointerCapture(e.pointerId);\n if (!d) return;\n if (!d.moved) {\n // a tap on the handle cycles to the next snap point\n setDragPx(null);\n if (snaps.length > 1 && d.onHandle) goTo((snap + 1) % snaps.length);\n return;\n }\n const final = dragPx ?? d.startPx;\n const velocity = (e.clientY - d.y) / Math.max(1, performance.now() - d.t); // px per ms, positive is down\n setDragPx(null);\n // candidates: every snap, plus 0 (close) when dismissible\n const targets = snaps.map((s, i) => ({ i, px: s * window.innerHeight }));\n let pick: number | \"close\";\n if (Math.abs(velocity) > 0.6) {\n pick = velocity > 0 ? (snap > 0 ? snap - 1 : dismissible ? \"close\" : 0) : Math.min(snaps.length - 1, snap + 1);\n } else {\n const nearest = targets.reduce((a, b) => (Math.abs(b.px - final) < Math.abs(a.px - final) ? b : a));\n pick = dismissible && final < nearest.px * 0.5 ? \"close\" : nearest.i;\n }\n if (pick === \"close\") close();\n else if (pick !== snap) goTo(pick);\n };\n\n const target = (document.querySelector(\".theme-primary\") as HTMLElement | null) ?? document.body;\n const titleId = `${uid}-title`;\n const descId = `${uid}-desc`;\n const multi = snaps.length > 1;\n\n return createPortal(\n <div className={cn(\"fixed inset-0 z-[200]\", !modal && \"pointer-events-none\")}>\n {modal && (\n <div\n aria-hidden=\"true\"\n onClick={() => dismissible && close()}\n className={cn(\"absolute inset-0 bg-black/50 transition-opacity duration-300 motion-reduce:transition-none\", shown ? \"opacity-100\" : \"opacity-0\")}\n />\n )}\n <div\n ref={sheetRef}\n role=\"dialog\"\n aria-modal={modal || undefined}\n aria-label={title ? undefined : ariaLabel}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descId : undefined}\n tabIndex={-1}\n onKeyDown={onKeyDown}\n style={{ height: dragPx ?? `${snaps[snap] * 100}dvh` }}\n className={cn(\n \"pointer-events-auto absolute inset-x-0 bottom-0 mx-auto flex max-h-full w-full flex-col rounded-t-2xl border-t border-gray-200 bg-white shadow-2xl outline-none\",\n dragPx === null ? \"transition-[height,transform] duration-300 ease-out motion-reduce:transition-none\" : \"transition-none\",\n shown ? \"translate-y-0\" : \"translate-y-full\",\n className,\n )}\n >\n {/* header: also the drag area */}\n <div onPointerDown={onDown} onPointerMove={onMove} onPointerUp={onUp} onPointerCancel={() => { drag.current = null; setDragPx(null); }} className=\"shrink-0 touch-none select-none\">\n {showHandle && (\n <div\n data-sheet-handle=\"\"\n role={multi ? \"button\" : undefined}\n tabIndex={multi ? 0 : undefined}\n aria-label={multi ? \"Change sheet height\" : undefined}\n onKeyDown={(e) => {\n if (!multi) return;\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowUp\") {\n e.preventDefault();\n goTo(e.key === \"ArrowUp\" ? Math.min(snaps.length - 1, snap + 1) : (snap + 1) % snaps.length);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n goTo(Math.max(0, snap - 1));\n }\n }}\n className={cn(\"flex cursor-grab justify-center pb-1 pt-3 active:cursor-grabbing\", multi && \"outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500 rounded-t-2xl\")}\n >\n <span aria-hidden=\"true\" className=\"h-1.5 w-10 rounded-full bg-gray-300\" />\n </div>\n )}\n {(title || description || showCloseButton) && (\n <div className=\"flex items-start justify-between gap-3 px-5 pb-2 pt-2\">\n <div className=\"min-w-0\">\n {title && (\n <h2 id={titleId} className=\"text-base font-semibold text-gray-900\">\n {title}\n </h2>\n )}\n {description && (\n <p id={descId} className=\"mt-0.5 text-sm text-gray-600\">\n {description}\n </p>\n )}\n </div>\n {showCloseButton && (\n <button\n type=\"button\"\n data-no-drag=\"\"\n onClick={close}\n aria-label=\"Close\"\n className=\"-mr-1 inline-flex shrink-0 items-center justify-center rounded-lg p-1 text-gray-500 outline-none transition-colors hover:bg-gray-100 hover:text-gray-800 focus-visible:ring-2 focus-visible:ring-primary-500 motion-reduce:transition-none\"\n >\n <RiCloseLine size={20} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n )}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-5 pb-4\">{children}</div>\n {footer && <div className=\"shrink-0 border-t border-gray-100 px-5 py-3\">{footer}</div>}\n </div>\n </div>,\n target,\n );\n};\n\nexport default BottomSheet;\n","\"use client\";\nimport React, { createContext, useCallback, useContext, useEffect, useId, useRef, useState } from \"react\";\nimport { RiAlertLine, RiCheckboxCircleLine, RiErrorWarningLine, RiInformationLine, RiQuestionLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Button from \"./Button\";\nimport Modal from \"./Modal\";\n\nexport type ConfirmVariant = \"default\" | \"info\" | \"danger\" | \"warning\" | \"success\";\n\nconst tone: Record<ConfirmVariant, { intent: \"primary\" | \"error\" | \"warning\" | \"success\"; icon: React.ReactNode; badge: string }> = {\n default: { intent: \"primary\", icon: <RiQuestionLine size={22} aria-hidden=\"true\" />, badge: \"bg-primary-100 text-primary-700\" },\n info: { intent: \"primary\", icon: <RiInformationLine size={22} aria-hidden=\"true\" />, badge: \"bg-primary-100 text-primary-700\" },\n danger: { intent: \"error\", icon: <RiErrorWarningLine size={22} aria-hidden=\"true\" />, badge: \"bg-error-100 text-error-700\" },\n warning: { intent: \"warning\", icon: <RiAlertLine size={22} aria-hidden=\"true\" />, badge: \"bg-warning-100 text-warning-700\" },\n success: { intent: \"success\", icon: <RiCheckboxCircleLine size={22} aria-hidden=\"true\" />, badge: \"bg-success-100 text-success-700\" },\n};\n\nexport interface ConfirmDialogProps {\n /** Whether the dialog is open. */\n open: boolean;\n /** Called with false when the dialog should close (Cancel, Escape, backdrop, or after a successful confirm). */\n onOpenChange: (open: boolean) => void;\n /** The question or heading. */\n title: React.ReactNode;\n /** Optional. A sentence that explains the consequence. */\n description?: React.ReactNode;\n /** Optional. Extra content under the description, such as a list or an input. */\n children?: React.ReactNode;\n /** Optional. Sets the icon and the confirm button colour. Use \"danger\" for deletes. Defaults to \"default\". */\n variant?: ConfirmVariant;\n /** Optional. Replace the icon, or pass null to hide it. */\n icon?: React.ReactNode;\n /** Optional. Confirm button text. Name the action, for example \"Delete project\". Defaults to \"Confirm\". */\n confirmText?: string;\n /** Optional. Cancel button text. Defaults to \"Cancel\". */\n cancelText?: string;\n /** Optional. Hide the cancel button, for a message that only needs \"OK\". Defaults to false. */\n hideCancel?: boolean;\n /** Optional. Runs when confirmed. Return a promise to show a loading state; the dialog closes when it resolves and stays open with the error if it throws. */\n onConfirm?: () => void | Promise<void>;\n /** Optional. Runs when the dialog is cancelled or dismissed. */\n onCancel?: () => void;\n /** Optional. Force the loading state yourself. */\n loading?: boolean;\n /** Optional. Disable the confirm button, for example until a box is ticked. */\n confirmDisabled?: boolean;\n /** Optional. Dialog width. Defaults to \"28rem\". */\n width?: string;\n}\n\nexport const ConfirmDialog = ({\n open,\n onOpenChange,\n title,\n description,\n children,\n variant = \"default\",\n icon,\n confirmText = \"Confirm\",\n cancelText = \"Cancel\",\n hideCancel = false,\n onConfirm,\n onCancel,\n loading: loadingProp,\n confirmDisabled = false,\n width = \"28rem\",\n}: ConfirmDialogProps) => {\n const uid = useId();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const loading = loadingProp ?? busy;\n const t = tone[variant];\n const cancelRef = useRef<HTMLButtonElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n\n // Choose the starting focus here instead of with autoFocus, so the dialog still remembers which\n // button opened it and can hand focus back. Danger dialogs start on Cancel.\n useEffect(() => {\n if (!open) return;\n const el = variant === \"danger\" && !hideCancel ? cancelRef.current : confirmRef.current;\n el?.focus({ preventScroll: true });\n }, [open, variant, hideCancel]);\n\n const cancel = () => {\n if (loading) return;\n setError(null);\n onCancel?.();\n onOpenChange(false);\n };\n\n const confirm = async () => {\n if (loading) return;\n setError(null);\n try {\n const r = onConfirm?.();\n if (r && typeof (r as Promise<void>).then === \"function\") {\n setBusy(true);\n await r;\n }\n onOpenChange(false);\n } catch (e) {\n setError(e instanceof Error && e.message ? e.message : \"Something went wrong. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n\n const shownIcon = icon === undefined ? t.icon : icon;\n\n return (\n <Modal\n showModal={open}\n setShowModal={(v) => {\n if (!v) cancel();\n }}\n closeModal={false}\n closeOnEscape={!loading}\n closeOnOutsideClick={!loading}\n width={width}\n aria-labelledby={`${uid}-title`}\n aria-describedby={description ? `${uid}-desc` : undefined}\n >\n <div className=\"flex gap-4 p-1\">\n {shownIcon && <div className={cn(\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full\", t.badge)}>{shownIcon}</div>}\n <div className=\"min-w-0 flex-1\">\n <h2 id={`${uid}-title`} className=\"text-base font-semibold text-gray-900\">\n {title}\n </h2>\n {description && (\n <p id={`${uid}-desc`} className=\"mt-1 text-sm text-gray-600\">\n {description}\n </p>\n )}\n {children && <div className=\"mt-3 text-sm text-gray-700\">{children}</div>}\n {error && (\n <p role=\"alert\" className=\"mt-3 rounded-lg bg-error-100 px-3 py-2 text-sm text-error-800\">\n {error}\n </p>\n )}\n </div>\n </div>\n <div className=\"mt-5 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n {!hideCancel && (\n // for destructive actions the safe choice gets the focus\n <Button ref={cancelRef} variant=\"outlined\" onClick={cancel} disabled={loading}>\n {cancelText}\n </Button>\n )}\n <Button\n ref={confirmRef}\n variant=\"filled\"\n intent={t.intent}\n onClick={confirm}\n loading={loading}\n disabled={confirmDisabled}\n >\n {confirmText}\n </Button>\n </div>\n </Modal>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Promise API: const confirm = useConfirm() */\n/* -------------------------------------------------------------------------- */\n\nexport type ConfirmOptions = Omit<ConfirmDialogProps, \"open\" | \"onOpenChange\" | \"onCancel\" | \"loading\">;\n\ntype ConfirmFn = (options: ConfirmOptions) => Promise<boolean>;\nconst ConfirmContext = createContext<ConfirmFn | null>(null);\n\nexport interface ConfirmProviderProps {\n children: React.ReactNode;\n}\n\n/** Wrap your app once. Then call `useConfirm()` anywhere to ask a question and await the answer. */\nexport const ConfirmProvider = ({ children }: ConfirmProviderProps) => {\n const [options, setOptions] = useState<ConfirmOptions | null>(null);\n const [open, setOpen] = useState(false);\n const resolver = useRef<((v: boolean) => void) | null>(null);\n\n const confirm = useCallback<ConfirmFn>((o) => {\n // a second call while one is open answers the first with \"no\"\n resolver.current?.(false);\n setOptions(o);\n setOpen(true);\n return new Promise<boolean>((resolve) => {\n resolver.current = resolve;\n });\n }, []);\n\n const finish = (answer: boolean) => {\n resolver.current?.(answer);\n resolver.current = null;\n setOpen(false);\n };\n\n return (\n <ConfirmContext.Provider value={confirm}>\n {children}\n {options && (\n <ConfirmDialog\n {...options}\n open={open}\n onOpenChange={() => undefined}\n // confirm resolves true only after onConfirm (if any) succeeded; every other close is \"no\"\n onConfirm={async () => {\n await options.onConfirm?.();\n finish(true);\n }}\n onCancel={() => finish(false)}\n />\n )}\n </ConfirmContext.Provider>\n );\n};\n\nexport const useConfirm = (): ConfirmFn => {\n const c = useContext(ConfirmContext);\n if (!c) throw new Error(\"useConfirm must be used inside <ConfirmProvider>.\");\n return c;\n};\n\nexport default ConfirmDialog;\n","\"use client\";\nimport React, { ReactNode, useEffect, useRef } from \"react\";\nimport { RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ninterface ModalProps {\n children?: ReactNode;\n showModal?: boolean;\n closeModal?: boolean;\n setShowModal: (value: boolean) => void;\n closeOnOutsideClick?: boolean;\n className?: string;\n width?: string;\n /** Optional. Close when Escape is pressed. Defaults to true. */\n closeOnEscape?: boolean;\n /** Optional. Accessible name for the dialog. Prefer aria-labelledby if you have a visible title. */\n \"aria-label\"?: string;\n /** Optional. id of the element that titles the dialog. */\n \"aria-labelledby\"?: string;\n /** Optional. id of the element that describes the dialog. */\n \"aria-describedby\"?: string;\n}\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]):not([type=\"hidden\"]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nexport default function Modal({\n children,\n showModal,\n setShowModal,\n closeModal = true,\n closeOnOutsideClick = true,\n className = \"\",\n width = \"50%\",\n closeOnEscape = true,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n}: ModalProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const pressStartedOnBackdrop = useRef(false);\n\n // Lock page scroll while open, and restore whatever value was there before.\n useEffect(() => {\n if (!showModal) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [showModal]);\n\n // Move focus into the dialog on open and hand it back on close.\n useEffect(() => {\n if (!showModal) return;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n const dialog = dialogRef.current;\n // Respect autoFocus inside the children.\n if (dialog && !dialog.contains(document.activeElement)) {\n dialog.focus();\n }\n return () => {\n previouslyFocused?.focus?.();\n };\n }, [showModal]);\n\n // Escape to close.\n useEffect(() => {\n if (!showModal || !closeOnEscape) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setShowModal(false);\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [showModal, closeOnEscape, setShowModal]);\n\n // Keep Tab / Shift+Tab inside the dialog.\n const handleDialogKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") return;\n const dialog = dialogRef.current;\n if (!dialog) return;\n const items = Array.from(dialog.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (items.length === 0) {\n event.preventDefault();\n dialog.focus();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === dialog)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n // Only close when the press AND the release both happen on the backdrop,\n // so selecting text inside the dialog and releasing outside doesn't close it.\n const handleBackdropMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n pressStartedOnBackdrop.current = event.target === event.currentTarget;\n };\n\n const handleClickOutside = (event: React.MouseEvent<HTMLDivElement>) => {\n if (\n event.target === event.currentTarget &&\n pressStartedOnBackdrop.current &&\n closeOnOutsideClick\n ) {\n setShowModal(false);\n }\n pressStartedOnBackdrop.current = false;\n };\n\n return (\n <>\n {showModal && (\n <div\n onMouseDown={handleBackdropMouseDown}\n onClick={handleClickOutside}\n className=\"w-full h-full bg-backdrop bg-blend-overlay backdrop-blur-[2px] fixed top-0 bottom-0 left-0 right-0 flex justify-center items-center z-[1000000] overflow-hidden\"\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n tabIndex={-1}\n onKeyDown={handleDialogKeyDown}\n style={{\n width,\n // never wider than the screen, never too narrow to use on phones\n maxWidth: \"calc(100vw - 2rem)\",\n minWidth: \"min(20rem, calc(100vw - 2rem))\",\n }}\n className={cn(\n \"relative bg-white shadow-boxShadow rounded-2xl border border-gray-100 p-[18px] transition-all duration-150 fade-in-grow mx-4\",\n // tall content scrolls inside the dialog instead of being cut off\n \"max-h-[calc(100dvh-2rem)] overflow-y-auto overscroll-contain\",\n \"focus:outline-none motion-reduce:transition-none motion-reduce:animate-none\",\n className,\n )}\n >\n <div>{children}</div>\n {closeModal && (\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={() => setShowModal(false)}\n className={cn(\n \"absolute top-4 right-5 z-10 inline-flex items-center justify-center rounded-lg p-1 cursor-pointer\",\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-100 hover:text-gray-800 active:bg-gray-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n )}\n >\n <RiCloseLine size={20} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n )}\n </>\n );\n}\n","\"use client\";\nimport React, { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface TagInputProps {\n /** Controlled tags. */\n value?: string[];\n /** Uncontrolled starting tags. */\n defaultValue?: string[];\n /** Called with the full list of tags when one is added or removed. */\n onChange?: (tags: string[]) => void;\n /** Optional. Words offered while typing. Tags already added are left out. */\n suggestions?: string[];\n /** Optional. Show the suggestions as soon as the field is focused, before typing. Defaults to false. */\n showSuggestionsOnFocus?: boolean;\n /** Optional. Let people add tags that are not in the suggestions. Defaults to true. */\n allowCustom?: boolean;\n /** Optional. Maximum number of tags. */\n maxTags?: number;\n /** Optional. Maximum characters in one tag. */\n maxLength?: number;\n /** Optional. Allow the same tag more than once. Defaults to false. Duplicates are compared ignoring case. */\n allowDuplicates?: boolean;\n /** Optional. Characters that end a tag while typing or pasting, in addition to Enter. Defaults to [\",\"]. */\n delimiters?: string[];\n /** Optional. Add the text left in the field when it loses focus. Defaults to true. */\n addOnBlur?: boolean;\n /** Optional. Return true to accept a tag, or false / a message to reject it. */\n validate?: (tag: string) => boolean | string;\n /** Optional. Change a tag before it is added, for example make it lowercase. */\n transform?: (tag: string) => string;\n /** Optional. Called when a tag is rejected, with the reason. */\n onInvalid?: (tag: string, reason: string) => void;\n /** Optional. Called as the person types. */\n onInputChange?: (text: string) => void;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n id?: string;\n /** Optional. Adds hidden inputs (one per tag) for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: boolean | \"true\" | \"false\";\n /** Optional. Called when the field loses focus. */\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n}\n\nconst same = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\n\nexport const TagInput = ({\n value,\n defaultValue = [],\n onChange,\n suggestions = [],\n showSuggestionsOnFocus = false,\n allowCustom = true,\n maxTags,\n maxLength,\n allowDuplicates = false,\n delimiters = [\",\"],\n addOnBlur = true,\n validate,\n transform,\n onInvalid,\n onInputChange,\n placeholder = \"Add a tag\",\n disabled = false,\n error = false,\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": ariaInvalid,\n onBlur,\n}: TagInputProps) => {\n const uid = useId();\n const inputId = id ?? `${uid}-input`;\n const listId = `${uid}-list`;\n const inputRef = useRef<HTMLInputElement>(null);\n const [inner, setInner] = useState<string[]>(defaultValue);\n const tags = value ?? inner;\n const [text, setText] = useState(\"\");\n const [focused, setFocused] = useState(false);\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(-1);\n const [notice, setNotice] = useState(\"\");\n const [status, setStatus] = useState(\"\");\n\n const setTags = (next: string[]) => {\n if (value === undefined) setInner(next);\n onChange?.(next);\n };\n\n const query = text.trim();\n const options = useMemo(() => {\n const q = query.toLowerCase();\n const list = suggestions.filter((s) => !tags.some((t) => same(t, s)) && (!q || s.toLowerCase().includes(q)));\n const rows = list.map((s) => ({ label: s, create: false }));\n // offer the typed text as its own row when it is new\n if (allowCustom && query && !suggestions.some((s) => same(s, query)) && !tags.some((t) => same(t, query))) {\n rows.push({ label: query, create: true });\n }\n return rows;\n }, [suggestions, tags, query, allowCustom]);\n\n const listOpen = open && focused && !disabled && options.length > 0 && (showSuggestionsOnFocus || !!query);\n\n useEffect(() => setActive(-1), [query]);\n\n const reject = (tag: string, reason: string) => {\n setNotice(reason);\n setStatus(reason);\n onInvalid?.(tag, reason);\n };\n\n const commit = (raws: string[]): boolean => {\n let next = [...tags];\n let added = 0;\n for (const raw of raws) {\n let tag = raw.trim();\n if (!tag) continue;\n if (transform) tag = transform(tag).trim();\n if (!tag) continue;\n if (maxLength && tag.length > maxLength) {\n reject(tag, `Tags can be at most ${maxLength} characters.`);\n continue;\n }\n if (maxTags && next.length >= maxTags) {\n reject(tag, `You can add up to ${maxTags} tags.`);\n break;\n }\n if (!allowCustom && !suggestions.some((s) => same(s, tag))) {\n reject(tag, `\"${tag}\" is not in the list.`);\n continue;\n }\n if (!allowDuplicates && next.some((t) => same(t, tag))) {\n reject(tag, `\"${tag}\" is already added.`);\n continue;\n }\n if (validate) {\n const r = validate(tag);\n if (r !== true) {\n reject(tag, typeof r === \"string\" && r ? r : `\"${tag}\" is not valid.`);\n continue;\n }\n }\n next = [...next, tag];\n added += 1;\n setStatus(`${tag} added. ${next.length} ${next.length === 1 ? \"tag\" : \"tags\"}.`);\n }\n if (added) {\n setTags(next);\n setNotice(\"\");\n }\n return added > 0;\n };\n\n const remove = (index: number) => {\n const tag = tags[index];\n setTags(tags.filter((_, i) => i !== index));\n setStatus(`${tag} removed.`);\n setNotice(\"\");\n inputRef.current?.focus();\n };\n\n const change = (v: string) => {\n // a typed delimiter ends the tag\n const hit = delimiters.find((d) => v.includes(d));\n if (hit) {\n const parts = v.split(hit);\n const rest = parts.pop() ?? \"\";\n commit(parts);\n setText(rest);\n onInputChange?.(rest);\n } else {\n setText(v);\n onInputChange?.(v);\n }\n setOpen(true);\n if (notice) setNotice(\"\");\n };\n\n const finishText = () => {\n if (commit([text])) {\n setText(\"\");\n onInputChange?.(\"\");\n }\n };\n\n const pick = (label: string) => {\n if (commit([label])) {\n setText(\"\");\n onInputChange?.(\"\");\n }\n setActive(-1);\n inputRef.current?.focus();\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n if (!options.length) return;\n e.preventDefault();\n if (!listOpen) {\n setOpen(true);\n setActive(e.key === \"ArrowDown\" ? 0 : options.length - 1);\n return;\n }\n const n = options.length;\n setActive((a) => (e.key === \"ArrowDown\" ? (a + 1) % n : (a - 1 + n) % n));\n } else if (e.key === \"Enter\") {\n // never submit a surrounding form from here\n e.preventDefault();\n if (listOpen && active >= 0) pick(options[active].label);\n else finishText();\n } else if (e.key === \"Escape\") {\n if (listOpen) {\n e.preventDefault();\n e.stopPropagation();\n setOpen(false);\n setActive(-1);\n }\n } else if (e.key === \"Backspace\" && !text && tags.length) {\n remove(tags.length - 1);\n }\n };\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const raw = e.clipboardData.getData(\"text\");\n const seps = [...delimiters, \"\\n\", \"\\r\", \"\\t\", \";\"];\n if (!seps.some((s) => raw.includes(s))) return;\n e.preventDefault();\n const parts = raw.split(new RegExp(`[${seps.map((s) => s.replace(/[\\]\\\\^-]/g, \"\\\\$&\")).join(\"\")}]`)).filter((s) => s.trim());\n commit(parts);\n };\n\n const full = !!maxTags && tags.length >= maxTags;\n\n return (\n <div className={cn(\"relative\", className)}>\n <div\n onMouseDown={(e) => {\n if (disabled) return;\n if ((e.target as HTMLElement).closest(\"button\")) return;\n // clicking the empty part of the box focuses the field\n if (e.target !== inputRef.current) {\n e.preventDefault();\n inputRef.current?.focus();\n }\n }}\n className={cn(\n \"flex min-h-10 w-full cursor-text flex-wrap items-center gap-1.5 rounded-xl border border-gray-200 bg-white px-2.5 py-1.5 shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:border-gray-300 hover:bg-gray-50 focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n error && \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n disabled && \"cursor-not-allowed opacity-60 hover:border-gray-200 hover:bg-white\",\n )}\n >\n <ul className=\"contents\" aria-label={ariaLabel ? `${ariaLabel}, selected` : \"Selected tags\"}>\n {tags.map((t, i) => (\n <li\n key={`${t}-${i}`}\n className=\"inline-flex max-w-[200px] items-center gap-1 rounded-md bg-primary-50 py-0.5 pl-2 pr-1 text-xs font-medium text-primary-700\"\n >\n <span className=\"truncate\">{t}</span>\n {!disabled && (\n <button\n type=\"button\"\n aria-label={`Remove ${t}`}\n onClick={() => remove(i)}\n className=\"inline-flex rounded p-0.5 outline-none hover:bg-primary-100 focus-visible:ring-2 focus-visible:ring-primary-500\"\n >\n <RiCloseLine size={14} aria-hidden=\"true\" />\n </button>\n )}\n </li>\n ))}\n </ul>\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={listOpen}\n aria-controls={listOpen ? listId : undefined}\n aria-activedescendant={listOpen && active >= 0 ? `${uid}-opt-${active}` : undefined}\n aria-autocomplete=\"list\"\n aria-label={ariaLabel}\n aria-describedby={cn(describedBy, notice && `${uid}-notice`) || undefined}\n aria-invalid={ariaInvalid ?? (error || !!notice || undefined)}\n autoComplete=\"off\"\n disabled={disabled}\n value={text}\n maxLength={undefined}\n placeholder={tags.length ? (full ? \"\" : \"\") : placeholder}\n onChange={(e) => change(e.target.value)}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onFocus={() => {\n setFocused(true);\n setOpen(true);\n }}\n onBlur={(e) => {\n setFocused(false);\n setOpen(false);\n if (addOnBlur && text.trim()) finishText();\n onBlur?.(e);\n }}\n className=\"min-w-[8ch] flex-1 bg-transparent py-0.5 text-sm text-gray-900 outline-none placeholder:text-gray-400 disabled:cursor-not-allowed\"\n />\n </div>\n\n {listOpen && (\n <ul\n id={listId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n // keep focus in the input while using the mouse\n onMouseDown={(e) => e.preventDefault()}\n className=\"absolute left-0 z-50 mt-1 max-h-56 w-full min-w-[200px] overflow-y-auto rounded-xl border border-gray-200 bg-white p-1 shadow-lg\"\n >\n {options.map((o, i) => (\n <li\n key={`${o.label}-${o.create}`}\n id={`${uid}-opt-${i}`}\n role=\"option\"\n aria-selected={i === active}\n onMouseEnter={() => setActive(i)}\n onClick={() => pick(o.label)}\n className={cn(\"cursor-pointer rounded-lg px-3 py-2 text-sm text-gray-900\", i === active && \"bg-gray-100\")}\n >\n {o.create ? (\n <>\n Add <span className=\"font-medium\">&ldquo;{o.label}&rdquo;</span>\n </>\n ) : (\n o.label\n )}\n </li>\n ))}\n </ul>\n )}\n\n {notice && (\n <p id={`${uid}-notice`} className=\"mt-1 text-xs text-error-700\">\n {notice}\n </p>\n )}\n\n {/* spoken updates for adds, removals and rejected tags */}\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {status}\n </span>\n\n {name && tags.map((t, i) => <input key={`${t}-${i}`} type=\"hidden\" name={name} value={t} />)}\n </div>\n );\n};\n\nexport default TagInput;\n","\"use client\";\nimport React, { useId } from \"react\";\nimport { RiArrowDownLine, RiArrowRightLine, RiArrowUpLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ntype Trend = \"up\" | \"down\" | \"neutral\";\n\nexport interface StatCardProps extends Omit<React.HTMLAttributes<HTMLElement>, \"children\" | \"title\"> {\n /** What is being measured, for example \"Active users\". */\n label: React.ReactNode;\n /** The headline figure. Pass it already formatted, for example \"12,480\" or \"$4.2k\". */\n value: React.ReactNode;\n /** Optional. The change. A number is shown as a percentage (\"12\" becomes \"12%\"); a string is shown as given (\"+340\" or \"2.1 pts\"). */\n delta?: number | string;\n /** Optional. Short text after the change, such as \"vs last month\". */\n deltaLabel?: string;\n /** Optional. Direction of the change. Worked out from the sign of delta when left out. */\n trend?: Trend;\n /** Optional. Set when a lower number is better (costs, churn, errors), so a drop shows as good news. Defaults to false. */\n lowerIsBetter?: boolean;\n /** Optional. A short line under the value. */\n description?: React.ReactNode;\n /** Optional. An icon shown in a rounded tile at the top right. */\n icon?: React.ReactNode;\n /** Optional. A small trend line drawn from these values, oldest first. */\n sparkline?: number[];\n /** Optional. Show placeholder bars while the numbers load. Defaults to false. */\n loading?: boolean;\n /** Optional. Make the whole card a link. */\n href?: string;\n /** Optional. Make the whole card a button. Ignored when href is set. */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /** Optional. Content under the figures, such as a small action or note. */\n footer?: React.ReactNode;\n}\n\nconst inferTrend = (delta: number | string | undefined): Trend => {\n if (delta === undefined) return \"neutral\";\n if (typeof delta === \"number\") return delta > 0 ? \"up\" : delta < 0 ? \"down\" : \"neutral\";\n const s = delta.trim();\n if (/^[-−–]/.test(s)) return \"down\";\n if (s.startsWith(\"+\")) return \"up\";\n return \"neutral\";\n};\n\nconst Sparkline = ({ data, className }: { data: number[]; className?: string }) => {\n if (data.length < 2) return null;\n const w = 96;\n const h = 32;\n const min = Math.min(...data);\n const max = Math.max(...data);\n const span = max - min || 1;\n const pts = data.map((v, i) => [(i / (data.length - 1)) * w, h - 3 - ((v - min) / span) * (h - 6)] as const);\n const line = pts.map(([x, y]) => `${x.toFixed(1)},${y.toFixed(1)}`).join(\" \");\n const area = `0,${h} ${line} ${w},${h}`;\n return (\n <svg aria-hidden=\"true\" focusable=\"false\" viewBox={`0 0 ${w} ${h}`} preserveAspectRatio=\"none\" className={cn(\"h-8 w-24 shrink-0 overflow-visible\", className)}>\n <polygon points={area} fill=\"currentColor\" opacity=\"0.12\" />\n <polyline points={line} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" vectorEffect=\"non-scaling-stroke\" />\n </svg>\n );\n};\n\nexport const StatCard = ({\n label,\n value,\n delta,\n deltaLabel,\n trend,\n lowerIsBetter = false,\n description,\n icon,\n sparkline,\n loading = false,\n href,\n onClick,\n footer,\n className,\n ...rest\n}: StatCardProps) => {\n const uid = useId();\n const dir: Trend = trend ?? inferTrend(delta);\n const good = dir === \"neutral\" ? null : (dir === \"up\") !== lowerIsBetter;\n const tone = good === null ? \"neutral\" : good ? \"good\" : \"bad\";\n const chip = { good: \"bg-success-100 text-success-700\", bad: \"bg-error-100 text-error-700\", neutral: \"bg-gray-100 text-gray-700\" }[tone];\n const line = { good: \"text-success-600\", bad: \"text-error-600\", neutral: \"text-gray-400\" }[tone];\n const Arrow = dir === \"up\" ? RiArrowUpLine : dir === \"down\" ? RiArrowDownLine : RiArrowRightLine;\n const deltaText = typeof delta === \"number\" ? `${Math.abs(delta)}%` : (delta ?? \"\").replace(/^[-−–+]\\s*/, \"\");\n const lead = dir === \"up\" ? \"Up\" : dir === \"down\" ? \"Down\" : typeof delta === \"number\" ? \"No change\" : \"\";\n const spoken = `${lead}${lead && deltaText && dir !== \"neutral\" ? \" \" : \"\"}${dir === \"neutral\" && typeof delta === \"number\" ? \"\" : deltaText}${tone === \"good\" ? \", favourable\" : tone === \"bad\" ? \", unfavourable\" : \"\"}${deltaLabel ? ` ${deltaLabel}` : \"\"}`;\n\n const interactive = !!href || !!onClick;\n const Root: React.ElementType = href ? \"a\" : onClick ? \"button\" : \"div\";\n\n const body = loading ? (\n <>\n <span className=\"sr-only\">Loading {typeof label === \"string\" ? label : \"statistic\"}</span>\n <div aria-hidden=\"true\" className=\"animate-pulse motion-reduce:animate-none\">\n <div className=\"h-3.5 w-24 rounded bg-gray-200\" />\n <div className=\"mt-4 h-8 w-32 rounded bg-gray-200\" />\n <div className=\"mt-4 h-3.5 w-40 rounded bg-gray-100\" />\n </div>\n </>\n ) : (\n <>\n <div className=\"flex items-start justify-between gap-3\">\n <p id={`${uid}-label`} className=\"text-sm font-medium text-gray-600\">\n {label}\n </p>\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-primary-100 text-primary-700\">\n {icon}\n </span>\n )}\n </div>\n <div className=\"mt-2 flex items-end justify-between gap-3\">\n <p aria-labelledby={undefined} className=\"text-3xl font-semibold tracking-tight text-gray-900\">\n {value}\n </p>\n {sparkline && <Sparkline data={sparkline} className={line} />}\n </div>\n {(delta !== undefined || description) && (\n <div className=\"mt-3 flex flex-wrap items-center gap-x-2 gap-y-1 text-sm\">\n {delta !== undefined && (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className={cn(\"inline-flex items-center gap-0.5 rounded-full px-2 py-0.5 text-xs font-medium\", chip)}>\n <Arrow size={14} aria-hidden=\"true\" />\n <span aria-hidden=\"true\">{deltaText}</span>\n <span className=\"sr-only\">{spoken}</span>\n </span>\n {deltaLabel && (\n <span aria-hidden=\"true\" className=\"text-gray-500\">\n {deltaLabel}\n </span>\n )}\n </span>\n )}\n {description && <span className=\"text-gray-500\">{description}</span>}\n </div>\n )}\n {footer && <div className=\"mt-3 border-t border-gray-100 pt-3 text-sm\">{footer}</div>}\n </>\n );\n\n return (\n <Root\n {...rest}\n {...(href ? { href } : {})}\n {...(onClick && !href ? { type: \"button\", onClick } : {})}\n aria-busy={loading || undefined}\n className={cn(\n \"block w-full rounded-2xl border border-gray-200 bg-white p-5 text-left shadow-[0px_1px_2px_0px_#1018280D]\",\n interactive &&\n \"cursor-pointer outline-none transition-[border-color,box-shadow] duration-200 hover:border-gray-300 hover:shadow-md focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 motion-reduce:transition-none\",\n className,\n )}\n >\n {body}\n </Root>\n );\n};\n\nexport default StatCard;\n","\"use client\";\nimport React, { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../utils/utils\";\n\n/* -------------------------------------------------------------------------- */\n/* Colours: a fixed-order categorical palette, validated for colour-blind */\n/* separation. Light and dark values live in one place, below. */\n/* -------------------------------------------------------------------------- */\n\nconst CHART_CSS = `\n.gx-chart{color-scheme:light;--gx-s1:#2a78d6;--gx-s2:#eb6834;--gx-s3:#1baf7a;--gx-s4:#eda100;--gx-s5:#e87ba4;--gx-s6:#008300;--gx-s7:#6250d6;--gx-s8:#e34948;\n--gx-surface:#fcfcfb;--gx-ink:#0b0b0b;--gx-ink2:#52514e;--gx-muted:#898781;--gx-grid:#e1e0d9;--gx-axis:#c3c2b7;--gx-border:rgba(11,11,11,.10)}\n:root[data-genesis-mode=\"dark\"] .gx-chart{color-scheme:dark;--gx-s1:#3987e5;--gx-s2:#d95926;--gx-s3:#199e70;--gx-s4:#c98500;--gx-s5:#d55181;--gx-s6:#008300;--gx-s7:#9085e9;--gx-s8:#e66767;\n--gx-surface:#1a1a19;--gx-ink:#f0efec;--gx-ink2:#c3c2b7;--gx-muted:#898781;--gx-grid:#2c2c2a;--gx-axis:#383835;--gx-border:rgba(255,255,255,.10)}\n`;\n\nconst MAX_SERIES = 8;\nconst colorOf = (i: number) => `var(--gx-s${(i % MAX_SERIES) + 1})`;\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport interface ChartSeries {\n /** The key in each data row that holds this series' number. */\n key: string;\n /** Optional. Name shown in the legend and tooltip. Defaults to the key. */\n label?: string;\n}\n\ntype Cell = string | number | null | undefined;\n\ninterface ChartBaseProps {\n /** One object per x position (or per category), for example `{ month: \"Jan\", sales: 120, refunds: 8 }`. */\n data: Record<string, Cell>[];\n /** The key in each row that holds the x label or category name. */\n index: string;\n /** The numeric series to plot. Up to 8; each keeps its colour for good, whichever are shown. */\n series: (string | ChartSeries)[];\n /** Optional. Heading above the chart. Also names the chart for screen readers. */\n title?: React.ReactNode;\n /** Optional. A short sentence under the title. */\n description?: React.ReactNode;\n /** Optional. Plot height in px, including the axis labels. Defaults to 280. */\n height?: number;\n /** Optional. Formats values in the tooltip, labels and axis, for example `(v) => \"$\" + v`. */\n valueFormat?: (value: number) => string;\n /** Optional. Formats the x labels and category names. */\n indexFormat?: (value: string) => string;\n /** Optional. Show the legend. Shown automatically for two or more series. */\n showLegend?: boolean;\n /** Optional. Show the \"View as table\" switch. Defaults to true. */\n showTableToggle?: boolean;\n /** Optional. Start with the table instead of the chart. Defaults to false. */\n defaultView?: \"chart\" | \"table\";\n /** Optional. Text for an empty data set. */\n emptyText?: string;\n className?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nconst normSeries = (s: (string | ChartSeries)[]) =>\n s.slice(0, MAX_SERIES).map((x, i) => {\n const o = typeof x === \"string\" ? { key: x } : x;\n return { key: o.key, label: o.label ?? o.key, color: colorOf(i), i };\n });\n\nconst num = (v: Cell): number | null => (typeof v === \"number\" && Number.isFinite(v) ? v : null);\n\nconst niceScale = (min: number, max: number, count = 5) => {\n if (min === max) {\n max = max + 1;\n if (min > 0) min = 0;\n }\n const rough = (max - min) / count;\n const pow = 10 ** Math.floor(Math.log10(rough));\n const f = rough / pow;\n const step = (f <= 1 ? 1 : f <= 2 ? 2 : f <= 5 ? 5 : 10) * pow;\n const lo = Math.floor(min / step) * step;\n const hi = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n for (let v = lo; v <= hi + step / 2; v += step) ticks.push(Math.round(v * 1e10) / 1e10);\n return { lo, hi, ticks };\n};\n\nconst compact = (n: number) => {\n const a = Math.abs(n);\n if (a >= 1e9) return `${+(n / 1e9).toFixed(1)}B`;\n if (a >= 1e6) return `${+(n / 1e6).toFixed(1)}M`;\n if (a >= 1e4) return `${+(n / 1e3).toFixed(1)}K`;\n return n.toLocaleString();\n};\n\nconst textW = (s: string, size = 11) => s.length * size * 0.57;\n\nconst useWidth = (ref: React.RefObject<HTMLElement>) => {\n const [w, setW] = useState(0);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n setW(el.clientWidth);\n const ro = new ResizeObserver(() => setW(el.clientWidth));\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref]);\n return w;\n};\n\n/** x labels that fit without touching: show every nth. */\nconst labelEvery = (labels: string[], spacing: number) => {\n const widest = Math.max(0, ...labels.map((l) => textW(l))) + 12;\n return Math.max(1, Math.ceil(widest / Math.max(1, spacing)));\n};\n\n/* -------------------------------------------------------------------------- */\n/* Shared shell: title, legend, table view, tooltip */\n/* -------------------------------------------------------------------------- */\n\ninterface ShellProps extends ChartBaseProps {\n kind: \"line\" | \"bar\";\n sers: ReturnType<typeof normSeries>;\n hidden: Set<string>;\n setHidden: (s: Set<string>) => void;\n children: (width: number) => React.ReactNode;\n readout: string;\n summary: string;\n}\n\nconst Shell = ({\n kind,\n sers,\n hidden,\n setHidden,\n title,\n description,\n data,\n index,\n valueFormat,\n indexFormat,\n showLegend,\n showTableToggle = true,\n defaultView = \"chart\",\n emptyText = \"No data to show\",\n className,\n height = 280,\n children,\n readout,\n summary,\n}: ShellProps) => {\n const uid = useId();\n const [view, setView] = useState(defaultView);\n const boxRef = useRef<HTMLDivElement>(null);\n const width = useWidth(boxRef);\n const legend = showLegend ?? sers.length >= 2;\n const fmt = valueFormat ?? ((v: number) => v.toLocaleString());\n const fmtX = indexFormat ?? ((v: string) => v);\n\n const toggle = (key: string) => {\n const next = new Set(hidden);\n if (next.has(key)) next.delete(key);\n else if (sers.length - next.size > 1) next.add(key); // keep at least one visible\n setHidden(next);\n };\n\n return (\n <figure className={cn(\"gx-chart m-0 w-full text-gray-900\", className)} aria-labelledby={title ? `${uid}-t` : undefined}>\n <style>{CHART_CSS}</style>\n {(title || description || showTableToggle) && (\n <figcaption className=\"mb-3 flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n {title && (\n <div id={`${uid}-t`} className=\"text-sm font-semibold\" style={{ color: \"var(--gx-ink)\" }}>\n {title}\n </div>\n )}\n {description && (\n <div className=\"mt-0.5 text-sm\" style={{ color: \"var(--gx-ink2)\" }}>\n {description}\n </div>\n )}\n </div>\n {showTableToggle && data.length > 0 && (\n <button\n type=\"button\"\n onClick={() => setView(view === \"chart\" ? \"table\" : \"chart\")}\n aria-pressed={view === \"table\"}\n className=\"shrink-0 rounded-lg border px-2.5 py-1 text-xs font-medium outline-none hover:bg-gray-50 focus-visible:ring-2 focus-visible:ring-primary-500\"\n style={{ color: \"var(--gx-ink2)\", borderColor: \"var(--gx-border)\" }}\n >\n {view === \"chart\" ? \"View as table\" : \"View as chart\"}\n </button>\n )}\n </figcaption>\n )}\n\n {legend && view === \"chart\" && (\n <ul className=\"mb-3 flex flex-wrap gap-x-4 gap-y-1 p-0\" style={{ listStyle: \"none\" }} aria-label=\"Legend\">\n {sers.map((s) => {\n const off = hidden.has(s.key);\n return (\n <li key={s.key}>\n <button\n type=\"button\"\n aria-pressed={!off}\n onClick={() => toggle(s.key)}\n className=\"inline-flex items-center gap-1.5 rounded text-xs outline-none focus-visible:ring-2 focus-visible:ring-primary-500\"\n style={{ color: \"var(--gx-ink2)\", opacity: off ? 0.5 : 1 }}\n >\n {kind === \"line\" ? (\n <span aria-hidden=\"true\" style={{ width: 14, height: 2, background: s.color, borderRadius: 1, display: \"inline-block\" }} />\n ) : (\n <span aria-hidden=\"true\" style={{ width: 10, height: 10, background: s.color, borderRadius: 2, display: \"inline-block\" }} />\n )}\n <span style={{ textDecoration: off ? \"line-through\" : \"none\" }}>{s.label}</span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n\n {data.length === 0 ? (\n <div className=\"flex items-center justify-center rounded-xl border border-dashed text-sm\" style={{ height, color: \"var(--gx-muted)\", borderColor: \"var(--gx-grid)\" }}>\n {emptyText}\n </div>\n ) : view === \"table\" ? (\n <div className=\"max-h-96 overflow-auto rounded-xl border\" style={{ borderColor: \"var(--gx-border)\" }}>\n <table className=\"w-full border-collapse text-left text-sm\">\n <caption className=\"sr-only\">{typeof title === \"string\" ? title : \"Chart data\"}</caption>\n <thead>\n <tr style={{ background: \"var(--gx-grid)\" }}>\n <th scope=\"col\" className=\"px-3 py-2 font-medium\" style={{ color: \"var(--gx-ink)\" }}>\n {index}\n </th>\n {sers.map((s) => (\n <th key={s.key} scope=\"col\" className=\"px-3 py-2 text-right font-medium\" style={{ color: \"var(--gx-ink)\" }}>\n {s.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row, r) => (\n <tr key={r} className=\"border-t\" style={{ borderColor: \"var(--gx-grid)\" }}>\n <th scope=\"row\" className=\"px-3 py-1.5 font-normal\" style={{ color: \"var(--gx-ink)\" }}>\n {fmtX(String(row[index] ?? \"\"))}\n </th>\n {sers.map((s) => {\n const v = num(row[s.key]);\n return (\n <td key={s.key} className=\"px-3 py-1.5 text-right tabular-nums\" style={{ color: \"var(--gx-ink2)\" }}>\n {v === null ? \"–\" : fmt(v)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <div ref={boxRef} className=\"relative w-full\" style={{ height }}>\n {width > 0 && children(width)}\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {readout}\n </div>\n <span id={`${uid}-sum`} className=\"sr-only\">\n {summary}\n </span>\n </div>\n )}\n </figure>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Tooltip box */\n/* -------------------------------------------------------------------------- */\n\nconst Tooltip = ({\n left,\n top,\n flip,\n heading,\n rows,\n}: {\n left: number;\n top: number;\n flip: boolean;\n heading: string;\n rows: { label: string; value: string; color: string; bold?: boolean }[];\n}) => (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-10 min-w-[120px] rounded-lg border px-3 py-2 text-xs shadow-lg\"\n style={{\n left,\n top,\n transform: `translateX(${flip ? \"calc(-100% - 12px)\" : \"12px\"})`,\n background: \"var(--gx-surface)\",\n borderColor: \"var(--gx-border)\",\n color: \"var(--gx-ink)\",\n }}\n >\n <div className=\"mb-1 font-medium\" style={{ color: \"var(--gx-ink2)\" }}>\n {heading}\n </div>\n {rows.map((r) => (\n <div key={r.label} className=\"flex items-center gap-2 py-0.5\">\n <span style={{ width: 10, height: 2, background: r.color, borderRadius: 1, display: \"inline-block\" }} />\n <span className=\"font-semibold tabular-nums\">{r.value}</span>\n <span style={{ color: \"var(--gx-ink2)\" }}>{r.label}</span>\n </div>\n ))}\n </div>\n);\n\n/* -------------------------------------------------------------------------- */\n/* LineChart */\n/* -------------------------------------------------------------------------- */\n\nexport interface LineChartProps extends ChartBaseProps {\n /** Optional. Fill under each line with a light wash of its colour. Defaults to false. */\n area?: boolean;\n /** Optional. Where the y axis starts. Defaults to 0. Use \"auto\" to fit the data, which exaggerates small changes. */\n yMin?: number | \"auto\";\n}\n\nexport const LineChart = (props: LineChartProps) => {\n const { data, index, series, height = 280, area = false, yMin = 0, valueFormat, indexFormat } = props;\n const sers = useMemo(() => normSeries(series), [series]);\n const [hidden, setHidden] = useState<Set<string>>(new Set());\n const [active, setActive] = useState<number | null>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const shown = sers.filter((s) => !hidden.has(s.key));\n const fmt = valueFormat ?? ((v: number) => v.toLocaleString());\n const fmtX = indexFormat ?? ((v: string) => v);\n const labels = data.map((d) => fmtX(String(d[index] ?? \"\")));\n\n const vals = shown.flatMap((s) => data.map((d) => num(d[s.key]))).filter((v): v is number => v !== null);\n const dMin = vals.length ? Math.min(...vals) : 0;\n const dMax = vals.length ? Math.max(...vals) : 1;\n const sc = niceScale(yMin === \"auto\" ? dMin : Math.min(yMin, dMin), dMax);\n const axisFmt = valueFormat ?? (sc.hi >= 1e4 ? compact : (v: number) => v.toLocaleString());\n\n const readout =\n active === null ? \"\" : `${labels[active]}: ${shown.map((s) => `${s.label} ${num(data[active][s.key]) === null ? \"no data\" : fmt(num(data[active][s.key]) as number)}`).join(\", \")}`;\n\n return (\n <Shell\n {...props}\n kind=\"line\"\n sers={sers}\n hidden={hidden}\n setHidden={setHidden}\n readout={readout}\n summary={`Line chart, ${sers.length} ${sers.length === 1 ? \"series\" : \"series\"}, ${data.length} points.`}\n >\n {(width) => {\n const yLabelW = Math.max(...sc.ticks.map((t) => textW(axisFmt(t)))) + 8;\n const n = data.length;\n // value at the end of each line when it will not collide\n const ends = shown.map((s) => {\n for (let i = n - 1; i >= 0; i--) {\n const v = num(data[i][s.key]);\n if (v !== null) return { s, v };\n }\n return null;\n });\n const m = { t: 12, r: 12, b: 28, l: yLabelW + 8 };\n const plotW = Math.max(10, width - m.l - m.r);\n const plotH = Math.max(10, height - m.t - m.b);\n const y = (v: number) => m.t + plotH - ((v - sc.lo) / (sc.hi - sc.lo)) * plotH;\n const xStep = n > 1 ? plotW / (n - 1) : 0;\n const x = (i: number) => m.l + (n > 1 ? i * xStep : plotW / 2);\n const showEnds = shown.length <= 4 && n > 1;\n const endYs = ends.filter(Boolean).map((e) => y((e as { v: number }).v)).sort((a, b) => a - b);\n const collide = endYs.some((v, i) => i > 0 && v - endYs[i - 1] < 14);\n const rightPad = showEnds && !collide ? Math.max(...ends.map((e) => (e ? textW(fmt(e.v), 12) : 0))) + 14 : 0;\n const plotW2 = Math.max(10, plotW - rightPad);\n const x2 = (i: number) => m.l + (n > 1 ? i * (plotW2 / (n - 1)) : plotW2 / 2);\n const every = labelEvery(labels, n > 1 ? plotW2 / (n - 1) : plotW2);\n\n const move = (clientX: number) => {\n const r = svgRef.current?.getBoundingClientRect();\n if (!r || n === 0) return;\n const px = clientX - r.left - m.l;\n setActive(n > 1 ? Math.max(0, Math.min(n - 1, Math.round(px / (plotW2 / (n - 1))))) : 0);\n };\n\n const paths = shown.map((s) => {\n const segs: string[][] = [];\n let cur: string[] = [];\n data.forEach((d, i) => {\n const v = num(d[s.key]);\n if (v === null) {\n if (cur.length) segs.push(cur);\n cur = [];\n } else cur.push(`${x2(i).toFixed(1)},${y(v).toFixed(1)}`);\n });\n if (cur.length) segs.push(cur);\n return { s, segs };\n });\n const base = y(Math.max(sc.lo, Math.min(0, sc.hi)));\n\n return (\n <>\n <div\n role=\"group\"\n aria-label={`${typeof props.title === \"string\" ? props.title + \". \" : \"\"}Line chart. Use the left and right arrow keys to read each point, or switch to the table.`}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\") setActive((a) => Math.min(n - 1, (a ?? -1) + 1));\n else if (e.key === \"ArrowLeft\") setActive((a) => Math.max(0, (a ?? n) - 1));\n else if (e.key === \"Home\") setActive(0);\n else if (e.key === \"End\") setActive(n - 1);\n else if (e.key === \"Escape\") setActive(null);\n else return;\n e.preventDefault();\n }}\n onBlur={() => setActive(null)}\n className=\"h-full w-full rounded-lg outline-none focus-visible:ring-2 focus-visible:ring-primary-500\"\n >\n <svg ref={svgRef} width={width} height={height} className=\"block overflow-visible\" aria-hidden=\"true\">\n {sc.ticks.map((t) => (\n <g key={t}>\n <line x1={m.l} x2={m.l + plotW2} y1={y(t)} y2={y(t)} stroke={t === 0 ? \"var(--gx-axis)\" : \"var(--gx-grid)\"} strokeWidth={1} />\n <text x={m.l - 8} y={y(t)} textAnchor=\"end\" dominantBaseline=\"middle\" fontSize={11} fill=\"var(--gx-muted)\">\n {axisFmt(t)}\n </text>\n </g>\n ))}\n {labels.map((l, i) =>\n i % every === 0 ? (\n <text key={i} x={x2(i)} y={m.t + plotH + 18} textAnchor=\"middle\" fontSize={11} fill=\"var(--gx-muted)\">\n {l}\n </text>\n ) : null,\n )}\n {active !== null && <line x1={x2(active)} x2={x2(active)} y1={m.t} y2={m.t + plotH} stroke=\"var(--gx-axis)\" strokeWidth={1} />}\n {paths.map(({ s, segs }) => (\n <g key={s.key}>\n {area &&\n segs.map((seg, k) => (\n <polygon\n key={k}\n points={`${seg[0].split(\",\")[0]},${base} ${seg.join(\" \")} ${seg[seg.length - 1].split(\",\")[0]},${base}`}\n fill={s.color}\n opacity={0.1}\n />\n ))}\n {segs.map((seg, k) =>\n seg.length === 1 ? (\n <circle key={k} cx={+seg[0].split(\",\")[0]} cy={+seg[0].split(\",\")[1]} r={4} fill={s.color} stroke=\"var(--gx-surface)\" strokeWidth={2} />\n ) : (\n <polyline key={k} points={seg.join(\" \")} fill=\"none\" stroke={s.color} strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n ),\n )}\n </g>\n ))}\n {/* end dots and, when they do not collide, the end values */}\n {ends.map((e) => {\n if (!e) return null;\n const idx = data.map((d) => num(d[e.s.key])).lastIndexOf(e.v);\n const cx = x2(idx);\n return (\n <g key={e.s.key}>\n <circle cx={cx} cy={y(e.v)} r={4} fill={e.s.color} stroke=\"var(--gx-surface)\" strokeWidth={2} />\n {rightPad > 0 && (\n <text x={cx + 10} y={y(e.v)} dominantBaseline=\"middle\" fontSize={12} fontWeight={600} fill=\"var(--gx-ink)\">\n {fmt(e.v)}\n </text>\n )}\n </g>\n );\n })}\n {active !== null &&\n shown.map((s) => {\n const v = num(data[active][s.key]);\n return v === null ? null : <circle key={s.key} cx={x2(active)} cy={y(v)} r={5} fill={s.color} stroke=\"var(--gx-surface)\" strokeWidth={2} />;\n })}\n {/* a generous hit area for the pointer */}\n <rect\n x={m.l - 8}\n y={m.t}\n width={plotW2 + 16}\n height={plotH}\n fill=\"transparent\"\n onPointerMove={(e) => move(e.clientX)}\n onPointerDown={(e) => move(e.clientX)}\n onPointerLeave={() => setActive(null)}\n />\n </svg>\n </div>\n {active !== null && (\n <Tooltip\n left={x2(active)}\n top={m.t + 4}\n flip={x2(active) > width * 0.6}\n heading={labels[active]}\n rows={shown.map((s) => {\n const v = num(data[active][s.key]);\n return { label: s.label, value: v === null ? \"–\" : fmt(v), color: s.color };\n })}\n />\n )}\n </>\n );\n }}\n </Shell>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* BarChart */\n/* -------------------------------------------------------------------------- */\n\nexport interface BarChartProps extends ChartBaseProps {\n /** Optional. \"vertical\" draws columns, \"horizontal\" draws bars from the left. Defaults to \"vertical\". Use horizontal for long category names. */\n orientation?: \"vertical\" | \"horizontal\";\n /** Optional. Stack the series on top of each other instead of side by side. Values should not be negative. Defaults to false. */\n stacked?: boolean;\n}\n\nconst MAX_BAR = 24;\nconst GAP = 2;\nconst RADIUS = 4;\n\n/** a bar with a rounded tip and a square base. `base` and `tip` are positions along the value axis. */\nconst barPath = (vertical: boolean, cross: number, thick: number, base: number, tip: number, round: boolean) => {\n const len = Math.abs(tip - base);\n if (len <= 0) return \"\";\n const r = round ? Math.min(RADIUS, thick / 2, len) : 0;\n if (vertical) {\n const up = tip < base;\n const s = up ? 1 : -1;\n return `M${cross},${base}L${cross},${tip + s * r}${r ? `Q${cross},${tip} ${cross + r},${tip}` : \"\"}L${cross + thick - r},${tip}${r ? `Q${cross + thick},${tip} ${cross + thick},${tip + s * r}` : \"\"}L${cross + thick},${base}Z`;\n }\n const right = tip > base;\n const s = right ? -1 : 1;\n return `M${base},${cross}L${tip + s * r},${cross}${r ? `Q${tip},${cross} ${tip},${cross + r}` : \"\"}L${tip},${cross + thick - r}${r ? `Q${tip},${cross + thick} ${tip + s * r},${cross + thick}` : \"\"}L${base},${cross + thick}Z`;\n};\n\nexport const BarChart = (props: BarChartProps) => {\n const { data, index, series, height = 280, orientation = \"vertical\", stacked = false, valueFormat, indexFormat } = props;\n const vertical = orientation === \"vertical\";\n const sers = useMemo(() => normSeries(series), [series]);\n const [hidden, setHidden] = useState<Set<string>>(new Set());\n const [active, setActive] = useState<number | null>(null);\n const shown = sers.filter((s) => !hidden.has(s.key));\n const fmt = valueFormat ?? ((v: number) => v.toLocaleString());\n const fmtX = indexFormat ?? ((v: string) => v);\n const labels = data.map((d) => fmtX(String(d[index] ?? \"\")));\n const n = data.length;\n\n const totals = data.map((d) => shown.reduce((a, s) => a + Math.max(0, num(d[s.key]) ?? 0), 0));\n const flat = shown.flatMap((s) => data.map((d) => num(d[s.key]) ?? 0));\n const dMax = stacked ? Math.max(0, ...totals) : Math.max(0, ...flat);\n const dMin = stacked ? 0 : Math.min(0, ...flat);\n const sc = niceScale(dMin, dMax || 1);\n const axisFmt = valueFormat ?? (sc.hi >= 1e4 ? compact : (v: number) => v.toLocaleString());\n\n const readout =\n active === null ? \"\" : `${labels[active]}: ${shown.map((s) => `${s.label} ${num(data[active][s.key]) === null ? \"no data\" : fmt(num(data[active][s.key]) as number)}`).join(\", \")}`;\n\n return (\n <Shell\n {...props}\n kind=\"bar\"\n sers={sers}\n hidden={hidden}\n setHidden={setHidden}\n readout={readout}\n summary={`Bar chart, ${sers.length} ${sers.length === 1 ? \"series\" : \"series\"}, ${data.length} categories.`}\n >\n {(width) => {\n const single = shown.length === 1 && !stacked;\n const catW = vertical ? 0 : Math.min(160, Math.max(...labels.map((l) => textW(l)), 20) + 8);\n const yLabelW = vertical ? Math.max(...sc.ticks.map((t) => textW(axisFmt(t)))) + 8 : 0;\n const valueRoom = single ? (vertical ? 0 : Math.max(...flat.map((v) => textW(fmt(v), 12)), 0) + 14) : 0;\n const negRoom = vertical && single && dMin < 0 ? 16 : 0; // room for a value printed under a negative bar\n const m = vertical ? { t: single ? 22 : 12, r: 12, b: 28 + negRoom, l: yLabelW + 8 } : { t: 8, r: 12 + valueRoom, b: 26, l: catW + 8 };\n const plotW = Math.max(10, width - m.l - m.r);\n const plotH = Math.max(10, height - m.t - m.b);\n const bands = Math.max(1, n);\n const band = (vertical ? plotW : plotH) / bands;\n const along = (v: number) => (vertical ? m.t + plotH - ((v - sc.lo) / (sc.hi - sc.lo)) * plotH : m.l + ((v - sc.lo) / (sc.hi - sc.lo)) * plotW);\n const zero = along(0);\n\n const k = Math.max(1, shown.length);\n const thick = stacked ? Math.min(MAX_BAR, band * 0.6) : Math.min(MAX_BAR, (band * 0.7 - GAP * (k - 1)) / k);\n const group = stacked ? thick : thick * k + GAP * (k - 1);\n const every = vertical ? labelEvery(labels, band) : 1;\n\n const bandOf = (i: number) => (vertical ? m.l : m.t) + i * band;\n const crossStart = (i: number) => bandOf(i) + (band - group) / 2;\n\n const move = (e: React.PointerEvent<SVGRectElement>) => {\n const r = (e.currentTarget.ownerSVGElement as SVGSVGElement).getBoundingClientRect();\n const p = vertical ? e.clientX - r.left - m.l : e.clientY - r.top - m.t;\n setActive(Math.max(0, Math.min(n - 1, Math.floor(p / band))));\n };\n\n // tooltip anchor: the end of the tallest bar in the active group\n const tipAt = (i: number) => {\n const vs = shown.map((s) => num(data[i][s.key]) ?? 0);\n const top = stacked ? vs.reduce((a, b) => a + Math.max(0, b), 0) : Math.max(0, ...vs);\n return along(top);\n };\n\n return (\n <>\n <div\n role=\"group\"\n aria-label={`${typeof props.title === \"string\" ? props.title + \". \" : \"\"}Bar chart. Use the arrow keys to read each category, or switch to the table.`}\n tabIndex={0}\n onKeyDown={(e) => {\n const next = vertical ? \"ArrowRight\" : \"ArrowDown\";\n const prev = vertical ? \"ArrowLeft\" : \"ArrowUp\";\n if (e.key === next) setActive((a) => Math.min(n - 1, (a ?? -1) + 1));\n else if (e.key === prev) setActive((a) => Math.max(0, (a ?? n) - 1));\n else if (e.key === \"Home\") setActive(0);\n else if (e.key === \"End\") setActive(n - 1);\n else if (e.key === \"Escape\") setActive(null);\n else return;\n e.preventDefault();\n }}\n onBlur={() => setActive(null)}\n className=\"h-full w-full rounded-lg outline-none focus-visible:ring-2 focus-visible:ring-primary-500\"\n >\n <svg width={width} height={height} className=\"block overflow-visible\" aria-hidden=\"true\">\n {sc.ticks.map((t) => {\n const p = along(t);\n const base = t === 0;\n return vertical ? (\n <g key={t}>\n <line x1={m.l} x2={m.l + plotW} y1={p} y2={p} stroke={base ? \"var(--gx-axis)\" : \"var(--gx-grid)\"} strokeWidth={1} />\n <text x={m.l - 8} y={p} textAnchor=\"end\" dominantBaseline=\"middle\" fontSize={11} fill=\"var(--gx-muted)\">\n {axisFmt(t)}\n </text>\n </g>\n ) : (\n <g key={t}>\n <line x1={p} x2={p} y1={m.t} y2={m.t + plotH} stroke={base ? \"var(--gx-axis)\" : \"var(--gx-grid)\"} strokeWidth={1} />\n <text x={p} y={m.t + plotH + 16} textAnchor=\"middle\" fontSize={11} fill=\"var(--gx-muted)\">\n {axisFmt(t)}\n </text>\n </g>\n );\n })}\n {labels.map((l, i) => {\n const c = bandOf(i) + band / 2;\n if (vertical) {\n return i % every === 0 ? (\n <text key={i} x={c} y={m.t + plotH + 18 + negRoom} textAnchor=\"middle\" fontSize={11} fill=\"var(--gx-muted)\">\n {l}\n </text>\n ) : null;\n }\n const fits = textW(l) <= catW;\n const shownText = fits ? l : `${l.slice(0, Math.max(1, Math.floor(catW / 6.3) - 1))}…`;\n return (\n <text key={i} x={m.l - 8} y={c} textAnchor=\"end\" dominantBaseline=\"middle\" fontSize={11} fill=\"var(--gx-ink2)\">\n {shownText}\n </text>\n );\n })}\n\n {data.map((d, i) => {\n const lift = active === i ? \"brightness(1.08)\" : undefined;\n let acc = 0;\n return (\n <g key={i} style={{ filter: lift }}>\n {shown.map((s, j) => {\n const v = num(d[s.key]);\n if (v === null || v === 0) return null;\n if (stacked) {\n const start = acc;\n acc += Math.max(0, v);\n const topSeg = shown.slice(j + 1).every((t2) => !(num(d[t2.key]) ?? 0));\n // a 2px surface gap between segments, taken from the lower edge of each upper segment\n const b = along(start) + (j > 0 && start > 0 ? (vertical ? -GAP : GAP) : 0);\n const t = along(acc);\n return <path key={s.key} d={barPath(vertical, crossStart(i), thick, b, t, topSeg)} fill={s.color} />;\n }\n const c = crossStart(i) + j * (thick + GAP);\n return <path key={s.key} d={barPath(vertical, c, thick, zero, along(v), true)} fill={s.color} />;\n })}\n </g>\n );\n })}\n\n {/* one value at the tip of each bar, only for a single series and only when it fits */}\n {single &&\n data.map((d, i) => {\n const v = num(d[shown[0].key]);\n if (v === null) return null;\n const text = fmt(v);\n const c = crossStart(i) + thick / 2;\n if (vertical) {\n if (textW(text, 12) > band - 2) return null;\n const up = v >= 0;\n return (\n <text key={i} x={c} y={along(v) + (up ? -6 : 14)} textAnchor=\"middle\" fontSize={12} fontWeight={600} fill=\"var(--gx-ink)\">\n {text}\n </text>\n );\n }\n return (\n <text key={i} x={along(v) + (v >= 0 ? 6 : -6)} y={c} textAnchor={v >= 0 ? \"start\" : \"end\"} dominantBaseline=\"middle\" fontSize={12} fontWeight={600} fill=\"var(--gx-ink)\">\n {text}\n </text>\n );\n })}\n\n {/* each category is one large hit area, wider than its bars */}\n {data.map((_, i) => (\n <rect\n key={i}\n x={vertical ? bandOf(i) : m.l}\n y={vertical ? m.t : bandOf(i)}\n width={vertical ? band : plotW}\n height={vertical ? plotH : band}\n fill=\"transparent\"\n onPointerMove={move}\n onPointerDown={move}\n onPointerLeave={() => setActive(null)}\n />\n ))}\n </svg>\n </div>\n {active !== null && (\n <Tooltip\n left={vertical ? bandOf(active) + band / 2 : Math.min(tipAt(active), m.l + plotW)}\n top={vertical ? Math.max(m.t, tipAt(active) - 8 - 24 - shown.length * 22) : bandOf(active) + band / 2 - 20}\n flip={(vertical ? bandOf(active) + band / 2 : tipAt(active)) > width * 0.6}\n heading={labels[active]}\n rows={shown.map((s) => {\n const v = num(data[active][s.key]);\n return { label: s.label, value: v === null ? \"–\" : fmt(v), color: s.color };\n })}\n />\n )}\n </>\n );\n }}\n </Shell>\n );\n};\n\nexport default LineChart;\n","\"use client\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { RiCheckLine, RiErrorWarningLine, RiFileCopyLine } from \"@remixicon/react\";\nimport Button from \"./Button\";\nimport type { ButtonProps } from \"./Button\";\n\ntype Status = \"idle\" | \"copied\" | \"failed\";\n\n/** Copy text to the clipboard. Uses the modern API and falls back to a hidden textarea where it is blocked. */\nexport const copyText = async (text: string): Promise<boolean> => {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n /* fall through to the fallback */\n }\n try {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.setAttribute(\"readonly\", \"\");\n ta.style.cssText = \"position:fixed;top:0;left:0;opacity:0;pointer-events:none\";\n const active = document.activeElement as HTMLElement | null;\n document.body.appendChild(ta);\n ta.select();\n const ok = document.execCommand(\"copy\");\n document.body.removeChild(ta);\n active?.focus?.({ preventScroll: true });\n return ok;\n } catch {\n return false;\n }\n};\n\n/** Hook behind CopyButton, for your own trigger. Returns the status and a copy function. */\nexport const useCopyToClipboard = (resetAfter = 2000) => {\n const [status, setStatus] = useState<Status>(\"idle\");\n const timer = useRef<ReturnType<typeof setTimeout>>();\n useEffect(() => () => clearTimeout(timer.current), []);\n const copy = useCallback(\n async (text: string) => {\n const ok = await copyText(text);\n setStatus(ok ? \"copied\" : \"failed\");\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setStatus(\"idle\"), resetAfter);\n return ok;\n },\n [resetAfter],\n );\n return { status, copied: status === \"copied\", copy };\n};\n\nexport interface CopyButtonProps\n extends Omit<ButtonProps, \"children\" | \"onClick\" | \"onCopy\" | \"onError\" | \"startIcon\" | \"endIcon\" | \"loading\" | \"iconOnly\" | \"value\"> {\n /** What to copy. Pass a function (it may be async) to read the value only when clicked. */\n value: string | (() => string | Promise<string>);\n /** Optional. Button text. Leave out for an icon-only button. */\n label?: string;\n /** Optional. Text shown after copying. Defaults to \"Copied\". */\n copiedLabel?: string;\n /** Optional. Milliseconds before it returns to normal. Defaults to 2000. */\n resetAfter?: number;\n /** Called with the copied text after a successful copy. */\n onCopy?: (value: string) => void;\n /** Called when copying fails. */\n onError?: (error: unknown) => void;\n /** Optional. Name for an icon-only button, for example \"Copy API key\". Defaults to \"Copy\". Needed when there is no label. */\n \"aria-label\"?: string;\n}\n\nexport const CopyButton = ({\n value,\n label,\n copiedLabel = \"Copied\",\n resetAfter = 2000,\n onCopy,\n onError,\n variant = \"outlined\",\n size = \"sm\",\n \"aria-label\": ariaLabel,\n className,\n ...rest\n}: CopyButtonProps) => {\n const { status, copy } = useCopyToClipboard(resetAfter);\n const iconOnly = !label;\n\n const click = async () => {\n try {\n const text = typeof value === \"function\" ? await value() : value;\n const ok = await copy(text);\n if (ok) onCopy?.(text);\n else onError?.(new Error(\"Copy was blocked by the browser.\"));\n } catch (e) {\n await copy(\"\").catch(() => undefined);\n onError?.(e);\n }\n };\n\n const icon =\n status === \"copied\" ? <RiCheckLine size={16} aria-hidden=\"true\" /> : status === \"failed\" ? <RiErrorWarningLine size={16} aria-hidden=\"true\" /> : <RiFileCopyLine size={16} aria-hidden=\"true\" />;\n const text = status === \"copied\" ? copiedLabel : status === \"failed\" ? \"Copy failed\" : label;\n\n return (\n <>\n <Button\n {...rest}\n type=\"button\"\n variant={variant}\n size={size}\n iconOnly={iconOnly}\n startIcon={icon}\n onClick={click}\n aria-label={iconOnly ? (status === \"copied\" ? copiedLabel : (ariaLabel ?? \"Copy\")) : ariaLabel}\n className={className}\n >\n {iconOnly ? undefined : text}\n </Button>\n {/* announced once, because this region exists before its text changes */}\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {status === \"copied\" ? \"Copied to clipboard\" : status === \"failed\" ? \"Could not copy\" : \"\"}\n </span>\n </>\n );\n};\n\nexport default CopyButton;\n","\"use client\";\nimport React, { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../utils/utils\";\n\nexport interface OverlayProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Whether the overlay is shown. */\n open: boolean;\n /** Called when the overlay asks to close: a click on the dimmed area or Escape. Leave out for an overlay that cannot be dismissed. */\n onOpenChange?: (open: boolean) => void;\n /** Optional. \"viewport\" covers the whole screen. \"container\" covers the nearest positioned parent (give it `relative`), for example to dim one card while it loads. Defaults to \"viewport\". */\n scope?: \"viewport\" | \"container\";\n /** Optional. How dark the dimming is. Defaults to \"medium\". */\n tone?: \"light\" | \"medium\" | \"dark\";\n /** Optional. Blur what is behind. Defaults to \"none\". */\n blur?: \"none\" | \"sm\" | \"md\";\n /** Optional. Stop the page behind from scrolling while a viewport overlay is open. Defaults to true. */\n lockScroll?: boolean;\n /** Optional. Close on Escape when onOpenChange is set. Defaults to true. */\n closeOnEscape?: boolean;\n /** Optional. Show a spinner with this text, for waiting states. The text is announced to screen readers. */\n loadingText?: string;\n /** Optional. Show a spinner without visible text. Announced as \"Loading\". */\n loading?: boolean;\n /** Optional. Stacking order for a viewport overlay. Defaults to 40. */\n zIndex?: number;\n /** Optional. Content centred over the dimming, such as a message or your own panel. Clicks on it do not close the overlay. */\n children?: React.ReactNode;\n}\n\nconst TONES = { light: \"bg-black/25\", medium: \"bg-black/50\", dark: \"bg-black/70\" } as const;\nconst BLURS = { none: \"\", sm: \"backdrop-blur-sm\", md: \"backdrop-blur-md\" } as const;\nconst FADE = 200;\n\nexport const Overlay = ({\n open,\n onOpenChange,\n scope = \"viewport\",\n tone = \"medium\",\n blur = \"none\",\n lockScroll = true,\n closeOnEscape = true,\n loading = false,\n loadingText,\n zIndex = 40,\n className,\n style,\n onClick,\n children,\n ...rest\n}: OverlayProps) => {\n const [mounted, setMounted] = useState(open);\n const [shown, setShown] = useState(false);\n const fixed = scope === \"viewport\";\n\n // mount first, fade in on the next frame; fade out, then unmount\n useEffect(() => {\n if (open) {\n setMounted(true);\n const id = requestAnimationFrame(() => requestAnimationFrame(() => setShown(true)));\n return () => cancelAnimationFrame(id);\n }\n setShown(false);\n const reduce = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const t = setTimeout(() => setMounted(false), reduce ? 0 : FADE);\n return () => clearTimeout(t);\n }, [open]);\n\n useEffect(() => {\n if (!open || !fixed || !lockScroll) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, [open, fixed, lockScroll]);\n\n useEffect(() => {\n if (!open || !onOpenChange || !closeOnEscape) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onOpenChange(false);\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, onOpenChange, closeOnEscape]);\n\n if (!mounted || (fixed && typeof document === \"undefined\")) return null;\n\n const spinner = loading || !!loadingText;\n const node = (\n <div\n {...rest}\n data-state={shown ? \"open\" : \"closed\"}\n onClick={(e) => {\n onClick?.(e);\n // only a click on the dimmed area itself dismisses, not on what is inside it\n if (e.target === e.currentTarget && onOpenChange) onOpenChange(false);\n }}\n style={{ ...style, ...(fixed ? { zIndex } : null) }}\n className={cn(\n fixed ? \"fixed inset-0\" : \"absolute inset-0 rounded-[inherit]\",\n \"flex items-center justify-center transition-opacity duration-200 ease-out motion-reduce:transition-none\",\n TONES[tone],\n BLURS[blur],\n shown ? \"opacity-100\" : \"opacity-0\",\n className,\n )}\n >\n {spinner && (\n <div role=\"status\" className=\"flex flex-col items-center gap-3 rounded-xl bg-white px-6 py-4 text-sm font-medium text-gray-800 shadow-lg\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" className=\"h-6 w-6 animate-spin text-primary-600 motion-reduce:animate-none\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"none\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"3\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n <span className={loadingText ? undefined : \"sr-only\"}>{loadingText ?? \"Loading\"}</span>\n </div>\n )}\n {children}\n </div>\n );\n\n if (!fixed) return node;\n const target = (document.querySelector(\".theme-primary\") as HTMLElement | null) ?? document.body;\n return createPortal(node, target);\n};\n\nexport default Overlay;\n","\"use client\";\nimport React, { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type PortalContainer = HTMLElement | null | (() => HTMLElement | null);\n\n/** The element Genesis overlays render into by default: the nearest theme root, so theme variables still apply, otherwise the page body. */\nexport const getPortalContainer = (): HTMLElement | null => {\n if (typeof document === \"undefined\") return null;\n return (document.querySelector(\".theme-primary\") as HTMLElement | null) ?? document.body;\n};\n\nexport interface PortalProps {\n /** What to render outside the normal place in the page. */\n children?: React.ReactNode;\n /** Optional. Where to render it: an element, or a function that returns one (called after the page loads). Defaults to the theme root, or the page body. */\n container?: PortalContainer;\n /** Optional. Render in place instead, with no portal. Useful to switch the portal off in a tight layout or a test. Defaults to false. */\n disabled?: boolean;\n}\n\n/**\n * Renders children into another part of the page, usually `document.body`, so they are not clipped by a parent's\n * `overflow: hidden`, covered by its stacking context, or moved by its `transform`. React events still bubble\n * through the component tree as if the content were in place. Nothing renders on the server or in the first render.\n */\nexport const Portal = ({ children, container, disabled = false }: PortalProps) => {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (disabled) return;\n const el = typeof container === \"function\" ? container() : container;\n setTarget(el === undefined ? getPortalContainer() : el ?? getPortalContainer());\n }, [container, disabled]);\n\n if (disabled) return <>{children}</>;\n return target ? createPortal(children, target) : null;\n};\n\nexport default Portal;\n","\"use client\";\nimport React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ntype Tag = \"span\" | \"div\" | \"p\" | \"label\" | \"a\" | \"h1\" | \"h2\" | \"h3\" | \"legend\" | \"caption\";\n\nexport interface VisuallyHiddenProps extends React.HTMLAttributes<HTMLElement> {\n /** Optional. The HTML element to render. Defaults to \"span\". */\n as?: Tag;\n /** Optional. Show the content when it receives keyboard focus, for example a \"Skip to content\" link. The element must be focusable (a link or button, or give it tabIndex={0}). Defaults to false. */\n focusable?: boolean;\n /** Optional. For as=\"label\": the id of the field it names. */\n htmlFor?: string;\n /** Optional. For as=\"a\": where the link goes. */\n href?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Hides content from the screen but keeps it for screen readers and search. Unlike `display: none` or `hidden`,\n * the text stays in the accessibility tree. Use it for names and context that sighted users get from the layout.\n */\nexport const VisuallyHidden = ({ as = \"span\", focusable = false, className, children, ...rest }: VisuallyHiddenProps) => {\n const Tag = as as React.ElementType;\n return (\n <Tag\n {...rest}\n className={cn(\n \"sr-only\",\n // when focused, return to normal flow and look like a clear, readable control\n focusable &&\n \"focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-[300] focus:rounded-lg focus:bg-white focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-gray-900 focus:shadow-lg focus:outline-none focus:ring-2 focus:ring-primary-500\",\n className,\n )}\n >\n {children}\n </Tag>\n );\n};\n\nexport default VisuallyHidden;\n","\"use client\";\nimport React from \"react\";\nimport VisuallyHidden from \"./VisuallyHidden\";\n\nexport interface SkipLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> {\n /** The target on the page, as an id with a hash, for example \"#main\". */\n href?: string;\n /** Optional. Link text. Defaults to \"Skip to main content\". */\n children?: React.ReactNode;\n}\n\n/**\n * The first focusable thing on a page. Hidden until a keyboard user tabs to it, then it lets them jump past the\n * navigation to the main content. On activation it moves keyboard focus to the target, not just the scroll position.\n */\nexport const SkipLink = ({ href = \"#main\", children = \"Skip to main content\", onClick, ...rest }: SkipLinkProps) => (\n <VisuallyHidden\n {...rest}\n as=\"a\"\n href={href}\n focusable\n onClick={(e) => {\n onClick?.(e as React.MouseEvent<HTMLAnchorElement>);\n if (e.defaultPrevented || !href.startsWith(\"#\") || href.length < 2) return;\n const target = document.getElementById(decodeURIComponent(href.slice(1)));\n if (!target) return;\n // let the browser scroll, but also move focus: without this, the next Tab starts from the link again\n e.preventDefault();\n if (!target.hasAttribute(\"tabindex\") && !target.matches(\"a[href],button,input,select,textarea,[contenteditable]\")) {\n target.setAttribute(\"tabindex\", \"-1\");\n }\n target.focus();\n target.scrollIntoView?.({ block: \"start\" });\n history.replaceState(null, \"\", href);\n }}\n >\n {children}\n </VisuallyHidden>\n);\n\nexport default SkipLink;\n","\"use client\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport Button from \"./Button\";\nimport type { ButtonProps } from \"./Button\";\nimport { cn } from \"../utils/utils\";\n\nexport interface LoadMoreProps {\n /** Called to fetch the next batch. Return a promise to get a loading state and to catch errors automatically. */\n onLoadMore: () => void | Promise<unknown>;\n /** Whether there is more to load. When false the button is replaced by the end message. */\n hasMore: boolean;\n /** Optional. Force the loading state yourself, for example when the request is managed by a data library. */\n loading?: boolean;\n /** Optional. An error to show with a retry button. Pass true for a default message. Left out, errors thrown by onLoadMore are shown. */\n error?: boolean | string;\n /** Optional. How many items are shown now. With total, shows \"Showing 20 of 134\". */\n loaded?: number;\n /** Optional. Total number of items, when it is known. */\n total?: number;\n /** Optional. Button text. Defaults to \"Load more\". */\n label?: string;\n /** Optional. Text shown when there is nothing more to load. Set to an empty string to show nothing. Defaults to \"You have reached the end.\" */\n endText?: string;\n /** Optional. Also load the next batch automatically when the button scrolls into view. The button stays for keyboard and screen reader users. Defaults to false. */\n autoLoad?: boolean;\n /** Optional. Button style, from Button. Defaults to \"outlined\". */\n variant?: ButtonProps[\"variant\"];\n /** Optional. Button size, from Button. */\n size?: ButtonProps[\"size\"];\n className?: string;\n}\n\nexport const LoadMore = ({\n onLoadMore,\n hasMore,\n loading: loadingProp,\n error: errorProp,\n loaded,\n total,\n label = \"Load more\",\n endText = \"You have reached the end.\",\n autoLoad = false,\n variant = \"outlined\",\n size,\n className,\n}: LoadMoreProps) => {\n const [pending, setPending] = useState(false);\n const [thrown, setThrown] = useState<string | null>(null);\n const sentinel = useRef<HTMLDivElement>(null);\n const busy = useRef(false);\n const loading = loadingProp ?? pending;\n const error = errorProp !== undefined ? errorProp : thrown ?? false;\n\n const run = async () => {\n if (busy.current || loading) return;\n busy.current = true;\n setThrown(null);\n try {\n const r = onLoadMore();\n if (r && typeof (r as Promise<unknown>).then === \"function\") {\n setPending(true);\n await r;\n }\n } catch (e) {\n setThrown(e instanceof Error && e.message ? e.message : \"Could not load more.\");\n } finally {\n busy.current = false;\n setPending(false);\n }\n };\n\n // when the sentinel enters view, load. The observer is rebuilt after each batch, so a short list keeps filling until the screen is full.\n useEffect(() => {\n const el = sentinel.current;\n if (!autoLoad || !hasMore || loading || error || !el || typeof IntersectionObserver === \"undefined\") return;\n const io = new IntersectionObserver((entries) => entries.some((e) => e.isIntersecting) && run(), { rootMargin: \"200px\" });\n io.observe(el);\n return () => io.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoLoad, hasMore, loading, error, loaded]);\n\n const summary =\n loaded !== undefined ? (total !== undefined ? `Showing ${loaded.toLocaleString()} of ${total.toLocaleString()}` : `Showing ${loaded.toLocaleString()}`) : null;\n const message = typeof error === \"string\" ? error : \"Could not load more. Check your connection and try again.\";\n\n return (\n <div className={cn(\"flex flex-col items-center gap-3\", className)} aria-busy={loading || undefined}>\n {summary && (\n <p role=\"status\" aria-live=\"polite\" className=\"text-sm text-gray-600 tabular-nums\">\n {summary}\n </p>\n )}\n {error && (\n <p role=\"alert\" className=\"rounded-lg bg-error-100 px-3 py-2 text-sm text-error-800\">\n {message}\n </p>\n )}\n {hasMore ? (\n <Button type=\"button\" variant={variant} size={size} loading={loading} onClick={run}>\n {loading ? \"Loading…\" : error ? \"Try again\" : label}\n </Button>\n ) : (\n endText && (\n <p role=\"status\" className=\"text-sm text-gray-500\">\n {endText}\n </p>\n )\n )}\n <div ref={sentinel} aria-hidden=\"true\" className=\"h-px w-full\" />\n </div>\n );\n};\n\nexport default LoadMore;\n","\"use client\";\nimport React, { useEffect, useId, useRef, useState } from \"react\";\nimport { RiArrowLeftLine, RiArrowRightLine } from \"@remixicon/react\";\nimport Button from \"./Button\";\nimport type { ButtonProps } from \"./Button\";\nimport { cn } from \"../utils/utils\";\n\nexport interface CursorPaginationProps {\n /** Whether there is an earlier page. */\n hasPrevious: boolean;\n /** Whether there is a later page. */\n hasNext: boolean;\n /** Called to go to the previous page. Return a promise to show a loading state on the button. */\n onPrevious: () => void | Promise<unknown>;\n /** Called to go to the next page. Return a promise to show a loading state on the button. */\n onNext: () => void | Promise<unknown>;\n /** Optional. Force a loading state: true for both buttons, or the direction being loaded. */\n loading?: boolean | \"previous\" | \"next\";\n /** Optional. Text between the buttons, such as \"Showing 21–40\" or \"Page 3\". Announced to screen readers when it changes. */\n summary?: React.ReactNode;\n /** Optional. Accessible name of the navigation. Defaults to \"Pagination\". */\n \"aria-label\"?: string;\n /** Optional. Rows-per-page choices. When set, a selector is shown. */\n pageSizeOptions?: number[];\n /** Optional. Current rows per page, for the selector. */\n pageSize?: number;\n /** Called when a different page size is chosen. */\n onPageSizeChange?: (size: number) => void;\n /** Optional. Button style, from Button. Defaults to \"outlined\". */\n variant?: ButtonProps[\"variant\"];\n /** Optional. Button size, from Button. Defaults to \"sm\". */\n size?: ButtonProps[\"size\"];\n className?: string;\n}\n\nconst unavailable = \"pointer-events-none opacity-40\";\n\nexport const CursorPagination = ({\n hasPrevious,\n hasNext,\n onPrevious,\n onNext,\n loading,\n summary,\n \"aria-label\": ariaLabel = \"Pagination\",\n pageSizeOptions,\n pageSize,\n onPageSizeChange,\n variant = \"outlined\",\n size = \"sm\",\n className,\n}: CursorPaginationProps) => {\n const uid = useId();\n const [pending, setPending] = useState<\"previous\" | \"next\" | null>(null);\n const dir = loading === \"previous\" || loading === \"next\" ? loading : pending;\n const all = loading === true;\n const busy = !!dir || all;\n\n const go = async (which: \"previous\" | \"next\", fn: () => void | Promise<unknown>) => {\n if (busy) return;\n try {\n const r = fn();\n if (r && typeof (r as Promise<unknown>).then === \"function\") {\n setPending(which);\n await r;\n }\n } finally {\n setPending(null);\n }\n };\n\n // unavailable buttons stay focusable (aria-disabled), so focus is not lost when the last page is reached\n const prevOff = !hasPrevious;\n const nextOff = !hasNext;\n const prevRef = useRef<HTMLButtonElement>(null);\n const nextRef = useRef<HTMLButtonElement>(null);\n // Button sets aria-disabled itself from its own props, so set it here after every render\n useEffect(() => {\n for (const [el, off] of [[prevRef.current, prevOff], [nextRef.current, nextOff]] as const) {\n if (!el) continue;\n if (off && !el.hasAttribute(\"aria-busy\")) el.setAttribute(\"aria-disabled\", \"true\");\n else if (!off && el.getAttribute(\"aria-disabled\") === \"true\" && !el.hasAttribute(\"aria-busy\")) el.removeAttribute(\"aria-disabled\");\n }\n });\n\n return (\n <nav aria-label={ariaLabel} aria-busy={busy || undefined} className={cn(\"flex flex-wrap items-center justify-between gap-3\", className)}>\n <div className=\"flex items-center gap-3\">\n {pageSizeOptions && (\n <div className=\"flex items-center gap-2 text-sm text-gray-600\">\n <label htmlFor={`${uid}-size`}>Rows per page</label>\n <select\n id={`${uid}-size`}\n value={pageSize}\n onChange={(e) => onPageSizeChange?.(Number(e.target.value))}\n className=\"rounded-lg border border-gray-200 bg-white px-2 py-1 text-sm text-gray-900 outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\"\n >\n {pageSizeOptions.map((n) => (\n <option key={n} value={n}>\n {n}\n </option>\n ))}\n </select>\n </div>\n )}\n {summary && (\n <p role=\"status\" aria-live=\"polite\" className=\"text-sm text-gray-600 tabular-nums\">\n {summary}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n startIcon={<RiArrowLeftLine size={16} aria-hidden=\"true\" />}\n ref={prevRef}\n loading={dir === \"previous\" || all}\n className={prevOff ? unavailable : undefined}\n onClick={() => !prevOff && go(\"previous\", onPrevious)}\n >\n Previous\n </Button>\n <Button\n type=\"button\"\n variant={variant}\n size={size}\n endIcon={<RiArrowRightLine size={16} aria-hidden=\"true\" />}\n ref={nextRef}\n loading={dir === \"next\" || all}\n className={nextOff ? unavailable : undefined}\n onClick={() => !nextOff && go(\"next\", onNext)}\n >\n Next\n </Button>\n </div>\n </nav>\n );\n};\n\nexport default CursorPagination;\n","\"use client\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport Button from \"./Button\";\nimport { cn } from \"../utils/utils\";\n\ntype RootRef = React.RefObject<HTMLElement> | HTMLElement | null;\n\nexport interface UseInfiniteScrollOptions {\n /** Called to fetch the next batch. Return a promise to track loading and catch errors. */\n onLoadMore: () => void | Promise<unknown>;\n /** Whether there is more to load. */\n hasMore: boolean;\n /** Optional. Force the loading state, for example when a data library manages the request. */\n loading?: boolean;\n /** Optional. Force an error message. Left out, errors thrown by onLoadMore are used. */\n error?: string | boolean;\n /** Optional. The scrolling element to watch. Leave out to watch the page. */\n root?: RootRef;\n /** Optional. How early to load, as a CSS margin around the viewport. Defaults to \"300px\", which loads before the end is reached. */\n rootMargin?: string;\n /** Optional. Turn automatic loading off. Defaults to false. */\n disabled?: boolean;\n}\n\n/** Calls onLoadMore when the returned sentinel scrolls into view. Put the sentinel after the last item. */\nexport const useInfiniteScroll = ({ onLoadMore, hasMore, loading: loadingProp, error: errorProp, root, rootMargin = \"300px\", disabled = false }: UseInfiniteScrollOptions) => {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const busy = useRef(false);\n const latest = useRef(onLoadMore);\n latest.current = onLoadMore;\n const [pending, setPending] = useState(false);\n const [thrown, setThrown] = useState<string | null>(null);\n const loading = loadingProp ?? pending;\n const error = errorProp !== undefined ? errorProp : thrown ?? false;\n\n const loadNow = useCallback(async () => {\n if (busy.current) return;\n busy.current = true;\n setThrown(null);\n try {\n const r = latest.current();\n if (r && typeof (r as Promise<unknown>).then === \"function\") {\n setPending(true);\n await r;\n }\n } catch (e) {\n setThrown(e instanceof Error && e.message ? e.message : \"Could not load more.\");\n } finally {\n busy.current = false;\n setPending(false);\n }\n }, []);\n\n // The observer is rebuilt after every batch. If the sentinel is still in view it fires straight away, so a short list keeps filling until the screen is full.\n useEffect(() => {\n const el = sentinelRef.current;\n if (disabled || !hasMore || loading || error || !el || typeof IntersectionObserver === \"undefined\") return;\n const rootEl = root && \"current\" in (root as object) ? (root as React.RefObject<HTMLElement>).current : (root as HTMLElement | null | undefined);\n const io = new IntersectionObserver((entries) => entries.some((e) => e.isIntersecting) && loadNow(), { root: rootEl ?? null, rootMargin });\n io.observe(el);\n return () => io.disconnect();\n }, [disabled, hasMore, loading, error, root, rootMargin, loadNow]);\n\n return { sentinelRef, loading, error, loadNow };\n};\n\nexport interface InfiniteScrollProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\" | \"onError\"> {\n /** The items loaded so far. */\n children: React.ReactNode;\n /** Called to fetch the next batch. Return a promise to show the loader and catch errors automatically. */\n onLoadMore: () => void | Promise<unknown>;\n /** Whether there is more to load. */\n hasMore: boolean;\n /** Optional. Force the loading state. */\n loading?: boolean;\n /** Optional. Force an error. Pass true for a default message. */\n error?: string | boolean;\n /** Optional. Give the list a fixed height and make it the scrolling area. Leave out to scroll with the page, or use scrollContainer. */\n height?: number | string;\n /** Optional. A scrolling element of your own to watch, instead of the page. */\n scrollContainer?: RootRef;\n /** Optional. Shown while loading. Defaults to a spinner with \"Loading more…\". */\n loader?: React.ReactNode;\n /** Optional. Shown when everything has loaded. Set to null for nothing. Defaults to \"You have reached the end.\" */\n endMessage?: React.ReactNode;\n /** Optional. Keep a \"Load more\" button for keyboard and screen reader users and for when scrolling does not trigger. Defaults to true. */\n showButton?: boolean;\n /** Optional. How many items are shown. Announced to screen readers after each batch. */\n itemCount?: number;\n /** Optional. How early to load, as a CSS margin around the viewport. Defaults to \"300px\". */\n rootMargin?: string;\n /** Optional. Name for the scrolling area when height is set. */\n \"aria-label\"?: string;\n}\n\nconst DefaultLoader = () => (\n <div role=\"status\" className=\"flex items-center justify-center gap-2 py-3 text-sm text-gray-600\">\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" className=\"h-4 w-4 animate-spin text-primary-600 motion-reduce:animate-none\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" fill=\"none\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"3\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n Loading more…\n </div>\n);\n\nexport const InfiniteScroll = ({\n children,\n onLoadMore,\n hasMore,\n loading: loadingProp,\n error: errorProp,\n height,\n scrollContainer,\n loader,\n endMessage = \"You have reached the end.\",\n showButton = true,\n itemCount,\n rootMargin,\n className,\n \"aria-label\": ariaLabel,\n ...rest\n}: InfiniteScrollProps) => {\n const boxRef = useRef<HTMLDivElement>(null);\n const root = height !== undefined ? boxRef : scrollContainer;\n const { sentinelRef, loading, error, loadNow } = useInfiniteScroll({ onLoadMore, hasMore, loading: loadingProp, error: errorProp, root, rootMargin });\n const message = typeof error === \"string\" ? error : \"Could not load more. Check your connection and try again.\";\n\n return (\n <div\n ref={boxRef}\n {...(height !== undefined ? { tabIndex: 0, role: \"region\", \"aria-label\": ariaLabel ?? \"Scrollable list\", style: { height } } : {})}\n aria-busy={loading || undefined}\n className={cn(height !== undefined && \"overflow-y-auto rounded-xl border border-gray-200 outline-none focus-visible:ring-2 focus-visible:ring-primary-500\", className)}\n {...rest}\n >\n {children}\n <div ref={sentinelRef} aria-hidden=\"true\" className=\"h-px w-full\" />\n <div className=\"flex flex-col items-center gap-2 px-3 pb-3\">\n {loading && (loader ?? <DefaultLoader />)}\n {!loading && error && (\n <>\n <p role=\"alert\" className=\"rounded-lg bg-error-100 px-3 py-2 text-sm text-error-800\">\n {message}\n </p>\n <Button type=\"button\" size=\"sm\" variant=\"outlined\" onClick={loadNow}>\n Try again\n </Button>\n </>\n )}\n {!loading && !error && hasMore && showButton && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={loadNow}>\n Load more\n </Button>\n )}\n {!hasMore && endMessage && <p className=\"py-2 text-sm text-gray-500\">{endMessage}</p>}\n </div>\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {!loading && itemCount !== undefined ? `${itemCount} items shown${hasMore ? \"\" : \", end of list\"}` : \"\"}\n </span>\n </div>\n );\n};\n\nexport default InfiniteScroll;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { RiCloseLine } from \"@remixicon/react\";\nimport Button from \"./Button\";\nimport { cn } from \"../utils/utils\";\n\ntype Placement = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype TargetRef = string | HTMLElement | React.RefObject<HTMLElement> | (() => HTMLElement | null) | null;\n\nexport interface TourStep {\n /** The element to highlight: a CSS selector such as \"#save\", an element, a ref, or a function that returns one. Leave out for a centred step with no highlight, for example a welcome message. */\n target?: TargetRef;\n /** Heading of the step. Also names the dialog for screen readers. */\n title: React.ReactNode;\n /** The explanation. Keep it to a sentence or two. */\n content?: React.ReactNode;\n /** Optional. Preferred side of the target for the card. It moves to the other side when there is no room. Defaults to \"bottom\". */\n placement?: Placement;\n /** Optional. Button text for this step's Next button. */\n nextLabel?: string;\n}\n\nexport interface TourProps {\n /** The steps, in order. */\n steps: TourStep[];\n /** Whether the tour is running. */\n open: boolean;\n /** Called with false when the tour ends: finished, skipped or closed. */\n onOpenChange: (open: boolean) => void;\n /** Controlled current step (0-based). */\n step?: number;\n /** Optional. Starting step when uncontrolled. Defaults to 0. */\n defaultStep?: number;\n /** Called with the new step index when the person moves between steps. */\n onStepChange?: (step: number) => void;\n /** Called when the last step's button is pressed. */\n onFinish?: () => void;\n /** Called when the tour is skipped or closed before the end, with the step it stopped on. */\n onSkip?: (step: number) => void;\n /** Optional. Space between the highlight and the target, in px. Defaults to 6. */\n spotlightPadding?: number;\n /** Optional. Close the tour when the dimmed area is clicked. Defaults to false, so a stray click does not end the tour. */\n closeOnOverlayClick?: boolean;\n /** Optional. Hide the \"Skip tour\" button. Defaults to false. */\n hideSkip?: boolean;\n /** Optional. Text of the buttons. */\n labels?: { next?: string; back?: string; done?: string; skip?: string; close?: string };\n /** Optional. Stacking order. Defaults to 300. */\n zIndex?: number;\n}\n\nconst CARD_W = 340;\nconst MARGIN = 16;\nconst GAP = 14;\n\nconst resolve = (t: TargetRef | undefined): HTMLElement | null => {\n if (!t) return null;\n if (typeof t === \"string\") return document.querySelector<HTMLElement>(t);\n if (typeof t === \"function\") return t();\n if (\"current\" in t) return t.current;\n return t;\n};\n\nconst FOCUSABLE = 'a[href],button:not([disabled]),input,select,textarea,[tabindex]:not([tabindex=\"-1\"])';\n\nexport const Tour = ({\n steps,\n open,\n onOpenChange,\n step: stepProp,\n defaultStep = 0,\n onStepChange,\n onFinish,\n onSkip,\n spotlightPadding = 6,\n closeOnOverlayClick = false,\n hideSkip = false,\n labels,\n zIndex = 300,\n}: TourProps) => {\n const uid = useId();\n const [inner, setInner] = useState(defaultStep);\n const index = Math.max(0, Math.min(steps.length - 1, stepProp ?? inner));\n const s = steps[index];\n const cardRef = useRef<HTMLDivElement>(null);\n const [rect, setRect] = useState<DOMRect | null>(null);\n const [card, setCard] = useState({ w: CARD_W, h: 200 });\n const [vp, setVp] = useState({ w: 1000, h: 800 });\n const last = index === steps.length - 1;\n const L = { next: \"Next\", back: \"Back\", done: \"Done\", skip: \"Skip tour\", close: \"Close tour\", ...labels };\n\n // an uncontrolled tour starts from the beginning every time it opens\n useEffect(() => {\n if (open && stepProp === undefined) setInner(defaultStep);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const go = (n: number) => {\n if (stepProp === undefined) setInner(n);\n onStepChange?.(n);\n };\n const end = (finished: boolean) => {\n if (finished) onFinish?.();\n else onSkip?.(index);\n onOpenChange(false);\n };\n\n // measure the target and the viewport; keep them fresh while scrolling and resizing\n const measure = useCallback(() => {\n setVp({ w: window.innerWidth, h: window.innerHeight });\n const el = resolve(s?.target);\n setRect(el ? el.getBoundingClientRect() : null);\n if (cardRef.current) setCard({ w: cardRef.current.offsetWidth, h: cardRef.current.offsetHeight });\n }, [s]);\n\n useLayoutEffect(() => {\n if (!open) return;\n const el = resolve(s?.target);\n // bring the target into view before measuring\n el?.scrollIntoView?.({ block: \"center\", inline: \"nearest\" });\n measure();\n let raf = 0;\n const on = () => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(measure);\n };\n window.addEventListener(\"resize\", on);\n window.addEventListener(\"scroll\", on, true);\n const ro = new ResizeObserver(on);\n if (el) ro.observe(el);\n if (cardRef.current) ro.observe(cardRef.current);\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener(\"resize\", on);\n window.removeEventListener(\"scroll\", on, true);\n ro.disconnect();\n };\n }, [open, index, measure, s]);\n\n // focus the card on each step, and hand focus back when the tour ends\n useEffect(() => {\n if (!open) return;\n const opener = document.activeElement as HTMLElement | null;\n return () => opener?.focus?.({ preventScroll: true });\n }, [open]);\n useEffect(() => {\n if (open) cardRef.current?.focus({ preventScroll: true });\n }, [open, index]);\n\n if (!open || !s || typeof document === \"undefined\") return null;\n\n const pad = spotlightPadding;\n const hole = rect ? { x: rect.left - pad, y: rect.top - pad, w: rect.width + pad * 2, h: rect.height + pad * 2 } : null;\n\n // place the card on the preferred side, flip if it does not fit, then keep it inside the screen\n const cw = Math.min(CARD_W, vp.w - MARGIN * 2);\n let left = (vp.w - cw) / 2;\n let top = (vp.h - card.h) / 2;\n if (hole) {\n const fits = {\n bottom: hole.y + hole.h + GAP + card.h <= vp.h - MARGIN,\n top: hole.y - GAP - card.h >= MARGIN,\n right: hole.x + hole.w + GAP + cw <= vp.w - MARGIN,\n left: hole.x - GAP - cw >= MARGIN,\n };\n const pref = s.placement ?? \"bottom\";\n const order: Placement[] = [pref, pref === \"bottom\" ? \"top\" : pref === \"top\" ? \"bottom\" : pref === \"left\" ? \"right\" : \"left\", \"bottom\", \"top\", \"right\", \"left\"];\n const side = order.find((p) => fits[p]) ?? pref;\n if (side === \"bottom\") (top = hole.y + hole.h + GAP), (left = hole.x + hole.w / 2 - cw / 2);\n else if (side === \"top\") (top = hole.y - GAP - card.h), (left = hole.x + hole.w / 2 - cw / 2);\n else if (side === \"right\") (left = hole.x + hole.w + GAP), (top = hole.y + hole.h / 2 - card.h / 2);\n else (left = hole.x - GAP - cw), (top = hole.y + hole.h / 2 - card.h / 2);\n left = Math.max(MARGIN, Math.min(left, vp.w - cw - MARGIN));\n top = Math.max(MARGIN, Math.min(top, vp.h - card.h - MARGIN));\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n end(false);\n } else if (e.key === \"ArrowRight\" && !last) go(index + 1);\n else if (e.key === \"ArrowLeft\" && index > 0) go(index - 1);\n else if (e.key === \"Tab\") {\n // keep Tab inside the card\n const items = Array.from(cardRef.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []);\n if (!items.length) return;\n const first = items[0];\n const lastEl = items[items.length - 1];\n const active = document.activeElement;\n if (e.shiftKey && (active === first || active === cardRef.current)) (e.preventDefault(), lastEl.focus());\n else if (!e.shiftKey && active === lastEl) (e.preventDefault(), first.focus());\n }\n };\n\n const target = (document.querySelector(\".theme-primary\") as HTMLElement | null) ?? document.body;\n const titleId = `${uid}-title`;\n const descId = `${uid}-desc`;\n\n return createPortal(\n <div style={{ zIndex }} className=\"fixed inset-0\" onKeyDown={onKeyDown}>\n {/* a clear layer that blocks clicks on the page behind */}\n <div aria-hidden=\"true\" className=\"absolute inset-0\" onClick={() => closeOnOverlayClick && end(false)} />\n {hole ? (\n <div\n aria-hidden=\"true\"\n data-tour-spotlight=\"\"\n className=\"pointer-events-none absolute rounded-lg transition-[left,top,width,height] duration-200 ease-out motion-reduce:transition-none\"\n style={{ left: hole.x, top: hole.y, width: hole.w, height: hole.h, boxShadow: \"0 0 0 9999px rgba(0,0,0,0.55)\" }}\n />\n ) : (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 bg-black/55\" />\n )}\n <div\n ref={cardRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={s.content ? descId : undefined}\n tabIndex={-1}\n style={{ left, top, width: cw }}\n className=\"absolute rounded-2xl border border-gray-200 bg-white p-5 shadow-2xl outline-none transition-[left,top] duration-200 ease-out motion-reduce:transition-none\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <h2 id={titleId} className=\"text-base font-semibold text-gray-900\">\n {s.title}\n </h2>\n <button\n type=\"button\"\n aria-label={L.close}\n onClick={() => end(false)}\n className=\"-mr-1 -mt-1 inline-flex shrink-0 rounded-lg p-1 text-gray-500 outline-none transition-colors hover:bg-gray-100 hover:text-gray-800 focus-visible:ring-2 focus-visible:ring-primary-500 motion-reduce:transition-none\"\n >\n <RiCloseLine size={18} aria-hidden=\"true\" />\n </button>\n </div>\n {s.content && (\n <div id={descId} className=\"mt-1.5 text-sm text-gray-600\">\n {s.content}\n </div>\n )}\n {steps.length > 1 && (\n <div className=\"mt-4 flex items-center gap-2 whitespace-nowrap\">\n <span className=\"text-xs tabular-nums text-gray-500\">\n Step {index + 1} of {steps.length}\n </span>\n <span aria-hidden=\"true\" className=\"flex gap-1\">\n {steps.map((_, i) => (\n <span key={i} className={cn(\"h-1.5 w-1.5 rounded-full\", i === index ? \"bg-primary-600\" : \"bg-gray-300\")} />\n ))}\n </span>\n </div>\n )}\n <div className=\"mt-3 flex items-center justify-between gap-2 whitespace-nowrap\">\n <div>\n {!hideSkip && !last && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => end(false)}>\n {L.skip}\n </Button>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {index > 0 && (\n <Button type=\"button\" size=\"sm\" variant=\"outlined\" onClick={() => go(index - 1)}>\n {L.back}\n </Button>\n )}\n <Button type=\"button\" size=\"sm\" onClick={() => (last ? end(true) : go(index + 1))}>\n {last ? L.done : (s.nextLabel ?? L.next)}\n </Button>\n </div>\n </div>\n </div>\n </div>,\n target,\n );\n};\n\nexport default Tour;\n","\"use client\";\nimport React, { forwardRef, useCallback, useEffect, useId, useImperativeHandle, useLayoutEffect, useRef, useState } from \"react\";\nimport { RiArrowGoBackLine, RiDeleteBinLine } from \"@remixicon/react\";\nimport Button from \"./Button\";\nimport { cn } from \"../utils/utils\";\n\ninterface Stroke {\n color: string;\n /** line width as a fraction of the pad width, so strokes scale with the pad */\n w: number;\n /** points as fractions of the pad width */\n pts: [number, number][];\n}\n\nexport interface SignaturePadHandle {\n /** Remove everything. */\n clear: () => void;\n /** Remove the last stroke. */\n undo: () => void;\n /** True when nothing has been drawn or typed. */\n isEmpty: () => boolean;\n /** The pad as an image data URL, or null when empty. Defaults to PNG. */\n toDataURL: (type?: \"image/png\" | \"image/jpeg\" | \"image/webp\", quality?: number) => string | null;\n /** The pad as an image Blob, or null when empty. */\n toBlob: (type?: \"image/png\" | \"image/jpeg\" | \"image/webp\", quality?: number) => Promise<Blob | null>;\n}\n\nexport interface SignaturePadProps {\n /** Optional. Controlled image (a data URL), or null for empty. Works with FormField. */\n value?: string | null;\n /** Optional. Starting image when uncontrolled, for example a saved signature. */\n defaultValue?: string | null;\n /** Called with the pad as a PNG data URL when a stroke ends, or null when it is cleared. */\n onChange?: (dataUrl: string | null) => void;\n /** Optional. \"signature\" shows a baseline and a prompt. \"drawing\" is a plain canvas. Defaults to \"signature\". */\n variant?: \"signature\" | \"drawing\";\n /** Optional. Height in px. The width fills the space. Defaults to 180. */\n height?: number;\n /** Optional. Ink colour. Defaults to near-black. */\n color?: string;\n /** Optional. Line thickness in px at a 400px wide pad. Defaults to 2.5. */\n strokeWidth?: number;\n /** Optional. A set of colours to choose from. Shows a colour picker above the pad. */\n colors?: string[];\n /** Optional. Colour behind the ink in the exported image. Defaults to transparent. Use \"#ffffff\" for JPEG. */\n backgroundColor?: string;\n /** Optional. Prompt shown on an empty signature pad. Defaults to \"Sign here\". */\n placeholder?: string;\n /** Optional. Offer typing a name as an alternative, for people who cannot draw. Defaults to true for signatures. */\n allowTyped?: boolean;\n /** Optional. Show the pad but do not allow changes. */\n readOnly?: boolean;\n disabled?: boolean;\n /** Optional. Show the error border. */\n error?: boolean;\n id?: string;\n /** Optional. Adds a hidden input holding the image, for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: boolean | \"true\" | \"false\";\n onBlur?: React.FocusEventHandler<HTMLElement>;\n}\n\nconst TYPED_FONT = \"italic 44px 'Segoe Script','Snell Roundhand','Brush Script MT','Lucida Handwriting',cursive\";\nconst REF_WIDTH = 400;\n\nexport const SignaturePad = forwardRef<SignaturePadHandle, SignaturePadProps>(function SignaturePad(\n {\n value,\n defaultValue = null,\n onChange,\n variant = \"signature\",\n height = 180,\n color = \"#111827\",\n strokeWidth = 2.5,\n colors,\n backgroundColor,\n placeholder = \"Sign here\",\n allowTyped,\n readOnly = false,\n disabled = false,\n error = false,\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": ariaInvalid,\n onBlur,\n },\n ref,\n) {\n const uid = useId();\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const strokes = useRef<Stroke[]>([]);\n const current = useRef<Stroke | null>(null);\n const base = useRef<HTMLImageElement | null>(null);\n const lastEmitted = useRef<string | null | undefined>(undefined);\n const [width, setWidth] = useState(0);\n const [, force] = useState(0);\n const [ink, setInk] = useState(colors?.[0] ?? color);\n const [mode, setMode] = useState<\"draw\" | \"type\">(\"draw\");\n const [typed, setTyped] = useState(\"\");\n const [status, setStatus] = useState(\"\");\n const [drawing, setDrawing] = useState(false);\n const typedAllowed = allowTyped ?? variant === \"signature\";\n const locked = readOnly || disabled;\n const rerender = () => force((n) => n + 1);\n\n // read through refs so delayed callbacks always see the latest mode and text\n const modeRef = useRef(mode);\n const typedRef = useRef(typed);\n modeRef.current = mode;\n typedRef.current = typed;\n const isEmpty = useCallback(\n () => (modeRef.current === \"type\" ? !typedRef.current.trim() : strokes.current.length === 0 && !base.current),\n [],\n );\n\n const paint = useCallback(() => {\n const cv = canvasRef.current;\n if (!cv || !width) return;\n const dpr = window.devicePixelRatio || 1;\n if (cv.width !== Math.round(width * dpr) || cv.height !== Math.round(height * dpr)) {\n cv.width = Math.round(width * dpr);\n cv.height = Math.round(height * dpr);\n }\n const ctx = cv.getContext(\"2d\");\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n if (mode === \"type\") {\n if (typed.trim()) {\n ctx.fillStyle = ink;\n ctx.font = TYPED_FONT;\n ctx.textBaseline = \"alphabetic\";\n ctx.fillText(typed, 20, height * 0.68, width - 40);\n }\n return;\n }\n if (base.current) ctx.drawImage(base.current, 0, 0, width, height);\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n const all = current.current ? [...strokes.current, current.current] : strokes.current;\n for (const s of all) {\n ctx.strokeStyle = s.color;\n ctx.fillStyle = s.color;\n ctx.lineWidth = s.w * width;\n const p = s.pts.map(([u, v]) => [u * width, v * width] as const);\n if (p.length === 1) {\n ctx.beginPath();\n ctx.arc(p[0][0], p[0][1], (s.w * width) / 2, 0, Math.PI * 2);\n ctx.fill();\n continue;\n }\n // smooth the line through the midpoints of neighbouring points\n ctx.beginPath();\n ctx.moveTo(p[0][0], p[0][1]);\n for (let i = 1; i < p.length - 1; i++) {\n const mx = (p[i][0] + p[i + 1][0]) / 2;\n const my = (p[i][1] + p[i + 1][1]) / 2;\n ctx.quadraticCurveTo(p[i][0], p[i][1], mx, my);\n }\n ctx.lineTo(p[p.length - 1][0], p[p.length - 1][1]);\n ctx.stroke();\n }\n }, [width, height, mode, typed, ink]);\n\n const paintRef = useRef(paint);\n paintRef.current = paint;\n useLayoutEffect(() => {\n paint();\n }, [paint]);\n\n useEffect(() => {\n const el = wrapRef.current;\n if (!el) return;\n setWidth(el.clientWidth);\n const ro = new ResizeObserver(() => setWidth(el.clientWidth));\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const toDataURL = useCallback(\n (type: \"image/png\" | \"image/jpeg\" | \"image/webp\" = \"image/png\", quality?: number) => {\n const cv = canvasRef.current;\n if (!cv || isEmpty()) return null;\n if (!backgroundColor) return cv.toDataURL(type, quality);\n const out = document.createElement(\"canvas\");\n out.width = cv.width;\n out.height = cv.height;\n const c = out.getContext(\"2d\");\n if (!c) return cv.toDataURL(type, quality);\n c.fillStyle = backgroundColor;\n c.fillRect(0, 0, out.width, out.height);\n c.drawImage(cv, 0, 0);\n return out.toDataURL(type, quality);\n },\n [backgroundColor, isEmpty],\n );\n\n const emit = useCallback(() => {\n // wait a frame so the canvas shows the latest ink before it is read\n requestAnimationFrame(() => {\n const url = toDataURL();\n lastEmitted.current = url;\n onChange?.(url);\n });\n }, [toDataURL, onChange]);\n\n const loadImage = useCallback(\n (src: string | null) => {\n strokes.current = [];\n current.current = null;\n if (!src) {\n base.current = null;\n paintRef.current();\n rerender();\n return;\n }\n const img = new Image();\n img.onload = () => {\n base.current = img;\n setMode(\"draw\");\n modeRef.current = \"draw\";\n paintRef.current();\n rerender();\n };\n img.src = src;\n },\n [],\n );\n\n // load the starting image once\n useEffect(() => {\n if (defaultValue && value === undefined) loadImage(defaultValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // follow the controlled value when it changes from outside\n useEffect(() => {\n if (value === undefined || value === lastEmitted.current) return;\n lastEmitted.current = value;\n loadImage(value);\n }, [value, loadImage]);\n\n const clear = useCallback(() => {\n strokes.current = [];\n current.current = null;\n base.current = null;\n setTyped(\"\");\n paint();\n rerender();\n setStatus(\"Signature cleared\");\n lastEmitted.current = null;\n onChange?.(null);\n }, [onChange, paint]);\n\n const undo = useCallback(() => {\n if (mode === \"type\") return;\n if (strokes.current.length) strokes.current = strokes.current.slice(0, -1);\n else base.current = null;\n paint();\n rerender();\n setStatus(\"Last stroke removed\");\n emit();\n }, [emit, mode, paint]);\n\n useImperativeHandle(\n ref,\n () => ({\n clear,\n undo,\n isEmpty,\n toDataURL,\n toBlob: (type = \"image/png\", quality) =>\n new Promise((resolve) => {\n const cv = canvasRef.current;\n if (!cv || isEmpty()) return resolve(null);\n cv.toBlob(resolve, type, quality);\n }),\n }),\n [clear, undo, isEmpty, toDataURL],\n );\n\n const pt = (e: React.PointerEvent | PointerEvent): [number, number] => {\n const r = canvasRef.current!.getBoundingClientRect();\n return [(e.clientX - r.left) / r.width, (e.clientY - r.top) / r.width];\n };\n\n const onDown = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (locked || mode !== \"draw\" || e.button !== 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n const [u, v] = pt(e);\n current.current = { color: ink, w: strokeWidth / REF_WIDTH, pts: [[u, v]] };\n setDrawing(true);\n paint();\n };\n const onMove = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const s = current.current;\n if (!s) return;\n const events = (e.nativeEvent as PointerEvent).getCoalescedEvents?.() ?? [e.nativeEvent];\n for (const ev of events.length ? events : [e.nativeEvent]) s.pts.push(pt(ev as PointerEvent));\n paint();\n };\n const onUp = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const s = current.current;\n current.current = null;\n setDrawing(false);\n if (e.currentTarget.hasPointerCapture(e.pointerId)) e.currentTarget.releasePointerCapture(e.pointerId);\n if (!s) return;\n strokes.current = [...strokes.current, s];\n paint();\n rerender();\n setStatus(\"Signature captured\");\n emit();\n };\n\n const empty = isEmpty();\n const hint = variant === \"signature\" && empty && !drawing && mode === \"draw\";\n\n return (\n <div className={cn(\"w-full\", className)}>\n {colors && colors.length > 1 && !locked && (\n <div role=\"group\" aria-label=\"Ink colour\" className=\"mb-2 flex items-center gap-2\">\n {colors.map((c) => (\n <button\n key={c}\n type=\"button\"\n aria-label={`Ink ${c}`}\n aria-pressed={ink === c}\n onClick={() => setInk(c)}\n className={cn(\"h-6 w-6 rounded-full border-2 outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\", ink === c ? \"border-gray-900\" : \"border-white shadow-[0_0_0_1px_#d1d5db]\")}\n style={{ background: c }}\n />\n ))}\n </div>\n )}\n\n <div\n ref={wrapRef}\n onBlur={onBlur}\n className={cn(\n \"relative w-full overflow-hidden rounded-xl border bg-white\",\n error || ariaInvalid === true || ariaInvalid === \"true\" ? \"border-error-500\" : \"border-gray-200\",\n disabled && \"opacity-60\",\n )}\n style={{ height }}\n >\n {hint && (\n <>\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute left-5 top-1/2 -translate-y-1/2 text-lg text-gray-400\">\n ✕\n </span>\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-5 bottom-[28%] border-b border-dashed border-gray-300\" />\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-0 bottom-[10%] text-center text-sm text-gray-400\">\n {placeholder}\n </span>\n </>\n )}\n {variant === \"signature\" && !hint && <span aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-5 bottom-[28%] border-b border-dashed border-gray-200\" />}\n <canvas\n ref={canvasRef}\n id={id}\n role=\"img\"\n aria-label={ariaLabel ?? (variant === \"signature\" ? \"Signature area. Draw with a mouse, finger or stylus.\" : \"Drawing area. Draw with a mouse, finger or stylus.\")}\n aria-describedby={describedBy}\n aria-invalid={ariaInvalid}\n onPointerDown={onDown}\n onPointerMove={onMove}\n onPointerUp={onUp}\n onPointerCancel={onUp}\n style={{ width: \"100%\", height, touchAction: \"none\", cursor: locked || mode === \"type\" ? \"default\" : \"crosshair\" }}\n className=\"block\"\n />\n </div>\n\n {!readOnly && (\n <div className=\"mt-2 flex flex-wrap items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" variant=\"outlined\" startIcon={<RiArrowGoBackLine size={16} aria-hidden=\"true\" />} onClick={undo} disabled={disabled || mode === \"type\" || empty}>\n Undo\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" startIcon={<RiDeleteBinLine size={16} aria-hidden=\"true\" />} onClick={clear} disabled={disabled || empty}>\n Clear\n </Button>\n </div>\n {typedAllowed && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"link\"\n disabled={disabled}\n onClick={() => {\n const next = mode === \"draw\" ? \"type\" : \"draw\";\n setMode(next);\n // the exported image follows the active way of signing\n setTimeout(emit, 30);\n }}\n >\n {mode === \"draw\" ? \"Type your name instead\" : \"Draw instead\"}\n </Button>\n )}\n </div>\n )}\n\n {mode === \"type\" && !readOnly && (\n <div className=\"mt-2\">\n <label htmlFor={`${uid}-typed`} className=\"mb-1 block text-sm font-medium text-gray-700\">\n Type your full name\n </label>\n <input\n id={`${uid}-typed`}\n type=\"text\"\n autoComplete=\"name\"\n value={typed}\n disabled={disabled}\n onChange={(e) => {\n setTyped(e.target.value);\n setTimeout(emit, 30);\n }}\n className=\"w-full rounded-xl border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\"\n />\n </div>\n )}\n\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {status}\n </span>\n {name && <input type=\"hidden\" name={name} value={toDataURL() ?? \"\"} readOnly />}\n </div>\n );\n});\n\nexport default SignaturePad;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface DividerProps {\n width?: string;\n height?: string;\n position?: \"horizontal\" | \"vertical\";\n className?: string;\n}\n\nconst Divider = ({\n width,\n height,\n position = \"horizontal\",\n className,\n}: DividerProps) => {\n return (\n <div\n style={{\n width: width,\n height: height,\n }}\n className={cn(\n `bg-gray-200`,\n position === \"horizontal\" ? \"w-full h-[1px]\" : \"w-[1px] h-full\",\n className\n )}\n ></div>\n );\n};\n\nexport default Divider;\n","\"use client\";\nimport React, {\n Dispatch,\n FC,\n ReactNode,\n SetStateAction,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { RiCloseLine } from \"@remixicon/react\";\n\ninterface DrawerProps {\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n children: ReactNode;\n position?: \"left\" | \"right\" | \"top\" | \"bottom\";\n width?: string;\n height?: string;\n className?: string;\n showCloseButton?: boolean;\n closeOnOutsideClick?: boolean;\n /** Optional. Close when Escape is pressed. Defaults to true. */\n closeOnEscape?: boolean;\n /** Optional. Accessible name for the drawer. Prefer aria-labelledby if you have a visible title. */\n \"aria-label\"?: string;\n /** Optional. id of the element that titles the drawer. */\n \"aria-labelledby\"?: string;\n /** Optional. id of the element that describes the drawer. */\n \"aria-describedby\"?: string;\n}\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]):not([type=\"hidden\"]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nconst Drawer: FC<DrawerProps> = ({\n isOpen,\n setIsOpen,\n children,\n position = \"right\",\n width = \"w-80\",\n height = \"h-64\",\n className,\n showCloseButton = true,\n closeOnOutsideClick = true,\n closeOnEscape = true,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n}) => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, [setIsOpen]);\n\n // Prevent body scroll while open, and restore the previous value on close.\n // (The old version wrote body.style.overflow on every change, even while\n // closed, so one closed drawer could unlock the page for another open one.)\n useEffect(() => {\n if (!isOpen) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [isOpen]);\n\n // Move focus into the drawer on open and hand it back on close.\n useEffect(() => {\n if (!isOpen) return;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n const panel = panelRef.current;\n // Respect autoFocus inside the children.\n if (panel && !panel.contains(document.activeElement)) {\n panel.focus({ preventScroll: true });\n }\n return () => {\n previouslyFocused?.focus?.();\n };\n }, [isOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!closeOnEscape) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && isOpen) {\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen, handleClose, closeOnEscape]);\n\n // Keep Tab / Shift+Tab inside the drawer.\n const handlePanelKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") return;\n const panel = panelRef.current;\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (items.length === 0) {\n event.preventDefault();\n panel.focus();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === panel)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n return (\n <div>\n <div\n className={cn(\n \"fixed inset-0 bg-black/50 backdrop-blur-[2px] z-[10000000000000000]\",\n \"transition-[opacity,visibility] duration-300 ease-out motion-reduce:transition-none\",\n isOpen\n ? \"opacity-100 visible\"\n : \"opacity-0 invisible pointer-events-none\",\n )}\n onClick={() => closeOnOutsideClick && handleClose()}\n />\n\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n tabIndex={-1}\n onKeyDown={handlePanelKeyDown}\n className={cn(\n // surface: rounded on the inner edge, hairline border, deeper shadow\n \"fixed bg-white shadow-2xl p-4 z-[100000000000000000] focus:outline-none\",\n // slides with the transform; invisible keeps a closed drawer's\n // links and buttons out of the tab order\n \"transition-[transform,visibility] duration-300 ease-out motion-reduce:transition-none\",\n position === \"right\" &&\n `top-0 right-0 ${width} h-full max-w-full rounded-l-2xl border-l border-gray-200`,\n position === \"left\" &&\n `top-0 left-0 ${width} h-full max-w-full rounded-r-2xl border-r border-gray-200`,\n position === \"top\" &&\n `top-0 left-0 w-full ${height} max-h-full rounded-b-2xl border-b border-gray-200`,\n position === \"bottom\" &&\n `bottom-0 left-0 w-full ${height} max-h-full rounded-t-2xl border-t border-gray-200`,\n !isOpen &&\n (position === \"right\"\n ? \"translate-x-full\"\n : position === \"left\"\n ? \"-translate-x-full\"\n : position === \"top\"\n ? \"-translate-y-full\"\n : \"translate-y-full\"),\n isOpen ? \"translate-x-0 translate-y-0 visible\" : \"invisible\",\n className,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={handleClose}\n aria-label=\"Close drawer\"\n className={cn(\n \"absolute top-3 right-4 z-10 inline-flex items-center justify-center rounded-lg p-1 cursor-pointer\",\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-100 hover:text-gray-800 active:bg-gray-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n )}\n >\n <RiCloseLine size={20} aria-hidden=\"true\" />\n </button>\n )}\n\n <div className=\"overflow-y-auto overscroll-contain h-full\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Drawer;\n","\"use client\";\nimport React, {\n useEffect,\n useState,\n useMemo,\n useCallback,\n forwardRef,\n useRef,\n useImperativeHandle,\n} from \"react\";\nimport { RiArrowDownSLine, RiCheckLine, RiSearchLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Input from \"./Input\";\nimport Label from \"./Label\";\nimport Checkbox from \"./Checkbox\";\n\ntype Option = {\n label: string | number;\n value: string | number;\n info?: string;\n addInfo?: string;\n tooltipContent?: string;\n disabledOption?: boolean;\n labelTextColor?: string;\n};\n\ninterface MenuItemProps {\n label?: string | number;\n value: string | number;\n children?: React.ReactNode;\n}\n\ninterface DropdownProps {\n id?: string;\n icon?: JSX.Element;\n options: Option[];\n selected?: Option[];\n setSelected?: React.Dispatch<React.SetStateAction<Option[]>>;\n onApply?: () => void;\n onReset?: () => void;\n dropdownText?: string;\n search?: boolean;\n multiple?: boolean;\n renderItem?: (option: Option) => React.ReactNode;\n children?: React.ReactNode;\n position?: \"top\" | \"bottom\";\n info?: string | number;\n addInfo?: string | number;\n tooltipContent?: string;\n width?: string;\n dropdownFooter?: boolean | undefined;\n disabled?: boolean;\n labelTextColor?: string;\n footerAction?: React.ReactNode;\n height?: string;\n}\n\nconst defaultRenderItem = (option: Option) => {\n return <MenuItem label={option.label} value={option.value} />;\n};\n\n// Shared focus ring (same family as Input, Textarea and Pagination)\nconst focusRing =\n \"focus-visible:outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\";\n\n// Small text buttons inside the menu (Select all, Reset)\nconst textButton =\n \"rounded-md px-1.5 py-0.5 text-sm font-medium cursor-pointer transition-colors duration-150 motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst Dropdown = forwardRef<HTMLDivElement, DropdownProps>(\n (\n {\n id = `dropdown-${Math.random().toString(36).substring(2, 11)}`,\n options,\n selected,\n setSelected,\n search = false,\n multiple = false,\n dropdownText = \"Select\",\n renderItem = defaultRenderItem,\n children,\n icon,\n position = \"top\",\n width,\n info,\n dropdownFooter = false,\n onApply,\n disabled = false,\n onReset,\n footerAction,\n height = \"200px\",\n },\n ref,\n ) => {\n const [searchQuery, setSearchQuery] = useState<string>(\"\");\n const [filteredOptions, setFilteredOptions] = useState<Option[]>(\n options || [],\n );\n\n const [dropdownMenu, setDropdownMenu] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n useImperativeHandle(ref, () => dropdownRef.current!);\n\n useEffect(() => {\n if (options) {\n setFilteredOptions(options);\n }\n }, [options]);\n\n const memoizedFilteredOptions = useMemo(() => {\n if (!search) return filteredOptions;\n return filteredOptions.filter((option) => {\n if (typeof option.label === \"string\") {\n return option.label.toLowerCase().includes(searchQuery.toLowerCase());\n }\n return option.label.toString().includes(searchQuery.toLowerCase());\n });\n }, [search, searchQuery, filteredOptions]);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.target.value);\n },\n [],\n );\n\n const toggleOption = useCallback(\n (option: Option) => {\n if (multiple && setSelected) {\n setSelected((prevSelected) =>\n prevSelected.some((item) => item.value === option.value)\n ? prevSelected.filter((item) => item.value !== option.value)\n : [...prevSelected, option],\n );\n } else if (setSelected) {\n setSelected([option]);\n setDropdownMenu(false);\n }\n },\n [multiple, setSelected],\n );\n\n const handleCheckboxChange = useCallback(\n (option: Option) => {\n if (multiple && setSelected) {\n setSelected((prevSelected) =>\n prevSelected.some((item) => item.value === option.value)\n ? prevSelected.filter((item) => item.value !== option.value)\n : [...prevSelected, option],\n );\n } else if (setSelected) {\n setSelected([option]);\n }\n },\n [multiple, setSelected],\n );\n\n const handleSelectAll = () => {\n if (selected?.length === filteredOptions.length) {\n setSelected?.([]);\n } else {\n setSelected?.(filteredOptions);\n }\n };\n\n const handleReset = () => {\n if (onReset) {\n onReset();\n }\n setSelected?.([]);\n setDropdownMenu(false);\n };\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setDropdownMenu(false);\n }\n };\n\n // Same text as before; hasValue only drives the placeholder colour.\n const triggerText = multiple\n ? (selected?.length ?? 0) > 0\n ? `${selected?.length} Selected`\n : dropdownText\n : selected?.[0]?.label\n ? selected?.[0]?.label\n : dropdownText;\n const hasValue = multiple\n ? (selected?.length ?? 0) > 0\n : !!selected?.[0]?.label;\n\n return (\n <div\n id={id}\n ref={dropdownRef}\n // Escape closes the menu and hands focus back to the trigger. It is\n // stopped here so an enclosing Modal doesn't also close.\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && dropdownMenu) {\n e.stopPropagation();\n setDropdownMenu(false);\n triggerRef.current?.focus();\n }\n }}\n className={cn(\n \"relative bg-white shadow-[0px_1px_2px_0px_#1018280D] rounded-xl\",\n !width && \"w-full\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n style={{\n width: width,\n }}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={dropdownMenu}\n aria-controls={`${id}-listbox`}\n aria-labelledby={`${id}-label`}\n disabled={disabled}\n onClick={() => !disabled && setDropdownMenu((prev) => !prev)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n !disabled && setDropdownMenu((prev) => !prev);\n }\n }}\n className={cn(\n // height is unchanged (py-2 + 1px border), the menu offsets depend on it\n \"w-full py-2 px-[14px] rounded-xl flex justify-between items-center gap-2 text-sm bg-white cursor-pointer border\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n focusRing,\n dropdownMenu\n ? \"border-primary-600 ring-4 ring-primary-100 hover:border-primary-600 hover:bg-white\"\n : \"border-gray-200\",\n disabled &&\n \"bg-gray-300 hover:bg-gray-300 hover:border-gray-200 cursor-not-allowed\",\n )}\n >\n <section className=\"flex min-w-0 items-center gap-2 text-ellipsis overflow-hidden\">\n {icon && (\n <span aria-hidden=\"true\" className=\"shrink-0 text-gray-500\">\n {icon}\n </span>\n )}\n <span\n id={`${id}-label`}\n className={cn(\n \"line-clamp-1 w-full text-left\",\n hasValue ? \"text-gray-900\" : \"text-gray-500\",\n )}\n >\n {triggerText}\n </span>\n </section>\n <RiArrowDownSLine\n aria-hidden=\"true\"\n size={18}\n className={cn(\n \"shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none\",\n dropdownMenu && \"rotate-180\",\n )}\n />\n </button>\n <ul\n id={`${id}-listbox`}\n role=\"listbox\"\n aria-multiselectable={multiple}\n aria-labelledby={`${id}-label`}\n className={cn(\n \"absolute w-full mt-1 z-[1000] overflow-hidden rounded-xl border border-gray-200 bg-white text-sm\",\n \"transition-[opacity,transform,max-height,visibility] ease-out motion-reduce:transition-none\",\n position === \"top\" ? \"top-10\" : \"bottom-10\",\n dropdownMenu\n ? \"max-h-[360px] h-fit opacity-100 translate-y-0 visible shadow-lg duration-150\"\n : // invisible keeps the closed menu out of the tab order\n \"max-h-0 opacity-0 -translate-y-1 invisible pointer-events-none shadow-none duration-100\",\n )}\n >\n {search && (\n <div className=\"border-b border-gray-100\">\n <Input\n id={`${id}-search`}\n type=\"text\"\n placeholder=\"Search...\"\n aria-label=\"Search options\"\n value={searchQuery}\n onChange={handleSearchChange}\n className=\"rounded-none text-gray-800 bg-white w-full h-[40px] pl-3 border-none shadow-none hover:bg-white focus-within:bg-white focus-within:hover:bg-white focus-within:ring-0\"\n endIcon={<RiSearchLine size={18} />}\n />\n </div>\n )}\n {multiple && (\n <section className=\"py-1.5 px-[10px] flex justify-between items-center border-b border-gray-100\">\n <button\n type=\"button\"\n aria-label=\"Select all\"\n onClick={handleSelectAll}\n className={cn(\n textButton,\n \"text-primary-600 hover:text-primary-700 hover:bg-primary-50\",\n )}\n >\n Select all\n </button>\n <button\n aria-label=\"Reset\"\n type=\"button\"\n className={cn(\n textButton,\n \"text-warning-700 hover:text-warning-800 hover:bg-warning-50\",\n )}\n onClick={handleReset}\n >\n Reset\n </button>\n </section>\n )}\n <section\n style={{ maxHeight: height }}\n className=\"overflow-y-auto overscroll-contain py-1\"\n >\n {options ? (\n memoizedFilteredOptions.length === 0 ? (\n <p className=\"px-[14px] py-6 text-center text-sm text-gray-500\">\n No results found\n </p>\n ) : (\n memoizedFilteredOptions.map((option, i) => {\n const isSelected =\n !!selected && selected[0]?.value === option.value;\n\n return (\n <React.Fragment key={i}>\n {multiple ? (\n <Label\n className={cn(\n \"flex flex-col py-1.5 px-[14px] mx-1 rounded-lg cursor-pointer\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-50 has-[:checked]:bg-primary-50 has-[:checked]:hover:bg-primary-100\",\n option?.disabledOption &&\n \"opacity-50 cursor-not-allowed hover:bg-transparent text-gray-300 select-none\",\n )}\n htmlFor={`${id}-checkbox-${option.value}`}\n key={i}\n >\n <section className=\"flex items-center justify-between gap-2 w-full\">\n <div className=\"flex gap-2\">\n <Checkbox\n id={`${id}-checkbox-${option.value}`}\n checked={\n selected?.some(\n (item) => item.value === option.value,\n ) ?? false\n }\n onChange={() => handleCheckboxChange(option)}\n disabled={option?.disabledOption}\n />\n <div className=\"flex items-center gap-1\">\n <div\n style={{\n color: option?.disabledOption\n ? \"#D1D5DB\"\n : option.labelTextColor,\n }}\n className={cn(\n \"break-words\",\n option?.disabledOption && \"text-gray-300\",\n )}\n >\n {renderItem(option)}\n </div>\n </div>\n </div>\n <span className=\"shrink-0 text-xs text-gray-500\">\n {option?.info}\n </span>\n </section>\n <span className=\"pt-[2px] text-xs text-gray-500\">\n {option?.addInfo}\n </span>\n </Label>\n ) : (\n <Label\n key={i}\n htmlFor={`${id}-checkbox-${option.value}`}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option?.disabledOption || undefined}\n tabIndex={option?.disabledOption ? -1 : 0}\n className={cn(\n \"flex justify-between py-1.5 px-[14px] mx-1 rounded-lg gap-2 items-center cursor-pointer\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-50\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n {\n \"bg-primary-50 hover:bg-primary-100 font-medium\":\n isSelected,\n \"opacity-50 cursor-not-allowed hover:bg-transparent text-gray-500\":\n option?.disabledOption,\n },\n )}\n onClick={() =>\n !option?.disabledOption && toggleOption(option)\n }\n onKeyDown={(e: React.KeyboardEvent) => {\n if (\n (e.key === \"Enter\" || e.key === \" \") &&\n !option?.disabledOption\n ) {\n e.preventDefault();\n toggleOption(option);\n triggerRef.current?.focus();\n }\n }}\n >\n <div\n style={{\n color: option?.disabledOption\n ? \"#D1D5DB\"\n : option.labelTextColor,\n }}\n className={cn(\n \"break-words\",\n option?.disabledOption && \"text-gray-300\",\n )}\n >\n {renderItem(option)}\n </div>\n <span className=\"flex shrink-0 items-center gap-2 text-gray-500\">\n {info}\n {isSelected && (\n <RiCheckLine\n size={16}\n aria-hidden=\"true\"\n className=\"text-primary-600\"\n />\n )}\n </span>\n </Label>\n )}\n </React.Fragment>\n );\n })\n )\n ) : (\n children\n )}\n </section>\n {footerAction && (\n <div className=\"py-2 px-2 border-t border-gray-200\">\n {footerAction}\n </div>\n )}\n {dropdownFooter && (\n <DropdownFooter\n setDropdownMenu={setDropdownMenu}\n onApply={onApply}\n />\n )}\n </ul>\n </div>\n );\n },\n);\n\nexport const MenuItem: React.FC<MenuItemProps> = ({ label, children }) => {\n return <p className=\"break-all\">{label || children}</p>;\n};\n\ninterface DropdownFooterProps {\n onApply?: (() => void) | undefined;\n setDropdownMenu?: (value: boolean) => void;\n}\n\nexport const DropdownFooter: React.FC<DropdownFooterProps> = ({\n onApply,\n setDropdownMenu,\n}) => {\n return (\n <div className=\"flex justify-end border-t border-gray-200 bg-gray-25 px-[14px] py-[8px] text-sm\">\n <button\n type=\"button\"\n className={cn(\n \"rounded-lg border border-primary-600 bg-primary-600 px-3 py-1 font-semibold text-white cursor-pointer\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-primary-700 hover:border-primary-700 active:bg-primary-900 active:border-primary-900\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n )}\n onClick={() => {\n if (onApply) {\n onApply();\n }\n if (setDropdownMenu) {\n setDropdownMenu(false);\n }\n }}\n >\n Apply\n </button>\n </div>\n );\n};\n\nDropdown.displayName = \"Dropdown\";\n\nexport default Dropdown;\n","import { cva, VariantProps } from \"class-variance-authority\";\nimport React, { LabelHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface LabelProps\n extends\n LabelHTMLAttributes<HTMLLabelElement>,\n VariantProps<typeof labelVariants> {\n htmlFor?: string;\n children: ReactNode;\n required?: boolean;\n disabled?: boolean;\n}\n\nconst labelVariants = cva(\"flex item-start\", {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n});\n\nconst Label = ({\n children,\n htmlFor,\n size,\n required,\n disabled,\n className,\n ...props\n}: LabelProps) => {\n return (\n <label\n htmlFor={htmlFor}\n className={cn(\n \"cursor-pointer\",\n labelVariants({ className, size }),\n disabled === true\n ? \"opacity-30 select-none pointer-events-none\"\n : \"opacity-100\",\n )}\n aria-disabled={disabled}\n {...props}\n >\n <div className=\"flex items-center gap-1\">\n {children}\n {required && (\n <span\n aria-label=\"required field\"\n role=\"presentation\"\n className=\"text-red-500\"\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n </div>\n </label>\n );\n};\n\nexport default Label;\n","\"use client\";\n\nimport { RiArrowDownSLine } from \"@remixicon/react\";\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n Children,\n isValidElement,\n cloneElement,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\n\n/* ─────────────────────────────\n Types\n───────────────────────────── */\ntype DropdownAlignment =\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"center\"\n | \"start\"\n | \"end\";\n\ninterface DropdownProps {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n triggerRef: React.RefObject<HTMLDivElement>;\n contentRef: React.RefObject<HTMLDivElement>;\n registerItem: () => number;\n menuItemsRef: React.MutableRefObject<(HTMLDivElement | null)[]>;\n closeMenu: () => void;\n}\n\ninterface SubmenuProps {\n isSubOpen: boolean;\n setIsSubOpen: (open: boolean) => void;\n}\n\n// Helper function to check component type\nconst isComponentType = (\n child: any,\n component: React.ComponentType<any>,\n): boolean => {\n return child.type === component;\n};\n\n/* ─────────────────────────────\n Root DropdownMenu\n───────────────────────────── */\nexport default function DropdownMenu({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const menuItemsRef = useRef<(HTMLDivElement | null)[]>([]);\n const itemsCountRef = useRef(0);\n\n const registerItem = useCallback(() => {\n const idx = itemsCountRef.current;\n itemsCountRef.current += 1;\n return idx;\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n setFocusedIndex(-1);\n }, []);\n\n const dropdownProps: DropdownProps = {\n isOpen,\n setIsOpen,\n triggerRef,\n contentRef,\n registerItem,\n menuItemsRef,\n closeMenu,\n };\n\n /* Outside click */\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: MouseEvent) => {\n if (\n triggerRef.current &&\n contentRef.current &&\n !triggerRef.current.contains(e.target as Node) &&\n !contentRef.current.contains(e.target as Node)\n ) {\n closeMenu();\n }\n };\n\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isOpen, closeMenu]);\n\n /* Keyboard navigation */\n useEffect(() => {\n if (!isOpen) return;\n\n const handler = (e: KeyboardEvent) => {\n switch (e.key) {\n case \"Escape\":\n e.preventDefault();\n closeMenu();\n triggerRef.current?.focus();\n break;\n\n case \"ArrowDown\":\n e.preventDefault();\n setFocusedIndex((p) => (p < itemsCountRef.current - 1 ? p + 1 : 0));\n break;\n\n case \"ArrowUp\":\n e.preventDefault();\n setFocusedIndex((p) => (p > 0 ? p - 1 : itemsCountRef.current - 1));\n break;\n\n case \"Home\":\n // preventDefault stops the page from scrolling while the menu is open\n e.preventDefault();\n setFocusedIndex(0);\n break;\n\n case \"End\":\n e.preventDefault();\n setFocusedIndex(itemsCountRef.current - 1);\n break;\n }\n };\n\n document.addEventListener(\"keydown\", handler);\n setFocusedIndex(0);\n\n return () => document.removeEventListener(\"keydown\", handler);\n }, [isOpen, closeMenu]);\n\n /* Focus active item */\n useEffect(() => {\n if (!isOpen) return;\n menuItemsRef.current[focusedIndex]?.focus();\n }, [focusedIndex, isOpen]);\n\n /* Enhance children with dropdown props */\n const enhancedChildren = Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n\n // Add displayName for identification\n const childWithDisplayName = cloneElement(child as React.ReactElement, {\n ...child.props,\n dropdownProps,\n });\n\n return childWithDisplayName;\n });\n\n return <div className=\"relative inline-block\">{enhancedChildren}</div>;\n}\n\n/* ─────────────────────────────\n Trigger\n───────────────────────────── */\nexport function DropdownMenuTrigger({\n children,\n dropdownProps,\n}: {\n children: React.ReactNode;\n dropdownProps?: DropdownProps;\n}) {\n const { isOpen, setIsOpen, triggerRef } = dropdownProps || {};\n\n if (!dropdownProps) {\n throw new Error(\"DropdownMenuTrigger must be used inside DropdownMenu\");\n }\n\n return (\n <div\n ref={triggerRef}\n tabIndex={0}\n role=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n onClick={() => setIsOpen?.(!isOpen)}\n // Enter / Space open the menu when the wrapper itself is focused.\n // The target check stops a nested native <button> from toggling twice.\n onKeyDown={(e) => {\n if (\n e.target === e.currentTarget &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n setIsOpen?.(!isOpen);\n }\n }}\n className={cn(\n \"cursor-pointer rounded-xl outline-none\",\n // keyboard-only ring, same family as Button\n \"focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n )}\n >\n {children}\n </div>\n );\n}\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\n\n/* ─────────────────────────────\n Content\n───────────────────────────── */\nexport function DropdownMenuContent({\n children,\n align = \"right\",\n className,\n dropdownProps,\n}: {\n children: React.ReactNode;\n align?: DropdownAlignment;\n className?: string;\n dropdownProps?: DropdownProps;\n}) {\n const { isOpen, contentRef } = dropdownProps || {};\n const [visible, setVisible] = useState(false);\n\n if (!dropdownProps) {\n throw new Error(\"DropdownMenuContent must be used inside DropdownMenu\");\n }\n\n useEffect(() => {\n if (isOpen) {\n setVisible(true);\n } else {\n const timer = setTimeout(() => setVisible(false), 150);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n if (!visible) return null;\n\n const positionClasses = {\n left: \"right-0\",\n right: \"left-0\",\n start: \"right-0\",\n end: \"left-0\",\n center: \"left-1/2 -translate-x-1/2\",\n top: \"bottom-full mb-2\",\n bottom: \"top-full mt-2\",\n };\n\n // Function to recursively inject dropdownProps\n const injectPropsToChildren = (\n children: React.ReactNode,\n ): React.ReactNode => {\n return Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n\n // Check if this is a menu item or submenu\n const isMenuItem = isComponentType(child, DropdownMenuItem);\n const isSubMenu = isComponentType(child, DropdownMenuSub);\n if (isMenuItem || isSubMenu) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n dropdownProps,\n });\n }\n\n // If it has children, recursively inject props\n if (child.props.children) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n children: injectPropsToChildren(child.props.children),\n });\n }\n\n return child;\n });\n };\n\n return (\n <div\n ref={contentRef}\n role=\"menu\"\n className={cn(\n // surface: same radius and border language as Input and Dropdown\n \"absolute mt-2 w-56 max-w-[calc(100vw-1rem)] rounded-xl border border-gray-200 bg-white p-1 shadow-lg z-50\",\n // fade and scale from the edge closest to the trigger\n align === \"top\" ? \"origin-bottom\" : \"origin-top\",\n \"transition-[opacity,transform] duration-150 ease-out motion-reduce:transition-none\",\n isOpen ? \"opacity-100 scale-100\" : \"opacity-0 scale-95\",\n positionClasses[align] || positionClasses.right,\n className,\n )}\n >\n {injectPropsToChildren(children)}\n </div>\n );\n}\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\n\n/* ─────────────────────────────\n Label\n───────────────────────────── */\nexport function DropdownMenuLabel({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"px-3 pt-2 pb-1 text-xs font-semibold uppercase tracking-wide text-gray-500 select-none\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\";\n\n/* ─────────────────────────────\n Separator\n───────────────────────────── */\nexport function DropdownMenuSeparator() {\n return <div role=\"separator\" className=\"my-1 h-px bg-gray-100\" />;\n}\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\";\n\n/* ─────────────────────────────\n Item Wrapper\n───────────────────────────── */\nfunction DropdownMenuItemWrapper({\n children,\n onClick,\n disabled,\n className,\n dropdownProps,\n closeOnClick = true,\n ariaExpanded,\n}: {\n children: React.ReactNode;\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n dropdownProps?: DropdownProps;\n closeOnClick?: boolean;\n ariaExpanded?: boolean;\n}) {\n const [index] = useState(() => dropdownProps?.registerItem?.() ?? -1);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (index >= 0 && dropdownProps?.menuItemsRef) {\n dropdownProps.menuItemsRef.current[index] = ref.current;\n }\n }, [index, dropdownProps]);\n\n const handleClick = () => {\n if (disabled) return;\n onClick?.();\n if (closeOnClick) {\n dropdownProps?.closeMenu();\n }\n };\n\n return (\n <div\n ref={ref}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-expanded={ariaExpanded}\n aria-disabled={disabled}\n onClick={handleClick}\n // Enter / Space activate the item (a div doesn't do this natively)\n onKeyDown={(e) => {\n if (\n e.target === e.currentTarget &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n handleClick();\n }\n }}\n className={cn(\n \"flex items-center justify-between gap-2 rounded-lg px-3 py-2 text-sm select-none outline-none\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n // keyboard focus: tint plus an inset ring so it is never clipped\n \"focus:bg-gray-100 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n disabled\n ? \"text-gray-400 cursor-not-allowed\"\n : \"text-gray-700 cursor-pointer hover:bg-gray-100 active:bg-gray-200\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\n/* ─────────────────────────────\n Item\n───────────────────────────── */\nexport function DropdownMenuItem({\n children,\n onClick,\n disabled,\n dropdownProps,\n className,\n}: {\n children: React.ReactNode;\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n dropdownProps?: DropdownProps;\n}) {\n return (\n <DropdownMenuItemWrapper\n className={className}\n disabled={disabled}\n onClick={onClick}\n closeOnClick={true}\n dropdownProps={dropdownProps}\n >\n {children}\n </DropdownMenuItemWrapper>\n );\n}\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\n\n/* ─────────────────────────────\n Submenu\n───────────────────────────── */\nexport function DropdownMenuSub({\n children,\n dropdownProps,\n}: {\n children: React.ReactNode;\n dropdownProps?: DropdownProps;\n}) {\n const [isSubOpen, setIsSubOpen] = useState(false);\n\n const submenuProps: SubmenuProps = {\n isSubOpen,\n setIsSubOpen,\n };\n\n // Function to inject both dropdownProps and submenuProps\n const injectPropsToChildren = (\n children: React.ReactNode,\n ): React.ReactNode => {\n return Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n\n const isSubTrigger = isComponentType(child, DropdownMenuSubTrigger);\n const isSubContent = isComponentType(child, DropdownMenuSubContent);\n const isMenuItem = isComponentType(child, DropdownMenuItem);\n const isNestedSubMenu = isComponentType(child, DropdownMenuSub);\n\n if (isSubTrigger || isSubContent || isMenuItem || isNestedSubMenu) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n dropdownProps, // Always pass dropdownProps\n ...(isSubTrigger || isSubContent ? { submenuProps } : {}),\n });\n }\n\n // If it has children, recursively inject props\n if (child.props.children) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n children: injectPropsToChildren(child.props.children),\n });\n }\n\n return child;\n });\n };\n\n return <div className=\"relative\">{injectPropsToChildren(children)}</div>;\n}\nDropdownMenuSub.displayName = \"DropdownMenuSub\";\n\nexport function DropdownMenuSubTrigger({\n children,\n submenuProps,\n dropdownProps,\n className,\n}: {\n children: React.ReactNode;\n submenuProps?: SubmenuProps;\n dropdownProps?: DropdownProps;\n className?: string;\n}) {\n return (\n <DropdownMenuItemWrapper\n dropdownProps={dropdownProps}\n // The original passed the hyphenated name, which the wrapper ignored.\n // ariaExpanded is the prop it actually reads, so screen readers now get the state.\n ariaExpanded={submenuProps?.isSubOpen}\n onClick={() => submenuProps?.setIsSubOpen(!submenuProps?.isSubOpen)}\n closeOnClick={false}\n className={className}\n >\n <span>{children}</span>\n <RiArrowDownSLine\n aria-hidden=\"true\"\n className={cn(\n \"w-4 h-4 shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none\",\n submenuProps?.isSubOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </DropdownMenuItemWrapper>\n );\n}\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\";\n\nexport function DropdownMenuSubContent({\n children,\n submenuProps,\n dropdownProps,\n}: {\n children: React.ReactNode;\n submenuProps?: SubmenuProps;\n dropdownProps?: DropdownProps;\n}) {\n // Function to inject dropdownProps to all nested components\n const injectPropsToChildren = (\n children: React.ReactNode,\n ): React.ReactNode => {\n return Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n\n const isMenuItem = isComponentType(child, DropdownMenuItem);\n const isSubMenu = isComponentType(child, DropdownMenuSub);\n\n if (isMenuItem || isSubMenu) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n dropdownProps,\n });\n }\n\n // If it has children, recursively inject props\n if (child.props.children) {\n return cloneElement(child as React.ReactElement, {\n ...child.props,\n children: injectPropsToChildren(child.props.children),\n });\n }\n\n return child;\n });\n };\n\n return (\n <div\n className={cn(\n // a thin guide line shows which items belong to the submenu\n \"ml-3 pl-1 border-l border-gray-100 overflow-hidden\",\n \"transition-[max-height,opacity] duration-200 ease-out motion-reduce:transition-none\",\n submenuProps?.isSubOpen\n ? \"max-h-[500px] opacity-100\"\n : \"max-h-0 opacity-0\",\n )}\n >\n {injectPropsToChildren(children)}\n </div>\n );\n}\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\";\n\nDropdownMenu.displayName = \"DropdownMenu\";\n","\"use client\";\nimport React, {\n useEffect,\n useState,\n useMemo,\n forwardRef,\n useCallback,\n useRef,\n useImperativeHandle,\n} from \"react\";\nimport { RiSearchLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Input from \"./Input\";\nimport Label from \"./Label\";\nimport Checkbox from \"./Checkbox\";\n\ntype Option = {\n label: string | number;\n value: string | number;\n info?: string;\n addInfo?: string;\n tooltipContent?: string;\n disabledOption?: boolean;\n labelTextColor?: string;\n};\n\ninterface MenuItemProps {\n label?: string | number;\n value: string | number;\n children?: React.ReactNode;\n}\n\ninterface DropdownFooterProps {\n onApply?: (() => void) | undefined;\n setDropdownMenu?: (value: boolean) => void;\n}\n\ninterface DropdownProps {\n id?: string;\n options: Option[];\n selected?: Option[];\n setSelected?: React.Dispatch<React.SetStateAction<Option[]>>;\n onApply?: () => void;\n onReset?: () => void;\n dropdownText?: string;\n search?: boolean;\n multiple?: boolean;\n renderItem?: (option: Option) => React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n dropdownMenu?: boolean;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n setDropdownMenu?: (value: boolean) => void;\n info?: string | number;\n addInfo?: string | number;\n tooltipContent?: string;\n width?: string;\n dropdownFooter?: boolean;\n disabled?: boolean;\n labelTextColor?: string;\n footerAction?: React.ReactNode;\n height?: string;\n}\n\nconst defaultRenderItem = (option: Option) => {\n return <MenuItem label={option.label} value={option.value} />;\n};\n\nconst DropdownWithIcon = forwardRef<HTMLDivElement, DropdownProps>(\n (\n {\n id = `dropdown-${Math.random().toString(36).substring(2, 11)}`,\n options,\n selected = [],\n setSelected,\n search = false,\n multiple = false,\n dropdownText,\n renderItem = defaultRenderItem,\n children,\n trigger,\n position = \"top\",\n width,\n info,\n dropdownFooter = false,\n onApply,\n disabled = false,\n onReset,\n footerAction,\n height = \"200px\",\n },\n ref\n ) => {\n const [searchQuery, setSearchQuery] = useState<string>(\"\");\n const localDropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownMenu, setDropdownMenu] = useState(false);\n\n useImperativeHandle(ref, () => localDropdownRef.current!);\n\n const memoizedFilteredOptions = useMemo(() => {\n if (!search) return options;\n return options?.filter(\n (option) =>\n typeof option?.label === \"string\" &&\n option?.label?.toLowerCase()?.includes(searchQuery?.toLowerCase())\n );\n }, [search, searchQuery, options]);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e?.target?.value);\n },\n []\n );\n\n const toggleOption = useCallback(\n (option: Option) => {\n if (multiple && setSelected) {\n setSelected((prevSelected) =>\n prevSelected?.some((item) => item?.value === option?.value)\n ? prevSelected?.filter((item) => item?.value !== option?.value)\n : [...prevSelected, option]\n );\n } else if (setSelected) {\n setSelected([option]);\n setDropdownMenu(false);\n }\n },\n [multiple, setSelected, setDropdownMenu]\n );\n\n const handleCheckboxChange = useCallback(\n (option: Option) => {\n if (multiple && setSelected) {\n setSelected((prevSelected) =>\n prevSelected?.some((item) => item?.value === option?.value)\n ? prevSelected?.filter((item) => item?.value !== option?.value)\n : [...prevSelected, option]\n );\n } else if (setSelected) {\n setSelected([option]);\n }\n },\n [multiple, setSelected]\n );\n\n const handleSelectAll = () => {\n if (selected?.length === options?.length) {\n setSelected?.([]);\n } else {\n setSelected?.(options);\n }\n };\n\n const handleReset = () => {\n if (onReset) {\n onReset();\n }\n setSelected?.([]);\n setDropdownMenu(false);\n };\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n localDropdownRef?.current &&\n !localDropdownRef?.current?.contains(event?.target as Node)\n ) {\n setDropdownMenu(false);\n }\n };\n\n document?.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document?.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [setDropdownMenu]);\n\n return (\n <div\n id={id}\n ref={localDropdownRef}\n className={cn(\n \"relative\",\n !width && \"w-full\",\n disabled && \"cursor-not-allowed opacity-50\"\n )}\n style={{\n width: width,\n }}\n >\n <button\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={dropdownMenu}\n aria-labelledby={`${id}-label`}\n disabled={disabled}\n onClick={() => !disabled && setDropdownMenu((prev) => !prev)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n !disabled && setDropdownMenu((prev) => !prev);\n }\n }}\n className={cn(\n \"w-full\",\n disabled && \"cursor-not-allowed opacity-50\",\n dropdownText && \"flex items-center gap-2\"\n )}\n >\n {trigger}\n {dropdownText && (\n <span id={`${id}-label`} className=\"text-sm text-gray-800\">\n {dropdownText}\n </span>\n )}\n </button>\n <ul\n role=\"listbox\"\n aria-multiselectable={multiple}\n aria-labelledby={`${id}-label`}\n tabIndex={-1}\n className={cn(\n \"max-h-0 opacity-0 overflow-hidden shadow-sm mt-1 rounded absolute text-sm bg-white z-[1000] w-full transition-all duration-75 delay-100 ease-in\",\n dropdownMenu\n ? \"border border-primary-600\"\n : \"border border-gray-200\",\n position === \"top\"\n ? \"top-10\"\n : position === \"bottom\"\n ? \"bottom-10\"\n : position === \"left\"\n ? \"left-0\"\n : position === \"right\"\n ? \"right-[90%]\"\n : \"top-10\",\n dropdownMenu &&\n \"max-h-[360px] h-fit opacity-[1] transition-all ease-in duration-150\"\n )}\n style={{\n width: width,\n minWidth: \"200px\",\n top: \"calc(100% + 4px)\",\n }}\n >\n {search && (\n <Input\n id={`${id}-search`}\n type=\"text\"\n placeholder=\"Search...\"\n aria-label=\"Search options\"\n value={searchQuery}\n onChange={handleSearchChange}\n className=\"rounded rounded-b-none text-gray-800 bg-white w-full h-[35px] pl-3 border-none\"\n endIcon={<RiSearchLine size={18} />}\n />\n )}\n {multiple && (\n <section className=\"py-[6px] px-[14px] flex justify-between items-center\">\n <button\n type=\"button\"\n aria-label=\"Select all\"\n onClick={handleSelectAll}\n className=\"text-sm hover:text-primary-700 text-primary-600 cursor-pointer\"\n >\n Select all\n </button>\n <button\n aria-label=\"Reset\"\n type=\"button\"\n className=\"text-sm text-warning-500 hover:text-warning-600\"\n onClick={handleReset}\n >\n Reset\n </button>\n </section>\n )}\n <section style={{ maxHeight: height }} className=\"z-[1000] transition-all duration-75 delay-100 ease-in-out overflow-y-scroll\">\n {options\n ? memoizedFilteredOptions?.map((option, i) => (\n <React.Fragment key={i}>\n {multiple ? (\n <Label\n className={cn(\n \"has-[:checked]:bg-primary-50 has-[:checked]:border-primary-600 hover:bg-gray-50 flex flex-col py-[6px] px-[14px] break-words cursor-pointer border-l-4 border-transparent\",\n option?.disabledOption &&\n \"opacity-50 cursor-not-allowed hover:bg-white text-gray-300 select-none\"\n )}\n htmlFor={`${id}-checkbox-${option.value}`}\n key={i}\n >\n <section className=\"flex items-center justify-between gap-2 w-full\">\n <div className=\"flex gap-2\">\n <Checkbox\n id={`${id}-checkbox-${option.value}`}\n checked={selected?.some(\n (item) => item?.value === option?.value\n )}\n onChange={() => handleCheckboxChange(option)}\n disabled={option?.disabledOption}\n />\n <div className=\"flex items-center gap-1\">\n <div\n style={{\n color: option?.disabledOption\n ? \"#D1D5DB\"\n : option.labelTextColor,\n }}\n className={cn(\n \"break-words\",\n option?.disabledOption && \"text-gray-300\"\n )}\n >\n {renderItem(option)}\n </div>\n </div>\n </div>\n <span className=\"text-gray-500\">{option?.info}</span>\n </section>\n <span className=\"pt-[2px] text-sm text-gray-500\">\n {option?.addInfo}\n </span>\n </Label>\n ) : (\n <Label\n htmlFor={`${id}-checkbox-${option.value}`}\n key={i}\n className={cn(\n \"flex justify-between py-[6px] px-[14px] hover:bg-gray-50 gap-2 items-center border-l-4 border-transparent cursor-pointer\",\n {\n \"bg-primary-50 border-primary-600\":\n selected && selected[0]?.value === option?.value,\n \"opacity-50 cursor-not-allowed hover:bg-white text-gray-500\":\n option?.disabledOption,\n }\n )}\n onClick={() =>\n !option?.disabledOption && toggleOption(option)\n }\n >\n <div\n style={{\n color: option?.disabledOption\n ? \"#D1D5DB\"\n : option.labelTextColor,\n }}\n className={cn(\n \"break-words\",\n option?.disabledOption && \"text-gray-300\"\n )}\n >\n {renderItem(option)}\n </div>\n <span className=\"text-gray-500\">{info}</span>\n </Label>\n )}\n </React.Fragment>\n ))\n : children}\n </section>\n {footerAction && (\n <div className=\"py-2 mt-1 px-2 border-t\">{footerAction}</div>\n )}\n {dropdownFooter && (\n <DropdownFooter\n setDropdownMenu={setDropdownMenu}\n onApply={onApply}\n />\n )}\n </ul>\n </div>\n );\n }\n);\n\nexport const MenuItem: React.FC<MenuItemProps> = ({ label, children }) => {\n return <p className=\"break-all\">{label || children}</p>;\n};\n\nconst DropdownFooter: React.FC<DropdownFooterProps> = ({\n onApply,\n setDropdownMenu,\n}) => {\n return (\n <div className=\"flex justify-end border-t border-gray-200 px-[14px] py-[8px] text-sm\">\n <button\n type=\"button\"\n className=\"text-primary-600 hover:text-primary-700\"\n onClick={() => {\n if (onApply) {\n onApply();\n }\n if (setDropdownMenu) {\n setDropdownMenu(false);\n }\n }}\n >\n Apply\n </button>\n </div>\n );\n};\n\nDropdownWithIcon.displayName = \"DropdownWithIcon\";\n\nexport default DropdownWithIcon;\n","\"use client\";\nimport React, { forwardRef, InputHTMLAttributes, useRef } from \"react\";\n\ninterface FileSelectorProps extends InputHTMLAttributes<HTMLInputElement> {\n component: JSX.Element;\n}\n\nconst FileSelector = forwardRef<HTMLInputElement, FileSelectorProps>(\n ({ component, ...props }, ref) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const inputRef = (ref as React.RefObject<HTMLInputElement>) || internalRef;\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n return (\n <div\n onClick={handleClick}\n style={{ display: \"inline-block\", cursor: \"pointer\" }}\n >\n <input\n type=\"file\"\n ref={inputRef}\n {...props}\n style={{ display: \"none\" }}\n />\n {component}\n </div>\n );\n }\n);\n\nFileSelector.displayName = \"FileSelector\";\n\nexport default FileSelector;\n","\"use client\";\nimport React, { forwardRef, useState, DragEvent } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { RiUpload2Line } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Label from \"./Label\";\nimport FileUploadPreview from \"./FileUploadPreview\";\n\nexport interface FileUploadProps extends InputHTMLAttributes<HTMLInputElement> {\n id: string;\n selectedFile?: File[];\n setSelectedFile?: (files: File[]) => void;\n children?: ReactNode;\n onDelete?: (index: number) => void;\n title?: string;\n disabled?: boolean;\n filePreviewClassName?: string;\n}\n\nconst FileUpload = forwardRef<HTMLInputElement, FileUploadProps>(\n (\n {\n selectedFile,\n setSelectedFile,\n onChange,\n multiple,\n onDelete,\n children,\n disabled,\n title,\n filePreviewClassName,\n id,\n className,\n accept,\n ...props\n },\n ref,\n ) => {\n const [isDragging, setIsDragging] = useState(false);\n\n const handleDragOver = (e: DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragLeave = () => {\n setIsDragging(false);\n };\n\n const handleDrop = (e: DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length === 0) return;\n\n if (multiple) {\n setSelectedFile && setSelectedFile([...(selectedFile || []), ...files]);\n } else {\n setSelectedFile && setSelectedFile([files[0]]);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n <input\n type=\"file\"\n {...props}\n accept={accept}\n id={id}\n onChange={onChange}\n multiple={multiple}\n disabled={disabled}\n hidden\n ref={ref}\n />\n <Label\n htmlFor={id}\n disabled={disabled}\n role=\"button\"\n aria-label={`Upload ${multiple ? \"files\" : \"file\"}`}\n aria-disabled={disabled || undefined}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.currentTarget.click();\n }\n }}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={cn(\n // layout (height and width are unchanged)\n \"group w-full h-[126px] px-6 py-4 flex items-center justify-center cursor-pointer\",\n // surface\n \"rounded-xl border-2 border-dashed border-gray-200 bg-white\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // hover\n \"hover:bg-gray-50 hover:border-primary-300\",\n // keyboard focus (same ring as Input and Textarea)\n \"focus-visible:outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\",\n // drag-over: stays highlighted even while hovered\n isDragging &&\n \"border-primary-500 bg-primary-50 ring-4 ring-primary-100 hover:bg-primary-50 hover:border-primary-500\",\n // disabled\n disabled && \"pointer-events-none opacity-30\",\n className,\n )}\n >\n {/* pointer-events-none stops children from firing dragleave, which made the drag highlight flicker */}\n <div\n className={cn(\n \"grid grid-cols-1 place-items-center gap-2 pointer-events-none\",\n )}\n >\n <div\n className={cn(\n \"w-10 h-10 border-[6px] border-gray-50 bg-gray-200 text-gray-600 rounded-full p-1 flex justify-center items-center\",\n \"transition-[background-color,border-color,color,transform] duration-200 ease-out\",\n \"motion-reduce:transition-none motion-reduce:transform-none\",\n \"group-hover:border-primary-50 group-hover:bg-primary-100 group-hover:text-primary-600\",\n \"group-focus-visible:border-primary-50 group-focus-visible:bg-primary-100 group-focus-visible:text-primary-600\",\n isDragging &&\n \"border-primary-50 bg-primary-100 text-primary-600 scale-110\",\n )}\n >\n <RiUpload2Line className=\"w-5 h-5\" />\n </div>\n <div>\n <p className=\"text-center text-sm text-gray-600\">\n <span className=\"text-primary-600 font-semibold\">\n Click to upload or drag and drop\n </span>{\" \"}\n <br /> {title}\n </p>\n </div>\n </div>\n </Label>\n <section className={cn(`grid gap-2`, filePreviewClassName)}>\n {selectedFile?.map((file, index) => (\n <FileUploadPreview\n key={file.name || index}\n file={file}\n index={index}\n onDelete={onDelete}\n >\n {children}\n </FileUploadPreview>\n ))}\n </section>\n </div>\n );\n },\n);\n\nFileUpload.displayName = \"FileUpload\";\n\nexport default FileUpload;\n","import {\n RiDeleteBinLine,\n RiFileExcel2Line,\n RiFileLine,\n RiFilePdf2Line,\n RiFilePpt2Line,\n RiFileWord2Line,\n RiFileZipLine,\n RiImageLine,\n RiMusic2Line,\n RiVideoLine,\n} from \"@remixicon/react\";\nimport React, { ReactNode } from \"react\";\n\ninterface FileUploadPreviewProps {\n index: number;\n file: File;\n children?: ReactNode;\n onDelete?: (index: number) => void;\n}\n\nconst getIconForMimeType = (file: File) => {\n const fileName = typeof file === \"string\" ? file : file.name;\n const extension = fileName.split(\".\").pop()?.toLowerCase();\n\n let iconComponent: JSX.Element;\n switch (extension) {\n case \"jpg\":\n case \"jpeg\":\n case \"png\":\n case \"gif\":\n case \"svg\":\n case \"webp\":\n iconComponent = (\n <RiImageLine className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"mp3\":\n case \"wav\":\n case \"ogg\":\n iconComponent = (\n <RiMusic2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"mp4\":\n case \"avi\":\n case \"mkv\":\n iconComponent = (\n <RiVideoLine className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"xls\":\n case \"xlsx\":\n case \"csv\":\n case \"txt\":\n case \"ods\":\n iconComponent = (\n <RiFileExcel2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"doc\":\n case \"docx\":\n case \"odt\":\n case \"xml\":\n iconComponent = (\n <RiFileWord2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"pptx\":\n case \"pptm\":\n case \"xps\":\n case \"ppsx\":\n iconComponent = (\n <RiFilePpt2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"rar\":\n case \"zip\":\n iconComponent = (\n <RiFileZipLine className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n case \"pdf\":\n iconComponent = (\n <RiFilePdf2Line className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n default:\n // Return generic file icon\n iconComponent = (\n <RiFileLine className=\"text-primary-600 bg-primary-100 border-4 border-primary-50 w-8 h-8 p-1 rounded-full\" />\n );\n break;\n }\n return iconComponent;\n};\n\nconst FileUploadPreview = ({\n index,\n file,\n children,\n onDelete,\n}: FileUploadPreviewProps) => {\n return (\n <div\n key={index}\n className=\"p-4 border border-gray-200 rounded-lg flex items-center justify-between gap-5\"\n >\n <div className=\"flex items-center gap-2 w-full\">\n {getIconForMimeType(file)}\n <div className=\"flex flex-col gap-1 w-full\">\n <p className=\"text-sm line-clamp-2 break-all\">\n {typeof file === \"string\" ? file : file.name}{\" \"}\n </p>\n {children && <div className=\"w-full\">{children}</div>}\n </div>\n </div>\n <button type=\"button\" onClick={() => onDelete?.(index)}>\n <RiDeleteBinLine className=\"text-gray-500 w-5 h-5 cursor-pointer\" />\n </button>\n </div>\n );\n};\n\nexport default FileUploadPreview;\n","\"use client\";\nimport React, { useEffect, useRef, forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface GlobalNavigationProps {\n isOpen: boolean;\n setIsOpen: (isOpen: boolean) => void;\n className?: string;\n children: React.ReactNode;\n trigger: JSX.Element;\n postion?: \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\";\n}\n\nconst GlobalNavigation = forwardRef<HTMLDivElement, GlobalNavigationProps>(\n (\n {\n isOpen,\n setIsOpen,\n trigger,\n children,\n className,\n postion = \"bottom-right\",\n },\n ref,\n ) => {\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Close on an outside click, and on Escape (returning focus to the trigger).\n // Listeners are only attached while the panel is open.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n !triggerRef.current?.contains(event.target as Node) &&\n !contentRef.current?.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen, setIsOpen]);\n\n return (\n <div className=\"relative w-max\" ref={ref}>\n <div\n ref={triggerRef}\n // The trigger was a bare clickable div. It is now focusable and\n // announces its state; Enter / Space toggle it when the wrapper itself\n // has focus (the target check stops a nested <button> from toggling twice).\n role=\"button\"\n tabIndex={0}\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n onClick={() => setIsOpen(!isOpen)}\n onKeyDown={(e) => {\n if (\n e.target === e.currentTarget &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n setIsOpen(!isOpen);\n }\n }}\n className={cn(\n \"cursor-pointer rounded-full outline-none\",\n // keyboard-only ring, same as Button\n \"focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n )}\n >\n {trigger}\n </div>\n {isOpen && (\n <div\n ref={contentRef}\n className={cn(\n // surface: same radius, border and shadow family as Modal, Dropdown and Card\n \"absolute z-10 bg-white rounded-xl shadow-lg border border-gray-200 min-w-[200px] max-w-[calc(100vw-2rem)] p-4\",\n // fades in when it opens (it is mounted on open, so a CSS\n // transition could never run)\n \"animate-fade-in motion-reduce:animate-none\",\n // Offsets are relative to the trigger, not hard-coded pixels.\n // The top placements used bottom-[57px], which only worked for\n // a trigger exactly 56px tall.\n postion === \"bottom-left\" && \"left-0 top-full mt-2\",\n postion === \"bottom-right\" && \"right-0 top-full mt-2\",\n postion === \"top-left\" && \"left-0 bottom-full mb-2\",\n postion === \"top-right\" && \"right-0 bottom-full mb-2\",\n className,\n )}\n >\n {children}\n </div>\n )}\n </div>\n );\n },\n);\n\nGlobalNavigation.displayName = \"GlobalNavigation\";\n\nexport default GlobalNavigation;\n","import React, { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface HelperTextProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode;\n size?: \"sm\" | \"lg\";\n error?: boolean;\n}\n\nconst HelperText = ({ children, className, size, error }: HelperTextProps) => {\n return (\n <span\n className={cn(\n \"text-gray-500\",\n error && \"text-error-500\",\n className,\n size === \"sm\" ? \"text-xs\" : \"text-sm\"\n )}\n >\n {children}\n </span>\n );\n};\n\nexport default HelperText;\n","\"use client\";\nimport React, { useState } from \"react\";\nimport { RiArrowLeftSLine, RiArrowRightSLine } from \"@remixicon/react\";\nimport Button from \"./Button\";\nimport { cn } from \"../utils/utils\";\n\ninterface ListPaginationProps {\n count: number;\n page: number;\n rowsPerPage: number;\n onPageChange: (newPage: number) => void;\n className?: string;\n}\n\nconst ListPagination: React.FC<ListPaginationProps> = ({\n count,\n page,\n rowsPerPage,\n onPageChange,\n className,\n}) => {\n const totalPages = Math.ceil(count / rowsPerPage);\n const [expanded, setExpanded] = useState(false);\n\n const renderPages = () => {\n if (totalPages <= 6 || expanded) {\n return [...Array(totalPages)].map((_, i) => (\n <PageBtn key={i} i={i} page={page} onPageChange={onPageChange} />\n ));\n }\n\n const start = [0, 1];\n const mid = [page - 1, page, page + 1].filter(\n (i) => i > 1 && i < totalPages - 2,\n );\n const end = [totalPages - 2, totalPages - 1];\n\n const range = Array.from(new Set([...start, ...mid, ...end]));\n return range.map((i, idx) =>\n typeof range[idx - 1] === \"number\" && i - range[idx - 1] > 1 ? (\n <Button\n key={`dots-${i}`}\n size=\"sm\"\n variant=\"outlined\"\n aria-label=\"Show all pages\"\n className=\"min-w-9 px-2\"\n onClick={() => setExpanded(true)}\n >\n ...\n </Button>\n ) : (\n <PageBtn key={i} i={i} page={page} onPageChange={onPageChange} />\n ),\n );\n };\n\n return (\n <section\n role=\"navigation\"\n aria-label=\"Pagination\"\n className={cn(\"flex items-center gap-1\", className)}\n >\n <NavBtn\n label=\"Previous page\"\n icon={<RiArrowLeftSLine size={22} />}\n onClick={() => onPageChange(page - 1)}\n disabled={page === 0}\n />\n {/* p-2 leaves room for the hover shadow and focus ring inside the scroll area */}\n <div className=\"max-w-[90vw] w-max overflow-auto flex items-center gap-2 p-2\">\n {renderPages()}\n </div>\n <NavBtn\n label=\"Next page\"\n icon={<RiArrowRightSLine size={22} />}\n onClick={() => onPageChange(page + 1)}\n disabled={page === totalPages - 1}\n />\n </section>\n );\n};\n\nconst PageBtn = ({\n i,\n page,\n onPageChange,\n}: {\n i: number;\n page: number;\n onPageChange: (i: number) => void;\n}) => {\n const isActive = i === page;\n\n return (\n <Button\n size=\"sm\"\n // the current page is a solid button, the others stay outlined\n variant={isActive ? \"filled\" : \"outlined\"}\n aria-label={`Page ${i + 1}`}\n aria-current={isActive ? \"page\" : undefined}\n className=\"min-w-9 px-2 tabular-nums\"\n onClick={() => onPageChange(i)}\n >\n {i + 1}\n </Button>\n );\n};\n\nconst NavBtn = ({\n icon,\n onClick,\n disabled,\n label,\n}: {\n icon: JSX.Element;\n onClick: () => void;\n disabled: boolean;\n label: string;\n}) => (\n <Button\n size=\"sm\"\n variant=\"outlined\"\n startIcon={icon}\n onClick={onClick}\n disabled={disabled}\n aria-label={label}\n className=\"p-2\"\n />\n);\n\nexport default ListPagination;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface LoadingProps {\n width?: string;\n height?: string;\n loaderColor?: string;\n variant?: \"light\" | \"heavy\";\n}\n\nconst Loading = ({ width, height, loaderColor, variant }: LoadingProps) => {\n return (\n <div\n // announced as a status message, and the spinner is never squashed\n // when it sits next to text in a flex row (for example inside a Button)\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\n \"shrink-0 animate-spin-slow rounded-full\",\n // faint full ring as the track, with a solid arc on top that spins.\n // These are the defaults. A loaderColor overrides them inline below.\n \"border-primary-600/25 border-t-primary-600\",\n variant === \"light\" ? \"border-2\" : \"border-4\",\n )}\n style={{\n width: width,\n height: height,\n // loaderColor can be any CSS colour (named, hex, rgb, oklch...).\n // The track is the same colour at 25% so it matches the arc.\n ...(loaderColor\n ? {\n borderColor: `color-mix(in srgb, ${loaderColor} 25%, transparent)`,\n borderTopColor: loaderColor,\n }\n : {}),\n }}\n ></div>\n );\n};\n\nexport default Loading;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { RiArrowDownSLine, RiCheckLine, RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport type { SelectGroup, SelectOption } from \"./Select\";\n\nexport type MultiSelectOption = SelectOption;\nexport type MultiSelectGroup = SelectGroup;\ntype Val = string | number;\n\nexport interface MultiSelectProps {\n /** Flat options, or groups of options. */\n options: (MultiSelectOption | MultiSelectGroup)[];\n /** Controlled selected values. */\n value?: Val[];\n /** Uncontrolled initial values. */\n defaultValue?: Val[];\n /** Called with the new values and their options. */\n onChange?: (values: Val[], options: MultiSelectOption[]) => void;\n placeholder?: string;\n /** Optional. Type to filter the list. Defaults to true. */\n searchable?: boolean;\n /** Optional. Called whenever the user types (for server search; combine with filter={false}). */\n onInputChange?: (query: string) => void;\n /** Optional. Custom matcher, or false to disable client-side filtering. */\n filter?: ((option: MultiSelectOption, query: string) => boolean) | false;\n /** Optional. Show a \"Select all\" row (hidden while searching or when maxSelected is set). */\n showSelectAll?: boolean;\n /** Optional. Maximum number of selections. Remaining options are disabled once reached. */\n maxSelected?: number;\n /** Optional. Show this many tags when closed, then a \"+N\" tag. Shows all when omitted. */\n maxTagCount?: number;\n /** Optional. Show a clear-all button when something is selected. Defaults to true. */\n clearable?: boolean;\n /** Optional. Text shown when nothing matches. */\n emptyText?: string;\n loading?: boolean;\n disabled?: boolean;\n error?: boolean;\n /** Optional. \"sm\" = 320px, \"lg\" = 313px, default = full width (same as Input). */\n size?: \"sm\" | \"lg\";\n /** Optional. Open the list above or below. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. Max height of the list in px. Defaults to 264. */\n maxHeight?: number;\n id?: string;\n /** Optional. Adds hidden inputs (one per value) for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n}\n\nconst isGroup = (o: MultiSelectOption | MultiSelectGroup): o is MultiSelectGroup => \"options\" in o;\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst MultiSelect = ({\n options,\n value,\n defaultValue = [],\n onChange,\n placeholder = \"Select options\",\n searchable = true,\n onInputChange,\n filter,\n showSelectAll = false,\n maxSelected,\n maxTagCount,\n clearable = true,\n emptyText = \"No results\",\n loading = false,\n disabled = false,\n error = false,\n size,\n placement = \"bottom\",\n maxHeight = 264,\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n}: MultiSelectProps) => {\n const reactId = useId();\n const inputId = id ?? `multiselect-${reactId}`;\n const listId = `${inputId}-list`;\n\n const [inner, setInner] = useState<Val[]>(defaultValue);\n const current = value !== undefined ? value : inner;\n\n const flatAll = useMemo(() => {\n const out: { option: MultiSelectOption; group?: string }[] = [];\n options.forEach((o) => {\n if (isGroup(o)) o.options.forEach((opt) => out.push({ option: opt, group: o.label }));\n else out.push({ option: o });\n });\n return out;\n }, [options]);\n\n const selectedOptions = useMemo(\n () =>\n current\n .map((v) => flatAll.find((f) => f.option.value === v)?.option)\n .filter((o): o is MultiSelectOption => !!o),\n [current, flatAll],\n );\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [active, setActive] = useState(-1);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const limitReached = maxSelected !== undefined && current.length >= maxSelected;\n\n const matcher = useCallback(\n (o: MultiSelectOption, q: string) =>\n filter === false ? true : filter ? filter(o, q) : o.label.toLowerCase().includes(q.trim().toLowerCase()),\n [filter],\n );\n\n // Rows: optional \"select all\", then options\n type Row =\n | { kind: \"all\" }\n | { kind: \"option\"; option: MultiSelectOption; group?: string; first?: boolean };\n\n const rows: Row[] = useMemo(() => {\n const q = query.trim();\n const base = q ? flatAll.filter((f) => matcher(f.option, q)) : flatAll;\n const out: Row[] = [];\n if (showSelectAll && !q && maxSelected === undefined && base.length) out.push({ kind: \"all\" });\n let last: string | undefined;\n base.forEach((f) => {\n out.push({ kind: \"option\", option: f.option, group: f.group, first: f.group !== last });\n last = f.group;\n });\n return out;\n }, [flatAll, query, matcher, showSelectAll, maxSelected]);\n\n const isSelected = (v: Val) => current.includes(v);\n const optionDisabled = (o: MultiSelectOption) => !!o.disabled || (limitReached && !isSelected(o.value));\n const rowEnabled = (r: Row) => r.kind === \"all\" || !optionDisabled(r.option);\n\n const commit = (values: Val[]) => {\n if (value === undefined) setInner(values);\n onChange?.(\n values,\n values.map((v) => flatAll.find((f) => f.option.value === v)!.option).filter(Boolean),\n );\n };\n\n const toggle = (v: Val) =>\n commit(isSelected(v) ? current.filter((x) => x !== v) : [...current, v]);\n\n const enabledOptions = flatAll.filter((f) => !f.option.disabled).map((f) => f.option.value);\n const allSelected = enabledOptions.length > 0 && enabledOptions.every(isSelected);\n\n const toggleAll = () => {\n if (allSelected) {\n // keep disabled-but-selected values\n commit(current.filter((v) => !enabledOptions.includes(v)));\n } else {\n commit([...current, ...enabledOptions.filter((v) => !isSelected(v))]);\n }\n };\n\n const pick = (i: number) => {\n const r = rows[i];\n if (!r) return;\n if (r.kind === \"all\") toggleAll();\n else if (!optionDisabled(r.option)) toggle(r.option.value);\n };\n\n const closeList = useCallback(() => {\n setOpen(false);\n setQuery(\"\");\n setActive(-1);\n }, []);\n\n const openList = () => {\n if (disabled || open) return;\n setOpen(true);\n setActive(rows.findIndex(rowEnabled));\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) closeList();\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, closeList]);\n\n // Keep the highlight on a valid row when the list changes\n useEffect(() => {\n if (!open) return;\n setActive((a) => (a >= 0 && a < rows.length && rowEnabled(rows[a]) ? a : rows.findIndex(rowEnabled)));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rows, open]);\n\n useEffect(() => {\n if (!open || active < 0) return;\n const el = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n const list = listRef.current;\n if (!el || !list) return;\n if (el.offsetTop < list.scrollTop) list.scrollTop = el.offsetTop;\n else if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight)\n list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;\n }, [open, active]);\n\n const step = (dir: 1 | -1) => {\n if (!open) return openList();\n for (let i = active + dir; i >= 0 && i < rows.length; i += dir) {\n if (rowEnabled(rows[i])) return setActive(i);\n }\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n step(1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n step(-1);\n break;\n case \"Enter\":\n if (open && active >= 0) {\n e.preventDefault();\n pick(active);\n }\n break;\n case \" \":\n // Space toggles only when not typing a query\n if (open && !query && active >= 0) {\n e.preventDefault();\n pick(active);\n }\n break;\n case \"Backspace\":\n if (!query && current.length) commit(current.slice(0, -1));\n break;\n case \"Escape\":\n if (open) {\n e.preventDefault();\n e.stopPropagation();\n closeList();\n }\n break;\n case \"Tab\":\n if (open) closeList();\n break;\n }\n };\n\n const visibleTags =\n !open && maxTagCount !== undefined ? selectedOptions.slice(0, maxTagCount) : selectedOptions;\n const hiddenCount = selectedOptions.length - visibleTags.length;\n const activeId = open && active >= 0 ? `${inputId}-opt-${active}` : undefined;\n\n return (\n <div ref={rootRef} className=\"relative inline-block max-w-full\">\n {name && current.map((v) => <input key={String(v)} type=\"hidden\" name={name} value={String(v)} />)}\n\n <div\n onClick={() => {\n inputRef.current?.focus();\n openList();\n }}\n className={cn(\n \"group flex min-h-10 max-w-full cursor-text items-center gap-2 rounded-xl px-3 py-1.5\",\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n disabled && \"opacity-30 bg-gray-300 select-none pointer-events-none shadow-none\",\n size === \"sm\" ? \"w-[320px]\" : size === \"lg\" ? \"w-[313px] min-h-11\" : \"w-full\",\n error && \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n className,\n )}\n >\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1\">\n {visibleTags.map((o) => (\n <span\n key={String(o.value)}\n className=\"inline-flex max-w-[180px] items-center gap-1 rounded-md bg-primary-50 py-0.5 pl-2 pr-1 text-xs font-medium text-primary-700\"\n >\n <span className=\"truncate\">{o.label}</span>\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={`Remove ${o.label}`}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation();\n toggle(o.value);\n }}\n className={cn(\"inline-flex rounded p-0.5 hover:bg-primary-100\", focusRing)}\n >\n <RiCloseLine size={12} aria-hidden=\"true\" />\n </button>\n </span>\n ))}\n {hiddenCount > 0 && (\n <span className=\"inline-flex items-center rounded-md bg-gray-100 px-2 py-0.5 text-xs font-medium text-gray-700\">\n +{hiddenCount}\n </span>\n )}\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n disabled={disabled}\n readOnly={!searchable}\n value={query}\n placeholder={selectedOptions.length ? \"\" : placeholder}\n aria-autocomplete={searchable ? \"list\" : \"none\"}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n aria-activedescendant={activeId}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-invalid={error || undefined}\n onFocus={openList}\n onChange={(e) => {\n setQuery(e.target.value);\n if (!open) setOpen(true);\n onInputChange?.(e.target.value);\n }}\n onKeyDown={onKeyDown}\n className=\"h-7 min-w-[60px] flex-1 bg-transparent text-sm text-gray-900 placeholder:text-gray-500 focus:outline-none\"\n />\n </div>\n {clearable && selectedOptions.length > 0 && !disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label=\"Clear all\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation();\n commit([]);\n inputRef.current?.focus();\n }}\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-800\",\n focusRing,\n )}\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n <RiArrowDownSLine\n size={18}\n aria-hidden=\"true\"\n className={cn(\n \"shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none group-hover:text-gray-600\",\n open && \"rotate-180\",\n )}\n />\n </div>\n\n {open && (\n <div\n className={cn(\n \"absolute left-0 z-50 w-full min-w-[200px] rounded-xl border border-gray-200 bg-white shadow-lg\",\n placement === \"top\" ? \"bottom-full mb-2\" : \"top-full mt-2\",\n )}\n >\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n style={{ maxHeight }}\n className=\"overflow-y-auto p-1\"\n >\n {loading && <div className=\"px-3 py-2 text-sm text-gray-500\">Loading…</div>}\n {!loading && rows.length === 0 && <div className=\"px-3 py-2 text-sm text-gray-500\">{emptyText}</div>}\n {rows.map((r, i) => {\n const isActive = i === active;\n if (r.kind === \"all\") {\n return (\n <div\n key=\"__all\"\n id={`${inputId}-opt-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={allSelected}\n onMouseDown={(e) => e.preventDefault()}\n onMouseMove={() => active !== i && setActive(i)}\n onClick={() => pick(i)}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-900\",\n isActive && \"bg-gray-100\",\n )}\n >\n <Box checked={allSelected} indeterminate={!allSelected && current.length > 0} />\n Select all\n </div>\n );\n }\n const o = r.option;\n const sel = isSelected(o.value);\n const off = optionDisabled(o);\n return (\n <React.Fragment key={`${o.value}-${i}`}>\n {r.group && r.first && (\n <div\n role=\"presentation\"\n className={cn(\n \"px-3 pb-1 pt-2 text-xs font-semibold uppercase tracking-wide text-gray-400\",\n i > 0 && \"mt-1 border-t border-gray-100\",\n )}\n >\n {r.group}\n </div>\n )}\n <div\n id={`${inputId}-opt-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={sel}\n aria-disabled={off || undefined}\n onMouseDown={(e) => e.preventDefault()}\n onMouseMove={() => !off && active !== i && setActive(i)}\n onClick={() => pick(i)}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm text-gray-900\",\n isActive && \"bg-gray-100\",\n off && \"cursor-not-allowed opacity-40\",\n )}\n >\n <Box checked={sel} />\n {o.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {o.icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{o.label}</span>\n {o.description && (\n <span className=\"block truncate text-xs font-normal text-gray-500\">{o.description}</span>\n )}\n </span>\n </div>\n </React.Fragment>\n );\n })}\n </div>\n {(current.length > 0 || maxSelected !== undefined) && (\n <div className=\"flex items-center justify-between border-t border-gray-100 px-3 py-2 text-xs text-gray-500\">\n <span aria-live=\"polite\">\n {current.length}\n {maxSelected !== undefined ? ` / ${maxSelected}` : \"\"} selected\n </span>\n {current.length > 0 && (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => commit([])}\n className={cn(\"rounded px-1.5 py-0.5 font-medium text-gray-600 hover:bg-gray-100\", focusRing)}\n >\n Clear\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\n/** Visual-only checkbox (the row itself is the accessible option). */\nconst Box = ({ checked, indeterminate }: { checked: boolean; indeterminate?: boolean }) => (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded border\",\n checked || indeterminate ? \"border-primary-600 bg-primary-600 text-white\" : \"border-gray-300 bg-white\",\n )}\n >\n {checked ? <RiCheckLine size={12} /> : indeterminate ? <span className=\"h-0.5 w-2 rounded bg-white\" /> : null}\n </span>\n);\n\nMultiSelect.displayName = \"MultiSelect\";\n\nexport default MultiSelect;\n","import { VariantProps, cva } from \"class-variance-authority\";\nimport { HTMLAttributes, ReactNode } from \"react\";\nimport React from \"react\";\nimport { cn } from \"../utils/utils\";\nimport {\n RiAlertFill,\n RiCloseLine,\n RiErrorWarningLine,\n RiQuestionLine,\n RiThumbUpLine,\n RiShieldCheckLine,\n} from \"@remixicon/react\";\n\ninterface VariantIconProps {\n variant: \"success\" | \"warning\" | \"info\" | \"error\" | \"default\";\n}\n\n// Icon colours now come from the same tokens as the rest of the library\n// (they were hard-coded hex values), and the wrapper keeps the icon from\n// shrinking next to long text.\nconst iconWrapper = \"inline-flex shrink-0\";\n\nconst VariantIcon = ({ variant }: VariantIconProps) => {\n switch (variant) {\n case \"success\":\n return (\n <span\n aria-hidden=\"true\"\n className={cn(iconWrapper, \"text-success-600\")}\n >\n <RiThumbUpLine size={20} />\n </span>\n );\n case \"warning\":\n return (\n <span\n aria-hidden=\"true\"\n className={cn(iconWrapper, \"text-warning-600\")}\n >\n <RiQuestionLine size={20} />\n </span>\n );\n case \"info\":\n return (\n <span\n aria-hidden=\"true\"\n className={cn(iconWrapper, \"text-primary-600\")}\n >\n <RiErrorWarningLine size={20} />\n </span>\n );\n case \"error\":\n return (\n <span aria-hidden=\"true\" className={cn(iconWrapper, \"text-error-600\")}>\n <RiAlertFill size={20} />\n </span>\n );\n default:\n return (\n <span aria-hidden=\"true\" className={cn(iconWrapper, \"text-gray-600\")}>\n <RiShieldCheckLine size={20} />\n </span>\n );\n }\n};\n\ninterface NoticeProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof noticeVariants> {\n children?: ReactNode;\n noticeTitle?: string;\n variant: \"success\" | \"warning\" | \"info\" | \"error\" | \"default\";\n position?: \"top\" | \"bottom\" | \"center\";\n showIcon?: boolean;\n open: boolean;\n setOpen: (value: boolean) => void;\n}\n\nconst noticeVariants = cva(\n // floating surface: softer radius, a shadow so it lifts off the page, and\n // a width cap so long messages never run edge to edge\n \"p-4 w-fit max-w-[min(32rem,calc(100vw-2rem))] rounded-xl shadow-lg\",\n {\n variants: {\n variant: {\n success: \"bg-success-25 border border-success-300\",\n warning: \"bg-warning-25 border border-warning-300\",\n info: \"bg-primary-25 border border-primary-300\",\n error: \"bg-error-25 border border-error-300\",\n default: \"bg-gray-25 border border-gray-300\",\n },\n position: {\n top: \"top-4 transition-all duration-700 m-auto left-0 right-0\",\n bottom: \"bottom-4 transition-all duration-700 right-4\",\n center: \"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\",\n },\n },\n },\n);\n\n// Same close control as Modal and Drawer: a real button with a visible\n// keyboard focus ring (it was a clickable span).\nconst CloseButton = ({\n onClick,\n className,\n}: {\n onClick: () => void;\n className?: string;\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label=\"Close notice\"\n className={cn(\n \"inline-flex shrink-0 items-center justify-center rounded-lg p-1 cursor-pointer\",\n \"text-gray-500 transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-black/5 hover:text-gray-800 active:bg-black/10\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n className,\n )}\n >\n <RiCloseLine size={20} aria-hidden=\"true\" />\n </button>\n);\n\nconst Notice = ({\n children,\n variant,\n position,\n noticeTitle,\n open,\n setOpen,\n showIcon = true,\n}: NoticeProps) => {\n const handleClose = () => setOpen(false);\n return (\n <>\n {open && (\n <div\n // errors and warnings interrupt, everything else is announced politely\n role={\n variant === \"error\" || variant === \"warning\" ? \"alert\" : \"status\"\n }\n className={cn(\n noticeVariants({ variant, position }),\n `fixed z-10`,\n position === \"top\" &&\n open &&\n `animate-slide-in-top motion-reduce:animate-none`,\n position === \"bottom\" &&\n open &&\n `animate-slide-in-right motion-reduce:animate-none`,\n position === \"center\" &&\n open &&\n `animate-fade-in motion-reduce:animate-none`,\n )}\n >\n <div className=\"relative\">\n {showIcon ? (\n noticeTitle == \"\" ? (\n <div className=\"flex items-start\">\n <VariantIcon variant={variant} />\n <span className=\"ml-2 mr-8 text-text-sm text-gray-700\">\n {children}\n </span>\n <CloseButton onClick={handleClose} className=\"-my-1 -mr-1\" />\n </div>\n ) : (\n <div className=\"\">\n <section className=\"flex items-start\">\n <VariantIcon variant={variant} />\n <div className=\"ml-2 mr-8 -mt-[3px]\">\n <span className=\"block font-semibold text-gray-900 mb-0.5\">\n {noticeTitle}\n </span>\n <p className=\"text-text-sm text-gray-700\">{children}</p>\n </div>\n </section>\n <CloseButton\n onClick={handleClose}\n className=\"absolute -top-1 -right-1\"\n />\n </div>\n )\n ) : (\n <div className=\"mr-8\">\n <section className=\"flex items-center\">\n <p className=\"font-semibold text-gray-900 mb-0.5\">\n {noticeTitle}\n </p>\n </section>\n <CloseButton\n onClick={handleClose}\n className=\"absolute -top-1 -right-1\"\n />\n <p className=\"text-text-sm text-gray-700\">{children}</p>\n </div>\n )}\n </div>\n </div>\n )}\n </>\n );\n};\n\nexport default Notice;\n","\"use client\";\nimport React, { useRef, useState } from \"react\";\nimport Input from \"./Input\";\n\ninterface OTPInputProps {\n length: number;\n onChange: (otp: string) => void;\n type?: \"text\" | \"password\" | \"number\";\n}\n\nconst OTPInput: React.FC<OTPInputProps> = ({\n length,\n onChange,\n type = \"text\",\n}) => {\n const [otpValues, setOtpValues] = useState<string[]>(Array(length).fill(\"\"));\n const inputsRef = useRef<Array<HTMLInputElement | null>>([]);\n\n const handleChange = (\n e: React.ChangeEvent<HTMLInputElement>,\n idx: number\n ) => {\n let value = e.target.value;\n if (type === \"number\") value = value.replace(/\\D/g, \"\");\n if (!value) return;\n\n const newOtp = [...otpValues];\n newOtp[idx] = value[0];\n setOtpValues(newOtp);\n onChange(newOtp.join(\"\"));\n\n if (idx < length - 1) inputsRef.current[idx + 1]?.focus();\n };\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n idx: number\n ) => {\n if (e.key === \"Backspace\") {\n if (otpValues[idx]) {\n const newOtp = [...otpValues];\n newOtp[idx] = \"\";\n setOtpValues(newOtp);\n onChange(newOtp.join(\"\"));\n } else if (idx > 0) {\n inputsRef.current[idx - 1]?.focus();\n }\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n let pasteData = e.clipboardData.getData(\"Text\");\n if (type === \"number\") pasteData = pasteData.replace(/\\D/g, \"\");\n const newOtp = pasteData\n .split(\"\")\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n setOtpValues(newOtp);\n onChange(newOtp.join(\"\"));\n inputsRef.current[Math.min(pasteData.length, length - 1)]?.focus();\n };\n\n return (\n <div className=\"flex items-center gap-2\">\n {Array.from({ length }).map((_, idx) => (\n <Input\n key={idx}\n type={type}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n maxLength={1}\n value={otpValues[idx]}\n onChange={(e) => handleChange(e, idx)}\n onKeyDown={(e) => handleKeyDown(e, idx)}\n onPaste={handlePaste}\n ref={(el) => {\n inputsRef.current[idx] = el ?? null;\n }}\n className=\"w-[40px] p-3.5\"\n />\n ))}\n </div>\n );\n};\n\nexport default OTPInput;\n","\"use client\";\nimport React, { useRef, useState } from \"react\";\nimport Button from \"./Button\";\nimport {\n RiArrowLeftLine,\n RiArrowRightLine,\n RiArrowDownSLine,\n RiArrowUpSLine,\n RiArrowRightSLine,\n RiArrowLeftSLine,\n RiCheckLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ntype TablePaginationProps = {\n count: number;\n countVariable?: string;\n page: number;\n rowsPerPage: number;\n rowsPerPageOptions: (number | { label: string; value: number })[];\n onPageChange: (newPage: number) => void;\n onRowsPerPageChange: (newRowsPerPage: number) => void;\n className?: string;\n variant?: \"primary\" | \"secondary\";\n itemsPerPage?: boolean;\n};\n\n// Shared focus ring (same as Input, Textarea and FileUpload)\nconst focusRing =\n \"focus-visible:outline-none focus-visible:border-primary-600 focus-visible:ring-4 focus-visible:ring-primary-100\";\n\n// Shared look for the small bordered controls (trigger and page select)\nconst controlSurface = cn(\n \"border border-gray-200 bg-white rounded-lg text-sm font-medium text-gray-900 tabular-nums cursor-pointer\",\n \"shadow-[0px_1px_2px_0px_#1018280D] hover:bg-gray-50 hover:border-gray-300\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n);\n\nconst Pagination: React.FC<TablePaginationProps> = ({\n count,\n page,\n rowsPerPage,\n rowsPerPageOptions,\n onPageChange,\n onRowsPerPageChange,\n className,\n variant = \"primary\",\n countVariable,\n itemsPerPage = true,\n}) => {\n const totalPages = Math.ceil(count / rowsPerPage);\n\n const handlePrevPageClick = () => {\n onPageChange(page - 1);\n };\n\n const handleNextPageClick = () => {\n onPageChange(page + 1);\n };\n const [showOptions, setShowOptions] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const handleOptionClick = (\n option: number | { label: string; value: number },\n ) => {\n if (typeof option === \"number\") {\n onRowsPerPageChange(option);\n } else {\n onRowsPerPageChange(option.value);\n }\n setShowOptions(false);\n // the option unmounts, so hand focus back to the trigger\n triggerRef.current?.focus();\n };\n\n // Display only: show the label of the selected option (so -1 reads \"All\")\n // and a \"1–5 of 40\" range. Callbacks and totalPages are untouched.\n const selectedOption = rowsPerPageOptions?.find(\n (o) => (typeof o === \"number\" ? o : o.value) === rowsPerPage,\n );\n const selectedLabel =\n selectedOption === undefined\n ? rowsPerPage\n : typeof selectedOption === \"number\"\n ? selectedOption\n : selectedOption.label;\n\n const effectiveRows = rowsPerPage > 0 ? rowsPerPage : count;\n const rangeStart = count === 0 ? 0 : page * effectiveRows + 1;\n const rangeEnd = Math.min(count, (page + 1) * effectiveRows);\n\n return (\n <div\n role=\"navigation\"\n aria-label=\"Table pagination\"\n className={cn(\n // flex-wrap lets the two groups stack on narrow screens instead of squeezing\n \"px-3 py-4 flex flex-wrap justify-between items-center gap-x-6 gap-y-3 w-full text-sm\",\n variant === \"primary\" &&\n \"border border-gray-200 bg-gray-25 px-6 py-3.5\",\n className,\n )}\n >\n <section className=\"flex flex-wrap gap-x-5 gap-y-2 items-center\">\n {countVariable && (\n <p className=\"text-gray-500\">\n <span className=\"font-semibold text-gray-900 tabular-nums\">\n {count}\n </span>{\" \"}\n {countVariable ?? \"Items\"}\n </p>\n )}\n {itemsPerPage && (\n <div className=\"flex gap-2 items-center\">\n <span className=\"text-gray-500\">Items per page</span>\n <div\n className=\"relative z-[100]\"\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && showOptions) {\n setShowOptions(false);\n triggerRef.current?.focus();\n }\n }}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n aria-expanded={showOptions}\n aria-label={`Items per page, ${selectedLabel} selected`}\n className={cn(\n controlSurface,\n \"w-[88px] px-2.5 py-1.5 flex items-center justify-between gap-1\",\n focusRing,\n showOptions && \"border-primary-600 ring-4 ring-primary-100\",\n )}\n onClick={() => setShowOptions(!showOptions)}\n >\n {selectedLabel}\n {!showOptions ? (\n <RiArrowDownSLine\n size={16}\n className=\"text-gray-500\"\n aria-hidden=\"true\"\n />\n ) : (\n <RiArrowUpSLine\n size={16}\n className=\"text-gray-500\"\n aria-hidden=\"true\"\n />\n )}\n </button>\n {showOptions && (\n <div className=\"absolute top-full left-0 min-w-full p-1 bg-white rounded-xl border border-gray-200 shadow-lg mt-1.5 z-50\">\n {rowsPerPageOptions?.map((option, index) => {\n const value =\n typeof option === \"number\" ? option : option.value;\n const isSelected = value === rowsPerPage;\n\n return (\n <button\n type=\"button\"\n key={index}\n aria-current={isSelected ? \"true\" : undefined}\n className={cn(\n \"flex w-full items-center justify-between gap-2 text-left px-2.5 py-1.5 rounded-lg cursor-pointer tabular-nums\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n isSelected\n ? \"bg-primary-50 text-primary-700 font-semibold\"\n : \"text-gray-700 font-medium hover:bg-gray-100\",\n )}\n onClick={() => handleOptionClick(option)}\n >\n {typeof option === \"number\" ? option : option.label}\n {isSelected && (\n <RiCheckLine size={16} aria-hidden=\"true\" />\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n )}\n </section>\n <section className=\"flex flex-wrap items-center gap-x-4 gap-y-2\">\n {variant === \"primary\" ? (\n <>\n <span className=\"hidden sm:inline text-gray-500 tabular-nums\">\n <span className=\"font-semibold text-gray-900\">\n {rangeStart}–{rangeEnd}\n </span>{\" \"}\n of {count}\n </span>\n <span\n aria-hidden=\"true\"\n className=\"hidden sm:block h-5 w-px bg-gray-200\"\n />\n <div className=\"flex items-center gap-2 text-gray-500\">\n <span>Page</span>\n <select\n aria-label=\"Select page\"\n value={page + 1}\n onChange={(e) => onPageChange(parseInt(e.target.value, 10) - 1)}\n className={cn(\n controlSurface,\n \"px-3 py-1.5\",\n \"focus:outline-none focus:border-primary-600 focus:ring-4 focus:ring-primary-100\",\n )}\n >\n {totalPages > 0 &&\n [...Array(totalPages)].map((_, index) => (\n <option key={index + 1} value={index + 1}>\n {index + 1}\n </option>\n ))}\n </select>\n <span className=\"tabular-nums\">\n of {totalPages > 0 ? totalPages : 0}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outlined\"\n intent=\"default-outlined\"\n startIcon={<RiArrowLeftLine size={18} />}\n onClick={handlePrevPageClick}\n disabled={page === 0}\n aria-label=\"Previous page\"\n className=\"h-8 rounded-lg\"\n >\n {/* text hides on small screens, the aria-label still names the button */}\n <span className=\"hidden sm:inline\">Previous</span>\n </Button>\n <Button\n variant=\"outlined\"\n intent=\"default-outlined\"\n endIcon={<RiArrowRightLine size={18} />}\n onClick={handleNextPageClick}\n disabled={page === totalPages - 1}\n aria-label=\"Next page\"\n className=\"h-8 rounded-lg\"\n >\n <span className=\"hidden sm:inline\">Next</span>\n </Button>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5 text-gray-500 mx-1\">\n {/* announced politely when the page changes */}\n <span className=\"tabular-nums\" aria-live=\"polite\">\n <span className=\"font-semibold text-gray-900\">{page + 1}</span>{\" \"}\n of {totalPages > 0 ? totalPages : 0}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n onClick={handlePrevPageClick}\n disabled={page === 0}\n className={cn(\n \"inline-flex rounded-lg border border-gray-200 bg-white p-1 text-gray-600 cursor-pointer\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300 hover:text-gray-900\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-1\",\n \"disabled:pointer-events-none disabled:select-none disabled:opacity-30\",\n )}\n >\n <RiArrowLeftSLine size={20} aria-hidden=\"true\" />\n </button>\n\n <button\n type=\"button\"\n aria-label=\"Next page\"\n onClick={handleNextPageClick}\n disabled={page === totalPages - 1}\n className={cn(\n \"inline-flex rounded-lg border border-gray-200 bg-white p-1 text-gray-600 cursor-pointer\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300 hover:text-gray-900\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-1\",\n \"disabled:pointer-events-none disabled:select-none disabled:opacity-30\",\n )}\n >\n <RiArrowRightSLine size={20} aria-hidden=\"true\" />\n </button>\n </div>\n </>\n )}\n </section>\n </div>\n );\n};\n\nexport default Pagination;\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../utils/utils\";\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\nexport interface PopoverRenderApi {\n /** Close the popover (for example from a \"Done\" button inside it). */\n close: () => void;\n}\n\nexport interface PopoverProps {\n /** The element that opens the popover (usually a Button). */\n children: React.ReactNode;\n /** Content of the floating panel. Pass a function to get a close() helper. */\n content: React.ReactNode | ((api: PopoverRenderApi) => React.ReactNode);\n /** Optional. Controlled open state. */\n open?: boolean;\n /** Optional. Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Optional. Called whenever the popover wants to open or close. */\n onOpenChange?: (open: boolean) => void;\n /** Optional. Preferred side of the trigger. It flips if there is not enough room. Defaults to \"bottom\". */\n side?: Side;\n /** Optional. Alignment along the trigger's edge. Defaults to \"center\". */\n align?: Align;\n /** Optional. Gap between trigger and panel in px. Defaults to 8. */\n offset?: number;\n /** Optional. Show a small arrow pointing at the trigger. Defaults to true. */\n arrow?: boolean;\n /** Optional. \"click\" toggles on click, \"hover\" opens on hover or focus. Defaults to \"click\". */\n trigger?: \"click\" | \"hover\";\n /** Optional. Delay in ms before a hover popover closes. Defaults to 120. */\n hoverCloseDelay?: number;\n /** Optional. Close when clicking outside. Defaults to true. */\n closeOnOutsideClick?: boolean;\n /** Optional. Close when Escape is pressed. Defaults to true. */\n closeOnEscape?: boolean;\n disabled?: boolean;\n /** Optional. Accessible name for the panel. Use this or aria-labelledby. */\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n /** Optional. Extra classes for the panel (width, padding…). */\n className?: string;\n /** Optional. Extra classes for the trigger wrapper. */\n triggerClassName?: string;\n}\n\nconst MARGIN = 8; // keep the panel this far from the viewport edge\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]):not([type=\"hidden\"]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nconst opposite: Record<Side, Side> = { top: \"bottom\", bottom: \"top\", left: \"right\", right: \"left\" };\n\ninterface Placement {\n side: Side;\n top: number;\n left: number;\n arrow: number; // offset of the arrow along the panel edge\n}\n\nfunction compute(\n anchor: DOMRect,\n panel: { width: number; height: number },\n preferred: Side,\n align: Align,\n offset: number,\n): Placement {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const room: Record<Side, number> = {\n top: anchor.top - MARGIN,\n bottom: vh - anchor.bottom - MARGIN,\n left: anchor.left - MARGIN,\n right: vw - anchor.right - MARGIN,\n };\n const need = (s: Side) => (s === \"top\" || s === \"bottom\" ? panel.height : panel.width) + offset;\n let side = preferred;\n if (room[side] < need(side) && room[opposite[side]] > room[side]) side = opposite[side];\n\n let top = 0;\n let left = 0;\n if (side === \"top\" || side === \"bottom\") {\n top = side === \"bottom\" ? anchor.bottom + offset : anchor.top - offset - panel.height;\n left =\n align === \"start\"\n ? anchor.left\n : align === \"end\"\n ? anchor.right - panel.width\n : anchor.left + anchor.width / 2 - panel.width / 2;\n left = Math.max(MARGIN, Math.min(left, vw - panel.width - MARGIN));\n } else {\n left = side === \"right\" ? anchor.right + offset : anchor.left - offset - panel.width;\n top =\n align === \"start\"\n ? anchor.top\n : align === \"end\"\n ? anchor.bottom - panel.height\n : anchor.top + anchor.height / 2 - panel.height / 2;\n top = Math.max(MARGIN, Math.min(top, vh - panel.height - MARGIN));\n }\n const arrow =\n side === \"top\" || side === \"bottom\"\n ? anchor.left + anchor.width / 2 - left\n : anchor.top + anchor.height / 2 - top;\n return { side, top, left, arrow };\n}\n\nconst Popover = ({\n children,\n content,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n side = \"bottom\",\n align = \"center\",\n offset = 8,\n arrow = true,\n trigger = \"click\",\n hoverCloseDelay = 120,\n closeOnOutsideClick = true,\n closeOnEscape = true,\n disabled = false,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n className,\n triggerClassName,\n}: PopoverProps) => {\n const id = useId();\n const panelId = `popover-${id}`;\n\n const [inner, setInner] = useState(defaultOpen);\n const open = !disabled && (openProp !== undefined ? openProp : inner);\n\n const anchorRef = useRef<HTMLSpanElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout>>();\n const openedByKeyboardOrClick = useRef(false);\n\n const [place, setPlace] = useState<Placement | null>(null);\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => setMounted(true), []);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (openProp === undefined) setInner(next);\n onOpenChange?.(next);\n },\n [openProp, onOpenChange],\n );\n\n const triggerEl = () =>\n anchorRef.current?.querySelector<HTMLElement>(FOCUSABLE) ?? anchorRef.current;\n\n const close = useCallback(\n (returnFocus = true) => {\n setOpen(false);\n if (returnFocus) triggerEl()?.focus();\n },\n [setOpen],\n );\n\n // ARIA on the real trigger element inside the wrapper\n useEffect(() => {\n const el = triggerEl();\n if (!el || el === anchorRef.current) return;\n el.setAttribute(\"aria-haspopup\", \"dialog\");\n el.setAttribute(\"aria-expanded\", String(open));\n if (open) el.setAttribute(\"aria-controls\", panelId);\n else el.removeAttribute(\"aria-controls\");\n });\n\n /* ----- positioning ----- */\n const reposition = useCallback(() => {\n const a = anchorRef.current;\n const p = panelRef.current;\n if (!a || !p) return;\n setPlace(compute(a.getBoundingClientRect(), { width: p.offsetWidth, height: p.offsetHeight }, side, align, offset + (arrow ? 6 : 0)));\n }, [side, align, offset, arrow]);\n\n useLayoutEffect(() => {\n if (!open) {\n setPlace(null);\n setVisible(false);\n return;\n }\n reposition();\n const raf = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(raf);\n }, [open, reposition, mounted]);\n\n useEffect(() => {\n if (!open) return;\n const on = () => reposition();\n window.addEventListener(\"resize\", on);\n window.addEventListener(\"scroll\", on, true);\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(on) : null;\n if (panelRef.current) ro?.observe(panelRef.current);\n return () => {\n window.removeEventListener(\"resize\", on);\n window.removeEventListener(\"scroll\", on, true);\n ro?.disconnect();\n };\n }, [open, reposition]);\n\n /* ----- focus: move into the panel when opened with click / keyboard ----- */\n useEffect(() => {\n if (open && place && openedByKeyboardOrClick.current) {\n openedByKeyboardOrClick.current = false;\n const p = panelRef.current;\n if (p) (p.querySelector<HTMLElement>(FOCUSABLE) ?? p).focus({ preventScroll: true });\n }\n }, [open, place]);\n\n /* ----- outside click / Escape ----- */\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!closeOnOutsideClick) return;\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || panelRef.current?.contains(t)) return;\n setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && closeOnEscape) {\n e.stopPropagation();\n close();\n }\n };\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open, closeOnOutsideClick, closeOnEscape, close, setOpen]);\n\n useEffect(() => () => clearTimeout(hoverTimer.current), []);\n\n /* ----- trigger handlers ----- */\n const hover = trigger === \"hover\";\n const openNow = () => {\n clearTimeout(hoverTimer.current);\n if (!open) setOpen(true);\n };\n const closeSoon = () => {\n clearTimeout(hoverTimer.current);\n hoverTimer.current = setTimeout(() => setOpen(false), hoverCloseDelay);\n };\n\n const anchorHandlers = hover\n ? {\n onMouseEnter: openNow,\n onMouseLeave: closeSoon,\n onFocus: openNow,\n onBlur: (e: React.FocusEvent) => {\n if (!panelRef.current?.contains(e.relatedTarget as Node)) closeSoon();\n },\n }\n : {\n onClick: () => {\n if (disabled) return;\n if (!open) openedByKeyboardOrClick.current = true;\n setOpen(!open);\n },\n };\n\n const panelHandlers = hover\n ? { onMouseEnter: openNow, onMouseLeave: closeSoon }\n : {\n // Tabbing out of a click popover closes it\n onBlur: (e: React.FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (next && !panelRef.current?.contains(next) && !anchorRef.current?.contains(next)) setOpen(false);\n },\n };\n\n const container =\n typeof document !== \"undefined\"\n ? (anchorRef.current?.closest(\".theme-primary\") as HTMLElement | null) ?? document.body\n : null;\n\n const resolved = typeof content === \"function\" ? content({ close: () => close() }) : content;\n const s = place?.side ?? side;\n const arrowPos = place ? Math.max(14, place.arrow) : 0;\n\n return (\n <>\n <span ref={anchorRef} className={cn(\"inline-flex\", triggerClassName)} {...anchorHandlers}>\n {children}\n </span>\n {mounted &&\n open &&\n container &&\n createPortal(\n <div\n ref={panelRef}\n id={panelId}\n role=\"dialog\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n tabIndex={-1}\n {...panelHandlers}\n style={{\n position: \"fixed\",\n top: place?.top ?? 0,\n left: place?.left ?? 0,\n visibility: place ? \"visible\" : \"hidden\",\n }}\n className={cn(\n \"z-[60] w-max max-w-[min(360px,calc(100vw-1rem))] rounded-xl border border-gray-200 bg-white p-4 text-sm text-gray-700 shadow-lg\",\n \"transition-[opacity,transform] duration-150 ease-out motion-reduce:transition-none focus:outline-none\",\n visible ? \"translate-x-0 translate-y-0 opacity-100\" : cn(\"opacity-0\", s === \"bottom\" ? \"-translate-y-1\" : s === \"top\" ? \"translate-y-1\" : s === \"right\" ? \"-translate-x-1\" : \"translate-x-1\"),\n className,\n )}\n >\n {resolved}\n {arrow && place && (\n <span\n aria-hidden=\"true\"\n className=\"absolute h-3 w-3 rotate-45 border-gray-200 bg-white\"\n style={\n s === \"bottom\"\n ? { top: -6, left: arrowPos - 6, borderWidth: \"1px 0 0 1px\" }\n : s === \"top\"\n ? { bottom: -6, left: arrowPos - 6, borderWidth: \"0 1px 1px 0\" }\n : s === \"right\"\n ? { left: -6, top: arrowPos - 6, borderWidth: \"0 0 1px 1px\" }\n : { right: -6, top: arrowPos - 6, borderWidth: \"1px 1px 0 0\" }\n }\n />\n )}\n </div>,\n container,\n )}\n </>\n );\n};\n\nPopover.displayName = \"Popover\";\n\nexport default Popover;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\nexport type ProgressBarProps = {\n progress: number;\n progressText?: string;\n progressColor: string;\n progressTextPosition?: \"top\" | \"bottom\" | \"left\" | \"right\";\n};\n\nconst ProgressBar = ({\n progress,\n progressText = \"\",\n progressColor,\n progressTextPosition,\n}: ProgressBarProps) => {\n const _progress = Math.min(Math.max(0, progress), 100);\n return (\n <div\n className={cn(\n \"rounded\",\n progressTextPosition === \"right\"\n ? \"flex items-center gap-3\"\n : progressTextPosition === \"left\"\n ? \"flex items-center gap-3\"\n : \"\",\n )}\n >\n <span\n className={cn(\n \"text-gray-700 text-text-sm font-medium tabular-nums\",\n progressTextPosition === \"left\"\n ? \"inline-block shrink-0 whitespace-nowrap\"\n : progressTextPosition === \"top\"\n ? \"flex justify-end mb-1.5\"\n : \"hidden\",\n )}\n >\n {progressText}\n </span>\n <div\n // the track clips the fill so both ends stay perfectly rounded\n className=\"w-full min-w-0 h-2 rounded-full bg-gray-200 overflow-hidden\"\n role=\"progressbar\"\n // a progressbar needs an accessible name; the visible text is used\n // when there is one\n aria-label={progressText || \"Progress\"}\n aria-valuenow={Math.round(_progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className={cn(\n progressColor,\n \"h-full rounded-full\",\n // the old 100ms delay is gone, so the bar responds immediately\n \"transition-[width] duration-500 ease-out motion-reduce:transition-none\",\n )}\n style={{ width: `${_progress}%` }}\n ></div>\n </div>\n <span\n className={cn(\n \"text-gray-700 text-text-sm font-medium tabular-nums\",\n progressTextPosition === \"bottom\"\n ? \"flex justify-end mt-1.5\"\n : progressTextPosition === \"top\"\n ? \"hidden\"\n : progressTextPosition === \"right\"\n ? \"flex shrink-0 justify-end whitespace-nowrap\"\n : \"hidden\",\n )}\n >\n {progressText}\n </span>\n </div>\n );\n};\n\nexport default ProgressBar;\n","import React, { InputHTMLAttributes, forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { cva, VariantProps } from \"class-variance-authority\";\n\ninterface RadioProps\n extends\n Omit<InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof radioVariants> {\n size?: \"sm\" | \"lg\";\n disabled?: boolean;\n checked?: boolean;\n children?: never;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Per-intent styles. Class names are written out in full so Tailwind can */\n/* detect them. `primary` is the default, so existing radios stay in the */\n/* primary colour family. Unchecked hover keeps the original behaviour (tinted */\n/* border and fill). Checked: solid fill, one shade darker on hover. */\n/* `checked:hover:` is used so the hover tint never overrides the checked fill.*/\n/* The focus ring follows the intent. */\n/* -------------------------------------------------------------------------- */\nconst intentClasses = {\n primary:\n \"hover:border-primary-600 hover:bg-primary-50 checked:border-primary-600 checked:bg-primary-600 checked:hover:border-primary-700 checked:hover:bg-primary-700 focus-visible:ring-primary-500\",\n success:\n \"hover:border-success-600 hover:bg-success-50 checked:border-success-600 checked:bg-success-600 checked:hover:border-success-700 checked:hover:bg-success-700 focus-visible:ring-success-500\",\n error:\n \"hover:border-error-600 hover:bg-error-50 checked:border-error-600 checked:bg-error-600 checked:hover:border-error-700 checked:hover:bg-error-700 focus-visible:ring-error-500\",\n warning:\n \"hover:border-warning-600 hover:bg-warning-50 checked:border-warning-600 checked:bg-warning-600 checked:hover:border-warning-700 checked:hover:bg-warning-700 focus-visible:ring-warning-500\",\n default:\n \"hover:border-gray-700 hover:bg-gray-100 checked:border-gray-700 checked:bg-gray-700 checked:hover:border-gray-800 checked:hover:bg-gray-800 focus-visible:ring-gray-500\",\n blue: \"hover:border-blue-600 hover:bg-blue-50 checked:border-blue-600 checked:bg-blue-600 checked:hover:border-blue-700 checked:hover:bg-blue-700 focus-visible:ring-blue-500\",\n bluegray:\n \"hover:border-bluegray-600 hover:bg-bluegray-50 checked:border-bluegray-600 checked:bg-bluegray-600 checked:hover:border-bluegray-700 checked:hover:bg-bluegray-700 focus-visible:ring-bluegray-500\",\n bluelight:\n \"hover:border-bluelight-600 hover:bg-bluelight-50 checked:border-bluelight-600 checked:bg-bluelight-600 checked:hover:border-bluelight-700 checked:hover:bg-bluelight-700 focus-visible:ring-bluelight-500\",\n indigo:\n \"hover:border-indigo-600 hover:bg-indigo-50 checked:border-indigo-600 checked:bg-indigo-600 checked:hover:border-indigo-700 checked:hover:bg-indigo-700 focus-visible:ring-indigo-500\",\n purple:\n \"hover:border-purple-600 hover:bg-purple-50 checked:border-purple-600 checked:bg-purple-600 checked:hover:border-purple-700 checked:hover:bg-purple-700 focus-visible:ring-purple-500\",\n violet:\n \"hover:border-violet-600 hover:bg-violet-50 checked:border-violet-600 checked:bg-violet-600 checked:hover:border-violet-700 checked:hover:bg-violet-700 focus-visible:ring-violet-500\",\n pink: \"hover:border-pink-600 hover:bg-pink-50 checked:border-pink-600 checked:bg-pink-600 checked:hover:border-pink-700 checked:hover:bg-pink-700 focus-visible:ring-pink-500\",\n rose: \"hover:border-rose-600 hover:bg-rose-50 checked:border-rose-600 checked:bg-rose-600 checked:hover:border-rose-700 checked:hover:bg-rose-700 focus-visible:ring-rose-500\",\n orange:\n \"hover:border-orange-600 hover:bg-orange-50 checked:border-orange-600 checked:bg-orange-600 checked:hover:border-orange-700 checked:hover:bg-orange-700 focus-visible:ring-orange-500\",\n};\n\nconst radioVariants = cva(\"\", {\n variants: {\n // Circle dimensions are unchanged from the original.\n size: {\n sm: \"h-3 w-3\",\n lg: \"h-4 w-4\",\n },\n // New, optional. Defaults to \"primary\".\n intent: intentClasses,\n },\n defaultVariants: {\n size: \"sm\",\n intent: \"primary\",\n },\n});\n\nconst Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n size,\n intent,\n disabled,\n checked,\n className,\n children,\n id,\n name,\n ...props\n },\n ref,\n ) => {\n return (\n <div className=\"relative inline-flex items-center cursor-pointer\">\n <input\n {...props}\n ref={ref}\n id={id}\n name={name}\n checked={checked}\n disabled={disabled}\n role=\"radio\"\n aria-checked={checked}\n type=\"radio\"\n className={cn(\n // base\n \"peer relative cursor-pointer appearance-none rounded-full border border-gray-300 bg-white\",\n \"shadow-sm checked:shadow-none\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // keyboard-only focus ring (colour is set per intent)\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n // error state via the native attribute, no new prop needed\n \"aria-[invalid=true]:border-error-500\",\n // disabled\n \"disabled:opacity-30 disabled:pointer-events-none disabled:shadow-none\",\n radioVariants({ size, intent, className }),\n )}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute pointer-events-none top-2/4 left-2/4 -translate-y-2/4 -translate-x-2/4\",\n \"h-1.5 w-1.5 bg-white rounded-full\",\n // the dot fades and pops in when checked\n \"opacity-0 scale-50 peer-checked:opacity-100 peer-checked:scale-100\",\n \"transition-[opacity,transform] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n size === \"sm\" && \"h-[4.5px] w-[4.5px]\",\n )}\n ></span>\n </div>\n );\n },\n);\n\nRadio.displayName = \"Radio\";\nexport default Radio;\n","\"use client\";\nimport React, { useId, useRef, useState } from \"react\";\nimport { RiStarFill } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface RatingProps {\n /** Controlled value (0 to max). Fractions such as 4.3 render partially filled in read-only mode. */\n value?: number;\n /** Uncontrolled initial value. Defaults to 0. */\n defaultValue?: number;\n /** Called when the user picks a value. */\n onChange?: (value: number) => void;\n /** Optional. Number of stars. Defaults to 5. */\n max?: number;\n /** Optional. Allow half-star steps. Defaults to false. */\n allowHalf?: boolean;\n /** Optional. Display only: not focusable or clickable. Defaults to false. */\n readOnly?: boolean;\n disabled?: boolean;\n /** Optional. Defaults to \"md\". */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Optional. Fill color. Defaults to \"warning\" (amber). */\n color?: \"warning\" | \"primary\" | \"success\" | \"error\";\n /** Optional. Clicking the current value again resets to 0. Defaults to false. */\n clearable?: boolean;\n /** Optional. Adds a hidden input for native forms. */\n name?: string;\n id?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n}\n\nconst px = { sm: 16, md: 24, lg: 32 } as const;\n\nconst fillClass = {\n warning: \"text-warning-500\",\n primary: \"text-primary-600\",\n success: \"text-success-500\",\n error: \"text-error-500\",\n} as const;\n\nconst Rating = ({\n value,\n defaultValue = 0,\n onChange,\n max = 5,\n allowHalf = false,\n readOnly = false,\n disabled = false,\n size = \"md\",\n color = \"warning\",\n clearable = false,\n name,\n id,\n className,\n \"aria-label\": ariaLabel = \"Rating\",\n \"aria-labelledby\": ariaLabelledby,\n}: RatingProps) => {\n const reactId = useId();\n const baseId = id ?? `rating-${reactId}`;\n const [inner, setInner] = useState(defaultValue);\n const current = Math.min(Math.max(value !== undefined ? value : inner, 0), max);\n const [hover, setHover] = useState<number | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const step = allowHalf ? 0.5 : 1;\n const interactive = !readOnly && !disabled;\n const shown = interactive && hover !== null ? hover : current;\n const size_px = px[size];\n\n const commit = (v: number) => {\n const next = clearable && v === current ? 0 : v;\n if (value === undefined) setInner(next);\n onChange?.(next);\n };\n\n const valueFromPointer = (i: number, e: React.MouseEvent<HTMLElement>) => {\n if (!allowHalf) return i + 1;\n const rect = e.currentTarget.getBoundingClientRect();\n return e.clientX - rect.left < rect.width / 2 ? i + 0.5 : i + 1;\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!interactive) return;\n let next: number | null = null;\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") next = Math.min(max, current + step);\n else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") next = Math.max(0, current - step);\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = max;\n else if (/^[0-9]$/.test(e.key) && Number(e.key) <= max) next = Number(e.key);\n else return;\n e.preventDefault();\n if (value === undefined) setInner(next);\n onChange?.(next);\n };\n\n const valueText = `${current} out of ${max}`;\n\n const stars = Array.from({ length: max }, (_, i) => {\n const fill = Math.max(0, Math.min(1, shown - i)) * 100;\n return (\n <span\n key={i}\n aria-hidden=\"true\"\n onMouseMove={interactive ? (e) => setHover(valueFromPointer(i, e)) : undefined}\n onClick={interactive ? (e) => commit(valueFromPointer(i, e)) : undefined}\n className={cn(\"relative inline-block shrink-0\", interactive && \"cursor-pointer\")}\n style={{ width: size_px, height: size_px }}\n >\n <RiStarFill size={size_px} className=\"absolute inset-0 text-gray-200\" />\n <span className=\"absolute inset-y-0 left-0 overflow-hidden\" style={{ width: `${fill}%` }}>\n <RiStarFill\n size={size_px}\n className={cn(\n fillClass[color],\n \"transition-transform duration-150 motion-reduce:transition-none\",\n interactive && hover !== null && Math.ceil(hover) === i + 1 && \"scale-110\",\n )}\n />\n </span>\n </span>\n );\n });\n\n const common = {\n id: baseId,\n ref: rootRef,\n className: cn(\n \"inline-flex items-center gap-0.5 rounded-md\",\n disabled && \"opacity-40\",\n className,\n ),\n };\n\n if (!interactive) {\n return (\n <div\n {...common}\n role=\"img\"\n aria-label={`${ariaLabel}: ${valueText}`}\n aria-labelledby={ariaLabelledby}\n >\n {name && <input type=\"hidden\" name={name} value={current} />}\n {stars}\n </div>\n );\n }\n\n return (\n <div\n {...common}\n role=\"slider\"\n tabIndex={0}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={current}\n aria-valuetext={valueText}\n onKeyDown={onKeyDown}\n onMouseLeave={() => setHover(null)}\n className={cn(common.className, \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\")}\n >\n {name && <input type=\"hidden\" name={name} value={current} />}\n {stars}\n </div>\n );\n};\n\nRating.displayName = \"Rating\";\n\nexport default Rating;\n","\"use client\";\nimport React, { useId, useRef, useState } from \"react\";\nimport {\n RiDeleteBin6Line,\n RiRefreshLine,\n RiFileLine,\n RiImageLine,\n RiVideoLine,\n RiFileZipLine,\n RiCheckLine,\n RiCloseLine,\n RiFilePdf2Line,\n RiFilePpt2Line,\n RiFileWord2Line,\n RiFileExcel2Line,\n RiMusic2Line,\n RiEyeLine,\n} from \"@remixicon/react\";\nimport Spinner from \"./Spinner\";\nimport { cn } from \"../utils/utils\";\nimport Label from \"./Label\";\nimport Button from \"./Button\";\n\nconst FileSvgIcon = React.memo(function FileSvgIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"40\"\n height=\"55\"\n viewBox=\"0 0 36 47\"\n fill=\"none\"\n >\n <path\n d=\"M0 8.72494C0 5.48487 2.6266 2.85828 5.86667 2.85828H20.5333L33 15.8583V40.9916C33 44.2317 30.3734 46.8583 27.1333 46.8583H5.86667C2.6266 46.8583 0 44.2317 0 40.9916V8.72494Z\"\n fill=\"var(--primary-600)\"\n />\n <g filter=\"url(#filter0_d_5101_541)\">\n <path\n d=\"M20.5334 13.4052V2.85828L33 15.8582L22.974 15.8482C21.6257 15.8469 20.5334 14.7535 20.5334 13.4052Z\"\n fill=\"var(--primary-300)\"\n />\n </g>\n <defs>\n <filter\n id=\"filter0_d_5101_541\"\n x=\"14.7435\"\n y=\"-2.98023e-05\"\n width=\"21.1148\"\n height=\"21.6482\"\n filterUnits=\"userSpaceOnUse\"\n color-interpolation-filters=\"sRGB\"\n >\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\"\n />\n <feOffset dx=\"-1.4658\" dy=\"1.4658\" />\n <feGaussianBlur stdDeviation=\"2.16205\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix\n type=\"matrix\"\n values=\"0 0 0 0 0.0417487 0 0 0 0 0.107741 0 0 0 0 0.401705 0 0 0 0.07 0\"\n />\n <feBlend\n mode=\"normal\"\n in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_5101_541\"\n />\n <feBlend\n mode=\"normal\"\n in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_5101_541\"\n result=\"shape\"\n />\n </filter>\n </defs>\n </svg>\n );\n});\n\n// Types\nexport type UploadStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\n\nexport interface UploadItem {\n id: string;\n file?: File;\n name?: string;\n size?: number;\n progress?: number;\n status?: UploadStatus;\n previewUrl?: string;\n}\n\nexport interface FileUploadControlProps {\n items: UploadItem[];\n onAddFiles: (files: File[]) => void;\n onUpdateItem?: (id: string, updates: Partial<UploadItem>) => void;\n onRejectFiles?: (rejected: { file: File; reason: string }[]) => void;\n onDelete?: (id: string) => void;\n onRetry?: (id: string) => void;\n onPreview?: (id: string) => void;\n onUpload?: (\n file: File,\n onProgress: (progress: number) => void,\n ) => Promise<string>;\n multiple?: boolean;\n accept?: string;\n maxSizeMB?: number;\n className?: string;\n hintText?: React.ReactNode;\n showSizeText?: boolean;\n getFileIcon?: (fileName: string, fileType: string) => React.ReactNode;\n autoUpload?: boolean;\n disabled?: boolean;\n}\n\n// Default file icon function (MATCHED with getIconForMimeType)\nconst defaultGetFileIcon = (fileName: string, fileType: string) => {\n const extension = fileName.split(\".\").pop()?.toLowerCase() || \"\";\n\n // IMAGE FILES\n if (\n fileType.startsWith(\"image/\") ||\n [\"jpg\", \"jpeg\", \"png\", \"gif\", \"svg\", \"webp\", \"bmp\"].includes(extension)\n ) {\n return <RiImageLine className=\"w-5 h-5 text-white\" />;\n }\n\n // AUDIO FILES\n if (\n fileType.startsWith(\"audio/\") ||\n [\"mp3\", \"wav\", \"ogg\", \"m4a\"].includes(extension)\n ) {\n return <RiMusic2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // VIDEO FILES\n if (\n fileType.startsWith(\"video/\") ||\n [\"mp4\", \"avi\", \"mkv\", \"mov\", \"wmv\"].includes(extension)\n ) {\n return <RiVideoLine className=\"w-5 h-5 text-white\" />;\n }\n\n // EXCEL / SPREADSHEET FILES\n if (\n fileType.includes(\"excel\") ||\n [\"xls\", \"xlsx\", \"csv\", \"txt\", \"ods\"].includes(extension)\n ) {\n return <RiFileExcel2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // WORD DOCUMENTS\n if (\n fileType.includes(\"word\") ||\n [\"doc\", \"docx\", \"odt\", \"xml\"].includes(extension)\n ) {\n return <RiFileWord2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // POWERPOINT FILES\n if ([\"pptx\", \"pptm\", \"xps\", \"ppsx\"].includes(extension)) {\n return <RiFilePpt2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // ZIP / ARCHIVE FILES\n if (\n fileType.includes(\"zip\") ||\n [\"zip\", \"rar\", \"7z\", \"tar\", \"gz\"].includes(extension)\n ) {\n return <RiFileZipLine className=\"w-5 h-5 text-white\" />;\n }\n\n // PDF FILES\n if (fileType === \"application/pdf\" || extension === \"pdf\") {\n return <RiFilePdf2Line className=\"w-5 h-5 text-white\" />;\n }\n\n // DEFAULT ICON\n return <RiFileLine className=\"w-5 h-5 text-white\" />;\n};\n\nexport default function FileUploadControl({\n items,\n onAddFiles,\n onUpdateItem,\n onRejectFiles,\n onDelete,\n onRetry,\n onPreview,\n onUpload,\n multiple = true,\n accept = \"image/*\",\n maxSizeMB = 15,\n className = \"\",\n hintText,\n showSizeText = true,\n getFileIcon = defaultGetFileIcon,\n autoUpload = true,\n disabled,\n}: FileUploadControlProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const inputId = useId();\n const [isDragging, setIsDragging] = useState(false);\n const localPreviews = useRef<Map<string, string>>(new Map());\n const uploadProgress = useRef<Map<string, number>>(new Map());\n const dragCounter = useRef(0);\n\n const formatSize = (bytes?: number) => {\n if (!bytes) return \"0 KB\";\n return `${Math.round(bytes / 1024)} KB`;\n };\n\n const getStatusDisplay = (status?: UploadStatus) => {\n switch (status) {\n case \"uploading\":\n return {\n text: \"Uploading\",\n color: \"text-blue-600\",\n showSpinner: true,\n icon: <Spinner size=\"xs\" color=\"gray\" />,\n canPreview: false,\n };\n case \"success\":\n return {\n text: \"Completed\",\n color: \"text-green-600\",\n showSpinner: false,\n icon: <RiCheckLine className=\"w-3 h-3 text-white\" />,\n canPreview: true,\n };\n case \"error\":\n return {\n text: \"Failed\",\n color: \"text-red-600\",\n showSpinner: false,\n icon: <RiCloseLine className=\"w-3 h-3 text-white\" />,\n canPreview: false,\n };\n default:\n return {\n text: \"\",\n color: \"\",\n showSpinner: false,\n icon: null,\n canPreview: false,\n };\n }\n };\n\n const getProgressColor = (status?: UploadStatus) => {\n switch (status) {\n case \"uploading\":\n return \"bg-blue-500\";\n case \"success\":\n return \"bg-green-600\";\n case \"error\":\n return \"bg-red-500\";\n default:\n return \"bg-gray-300\";\n }\n };\n\n // Get file icon for an item\n const getItemFileIcon = (item: UploadItem) => {\n const fileName = item.name || item.file?.name || \"\";\n const fileType = item.file?.type || \"\";\n return getFileIcon(fileName, fileType);\n };\n\n // Handle upload with progress\n const handleUpload = React.useCallback(\n async (item: UploadItem) => {\n if (\n !item.file ||\n !onUpload ||\n item.status === \"success\" ||\n item.status === \"uploading\"\n ) {\n return;\n }\n\n try {\n // Start with 0% progress\n if (onUpdateItem) {\n onUpdateItem(item.id, { status: \"uploading\", progress: 0 });\n }\n\n // Clear any existing progress\n uploadProgress.current.delete(item.id);\n\n // Call upload function\n const previewUrl = await onUpload(item.file, (progress: number) => {\n // Ensure progress doesn't exceed 100\n const clampedProgress = Math.min(100, Math.max(0, progress));\n uploadProgress.current.set(item.id, clampedProgress);\n\n if (onUpdateItem) {\n onUpdateItem(item.id, {\n progress: clampedProgress,\n status: \"uploading\",\n });\n }\n });\n\n // Ensure 100% progress before marking as success\n if (onUpdateItem) {\n onUpdateItem(item.id, {\n progress: 100,\n status: \"success\",\n previewUrl,\n });\n }\n\n // Clear progress tracking\n uploadProgress.current.delete(item.id);\n } catch (error) {\n console.error(\"Upload error:\", error);\n if (onUpdateItem) {\n onUpdateItem(item.id, {\n progress: 0,\n status: \"error\",\n });\n }\n uploadProgress.current.delete(item.id);\n }\n },\n [onUpload, onUpdateItem],\n );\n\n // Get current progress for an item\n const getCurrentProgress = (item: UploadItem) => {\n // If status is success, always show 100%\n if (item.status === \"success\") return 100;\n\n // If status is error, show 0%\n if (item.status === \"error\") return 0;\n\n // Use local progress if available, otherwise use item progress\n return uploadProgress.current.get(item.id) ?? item.progress ?? 0;\n };\n\n // Internal retry handler\n const handleRetry = (id: string) => {\n const item = items.find((item: UploadItem) => item.id === id);\n if (item && onUpload) {\n handleUpload(item);\n } else if (onRetry) {\n onRetry(id);\n }\n };\n\n // Handle delete internally\n const handleDelete = (id: string) => {\n // Clean up local preview URL if it exists\n if (localPreviews.current.has(id)) {\n const url = localPreviews.current.get(id);\n if (url) URL.revokeObjectURL(url);\n localPreviews.current.delete(id);\n }\n\n // Clean up progress tracking\n uploadProgress.current.delete(id);\n\n // Call external onDelete handler if provided\n if (onDelete) {\n onDelete(id);\n }\n };\n\n // Event handlers\n const triggerInput = () => inputRef.current?.click();\n\n const partitionFiles = (files: File[]) => {\n const valid: File[] = [];\n const rejected: { file: File; reason: string }[] = [];\n for (const file of files) {\n if (file.size > maxSizeMB * 1024 * 1024) {\n rejected.push({ file, reason: `Exceeds ${maxSizeMB}MB limit` });\n } else {\n valid.push(file);\n }\n }\n return { valid, rejected };\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n if (files.length === 0) return;\n\n const { valid, rejected } = partitionFiles(files);\n if (rejected.length > 0) onRejectFiles?.(rejected);\n if (valid.length > 0) onAddFiles(multiple ? valid : [valid[0]]);\n e.target.value = \"\";\n };\n\n const handleDrop = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n dragCounter.current = 0;\n setIsDragging(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length === 0) return;\n\n const { valid, rejected } = partitionFiles(files);\n if (rejected.length > 0) onRejectFiles?.(rejected);\n if (valid.length > 0) onAddFiles(multiple ? valid : [valid[0]]);\n };\n\n const handleDragEnter = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n if (disabled) return;\n dragCounter.current += 1;\n setIsDragging(true);\n };\n\n // Simple drag handlers\n const handleDragOver = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n dragCounter.current -= 1;\n if (dragCounter.current <= 0) {\n dragCounter.current = 0;\n setIsDragging(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n triggerInput();\n }\n };\n\n // Auto-upload files when they're added\n React.useEffect(() => {\n if (autoUpload && onUpload) {\n items.forEach((item: UploadItem) => {\n if (item.status === \"idle\" && item.file) {\n handleUpload(item);\n }\n });\n }\n }, [items, autoUpload, onUpload, handleUpload]);\n\n // Cleanup object URLs on unmount\n React.useEffect(() => {\n const previews = localPreviews?.current;\n return () => {\n previews?.forEach((url: string) => URL?.revokeObjectURL(url));\n };\n }, []);\n\n return (\n <div className={`w-full ${className}`}>\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n hidden\n onChange={handleInputChange}\n disabled={disabled}\n />\n <Label\n htmlFor={inputId}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={triggerInput}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n role=\"button\"\n disabled={disabled}\n aria-label={`Upload ${multiple ? \"images\" : \"an image\"}`}\n className={cn(\n \"max-w-[564px] w-full bg-white py-4 flex items-center justify-center rounded-lg border cursor-pointer transition-all\",\n isDragging\n ? \"border-blue-500 bg-blue-50\"\n : \"border-gray-300 bg-white hover:bg-gray-50\",\n disabled && \"pointer-events-none cursor-not-allowed\",\n )}\n >\n <div className=\"flex items-center gap-3 text-center\">\n <div>\n <p className=\"text-sm text-gray-600\">\n Drag files here or\n <span className=\"text-primary-600 font-semibold ml-1\">\n Upload\n </span>{\" \"}\n <br />\n </p>\n </div>\n </div>\n </Label>\n <span className=\"text-xs\">\n {hintText ?? `Only PNG, JPG, GIF. Max file size ${maxSizeMB}MB`}\n </span>\n\n {/* Upload Items */}\n <div className=\"flex flex-col gap-4 mt-4\">\n {items?.map((item: UploadItem) => {\n const progress = getCurrentProgress(item);\n const statusInfo = getStatusDisplay(item.status);\n const progressColor = getProgressColor(item?.status);\n const fileIcon = getItemFileIcon(item);\n return (\n <div\n key={item?.id}\n className=\"flex items-center gap-4 bg-white max-w-[564px] w-full p-4 rounded-lg border border-gray-200\"\n >\n <div className=\"w-14 h-14 flex-shrink-0 rounded-md overflow-hidden relative\">\n <div className=\"absolute inset-0 w-full h-full object-contain\">\n <FileSvgIcon />\n </div>\n <div className=\"relative z-10 top-2 -left-2.5 flex items-center justify-center w-full h-full text-white\">\n {fileIcon}\n </div>\n </div>\n {/* File Info & Progress */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2 mb-3\">\n <div className=\"min-w-0\">\n <h4 className=\"text-sm font-medium text-gray-900 truncate\">\n {item?.name || item.file?.name || \"Unnamed file\"}\n </h4>\n {showSizeText && (\n <div\n className=\"text-xs text-gray-500 mt-1 flex items-center gap-1\"\n aria-live=\"polite\"\n >\n {formatSize(item?.size || item.file?.size)}\n {statusInfo.text && (\n <div className=\"ml-2 font-medium flex items-center gap-1\">\n {statusInfo?.showSpinner ? (\n <>\n {statusInfo.icon}\n <span className={statusInfo.color}>\n {statusInfo.text}\n </span>\n </>\n ) : (\n <>\n <div\n className={`w-4 h-4 rounded-full flex justify-center items-center ${\n statusInfo?.color === \"text-red-600\"\n ? \"bg-red-600\"\n : statusInfo?.color === \"text-green-600\"\n ? \"bg-green-600\"\n : \"bg-gray-400\"\n }`}\n >\n {statusInfo?.icon}\n </div>\n <span className={statusInfo.color}>\n {statusInfo?.text}\n </span>\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {/* Actions */}\n <div className=\"flex items-center gap-2\">\n {/* Preview Button - Show when upload is successful */}\n {onPreview && item?.status === \"success\" && (\n <button\n type=\"button\"\n onClick={() => onPreview(item.id)}\n className=\"p-2 rounded-md hover:bg-gray-100 transition-colors text-gray-600\"\n title=\"Preview\"\n >\n <RiEyeLine size={16} />\n </button>\n )}\n {item?.status === \"error\" && (\n <>\n {/* Desktop: full button */}\n <span className=\"hidden sm:inline-block\">\n <Button\n variant=\"outlined\"\n intent=\"primary-outlined\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleRetry(item?.id)}\n className=\"whitespace-nowrap h-[30px]\"\n >\n <RiRefreshLine size={16} />\n Try Again\n </Button>\n </span>\n\n {/* Mobile: icon only */}\n <span className=\"sm:hidden\">\n <Button\n variant=\"outlined\"\n intent=\"primary-outlined\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleRetry(item?.id)}\n className=\"h-[30px] px-1 py-1\"\n >\n <RiRefreshLine size={16} />\n </Button>\n </span>\n </>\n )}\n\n {/* Delete button - always shown */}\n <button\n type=\"button\"\n onClick={() => handleDelete(item.id)}\n className=\"p-2 rounded-md hover:bg-gray-100 transition-colors text-gray-600\"\n title=\"Delete\"\n >\n <RiDeleteBin6Line size={16} />\n </button>\n </div>\n </div>\n </div>\n {/* Custom Progress Bar */}\n <div className=\"flex items-center gap-4\">\n <div className=\"flex-1\">\n <div className=\"w-full h-2 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all duration-300 ease-out ${progressColor}`}\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n <div className=\"text-xs text-gray-500 w-12 text-right\">\n {item.status === \"error\"\n ? \"--%\"\n : item.status === \"success\"\n ? \"100%\"\n : `${Math.round(progress)}%`}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// Export the default file icon function for reuse\nexport { defaultGetFileIcon };\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface SpinnerProps {\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n color?: \"primary\" | \"black\" | \"gray\" | string;\n}\n\nconst colorVars: Record<string, { c1: string; c2: string }> = {\n primary: {\n c1: \"var(--primary-500)\",\n c2: \"var(--primary-200)\",\n },\n black: {\n c1: \"rgba(0, 0, 0, 1)\",\n c2: \"rgba(0, 0, 0, 0.5)\",\n },\n gray: {\n c1: \"var(--gray-500)\",\n c2: \"var(--gray-300)\",\n },\n};\n\nconst Spinner = ({ size = \"md\", color = \"primary\" }: SpinnerProps) => {\n const sizeClass = cn({\n \"w-4 h-4\": size === \"xs\",\n \"w-6 h-6\": size === \"sm\",\n \"w-10 h-10\": size === \"md\",\n \"w-16 h-16\": size === \"lg\",\n });\n\n const getColorValues = (color: string) => {\n if (colorVars[color]) {\n return colorVars[color];\n }\n if (color.startsWith('#')) {\n return {\n c1: color,\n c2: `${color}80` \n };\n }\n return colorVars.primary;\n };\n\n const colorValues = getColorValues(color);\n\n return (\n <div className={cn(\"relative\", sizeClass)}>\n <div\n className=\"spinner\"\n style={{\n [\"--spinner-color-1\" as any]: colorValues.c1,\n [\"--spinner-color-2\" as any]: colorValues.c2,\n }}\n />\n </div>\n );\n};\n\nexport default Spinner;\n","\"use client\";\nimport React, { useId, useRef, useState } from \"react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface SegmentedOption {\n /** Text or element shown in the segment. */\n label?: React.ReactNode;\n value: string | number;\n /** Optional. Icon shown before the label. */\n icon?: JSX.Element;\n disabled?: boolean;\n /** Required when the option has an icon but no label. */\n \"aria-label\"?: string;\n}\n\nexport interface SegmentedControlProps {\n options: SegmentedOption[];\n /** Controlled value. */\n value?: string | number;\n /** Uncontrolled initial value. Defaults to the first enabled option. */\n defaultValue?: string | number;\n onChange?: (value: string | number, option: SegmentedOption) => void;\n /** Optional. Defaults to \"md\". */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Optional. Stretch to the width of the container. Defaults to false. */\n fullWidth?: boolean;\n disabled?: boolean;\n /** Optional. Adds a hidden input for native forms. */\n name?: string;\n id?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n}\n\nconst sizes = {\n sm: { box: \"h-8 text-xs\", pad: \"px-3\", icon: 14 },\n md: { box: \"h-10 text-sm\", pad: \"px-4\", icon: 16 },\n lg: { box: \"h-11 text-base\", pad: \"px-5\", icon: 18 },\n} as const;\n\nconst SegmentedControl = ({\n options,\n value,\n defaultValue,\n onChange,\n size = \"md\",\n fullWidth = false,\n disabled = false,\n name,\n id,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n}: SegmentedControlProps) => {\n const reactId = useId();\n const baseId = id ?? `segmented-${reactId}`;\n const [inner, setInner] = useState<string | number | undefined>(\n defaultValue ?? options.find((o) => !o.disabled)?.value,\n );\n const current = value !== undefined ? value : inner;\n const refs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const index = options.findIndex((o) => o.value === current);\n const s = sizes[size];\n\n const select = (i: number) => {\n const o = options[i];\n if (!o || o.disabled || disabled) return;\n if (value === undefined) setInner(o.value);\n onChange?.(o.value, o);\n refs.current[i]?.focus();\n };\n\n const move = (from: number, dir: 1 | -1) => {\n for (let k = 1; k <= options.length; k++) {\n const i = (from + dir * k + options.length) % options.length;\n if (!options[i].disabled) return i;\n }\n return from;\n };\n\n const onKeyDown = (e: React.KeyboardEvent, i: number) => {\n let next = -1;\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") next = move(i, 1);\n else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") next = move(i, -1);\n else if (e.key === \"Home\") next = options.findIndex((o) => !o.disabled);\n else if (e.key === \"End\") {\n for (let k = options.length - 1; k >= 0; k--)\n if (!options[k].disabled) {\n next = k;\n break;\n }\n } else return;\n e.preventDefault();\n if (next >= 0) select(next);\n };\n\n // Tab stop: the selected option, or the first enabled one if nothing is selected\n const tabStop = index >= 0 && !options[index].disabled ? index : options.findIndex((o) => !o.disabled);\n\n return (\n <div\n id={baseId}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-disabled={disabled || undefined}\n className={cn(\n \"relative grid rounded-xl border border-gray-200 bg-gray-100 p-1\",\n fullWidth ? \"flex w-full\" : \"inline-grid\",\n disabled && \"pointer-events-none opacity-40\",\n className,\n )}\n style={fullWidth ? undefined : { gridAutoColumns: \"1fr\", gridAutoFlow: \"column\" }}\n >\n {name && <input type=\"hidden\" name={name} value={current ?? \"\"} />}\n\n {/* Sliding thumb: every segment has the same width, so a percentage translate is enough */}\n {index >= 0 && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute bottom-1 left-1 top-1 rounded-lg bg-white shadow-sm ring-1 ring-gray-200 transition-transform duration-200 ease-out motion-reduce:transition-none\"\n style={{\n width: `calc((100% - 0.5rem) / ${options.length})`,\n transform: `translateX(${index * 100}%)`,\n }}\n />\n )}\n\n {options.map((o, i) => {\n const selected = i === index;\n return (\n <button\n key={String(o.value)}\n ref={(el) => {\n refs.current[i] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n aria-label={o[\"aria-label\"]}\n disabled={o.disabled}\n tabIndex={i === tabStop ? 0 : -1}\n onClick={() => select(i)}\n onKeyDown={(e) => onKeyDown(e, i)}\n className={cn(\n \"relative z-10 inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg font-medium\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\",\n s.box,\n s.pad,\n fullWidth && \"flex-1\",\n selected ? \"text-gray-900\" : \"text-gray-600 hover:text-gray-900\",\n o.disabled && \"cursor-not-allowed opacity-40 hover:text-gray-600\",\n )}\n >\n {o.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0\">\n {React.cloneElement(o.icon as React.ReactElement<{ size?: number }>, { size: s.icon })}\n </span>\n )}\n {o.label}\n </button>\n );\n })}\n </div>\n );\n};\n\nSegmentedControl.displayName = \"SegmentedControl\";\n\nexport default SegmentedControl;\n","\"use client\";\nimport React, { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { RiArrowDownSLine, RiCheckLine, RiCloseLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\nexport interface SelectOption {\n label: string;\n value: string | number;\n /** Optional. Unselectable and skipped by the keyboard. */\n disabled?: boolean;\n /** Optional. Secondary line under the label. */\n description?: string;\n /** Optional. Icon shown before the label. */\n icon?: JSX.Element;\n}\n\nexport interface SelectGroup {\n label: string;\n options: SelectOption[];\n}\n\nexport interface SelectProps {\n /** Flat options, or groups of options. */\n options: (SelectOption | SelectGroup)[];\n /** Controlled value. Use null for \"nothing selected\". */\n value?: string | number | null;\n /** Uncontrolled initial value. */\n defaultValue?: string | number | null;\n /** Called with the new value (null when cleared) and its option. */\n onChange?: (value: string | number | null, option: SelectOption | null) => void;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n /** Optional. \"sm\" = 320px, \"lg\" = 313px, default = full width (same as Input). */\n size?: \"sm\" | \"lg\";\n /** Optional. Open the list above or below. Defaults to \"bottom\". */\n placement?: \"bottom\" | \"top\";\n /** Optional. Show a clear button when a value is selected. Defaults to false. */\n clearable?: boolean;\n /** Optional. Max height of the list in px. Defaults to 264. */\n maxHeight?: number;\n /** Optional. Text shown when options is empty. */\n emptyText?: string;\n id?: string;\n /** Optional. Adds a hidden input for native forms. */\n name?: string;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n}\n\nconst isGroup = (o: SelectOption | SelectGroup): o is SelectGroup => \"options\" in o;\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\";\n\nconst Select = ({\n options,\n value,\n defaultValue = null,\n onChange,\n placeholder = \"Select an option\",\n disabled = false,\n error = false,\n size,\n placement = \"bottom\",\n clearable = false,\n maxHeight = 264,\n emptyText = \"No options\",\n id,\n name,\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedby,\n}: SelectProps) => {\n const reactId = useId();\n const triggerId = id ?? `select-${reactId}`;\n const listId = `${triggerId}-list`;\n\n const [inner, setInner] = useState<string | number | null>(defaultValue);\n const current = value !== undefined ? value : inner;\n\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(-1);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const typed = useRef({ text: \"\", timer: 0 as unknown as ReturnType<typeof setTimeout> });\n\n // Flatten, remembering which group heading precedes an option\n const flat = useMemo(() => {\n const out: { option: SelectOption; group?: string; first?: boolean }[] = [];\n options.forEach((o) => {\n if (isGroup(o)) o.options.forEach((opt, i) => out.push({ option: opt, group: o.label, first: i === 0 }));\n else out.push({ option: o });\n });\n return out;\n }, [options]);\n\n const selectedIndex = flat.findIndex((f) => f.option.value === current);\n const selected = selectedIndex >= 0 ? flat[selectedIndex].option : null;\n\n const enabledFrom = useCallback(\n (start: number, dir: 1 | -1) => {\n for (let i = start; i >= 0 && i < flat.length; i += dir) if (!flat[i].option.disabled) return i;\n return -1;\n },\n [flat],\n );\n\n const commit = (opt: SelectOption | null) => {\n const next = opt ? opt.value : null;\n if (value === undefined) setInner(next);\n onChange?.(next, opt);\n };\n\n const close = useCallback((returnFocus = true) => {\n setOpen(false);\n if (returnFocus) triggerRef.current?.focus();\n }, []);\n\n const openList = (at?: number) => {\n if (disabled) return;\n const start = at ?? (selectedIndex >= 0 ? selectedIndex : enabledFrom(0, 1));\n setActive(start);\n setOpen(true);\n };\n\n const pick = (i: number) => {\n const f = flat[i];\n if (!f || f.option.disabled) return;\n commit(f.option);\n close();\n };\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) close(false);\n };\n document.addEventListener(\"mousedown\", onDown);\n return () => document.removeEventListener(\"mousedown\", onDown);\n }, [open, close]);\n\n // Keep the active option visible inside the list\n useEffect(() => {\n if (!open || active < 0) return;\n const el = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n const list = listRef.current;\n if (!el || !list) return;\n if (el.offsetTop < list.scrollTop) list.scrollTop = el.offsetTop;\n else if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight)\n list.scrollTop = el.offsetTop + el.offsetHeight - list.clientHeight;\n }, [open, active]);\n\n useEffect(() => () => clearTimeout(typed.current.timer), []);\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n const move = (i: number) => {\n if (i >= 0) {\n setActive(i);\n if (!open) openList(i);\n }\n };\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (!open) openList();\n else move(enabledFrom(active + 1, 1) >= 0 ? enabledFrom(active + 1, 1) : active);\n return;\n case \"ArrowUp\":\n e.preventDefault();\n if (!open) openList();\n else move(enabledFrom(active - 1, -1) >= 0 ? enabledFrom(active - 1, -1) : active);\n return;\n case \"Home\":\n if (open) { e.preventDefault(); move(enabledFrom(0, 1)); }\n return;\n case \"End\":\n if (open) { e.preventDefault(); move(enabledFrom(flat.length - 1, -1)); }\n return;\n case \"Enter\":\n case \" \":\n if (open && !(e.key === \" \" && typed.current.text)) {\n e.preventDefault();\n pick(active);\n } else if (!open) {\n e.preventDefault();\n openList();\n }\n return;\n case \"Escape\":\n if (open) { e.preventDefault(); e.stopPropagation(); close(); }\n return;\n case \"Tab\":\n if (open) setOpen(false);\n return;\n }\n // Type-ahead\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n clearTimeout(typed.current.timer);\n typed.current.text += e.key.toLowerCase();\n typed.current.timer = setTimeout(() => (typed.current.text = \"\"), 600);\n const text = typed.current.text;\n const from = text.length === 1 ? Math.max(active, 0) + 1 : Math.max(active, 0);\n const order = flat.map((_, i) => i);\n const rotated = [...order.slice(from), ...order.slice(0, from)];\n const hit = rotated.find(\n (i) => !flat[i].option.disabled && flat[i].option.label.toLowerCase().startsWith(text),\n );\n if (hit !== undefined) {\n if (!open) openList(hit);\n else setActive(hit);\n }\n }\n };\n\n const activeId = open && active >= 0 ? `${triggerId}-opt-${active}` : undefined;\n\n return (\n <div ref={rootRef} className=\"relative inline-block max-w-full\">\n {name && <input type=\"hidden\" name={name} value={current ?? \"\"} />}\n\n <div\n className={cn(\n \"group flex items-center gap-2 p-3.5 max-w-full rounded-xl\",\n \"border border-gray-200 bg-white shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n \"hover:bg-gray-50 hover:border-gray-300\",\n \"focus-within:border-primary-600 focus-within:ring-4 focus-within:ring-primary-100\",\n open && \"border-primary-600 ring-4 ring-primary-100\",\n disabled && \"opacity-30 bg-gray-300 select-none pointer-events-none shadow-none\",\n size === \"sm\" ? \"w-[320px] h-10\" : size === \"lg\" ? \"w-[313px] h-11\" : \"w-full h-10\",\n error && \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100\",\n className,\n )}\n >\n {selected?.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {selected.icon}\n </span>\n )}\n <button\n ref={triggerRef}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n aria-activedescendant={activeId}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedby}\n aria-invalid={error || undefined}\n onClick={() => (open ? close() : openList())}\n onKeyDown={onKeyDown}\n className={cn(\n \"min-w-0 flex-1 truncate bg-transparent text-left text-sm focus:outline-none\",\n selected ? \"text-gray-900\" : \"text-gray-500\",\n )}\n >\n {selected ? selected.label : placeholder}\n </button>\n {clearable && selected && !disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear selection\"\n onClick={() => {\n commit(null);\n triggerRef.current?.focus();\n }}\n className={cn(\n \"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-gray-500 hover:bg-gray-100 hover:text-gray-800\",\n focusRing,\n )}\n >\n <RiCloseLine size={16} aria-hidden=\"true\" />\n </button>\n )}\n <RiArrowDownSLine\n size={18}\n aria-hidden=\"true\"\n className={cn(\n \"shrink-0 text-gray-500 transition-transform duration-200 motion-reduce:transition-none group-hover:text-gray-600\",\n open && \"rotate-180\",\n )}\n />\n </div>\n\n {open && (\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={ariaLabel}\n style={{ maxHeight }}\n className={cn(\n \"absolute left-0 z-50 w-full min-w-[160px] overflow-y-auto rounded-xl border border-gray-200 bg-white p-1 shadow-lg\",\n placement === \"top\" ? \"bottom-full mb-2\" : \"top-full mt-2\",\n )}\n >\n {flat.length === 0 && <p className=\"px-3 py-2 text-sm text-gray-500\">{emptyText}</p>}\n {flat.map((f, i) => {\n const isSel = f.option.value === current;\n const isActive = i === active;\n return (\n <React.Fragment key={`${f.option.value}-${i}`}>\n {f.group && f.first && (\n <div\n role=\"presentation\"\n className={cn(\n \"px-3 pb-1 pt-2 text-xs font-semibold uppercase tracking-wide text-gray-400\",\n i > 0 && \"mt-1 border-t border-gray-100\",\n )}\n >\n {f.group}\n </div>\n )}\n <div\n id={`${triggerId}-opt-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={isSel}\n aria-disabled={f.option.disabled || undefined}\n onMouseMove={() => !f.option.disabled && active !== i && setActive(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => pick(i)}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm text-gray-900\",\n isActive && \"bg-gray-100\",\n isSel && \"font-medium text-primary-700\",\n f.option.disabled && \"cursor-not-allowed opacity-40\",\n )}\n >\n {f.option.icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 text-gray-500\">\n {f.option.icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{f.option.label}</span>\n {f.option.description && (\n <span className=\"block truncate text-xs font-normal text-gray-500\">\n {f.option.description}\n </span>\n )}\n </span>\n {isSel && <RiCheckLine size={16} aria-hidden=\"true\" className=\"shrink-0 text-primary-600\" />}\n </div>\n </React.Fragment>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nSelect.displayName = \"Select\";\n\nexport default Select;\n","\"use client\";\nimport React, { ReactNode, useRef, useState } from \"react\";\nimport Link from \"next/link\";\nimport { cn } from \"../utils/utils\";\nimport Divider from \"@/app/components/Divider\";\nimport { RiArrowDownSLine, RiArrowRightSLine } from \"@remixicon/react\";\nimport { usePathname } from \"next/navigation\";\n\n// -------------------- Types --------------------\n\ninterface NavItem {\n label: string;\n href?: string;\n icon?: React.ReactElement;\n subItems?: NavItem[];\n}\n\ninterface SidebarProps {\n children: React.ReactNode;\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n scroll?: boolean;\n dense?: boolean;\n navItems?: {\n label: string;\n items: NavItem[];\n }[];\n}\n\ninterface SidebarHeaderProps {\n children: ReactNode;\n dense?: boolean;\n}\n\ninterface SidebarMenuProps {\n collapsed: boolean;\n navItems?: {\n label: string;\n items: NavItem[];\n }[];\n scroll?: boolean;\n dense?: boolean;\n}\n\ninterface FooterProps {\n children: React.ReactNode;\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n navItems?: {\n label: string;\n items: NavItem[];\n }[];\n dense?: boolean;\n}\n\n// -------------------- Shared styles --------------------\n\n// Keyboard-only ring, inset so the rows' overflow-hidden never clips it.\nconst linkFocus =\n \"outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\";\n\n// Active row: a soft primary tint instead of the old solid primary block,\n// matching the selected state of Tabs and TreeView.\nconst linkActive = \"bg-primary-50 text-primary-700 hover:bg-primary-100\";\n\n// -------------------- Sidebar --------------------\n// Note: `collapsed` is true while the sidebar is expanded (it is set to true on\n// hover). The prop semantics are unchanged.\n\nconst Sidebar: React.FC<SidebarProps> & {\n Header: React.FC<SidebarHeaderProps>;\n Menu: React.FC<SidebarMenuProps>;\n Footer: React.FC<FooterProps>;\n} = ({ children, collapsed, setCollapsed, dense = false }) => {\n // Tracks the pointer so a blur doesn't collapse the sidebar under the cursor.\n const hovered = useRef(false);\n\n return (\n <div\n onMouseEnter={() => {\n hovered.current = true;\n setCollapsed(true);\n }}\n onMouseLeave={() => {\n hovered.current = false;\n setCollapsed(false);\n }}\n // Keyboard users never trigger hover, so their labels stayed hidden.\n // Focusing anything inside expands the sidebar; it collapses again when\n // focus leaves (unless the pointer is still over it).\n onFocusCapture={() => setCollapsed(true)}\n onBlurCapture={(e) => {\n if (\n !e.currentTarget.contains(e.relatedTarget as Node | null) &&\n !hovered.current\n ) {\n setCollapsed(false);\n }\n }}\n className={cn(\n \"border border-gray-200 bg-white shadow-sm relative flex flex-col min-h-screen cursor-default\",\n \"transition-[width,padding,box-shadow] duration-300 ease-in-out motion-reduce:transition-none\",\n // the expanded sidebar floats a little higher\n collapsed && \"shadow-lg\",\n !collapsed\n ? dense\n ? \"w-[76px] py-[19px] px-[15px]\"\n : \"w-[80px] py-[21px] px-[17px]\"\n : dense\n ? \"w-[304px] py-[20px] px-5\"\n : \"w-[308px] py-[22px] px-6\",\n )}\n >\n <div>{children}</div>\n </div>\n );\n};\n\n// -------------------- SidebarHeader --------------------\n\nconst SidebarHeader: React.FC<SidebarHeaderProps> = ({\n children,\n dense = false,\n}) => {\n return (\n <div className={cn(\"z-20\", dense ? \"mb-3\" : \"mb-4\")}>\n <div className=\"flex justify-between items-center\">\n <span className=\"whitespace-nowrap font-semibold text-gray-900\">\n {children}\n </span>\n </div>\n </div>\n );\n};\n\n// -------------------- SidebarMenu --------------------\nconst SidebarMenu: React.FC<SidebarMenuProps> = ({\n collapsed,\n navItems,\n scroll = false,\n dense = false,\n}) => {\n const [openMenus, setOpenMenus] = useState<Record<string, boolean>>({});\n const currentPath = usePathname();\n\n const toggleMenu = (label: string) => {\n setOpenMenus((prev) => ({ ...prev, [label]: !prev[label] }));\n };\n\n // Close all submenus when sidebar collapses\n React.useEffect(() => {\n if (!collapsed) {\n setOpenMenus({});\n }\n }, [collapsed]);\n\n // Calculate menu height based on footer items\n const getMenuHeight = () => {\n const footerItemsLength =\n navItems?.reduce((acc, item) => acc + item.items.length, 0) || 0;\n if (footerItemsLength <= 1) {\n return \"max-h-[80vh]\";\n } else if (footerItemsLength === 2) {\n return \"max-h-[70vh]\";\n } else {\n return \"max-h-[60vh]\";\n }\n };\n\n // Labels fade with the width animation instead of popping.\n const labelFade =\n \"transition-opacity duration-200 motion-reduce:transition-none\";\n\n const renderMenuItems = (items: NavItem[], level = 0) => {\n return (\n <ul className={level > 0 ? \"ml-5 border-l border-gray-200\" : \"\"}>\n {items?.map((item, index) => {\n const hasSubItems = item.subItems && item.subItems.length > 0;\n const isActive = item.href === currentPath;\n\n const isOpen = openMenus[item.label];\n const paddingLeft =\n level === 0\n ? dense\n ? \"10px\"\n : \"12px\"\n : `${level * 5 + (dense ? 10 : 12)}px`;\n\n return (\n <li key={index}>\n {hasSubItems ? (\n <Link\n href={item.href || \"#\"}\n aria-current={isActive ? \"page\" : undefined}\n aria-expanded={!!isOpen}\n className={cn(\n \"flex items-center justify-between rounded-lg cursor-pointer transition-colors duration-200 motion-reduce:transition-none font-semibold whitespace-nowrap overflow-hidden\",\n linkFocus,\n dense ? \"px-3 py-1.5 mb-1\" : \"px-3 py-2 mb-[6px]\",\n isActive ? linkActive : \"text-gray-700\",\n isOpen ? \"bg-gray-100\" : \"\",\n \"hover:bg-gray-100\",\n level > 0 ? \"text-sm font-medium\" : \"\",\n )}\n style={{ paddingLeft }}\n onClick={(e) => {\n if (collapsed) {\n toggleMenu(item.label);\n }\n if (!item.href) e.preventDefault();\n }}\n >\n <div className=\"flex items-center gap-2\">\n {item.icon && level === 0 && (\n <span className={dense ? \"text-xs\" : \"text-text-sm\"}>\n {item.icon}\n </span>\n )}\n <span\n className={cn(labelFade, !collapsed ? \"opacity-0\" : \"\")}\n >\n {item.label}\n </span>\n </div>\n {collapsed && hasSubItems && (\n <span aria-hidden=\"true\" className=\"text-gray-500\">\n {isOpen ? (\n <RiArrowDownSLine size={dense ? 16 : 18} />\n ) : (\n <RiArrowRightSLine size={dense ? 16 : 18} />\n )}\n </span>\n )}\n </Link>\n ) : (\n <Link\n href={item.href || \"#\"}\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-lg cursor-pointer transition-colors duration-200 motion-reduce:transition-none whitespace-nowrap overflow-hidden\",\n linkFocus,\n \"hover:bg-gray-100\",\n dense ? \"px-3 py-1 mb-1\" : \"px-3 py-2 mb-[6px]\",\n isActive ? linkActive : \"text-gray-700\",\n level > 0 ? \"text-sm font-medium\" : \"font-semibold\",\n )}\n >\n {item.icon && level === 0 && (\n <span className={dense ? \"text-xs\" : \"text-text-sm\"}>\n {item.icon}\n </span>\n )}\n <span\n className={cn(labelFade, !collapsed ? \"opacity-0\" : \"\")}\n >\n {item.label}\n </span>\n </Link>\n )}\n\n {hasSubItems && isOpen && (\n <div className={dense ? \"mt-0.5\" : \"mt-1\"}>\n {renderMenuItems(item.subItems!, level + 1)}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n );\n };\n\n return (\n <nav\n aria-label=\"Main navigation\"\n className={cn(\n getMenuHeight(),\n \"\",\n scroll && collapsed\n ? \"overflow-y-auto customScroll\"\n : \"overflow-hidden\",\n )}\n >\n <ul\n className={cn(\n \"flex flex-col gap-2 items-stretch\",\n dense ? \"my-1.5\" : \"my-2\",\n )}\n >\n {navItems?.map((parentItem, parentIndex) => (\n <li\n key={parentIndex}\n className=\"flex flex-col gap-3 mb-1 whitespace-nowrap overflow-hidden\"\n >\n <p\n className={cn(\n // small uppercase group heading\n \"text-gray-500 font-semibold uppercase tracking-wider\",\n labelFade,\n dense ? \"text-[11px]\" : \"text-[12px]\",\n !collapsed ? \"opacity-0\" : \"\",\n )}\n >\n {parentItem.label}\n </p>\n {renderMenuItems(parentItem.items)}\n </li>\n ))}\n </ul>\n </nav>\n );\n};\n\n// -------------------- Footer --------------------\n\nconst SidebarFooter: React.FC<FooterProps> = ({\n children,\n setCollapsed,\n collapsed,\n navItems,\n dense = false,\n}) => {\n const currentPath = usePathname();\n return (\n <div\n className={cn({\n \"absolute bottom-0 overflow-auto bg-white z-10\": true,\n \"max-h-[226px] py-2.5 w-[85%]\": dense,\n \"max-h-[230px] py-3 w-[85%]\": !dense,\n \"w-[53%]\": !collapsed && dense,\n \"w-[55%]\": !collapsed && !dense,\n })}\n onClick={() => setCollapsed(true)}\n >\n {collapsed && (\n <div className=\"shadow-md\">\n <Divider />\n </div>\n )}\n {navItems && navItems.length > 0 && (\n <nav aria-label=\"Secondary navigation\" className=\"flex-grow w-full\">\n <ul\n className={cn(\n \"flex flex-col gap-2 items-stretch\",\n dense ? \"my-1.5\" : \"my-2\",\n )}\n >\n {navItems?.map((parentItem, parentIndex) => (\n <li\n key={parentIndex}\n className=\"flex flex-col gap-3 mb-1 whitespace-nowrap overflow-hidden\"\n >\n <p\n className={cn({\n \"text-gray-500 font-semibold uppercase tracking-wider\": true,\n \"text-[11px]\": dense,\n \"text-[12px]\": !dense,\n \"w-[35px] text-ellipsis text-white whitespace-nowrap overflow-hidden\":\n !collapsed && dense,\n \"w-[37px] text-ellipsis text-white whitespace-nowrap overflow-hidden\":\n !collapsed && !dense,\n })}\n >\n {parentItem.label}\n </p>\n {\n <ul>\n {parentItem?.items?.map((item, index) => (\n <li key={index}>\n <Link\n aria-current={\n currentPath === item?.href ? \"page\" : undefined\n }\n className={cn({\n \"hover:bg-gray-100 flex items-center cursor-pointer rounded-lg transition-colors duration-200 motion-reduce:transition-none font-semibold whitespace-nowrap overflow-hidden\": true,\n [linkFocus]: true,\n \"px-2 py-1.5 mb-1\": dense,\n \"px-3 py-2 mb-[6px]\": !dense,\n [linkActive]: currentPath === item?.href,\n \"text-gray-700\": currentPath !== item?.href,\n })}\n href={item?.href || \"#\"}\n passHref\n >\n <div\n className={`flex items-center gap-2 whitespace-nowrap`}\n >\n <span\n className={dense ? \"text-xs\" : \"text-text-sm\"}\n >\n {\" \"}\n {item.icon}\n </span>\n <span\n className={cn(\n \"transition-opacity duration-200 motion-reduce:transition-none\",\n !collapsed ? \"opacity-0\" : \"\",\n )}\n >\n {item.label}\n </span>\n </div>\n </Link>\n </li>\n ))}\n </ul>\n }\n </li>\n ))}\n </ul>\n </nav>\n )}\n {children}\n </div>\n );\n};\n\nSidebar.Header = SidebarHeader;\nSidebar.Menu = SidebarMenu;\nSidebar.Footer = SidebarFooter;\n\nexport default Sidebar;\n","import React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface SkeletonProps {\n width?: string | number;\n height?: string | number;\n circle?: boolean;\n animation?: \"wave\" | \"pulse\" | \"shimmer\";\n}\n\nconst Skeleton: React.FC<SkeletonProps> = ({\n width = \"100%\",\n height = \"100%\",\n circle = false,\n animation = \"shimmer\",\n}) => {\n const style: React.CSSProperties = {\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n borderRadius: circle ? \"50%\" : undefined,\n display: \"block\",\n };\n\n return (\n <span\n // a placeholder carries no information, so it is hidden from screen readers\n aria-hidden=\"true\"\n className={cn(\n // the skeleton* classes come from your global stylesheet and still\n // control the colour and the animation\n \"skeleton rounded-xl\",\n // never squashed in a flex row, never wider than its container\n \"shrink-0 max-w-full\",\n // under prefers-reduced-motion the placeholder stays but stops moving\n \"motion-reduce:[animation:none]\",\n circle ? \"circle\" : \"\",\n animation === \"shimmer\" && \"skeleton-shimmer\",\n animation === \"wave\" && \"skeleton-wave\",\n animation === \"pulse\" && \"skeleton-pulse\",\n )}\n style={style}\n ></span>\n );\n};\n\nexport default Skeleton;\n","import React, { forwardRef, type InputHTMLAttributes } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface SliderProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> {\n value: number;\n min?: number;\n max?: number;\n size?: \"sm\" | \"lg\";\n}\n\nconst Slider = forwardRef<HTMLInputElement, SliderProps>(\n ({ value, min = 0, max = 100, size = \"sm\", ...props }, ref) => {\n const progress = ((value - min) / (max - min)) * 100;\n return (\n <>\n <input\n ref={ref}\n type=\"range\"\n min={min}\n max={max}\n value={value}\n {...props}\n className={cn(\n // existing hook, kept because the thumb styles live under `.slider`\n \"slider\",\n // track\n \"w-full rounded-full appearance-none bg-gray-300 cursor-pointer\",\n \"transition-shadow duration-200 ease-out motion-reduce:transition-none\",\n // keyboard-only focus ring (same ring as Input, Textarea, FileUpload)\n \"focus:outline-none focus-visible:ring-4 focus-visible:ring-primary-100\",\n // error state via the native attribute, no new prop needed\n \"aria-[invalid=true]:focus-visible:ring-error-100\",\n // disabled\n \"disabled:opacity-30 disabled:cursor-not-allowed\",\n // height (unchanged: 6px for sm, 16px for lg)\n size === \"sm\" ? \"h-1.5\" : \"h-4\",\n )}\n style={{\n // the fill uses a stronger shade than before for better contrast,\n // falling back to the original --primary-300 if --primary-500 isn't defined\n background: `linear-gradient(to right, var(--primary-500, var(--primary-300)) ${progress}%, var(--gray-200, var(--gray-300)) ${progress}%)`,\n }}\n />\n </>\n );\n },\n);\n\nSlider.displayName = \"Slider\";\n\nexport default Slider;\n","import React, { forwardRef } from 'react';\n\ninterface SplitButtonProps {\n children: React.ReactNode;\n className?: string;\n size?: 'sm' | 'md' | 'lg';\n appearance?: 'primary' | 'secondary' | 'warning' | 'danger';\n compact?: boolean;\n}\n\nconst SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(\n ({ children, className = '', size = 'md', appearance = 'primary', compact = false, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={`inline-flex ${compact ? 'gap-0' : ''} ${className}`}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSplitButton.displayName = 'SplitButton';\n\nexport default SplitButton;","\"use client\";\nimport React, { useRef } from \"react\";\nimport { RiCheckLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\n\ninterface StepConfig {\n name: string;\n helperName?: string;\n Component: React.ComponentType<any>;\n}\n\ninterface CheckoutStepperProps {\n stepsConfig: StepConfig[];\n currentStep: number;\n setCurrentStep: (step: number) => void;\n isComplete: boolean;\n setIsComplete: (complete: boolean) => void;\n position?: string;\n}\n\nconst Stepper = ({\n stepsConfig,\n currentStep,\n setCurrentStep,\n isComplete,\n setIsComplete,\n position = \"horizontal\",\n}: CheckoutStepperProps) => {\n const stepRef = useRef<(HTMLDivElement | null)[]>([]);\n\n if (!stepsConfig.length) {\n return null;\n }\n\n const ActiveComponent = stepsConfig[currentStep - 1]?.Component;\n\n return (\n <div\n role=\"region\"\n aria-label=\"Step Progress\"\n className={cn(position !== \"horizontal\" && \"flex\")}\n >\n <div\n className={cn(\n \"relative\",\n position === \"horizontal\"\n ? \"flex justify-center items-start\"\n : \"flex flex-col\",\n )}\n role=\"list\"\n aria-label={`Progress: ${currentStep} of ${stepsConfig.length} steps`}\n >\n {stepsConfig?.map((step, index) => {\n const isDone = currentStep > index + 1 || isComplete;\n const isCurrent = currentStep === index + 1;\n\n return (\n <div\n key={index}\n ref={(el: any) => (stepRef.current[index] = el)}\n className={cn(\n position === \"horizontal\"\n ? \"flex gap-4 flex-col\"\n : \"flex gap-6 justify-start\",\n index === stepsConfig.length - 1 ? \"w-auto\" : \"w-full\",\n // kept as a styling hook for consumers\n isDone ? \"complete\" : \"\",\n )}\n role=\"listitem\"\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={`${step.name}${\n step.helperName ? `, ${step.helperName}` : \"\"\n }, ${\n isDone ? \"completed\" : isCurrent ? \"current step\" : \"pending\"\n }`}\n >\n <div\n className={cn(\n \"\",\n position === \"horizontal\"\n ? \"flex items-center\"\n : \"flex flex-col\",\n )}\n >\n <div\n className={cn(\n // size is unchanged (20px), so connectors and labels stay aligned\n \"w-[20px] h-[20px] shrink-0 rounded-full flex justify-center items-center border\",\n \"transition-[background-color,border-color,box-shadow] duration-300 ease-out motion-reduce:transition-none\",\n isDone\n ? \"bg-primary-600 border-transparent\"\n : isCurrent\n ? // soft halo makes the current step easy to spot\n \"bg-white border-primary-600 ring-4 ring-primary-100\"\n : \"bg-white border-gray-300\",\n )}\n role=\"status\"\n aria-label={`Step ${index + 1} ${\n isDone ? \"completed\" : isCurrent ? \"current\" : \"pending\"\n }`}\n >\n {isCurrent && !isComplete && (\n <span\n aria-hidden=\"true\"\n className=\"w-[10px] h-[10px] rounded-full bg-primary-600\"\n ></span>\n )}\n {isDone && (\n <span aria-hidden=\"true\" className=\"inline-flex\">\n <RiCheckLine size={12} color=\"#fff\" />\n </span>\n )}\n </div>\n {index !== stepsConfig.length - 1 && (\n <div\n className={cn(\n \"mx-auto rounded-full bg-gray-200 overflow-hidden\",\n position === \"horizontal\"\n ? \"w-[80%] h-1\"\n : \"h-[100px] w-1 my-2\",\n )}\n aria-hidden=\"true\"\n >\n {/* the fill grows when a step is completed */}\n <p\n className={cn(\n \"rounded-full bg-primary-600\",\n \"transition-[width,height] duration-500 ease-out motion-reduce:transition-none\",\n position === \"horizontal\"\n ? cn(\n \"h-full\",\n currentStep > index + 1 ? \"w-full\" : \"w-0\",\n )\n : cn(\n \"w-full\",\n currentStep > index + 1 ? \"h-full\" : \"h-0\",\n ),\n )}\n ></p>\n </div>\n )}\n </div>\n\n {/* step name */}\n <div\n aria-hidden={!isCurrent}\n className={cn(\n \"whitespace-nowrap\",\n // the label is 20px tall now, so it lines up with the circle\n // without the old negative margin unless there is helper text\n step?.helperName ? \"-mt-1\" : \"\",\n )}\n >\n <span\n aria-label=\"Helper text\"\n className=\"block text-gray-500 text-text-xs\"\n >\n {step?.helperName}\n </span>\n <p\n className={cn(\n \"text-sm leading-5 transition-colors duration-300 motion-reduce:transition-none\",\n isCurrent\n ? \"font-semibold text-primary-700\"\n : isDone\n ? \"font-medium text-gray-900\"\n : \"font-medium text-gray-500\",\n )}\n >\n {step?.name}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n\n {ActiveComponent && (\n <div\n role=\"tabpanel\"\n aria-label={`Current step: ${stepsConfig[currentStep - 1]?.name}`}\n tabIndex={0}\n // keyboard-only ring, since the panel is focusable\n className=\"rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\"\n >\n <ActiveComponent />\n </div>\n )}\n </div>\n );\n};\n\nexport default Stepper;\n","import React, {\n HTMLAttributes,\n ReactNode,\n TableHTMLAttributes,\n TdHTMLAttributes,\n ThHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface TableProps extends TableHTMLAttributes<HTMLTableElement> {\n children?: ReactNode;\n dense?: boolean;\n}\n\ninterface TableHeadProps extends HTMLAttributes<HTMLTableSectionElement> {\n children?: ReactNode;\n}\n\ninterface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n children?: ReactNode;\n indent?: boolean;\n}\n\ninterface TableHeadCellProps extends ThHTMLAttributes<HTMLTableCellElement> {\n children?: ReactNode;\n icon?: JSX.Element;\n sticky?: boolean;\n left?: string;\n right?: string;\n stickyIcon?: JSX.Element;\n shadow?: boolean;\n shadowRight?: boolean;\n}\n\ninterface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n children?: ReactNode;\n icon?: JSX.Element;\n sticky?: boolean;\n left?: string;\n right?: string;\n shadow?: boolean;\n shadowRight?: boolean;\n}\n\nexport const Table = ({ children, className, dense, ...props }: TableProps) => {\n return (\n <table\n {...props}\n className={cn(\n dense && \"group/dense\",\n \"bg-white text-left w-full border\",\n className\n )}\n >\n {children}\n </table>\n );\n};\n\nexport const TableHead = ({\n children,\n className,\n ...props\n}: TableHeadProps) => {\n return (\n <thead\n {...props}\n className={cn(\"bg-gray-50 border border-gray-200\", className)}\n >\n {children}\n </thead>\n );\n};\n\nexport const TableBody = ({\n children,\n className,\n ...props\n}: TableHeadProps) => {\n return (\n <tbody {...props} className={cn(className)}>\n {children}\n </tbody>\n );\n};\n\nexport const TableRow = ({\n children,\n className,\n indent,\n ...props\n}: TableRowProps) => {\n return (\n <tr\n {...props}\n className={cn(\n \"border border-gray-200 hover:bg-gray-50\",\n indent && \"group/indent border-none\",\n className\n )}\n >\n {children}\n </tr>\n );\n};\n\nexport const TableHeadCell = ({\n children,\n className,\n icon,\n sticky,\n shadow,\n left,\n shadowRight,\n right,\n ...props\n}: TableHeadCellProps) => {\n return (\n <th\n {...props}\n className={cn(\n \"px-6 py-3 text-left group-has-[th]/dense:py-2\",\n sticky && `sticky bg-gray-50`,\n sticky && shadow && \"shadow-table\",\n sticky && shadowRight && \"shadow-tableRight\",\n left,\n right,\n className\n )}\n style={{\n left: left,\n right: right,\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium text-xs\">{children}</span>\n {icon && (\n <span\n className={\n \"hover:bg-gray-200 w-5 h-5 flex items-center justify-center p-1 rounded focus:bg-gray-300 active:bg-gray-300\"\n }\n >\n {icon}\n </span>\n )}\n </div>\n </th>\n );\n};\n\nexport const TableDataCell = ({\n children,\n className,\n icon,\n sticky,\n shadow,\n shadowRight,\n left,\n right,\n ...props\n}: TableCellProps) => {\n return (\n <td\n {...props}\n className={cn(\n \"px-6 py-4 text-sm font-medium group-has-[td]/dense:py-2 first:group-has-[td]/indent:pl-[60px]\",\n sticky && `sticky bg-white`,\n sticky && shadow && \"shadow-table\",\n sticky && shadowRight && \"shadow-tableRight\",\n left,\n right,\n className\n )}\n style={{\n left: left,\n right: right,\n }}\n >\n <span className=\"font-medium text-sm\">{children}</span>\n {icon && (\n <span\n className={\n \"hover:bg-gray-200 w-5 h-5 flex items-center justify-center p-1 rounded focus:bg-gray-300 active:bg-gray-300\"\n }\n >\n {icon}\n </span>\n )}\n </td>\n );\n};\n\nexport default Table;\n","\"use client\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n RiCheckboxCircleLine,\n RiCloseCircleLine,\n RiCloseLine,\n RiErrorWarningLine,\n RiInformationLine,\n} from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport Spinner from \"./Spinner\";\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport type ToastIntent = \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\" | \"loading\";\n\nexport type ToastPosition =\n | \"top-right\"\n | \"top-left\"\n | \"top-center\"\n | \"bottom-right\"\n | \"bottom-left\"\n | \"bottom-center\";\n\nexport interface ToastAction {\n label: string;\n onClick: () => void;\n}\n\nexport interface ToastOptions {\n /** Optional. Reuse an id to update an existing toast instead of adding a new one. */\n id?: string;\n /** Optional. Bold first line. */\n title?: React.ReactNode;\n /** Optional. Message text. */\n description?: React.ReactNode;\n /** Optional. Defaults to \"default\". */\n intent?: ToastIntent;\n /** Optional. Milliseconds before auto-dismiss. Use Infinity to keep it until dismissed. Defaults to the provider's duration (loading toasts default to Infinity). */\n duration?: number;\n /** Optional. A button shown under the message. */\n action?: ToastAction;\n /** Optional. Show a close button. Defaults to true. */\n dismissible?: boolean;\n /** Optional. Custom icon, or false for none. */\n icon?: JSX.Element | false;\n /** Optional. Called after the toast is removed. */\n onDismiss?: () => void;\n}\n\ninterface ToastData extends ToastOptions {\n id: string;\n intent: ToastIntent;\n /** Bumped on every update so timers restart. */\n version: number;\n}\n\ntype Message = React.ReactNode;\n\nexport interface ToastPromiseMessages<T> {\n loading: Message;\n success: Message | ((data: T) => Message);\n error: Message | ((error: unknown) => Message);\n}\n\nexport interface ToastApi {\n /** Show a toast. Returns its id. */\n toast: (options: ToastOptions | Message) => string;\n success: (message: Message, options?: ToastOptions) => string;\n error: (message: Message, options?: ToastOptions) => string;\n warning: (message: Message, options?: ToastOptions) => string;\n info: (message: Message, options?: ToastOptions) => string;\n loading: (message: Message, options?: ToastOptions) => string;\n /** Change an existing toast (for example loading → success). */\n update: (id: string, options: ToastOptions) => void;\n /** Dismiss one toast by id, or all of them when called without an id. */\n dismiss: (id?: string) => void;\n /** Show a loading toast that turns into success or error when the promise settles. */\n promise: <T>(promise: Promise<T>, messages: ToastPromiseMessages<T>, options?: ToastOptions) => Promise<T>;\n}\n\nexport interface ToastProviderProps {\n children: React.ReactNode;\n /** Optional. Where toasts appear. Defaults to \"top-right\". */\n position?: ToastPosition;\n /** Optional. Default auto-dismiss time in ms. Defaults to 5000. */\n duration?: number;\n /** Optional. How many toasts show at once. Extra toasts wait in a queue. Defaults to 3. */\n maxVisible?: number;\n /** Optional. Show a shrinking bar for the remaining time. Defaults to false. */\n showProgress?: boolean;\n /** Optional. Accessible name of the notification area. Defaults to \"Notifications\". */\n label?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Context */\n/* -------------------------------------------------------------------------- */\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nexport const useToast = (): ToastApi => {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used inside <ToastProvider>.\");\n return ctx;\n};\n\nconst positionClass: Record<ToastPosition, string> = {\n \"top-right\": \"top-4 right-4 items-end\",\n \"top-left\": \"top-4 left-4 items-start\",\n \"top-center\": \"top-4 left-1/2 -translate-x-1/2 items-center\",\n \"bottom-right\": \"bottom-4 right-4 items-end\",\n \"bottom-left\": \"bottom-4 left-4 items-start\",\n \"bottom-center\": \"bottom-4 left-1/2 -translate-x-1/2 items-center\",\n};\n\nconst icons: Record<Exclude<ToastIntent, \"loading\">, JSX.Element> = {\n default: <RiInformationLine size={20} />,\n primary: <RiInformationLine size={20} />,\n success: <RiCheckboxCircleLine size={20} />,\n warning: <RiErrorWarningLine size={20} />,\n error: <RiCloseCircleLine size={20} />,\n};\n\nconst iconColor: Record<ToastIntent, string> = {\n default: \"text-gray-500\",\n primary: \"text-primary-600\",\n success: \"text-success-600\",\n warning: \"text-warning-600\",\n error: \"text-error-600\",\n loading: \"text-primary-600\",\n};\n\nconst barColor: Record<ToastIntent, string> = {\n default: \"bg-gray-400\",\n primary: \"bg-primary-600\",\n success: \"bg-success-600\",\n warning: \"bg-warning-500\",\n error: \"bg-error-600\",\n loading: \"bg-primary-600\",\n};\n\nconst EXIT_MS = 200;\n\n/* -------------------------------------------------------------------------- */\n/* Item */\n/* -------------------------------------------------------------------------- */\n\nconst ToastItem = ({\n toast,\n duration,\n fromTop,\n showProgress,\n onRemove,\n}: {\n toast: ToastData;\n duration: number;\n fromTop: boolean;\n showProgress: boolean;\n onRemove: (id: string) => void;\n}) => {\n const [shown, setShown] = useState(false);\n const [leaving, setLeaving] = useState(false);\n const [paused, setPaused] = useState(false);\n\n const total =\n toast.duration !== undefined ? toast.duration : toast.intent === \"loading\" ? Infinity : duration;\n const remaining = useRef(total);\n const startedAt = useRef(0);\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const leaveTimer = useRef<ReturnType<typeof setTimeout>>();\n\n const close = useCallback(() => {\n setLeaving(true);\n clearTimeout(timer.current);\n clearTimeout(leaveTimer.current);\n leaveTimer.current = setTimeout(() => onRemove(toast.id), EXIT_MS);\n }, [onRemove, toast.id]);\n\n const start = useCallback(() => {\n clearTimeout(timer.current);\n if (!Number.isFinite(remaining.current)) return;\n startedAt.current = Date.now();\n timer.current = setTimeout(close, Math.max(0, remaining.current));\n }, [close]);\n\n const pause = () => {\n setPaused(true);\n if (!Number.isFinite(remaining.current)) return;\n clearTimeout(timer.current);\n remaining.current -= Date.now() - startedAt.current;\n };\n const resume = () => {\n setPaused(false);\n start();\n };\n\n useEffect(() => {\n const raf = requestAnimationFrame(() => setShown(true));\n return () => cancelAnimationFrame(raf);\n }, []);\n\n // (Re)start whenever the toast is updated\n useEffect(() => {\n remaining.current = total;\n setPaused(false);\n start();\n return () => clearTimeout(timer.current);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toast.version, total]);\n\n useEffect(() => () => clearTimeout(leaveTimer.current), []);\n\n const { intent } = toast;\n const role = intent === \"error\" || intent === \"warning\" ? \"alert\" : \"status\";\n const icon =\n toast.icon === false\n ? null\n : (toast.icon ?? (intent === \"loading\" ? <Spinner size=\"xs\" /> : icons[intent]));\n const finite = Number.isFinite(total);\n\n return (\n <li\n role={role}\n aria-atomic=\"true\"\n onMouseEnter={pause}\n onMouseLeave={resume}\n onFocus={pause}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) resume();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") close();\n }}\n className={cn(\n \"pointer-events-auto relative w-[360px] max-w-[calc(100vw-2rem)] overflow-hidden rounded-xl border border-gray-200 bg-white shadow-lg\",\n \"transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none\",\n shown && !leaving ? \"translate-y-0 opacity-100\" : cn(\"opacity-0\", fromTop ? \"-translate-y-2\" : \"translate-y-2\"),\n )}\n >\n <div className=\"flex items-start gap-3 p-3.5\">\n {icon && (\n <span aria-hidden=\"true\" className={cn(\"mt-0.5 inline-flex shrink-0\", iconColor[intent])}>\n {icon}\n </span>\n )}\n <div className=\"min-w-0 flex-1 text-sm\">\n {toast.title && <p className=\"font-semibold text-gray-900\">{toast.title}</p>}\n {toast.description && (\n <div className={cn(\"text-gray-600\", toast.title && \"mt-0.5\")}>{toast.description}</div>\n )}\n {toast.action && (\n <button\n type=\"button\"\n onClick={() => {\n toast.action!.onClick();\n close();\n }}\n className=\"mt-2 rounded-md text-sm font-semibold text-primary-700 hover:text-primary-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500\"\n >\n {toast.action.label}\n </button>\n )}\n </div>\n {toast.dismissible !== false && (\n <button\n type=\"button\"\n aria-label=\"Dismiss notification\"\n onClick={close}\n className=\"-mr-1 -mt-1 inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-gray-500 transition-colors duration-150 hover:bg-gray-100 hover:text-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 motion-reduce:transition-none\"\n >\n <RiCloseLine size={18} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n {showProgress && finite && (\n <span\n key={toast.version}\n aria-hidden=\"true\"\n className={cn(\"absolute inset-x-0 bottom-0 h-1 origin-left\", barColor[intent])}\n style={{\n animation: `genesis-toast-progress ${total}ms linear forwards`,\n animationPlayState: paused ? \"paused\" : \"running\",\n }}\n />\n )}\n </li>\n );\n};\n\n/* -------------------------------------------------------------------------- */\n/* Provider */\n/* -------------------------------------------------------------------------- */\n\nlet counter = 0;\n\nexport const ToastProvider = ({\n children,\n position = \"top-right\",\n duration = 5000,\n maxVisible = 3,\n showProgress = false,\n label = \"Notifications\",\n}: ToastProviderProps) => {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n const [mounted, setMounted] = useState(false);\n const callbacks = useRef(new Map<string, (() => void) | undefined>());\n\n useEffect(() => setMounted(true), []);\n\n const remove = useCallback((id: string) => {\n setToasts((list) => list.filter((t) => t.id !== id));\n const cb = callbacks.current.get(id);\n callbacks.current.delete(id);\n cb?.();\n }, []);\n\n const add = useCallback((options: ToastOptions): string => {\n const id = options.id ?? `toast-${++counter}`;\n callbacks.current.set(id, options.onDismiss);\n setToasts((list) => {\n const existing = list.find((t) => t.id === id);\n if (existing) {\n return list.map((t) =>\n t.id === id\n ? { ...t, ...options, id, intent: options.intent ?? t.intent, version: t.version + 1 }\n : t,\n );\n }\n return [...list, { ...options, id, intent: options.intent ?? \"default\", version: 0 }];\n });\n return id;\n }, []);\n\n const api = useMemo<ToastApi>(() => {\n const normalize = (o: ToastOptions | Message): ToastOptions =>\n typeof o === \"object\" && o !== null && !React.isValidElement(o)\n ? (o as ToastOptions)\n : { description: o as Message };\n const withIntent =\n (intent: ToastIntent) =>\n (message: Message, options: ToastOptions = {}) =>\n add({ ...options, intent, title: options.title ?? message, description: options.title ? message : options.description });\n return {\n toast: (o) => add(normalize(o)),\n success: withIntent(\"success\"),\n error: withIntent(\"error\"),\n warning: withIntent(\"warning\"),\n info: withIntent(\"primary\"),\n loading: withIntent(\"loading\"),\n update: (id, options) => add({ ...options, id }),\n dismiss: (id) => {\n if (id) remove(id);\n else\n setToasts((list) => {\n list.forEach((t) => callbacks.current.get(t.id)?.());\n callbacks.current.clear();\n return [];\n });\n },\n promise: (promise, messages, options = {}) => {\n const id = add({ ...options, intent: \"loading\", title: messages.loading });\n promise.then(\n (data) =>\n add({\n ...options,\n id,\n intent: \"success\",\n title: typeof messages.success === \"function\" ? (messages.success as (d: typeof data) => Message)(data) : messages.success,\n duration: options.duration,\n }),\n (err) =>\n add({\n ...options,\n id,\n intent: \"error\",\n title: typeof messages.error === \"function\" ? (messages.error as (e: unknown) => Message)(err) : messages.error,\n duration: options.duration,\n }),\n );\n return promise;\n },\n };\n }, [add, remove]);\n\n const fromTop = position.startsWith(\"top\");\n // The first `maxVisible` toasts show; later ones wait their turn.\n const visible = toasts.slice(0, Math.max(1, maxVisible));\n const ordered = fromTop ? [...visible].reverse() : visible;\n const queued = toasts.length - visible.length;\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n {mounted &&\n createPortal(\n <>\n <style>{`@keyframes genesis-toast-progress{from{transform:scaleX(1)}to{transform:scaleX(0)}}@media (prefers-reduced-motion:reduce){[data-genesis-toasts] span[style*=\"genesis-toast-progress\"]{animation:none!important}}`}</style>\n <section\n aria-label={label}\n data-genesis-toasts=\"\"\n className={cn(\"pointer-events-none fixed z-[100] flex flex-col gap-2\", positionClass[position])}\n >\n <ol className={cn(\"flex flex-col gap-2\", position.endsWith(\"right\") ? \"items-end\" : position.endsWith(\"left\") ? \"items-start\" : \"items-center\")}>\n {ordered.map((t) => (\n <ToastItem key={t.id} toast={t} duration={duration} fromTop={fromTop} showProgress={showProgress} onRemove={remove} />\n ))}\n </ol>\n {queued > 0 && (\n <p className=\"pointer-events-auto rounded-full bg-gray-800 px-3 py-1 text-xs font-medium text-white\">\n +{queued} more\n </p>\n )}\n </section>\n </>,\n document.body,\n )}\n </ToastContext.Provider>\n );\n};\n\nexport default ToastProvider;\n","\"use client\";\nimport React from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface TabItem {\n label: string;\n value: string;\n}\n\ninterface TabsContainerProps {\n value: string;\n children: React.ReactNode;\n className?: string;\n position?: \"horizontal\" | \"vertical\";\n}\n\ninterface TabListProps extends Partial<TabItem> {\n onChange: (value: string) => void;\n ariaLabel?: string;\n children: React.ReactNode;\n box?: boolean;\n pill?: boolean;\n className?: string;\n position?: \"horizontal\" | \"vertical\";\n persist?: \"url\" | \"localStorage\";\n persistKey?: string;\n}\n\ninterface TabProps extends TabItem {\n onChange: (value: string) => void;\n box?: boolean;\n pill?: boolean;\n content?: React.ReactNode;\n selectedTabValue: string;\n icon?: JSX.Element;\n className?: string;\n tabIndex?: number;\n onKeyDown?: (e: React.KeyboardEvent<HTMLButtonElement>) => void;\n position?: \"horizontal\" | \"vertical\";\n ref?: React.Ref<HTMLButtonElement>;\n}\n\ninterface TabPanelProps {\n value: string;\n currentValue: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const TabsContainer: React.FC<TabsContainerProps> = ({\n children,\n className,\n position = \"horizontal\",\n}) => {\n return (\n <div className={cn(position === \"vertical\" ? \"flex\" : \"block\", className)}>\n {children}\n </div>\n );\n};\n\nexport const TabList: React.FC<TabListProps> = ({\n onChange,\n ariaLabel,\n children,\n box = false,\n pill = false,\n className,\n position = \"horizontal\",\n persist,\n persistKey,\n}) => {\n const [focusIndex, setFocusIndex] = React.useState(0);\n const tabRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\n\n React.useEffect(() => {\n if (!persist || !persistKey || typeof window === \"undefined\") return;\n\n let storedValue: string | null = null;\n\n if (persist === \"url\") {\n storedValue = new URLSearchParams(window.location.search).get(persistKey);\n } else if (persist === \"localStorage\") {\n storedValue = window.localStorage.getItem(persistKey);\n }\n\n if (storedValue) {\n onChange(storedValue);\n }\n }, [persist, persistKey, onChange]);\n\n const handleChange = React.useCallback(\n (value: string) => {\n if (persist === \"url\" && persistKey && typeof window !== \"undefined\") {\n const url = new URL(window.location.href);\n url.searchParams.set(persistKey, value);\n window.history.replaceState({}, \"\", url.toString());\n } else if (\n persist === \"localStorage\" &&\n persistKey &&\n typeof window !== \"undefined\"\n ) {\n window.localStorage.setItem(persistKey, value);\n }\n onChange(value);\n },\n [persist, persistKey, onChange],\n );\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n const tabCount = React.Children.count(children);\n\n switch (e.key) {\n case \"ArrowRight\":\n if (position === \"horizontal\") {\n e.preventDefault();\n const nextIndex = (index + 1) % tabCount;\n setFocusIndex(nextIndex);\n tabRefs.current[nextIndex]?.focus();\n }\n break;\n case \"ArrowLeft\":\n if (position === \"horizontal\") {\n e.preventDefault();\n const prevIndex = (index - 1 + tabCount) % tabCount;\n setFocusIndex(prevIndex);\n tabRefs.current[prevIndex]?.focus();\n }\n break;\n case \"ArrowDown\":\n if (position === \"vertical\") {\n e.preventDefault();\n const nextIndex = (index + 1) % tabCount;\n setFocusIndex(nextIndex);\n tabRefs.current[nextIndex]?.focus();\n }\n break;\n case \"ArrowUp\":\n if (position === \"vertical\") {\n e.preventDefault();\n const prevIndex = (index - 1 + tabCount) % tabCount;\n setFocusIndex(prevIndex);\n tabRefs.current[prevIndex]?.focus();\n }\n break;\n case \"Home\":\n e.preventDefault();\n setFocusIndex(0);\n tabRefs.current[0]?.focus();\n break;\n case \"End\":\n e.preventDefault();\n const lastIndex = tabCount - 1;\n setFocusIndex(lastIndex);\n tabRefs.current[lastIndex]?.focus();\n break;\n }\n };\n\n return (\n <div\n className={cn(\n position === \"horizontal\"\n ? // scrolls sideways on narrow screens instead of squashing the tabs\n \"flex items-center max-w-full overflow-x-auto\"\n : \"flex flex-col items-stretch\",\n box\n ? \"bg-gray-50 rounded-xl border border-gray-200\"\n : pill\n ? position === \"horizontal\"\n ? \"bg-transparent rounded-lg\"\n : \"bg-gray-100 rounded-2xl p-1\"\n : position === \"horizontal\"\n ? \"border-b border-gray-200\"\n : \"border-r border-gray-200\",\n className,\n )}\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={position}\n >\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const childProps = {\n onChange: handleChange,\n box,\n pill, // Add this line to pass pill prop to Tab\n position,\n onKeyDown: (e: React.KeyboardEvent) => handleKeyDown(e, index),\n tabIndex: index === focusIndex ? 0 : -1,\n };\n\n return React.cloneElement(child, {\n ...childProps,\n ref: (el: HTMLButtonElement | null) => {\n tabRefs.current[index] = el;\n const originalRef = (child as any).ref;\n if (originalRef) {\n if (typeof originalRef === \"function\") {\n originalRef(el);\n } else {\n originalRef.current = el;\n }\n }\n },\n } as any);\n }\n return null;\n })}\n </div>\n );\n};\n\nexport const Tab = React.forwardRef<HTMLButtonElement, TabProps>(\n (\n {\n label,\n value,\n onChange,\n icon,\n content,\n box = false,\n pill = false,\n selectedTabValue,\n className,\n onKeyDown,\n tabIndex,\n position = \"horizontal\",\n },\n ref,\n ) => {\n const isSelected = value === selectedTabValue;\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n aria-selected={isSelected}\n aria-controls={`panel-${value}`}\n id={`tab-${value}`}\n tabIndex={tabIndex}\n onKeyDown={onKeyDown}\n className={cn(\n // base\n \"flex shrink-0 items-center gap-2 px-4 py-3 text-text-sm font-medium whitespace-nowrap cursor-pointer select-none outline-none\",\n \"transition-[color,background-color,border-color,box-shadow] duration-200 ease-out motion-reduce:transition-none\",\n // keyboard focus (inset so it is never clipped by the scroll area)\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n // Default variant (no box, no pill). The transparent border is always\n // present, so selecting a tab no longer makes the row jump by 2px.\n !box &&\n !pill && [\n position === \"horizontal\"\n ? \"border-b-2 rounded-t-lg\"\n : \"border-r-2 rounded-l-lg\",\n \"hover:bg-gray-50\",\n isSelected\n ? \"text-primary-600 border-primary-600\"\n : \"border-transparent text-gray-600 hover:text-gray-900\",\n ],\n // Box variant\n box && [\n position === \"horizontal\"\n ? \"m-1 rounded-lg\"\n : \"mx-1 my-0.5 rounded-lg\",\n isSelected\n ? \"bg-white text-primary-700 shadow-sm ring-1 ring-gray-200\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\",\n ],\n // Pill variant - Horizontal (joined segments)\n pill &&\n position === \"horizontal\" && [\n \"py-1.5 px-3.5 text-sm border -ml-px first:ml-0 first:rounded-l-full last:rounded-r-full\",\n isSelected\n ? \"relative z-10 bg-primary-600 border-primary-600 text-white shadow-sm hover:bg-primary-700\"\n : \"bg-white border-gray-300 text-gray-700 hover:bg-gray-50 hover:text-gray-900\",\n ],\n // Pill variant - Vertical\n pill &&\n position === \"vertical\" && [\n \"py-2 px-4 rounded-full border my-1\",\n isSelected\n ? \"bg-primary-600 border-primary-600 text-white shadow-sm hover:bg-primary-700\"\n : \"bg-transparent border-transparent text-gray-700 hover:bg-gray-200 hover:text-gray-900\",\n ],\n className,\n )}\n onClick={() => onChange(value)}\n >\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0\">\n {icon}\n </span>\n )}\n {label}\n {content && (\n <span aria-hidden=\"true\" className=\"font-normal opacity-70\">\n {content}\n </span>\n )}\n </button>\n );\n },\n);\n\nexport const TabPanel: React.FC<TabPanelProps> = ({\n value,\n currentValue,\n children,\n className,\n}) => {\n return value === currentValue ? (\n <div\n role=\"tabpanel\"\n id={`panel-${value}`}\n aria-labelledby={`tab-${value}`}\n tabIndex={0}\n className={cn(\n // keyboard-only ring, since the panel is focusable\n \"rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\",\n className,\n )}\n >\n {children}\n </div>\n ) : null;\n};\n\nexport default TabsContainer;\n\nTab.displayName = \"Tab\";\n","import React, {\n forwardRef,\n type ReactNode,\n type TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface TextareaProps extends Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n \"size\"\n> {\n size?: \"sm\" | \"lg\";\n disabled?: boolean;\n rows?: number;\n cols?: number;\n error?: boolean;\n children?: ReactNode;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n { size, className, rows, cols, disabled, error, children, id, ...props },\n ref,\n ) => {\n return (\n <textarea\n aria-invalid={error || undefined}\n {...props}\n ref={ref}\n disabled={disabled}\n rows={rows}\n cols={cols}\n className={cn(\n // existing hooks, kept for compatibility\n \"group flex items-center gap-2\",\n // surface (matches Input)\n \"w-full max-w-full rounded-xl border border-gray-200 bg-white text-sm text-gray-900\",\n \"shadow-[0px_1px_2px_0px_#1018280D]\",\n \"transition-[background-color,border-color,box-shadow] duration-200 ease-out\",\n \"motion-reduce:transition-none\",\n // placeholder\n \"placeholder:text-gray-500 hover:placeholder:text-gray-500\",\n // hover\n \"hover:bg-gray-50 hover:border-gray-300\",\n // focus: border colour change plus a soft outer ring (matches Input)\n \"outline-none focus-within:border-primary-600 focus-within:bg-gray-25 focus-within:ring-4 focus-within:ring-primary-100\",\n \"focus-within:hover:bg-gray-50 focus-within:hover:border-primary-600\",\n // disabled\n \"disabled:bg-gray-300 disabled:select-none disabled:pointer-events-none disabled:opacity-30 disabled:shadow-none\",\n size === \"sm\" ? \"py-2.5 px-3.5\" : \"p-2.5\",\n error &&\n \"border-error-500 hover:border-error-600 focus-within:border-error-500 focus-within:ring-error-100 focus-within:hover:border-error-500\",\n className,\n size,\n )}\n >\n {children}\n </textarea>\n );\n },\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport default Textarea;\n","import { RiCloseCircleLine } from \"@remixicon/react\";\nimport React, { InputHTMLAttributes } from \"react\";\nimport Input from \"./Input\";\nimport Chip from \"./Chip\";\n\ninterface TextInputWithLabelProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n intent?:\n | \"error\"\n | \"default\"\n | \"success\"\n | \"warning\"\n | \"blue\"\n | \"primary\"\n | \"bluegray\"\n | \"bluelight\"\n | \"violet\"\n | \"indigo\"\n | \"purple\"\n | \"pink\"\n | \"rose\"\n | \"orange\";\n placeholder?: string;\n size?: \"sm\" | \"lg\";\n type?:\n | \"number\"\n | \"search\"\n | \"text\"\n | \"url\"\n | \"email\"\n | \"password\"\n | \"tel\"\n | \"time\";\n tags: string[];\n setTags: (tags: string[]) => void;\n}\n\nconst TextInputWithLabel: React.FC<TextInputWithLabelProps> = ({\n intent = \"primary\",\n placeholder = \"Enter tags\",\n type = \"text\",\n size,\n tags,\n setTags,\n ...props\n}) => {\n const handleAddTags = (inputValue: string) => {\n const values = inputValue\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v && !tags.includes(v));\n if (values.length === 0) return;\n setTags([...tags, ...values]);\n };\n\n const handleRemoveTag = (tag: string) => {\n setTags(tags.filter((t) => t !== tag));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const target = e.target as HTMLInputElement;\n handleAddTags(target.value);\n target.value = \"\";\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasteData = e.clipboardData.getData(\"text\");\n handleAddTags(pasteData);\n };\n\n return (\n <div>\n <Input\n type={type}\n size={size}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n className={\"w-full\"}\n {...props}\n />\n <div className=\"flex flex-wrap items-center gap-2 mt-2 transition-all duration-300\">\n {tags?.map((tag, idx) => (\n <Chip\n size=\"md\"\n intent={intent}\n key={`${tag}-${idx}`}\n endIcon={\n <RiCloseCircleLine\n size={14}\n className=\"cursor-pointer hover:text-red-500\"\n onClick={() => handleRemoveTag(tag)}\n />\n }\n >\n {tag}\n </Chip>\n ))}\n </div>\n </div>\n );\n};\n\nexport default TextInputWithLabel;\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport React, { type InputHTMLAttributes, forwardRef } from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface ToggleProps\n extends\n Omit<InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof toggleVariants> {\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n children?: never;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Per-intent styles. Class names are written out in full so Tailwind can */\n/* detect them. `primary` and `success` keep their existing checked colours; */\n/* the other intents are new and match the intents used by Button and Chip. */\n/* The checked hover and focus ring are tinted to match the intent. */\n/* -------------------------------------------------------------------------- */\nconst intentClasses = {\n primary:\n \"peer-checked:bg-primary-600 peer-checked:hover:bg-primary-700 peer-focus-visible:ring-primary-500\",\n success:\n \"peer-checked:bg-success-500 peer-checked:hover:bg-success-600 peer-focus-visible:ring-success-500\",\n error:\n \"peer-checked:bg-error-600 peer-checked:hover:bg-error-700 peer-focus-visible:ring-error-500\",\n warning:\n \"peer-checked:bg-warning-500 peer-checked:hover:bg-warning-600 peer-focus-visible:ring-warning-500\",\n default:\n \"peer-checked:bg-gray-700 peer-checked:hover:bg-gray-800 peer-focus-visible:ring-gray-500\",\n blue: \"peer-checked:bg-blue-600 peer-checked:hover:bg-blue-700 peer-focus-visible:ring-blue-500\",\n bluegray:\n \"peer-checked:bg-bluegray-600 peer-checked:hover:bg-bluegray-700 peer-focus-visible:ring-bluegray-500\",\n bluelight:\n \"peer-checked:bg-bluelight-600 peer-checked:hover:bg-bluelight-700 peer-focus-visible:ring-bluelight-500\",\n indigo:\n \"peer-checked:bg-indigo-600 peer-checked:hover:bg-indigo-700 peer-focus-visible:ring-indigo-500\",\n purple:\n \"peer-checked:bg-purple-600 peer-checked:hover:bg-purple-700 peer-focus-visible:ring-purple-500\",\n violet:\n \"peer-checked:bg-violet-600 peer-checked:hover:bg-violet-700 peer-focus-visible:ring-violet-500\",\n pink: \"peer-checked:bg-pink-600 peer-checked:hover:bg-pink-700 peer-focus-visible:ring-pink-500\",\n rose: \"peer-checked:bg-rose-600 peer-checked:hover:bg-rose-700 peer-focus-visible:ring-rose-500\",\n orange:\n \"peer-checked:bg-orange-600 peer-checked:hover:bg-orange-700 peer-focus-visible:ring-orange-500\",\n};\n\nconst toggleVariants = cva(\"\", {\n variants: {\n // Track and thumb dimensions are unchanged. The thumb travels\n // `translate-x-full` (its own width), which equals the free track\n // space in all three sizes, so don't change one without the other.\n size: {\n sm: \"w-5 h-3 after:w-2 after:h-2\",\n md: \"w-9 h-5 after:w-4 after:h-4\",\n lg: \"w-11 h-6 after:w-5 after:h-5\",\n },\n intent: intentClasses,\n },\n defaultVariants: {\n size: \"md\",\n intent: \"primary\",\n },\n});\n\nconst Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n ({ size, className, intent, disabled, children, id, ...props }, ref) => {\n return (\n <label\n className={cn(\n \"inline-flex items-center cursor-pointer\",\n disabled && \"opacity-30 pointer-events-none\",\n )}\n htmlFor={id}\n >\n <input\n type=\"checkbox\"\n disabled={disabled}\n ref={ref}\n id={id}\n role=\"switch\"\n aria-checked={props?.checked}\n {...props}\n className=\"sr-only peer\"\n />\n <span\n className={cn(\n // track\n \"relative w-11 h-7 rounded-full peer\",\n \"bg-gray-300 hover:bg-gray-400 shadow-inner\",\n \"transition-colors duration-200 ease-out\",\n // focus (keyboard only; colour is set per intent)\n \"peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-offset-2\",\n // thumb\n \"after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:h-5 after:w-5\",\n \"after:bg-white after:rounded-full after:shadow-[0_1px_3px_0_rgb(16_24_40/0.3)]\",\n \"after:transition-transform after:duration-200 after:ease-out\",\n \"peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full\",\n // reduced motion\n \"motion-reduce:transition-none motion-reduce:after:transition-none\",\n toggleVariants({\n intent,\n size,\n }),\n className,\n )}\n aria-hidden=\"true\"\n >\n {children}\n </span>\n </label>\n );\n },\n);\n\nToggle.displayName = \"Toggle\";\n\nexport default Toggle;\n","import { VariantProps, cva } from \"class-variance-authority\";\nimport { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport React from \"react\";\n\n// The tooltip shows while the trigger is hovered (as before) and now also\n// while something inside it has keyboard focus (group-focus-within), so\n// keyboard users can read it too.\nconst tooltipVariants = cva(\n [\n // surface: same radius, hairline border and shadow family as Modal, Dropdown and Accordion\n \"absolute hidden group-hover:block group-focus-within:block z-10 p-3 w-max whitespace-normal\",\n \"bg-white text-gray-700 cursor-default rounded-xl border border-gray-200 shadow-lg\",\n // never wider than the screen on phones\n \"max-w-[min(328px,calc(100vw-2rem))]\",\n // Fade and slide in. The old 2s hover delay plus 1s transition meant a\n // tooltip took 3 seconds to appear; it now waits 300ms and fades in over 150ms.\n \"opacity-0 group-hover:opacity-100 group-focus-within:opacity-100\",\n \"transform transition-[opacity,transform] duration-150 ease-out group-hover:delay-300 motion-reduce:transition-none\",\n ],\n {\n variants: {\n position: {\n top: \"bottom-[calc(100%+8px)] translate-y-[-10px] group-hover:translate-y-0 group-focus-within:translate-y-0\",\n right:\n \"top-1/2 -translate-y-1/2 left-[calc(100%+8px)] translate-x-[-10px] group-hover:translate-x-0 group-focus-within:translate-x-0\",\n bottom:\n \"top-[calc(100%+8px)] translate-y-[10px] group-hover:translate-y-0 group-focus-within:translate-y-0\",\n left: \"top-1/2 -translate-y-1/2 right-[calc(100%+8px)] translate-x-[10px] group-hover:translate-x-0 group-focus-within:translate-x-0\",\n },\n },\n },\n);\n\n// The arrow is a small rotated square that shares the panel's border and\n// background, so the pointer matches the border (the old CSS-triangle arrow\n// was white only and could not carry a border). Only the two edges that form\n// the visible tip have a border.\nconst arrowVariants = cva(\n \"absolute h-2.5 w-2.5 rotate-45 bg-white border-gray-200 pointer-events-none\",\n {\n variants: {\n position: {\n // tooltip above the trigger, arrow on the bottom edge pointing down\n top: \"-bottom-[5px] left-4 -translate-x-1/2 border-b border-r\",\n // tooltip right of the trigger, arrow on the left edge pointing left\n right: \"-left-[5px] top-1/2 -translate-y-1/2 border-b border-l\",\n // tooltip below the trigger, arrow on the top edge pointing up\n bottom: \"-top-[5px] left-4 -translate-x-1/2 border-l border-t\",\n // tooltip left of the trigger, arrow on the right edge pointing right\n left: \"-right-[5px] top-1/2 -translate-y-1/2 border-r border-t\",\n },\n },\n },\n);\n\ninterface TooltipProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, \"content\">,\n VariantProps<typeof tooltipVariants> {\n children: ReactNode;\n position: \"top\" | \"right\" | \"bottom\" | \"left\";\n content: JSX.Element | string;\n}\n\nconst Tooltip: React.FC<TooltipProps> = ({\n position,\n content,\n children,\n className,\n ...props\n}) => {\n return (\n <div {...props} className=\"relative cursor-pointer text-sm group w-fit\">\n <div>{children}</div>\n <div\n role=\"tooltip\"\n className={cn(tooltipVariants({ position }), className)}\n >\n {content}\n <div aria-hidden=\"true\" className={cn(arrowVariants({ position }))} />\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","\"use client\";\nimport React, { useState } from \"react\";\nimport { cn } from \"../utils/utils\";\nimport { RiArrowRightSFill } from \"@remixicon/react\";\n\n// -------------------- Types --------------------\n\ninterface TreeViewProps {\n children: React.ReactNode;\n \"aria-label\": string;\n flat?: boolean;\n className?: string;\n /** Optional array of IDs to expand initially */\n defaultExpandedIds?: string[];\n /** Controlled expansion (useful if parent manages state externally) */\n expandedIds?: string[];\n /** Callback for when expanded nodes change */\n onExpandedChange?: (expanded: string[]) => void;\n /** Allow multiple nodes to be expanded simultaneously */\n allowMultiple?: boolean;\n /** Automatically expand all top-level items by default */\n expandTopLevelByDefault?: boolean;\n}\n\ninterface TreeViewItemProps {\n id: string;\n children: React.ReactNode;\n current?: boolean;\n className?: string;\n onSelect?: (id: string) => void;\n level?: number;\n expanded?: boolean;\n onToggle?: (id: string) => void;\n selected?: boolean;\n flat?: boolean;\n}\n\ninterface TreeViewSubTreeProps {\n children: React.ReactNode;\n state?: \"loading\";\n count?: number;\n className?: string;\n expanded?: boolean;\n flat?: boolean;\n}\n\n// -------------------- Main TreeView --------------------\n\nexport const TreeView: React.FC<TreeViewProps> & {\n Item: React.FC<TreeViewItemProps>;\n SubTree: typeof TreeViewSubTree;\n LeadingVisual: typeof TreeViewLeadingVisual;\n TrailingVisual: typeof TreeViewTrailingVisual;\n} = ({\n children,\n \"aria-label\": ariaLabel,\n flat = false,\n className,\n defaultExpandedIds = [],\n expandedIds,\n onExpandedChange,\n allowMultiple = true,\n expandTopLevelByDefault = false,\n}) => {\n // Extract all top-level IDs if needed for default expansion\n const topLevelIds = React.Children.toArray(children)\n .map((child) =>\n React.isValidElement<TreeViewItemProps>(child) ? child.props.id : null,\n )\n .filter(Boolean) as string[];\n\n const [internalExpanded, setInternalExpanded] = useState<Set<string>>(\n () =>\n new Set(\n defaultExpandedIds.length\n ? defaultExpandedIds\n : expandTopLevelByDefault\n ? topLevelIds\n : [],\n ),\n );\n\n const expandedNodes = expandedIds ? new Set(expandedIds) : internalExpanded;\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n // Handle node toggle\n const toggleNode = (id: string) => {\n const updateSet = (set: Set<string>): Set<string> => {\n const next = new Set(set);\n if (allowMultiple) {\n next.has(id) ? next.delete(id) : next.add(id);\n } else {\n next.clear();\n next.add(id);\n }\n return next;\n };\n\n if (expandedIds && onExpandedChange) {\n // Controlled mode\n const newExpanded = updateSet(expandedNodes);\n onExpandedChange(Array.from(newExpanded));\n } else {\n // Uncontrolled mode\n setInternalExpanded((prev) => updateSet(prev));\n }\n };\n\n const handleSelect = (id: string) => setSelectedId(id);\n\n // Recursively enhance children\n const enhanceChildren = (\n nodes: React.ReactNode,\n level = 0,\n ): React.ReactNode =>\n React.Children.map(nodes, (child) => {\n if (React.isValidElement<TreeViewItemProps>(child)) {\n return React.cloneElement(child, {\n level,\n expanded: expandedNodes.has(child.props.id),\n onToggle: toggleNode,\n onSelect: handleSelect,\n selected: selectedId === child.props.id,\n flat,\n children: enhanceChildren(child.props.children, level + 1),\n });\n }\n return child;\n });\n\n return (\n <ul\n role=\"tree\"\n aria-label={ariaLabel}\n className={cn(\"list-none p-0 m-0 text-sm\", className)}\n >\n {enhanceChildren(children)}\n </ul>\n );\n};\n\n// -------------------- Item --------------------\n\n// One chevron that rotates when a node opens. The old version swapped between\n// a \"down\" and a \"right\" icon, so the transition class on it never animated.\nconst DefaultExpandIcon: React.FC<{ expanded?: boolean }> = ({ expanded }) => (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-flex shrink-0 text-gray-500 transition-transform duration-200 ease-out motion-reduce:transition-none\",\n expanded && \"rotate-90\",\n )}\n >\n <RiArrowRightSFill size={18} />\n </span>\n);\n\nconst TreeViewItem: React.FC<TreeViewItemProps> = ({\n id,\n children,\n current = false,\n className,\n onSelect,\n expanded = false,\n onToggle,\n selected = false,\n level = 0,\n flat = false,\n}) => {\n const leading: React.ReactNode[] = [];\n const trailing: React.ReactNode[] = [];\n const content: React.ReactNode[] = [];\n let subTree: React.ReactElement | null = null;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n if (child.type === TreeViewLeadingVisual) leading.push(child);\n else if (child.type === TreeViewTrailingVisual) trailing.push(child);\n else if (child.type === TreeViewSubTree) subTree = child;\n else content.push(child);\n } else content.push(child);\n });\n\n const hasSubTree = !!subTree;\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (hasSubTree && !flat && onToggle) onToggle(id);\n if (onSelect) onSelect(id);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"Enter\":\n case \" \":\n e.preventDefault();\n handleClick(e as any);\n break;\n case \"ArrowRight\":\n if (hasSubTree && !expanded && !flat && onToggle) {\n e.preventDefault();\n onToggle(id);\n }\n break;\n case \"ArrowLeft\":\n if (hasSubTree && expanded && !flat && onToggle) {\n e.preventDefault();\n onToggle(id);\n }\n break;\n }\n };\n\n const processedSubTree =\n subTree && React.isValidElement(subTree)\n ? React.cloneElement(subTree, { expanded, flat })\n : null;\n\n return (\n <>\n <li\n role=\"treeitem\"\n aria-expanded={hasSubTree && !flat ? expanded : undefined}\n aria-selected={selected}\n aria-current={current ? \"true\" : undefined}\n className={cn(\n \"flex items-center gap-2 px-2 py-1.5 cursor-pointer select-none rounded-lg text-gray-700 outline-none\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"hover:bg-gray-100 active:bg-gray-200\",\n // keyboard-only ring, inset so a scrolling parent never clips it\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500\",\n // the current item is subtly marked, a selected item is highlighted\n current && !selected && \"bg-gray-50 font-medium text-gray-900\",\n // uses the primary tokens like the rest of the library (it was blue-*)\n selected &&\n \"bg-primary-50 text-primary-700 font-medium hover:bg-primary-100\",\n className,\n )}\n style={{ paddingLeft: `${level * 16 + 8}px` }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n >\n <span className=\"flex items-center gap-1\">\n {/* Show arrow only if there is no custom leading visual */}\n {!leading.length && hasSubTree && !flat && (\n <DefaultExpandIcon expanded={expanded} />\n )}\n {leading}\n </span>\n\n <span className=\"min-w-0 flex-1\">{content}</span>\n {trailing}\n </li>\n {processedSubTree}\n </>\n );\n};\n\n// -------------------- SubTree --------------------\n\nconst TreeViewSubTree: React.FC<TreeViewSubTreeProps> = ({\n children,\n state,\n count,\n className,\n expanded = false,\n flat = false,\n}) => {\n if (flat) return null;\n if (state === \"loading\") {\n return (\n <ul role=\"group\" className={cn(\"list-none m-0\", className)}>\n <li role=\"status\" className=\"text-gray-500 italic p-1 pl-6\">\n Loading{count ? ` ${count} items...` : \"...\"}\n </li>\n </ul>\n );\n }\n\n return (\n <ul\n role=\"group\"\n className={cn(\n \"list-none m-0 pl-0 overflow-hidden\",\n \"transition-[max-height,opacity,visibility] duration-300 ease-in-out motion-reduce:transition-none\",\n // invisible keeps the items of a collapsed node out of the tab order\n // (they were only faded out, so Tab still landed on them)\n expanded\n ? \"max-h-96 opacity-100 visible\"\n : \"max-h-0 opacity-0 invisible\",\n className,\n )}\n >\n {children}\n </ul>\n );\n};\n\n// -------------------- Visuals --------------------\n\nconst TreeViewLeadingVisual: React.FC<{\n children: React.ReactNode;\n className?: string;\n}> = ({ children, className }) => (\n <span className={cn(\"flex items-center flex-shrink-0\", className)}>\n {children}\n </span>\n);\n\nconst TreeViewTrailingVisual: React.FC<{\n children: React.ReactNode;\n label?: string;\n className?: string;\n}> = ({ children, label, className }) => (\n <span\n className={cn(\"flex items-center ml-auto flex-shrink-0\", className)}\n // a label on a plain span is ignored by assistive tech, so give the\n // visual an image role when there is a label\n role={label ? \"img\" : undefined}\n aria-label={label}\n >\n {children}\n </span>\n);\n\n// Attach subcomponents\nTreeView.Item = TreeViewItem;\nTreeView.SubTree = TreeViewSubTree;\nTreeView.LeadingVisual = TreeViewLeadingVisual;\nTreeView.TrailingVisual = TreeViewTrailingVisual;\n\nexport default TreeView;\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport React, {\n type ElementType,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../utils/utils\";\n\ninterface TypographyProps\n extends HTMLAttributes<HTMLHeadingElement | HTMLParagraphElement>,\n VariantProps<typeof typographyVariant> {\n as?: ElementType;\n children: ReactNode;\n intent?: \"primary\" | \"success\" | \"error\" | \"warning\" | \"default\";\n}\n\nconst typographyVariant = cva(\"text-dark\", {\n variants: {\n variant: {\n h1: \"text-8xl font-bold\",\n h2: \"text-7xl font-bold\",\n h3: \"text-5xl font-bold\",\n h4: \"text-[32px] font-bold\",\n h5: \"text-2xl font-bold\",\n h6: \"text-xl font-semibold\",\n\n b1: \"text-xl font-normal\",\n b2: \"text-lg font-normal\",\n b3: \"text-base font-normal\",\n b4: \"text-sm font-normal\",\n b5: \"text-xs font-normal\",\n },\n intent: {\n primary: \"text-primary-600\",\n success: \"text-success-600\",\n error: \"text-error-600\",\n warning: \"text-warning-600\",\n default: \"text-black\",\n },\n },\n defaultVariants: {\n variant: \"h1\",\n intent: \"default\",\n },\n});\n\nconst Typography = ({\n as,\n variant = \"h1\",\n intent = \"default\",\n children,\n className,\n ...props\n}: TypographyProps) => {\n const Component =\n as || (variant?.startsWith(\"b\") ? \"p\" : (variant as ElementType));\n return (\n <Component\n className={cn(typographyVariant({ variant, intent, className }))}\n {...props}\n >\n {children}\n </Component>\n );\n};\n\nexport default Typography;\n","\"use client\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n THEME_MODE_ATTRIBUTE,\n generateScale,\n isThemeMode,\n isThemeScale,\n normalizeHex,\n themeModeStorageKey,\n themeToCss,\n type ThemeMode,\n type ThemeScale,\n} from \"../utils/theme\";\n\n// useLayoutEffect warns during SSR, so fall back to useEffect on the server.\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\ninterface ThemeState {\n color: string;\n scale: ThemeScale;\n}\n\ninterface ThemeContextValue {\n /** The brand colour currently applied, or null while the stylesheet defaults are in use. */\n color: string | null;\n /** The full 25 to 900 scale currently applied, or null while the defaults are in use. */\n scale: ThemeScale | null;\n /**\n * Applies `hex` as the new primary colour everywhere. Pass `options.scale`\n * to use an exact, pre-designed scale instead of deriving one from `hex`.\n * Invalid hex values are ignored.\n */\n setThemeColor: (hex: string, options?: { scale?: ThemeScale }) => void;\n /** Goes back to `defaultColor` (or the stylesheet defaults) and clears the saved choice. */\n resetTheme: () => void;\n /** The user's choice: \"light\", \"dark\" or \"system\" (the \"Default\" option). */\n mode: ThemeMode;\n /** What is actually shown. Differs from `mode` only when `mode` is \"system\". */\n resolvedMode: \"light\" | \"dark\";\n /** Changes the mode and remembers it. */\n setMode: (mode: ThemeMode) => void;\n}\n\ninterface ThemeProviderProps {\n children: ReactNode;\n /**\n * Optional starting brand colour (hex). It is rendered on the server, so\n * there is no flash. Leave it out to keep the colours from globals.css.\n */\n defaultColor?: string;\n /**\n * localStorage key used to remember the user's choice. Pass `null` to turn\n * persistence off. Defaults to \"picaso-ui-theme\".\n */\n storageKey?: string | null;\n /** CSP nonce for the injected <style> element. */\n nonce?: string;\n /**\n * Starting mode before the user chooses one. Defaults to \"system\", which\n * follows the device setting.\n */\n defaultMode?: ThemeMode;\n}\n\n// The context is created lazily instead of at module level. This file is\n// bundled into the single dist/index.js entry; a top-level createContext()\n// ran as soon as *anything* was imported from the package, which crashed\n// server components (e.g. loading.tsx using only <Skeleton /> or <Divider />)\n// because React's server build has no createContext. ThemeProvider and\n// useTheme only ever run on the client, so creating it on first use is safe.\nlet themeContext: React.Context<ThemeContextValue | null> | null = null;\nconst getThemeContext = (): React.Context<ThemeContextValue | null> => {\n if (!themeContext) {\n themeContext = createContext<ThemeContextValue | null>(null);\n }\n return themeContext;\n};\n\nconst buildState = (\n hex: string | undefined,\n scale?: ThemeScale,\n): ThemeState | null => {\n const color = normalizeHex(hex);\n if (!color) return null;\n return { color, scale: scale ?? generateScale(color) };\n};\n\n// Storage can throw (private mode, blocked cookies, quota), so every access is guarded.\nconst readStored = (key: string): ThemeState | null => {\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { color?: unknown; scale?: unknown };\n const color =\n typeof parsed.color === \"string\" ? normalizeHex(parsed.color) : null;\n if (!color) return null;\n return {\n color,\n scale: isThemeScale(parsed.scale) ? parsed.scale : generateScale(color),\n };\n } catch {\n return null;\n }\n};\n\nconst writeStored = (key: string, state: ThemeState | null) => {\n try {\n if (state) window.localStorage.setItem(key, JSON.stringify(state));\n else window.localStorage.removeItem(key);\n } catch {\n /* ignore: the theme still applies for this session */\n }\n};\n\n/**\n * Re-colours every component that uses the `primary` scale.\n *\n * Renders no wrapper element, so it does not change the DOM your app already\n * has. Place it around the existing `theme-primary` container:\n *\n * ```tsx\n * <ThemeProvider>\n * <div className=\"theme-primary\">{children}</div>\n * </ThemeProvider>\n * ```\n */\nconst ThemeProvider = ({\n children,\n defaultColor,\n storageKey = \"picaso-ui-theme\",\n nonce,\n defaultMode = \"system\",\n}: ThemeProviderProps) => {\n // Server and first client render both use `defaultColor`, so hydration matches.\n const [initial] = useState(() => buildState(defaultColor));\n const [state, setState] = useState<ThemeState | null>(initial);\n\n // A saved choice can only be read in the browser, so it is restored after mount.\n useEffect(() => {\n if (!storageKey) return;\n const stored = readStored(storageKey);\n if (stored) setState(stored);\n }, [storageKey]);\n\n const setThemeColor = useCallback(\n (hex: string, options?: { scale?: ThemeScale }) => {\n const next = buildState(hex, options?.scale);\n if (!next) return;\n setState(next);\n if (storageKey) writeStored(storageKey, next);\n },\n [storageKey],\n );\n\n const resetTheme = useCallback(() => {\n setState(initial);\n if (storageKey) writeStored(storageKey, null);\n }, [initial, storageKey]);\n\n /* ------------------------------ light / dark ----------------------------- */\n\n const [mode, setModeState] = useState<ThemeMode>(defaultMode);\n const [resolvedMode, setResolvedMode] = useState<\"light\" | \"dark\">(\n defaultMode === \"dark\" ? \"dark\" : \"light\",\n );\n\n // Restore a saved mode before the first paint so there is no flash.\n useIsomorphicLayoutEffect(() => {\n if (!storageKey) return;\n try {\n const saved = window.localStorage.getItem(\n themeModeStorageKey(storageKey),\n );\n if (isThemeMode(saved)) setModeState(saved);\n } catch {\n /* storage unavailable: keep defaultMode */\n }\n }, [storageKey]);\n\n // Resolve \"system\" to light/dark, mark <html>, and follow OS changes live.\n useIsomorphicLayoutEffect(() => {\n const root = document.documentElement;\n const apply = (dark: boolean) => {\n const next = dark ? \"dark\" : \"light\";\n root.setAttribute(THEME_MODE_ATTRIBUTE, next);\n setResolvedMode(next);\n };\n\n if (mode !== \"system\") {\n apply(mode === \"dark\");\n return;\n }\n const query = window.matchMedia(\"(prefers-color-scheme: dark)\");\n apply(query.matches);\n const onChange = (event: MediaQueryListEvent) => apply(event.matches);\n query.addEventListener(\"change\", onChange);\n return () => query.removeEventListener(\"change\", onChange);\n }, [mode]);\n\n const setMode = useCallback(\n (next: ThemeMode) => {\n if (!isThemeMode(next)) return;\n setModeState(next);\n if (!storageKey) return;\n try {\n window.localStorage.setItem(themeModeStorageKey(storageKey), next);\n } catch {\n /* ignore: the mode still applies for this session */\n }\n },\n [storageKey],\n );\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n color: state?.color ?? null,\n scale: state?.scale ?? null,\n setThemeColor,\n resetTheme,\n mode,\n resolvedMode,\n setMode,\n }),\n [state, setThemeColor, resetTheme, mode, resolvedMode, setMode],\n );\n\n const ThemeContext = getThemeContext();\n\n return (\n <ThemeContext.Provider value={value}>\n {state && (\n <style\n data-picaso-ui-theme=\"\"\n nonce={nonce}\n dangerouslySetInnerHTML={{ __html: themeToCss(state.scale) }}\n />\n )}\n {children}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n\nconst useTheme = (): ThemeContextValue => {\n const context = useContext(getThemeContext());\n if (!context) {\n throw new Error(\"useTheme must be used inside <ThemeProvider>.\");\n }\n return context;\n};\n\nexport type { ThemeContextValue, ThemeProviderProps };\nexport { useTheme };\nexport default ThemeProvider;\n","/**\n * Theme helpers for re-colouring the `primary` scale at runtime.\n *\n * Pure functions only: no `window` / `document` access, so this file is safe to\n * import from server components, client components and during SSR.\n */\n\nexport const THEME_SHADES = [\n 25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900,\n] as const;\n\nexport type ThemeShade = (typeof THEME_SHADES)[number];\nexport type ThemeScale = Record<ThemeShade, string>;\n\n/**\n * The shade components use for their \"main\" brand colour (solid buttons,\n * borders, links, focus borders are all `primary-600`). A colour chosen by the\n * user becomes this shade; the others are derived from it.\n */\nexport const THEME_ANCHOR_SHADE: ThemeShade = 600;\n\n/** \"system\" is the \"Default\" option: it follows the device's light/dark setting. */\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\nexport const THEME_MODES: readonly ThemeMode[] = [\"light\", \"dark\", \"system\"];\n\n/** Attribute set on <html> with the resolved mode (\"light\" or \"dark\"). */\nexport const THEME_MODE_ATTRIBUTE = \"data-picaso-ui-mode\";\n\nexport const isThemeMode = (value: unknown): value is ThemeMode =>\n value === \"light\" || value === \"dark\" || value === \"system\";\n\n/** The mode is stored next to the colour, under `<storageKey>-mode`. */\nexport const themeModeStorageKey = (storageKey: string) => `${storageKey}-mode`;\n\nconst HEX_RE = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n/** Returns a lowercase `#rrggbb` string, or null when the input isn't a hex colour. */\nexport const normalizeHex = (\n input: string | undefined | null,\n): string | null => {\n if (!input) return null;\n const match = input.trim().match(HEX_RE);\n if (!match) return null;\n let hex = match[1].toLowerCase();\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n return `#${hex}`;\n};\n\ntype RGB = [number, number, number];\n\nconst hexToRgb = (hex: string): RGB => {\n const n = parseInt(hex.slice(1), 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n};\n\nconst rgbToHex = ([r, g, b]: RGB): string =>\n `#${[r, g, b]\n .map((v) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\"),\n )\n .join(\"\")}`;\n\nconst mix = (from: RGB, to: RGB, amount: number): RGB => [\n from[0] + (to[0] - from[0]) * amount,\n from[1] + (to[1] - from[1]) * amount,\n from[2] + (to[2] - from[2]) * amount,\n];\n\nconst WHITE: RGB = [255, 255, 255];\nconst BLACK: RGB = [0, 0, 0];\n\n/**\n * How far each shade sits from the anchor (600): lighter shades are mixed with\n * white, darker shades with black. Tuned against the library's default blue\n * scale so that anchoring on `#1570ef` lands close to the shipped values.\n */\nconst TINT_AMOUNT: Partial<Record<ThemeShade, number>> = {\n 25: 0.97,\n 50: 0.94,\n 100: 0.82,\n 200: 0.68,\n 300: 0.5,\n 400: 0.3,\n 500: 0.14,\n};\nconst SHADE_AMOUNT: Partial<Record<ThemeShade, number>> = {\n 700: 0.15,\n 800: 0.3,\n 900: 0.42,\n};\n\n/** Builds a full 25 to 900 scale from a single brand colour (used as shade 600). */\nexport const generateScale = (hex: string): ThemeScale => {\n const base = normalizeHex(hex);\n if (!base)\n throw new Error(`generateScale: \"${hex}\" is not a valid hex colour`);\n const rgb = hexToRgb(base);\n\n const scale = {} as ThemeScale;\n for (const shade of THEME_SHADES) {\n const tint = TINT_AMOUNT[shade];\n const dark = SHADE_AMOUNT[shade];\n if (tint !== undefined) scale[shade] = rgbToHex(mix(rgb, WHITE, tint));\n else if (dark !== undefined) scale[shade] = rgbToHex(mix(rgb, BLACK, dark));\n else scale[shade] = base;\n }\n return scale;\n};\n\n/** True when `value` has a valid hex for every shade. Used to validate stored data. */\nexport const isThemeScale = (value: unknown): value is ThemeScale => {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n return THEME_SHADES.every(\n (shade) =>\n typeof record[shade] === \"string\" &&\n normalizeHex(record[shade] as string) !== null,\n );\n};\n\nconst channel = (v: number) => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n};\n\nconst luminance = (hex: string) => {\n const [r, g, b] = hexToRgb(hex);\n return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b);\n};\n\n/** WCAG contrast ratio between two hex colours (1 to 21). */\nexport const contrastRatio = (a: string, b: string): number => {\n const x = normalizeHex(a);\n const y = normalizeHex(b);\n if (!x || !y) return 1;\n const [hi, lo] = [luminance(x), luminance(y)].sort((m, n) => n - m);\n return (hi + 0.05) / (lo + 0.05);\n};\n\nconst DARK_SURFACE: RGB = hexToRgb(\"#0c111d\");\n\n/** How much of the brand colour each tint keeps once it is blended into the dark surface. */\nconst DARK_TINT_KEEP: Partial<Record<ThemeShade, number>> = {\n 25: 0.08,\n 50: 0.13,\n 100: 0.22,\n 200: 0.36,\n 300: 0.55,\n};\n/** Text shades get lighter in dark mode so `text-primary-700` stays readable. */\nconst DARK_LIGHTEN: Partial<Record<ThemeShade, number>> = {\n 700: 0.22,\n 800: 0.38,\n 900: 0.52,\n};\n\n/**\n * Dark-mode version of a scale. Solid shades (400 to 600) are kept so buttons\n * and focus rings look the same; light tints become deep tints of the same\n * hue; dark text shades become light.\n */\nexport const generateDarkScale = (scale: ThemeScale): ThemeScale => {\n const brand = hexToRgb(scale[600]);\n const out = {} as ThemeScale;\n for (const shade of THEME_SHADES) {\n const keep = DARK_TINT_KEEP[shade];\n const lighten = DARK_LIGHTEN[shade];\n if (keep !== undefined)\n out[shade] = rgbToHex(mix(DARK_SURFACE, brand, keep));\n else if (lighten !== undefined)\n out[shade] = rgbToHex(mix(brand, WHITE, lighten));\n else out[shade] = scale[shade];\n }\n return out;\n};\n\nconst declarations = (name: string, scale: ThemeScale) =>\n THEME_SHADES.map((s) => `--${name}-${s}:${scale[s]};`).join(\"\");\n\n/**\n * CSS that overrides the `--primary-*` variables, for light and dark mode.\n *\n * globals.css declares them on `.theme-primary` (specificity 0,2,0 once the\n * native nesting is resolved), so a plain `:root { ... }` override would lose.\n * `:root:root .theme-primary` (0,3,0) wins without `!important`, and the bare\n * `:root:root` also covers content rendered outside a `.theme-primary` wrapper.\n * The dark rule adds the mode attribute (0,4,0), so it wins in dark mode.\n */\nexport const themeToCss = (scale: ThemeScale): string => {\n const dark = `:root:root[${THEME_MODE_ATTRIBUTE}=\"dark\"]`;\n return (\n `:root:root,:root:root .theme-primary{${declarations(\"primary\", scale)}}` +\n `${dark},${dark} .theme-primary{${declarations(\"primary\", generateDarkScale(scale))}}`\n );\n};\n","\"use client\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { RiRestartLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport {\n THEME_ANCHOR_SHADE,\n contrastRatio,\n normalizeHex,\n type ThemeScale,\n} from \"../utils/theme\";\nimport ColorPicker, {\n COLOR_PALETTE,\n COLOR_SHADES,\n type ColorFamily,\n type ColorPickerProps,\n type ColorPickerToken,\n} from \"./ColorPicker\";\nimport { useTheme } from \"./ThemeProvider\";\n\ninterface ThemeColorPickerProps\n extends Omit<ColorPickerProps, \"value\" | \"defaultValue\" | \"onChange\" | \"name\"> {\n /** Called after the theme has been updated, with the same arguments as ColorPicker. */\n onChange?: (value: string, token?: ColorPickerToken) => void;\n /** Show a \"Reset to default\" button once the theme has been changed. Defaults to true. */\n showReset?: boolean;\n}\n\n/**\n * Reads the exact scale of a palette family. Families that are CSS variables\n * in globals.css (gray, error, warning, success) are read live; the rest come\n * from the palette (they are fixed values in tailwind.config.ts).\n */\nconst readFamilyScale = (family: ColorFamily): ThemeScale => {\n const def = COLOR_PALETTE[family];\n const styles = getComputedStyle(document.documentElement);\n const scale = {} as ThemeScale;\n COLOR_SHADES.forEach((shade, index) => {\n const live = def.themed\n ? normalizeHex(styles.getPropertyValue(`--${family}-${shade}`))\n : null;\n scale[shade] = live ?? def.colors[index];\n });\n return scale;\n};\n\nconst focusRing =\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-primary-100\";\n\n/**\n * A ColorPicker that re-colours the whole library. Everything that uses the\n * `primary` scale (buttons, inputs, focus rings, tabs, toggles, ...) updates\n * as soon as a colour is chosen.\n *\n * - Choosing a swatch at shade 600 from a family (e.g. Purple 600) applies that\n * family's complete, hand-tuned scale.\n * - Choosing any other swatch, or typing / picking a custom hex, makes that\n * colour the main brand colour (`primary-600`) and derives the other shades.\n *\n * Must be rendered inside `<ThemeProvider>`.\n */\nconst ThemeColorPicker = ({\n onChange,\n showReset = true,\n className,\n placeholder = \"Select brand color\",\n ...props\n}: ThemeColorPickerProps) => {\n const { color, scale, setThemeColor, resetTheme } = useTheme();\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Read back what is actually applied, so a stylesheet-level override of the\n // defaults is respected too. Done in an effect to keep SSR and hydration clean.\n const [applied, setApplied] = useState(\"\");\n useEffect(() => {\n if (!wrapperRef.current) return;\n const live = getComputedStyle(wrapperRef.current).getPropertyValue(\n `--primary-${THEME_ANCHOR_SHADE}`,\n );\n setApplied(normalizeHex(live) ?? \"\");\n }, [color, scale]);\n\n const handleChange = (hex: string, token?: ColorPickerToken) => {\n if (token?.family === \"primary\" && token.shade === THEME_ANCHOR_SHADE) {\n // That is the colour already applied; re-deriving it would only blur the scale.\n onChange?.(hex, token);\n return;\n }\n const exactScale =\n token && token.shade === THEME_ANCHOR_SHADE && token.family !== \"primary\"\n ? readFamilyScale(token.family)\n : undefined;\n setThemeColor(hex, exactScale ? { scale: exactScale } : undefined);\n onChange?.(hex, token);\n };\n\n const lowContrast = applied !== \"\" && contrastRatio(\"#ffffff\", applied) < 4.5;\n\n return (\n <div ref={wrapperRef} className=\"w-full\">\n <ColorPicker\n {...props}\n className={className}\n placeholder={placeholder}\n value={applied}\n onChange={handleChange}\n />\n\n {showReset && color !== null && !props.disabled && (\n <button\n type=\"button\"\n onClick={resetTheme}\n className={cn(\n \"mt-2 inline-flex items-center gap-1.5 rounded-md px-1 py-0.5 text-xs font-medium cursor-pointer\",\n \"text-gray-600 hover:text-gray-900\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n focusRing,\n )}\n >\n <RiRestartLine aria-hidden=\"true\" size={14} />\n Reset to default\n </button>\n )}\n\n <p\n role=\"status\"\n className={cn(\"mt-1.5 text-xs text-warning-700\", !lowContrast && \"sr-only\")}\n >\n {lowContrast\n ? \"White text on this color has low contrast. Pick a darker color for readable buttons.\"\n : \"\"}\n </p>\n </div>\n );\n};\n\nThemeColorPicker.displayName = \"ThemeColorPicker\";\n\nexport type { ThemeColorPickerProps };\nexport default ThemeColorPicker;\n","\"use client\";\nimport React, { type HTMLAttributes, type KeyboardEvent } from \"react\";\nimport { RiComputerLine, RiMoonLine, RiSunLine } from \"@remixicon/react\";\nimport { cn } from \"../utils/utils\";\nimport type { ThemeMode } from \"../utils/theme\";\nimport { useTheme } from \"./ThemeProvider\";\n\ninterface ThemeModeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\" | \"children\"> {\n /** Called after the mode has been changed. */\n onChange?: (mode: ThemeMode) => void;\n /** Show the text next to each icon. Set to false for a compact, icon-only switch. Defaults to true. */\n showLabels?: boolean;\n}\n\nconst OPTIONS = [\n { value: \"light\", label: \"Light\", hint: \"Always use the light theme\", Icon: RiSunLine },\n { value: \"dark\", label: \"Dark\", hint: \"Always use the dark theme\", Icon: RiMoonLine },\n { value: \"system\", label: \"Default\", hint: \"Follow your device setting\", Icon: RiComputerLine },\n] as const;\n\n/**\n * Light / Dark / Default switch. \"Default\" follows the device setting and\n * updates live if the device changes. Must be rendered inside `<ThemeProvider>`.\n */\nconst ThemeModeSwitch = ({\n onChange,\n showLabels = true,\n className,\n \"aria-label\": ariaLabel = \"Color mode\",\n ...props\n}: ThemeModeSwitchProps) => {\n const { mode, setMode } = useTheme();\n\n const choose = (next: ThemeMode) => {\n setMode(next);\n onChange?.(next);\n };\n\n // Arrow keys / Home / End move between the options, like a native radio group.\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const keys = [\"ArrowRight\", \"ArrowDown\", \"ArrowLeft\", \"ArrowUp\", \"Home\", \"End\"];\n if (!keys.includes(event.key)) return;\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>('button[role=\"radio\"]'),\n );\n const index = items.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n event.preventDefault();\n let next = index;\n if (event.key === \"Home\") next = 0;\n else if (event.key === \"End\") next = items.length - 1;\n else if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\")\n next = (index + 1) % items.length;\n else next = (index - 1 + items.length) % items.length;\n items[next].focus();\n items[next].click();\n };\n\n return (\n <div\n {...props}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n onKeyDown={(e) => {\n props.onKeyDown?.(e);\n handleKeyDown(e);\n }}\n className={cn(\n \"inline-flex items-center gap-1 rounded-xl border border-gray-200 bg-gray-50 p-1\",\n className,\n )}\n >\n {OPTIONS.map(({ value, label, hint, Icon }) => {\n const checked = mode === value;\n return (\n <button\n key={value}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n aria-label={showLabels ? undefined : label}\n title={hint}\n tabIndex={checked ? 0 : -1}\n onClick={() => choose(value)}\n className={cn(\n \"inline-flex h-8 items-center justify-center gap-1.5 rounded-lg text-sm font-medium cursor-pointer\",\n showLabels ? \"px-3\" : \"w-8\",\n \"transition-[background-color,color,box-shadow] duration-150 motion-reduce:transition-none\",\n \"focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-primary-100\",\n checked\n ? \"bg-white text-primary-700 shadow-sm ring-1 ring-gray-200\"\n : \"text-gray-600 hover:text-gray-900\",\n )}\n >\n <Icon aria-hidden=\"true\" size={16} />\n {showLabels && <span>{label}</span>}\n </button>\n );\n })}\n </div>\n );\n};\n\nThemeModeSwitch.displayName = \"ThemeModeSwitch\";\n\nexport type { ThemeModeSwitchProps };\nexport default ThemeModeSwitch;\n","import React from \"react\";\nimport {\n THEME_MODE_ATTRIBUTE,\n themeModeStorageKey,\n type ThemeMode,\n} from \"../utils/theme\";\n\ninterface ThemeScriptProps {\n /** Must match `ThemeProvider`'s `defaultMode`. Defaults to \"system\". */\n defaultMode?: ThemeMode;\n /** Must match `ThemeProvider`'s `storageKey`. Defaults to \"picaso-ui-theme\". Pass `null` if persistence is off. */\n storageKey?: string | null;\n /** CSP nonce for the inline script. */\n nonce?: string;\n}\n\n/**\n * Optional. Put it in <head> to apply the saved light/dark mode before the\n * page paints, so a dark-mode user never sees a white flash on reload.\n * It is a server component (no hooks, no browser APIs at render time).\n *\n * The script changes an attribute on <html> before React hydrates, so add\n * `suppressHydrationWarning` to your <html> tag.\n */\nconst ThemeScript = ({\n defaultMode = \"system\",\n storageKey = \"picaso-ui-theme\",\n nonce,\n}: ThemeScriptProps) => {\n const read = storageKey\n ? `var s=localStorage.getItem(${JSON.stringify(themeModeStorageKey(storageKey))});` +\n `if(s===\"light\"||s===\"dark\"||s===\"system\")m=s;`\n : \"\";\n const code =\n `(function(){try{var m=${JSON.stringify(defaultMode)};${read}` +\n `var d=m===\"dark\"||(m===\"system\"&&window.matchMedia(\"(prefers-color-scheme: dark)\").matches);` +\n `document.documentElement.setAttribute(\"${THEME_MODE_ATTRIBUTE}\",d?\"dark\":\"light\")}catch(e){}})();`;\n\n return <script nonce={nonce} dangerouslySetInnerHTML={{ __html: code }} />;\n};\n\nexport type { ThemeScriptProps };\nexport default ThemeScript;\n"],"mappings":"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","names":["React","useState","React","useState","Image","React","sizes","React","Image","React","forwardRef","forwardRef","React","React","text","React","React","React","React","React","React","useEffect","useState","useState","useEffect","_","React","cva","React","cva","React","React","React","React","forwardRef","cva","forwardRef","React","React","cva","iconWrapper","React","React","text","React","useCallback","useEffect","useMemo","useRef","useState","RiArrowDownSLine","RiCloseLine","focusRing","text","query","React","useState","useMemo","useRef","useEffect","useCallback","_a","RiCloseLine","RiArrowDownSLine","React","forwardRef","useCallback","useEffect","useId","useMemo","useRef","useState","RiArrowDownSLine","RiCheckLine","React","forwardRef","iconWrapper","forwardRef","React","palette","focusRing","forwardRef","useId","useMemo","useState","useRef","useCallback","useEffect","React","RiArrowDownSLine","RiCheckLine","React","useCallback","useEffect","useId","useMemo","useRef","useState","RiArrowLeftSLine","RiArrowRightSLine","RiCloseLine","startOfDay","addDays","addMonths","focusRing","navButton","useId","useState","useMemo","useCallback","useRef","useEffect","fmt","_","React","RiCloseLine","RiArrowLeftSLine","RiArrowRightSLine","label","React","useState","React","useCallback","useEffect","useId","useMemo","useRef","useState","RiCloseLine","focusRing","textButton","useId","useState","useRef","useCallback","useMemo","useEffect","period","cols","i","React","RiCloseLine","pad","sameDay","useState","clamp","React","React","React","React","useCallback","useEffect","useRef","useState","RiArrowRightSLine","RiCheckLine","useState","useRef","useCallback","React","useEffect","_a","RiCheckLine","RiArrowRightSLine","React","useEffect","useId","useLayoutEffect","useMemo","useRef","useState","createPortal","key","useId","query","useState","useRef","useEffect","useMemo","useLayoutEffect","createPortal","React","React","createContext","useCallback","useContext","useEffect","useId","useLayoutEffect","useRef","useState","createPortal","RiArrowRightSLine","RiCheckLine","createContext","useContext","PANEL_ATTR","ITEM_SELECTOR","MARGIN","useState","useRef","useCallback","useEffect","React","useId","useMenuKeys","_a","panelClass","portalTarget","useLayoutEffect","createPortal","itemBase","tone","RiCheckLine","Sub","RiArrowRightSLine","React","useEffect","useId","useRef","useState","RiCloseLine","useState","useId","useRef","useEffect","React","RiCloseLine","React","RiCheckLine","RiCloseLine","React","RiCheckLine","RiCloseLine","React","useCallback","useEffect","useId","useRef","useState","RiArrowLeftSLine","RiArrowRightSLine","React","useId","useState","useCallback","useEffect","useRef","RiArrowLeftSLine","RiArrowRightSLine","React","useCallback","useEffect","useId","useLayoutEffect","useRef","useState","createPortal","RiArrowLeftSLine","RiArrowRightSLine","RiCloseLine","useId","useState","useRef","useEffect","useCallback","useLayoutEffect","createPortal","React","RiCloseLine","RiArrowLeftSLine","RiArrowRightSLine","React","React","React","useEffect","useId","useMemo","useRef","useState","RiArrowDownSLine","RiArrowLeftSLine","RiArrowRightSLine","RiSearchLine","useRef","useEffect","React","useId","useState","useMemo","pad","RiSearchLine","RiArrowDownSLine","RiArrowLeftSLine","RiArrowRightSLine","React","useEffect","useRef","useState","RiCloseLine","RiSearchLine","useState","useRef","useEffect","React","RiSearchLine","text","RiCloseLine","React","createContext","useCallback","useContext","useEffect","useId","useMemo","useRef","useState","RiErrorWarningLine","createContext","useContext","useId","useState","useRef","useCallback","useMemo","React","RiErrorWarningLine","useEffect","React","forwardRef","useEffect","useRef","useState","RiArrowDownSLine","RiArrowUpSLine","forwardRef","useState","text","useRef","useEffect","parse","React","RiArrowUpSLine","RiArrowDownSLine","React","forwardRef","useId","useState","RiCheckLine","score","forwardRef","useId","useState","text","React","RiCheckLine","React","forwardRef","useEffect","useRef","useState","RiCloseLine","RiSearchLine","forwardRef","useRef","useState","text","useEffect","React","RiSearchLine","RiCloseLine","React","useCallback","useEffect","useId","useLayoutEffect","useRef","useState","useId","useRef","useState","empty","useLayoutEffect","useEffect","useCallback","_a","React","text","React","useEffect","useMemo","useRef","useState","RiCheckLine","key","highlight","text","useMemo","useState","useRef","useEffect","React","RiCheckLine","React","useEffect","useState","sizes","React","useState","useEffect","React","forwardRef","sizes","forwardRef","React","React","createContext","useContext","useId","useState","RiArrowDownSLine","createContext","useContext","useId","useState","React","RiArrowDownSLine","React","createContext","useContext","useId","useRef","useState","createContext","clamp","useContext","React","useRef","useState","px","useId","sizes","React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","forwardRef","ScrollArea","useRef","useState","useImperativeHandle","useCallback","useEffect","show","React","React","useCallback","useEffect","useId","useRef","useState","createPortal","RiCloseLine","useId","useRef","useState","useCallback","useEffect","createPortal","React","RiCloseLine","React","createContext","useCallback","useContext","useEffect","useId","useRef","useState","RiCheckboxCircleLine","RiErrorWarningLine","RiInformationLine","React","useEffect","useRef","RiCloseLine","FOCUSABLE","useRef","useEffect","React","RiCloseLine","tone","React","RiInformationLine","RiErrorWarningLine","RiCheckboxCircleLine","useId","useState","useRef","useEffect","createContext","useCallback","resolve","useContext","React","useEffect","useId","useMemo","useRef","useState","RiCloseLine","useId","useRef","useState","text","query","useMemo","useEffect","React","RiCloseLine","React","useId","React","useId","tone","Root","React","useEffect","useId","useMemo","useRef","useState","useState","useEffect","useId","useRef","key","React","useMemo","px","s","text","React","useCallback","useEffect","useRef","useState","RiCheckLine","RiErrorWarningLine","RiFileCopyLine","text","useState","useRef","useEffect","useCallback","React","RiCheckLine","RiErrorWarningLine","RiFileCopyLine","React","useEffect","useState","createPortal","tone","useState","useEffect","React","createPortal","React","useEffect","useState","createPortal","React","React","React","React","React","useEffect","useRef","useState","useState","useRef","useEffect","React","React","useEffect","useId","useRef","useState","RiArrowRightLine","useId","useState","useRef","useEffect","React","RiArrowRightLine","React","useCallback","useEffect","useRef","useState","useRef","useState","useCallback","useEffect","React","React","useCallback","useEffect","useId","useLayoutEffect","useRef","useState","createPortal","RiCloseLine","MARGIN","GAP","FOCUSABLE","useId","useState","useRef","useEffect","useCallback","useLayoutEffect","pad","createPortal","React","RiCloseLine","React","forwardRef","useCallback","useEffect","useId","useImperativeHandle","useLayoutEffect","useRef","useState","RiArrowGoBackLine","RiDeleteBinLine","forwardRef","SignaturePad","colors","useId","useRef","useState","isEmpty","useCallback","useLayoutEffect","useEffect","useImperativeHandle","resolve","empty","React","RiArrowGoBackLine","RiDeleteBinLine","React","position","React","React","useCallback","useEffect","useRef","RiCloseLine","FOCUSABLE","position","useRef","useCallback","useEffect","React","React","useEffect","useState","useMemo","useCallback","forwardRef","useRef","useImperativeHandle","RiArrowDownSLine","RiCheckLine","RiSearchLine","cva","React","cva","React","React","focusRing","textButton","forwardRef","position","useState","useRef","useImperativeHandle","useEffect","useMemo","useCallback","_a","RiArrowDownSLine","RiSearchLine","RiCheckLine","RiArrowDownSLine","React","useState","useRef","useEffect","useCallback","useState","useRef","useCallback","useEffect","React","children","RiArrowDownSLine","React","useEffect","useState","useMemo","forwardRef","useCallback","useRef","useImperativeHandle","RiSearchLine","defaultRenderItem","React","MenuItem","forwardRef","position","useState","useRef","useImperativeHandle","useMemo","useCallback","useEffect","RiSearchLine","DropdownFooter","React","forwardRef","useRef","React","forwardRef","useState","RiDeleteBinLine","React","forwardRef","useState","React","React","useEffect","useRef","forwardRef","forwardRef","useRef","useEffect","React","React","React","React","useState","RiArrowLeftSLine","RiArrowRightSLine","useState","React","RiArrowLeftSLine","RiArrowRightSLine","React","React","React","useCallback","useEffect","useId","useMemo","useRef","useState","RiArrowDownSLine","RiCheckLine","RiCloseLine","isGroup","focusRing","useId","useState","useMemo","query","useRef","useCallback","useEffect","React","RiCloseLine","RiArrowDownSLine","RiCheckLine","cva","React","RiCloseLine","RiErrorWarningLine","RiQuestionLine","iconWrapper","React","cva","position","React","useRef","useState","useState","useRef","React","React","useRef","useState","RiArrowLeftLine","RiArrowRightLine","RiArrowDownSLine","RiArrowUpSLine","RiArrowRightSLine","RiArrowLeftSLine","RiCheckLine","focusRing","useState","useRef","React","RiArrowDownSLine","RiArrowUpSLine","RiCheckLine","RiArrowLeftLine","RiArrowRightLine","RiArrowLeftSLine","RiArrowRightSLine","React","useCallback","useEffect","useId","useLayoutEffect","useRef","useState","createPortal","MARGIN","FOCUSABLE","useId","useState","useRef","useEffect","useCallback","_a","useLayoutEffect","React","createPortal","React","React","React","forwardRef","cva","intentClasses","forwardRef","React","React","useId","useRef","useState","useId","useState","useRef","React","React","useId","useRef","useState","RiFileLine","RiImageLine","RiVideoLine","RiFileZipLine","RiCheckLine","RiCloseLine","RiFilePdf2Line","RiFilePpt2Line","RiFileWord2Line","RiFileExcel2Line","RiMusic2Line","RiEyeLine","React","Spinner","color","React","React","FileSvgIcon","RiImageLine","RiMusic2Line","RiVideoLine","RiFileExcel2Line","RiFileWord2Line","RiFilePpt2Line","RiFileZipLine","RiFilePdf2Line","RiFileLine","useRef","useId","useState","RiCheckLine","RiCloseLine","item","RiEyeLine","React","useId","useRef","useState","sizes","useId","useState","useRef","_a","React","React","useCallback","useEffect","useId","useMemo","useRef","useState","RiArrowDownSLine","RiCheckLine","RiCloseLine","isGroup","focusRing","useId","useState","useRef","useMemo","useCallback","useEffect","text","React","RiCloseLine","RiArrowDownSLine","RiCheckLine","React","useRef","useState","Link","RiArrowDownSLine","RiArrowRightSLine","useRef","React","useState","Link","React","React","React","forwardRef","forwardRef","React","React","forwardRef","compact","React","useRef","RiCheckLine","position","useRef","React","RiCheckLine","React","React","React","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","createPortal","RiCheckboxCircleLine","RiCloseCircleLine","RiCloseLine","RiErrorWarningLine","RiInformationLine","createContext","useContext","React","RiInformationLine","RiCheckboxCircleLine","RiErrorWarningLine","RiCloseCircleLine","useState","useRef","useCallback","useEffect","RiCloseLine","position","useMemo","createPortal","React","position","React","React","forwardRef","forwardRef","cols","React","RiCloseCircleLine","React","React","RiCloseCircleLine","cva","React","forwardRef","intentClasses","cva","forwardRef","React","cva","React","cva","Tooltip","position","React","useState","React","useState","cva","React","cva","React","React","createContext","useCallback","useContext","useEffect","useLayoutEffect","useMemo","useState","HEX_RE","normalizeHex","useLayoutEffect","useEffect","createContext","normalizeHex","key","useState","useCallback","query","useMemo","React","useContext","React","useEffect","useRef","useState","normalizeHex","focusRing","useRef","useState","useEffect","React","React","React","React","React"]}