@alsha-research/picaso-ui 0.0.1 → 0.0.12

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../app/index.ts","../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":["import './globals.css';\nexport * from \"./components/index\"","\"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 \"genesis-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 = (hex: string | undefined, scale?: ThemeScale): 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 = typeof parsed.color === \"string\" ? normalizeHex(parsed.color) : null;\n if (!color) return null;\n return { color, scale: isThemeScale(parsed.scale) ? parsed.scale : generateScale(color) };\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 = \"genesis-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(themeModeStorageKey(storageKey));\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-genesis-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-genesis-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 = (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\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) => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, \"0\"))\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) 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) => typeof record[shade] === \"string\" && 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) out[shade] = rgbToHex(mix(DARK_SURFACE, brand, keep));\n else if (lighten !== undefined) 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 \"genesis-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 = \"genesis-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":["import_react","clsx","React","import_react","React","Image","import_react","React","import_react","React","import_react","React","import_react","_","React","import_class_variance_authority","import_react","React","import_react","React","import_react","import_class_variance_authority","React","import_react","import_class_variance_authority","iconWrapper","React","import_react","React","import_react","import_react","iconWrapper","React","focusRing","React","import_react","startOfDay","addDays","addMonths","focusRing","navButton","fmt","_","React","label","import_react","import_react","focusRing","textButton","period","i","React","pad","sameDay","React","import_react","React","import_react","React","import_react","import_react","React","import_react","import_class_variance_authority","import_react","React","React","focusRing","textButton","_a","import_react","React","children","import_react","defaultRenderItem","React","MenuItem","DropdownFooter","import_react","React","import_react","import_react","React","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","FOCUSABLE","React","import_class_variance_authority","import_react","import_react","iconWrapper","React","import_react","React","import_react","import_react","focusRing","React","import_react","React","import_react","import_class_variance_authority","intentClasses","React","import_react","import_react","Spinner","color","React","React","FileSvgIcon","item","import_react","focusRing","React","import_react","import_react","React","Link","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_class_variance_authority","import_react","intentClasses","React","import_class_variance_authority","import_react","React","import_react","import_react","React","import_class_variance_authority","import_react","React","import_react","HEX_RE","normalizeHex","normalizeHex","key","React","import_react","normalizeHex","focusRing","React","import_react","React","import_react","React"]}
1
+ {"version":3,"sources":["../app/index.ts","../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":["import './globals.css';\nexport * from \"./components/index\"","\"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":"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","names":["import_react","clsx","React","import_react","React","Image","import_react","React","import_react","React","import_react","React","import_react","_","React","import_class_variance_authority","import_react","React","import_react","React","import_react","import_class_variance_authority","React","import_react","import_class_variance_authority","iconWrapper","React","import_react","React","import_react","import_react","iconWrapper","React","focusRing","React","import_react","startOfDay","addDays","addMonths","focusRing","navButton","fmt","_","React","label","import_react","import_react","focusRing","textButton","period","i","React","pad","sameDay","React","import_react","React","import_react","React","import_react","import_react","React","import_react","import_class_variance_authority","import_react","React","React","focusRing","textButton","_a","import_react","React","children","import_react","defaultRenderItem","React","MenuItem","DropdownFooter","import_react","React","import_react","import_react","React","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","FOCUSABLE","React","import_class_variance_authority","import_react","import_react","iconWrapper","React","import_react","React","import_react","import_react","focusRing","React","import_react","React","import_react","import_class_variance_authority","intentClasses","React","import_react","import_react","Spinner","color","React","React","FileSvgIcon","item","import_react","focusRing","React","import_react","import_react","React","Link","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_class_variance_authority","import_react","intentClasses","React","import_class_variance_authority","import_react","React","import_react","import_react","React","import_class_variance_authority","import_react","React","import_react","HEX_RE","normalizeHex","normalizeHex","key","React","import_react","normalizeHex","focusRing","React","import_react","React","import_react","React"]}