@tree-ia/design-system 2.4.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["cn","cn","sizeClasses","cn","cn","locales","cn","cn","cn","sizeConfig","cn","sizeClasses","cn","DefaultLink","cn","cn","cn","cn","ChartJS","Title","Tooltip","cn","ChartJS","Title","Tooltip","cn","ChartJS","Title","Tooltip","cn","ChartJS","Tooltip","cn","cn","ChartJS","Title","ChartTooltip","cn","cn","cn","cn","cn","cn","cn","cn","cn","ImageIcon","cn","cn","cn","cn","variantConfig","cn","cn","cn","cn","cn","PhoneIcon","cn","ImageIcon"],"sources":["../src/components/Loading/index.tsx","../src/components/Button/index.tsx","../src/components/Input/index.tsx","../src/components/Dropdown/index.tsx","../src/components/Table/index.tsx","../src/components/Modal/index.tsx","../src/components/Card/index.tsx","../src/components/Toast/index.tsx","../src/components/Pagination/index.tsx","../src/components/FormField/index.tsx","../src/components/Tabs/index.tsx","../src/components/DateRangePicker/index.tsx","../src/components/DatePicker/index.tsx","../src/components/Title/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/components/BadgeStatus/index.tsx","../src/components/Sidebar/index.tsx","../src/components/Header/index.tsx","../src/components/ThemeSwitcher/index.tsx","../src/components/KPICard/index.tsx","../src/components/PageLayout/index.tsx","../src/components/ComparisonLineChart/index.tsx","../src/components/HorizontalBarChart/index.tsx","../src/components/VerticalBarChart/index.tsx","../src/components/DoughnutChart/index.tsx","../src/components/ProgressBarList/index.tsx","../src/components/MetricPanel/index.tsx","../src/components/FilterBar/index.tsx","../src/components/Checkbox/index.tsx","../src/components/AuthLayout/index.tsx","../src/components/CodeInput/index.tsx","../src/components/Skeleton/index.tsx","../src/components/DataGrid/index.tsx","../src/components/TreeView/index.tsx","../src/components/Stepper/index.tsx","../src/components/FileUpload/index.tsx","../src/components/Tooltip/index.tsx","../src/components/InfoTooltip/index.tsx","../src/components/Breadcrumb/index.tsx","../src/components/Combobox/index.tsx","../src/components/Alert/index.tsx","../src/components/Callout/index.tsx","../src/components/CodeBlock/index.tsx","../src/components/EmptyState/index.tsx","../src/components/StatusBadge/index.tsx","../src/components/IPhoneMockup/index.tsx","../src/components/WhatsAppMockup/index.tsx","../src/components/TableOfContents/index.tsx","../src/components/SocialIcon/index.tsx","../src/components/ConversationPanel/utils.ts","../src/components/ConversationPanel/ConversationAvatar.tsx","../src/components/ConversationPanel/ConversationComposer.tsx","../src/components/ConversationPanel/ConversationEventSeparator.tsx","../src/components/ConversationPanel/ConversationSupportBadge.tsx","../src/components/ConversationPanel/ConversationPreviewCard.tsx","../src/components/ConversationPanel/ConversationSearch.tsx","../src/components/ConversationPanel/ConversationList.tsx","../src/components/ConversationPanel/ConversationMediaPreview.tsx","../src/components/ConversationPanel/ConversationMessageBubble.tsx","../src/components/ConversationPanel/ConversationThreadHeader.tsx","../src/components/ConversationPanel/ConversationUnreadMarker.tsx","../src/components/ConversationPanel/ConversationThread.tsx","../src/components/ConversationPanel/ConversationLayout.tsx","../src/components/ConversationPanel/ConversationSupportActions.tsx","../src/components/ConversationPanel/index.ts","../src/config/defaults.ts","../src/config/createConfig.ts","../src/hooks/useConfig.ts","../src/hooks/useTheme.ts","../src/providers/ThemeProvider.tsx","../src/hooks/useLoading.ts","../src/providers/LoadingProvider.tsx","../src/hooks/useNotifications.ts","../src/providers/NotificationsProvider.tsx","../src/providers/DashboardProvider.tsx","../src/config/sizes.ts"],"sourcesContent":["import React from \"react\";\n\nexport interface LoadingProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n text?: string;\n textColor?: string;\n color?: string;\n variant?: \"spinner\" | \"border\";\n fullscreen?: boolean;\n}\n\nconst sizeMap = {\n sm: \"dashboard-spinner-sm\",\n md: \"dashboard-spinner-md\",\n lg: \"dashboard-spinner-lg\",\n};\n\nexport function Loading({\n size = \"md\",\n className = \"\",\n text,\n textColor,\n color,\n variant = \"spinner\",\n fullscreen = false,\n}: LoadingProps) {\n const variantClass = variant === \"border\" ? \"dashboard-spinner-border\" : \"dashboard-spinner\";\n\n const spinnerStyle = color ? { borderTopColor: color } : undefined;\n\n const spinner = (\n <div\n className={`flex flex-col items-center justify-center gap-4 ${className}`}\n >\n <div\n className={`${variantClass} ${sizeMap[size]}`}\n style={spinnerStyle}\n />\n {text && (\n <p\n className=\"text-sm font-medium animate-pulse\"\n style={{ color: textColor || color || \"var(--dashboard-primary)\" }}\n >\n {text}\n </p>\n )}\n </div>\n );\n\n if (fullscreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--dashboard-background,#f2f2f2)]/80 backdrop-blur-sm\">\n {spinner}\n </div>\n );\n }\n\n return spinner;\n}\n","import React from \"react\";\nimport { Loading } from \"../Loading\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n isLoading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Button({\n children,\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n icon,\n iconPosition = \"left\",\n className,\n disabled,\n ...props\n}: ButtonProps) {\n const baseStyles =\n \"font-medium rounded-lg transition-all duration-200 ease-out cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--dashboard-primary,#2563EB)] active:scale-[0.97]\";\n\n const variantStyles = {\n primary:\n \"bg-[var(--dashboard-primary,#2563EB)] text-white hover:brightness-110 hover:shadow-md\",\n secondary:\n \"bg-[var(--dashboard-text-secondary,#64748B)]/10 text-[var(--dashboard-text-primary,#0F172A)] border border-[var(--dashboard-text-secondary,#64748B)]/20 hover:bg-[var(--dashboard-text-secondary,#64748B)]/15 hover:border-[var(--dashboard-text-secondary,#64748B)]/30\",\n danger:\n \"bg-[var(--dashboard-status-danger,#DC2626)] text-white hover:brightness-110 hover:shadow-md\",\n ghost:\n \"bg-transparent hover:bg-[var(--dashboard-text-secondary,#64748B)]/8 text-[var(--dashboard-text-primary,#0F172A)]\",\n };\n\n const sizeStyles = {\n sm: \"h-8 px-2 text-xs sm:px-3 sm:text-sm\",\n md: \"h-9 px-3 text-sm sm:px-4 sm:text-base\",\n lg: \"h-10 px-4 text-base sm:px-6 sm:text-lg\",\n };\n\n const iconOnlySizeStyles = {\n sm: \"h-8 w-8\",\n md: \"h-9 w-9\",\n lg: \"h-10 w-10\",\n };\n\n const isIconOnly =\n !!icon &&\n (children === undefined ||\n children === null ||\n (typeof children === \"string\" && children.trim() === \"\"));\n\n return (\n <button\n className={cn(\n baseStyles,\n variantStyles[variant],\n isIconOnly ? iconOnlySizeStyles[size] : sizeStyles[size],\n className,\n )}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading ? (\n <span className=\"flex items-center gap-2\">\n <Loading size=\"sm\" color=\"currentColor\" />\n Carregando...\n </span>\n ) : isIconOnly ? (\n icon\n ) : (\n <>\n {icon && iconPosition === \"left\" && (\n <span className=\"mr-2\">{icon}</span>\n )}\n {children}\n {icon && iconPosition === \"right\" && (\n <span className=\"ml-2\">{icon}</span>\n )}\n </>\n )}\n </button>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n label?: string;\n error?: string;\n children?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst sizeStyles = {\n sm: \"h-8 px-2.5 text-xs\",\n md: \"h-9 px-3 text-sm\",\n lg: \"h-10 px-4 text-base\",\n};\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", label, error, children, id, size = \"md\", ...props }, ref) => {\n const inputId = id || (label ? `input-${label.toLowerCase().replace(/\\s+/g, \"-\")}` : undefined);\n\n return (\n <div className=\"w-full\">\n {label && (\n <label\n htmlFor={inputId}\n className=\"block text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] mb-1\"\n >\n {label}\n </label>\n )}\n <div className=\"relative flex items-center w-full\">\n <input\n type={type}\n id={inputId}\n className={cn(\n \"flex w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm transition-colors duration-200 focus:border-[var(--dashboard-primary,#37a501)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n sizeStyles[size],\n error ? \"border-[var(--dashboard-status-danger,#EF4444)] focus:border-[var(--dashboard-status-danger,#EF4444)]\" : undefined,\n children ? \"pr-10\" : undefined,\n className,\n )}\n ref={ref}\n {...props}\n />\n {children && (\n <div className=\"absolute right-3 flex items-center\">{children}</div>\n )}\n </div>\n {error && (\n <p className=\"text-[var(--dashboard-status-danger,#EF4444)] text-xs mt-1\">{error}</p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown, Check } from \"lucide-react\";\n\nexport interface DropdownOption {\n value: string;\n label: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport interface DropdownProps {\n options: DropdownOption[];\n value?: string;\n onChange: (value: string) => void;\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n containerClassName?: string;\n fullWidth?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n error?: string;\n variant?: \"default\" | \"underline\" | \"simple\" | \"compact\";\n customDropdownHeight?: string;\n icon?: React.ReactNode;\n fitContent?: boolean;\n isActive?: boolean;\n}\n\nexport function Dropdown({\n options,\n value,\n onChange,\n label,\n placeholder = \"Selecione uma opção\",\n disabled = false,\n className = \"\",\n containerClassName = \"\",\n fullWidth = false,\n size = \"md\",\n error,\n variant = \"default\",\n customDropdownHeight,\n icon,\n fitContent = false,\n isActive = false,\n}: DropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isVisible, setIsVisible] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0, width: 0 });\n const dropdownRef = useRef<HTMLDivElement>(null);\n const selectedOption = options.find((option) => option.value === value);\n\n const sizeStyles = {\n sm: {\n container: \"h-8 px-2.5\",\n text: \"text-xs\",\n wrapper: \"space-y-1\",\n label: \"text-sm\",\n iconPadding: \"pl-8\",\n },\n md: {\n container: \"h-9 px-3\",\n text: \"text-sm\",\n wrapper: \"space-y-2\",\n label: \"text-base\",\n iconPadding: \"pl-10\",\n },\n lg: {\n container: \"h-10 px-4\",\n text: \"text-base\",\n wrapper: \"space-y-3\",\n label: \"text-lg\",\n iconPadding: \"pl-12\",\n },\n };\n\n const selectedStyle = sizeStyles[size];\n\n const variantStyles = {\n default:\n \"rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/30 hover:border-[var(--dashboard-text-secondary,#6b7280)]/50 focus:outline-none focus:ring-2 focus:ring-[var(--dashboard-primary,#37a501)] focus:border-transparent\",\n underline: \"border-b border-[var(--dashboard-text-secondary,#6b7280)]/30 rounded-none hover:border-b-[var(--dashboard-text-secondary,#6b7280)]/50\",\n simple:\n \"rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 hover:border-[var(--dashboard-text-secondary,#6b7280)]/30 focus:outline-none\",\n compact:\n \"rounded-full hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20 focus:outline-none\",\n };\n\n const variantBackgrounds = {\n default: \"bg-[var(--dashboard-surface,#ffffff)]\",\n underline: \"bg-transparent\",\n simple: \"bg-[var(--dashboard-surface,#ffffff)]\",\n compact: \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n };\n\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const rect = dropdownRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled) {\n if (isOpen) {\n handleClose();\n } else {\n calculatePosition();\n setIsVisible(true);\n setTimeout(() => setIsOpen(true), 10);\n }\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n setTimeout(() => setIsVisible(false), 150);\n };\n\n const handleSelect = (option: DropdownOption) => {\n onChange(option.value);\n handleClose();\n };\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n const portal = document.querySelector(\".dashboard-dropdown-portal\");\n if (portal && !portal.contains(event.target as Node)) {\n if (isOpen) handleClose();\n }\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n useEffect(() => {\n const handleResize = () => {\n if (isOpen) calculatePosition();\n };\n\n const handleScroll = (event: Event) => {\n if (isOpen) {\n const portal = document.querySelector(\".dashboard-dropdown-portal\");\n if (!portal || !portal.contains(event.target as Node)) {\n handleClose();\n }\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleScroll, true);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n window.removeEventListener(\"scroll\", handleScroll, true);\n };\n }, [isOpen]);\n\n return (\n <div\n className={`${selectedStyle.wrapper} ${containerClassName} ${\n fullWidth ? \"w-full\" : fitContent ? \"w-fit\" : \"\"\n }`}\n >\n {label && (\n <label\n className={`block text-[var(--dashboard-text-primary,#2d2d2d)] ${selectedStyle.label}`}\n >\n {label}\n </label>\n )}\n\n <div ref={dropdownRef} className=\"relative\">\n {icon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-[var(--dashboard-text-secondary,#6b7280)] h-4 w-4 pointer-events-none\">\n {icon}\n </div>\n )}\n <div\n onClick={toggleDropdown}\n className={`flex ${\n fullWidth ? \"w-full\" : fitContent ? \"w-fit\" : \"w-full\"\n } items-center justify-between ${selectedStyle.container} ${\n icon ? selectedStyle.iconPadding : \"\"\n } ${\n error\n ? \"rounded-lg border border-[var(--dashboard-status-danger,#EF4444)]\"\n : disabled\n ? \"border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : isActive\n ? \"rounded-lg border border-[var(--dashboard-primary,#37a501)]\"\n : variantStyles[variant]\n } ${className} cursor-pointer transition-colors duration-200 ${\n disabled\n ? \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : selectedOption?.backgroundColor || variantBackgrounds[variant]\n }`}\n style={\n selectedOption?.backgroundColor\n ? { backgroundColor: selectedOption.backgroundColor }\n : undefined\n }\n >\n <span\n className={`block truncate select-none ${selectedStyle.text} ${\n selectedOption\n ? selectedOption.color\n ? \"\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\"\n } ${disabled ? \"text-[var(--dashboard-text-secondary,#6b7280)] opacity-50\" : \"\"}`}\n style={\n selectedOption?.color\n ? { color: selectedOption.color }\n : undefined\n }\n >\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDown\n className={`h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)] transition-transform duration-200 ${\n isOpen ? \"rotate-180 transform\" : \"\"\n }`}\n />\n </div>\n\n {isVisible &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n className={`dashboard-dropdown-portal overflow-y-auto rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] shadow-lg transition-all duration-200 ease-in-out ${\n isOpen\n ? `opacity-100 ${customDropdownHeight || \"max-h-60\"}`\n : \"max-h-0 opacity-0\"\n }`}\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n width: position.width,\n zIndex: 10001,\n }}\n >\n <ul className=\"py-1\">\n {options.length > 0 ? (\n options.map((option) => {\n const isSelected = option.value === value;\n return (\n <li\n data-modal-ignore\n key={option.value}\n onClick={() => handleSelect(option)}\n className={`cursor-pointer px-3 py-2 text-left select-none hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 transition-colors flex items-center justify-between ${\n isSelected\n ? \"text-[var(--dashboard-primary,#37a501)] font-medium\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n } ${selectedStyle.text}`}\n >\n <span>{option.label}</span>\n {isSelected && (\n <Check className=\"h-4 w-4 text-[var(--dashboard-primary,#37a501)]\" />\n )}\n </li>\n );\n })\n ) : (\n <li\n className={`px-3 py-2 text-[var(--dashboard-text-secondary,#6b7280)] italic ${selectedStyle.text}`}\n >\n Não há opções disponíveis\n </li>\n )}\n </ul>\n </div>,\n document.body,\n )}\n </div>\n\n {error && (\n <p className={`mt-1 ${selectedStyle.text} text-[var(--dashboard-status-danger,#EF4444)]`}>{error}</p>\n )}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Loading } from \"../Loading\";\n\nexport interface TableColumn<T> {\n key: string;\n header: string;\n render: (item: T) => ReactNode;\n width?: string;\n align?: \"left\" | \"center\" | \"right\";\n sortable?: boolean;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n onRowClick?: (item: T) => void;\n isLoading?: boolean;\n emptyMessage?: string;\n emptyIcon?: ReactNode;\n loadingComponent?: ReactNode;\n emptyComponent?: ReactNode;\n keyExtractor: (item: T) => string;\n className?: string;\n}\n\nexport function Table<T>({\n columns,\n data,\n onRowClick,\n isLoading = false,\n emptyMessage = \"Nenhum registro encontrado\",\n emptyIcon,\n loadingComponent,\n emptyComponent,\n keyExtractor,\n className = \"\",\n}: TableProps<T>) {\n if (isLoading) {\n return loadingComponent ? <>{loadingComponent}</> : <TableSkeleton />;\n }\n\n if (data.length === 0) {\n return emptyComponent ? (\n <>{emptyComponent}</>\n ) : (\n <TableEmpty message={emptyMessage} icon={emptyIcon} />\n );\n }\n\n return (\n <div\n className={`overflow-x-auto bg-[var(--dashboard-surface,#ffffff)] rounded-xl border border-[var(--dashboard-text-secondary,#64748B)]/12 dashboard-shadow-sm ${className}`}\n >\n <table className=\"min-w-full divide-y divide-[var(--dashboard-text-secondary,#64748B)]/10\">\n <TableHeader columns={columns} />\n <TableBody\n columns={columns}\n data={data}\n onRowClick={onRowClick}\n keyExtractor={keyExtractor}\n />\n </table>\n </div>\n );\n}\n\nexport function TableHeader<T>({ columns }: { columns: TableColumn<T>[] }) {\n const alignClass = (align?: string) =>\n align === \"center\"\n ? \"text-center\"\n : align === \"right\"\n ? \"text-right\"\n : \"text-left\";\n\n return (\n <thead className=\"bg-[var(--dashboard-background,#F8FAFC)] sticky top-0 z-10\">\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n className={`px-6 py-3 text-[0.6875rem] font-semibold text-[var(--dashboard-text-secondary,#64748B)] uppercase tracking-wider ${alignClass(column.align)} ${\n column.width ? `w-[${column.width}]` : \"\"\n }`}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n );\n}\n\nexport function TableBody<T>({\n columns,\n data,\n onRowClick,\n keyExtractor,\n}: {\n columns: TableColumn<T>[];\n data: T[];\n onRowClick?: (item: T) => void;\n keyExtractor: (item: T) => string;\n}) {\n const alignClass = (align?: string) =>\n align === \"center\"\n ? \"text-center\"\n : align === \"right\"\n ? \"text-right\"\n : \"text-left\";\n\n return (\n <tbody className=\"bg-[var(--dashboard-surface,#ffffff)] divide-y divide-[var(--dashboard-text-secondary,#64748B)]/8\">\n {data.map((item, index) => (\n <tr\n key={keyExtractor(item)}\n onClick={() => onRowClick?.(item)}\n className={`transition-colors duration-150 ${\n index % 2 === 1 ? \"bg-[var(--dashboard-text-secondary,#64748B)]/[0.02]\" : \"\"\n } hover:bg-[var(--dashboard-primary,#2563EB)]/[0.04] ${\n onRowClick ? \"cursor-pointer\" : \"\"\n }`}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={`px-6 py-3.5 whitespace-nowrap text-sm leading-snug ${alignClass(column.align)}`}\n >\n {column.render(item)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n );\n}\n\nexport function TableSkeleton() {\n return (\n <div className=\"bg-[var(--dashboard-surface,#ffffff)] rounded-xl border border-[var(--dashboard-text-secondary,#64748B)]/12 dashboard-shadow-sm p-6\">\n <div className=\"flex items-center justify-center h-64\">\n <Loading size=\"lg\" text=\"Carregando dados...\" />\n </div>\n </div>\n );\n}\n\nexport function TableEmpty({\n message,\n icon,\n}: {\n message: string;\n icon?: ReactNode;\n}) {\n return (\n <div className=\"bg-[var(--dashboard-surface,#ffffff)] rounded-xl border border-[var(--dashboard-text-secondary,#64748B)]/12 dashboard-shadow-sm p-12\">\n <div className=\"text-center\">\n {icon || (\n <svg\n className=\"mx-auto h-12 w-12 text-[var(--dashboard-text-secondary,#64748B)]/40\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )}\n <p className=\"mt-4 text-sm text-[var(--dashboard-text-secondary,#64748B)]\">{message}</p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { X } from \"lucide-react\";\nimport { Button } from \"../Button\";\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave?: () => void;\n title?: string;\n children: React.ReactNode;\n showFooter?: boolean;\n saveButtonText?: string;\n cancelButtonText?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n disableSaveButton?: boolean;\n saveButtonVariant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n closeOnEscape?: boolean;\n closeOnOverlayClick?: boolean;\n}\n\nconst ANIMATION_MS = 200;\n\nconst sizeClasses = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-2xl\",\n \"2xl\": \"max-w-4xl\",\n \"3xl\": \"max-w-screen-xl\",\n};\n\nexport function Modal({\n isOpen,\n onClose,\n onSave,\n title = \"\",\n children,\n showFooter = false,\n saveButtonText = \"Salvar\",\n cancelButtonText = \"Cancelar\",\n size = \"md\",\n disableSaveButton = false,\n saveButtonVariant = \"primary\",\n closeOnEscape = true,\n closeOnOverlayClick = true,\n}: ModalProps) {\n const [shouldRender, setShouldRender] = useState(false);\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Show immediately when isOpen becomes true (no frame delay)\n if (isOpen && !shouldRender) {\n setShouldRender(true);\n }\n\n // Derived — no refs, no implicit state machine\n const isClosing = shouldRender && !isOpen;\n\n // Close animation timer: unmount after animation completes\n useEffect(() => {\n if (!isClosing) return;\n const timer = setTimeout(() => setShouldRender(false), ANIMATION_MS);\n return () => clearTimeout(timer);\n }, [isClosing]);\n\n const handleClose = useCallback(() => {\n onClose();\n }, [onClose]);\n\n // Scroll lock — active while rendered (including during close animation)\n useEffect(() => {\n if (!shouldRender) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [shouldRender]);\n\n // Click outside — only when fully open (not during close)\n useEffect(() => {\n if (!closeOnOverlayClick || !shouldRender || !isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (target.closest(\"[data-modal-ignore]\")) return;\n\n const portalSelectors = [\n \".dashboard-dropdown-portal\",\n \".dc-combobox-portal\",\n ];\n for (const selector of portalSelectors) {\n const portal = document.querySelector(selector);\n if (portal?.contains(target)) return;\n }\n\n if (modalRef.current && !modalRef.current.contains(target)) {\n handleClose();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [shouldRender, isOpen, handleClose, closeOnOverlayClick]);\n\n // Escape key — only when fully open (not during close)\n useEffect(() => {\n if (!closeOnEscape || !shouldRender || !isOpen) return;\n\n const handleEscKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") handleClose();\n };\n\n document.addEventListener(\"keydown\", handleEscKey);\n return () => document.removeEventListener(\"keydown\", handleEscKey);\n }, [shouldRender, isOpen, handleClose, closeOnEscape]);\n\n if (!shouldRender) return null;\n\n return (\n <div\n className={`fixed inset-0 z-[10000] flex items-center justify-center bg-black/50 backdrop-blur-sm p-4 ${\n isClosing ? \"dashboard-animate-fade-out\" : \"dashboard-animate-fade-in\"\n }`}\n aria-modal=\"true\"\n role=\"dialog\"\n aria-labelledby={title ? \"modal-title\" : undefined}\n >\n <div\n ref={modalRef}\n className={`w-full rounded-2xl bg-[var(--dashboard-surface,#ffffff)] border border-[var(--dashboard-text-secondary,#64748B)]/10 dashboard-shadow-xl ${\n sizeClasses[size]\n } flex max-h-[90vh] flex-col transition-all duration-200 ease-out ${\n isClosing ? \"scale-[0.98] opacity-0\" : \"scale-100 opacity-100\"\n }`}\n >\n <div className=\"flex h-fit items-center justify-between border-b border-[var(--dashboard-text-secondary,#64748B)]/10 px-6 py-4\">\n {title && (\n <h2\n id=\"modal-title\"\n className=\"text-lg font-semibold text-[var(--dashboard-text-primary,#0F172A)] tracking-tight\"\n >\n {title}\n </h2>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClose}\n className=\"ml-auto rounded-md\"\n aria-label=\"Fechar modal\"\n icon={<X className=\"h-5 w-5\" />}\n />\n </div>\n\n <div className=\"flex-grow overflow-y-auto p-6\">{children}</div>\n\n {showFooter && (\n <div className=\"flex justify-end gap-3 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 p-4\">\n <Button variant=\"secondary\" onClick={handleClose} size=\"md\">\n {cancelButtonText}\n </Button>\n <Button\n variant={saveButtonVariant}\n onClick={onSave}\n disabled={disableSaveButton}\n size=\"md\"\n >\n {saveButtonText}\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface CardProps {\n children: React.ReactNode;\n className?: string;\n title?: string;\n subtitle?: string;\n icon?: React.ReactNode;\n headerActions?: React.ReactNode;\n showDivider?: boolean;\n}\n\nexport function Card({\n children,\n className = \"\",\n title,\n subtitle,\n icon,\n headerActions,\n showDivider = false,\n}: CardProps) {\n return (\n <div\n className={`bg-[var(--dashboard-surface,#ffffff)] rounded-xl border border-[var(--dashboard-text-secondary,#64748B)]/12 transition-shadow duration-200 ease-out dashboard-shadow-sm hover:dashboard-shadow-md ${className}`}\n >\n <div className=\"p-5\">\n {title && (\n <div className={showDivider ? \"mb-5\" : \"mb-3\"}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2.5\">\n {icon && (\n <div className=\"text-[var(--dashboard-text-secondary,#64748B)]\">{icon}</div>\n )}\n <h3\n className={`${showDivider ? \"font-medium\" : \"text-base font-semibold\"} text-[var(--dashboard-text-primary,#0F172A)] truncate tracking-tight`}\n >\n {title}\n </h3>\n </div>\n {headerActions && (\n <div className=\"flex gap-2\">{headerActions}</div>\n )}\n </div>\n {subtitle && (\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#64748B)] mt-1\">\n {subtitle}\n </p>\n )}\n {showDivider && (\n <div className=\"w-full h-px bg-[var(--dashboard-text-secondary,#64748B)]/10 mt-5\" />\n )}\n </div>\n )}\n {children}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState, useCallback } from \"react\";\nimport { X, CheckCircle, XCircle, AlertTriangle, Info } from \"lucide-react\";\n\nexport interface ToastProps {\n title: string;\n subtitle?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n duration?: number;\n onClose: () => void;\n showProgress?: boolean;\n}\n\nconst typeConfig = {\n success: {\n bg: \"bg-[var(--dashboard-status-success,#10B981)]\",\n icon: CheckCircle,\n },\n error: {\n bg: \"bg-[var(--dashboard-status-danger,#EF4444)]\",\n icon: XCircle,\n },\n warning: {\n bg: \"bg-[var(--dashboard-status-warning,#f59e0b)]\",\n icon: AlertTriangle,\n },\n info: {\n bg: \"bg-[var(--dashboard-status-info,#3b82f6)]\",\n icon: Info,\n },\n};\n\nexport function Toast({\n title,\n subtitle,\n type = \"success\",\n duration = 4000,\n onClose,\n showProgress = true,\n}: ToastProps) {\n const [exiting, setExiting] = useState(false);\n\n const handleClose = useCallback(() => {\n setExiting(true);\n setTimeout(onClose, 200);\n }, [onClose]);\n\n useEffect(() => {\n if (duration <= 0) return;\n\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n\n return () => clearTimeout(timer);\n }, [duration, handleClose]);\n\n const { bg, icon: Icon } = typeConfig[type];\n\n return (\n <div\n className={`${bg} text-white rounded-lg shadow-xl shadow-black/15 overflow-hidden ${\n exiting ? \"dashboard-toast-exit\" : \"dashboard-toast-enter\"\n }`}\n role=\"alert\"\n >\n <div className=\"flex items-start gap-3 p-4\">\n <Icon className=\"w-5 h-5 mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-semibold text-sm\">{title}</p>\n {subtitle && <p className=\"text-xs opacity-90 mt-0.5\">{subtitle}</p>}\n </div>\n <button\n onClick={handleClose}\n className=\"shrink-0 hover:opacity-75 transition-opacity cursor-pointer\"\n aria-label=\"Fechar\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {showProgress && duration > 0 && !exiting && (\n <div className=\"h-0.5 bg-white/20\">\n <div\n className=\"h-full bg-white/60\"\n style={{\n animation: `dashboard-toast-progress ${duration}ms linear forwards`,\n }}\n />\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from \"lucide-react\";\nimport { Button } from \"../Button\";\nimport { Dropdown } from \"../Dropdown\";\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n itemsPerPage: number;\n totalItems: number;\n onItemsPerPageChange?: (itemsPerPage: number) => void;\n itemsPerPageOptions?: number[];\n showPageInfo?: boolean;\n compact?: boolean;\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n itemsPerPage,\n totalItems,\n onItemsPerPageChange,\n itemsPerPageOptions = [10, 20, 30, 50],\n showPageInfo = true,\n compact = false,\n className = \"\",\n}: PaginationProps) {\n const startItem = (currentPage - 1) * itemsPerPage + 1;\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\n\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisible = compact ? 3 : 5;\n const halfVisible = Math.floor(maxVisible / 2);\n\n if (totalPages <= maxVisible + 2) {\n for (let i = 1; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, currentPage - halfVisible);\n let endPage = Math.min(totalPages - 1, currentPage + halfVisible);\n\n if (currentPage <= halfVisible + 1) {\n endPage = maxVisible;\n } else if (currentPage >= totalPages - halfVisible) {\n startPage = totalPages - maxVisible + 1;\n }\n\n if (startPage > 2) pages.push(\"...\");\n for (let i = startPage; i <= endPage; i++) pages.push(i);\n if (endPage < totalPages - 1) pages.push(\"...\");\n if (totalPages > 1) pages.push(totalPages);\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n const canGoPrevious = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n\n const handlePageClick = (page: number | string) => {\n if (typeof page === \"number\" && page !== currentPage) {\n onPageChange(page);\n }\n };\n\n const dropdownOptions = itemsPerPageOptions.map((opt) => ({\n value: String(opt),\n label: String(opt),\n }));\n\n return (\n <div\n className={`flex items-center justify-between gap-4 flex-wrap px-4 py-3 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 ${className}`}\n >\n {onItemsPerPageChange && !compact && (\n <div className=\"hidden md:flex items-center gap-2\">\n <Dropdown\n options={dropdownOptions}\n value={String(itemsPerPage)}\n onChange={(val) => onItemsPerPageChange(Number(val))}\n size=\"sm\"\n variant=\"compact\"\n fitContent\n />\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n Itens por página\n </span>\n </div>\n )}\n\n {showPageInfo && (\n <div className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {totalItems > 0 ? (\n <>\n <span className=\"hidden sm:inline\">\n Mostrando {startItem} - {endItem} de {totalItems} itens\n </span>\n <span className=\"sm:hidden\">\n {startItem}-{endItem} de {totalItems}\n </span>\n </>\n ) : (\n <span>Nenhum item encontrado</span>\n )}\n </div>\n )}\n\n <div className=\"flex items-center gap-1\">\n {!compact && (\n <div className=\"hidden md:block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(1)}\n disabled={!canGoPrevious}\n icon={<ChevronsLeft size={16} />}\n aria-label=\"Primeira página\"\n />\n </div>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(currentPage - 1)}\n disabled={!canGoPrevious}\n icon={<ChevronLeft size={16} />}\n aria-label=\"Página anterior\"\n />\n\n <div className=\"flex items-center gap-1\">\n {pageNumbers.map((page, index) => (\n <React.Fragment key={`${page}-${index}`}>\n {page === \"...\" ? (\n <span className=\"px-2 text-[var(--dashboard-text-secondary,#6b7280)]\">...</span>\n ) : (\n <Button\n variant={page === currentPage ? \"primary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => handlePageClick(page)}\n className={`min-w-[32px] h-8 !px-2 ${\n page === currentPage ? \"font-medium\" : \"\"\n }`}\n aria-label={`Página ${page}`}\n aria-current={page === currentPage ? \"page\" : undefined}\n >\n {page}\n </Button>\n )}\n </React.Fragment>\n ))}\n </div>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(currentPage + 1)}\n disabled={!canGoNext}\n icon={<ChevronRight size={16} />}\n aria-label=\"Próxima página\"\n />\n\n {!compact && (\n <div className=\"hidden md:block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(totalPages)}\n disabled={!canGoNext}\n icon={<ChevronsRight size={16} />}\n aria-label=\"Última página\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { Input } from \"../Input\";\n\nexport interface FormFieldProps {\n label: string;\n name: string;\n type?: \"text\" | \"email\" | \"password\" | \"number\" | \"tel\";\n value: string;\n onChange: (value: string) => void;\n error?: string;\n required?: boolean;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function FormField({\n label,\n name,\n type = \"text\",\n value,\n onChange,\n error,\n required = false,\n placeholder,\n disabled = false,\n className = \"\",\n}: FormFieldProps) {\n return (\n <div className={className}>\n <label\n htmlFor={name}\n className=\"block text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] mb-1\"\n >\n {label} {required && <span className=\"text-[var(--dashboard-status-danger,#EF4444)]\">*</span>}\n </label>\n <Input\n type={type}\n id={name}\n name={name}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n placeholder={placeholder}\n className={error ? \"border-[var(--dashboard-status-danger,#EF4444)] focus:border-[var(--dashboard-status-danger,#EF4444)]\" : \"\"}\n />\n {error && <p className=\"text-[var(--dashboard-status-danger,#EF4444)] text-xs mt-1\">{error}</p>}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\n\nexport interface Tab {\n id: string;\n label: string;\n count?: number;\n icon?: ReactNode;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n activeTab: string;\n onChange: (tabId: string) => void;\n /** Estilo visual das tabs. Default: \"underline\" */\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Tabs({ tabs, activeTab, onChange, variant = \"underline\", className }: TabsProps) {\n if (variant === \"pill\") {\n return (\n <div className={cn(\"flex flex-wrap gap-2\", className)} role=\"tablist\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id;\n\n return (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"flex items-center gap-2 px-4 py-2 rounded-full text-sm font-medium transition-colors cursor-pointer\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n role=\"tab\"\n aria-selected={isActive}\n >\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={cn(\n \"ml-1 text-xs rounded-full px-1.5 py-0.5\",\n isActive\n ? \"bg-white/20 text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className={cn(\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20\", className)}>\n <nav className=\"flex gap-6\" aria-label=\"Tabs\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id;\n\n return (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"relative pb-3 px-1 text-sm font-medium transition-colors border-b-2 flex items-center gap-2 cursor-pointer\",\n isActive\n ? \"text-[var(--dashboard-primary,#37a501)] border-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:text-[var(--dashboard-text-primary,#2d2d2d)] border-transparent\",\n )}\n role=\"tab\"\n aria-selected={isActive}\n >\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={cn(\n \"ml-1 text-xs rounded-full px-1.5 py-0.5\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </nav>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport type DateRange = {\n start: Date | null;\n end: Date | null;\n};\n\nexport interface DateRangePickerProps {\n value: DateRange;\n onChange: (range: DateRange) => void;\n locale?: \"pt\" | \"en\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst locales = {\n pt: {\n months: [\n \"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\",\n \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\",\n ],\n weekDays: [\"D\", \"S\", \"T\", \"Q\", \"Q\", \"S\", \"S\"],\n prevMonth: \"Mês anterior\",\n nextMonth: \"Próximo mês\",\n },\n en: {\n months: [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n ],\n weekDays: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n prevMonth: \"Previous month\",\n nextMonth: \"Next month\",\n },\n};\n\nexport function DateRangePicker({\n value,\n onChange,\n locale = \"pt\",\n className,\n}: DateRangePickerProps) {\n const [currentMonth, setCurrentMonth] = useState(new Date());\n const l = locales[locale];\n\n const getDaysInMonth = (date: Date) => {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const startDayOfWeek = firstDay.getDay();\n\n const days: (number | null)[] = [];\n for (let i = 0; i < startDayOfWeek; i++) {\n days.push(null);\n }\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(i);\n }\n return days;\n };\n\n const handleDayClick = (day: number) => {\n const selectedDate = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n\n if (!value.start || (value.start && value.end)) {\n onChange({ start: selectedDate, end: null });\n } else if (value.start && !value.end) {\n if (selectedDate >= value.start) {\n onChange({ start: value.start, end: selectedDate });\n } else {\n onChange({ start: selectedDate, end: value.start });\n }\n }\n };\n\n const isDateInRange = (day: number) => {\n if (!value.start || !value.end) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date > value.start && date < value.end;\n };\n\n const isStartDate = (day: number) => {\n if (!value.start) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date.getTime() === value.start.getTime();\n };\n\n const isEndDate = (day: number) => {\n if (!value.end) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date.getTime() === value.end.getTime();\n };\n\n const previousMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1),\n );\n };\n\n const nextMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1),\n );\n };\n\n const days = getDaysInMonth(currentMonth);\n\n return (\n <div\n className={cn(\n \"w-64 bg-[var(--dashboard-surface,#ffffff)] rounded-lg p-4 shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={previousMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.prevMonth}\n >\n <ChevronLeft className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n\n <h2 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {l.months[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h2>\n\n <button\n onClick={nextMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.nextMonth}\n >\n <ChevronRight className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-7\">\n {l.weekDays.map((day, index) => (\n <div\n key={index}\n className=\"h-8 w-8 flex items-center justify-center text-xs font-medium text-[var(--dashboard-text-secondary,#6b7280)]\"\n >\n {day}\n </div>\n ))}\n\n {days.map((day, index) => {\n if (day === null) {\n return <div key={`empty-${index}`} className=\"h-8 w-8\" />;\n }\n\n const inRange = isDateInRange(day);\n const isStart = isStartDate(day);\n const isEnd = isEndDate(day);\n const isSelected = isStart || isEnd;\n const hasCompletePeriod = value.start && value.end;\n\n return (\n <div key={day} className=\"relative h-8 w-8\">\n {hasCompletePeriod && (inRange || isStart || isEnd) && (\n <div\n className={cn(\n \"absolute inset-0 bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n isStart && \"rounded-l-full\",\n isEnd && \"rounded-r-full\",\n )}\n />\n )}\n <button\n onClick={() => handleDayClick(day)}\n className={cn(\n \"relative h-8 w-8 flex items-center justify-center text-xs font-medium transition-colors z-10 rounded-full cursor-pointer\",\n isSelected\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white hover:opacity-90\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {day}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport interface DatePickerProps {\n value: Date | null;\n onChange: (date: Date | null) => void;\n locale?: \"pt\" | \"en\";\n minDate?: Date;\n maxDate?: Date;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst locales = {\n pt: {\n months: [\n \"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\",\n \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\",\n ],\n weekDays: [\"D\", \"S\", \"T\", \"Q\", \"Q\", \"S\", \"S\"],\n prevMonth: \"Mês anterior\",\n nextMonth: \"Próximo mês\",\n },\n en: {\n months: [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n ],\n weekDays: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n prevMonth: \"Previous month\",\n nextMonth: \"Next month\",\n },\n};\n\nconst startOfDay = (date: Date) =>\n new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\nexport function DatePicker({\n value,\n onChange,\n locale = \"pt\",\n minDate,\n maxDate,\n className,\n}: DatePickerProps) {\n const [currentMonth, setCurrentMonth] = useState(\n value ?? new Date(),\n );\n const l = locales[locale];\n\n const getDaysInMonth = (date: Date) => {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const startDayOfWeek = firstDay.getDay();\n\n const days: (number | null)[] = [];\n for (let i = 0; i < startDayOfWeek; i++) {\n days.push(null);\n }\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(i);\n }\n return days;\n };\n\n const buildDate = (day: number) =>\n new Date(currentMonth.getFullYear(), currentMonth.getMonth(), day);\n\n const isDisabled = (day: number) => {\n const date = buildDate(day);\n if (minDate && date < startOfDay(minDate)) return true;\n if (maxDate && date > startOfDay(maxDate)) return true;\n return false;\n };\n\n const isSelected = (day: number) => {\n if (!value) return false;\n const date = buildDate(day);\n return date.getTime() === startOfDay(value).getTime();\n };\n\n const handleDayClick = (day: number) => {\n if (isDisabled(day)) return;\n onChange(buildDate(day));\n };\n\n const previousMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1),\n );\n };\n\n const nextMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1),\n );\n };\n\n const days = getDaysInMonth(currentMonth);\n\n return (\n <div\n className={cn(\n \"w-64 bg-[var(--dashboard-surface,#ffffff)] rounded-lg p-4 shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={previousMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.prevMonth}\n >\n <ChevronLeft className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n\n <h2 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {l.months[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h2>\n\n <button\n type=\"button\"\n onClick={nextMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.nextMonth}\n >\n <ChevronRight className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-7\">\n {l.weekDays.map((day, index) => (\n <div\n key={index}\n className=\"h-8 w-8 flex items-center justify-center text-xs font-medium text-[var(--dashboard-text-secondary,#6b7280)]\"\n >\n {day}\n </div>\n ))}\n\n {days.map((day, index) => {\n if (day === null) {\n return <div key={`empty-${index}`} className=\"h-8 w-8\" />;\n }\n\n const selected = isSelected(day);\n const disabled = isDisabled(day);\n\n return (\n <div key={day} className=\"relative h-8 w-8\">\n <button\n type=\"button\"\n onClick={() => handleDayClick(day)}\n disabled={disabled}\n className={cn(\n \"relative h-8 w-8 flex items-center justify-center text-xs font-medium transition-colors z-10 rounded-full\",\n disabled\n ? \"text-[var(--dashboard-text-secondary,#6b7280)]/40 cursor-not-allowed\"\n : \"cursor-pointer\",\n !disabled && selected\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white hover:opacity-90\"\n : !disabled &&\n \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {day}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n weight?: \"normal\" | \"medium\" | \"semibold\" | \"bold\" | \"extrabold\";\n align?: \"left\" | \"center\" | \"right\";\n color?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst defaultSizeByLevel: Record<number, string> = {\n 1: \"text-2xl sm:text-3xl md:text-4xl lg:text-5xl\",\n 2: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl\",\n 3: \"text-lg sm:text-xl md:text-2xl lg:text-3xl\",\n 4: \"text-base sm:text-lg md:text-xl lg:text-2xl\",\n 5: \"text-sm sm:text-base md:text-lg lg:text-xl\",\n 6: \"text-xs sm:text-sm md:text-base lg:text-lg\",\n};\n\nconst customSizes: Record<string, string> = {\n xs: \"text-xs sm:text-sm\",\n sm: \"text-sm sm:text-base\",\n md: \"text-base sm:text-lg\",\n lg: \"text-lg sm:text-xl md:text-2xl\",\n xl: \"text-xl sm:text-2xl md:text-3xl\",\n \"2xl\": \"text-2xl sm:text-3xl md:text-4xl\",\n \"3xl\": \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl\",\n};\n\nconst weightStyles: Record<string, string> = {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n extrabold: \"font-extrabold\",\n};\n\nconst alignStyles: Record<string, string> = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\nexport function Title({\n children,\n level = 1,\n size,\n weight = \"bold\",\n align = \"left\",\n color,\n className,\n ...props\n}: TitleProps) {\n const Tag = `h${level}` as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n const sizeClass = size ? customSizes[size] : defaultSizeByLevel[level];\n const colorClass = color || \"text-[var(--dashboard-text-primary,#2d2d2d)]\";\n\n return (\n <Tag\n className={cn(\n sizeClass,\n weightStyles[weight],\n alignStyles[align],\n colorClass,\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n );\n}\n","import React from \"react\";\n\nexport interface ToggleSwitchProps {\n enabled: boolean;\n onChange: (enabled: boolean) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst sizeConfig = {\n sm: {\n track: \"h-5 w-9\",\n thumb: \"h-3 w-3\",\n translateOn: \"translate-x-5\",\n translateOff: \"translate-x-1\",\n },\n md: {\n track: \"h-6 w-11\",\n thumb: \"h-4 w-4\",\n translateOn: \"translate-x-6\",\n translateOff: \"translate-x-1\",\n },\n lg: {\n track: \"h-7 w-14\",\n thumb: \"h-5 w-5\",\n translateOn: \"translate-x-8\",\n translateOff: \"translate-x-1\",\n },\n};\n\nexport function ToggleSwitch({\n enabled,\n onChange,\n disabled = false,\n size = \"md\",\n label,\n className,\n}: ToggleSwitchProps) {\n const config = sizeConfig[size];\n\n return (\n <div className={cn(\"inline-flex items-center gap-2\", className)}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={label}\n disabled={disabled}\n onClick={() => onChange(!enabled)}\n className={cn(\n \"relative inline-flex items-center rounded-full transition-colors outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--dashboard-primary,#37a501)]\",\n config.track,\n enabled\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/30\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n <span\n className={cn(\n \"inline-block transform rounded-full bg-white shadow-sm transition-transform\",\n config.thumb,\n enabled ? config.translateOn : config.translateOff,\n )}\n />\n </button>\n {label && (\n <span\n className={cn(\n \"text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\",\n disabled && \"opacity-50\",\n )}\n >\n {label}\n </span>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface BadgeStatusProps {\n label: string;\n variant?: \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n color?: string;\n bgColor?: string;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst variantStyles: Record<string, { color: string; bgColor: string }> = {\n success: {\n color: \"text-[var(--dashboard-status-success,#10B981)]\",\n bgColor: \"bg-[var(--dashboard-status-success,#10B981)]/10\",\n },\n warning: {\n color: \"text-[var(--dashboard-status-warning,#f59e0b)]\",\n bgColor: \"bg-[var(--dashboard-status-warning,#f59e0b)]/10\",\n },\n danger: {\n color: \"text-[var(--dashboard-status-danger,#EF4444)]\",\n bgColor: \"bg-[var(--dashboard-status-danger,#EF4444)]/10\",\n },\n info: {\n color: \"text-[var(--dashboard-status-info,#3b82f6)]\",\n bgColor: \"bg-[var(--dashboard-status-info,#3b82f6)]/10\",\n },\n neutral: {\n color: \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n bgColor: \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n },\n};\n\nconst sizeClasses: Record<string, string> = {\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-3 py-1 text-sm\",\n};\n\nexport function BadgeStatus({\n label,\n variant = \"neutral\",\n color,\n bgColor,\n size = \"md\",\n className,\n}: BadgeStatusProps) {\n const styles = variantStyles[variant];\n const useCustomColors = color || bgColor;\n\n return (\n <span\n className={cn(\n \"inline-flex w-fit items-center justify-center rounded-full font-medium whitespace-nowrap\",\n sizeClasses[size],\n !useCustomColors && styles.color,\n !useCustomColors && styles.bgColor,\n className,\n )}\n style={\n useCustomColors\n ? {\n color: color || undefined,\n backgroundColor: bgColor || undefined,\n }\n : undefined\n }\n >\n {label}\n </span>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, ReactNode } from \"react\";\nimport { LogOut, ChevronDown, ChevronRight, User } from \"lucide-react\";\n\nexport interface SidebarMenuItem {\n id: string;\n label: string;\n href: string;\n icon: React.ComponentType<{\n size?: number;\n className?: string;\n style?: React.CSSProperties;\n }>;\n /** Optional section header — rendered above this item when set */\n section?: string;\n /** Child items — renders as expandable sub-menu */\n children?: SidebarMenuItem[];\n /** When true, the item is rendered in a non-interactive disabled state */\n disabled?: boolean;\n}\n\nexport interface SidebarUser {\n name: string;\n email: string;\n subtitle?: string;\n}\n\nexport interface SidebarProps {\n menuItems: SidebarMenuItem[];\n logo: ReactNode;\n collapsedLogo?: ReactNode;\n currentPath: string;\n linkComponent?: React.ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n }>;\n isCollapsed?: boolean;\n onToggleCollapse?: () => void;\n user?: SidebarUser;\n onUserClick?: () => void;\n onLogout?: () => void;\n logoutLabel?: string;\n /** Extra items rendered in the footer, above the logout button */\n footerItems?: SidebarMenuItem[];\n /** Arbitrary content rendered between the user info block and footerItems */\n footerSlot?: ReactNode;\n /** Initial expanded sub-menu IDs (pass from server to avoid hydration mismatch). */\n defaultExpandedIds?: string[];\n /** Cookie/localStorage key for persisting expanded state across reloads. */\n persistExpandedKey?: string;\n /** When false, the mobile header is not rendered (use when an external app header is in place). Default: true */\n showMobileHeader?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction DefaultLink({\n href,\n className,\n children,\n}: {\n href: string;\n className?: string;\n children: ReactNode;\n}) {\n return (\n <a href={href} className={className}>\n {children}\n </a>\n );\n}\n\nexport function Sidebar({\n menuItems,\n logo,\n collapsedLogo,\n currentPath,\n linkComponent: LinkComponent = DefaultLink,\n isCollapsed = false,\n onToggleCollapse,\n user,\n onUserClick,\n onLogout,\n logoutLabel = \"Sair\",\n footerItems,\n footerSlot,\n defaultExpandedIds,\n persistExpandedKey,\n showMobileHeader = true,\n className,\n}: SidebarProps) {\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n const [expandedIds, setExpandedIds] = useState<Set<string>>(\n () => new Set(defaultExpandedIds ?? []),\n );\n\n const cubicBezier = \"cubic-bezier(0.4, 0, 0.2, 1)\";\n\n // Auto-expand parent items whose children match the current path\n useEffect(() => {\n const idsToExpand: string[] = [];\n for (const item of menuItems) {\n if (item.children?.some((c) => currentPath === c.href)) {\n idsToExpand.push(item.id);\n }\n }\n if (footerItems) {\n for (const item of footerItems) {\n if (item.children?.some((c) => currentPath === c.href)) {\n idsToExpand.push(item.id);\n }\n }\n }\n if (idsToExpand.length > 0) {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n for (const id of idsToExpand) next.add(id);\n return next;\n });\n }\n }, [currentPath, menuItems, footerItems]);\n\n // Persist expanded IDs to cookie (SSR-readable) + localStorage (fallback)\n useEffect(() => {\n if (persistExpandedKey && typeof document !== \"undefined\") {\n const json = JSON.stringify([...expandedIds]);\n try { localStorage.setItem(persistExpandedKey, json); } catch { /* ignore */ }\n document.cookie = `${persistExpandedKey}=${encodeURIComponent(json)}; path=/; max-age=31536000; SameSite=Lax`;\n }\n }, [expandedIds, persistExpandedKey]);\n\n function toggleExpand(id: string) {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n function isItemActive(item: SidebarMenuItem): boolean {\n if (currentPath === item.href) return true;\n if (item.children?.some((c) => currentPath === c.href)) return true;\n return false;\n }\n\n /** Group items by section — items before any section go into a null group */\n function groupBySection(items: SidebarMenuItem[]) {\n const groups: { section: string | null; items: SidebarMenuItem[] }[] = [];\n for (const item of items) {\n if (item.section) {\n groups.push({ section: item.section, items: [item] });\n } else {\n if (groups.length === 0) groups.push({ section: null, items: [] });\n groups[groups.length - 1]!.items.push(item);\n }\n }\n return groups;\n }\n\n // ── Shared render helpers ──────────────────────────────────────────\n\n function renderSectionHeader(section: string, collapsed: boolean) {\n if (collapsed) {\n return (\n <div className=\"my-2 mx-2 border-t border-[var(--dashboard-sidebar-border,#e0dfe3)]\" />\n );\n }\n return (\n <div className=\"mb-1 mt-5 px-4 text-[11px] font-bold uppercase tracking-wider text-[var(--dashboard-sidebar-text,#403f52)]/80\">\n {section}\n </div>\n );\n }\n\n function renderMenuItem(\n item: SidebarMenuItem,\n collapsed: boolean,\n mobile: boolean,\n ) {\n const Icon = item.icon;\n const hasChildren = item.children && item.children.length > 0;\n const isActive = currentPath === item.href;\n const isExpanded = expandedIds.has(item.id);\n const isChildActive = item.children?.some(\n (c) => currentPath === c.href,\n );\n\n if (hasChildren) {\n return (\n <div key={item.id}>\n <button\n onClick={() => toggleExpand(item.id)}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer\",\n collapsed && !mobile ? \"justify-center\" : \"justify-start\",\n isChildActive\n ? \"text-[var(--dashboard-sidebar-active-text,#ff521d)]\"\n : \"text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-[var(--dashboard-primary,#ff521d)]/10\",\n )}\n style={{ transition: \"background-color 200ms, color 200ms\" }}\n title={collapsed && !mobile ? item.label : undefined}\n >\n <Icon\n size={20}\n style={{\n marginRight: collapsed && !mobile ? 0 : \"0.75rem\",\n flexShrink: 0,\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n {(!collapsed || mobile) && (\n <>\n <span className=\"whitespace-nowrap flex-1 text-left\">\n {item.label}\n </span>\n <ChevronRight\n size={14}\n className={cn(\n \"ml-auto flex-shrink-0 transition-transform duration-200\",\n isExpanded ? \"rotate-90\" : \"\",\n )}\n />\n </>\n )}\n </button>\n {/* Children */}\n {(!collapsed || mobile) && (\n <div\n className=\"overflow-hidden transition-all duration-200 ml-7 border-l-2 border-[var(--dashboard-sidebar-border,#e0dfe3)]\"\n style={{\n maxHeight: isExpanded ? `${item.children!.length * 40}px` : \"0\",\n }}\n >\n {item.children!.map((child) => {\n const ChildIcon = child.icon;\n const childActive = currentPath === child.href;\n return (\n <LinkComponent\n key={child.id}\n href={child.href}\n className=\"block\"\n >\n <div\n className={cn(\n \"w-full flex items-center pl-4 pr-4 py-2 rounded-r-lg text-[13px] cursor-pointer\",\n childActive\n ? \"text-[var(--dashboard-sidebar-active-text,#ff521d)] font-semibold border-l-2 border-[var(--dashboard-primary,#ff521d)] -ml-[2px]\"\n : \"text-[var(--dashboard-sidebar-text,#403f52)] hover:text-[var(--dashboard-sidebar-active-text,#ff521d)]\",\n )}\n style={{\n transition: \"background-color 200ms, color 200ms\",\n }}\n >\n <ChildIcon\n size={15}\n className=\"mr-2 flex-shrink-0\"\n />\n <span className=\"whitespace-nowrap\">{child.label}</span>\n </div>\n </LinkComponent>\n );\n })}\n </div>\n )}\n </div>\n );\n }\n\n // Simple item (no children)\n return (\n <LinkComponent key={item.id} href={item.href} className=\"block\">\n <div\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer\",\n collapsed && !mobile ? \"justify-center\" : \"justify-start\",\n isActive\n ? \"bg-[var(--dashboard-primary,#ff521d)]/25 text-[var(--dashboard-sidebar-active-text,#ff521d)]\"\n : \"text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-[var(--dashboard-primary,#ff521d)]/10\",\n )}\n style={{ transition: \"background-color 200ms, color 200ms\" }}\n title={collapsed && !mobile ? item.label : undefined}\n >\n <Icon\n size={20}\n style={{\n marginRight: collapsed && !mobile ? 0 : \"0.75rem\",\n flexShrink: 0,\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n <span\n className=\"whitespace-nowrap overflow-hidden\"\n style={\n !mobile\n ? {\n width: collapsed ? 0 : \"auto\",\n opacity: collapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }\n : undefined\n }\n >\n {item.label}\n </span>\n </div>\n </LinkComponent>\n );\n }\n\n function renderMenuGroups(collapsed: boolean, mobile: boolean) {\n const groups = groupBySection(menuItems);\n return groups.map((group, i) => (\n <div key={group.section || `group-${i}`} className=\"space-y-1\">\n {group.section && renderSectionHeader(group.section, collapsed)}\n {group.items.map((item) => renderMenuItem(item, collapsed, mobile))}\n </div>\n ));\n }\n\n // ── Mobile Header ──────────────────────────────────────────────────\n\n const mobileHeader = (\n <header className=\"xl:hidden fixed top-0 left-0 right-0 z-40 bg-[var(--dashboard-sidebar-bg,#f0f0f0)] border-b border-[var(--dashboard-sidebar-border,#e0dfe3)]\">\n <div className=\"flex items-center justify-center px-4 h-16 relative\">\n <div className=\"flex items-center\">{logo}</div>\n <button\n onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\n className=\"absolute right-4 inline-flex items-center justify-center rounded-lg text-sm font-medium transition-colors cursor-pointer bg-black/5 text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-black/10 h-10 w-10\"\n aria-label=\"Menu\"\n aria-expanded={isMobileMenuOpen}\n >\n <ChevronDown\n size={24}\n className={`transition-transform duration-200 ${isMobileMenuOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n </div>\n\n <nav\n className={`absolute top-16 left-0 right-0 bg-[var(--dashboard-sidebar-bg,#f0f0f0)] border-b border-[var(--dashboard-sidebar-border,#e0dfe3)] shadow-lg transition-all duration-200 ${\n isMobileMenuOpen\n ? \"max-h-[calc(100vh-4rem)] overflow-y-auto\"\n : \"max-h-0 overflow-hidden\"\n }`}\n >\n <div className=\"px-4 py-2\">\n {renderMenuGroups(false, true)}\n\n <div className=\"mt-2 pt-2 border-t border-[var(--dashboard-sidebar-border,#e0dfe3)] space-y-2\">\n {user && (\n <button\n onClick={onUserClick}\n className=\"w-full flex items-center px-4 py-3 rounded-lg bg-[var(--dashboard-primary,#ff521d)]/5 hover:bg-[var(--dashboard-primary,#ff521d)]/10 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#ff521d)]/30 text-[var(--dashboard-sidebar-text,#403f52)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div className=\"ml-3 text-left\">\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#403f52)]/60 whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-sidebar-text,#403f52)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#403f52)]/60 whitespace-nowrap truncate\">\n {user.email}\n </p>\n </div>\n </button>\n )}\n\n {footerSlot}\n\n {footerItems?.map((item) => renderMenuItem(item, false, true))}\n\n {onLogout && (\n <button\n onClick={onLogout}\n className=\"w-full flex items-center justify-start px-4 py-3 rounded-lg text-sm font-medium transition-colors cursor-pointer text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-[var(--dashboard-primary,#ff521d)]/10\"\n >\n <LogOut size={20} className=\"mr-3 flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{logoutLabel}</span>\n </button>\n )}\n </div>\n </div>\n </nav>\n </header>\n );\n\n // ── Desktop Sidebar ────────────────────────────────────────────────\n\n const desktopSidebar = (\n <aside\n className={cn(\n \"hidden xl:flex xl:flex-col xl:fixed xl:left-0 xl:top-0 xl:h-screen bg-[var(--dashboard-sidebar-bg,#f0f0f0)] border-r border-[var(--dashboard-sidebar-border,#e0dfe3)] overflow-visible\",\n isCollapsed ? \"xl:w-[109px]\" : \"xl:w-[280px]\",\n className,\n )}\n style={{ transition: `width 400ms ${cubicBezier}` }}\n >\n {/* Toggle Button */}\n {onToggleCollapse && (\n <button\n onClick={onToggleCollapse}\n className=\"absolute top-16 -right-[18px] -translate-y-1/2 z-50 flex items-center justify-center cursor-pointer\"\n aria-label={isCollapsed ? \"Expandir sidebar\" : \"Recolher sidebar\"}\n style={{ width: \"20px\", height: \"193px\" }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"193\"\n viewBox=\"0 0 20 193\"\n fill=\"none\"\n className=\"absolute inset-0\"\n >\n {/* Fill shape — extended to x=0 to fully cover the aside border-r */}\n <path\n d=\"M10.2036 118.86C14.8518 115.918 19.5 107.801 19.5 95.9116C19.5 84.0223 15.672 76.4939 10.2036 72.9634C4.73505 69.4329 2.54765 63.5488 1.72738 55.8994L0 55.8994L0 136.512L1.72738 136.512C2.82108 125.921 5.55533 121.802 10.2036 118.86Z\"\n fill=\"var(--dashboard-sidebar-bg,#f0f0f0)\"\n />\n {/* Outer curve stroke — traces only the curved portion */}\n <path\n d=\"M1.72738 55.8994C2.54765 63.5488 4.73505 69.4329 10.2036 72.9634C15.672 76.4939 19.5 84.0223 19.5 95.9116C19.5 107.801 14.8518 115.918 10.2036 118.86C5.55533 121.802 2.82108 125.921 1.72738 136.512\"\n stroke=\"var(--dashboard-sidebar-border,#e0dfe3)\"\n strokeWidth=\"1\"\n fill=\"none\"\n />\n </svg>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n className={`relative z-10 ${isCollapsed ? \"\" : \"rotate-180\"}`}\n style={{ transition: `transform 400ms ${cubicBezier}` }}\n >\n <path\n d=\"M4.5 2L8.5 6L4.5 10\"\n stroke=\"var(--dashboard-sidebar-text,#403f52)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div className=\"flex flex-col h-full overflow-y-auto\">\n {/* Logo */}\n <div className=\"flex justify-center items-center py-6 px-4 border-b border-[var(--dashboard-sidebar-border,#e0dfe3)] overflow-hidden relative h-[88px]\">\n {collapsedLogo && (\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n style={{\n opacity: isCollapsed ? 1 : 0,\n transition: `opacity 400ms ${cubicBezier}`,\n pointerEvents: isCollapsed ? \"auto\" : \"none\",\n }}\n >\n {collapsedLogo}\n </div>\n )}\n <div\n className=\"flex items-center justify-center\"\n style={{\n opacity: !isCollapsed || !collapsedLogo ? 1 : 0,\n transition: `opacity 400ms ${cubicBezier}`,\n pointerEvents:\n !isCollapsed || !collapsedLogo ? \"auto\" : \"none\",\n }}\n >\n {logo}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 px-3 py-3 space-y-0.5 overflow-y-auto\">\n {renderMenuGroups(isCollapsed, false)}\n </nav>\n\n {/* Footer */}\n <footer className=\"p-4 border-t border-[var(--dashboard-sidebar-border,#e0dfe3)] space-y-2\">\n {user && (\n <button\n onClick={onUserClick}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg bg-[var(--dashboard-primary,#ff521d)]/5 hover:bg-[var(--dashboard-primary,#ff521d)]/10 transition-colors cursor-pointer\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n )}\n title={\n isCollapsed\n ? `${user.subtitle ? user.subtitle + \" - \" : \"\"}${user.name}`\n : undefined\n }\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#ff521d)]/30 text-[var(--dashboard-sidebar-text,#403f52)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div\n className=\"overflow-hidden text-left\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n marginLeft: isCollapsed ? 0 : \"0.75rem\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, margin 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#403f52)]/60 whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-sidebar-text,#403f52)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#403f52)]/60 whitespace-nowrap truncate\">\n {user.email}\n </p>\n </div>\n </button>\n )}\n\n {footerSlot}\n\n {footerItems?.map((item) => renderMenuItem(item, isCollapsed, false))}\n\n {onLogout && (\n <button\n onClick={onLogout}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-[var(--dashboard-primary,#ff521d)]/10\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n )}\n style={{ transition: \"background-color 200ms\" }}\n title={isCollapsed ? logoutLabel : undefined}\n >\n <LogOut\n size={20}\n style={{\n marginRight: isCollapsed ? 0 : \"0.75rem\",\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n <span\n className=\"whitespace-nowrap overflow-hidden\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {logoutLabel}\n </span>\n </button>\n )}\n </footer>\n </div>\n </aside>\n );\n\n return (\n <>\n {showMobileHeader && mobileHeader}\n {desktopSidebar}\n </>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode, useState, useRef, useEffect } from \"react\";\nimport { Building2, Check, ChevronDown, LogOut, Menu, User, X } from \"lucide-react\";\nimport type { SidebarMenuItem, SidebarUser } from \"../Sidebar\";\n\nexport interface HeaderMenuChild {\n id: string;\n label: string;\n href: string;\n icon: React.ComponentType<{ size?: number; className?: string; style?: React.CSSProperties }>;\n disabled?: boolean;\n}\n\nexport interface HeaderMenuGroup {\n id: string;\n label: string;\n icon: React.ComponentType<{ size?: number; className?: string; style?: React.CSSProperties }>;\n children: HeaderMenuChild[];\n}\n\nexport type HeaderMenuItem = SidebarMenuItem | HeaderMenuGroup;\n\nexport type HeaderUser = SidebarUser;\n\nexport interface HeaderEstablishment {\n id: string;\n label: string;\n description?: string;\n active?: boolean;\n disabled?: boolean;\n}\n\nexport interface HeaderProps {\n /** Itens de navegacao exibidos no header */\n menuItems: HeaderMenuItem[];\n /** Logo principal */\n logo: ReactNode;\n /** Rota ativa */\n currentPath: string;\n /** Componente de link do framework consumidor */\n linkComponent?: React.ComponentType<{\n href: string;\n className?: string;\n onClick?: () => void;\n children: ReactNode;\n }>;\n /** Usuario autenticado */\n user?: HeaderUser;\n /** Estabelecimentos exibidos no menu do usuario */\n establishments?: HeaderEstablishment[];\n /** Label da secao de estabelecimentos */\n establishmentsLabel?: string;\n /** Callback ao selecionar um estabelecimento */\n onEstablishmentChange?: (establishmentId: string) => void;\n /** Acoes extras exibidas antes do usuario */\n actions?: ReactNode;\n /** Callback ao clicar no usuario */\n onUserClick?: () => void;\n /** Callback de logout */\n onLogout?: () => void;\n logoutLabel?: string;\n /** Label do botao de menu mobile */\n menuLabel?: string;\n /** Abre dropdowns de navegacao no hover em layouts desktop. Default: true */\n openDropdownOnHover?: boolean;\n /** Offset lateral no desktop quando existe sidebar fixa */\n desktopOffsetLeft?: number | string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction isGroup(item: HeaderMenuItem): item is HeaderMenuGroup {\n return \"children\" in item && Array.isArray(item.children);\n}\n\nfunction DefaultLink({\n href,\n className,\n onClick,\n children,\n}: {\n href: string;\n className?: string;\n onClick?: () => void;\n children: ReactNode;\n}) {\n return (\n <a href={href} className={className} onClick={onClick}>\n {children}\n </a>\n );\n}\n\nfunction useOnClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n handler: () => void\n) {\n useEffect(() => {\n const listener = (event: MouseEvent | TouchEvent) => {\n if (!ref.current || ref.current.contains(event.target as Node)) return;\n handler();\n };\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [ref, handler]);\n}\n\nexport function Header({\n menuItems,\n logo,\n currentPath,\n linkComponent: LinkComponent = DefaultLink,\n user,\n establishments = [],\n establishmentsLabel = \"Estabelecimento\",\n onEstablishmentChange,\n actions,\n onUserClick,\n onLogout,\n logoutLabel = \"Sair\",\n menuLabel = \"Menu\",\n openDropdownOnHover = true,\n desktopOffsetLeft = 0,\n className,\n}: HeaderProps) {\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n const [isUserMenuOpen, setIsUserMenuOpen] = useState(false);\n const [openDropdownId, setOpenDropdownId] = useState<string | null>(null);\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const userMenuRef = useRef<HTMLDivElement>(null);\n const hoverCloseTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useOnClickOutside(dropdownRef, () => setOpenDropdownId(null));\n useOnClickOutside(userMenuRef, () => setIsUserMenuOpen(false));\n\n useEffect(() => {\n return () => {\n if (hoverCloseTimeoutRef.current) {\n clearTimeout(hoverCloseTimeoutRef.current);\n }\n };\n }, []);\n\n const clearHoverCloseTimeout = () => {\n if (!hoverCloseTimeoutRef.current) return;\n clearTimeout(hoverCloseTimeoutRef.current);\n hoverCloseTimeoutRef.current = null;\n };\n\n const closeMenus = () => {\n clearHoverCloseTimeout();\n setIsMobileMenuOpen(false);\n setIsUserMenuOpen(false);\n setOpenDropdownId(null);\n };\n\n const isItemActive = (item: HeaderMenuItem) => {\n if (isGroup(item)) {\n return item.children.some(\n (child) =>\n currentPath === child.href ||\n (child.href !== \"/dashboard\" && currentPath.startsWith(child.href))\n );\n }\n return currentPath === item.href;\n };\n\n const renderNavLink = (\n item: SidebarMenuItem,\n options: { mobile?: boolean } = {}\n ) => {\n const Icon = item.icon;\n const active = currentPath === item.href;\n\n if (item.disabled) {\n return (\n <span\n key={item.id}\n className={cn(\n \"flex items-center gap-2 rounded-lg text-sm font-medium cursor-not-allowed\",\n options.mobile\n ? \"px-4 py-3\"\n : \"h-10 px-3\",\n \"text-[var(--dashboard-text-secondary,#6b7280)]/40\"\n )}\n title=\"Em breve\"\n >\n <Icon size={18} className=\"flex-shrink-0 opacity-40\" />\n <span className=\"line-through opacity-50\">{item.label}</span>\n </span>\n );\n }\n\n return (\n <LinkComponent\n key={item.id}\n href={item.href}\n className=\"block\"\n onClick={closeMenus}\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-lg text-sm font-medium transition-colors\",\n options.mobile\n ? \"px-4 py-3\"\n : \"h-10 px-3\",\n active\n ? \"bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-primary,#37a501)]/8 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n )}\n aria-current={active ? \"page\" : undefined}\n >\n <Icon size={18} className=\"flex-shrink-0\" />\n <span>{item.label}</span>\n </div>\n </LinkComponent>\n );\n };\n\n const renderDropdown = (\n group: HeaderMenuGroup,\n options: { mobile?: boolean } = {}\n ) => {\n const Icon = group.icon;\n const groupActive = isItemActive(group);\n const isOpen = openDropdownId === group.id;\n\n if (options.mobile) {\n return (\n <div key={group.id} className=\"space-y-1\">\n <div className=\"flex items-center gap-2 px-4 py-2 text-xs font-semibold uppercase tracking-wider text-[var(--dashboard-text-secondary,#6b7280)]\">\n <Icon size={16} />\n {group.label}\n </div>\n <div className=\"ml-3 space-y-1 border-l border-[var(--dashboard-text-secondary,#6b7280)]/20 pl-3\">\n {group.children.map((child) => {\n const active = currentPath === child.href;\n return (\n child.disabled ? (\n <span\n key={child.id}\n className=\"flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-medium cursor-not-allowed text-[var(--dashboard-text-secondary,#6b7280)]/40\"\n title=\"Em breve\"\n >\n <child.icon size={16} className=\"flex-shrink-0 opacity-40\" />\n <span className=\"line-through opacity-50\">{child.label}</span>\n </span>\n ) : (\n <LinkComponent\n key={child.id}\n href={child.href}\n className=\"block\"\n onClick={closeMenus}\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-medium transition-colors\",\n active\n ? \"bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-primary,#37a501)]/8 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n )}\n >\n <child.icon size={16} className=\"flex-shrink-0\" />\n <span>{child.label}</span>\n </div>\n </LinkComponent>\n )\n );\n })}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={group.id}\n className=\"relative\"\n ref={isOpen ? dropdownRef : undefined}\n onMouseEnter={() => {\n if (!openDropdownOnHover) return;\n clearHoverCloseTimeout();\n setOpenDropdownId(group.id);\n }}\n onMouseLeave={() => {\n if (!openDropdownOnHover) return;\n hoverCloseTimeoutRef.current = setTimeout(() => {\n setOpenDropdownId((current) => (current === group.id ? null : current));\n hoverCloseTimeoutRef.current = null;\n }, 120);\n }}\n >\n <button\n type=\"button\"\n onClick={() => {\n clearHoverCloseTimeout();\n setOpenDropdownId((prev) => (prev === group.id ? null : group.id));\n }}\n className={cn(\n \"flex h-10 items-center gap-1.5 rounded-lg px-3 text-sm font-medium transition-colors\",\n groupActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-primary,#37a501)]/8 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n )}\n aria-expanded={isOpen}\n >\n <Icon size={18} className=\"flex-shrink-0\" />\n <span>{group.label}</span>\n <ChevronDown\n size={14}\n className={cn(\"flex-shrink-0 transition-transform\", isOpen && \"rotate-180\")}\n />\n </button>\n\n {isOpen && (\n <div className=\"absolute left-1/2 top-[calc(100%+0.5rem)] z-50 w-max min-w-full max-w-[24rem] -translate-x-1/2 rounded-xl border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] p-1.5 shadow-xl\">\n {group.children.map((child) => {\n const active = currentPath === child.href;\n return (\n child.disabled ? (\n <span\n key={child.id}\n className=\"flex cursor-not-allowed items-center gap-2 rounded-lg px-3 py-2 text-sm text-[var(--dashboard-text-secondary,#6b7280)]/40\"\n title=\"Em breve\"\n >\n <child.icon size={16} className=\"flex-shrink-0 opacity-40\" />\n <span className=\"whitespace-nowrap line-through opacity-50\">{child.label}</span>\n </span>\n ) : (\n <LinkComponent\n key={child.id}\n href={child.href}\n className=\"block\"\n onClick={() => setOpenDropdownId(null)}\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-lg px-3 py-2 text-sm transition-colors\",\n active\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)] font-semibold\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]/80 hover:bg-[var(--dashboard-primary,#37a501)]/8 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n )}\n >\n <child.icon size={16} className=\"flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{child.label}</span>\n {active && (\n <span className=\"ml-auto h-1.5 w-1.5 rounded-full bg-[var(--dashboard-primary,#37a501)]\" />\n )}\n </div>\n </LinkComponent>\n )\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n const renderNavItem = (\n item: HeaderMenuItem,\n options: { mobile?: boolean } = {}\n ) => {\n if (isGroup(item)) {\n return renderDropdown(item, options);\n }\n return renderNavLink(item, options);\n };\n\n const desktopOffset =\n typeof desktopOffsetLeft === \"number\"\n ? `${desktopOffsetLeft}px`\n : desktopOffsetLeft;\n const userEstablishments =\n establishments.length > 0\n ? establishments\n : user?.subtitle\n ? [\n {\n id: \"current\",\n label: user.subtitle,\n active: true,\n },\n ]\n : [];\n\n return (\n <>\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed inset-x-0 top-0 z-30 h-2 bg-[var(--dashboard-background,#f2f2f2)]\"\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed left-[var(--dashboard-page-gutter,0px)] right-[var(--dashboard-page-gutter,0px)] top-2 z-30 h-5 bg-[var(--dashboard-background,#f2f2f2)] transition-[left,right] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)] min-[800px]:left-[calc(var(--dashboard-header-offset-left,0px)+var(--dashboard-page-gutter,0px))]\"\n style={\n {\n \"--dashboard-header-offset-left\": desktopOffset,\n } as React.CSSProperties\n }\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed left-[var(--dashboard-page-gutter,0px)] top-2 z-30 h-14 w-5 bg-[var(--dashboard-background,#f2f2f2)] transition-[left] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)] min-[800px]:left-[calc(var(--dashboard-header-offset-left,0px)+var(--dashboard-page-gutter,0px))]\"\n style={\n {\n \"--dashboard-header-offset-left\": desktopOffset,\n } as React.CSSProperties\n }\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed right-[var(--dashboard-page-gutter,0px)] top-2 z-30 h-14 w-5 bg-[var(--dashboard-background,#f2f2f2)] transition-[right] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)]\"\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed left-[var(--dashboard-page-gutter,0px)] right-[var(--dashboard-page-gutter,0px)] top-2 z-30 h-20 rounded-2xl bg-[var(--dashboard-background,#f2f2f2)] transition-[left,right] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)] min-[800px]:left-[calc(var(--dashboard-header-offset-left,0px)+var(--dashboard-page-gutter,0px))]\"\n style={\n {\n \"--dashboard-header-offset-left\": desktopOffset,\n } as React.CSSProperties\n }\n />\n\n <header\n className={cn(\n \"fixed left-[var(--dashboard-page-gutter,0px)] right-[var(--dashboard-page-gutter,0px)] top-2 z-40 rounded-2xl border border-[var(--dashboard-text-secondary,#6b7280)]/15 bg-[var(--dashboard-surface,#ffffff)] text-[var(--dashboard-text-primary,#2d2d2d)] dashboard-header-shadow transition-[left,right] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)] min-[800px]:left-[calc(var(--dashboard-header-offset-left,0px)+var(--dashboard-page-gutter,0px))]\",\n className,\n )}\n style={\n {\n \"--dashboard-header-offset-left\": desktopOffset,\n } as React.CSSProperties\n }\n >\n <div className=\"flex h-20 items-center gap-4 px-4 sm:px-5 min-[800px]:grid min-[800px]:grid-cols-[minmax(7rem,1fr)_auto_minmax(3rem,1fr)] min-[800px]:gap-3 min-[1000px]:grid-cols-[minmax(8rem,1fr)_auto_minmax(10rem,1fr)] min-[1120px]:gap-4\">\n <div className=\"flex min-w-0 flex-1 items-center gap-4 lg:flex-none min-[800px]:col-start-1 min-[800px]:justify-self-start\">\n <div className=\"flex min-w-0 items-center\">{logo}</div>\n </div>\n\n <nav\n className=\"hidden min-w-0 items-center justify-center gap-1 min-[800px]:col-start-2 min-[800px]:flex\"\n aria-label=\"Navegacao principal\"\n >\n {menuItems.map((item) => renderNavItem(item))}\n </nav>\n\n <div className=\"hidden items-center gap-3 min-[800px]:col-start-3 min-[800px]:flex min-[800px]:justify-self-end\">\n {actions}\n\n {user && (\n <div className=\"relative w-11 min-[1000px]:w-[220px] min-[1120px]:w-[260px]\" ref={userMenuRef}>\n <button\n type=\"button\"\n onClick={() => setIsUserMenuOpen((open) => !open)}\n className=\"flex h-11 w-full items-center justify-center gap-3 rounded-lg bg-[var(--dashboard-background,#f2f2f2)] px-0 text-left transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8 min-[1000px]:justify-start min-[1000px]:px-3\"\n aria-expanded={isUserMenuOpen}\n aria-label={user.name}\n >\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <User size={16} />\n </div>\n <div className=\"hidden min-w-0 flex-1 min-[1000px]:block\">\n {user.subtitle && (\n <p className=\"truncate text-[11px] leading-4 text-[var(--dashboard-text-secondary,#6b7280)]\">\n {user.subtitle}\n </p>\n )}\n <p className=\"truncate text-sm font-medium leading-4\">\n {user.name}\n </p>\n </div>\n <ChevronDown\n size={16}\n className={cn(\n \"ml-auto hidden flex-shrink-0 transition-transform min-[1000px]:block\",\n isUserMenuOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {isUserMenuOpen && (\n <div className=\"absolute right-0 top-[calc(100%+0.5rem)] w-[260px] rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] p-2 text-[var(--dashboard-text-primary,#2d2d2d)] shadow-xl min-[1000px]:w-full\">\n <button\n type=\"button\"\n onClick={() => {\n setIsUserMenuOpen(false);\n onUserClick?.();\n }}\n className=\"flex w-full items-center gap-3 rounded-lg px-3 py-3 text-left transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8\"\n >\n <div className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <User size={17} />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold\">\n {user.name}\n </p>\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {user.email}\n </p>\n </div>\n </button>\n\n {userEstablishments.length > 0 && (\n <div className=\"mt-1 border-t border-[var(--dashboard-text-secondary,#6b7280)]/15 pt-2\">\n <p className=\"px-3 pb-1 text-[11px] font-semibold uppercase tracking-wide text-[var(--dashboard-text-secondary,#6b7280)]\">\n {establishmentsLabel}\n </p>\n <div className=\"space-y-1\">\n {userEstablishments.map((establishment) => {\n const isDisabled =\n establishment.disabled ||\n !onEstablishmentChange ||\n establishment.active;\n\n return (\n <button\n key={establishment.id}\n type=\"button\"\n onClick={() => {\n if (isDisabled) return;\n setIsUserMenuOpen(false);\n onEstablishmentChange?.(establishment.id);\n }}\n disabled={isDisabled}\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left transition-colors\",\n establishment.active\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"hover:bg-[var(--dashboard-primary,#37a501)]/8\",\n isDisabled\n ? establishment.active\n ? \"cursor-default\"\n : \"cursor-not-allowed opacity-60\"\n : \"cursor-pointer\",\n )}\n >\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <Building2 size={15} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold\">\n {establishment.label}\n </p>\n {establishment.description && (\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {establishment.description}\n </p>\n )}\n </div>\n {establishment.active && (\n <Check size={16} className=\"flex-shrink-0\" />\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {onLogout && (\n <button\n type=\"button\"\n onClick={() => {\n setIsUserMenuOpen(false);\n onLogout();\n }}\n className=\"mt-1 flex w-full items-center gap-3 rounded-lg px-3 py-3 text-sm font-medium transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8\"\n >\n <LogOut size={18} />\n {logoutLabel}\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={() => setIsMobileMenuOpen((open) => !open)}\n className=\"inline-flex h-10 w-10 items-center justify-center rounded-lg bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)] transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/15 min-[800px]:hidden\"\n aria-label={menuLabel}\n aria-expanded={isMobileMenuOpen}\n >\n {isMobileMenuOpen ? <X size={22} /> : <Menu size={22} />}\n </button>\n </div>\n\n <div\n className={cn(\n \"overflow-hidden border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] shadow-lg transition-[max-height] duration-200 min-[800px]:hidden\",\n isMobileMenuOpen ? \"max-h-[calc(100vh-4rem)]\" : \"max-h-0\",\n )}\n >\n <div className=\"max-h-[calc(100vh-4rem)] overflow-y-auto px-4 py-3\">\n <nav className=\"space-y-1\" aria-label=\"Navegacao principal\">\n {menuItems.map((item) => renderNavItem(item, { mobile: true }))}\n </nav>\n\n {(user || actions || onLogout) && (\n <div className=\"mt-3 space-y-2 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 pt-3\">\n {actions}\n\n {user && (\n <>\n <button\n type=\"button\"\n onClick={() => {\n closeMenus();\n onUserClick?.();\n }}\n className=\"flex w-full items-center gap-3 rounded-lg bg-[var(--dashboard-background,#f2f2f2)] px-4 py-3 text-left transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8\"\n >\n <div className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <User size={17} />\n </div>\n <div className=\"min-w-0\">\n {user.subtitle && (\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {user.subtitle}\n </p>\n )}\n <p className=\"truncate text-sm font-semibold\">{user.name}</p>\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {user.email}\n </p>\n </div>\n </button>\n\n {userEstablishments.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-4 pt-2 text-[11px] font-semibold uppercase tracking-wide text-[var(--dashboard-text-secondary,#6b7280)]\">\n {establishmentsLabel}\n </p>\n {userEstablishments.map((establishment) => {\n const isDisabled =\n establishment.disabled ||\n !onEstablishmentChange ||\n establishment.active;\n\n return (\n <button\n key={establishment.id}\n type=\"button\"\n onClick={() => {\n if (isDisabled) return;\n closeMenus();\n onEstablishmentChange?.(establishment.id);\n }}\n disabled={isDisabled}\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-4 py-3 text-left transition-colors\",\n establishment.active\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"hover:bg-[var(--dashboard-primary,#37a501)]/8\",\n isDisabled\n ? establishment.active\n ? \"cursor-default\"\n : \"cursor-not-allowed opacity-60\"\n : \"cursor-pointer\",\n )}\n >\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <Building2 size={15} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold\">\n {establishment.label}\n </p>\n {establishment.description && (\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {establishment.description}\n </p>\n )}\n </div>\n {establishment.active && (\n <Check size={16} className=\"flex-shrink-0\" />\n )}\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n\n {onLogout && (\n <button\n type=\"button\"\n onClick={() => {\n closeMenus();\n onLogout();\n }}\n className=\"flex w-full items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8\"\n >\n <LogOut size={18} />\n {logoutLabel}\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n </header>\n </>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Moon, Sun, Monitor } from \"lucide-react\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\nexport interface ThemeSwitcherProps {\n /** Current theme mode */\n mode: ThemeMode;\n /** Called when the user selects a different mode */\n onModeChange: (mode: ThemeMode) => void;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst modes: {\n value: ThemeMode;\n icon: React.ComponentType<{ size?: number; className?: string }>;\n label: string;\n}[] = [\n { value: \"light\", icon: Sun, label: \"Claro\" },\n { value: \"dark\", icon: Moon, label: \"Escuro\" },\n { value: \"system\", icon: Monitor, label: \"Sistema\" },\n];\n\nexport function ThemeSwitcher({\n mode,\n onModeChange,\n className,\n}: ThemeSwitcherProps) {\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-1 rounded-lg bg-[var(--dashboard-background,#f2f2f2)] p-1\",\n className,\n )}\n >\n {modes.map(({ value, icon: Icon, label }) => (\n <button\n key={value}\n type=\"button\"\n onClick={() => onModeChange(value)}\n className={cn(\n \"flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n mode === value\n ? \"bg-[var(--dashboard-surface,#ffffff)] text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n title={label}\n >\n <Icon size={14} />\n <span>{label}</span>\n </button>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nexport type KPIValueFormat = \"currency\" | \"number\" | \"percentage\" | \"rating\";\n\nexport interface KPICardProps {\n title: string;\n value: number;\n variation: number;\n trend: \"up\" | \"down\" | \"stable\";\n format?: KPIValueFormat;\n benchmark?: string;\n icon?: React.ReactNode;\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction formatValue(value: number, format: KPIValueFormat): string {\n switch (format) {\n case \"currency\":\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\",\n }).format(value);\n case \"percentage\":\n return `${value.toFixed(1)}%`;\n case \"rating\":\n return `${value.toFixed(1)}/5.0`;\n default:\n return new Intl.NumberFormat(\"pt-BR\").format(value);\n }\n}\n\nconst trendConfigs = {\n up: {\n icon: \"\\u2191\",\n color:\n \"text-[var(--dashboard-status-success,#059669)] bg-[var(--dashboard-status-success,#059669)]/8\",\n },\n down: {\n icon: \"\\u2193\",\n color:\n \"text-[var(--dashboard-status-danger,#DC2626)] bg-[var(--dashboard-status-danger,#DC2626)]/8\",\n },\n stable: {\n icon: \"\\u2192\",\n color:\n \"text-[var(--dashboard-text-secondary,#64748B)] bg-[var(--dashboard-text-secondary,#64748B)]/8\",\n },\n};\n\nexport function KPICard({\n title,\n value,\n variation,\n trend,\n format = \"number\",\n benchmark,\n icon,\n isLoading,\n className,\n}: KPICardProps) {\n if (isLoading) return <KPICardSkeleton className={className} />;\n\n const trendConfig = trendConfigs[trend];\n\n return (\n <div\n className={cn(\n \"dashboard-kpi-card h-full w-full min-w-0 bg-[var(--dashboard-surface,#ffffff)] rounded-xl p-4 md:p-5 border border-[var(--dashboard-text-secondary,#64748B)]/12 transition-all duration-200 ease-out dashboard-shadow-sm hover:dashboard-shadow-md flex flex-col\",\n className,\n )}\n >\n <style>{`\n .dashboard-kpi-card {\n container-type: inline-size;\n }\n\n @container (max-width: 13.5rem) {\n .dashboard-kpi-card__content {\n gap: 0.45rem;\n }\n\n .dashboard-kpi-card__value {\n font-size: 1.55rem;\n line-height: 1;\n }\n\n .dashboard-kpi-card__trend {\n padding-inline: 0.5rem;\n gap: 0.2rem;\n }\n\n .dashboard-kpi-card__trend-value {\n font-size: 0.75rem;\n line-height: 1rem;\n }\n }\n\n @container (max-width: 11.5rem) {\n .dashboard-kpi-card__value {\n font-size: 1.4rem;\n }\n\n .dashboard-kpi-card__trend {\n padding-inline: 0.4rem;\n padding-block: 0.2rem;\n }\n\n .dashboard-kpi-card__trend-value {\n font-size: 0.7rem;\n }\n }\n\n @container (max-width: 9.75rem) {\n .dashboard-kpi-card__content {\n gap: 0.35rem;\n }\n\n .dashboard-kpi-card__value {\n font-size: 1.25rem;\n }\n\n .dashboard-kpi-card__trend {\n padding-inline: 0.32rem;\n }\n\n .dashboard-kpi-card__trend-icon {\n font-size: 0.9rem;\n }\n\n .dashboard-kpi-card__trend-value {\n font-size: 0.625rem;\n line-height: 0.875rem;\n }\n }\n `}</style>\n <div className=\"flex justify-between items-start mb-4 gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {icon && (\n <span\n className=\"shrink-0 text-[var(--dashboard-text-secondary,#64748B)]\"\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n <h3 className=\"min-w-0 truncate text-xs font-semibold uppercase tracking-wider text-[var(--dashboard-text-secondary,#64748B)]\">\n {title}\n </h3>\n </div>\n {benchmark && (\n <span\n className=\"text-xs text-[var(--dashboard-text-secondary,#64748B)]/50 ml-2 whitespace-nowrap flex-shrink-0\"\n title=\"Benchmark de referência\"\n >\n {benchmark}\n </span>\n )}\n </div>\n\n <div className=\"dashboard-kpi-card__content flex min-w-0 items-end gap-3 flex-1\">\n <p className=\"dashboard-kpi-card__value min-w-0 text-3xl font-bold text-[var(--dashboard-text-primary,#0F172A)] whitespace-nowrap tracking-tight\">\n {formatValue(value, format)}\n </p>\n <div\n className={cn(\n \"dashboard-kpi-card__trend inline-flex items-center gap-1 px-2 py-1 rounded-full flex-shrink-0 mb-1\",\n trendConfig.color,\n )}\n >\n <span className=\"dashboard-kpi-card__trend-icon text-sm leading-none\">{trendConfig.icon}</span>\n <span className=\"dashboard-kpi-card__trend-value text-xs font-semibold whitespace-nowrap\">\n {Math.abs(variation).toFixed(1)}%\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nfunction KPICardSkeleton({ className }: { className?: string }) {\n return (\n <div\n className={cn(\n \"h-full bg-[var(--dashboard-surface,#ffffff)] rounded-xl p-4 md:p-5 border border-[var(--dashboard-text-secondary,#64748B)]/12 dashboard-shadow-sm animate-pulse flex flex-col\",\n className,\n )}\n >\n <div className=\"h-3 bg-[var(--dashboard-text-secondary,#64748B)]/10 rounded w-2/3 mb-4\" />\n <div className=\"flex items-end gap-3 flex-1\">\n <div className=\"h-8 bg-[var(--dashboard-text-secondary,#64748B)]/10 rounded w-1/2\" />\n <div className=\"h-5 bg-[var(--dashboard-text-secondary,#64748B)]/10 rounded-full w-1/4\" />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface PageLayoutProps {\n /** Texto curto acima do titulo principal */\n eyebrow?: string;\n /** Titulo principal da pagina */\n title: string;\n /** Descricao opcional da pagina (aparece abaixo do titulo) */\n description?: string;\n /** Componentes de filtros ou acoes para o header (ex: PeriodFilter, botoes) */\n headerActions?: ReactNode;\n /** Header principal da aplicacao, usado em layouts com navegacao superior */\n appHeader?: ReactNode;\n /** Conteudo principal da pagina */\n children: ReactNode;\n /** Se true, aplica padding no conteudo. Default: true */\n contentPadding?: boolean;\n /** Classes extras aplicadas no wrapper do conteudo */\n contentClassName?: string;\n /** Faz o conteudo ocupar a altura util da viewport, com scroll interno no filho */\n contentFillViewport?: boolean;\n /** Componente de sidebar a ser renderizado */\n sidebar?: ReactNode;\n /** Se a sidebar esta recolhida */\n sidebarCollapsed?: boolean;\n /** Largura da sidebar expandida em px. Default: 280 */\n sidebarWidth?: number;\n /** Largura da sidebar recolhida em px. Default: 109 */\n sidebarCollapsedWidth?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function PageLayout({\n eyebrow,\n title,\n description,\n headerActions,\n appHeader,\n children,\n contentPadding = true,\n contentClassName,\n contentFillViewport = false,\n sidebar,\n sidebarCollapsed = false,\n sidebarWidth = 280,\n sidebarCollapsedWidth = 109,\n className,\n}: PageLayoutProps) {\n const marginLeft = sidebar\n ? sidebarCollapsed\n ? `max(0px, ${sidebarCollapsedWidth}px)`\n : `max(0px, ${sidebarWidth}px)`\n : \"0px\";\n const mainTopPadding = appHeader\n ? \"pt-24\"\n : sidebar\n ? \"pt-16 xl:pt-0\"\n : \"pt-0\";\n const layoutContainer = \"mx-[var(--dashboard-page-gutter)]\";\n\n return (\n <div\n className={cn(\n \"min-h-screen bg-[var(--dashboard-background,#f2f2f2)] [--dashboard-page-gutter:1.5rem] sm:[--dashboard-page-gutter:2rem] lg:[--dashboard-page-gutter:2.5rem] xl:[--dashboard-page-gutter:3rem]\",\n className,\n )}\n >\n {appHeader}\n {sidebar}\n <main\n className={cn(\n mainTopPadding,\n \"box-border flex flex-col\",\n contentFillViewport ? \"h-dvh overflow-hidden\" : \"min-h-dvh\",\n )}\n style={{\n marginLeft,\n transition: \"margin-left 400ms cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n <style>{`\n @media (max-width: 1279px) {\n main {\n margin-left: 0 !important;\n }\n }\n `}</style>\n\n {/* Header com titulo e acoes */}\n <div\n className={cn(\n layoutContainer,\n \"mt-4 box-border px-6 py-5 sm:px-8 lg:px-10\",\n )}\n >\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"min-w-0\">\n {eyebrow && (\n <p className=\"mb-1 text-xs font-semibold uppercase tracking-[0.16em] text-[var(--dashboard-text-secondary,#6b7280)]\">\n {eyebrow}\n </p>\n )}\n <h1 className=\"text-2xl font-semibold leading-tight tracking-tight text-[var(--dashboard-text-primary,#2d2d2d)] sm:text-3xl\">\n {title}\n </h1>\n {description && (\n <p className=\"mt-2 text-sm font-medium text-[var(--dashboard-text-secondary,#6b7280)]\">\n {description}\n </p>\n )}\n </div>\n\n {headerActions && (\n <div className=\"flex max-w-full justify-start lg:justify-end\">\n {headerActions}\n </div>\n )}\n </div>\n </div>\n\n {/* Conteudo principal */}\n <div\n className={\n contentPadding\n ? cn(layoutContainer, \"min-h-0 flex-1 pb-6 pt-5\", contentClassName)\n : cn(\"min-h-0 flex-1\", contentClassName)\n }\n >\n {children}\n </div>\n </main>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Line } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n);\n\nexport interface ComparisonLineChartProps {\n /** Labels do eixo X (ex: datas) */\n labels: string[];\n /** Dados do periodo atual */\n currentPeriodData: number[];\n /** Dados do periodo anterior */\n previousPeriodData: number[];\n /** Label da legenda do periodo atual */\n currentPeriodLabel?: string;\n /** Label da legenda do periodo anterior */\n previousPeriodLabel?: string;\n /** Titulo do grafico */\n title?: string;\n /** Cor principal (default: --dashboard-primary) */\n color?: string;\n /** Altura do container do grafico em px. Default: 300 */\n height?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ComparisonLineChart({\n labels,\n currentPeriodData,\n previousPeriodData,\n currentPeriodLabel = \"Período atual\",\n previousPeriodLabel = \"Período anterior\",\n title,\n color,\n height = 300,\n className,\n}: ComparisonLineChartProps) {\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const data = {\n labels,\n datasets: [\n {\n label: currentPeriodLabel,\n data: currentPeriodData,\n borderColor: primaryColor,\n backgroundColor: `${primaryColor}1a`,\n borderWidth: 2,\n tension: 0.4,\n fill: true,\n pointRadius: 0,\n pointHoverRadius: 6,\n pointHoverBackgroundColor: primaryColor,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 2,\n },\n {\n label: previousPeriodLabel,\n data: previousPeriodData,\n borderColor: `${primaryColor}66`,\n backgroundColor: `${primaryColor}0d`,\n borderWidth: 2,\n tension: 0.4,\n fill: true,\n pointRadius: 0,\n pointHoverRadius: 6,\n pointHoverBackgroundColor: `${primaryColor}66`,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 2,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: true,\n position: \"bottom\" as const,\n labels: {\n usePointStyle: true,\n boxWidth: 6,\n boxHeight: 6,\n padding: 15,\n font: { size: 11 },\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n },\n },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n displayColors: true,\n usePointStyle: true,\n boxWidth: 6,\n boxHeight: 6,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n },\n },\n y: {\n beginAtZero: true,\n grid: { color: \"rgba(0, 0, 0, 0.05)\", drawBorder: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n precision: 0,\n },\n },\n },\n interaction: {\n intersect: false,\n mode: \"index\" as const,\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6\",\n className,\n )}\n >\n {title && (\n <h3 className=\"text-base font-semibold mb-4 text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n )}\n <div style={{ height }}>\n <Line data={data} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n);\n\nexport interface HorizontalBarChartTab {\n id: string;\n label: string;\n}\n\nexport interface HorizontalBarChartProps {\n /** Labels do eixo Y (ex: horarios) */\n labels: string[];\n /** Dados por tab. Chave = tab.id, valor = array de numeros */\n datasets: Record<string, number[]>;\n /** Tabs para alternar entre datasets */\n tabs?: HorizontalBarChartTab[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Cor das barras (default: --dashboard-primary) */\n color?: string;\n /** Label para tooltip (ex: \"vendas\", \"pedidos\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\", \"pedido\") */\n valueLabelSingular?: string;\n /** Texto para melhor item (ex: \"Melhor horário\") */\n bestItemLabel?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function HorizontalBarChart({\n labels,\n datasets,\n tabs,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n bestItemLabel = \"Melhor item\",\n className,\n}: HorizontalBarChartProps) {\n const tabKeys = tabs ? tabs.map((t) => t.id) : Object.keys(datasets);\n const [activeTab, setActiveTab] = useState(tabKeys[0]);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 640);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\n }, []);\n\n const activeData = datasets[activeTab] || [];\n const maxValue = Math.max(...activeData);\n const bestIndex = activeData.indexOf(maxValue);\n const bestLabel = labels[bestIndex];\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const minBarValue = maxValue > 0 ? maxValue * 0.02 : 0.05;\n const displayData = activeData.map((v) => (v === 0 ? minBarValue : v));\n\n const chartData = {\n labels,\n datasets: [\n {\n label: valueLabel,\n data: displayData,\n backgroundColor: primaryColor,\n borderRadius: isMobile ? 8 : 4,\n barThickness: isMobile ? 36 : 24,\n },\n ],\n };\n\n const options = {\n indexAxis: \"y\" as const,\n responsive: true,\n maintainAspectRatio: false,\n layout: {\n padding: {\n right: isMobile ? 35 : 30,\n left: isMobile ? 10 : 0,\n top: isMobile ? 15 : 0,\n bottom: isMobile ? 15 : 0,\n },\n },\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: isMobile ? 6 : 12,\n displayColors: false,\n titleFont: { size: isMobile ? 10 : 12, weight: \"bold\" as const },\n bodyFont: { size: isMobile ? 9 : 11 },\n callbacks: {\n label: (context: { dataIndex: number }) => {\n const realValue = activeData[context.dataIndex];\n return realValue === 1\n ? `${realValue} ${singular}`\n : `${realValue} ${valueLabel}`;\n },\n },\n },\n },\n scales: {\n x: {\n beginAtZero: true,\n border: { display: false },\n grid: { display: false },\n ticks: { display: false },\n },\n y: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: isMobile ? 16 : 13 },\n padding: isMobile ? 12 : 4,\n },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-5 sm:p-6 min-h-[850px] sm:h-full flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n {tabs && tabs.length > 1 && (\n <div className=\"flex gap-2 mb-4 flex-wrap\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n \"px-3.5 py-2 sm:px-4 sm:py-2 rounded-full text-sm font-medium transition-colors whitespace-nowrap cursor-pointer\",\n activeTab === tab.id\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n )}\n\n {maxValue > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm sm:text-base text-[var(--dashboard-text-secondary,#6b7280)] mb-1\">\n {bestItemLabel}\n </p>\n <p className=\"text-xl sm:text-2xl font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {bestLabel}{\" \"}\n <span className=\"text-base font-normal text-[var(--dashboard-text-secondary,#6b7280)]\">\n {maxValue} {maxValue === 1 ? singular : valueLabel}\n </span>\n </p>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0\">\n <Bar key={`chart-${isMobile ? \"m\" : \"d\"}`} data={chartData} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n);\n\nexport interface VerticalBarChartProps {\n /** Labels do eixo X (ex: dias da semana) */\n labels: string[];\n /** Valores para cada label */\n data: number[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Cor das barras (default: --dashboard-primary) */\n color?: string;\n /** Label do tooltip (ex: \"vendas\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\") */\n valueLabelSingular?: string;\n /** Texto para melhor item (ex: \"Melhor dia\") */\n bestItemLabel?: string;\n /** Maximo de caracteres dos labels. Default: 3 */\n labelMaxChars?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function VerticalBarChart({\n labels,\n data: values,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n bestItemLabel = \"Melhor item\",\n labelMaxChars = 3,\n className,\n}: VerticalBarChartProps) {\n const maxValue = Math.max(...values);\n const bestIndex = values.indexOf(maxValue);\n const bestLabel = labels[bestIndex];\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const chartData = {\n labels,\n datasets: [\n {\n label: valueLabel,\n data: values,\n backgroundColor: primaryColor,\n borderRadius: { topLeft: 4, topRight: 4 },\n barThickness: 40,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n displayColors: false,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n callbacks: {\n label: (context: { parsed: { y: number | null } }) => {\n const v = context.parsed.y ?? 0;\n return v === 1 ? `${v} ${singular}` : `${v} ${valueLabel}`;\n },\n },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n callback: (_value: number | string, index: number): string => {\n return labels[index]\n ? labels[index].substring(0, labelMaxChars)\n : String(_value);\n },\n },\n },\n y: {\n beginAtZero: true,\n border: { display: false },\n grid: { display: false },\n ticks: { display: false },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6 flex-1 flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n {bestLabel && maxValue > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mb-1\">\n {bestItemLabel}\n </p>\n <p className=\"text-lg font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {bestLabel}{\" \"}\n <span className=\"text-sm font-normal text-[var(--dashboard-text-secondary,#6b7280)]\">\n {maxValue} {maxValue === 1 ? singular : valueLabel}\n </span>\n </p>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0 relative\">\n <Bar data={chartData} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Doughnut } from \"react-chartjs-2\";\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from \"chart.js\";\n\nChartJS.register(ArcElement, Tooltip, Legend);\n\nexport interface DoughnutChartItem {\n label: string;\n value: number;\n color?: string;\n}\n\nexport interface DoughnutChartProps {\n /** Dados do gráfico */\n items: DoughnutChartItem[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Texto central (ex: total) */\n centerLabel?: string;\n /** Valor central */\n centerValue?: string;\n /** Mostrar legenda lateral? Default: true */\n showLegend?: boolean;\n /** Formato dos valores na legenda */\n formatValue?: (value: number) => string;\n /** Espessura do anel (cutout %). Default: 65 */\n cutout?: number;\n /** Altura do grafico em px. Default: 240 */\n height?: number;\n className?: string;\n}\n\nconst DEFAULT_COLORS = [\n \"#2563EB\",\n \"#059669\",\n \"#D97706\",\n \"#DC2626\",\n \"#7C3AED\",\n \"#0891B2\",\n \"#DB2777\",\n \"#65A30D\",\n \"#EA580C\",\n \"#4F46E5\",\n];\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function DoughnutChart({\n items,\n title,\n titleIcon,\n centerLabel,\n centerValue,\n showLegend = true,\n formatValue,\n cutout = 65,\n height = 240,\n className,\n}: DoughnutChartProps) {\n const total = items.reduce((sum, item) => sum + item.value, 0);\n const format = formatValue || ((v: number) => String(v));\n\n const colors = items.map(\n (item, i) => item.color || DEFAULT_COLORS[i % DEFAULT_COLORS.length],\n );\n\n const chartData = {\n labels: items.map((i) => i.label),\n datasets: [\n {\n data: items.map((i) => i.value),\n backgroundColor: colors,\n borderColor: \"var(--dashboard-surface, #ffffff)\",\n borderWidth: 2,\n hoverOffset: 4,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n cutout: `${cutout}%`,\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n padding: 12,\n displayColors: true,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n callbacks: {\n label: (context: { label: string; parsed: number }) => {\n const pct =\n total > 0 ? ((context.parsed / total) * 100).toFixed(1) : \"0\";\n return ` ${context.label}: ${format(context.parsed)} (${pct}%)`;\n },\n },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n <div\n className={cn(\n \"flex items-center\",\n showLegend ? \"gap-6\" : \"justify-center\",\n )}\n >\n {/* Chart */}\n <div className=\"relative flex-shrink-0\" style={{ width: height, height }}>\n <Doughnut data={chartData} options={options} />\n {(centerLabel || centerValue) && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center pointer-events-none\">\n {centerValue && (\n <span className=\"text-2xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {centerValue}\n </span>\n )}\n {centerLabel && (\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {centerLabel}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Legend */}\n {showLegend && items.length > 0 && (\n <div className=\"flex-1 min-w-0 space-y-2\">\n {items.map((item, i) => {\n const pct =\n total > 0 ? ((item.value / total) * 100).toFixed(1) : \"0\";\n return (\n <div key={item.label} className=\"flex items-center gap-2\">\n <span\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\n style={{ backgroundColor: colors[i] }}\n />\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] truncate flex-1\">\n {item.label}\n </span>\n <span className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] whitespace-nowrap\">\n {format(item.value)}\n </span>\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap\">\n {pct}%\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface ProgressBarListItem {\n /** Label do item */\n label: string;\n /** Valor numerico */\n value: number;\n /** Icone opcional */\n icon?: ReactNode;\n}\n\nexport interface ProgressBarListProps {\n /** Itens da lista */\n items: ProgressBarListItem[];\n /** Titulo da lista */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: ReactNode;\n /** Cor da barra de progresso (default: --dashboard-primary) */\n color?: string;\n /** Label do valor (ex: \"vendas\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\") */\n valueLabelSingular?: string;\n /** Ordenar automaticamente por valor desc. Default: true */\n sortByValue?: boolean;\n /** Formatar valor customizado */\n formatValue?: (value: number) => string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ProgressBarList({\n items,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n sortByValue = true,\n formatValue,\n className,\n}: ProgressBarListProps) {\n const sortedItems = sortByValue\n ? [...items].sort((a, b) => b.value - a.value)\n : items;\n const maxValue = Math.max(...items.map((i) => i.value));\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const defaultFormat = (v: number) =>\n `${v} ${v === 1 ? singular : valueLabel}`;\n\n const fmt = formatValue || defaultFormat;\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6 flex-1 flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n <div className=\"space-y-6 flex-1 flex flex-col justify-center\">\n {sortedItems.map((item, index) => (\n <div key={index} className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-4 min-w-[180px]\">\n {item.icon && (\n <div\n className=\"w-10 h-10 rounded-lg flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: primaryColor }}\n >\n <div className=\"w-6 h-6 text-white\">{item.icon}</div>\n </div>\n )}\n <span className=\"text-base font-medium text-[var(--dashboard-text-secondary,#6b7280)]\">\n {item.label}\n </span>\n </div>\n <div className=\"flex items-center gap-4 flex-1\">\n <div className=\"flex-1 bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded-full h-3 overflow-hidden\">\n <div\n className=\"h-full transition-all duration-500 rounded-full\"\n style={{\n width:\n maxValue > 0\n ? `${(item.value / maxValue) * 100}%`\n : \"0%\",\n backgroundColor: primaryColor,\n }}\n />\n </div>\n <span\n className=\"text-base font-bold min-w-[90px] text-right\"\n style={{ color: primaryColor }}\n >\n {fmt(item.value)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { Line } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip as ChartTooltip,\n Legend,\n Filler,\n ChartData,\n ChartOptions,\n TooltipModel,\n} from \"chart.js\";\nimport { KPICard, KPIValueFormat } from \"../KPICard\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n ChartTooltip,\n Legend,\n Filler,\n);\n\nexport interface MetricPanelMetric {\n /** Chave unica da metrica */\n key: string;\n /** Label exibida na tab e KPI */\n label: string;\n /** Icone da tab */\n icon: React.ComponentType<{ className?: string }>;\n /** Label da legenda do periodo atual */\n currentLabel: string;\n /** Label da legenda do periodo anterior */\n previousLabel: string;\n /** Formato do valor */\n format: KPIValueFormat;\n /** Unidade opcional (ex: \"pedidos\") */\n unit?: string;\n /** Valores do KPI */\n kpiValue: {\n current: number;\n previous: number;\n variation: number;\n trend: \"up\" | \"down\" | \"stable\";\n };\n}\n\nexport interface MetricPanelChartData {\n labels: string[];\n metrics: Record<\n string,\n { currentPeriod: number[]; previousPeriod: number[] }\n >;\n}\n\nexport interface MetricPanelTooltipConfig {\n enabled: boolean;\n showButton?: boolean;\n buttonLabel?: string;\n onButtonClick?: (dataIndex: number, date: string) => void;\n customContent?: (params: {\n value: number;\n previousValue: number;\n variation: number;\n date: string;\n dayName: string;\n previousDate: string;\n formattedValue: string;\n formattedPrevious: string;\n metricUnit: string;\n }) => string;\n}\n\nexport interface MetricPanelProps {\n /** Titulo do painel */\n title: string;\n /** Icone do titulo */\n titleIcon: React.ComponentType<{ className?: string }>;\n /** Configuracoes das metricas */\n metrics: MetricPanelMetric[];\n /** Dados do grafico */\n chartData: MetricPanelChartData;\n /** Cor principal */\n color?: string;\n /** Cor secundaria (periodo anterior) */\n secondaryColor?: string;\n /** Callback do botao de acao */\n onActionClick?: () => void;\n /** Label do botao de acao */\n actionLabel?: string;\n /** Configuracao do tooltip interativo do grafico */\n tooltipConfig?: MetricPanelTooltipConfig;\n /** Estado de loading */\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction formatMetricValue(value: number, format: KPIValueFormat) {\n switch (format) {\n case \"currency\":\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\",\n }).format(value);\n case \"percentage\":\n return `${value.toFixed(2)}%`;\n case \"rating\":\n return value.toFixed(2);\n case \"number\":\n default:\n return new Intl.NumberFormat(\"pt-BR\").format(Math.round(value));\n }\n}\n\nfunction calculateVariation(current: number, previous: number) {\n if (previous === 0) return 0;\n return ((current - previous) / previous) * 100;\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction getTooltipDateInfo(label: string) {\n const dayNames = [\n \"Domingo\",\n \"Segunda\",\n \"Terca\",\n \"Quarta\",\n \"Quinta\",\n \"Sexta\",\n \"Sabado\",\n ];\n const [day, month] = label.split(\"/\").map(Number);\n\n if (!day || !month) {\n return {\n dayName: \"\",\n previousDate: \"\",\n };\n }\n\n const date = new Date(new Date().getFullYear(), month - 1, day);\n const previousDate = new Date(date);\n previousDate.setDate(previousDate.getDate() - 7);\n\n return {\n dayName: dayNames[date.getDay()],\n previousDate: `${String(previousDate.getDate()).padStart(2, \"0\")}/${String(\n previousDate.getMonth() + 1,\n ).padStart(2, \"0\")}`,\n };\n}\n\nexport function MetricPanel({\n title,\n titleIcon: TitleIcon,\n metrics,\n chartData,\n color,\n secondaryColor,\n onActionClick,\n actionLabel,\n tooltipConfig,\n isLoading = false,\n className,\n}: MetricPanelProps) {\n const [selectedMetricKey, setSelectedMetricKey] = useState(metrics[0]?.key);\n const [isMobile, setIsMobile] = useState(false);\n const hideTooltipTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const isTooltipHoveredRef = useRef(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 768);\n check();\n window.addEventListener(\"resize\", check);\n return () => {\n window.removeEventListener(\"resize\", check);\n if (hideTooltipTimeoutRef.current) {\n clearTimeout(hideTooltipTimeoutRef.current);\n }\n };\n }, []);\n\n const currentMetric =\n metrics.find((m) => m.key === selectedMetricKey) || metrics[0];\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const secColor = secondaryColor || `${primaryColor}66`;\n\n const renderExternalTooltip = (context: {\n chart: ChartJS;\n tooltip: TooltipModel<\"line\">;\n }) => {\n const { chart, tooltip } = context;\n const parent = chart.canvas.parentElement;\n if (!parent) return;\n\n let tooltipEl = parent.querySelector<HTMLDivElement>(\n \":scope > .metric-panel-chart-tooltip\",\n );\n\n if (!tooltipEl) {\n tooltipEl = document.createElement(\"div\");\n tooltipEl.className = \"metric-panel-chart-tooltip\";\n tooltipEl.style.position = \"absolute\";\n tooltipEl.style.pointerEvents = \"auto\";\n tooltipEl.style.transition = \"opacity 0.2s ease\";\n tooltipEl.style.zIndex = \"100\";\n tooltipEl.style.opacity = \"0\";\n const createdTooltipEl = tooltipEl;\n createdTooltipEl.addEventListener(\"mouseenter\", () => {\n isTooltipHoveredRef.current = true;\n if (hideTooltipTimeoutRef.current) {\n clearTimeout(hideTooltipTimeoutRef.current);\n hideTooltipTimeoutRef.current = null;\n }\n });\n createdTooltipEl.addEventListener(\"mouseleave\", () => {\n isTooltipHoveredRef.current = false;\n createdTooltipEl.style.opacity = \"0\";\n });\n parent.appendChild(createdTooltipEl);\n }\n\n if (hideTooltipTimeoutRef.current) {\n clearTimeout(hideTooltipTimeoutRef.current);\n hideTooltipTimeoutRef.current = null;\n }\n\n if (tooltip.opacity === 0) {\n hideTooltipTimeoutRef.current = setTimeout(() => {\n if (!isTooltipHoveredRef.current && tooltipEl) {\n tooltipEl.style.opacity = \"0\";\n }\n }, 300);\n return;\n }\n\n const dataPoint = tooltip.dataPoints?.find(\n (point) => point.datasetIndex === 0,\n );\n\n if (!dataPoint) {\n tooltipEl.style.opacity = \"0\";\n return;\n }\n\n const dataIndex = dataPoint.dataIndex;\n const label = dataPoint.label;\n const currentValue =\n typeof dataPoint.parsed.y === \"number\" ? dataPoint.parsed.y : 0;\n const previousValue =\n chartData.metrics[currentMetric.key]?.previousPeriod[dataIndex] || 0;\n const variation = calculateVariation(currentValue, previousValue);\n const formattedValue = formatMetricValue(\n currentValue,\n currentMetric.format,\n );\n const formattedPrevious = formatMetricValue(\n previousValue,\n currentMetric.format,\n );\n const { dayName, previousDate } = getTooltipDateInfo(label);\n const metricUnit = currentMetric.unit || \"\";\n const isButtonDisabled = currentValue === 0;\n const safeLabel = escapeHtml(label);\n const safeDayName = escapeHtml(dayName);\n const safePreviousDate = escapeHtml(previousDate);\n const safeMetricUnit = escapeHtml(metricUnit);\n const variationSign = variation > 0 ? \"+\" : \"\";\n const variationIcon = variation >= 0 ? \"▲\" : \"▼\";\n const variationColor =\n variation >= 0\n ? \"var(--dashboard-status-success,#10B981)\"\n : \"var(--dashboard-status-danger,#EF4444)\";\n\n if (tooltipConfig?.customContent) {\n tooltipEl.innerHTML = tooltipConfig.customContent({\n value: currentValue,\n previousValue,\n variation,\n date: label,\n dayName,\n previousDate,\n formattedValue,\n formattedPrevious,\n metricUnit,\n });\n } else {\n tooltipEl.innerHTML = `\n <div style=\"\n background: var(--dashboard-surface,#ffffff);\n border-radius: 8px;\n box-shadow: 0 8px 20px rgba(15, 23, 42, 0.14);\n border: 1px solid rgba(93, 114, 128, 0.2);\n color: var(--dashboard-text-primary,#2d2d2d);\n padding: 12px;\n min-width: 220px;\n max-width: 250px;\n font-family: inherit;\n \">\n <div style=\"\n font-size: 11px;\n font-weight: 500;\n color: var(--dashboard-text-secondary,#6b7280);\n margin-bottom: 8px;\n \">\n ${safeDayName ? `${safeDayName} ` : \"\"}${safeLabel}\n </div>\n <div style=\"\n display: flex;\n align-items: baseline;\n gap: 6px;\n margin-bottom: 10px;\n \">\n <div style=\"\n font-size: 22px;\n font-weight: 700;\n color: ${primaryColor};\n line-height: 1;\n \">\n ${escapeHtml(formattedValue)}${safeMetricUnit ? ` ${safeMetricUnit}` : \"\"}\n </div>\n <div style=\"\n display: flex;\n align-items: center;\n gap: 3px;\n color: ${variationColor};\n font-size: 13px;\n font-weight: 600;\n \">\n <span style=\"font-size: 10px;\">${variationIcon}</span>\n <span>${variationSign}${Math.abs(variation).toFixed(2)}%</span>\n </div>\n </div>\n <div style=\"\n font-size: 11px;\n color: var(--dashboard-text-secondary,#6b7280);\n line-height: 1.35;\n margin-bottom: ${tooltipConfig?.showButton ? \"10px\" : \"0\"};\n padding-bottom: ${tooltipConfig?.showButton ? \"10px\" : \"0\"};\n border-bottom: ${tooltipConfig?.showButton ? \"1px solid rgba(93, 114, 128, 0.2)\" : \"none\"};\n \">\n em relacao aos <strong style=\"color: var(--dashboard-text-primary,#2d2d2d);\">${escapeHtml(\n formattedPrevious,\n )}${safeMetricUnit ? ` ${safeMetricUnit}` : \"\"}</strong>${\n safePreviousDate\n ? ` do dia <strong style=\"color: var(--dashboard-text-primary,#2d2d2d);\">${safePreviousDate}</strong>`\n : \"\"\n }\n </div>\n ${\n tooltipConfig?.showButton && tooltipConfig.buttonLabel\n ? `\n <button type=\"button\" data-tooltip-action ${isButtonDisabled ? \"disabled\" : \"\"} style=\"\n width: 100%;\n padding: 8px 12px;\n background: ${isButtonDisabled ? \"rgba(93, 114, 128, 0.08)\" : \"var(--dashboard-surface,#ffffff)\"};\n color: ${isButtonDisabled ? \"var(--dashboard-text-secondary,#6b7280)\" : primaryColor};\n border: 2px solid ${isButtonDisabled ? \"rgba(93, 114, 128, 0.2)\" : primaryColor};\n border-radius: 6px;\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n cursor: ${isButtonDisabled ? \"not-allowed\" : \"pointer\"};\n opacity: ${isButtonDisabled ? \"0.65\" : \"1\"};\n \">\n ${escapeHtml(tooltipConfig.buttonLabel)}\n </button>\n `\n : \"\"\n }\n </div>\n `;\n }\n\n const actionButton = tooltipEl.querySelector<HTMLButtonElement>(\n \"[data-tooltip-action]\",\n );\n if (actionButton && !isButtonDisabled) {\n actionButton.onclick = () =>\n tooltipConfig?.onButtonClick?.(dataIndex, label);\n actionButton.onmouseenter = () => {\n actionButton.style.background = primaryColor;\n actionButton.style.color = \"#ffffff\";\n };\n actionButton.onmouseleave = () => {\n actionButton.style.background = \"var(--dashboard-surface,#ffffff)\";\n actionButton.style.color = primaryColor;\n };\n }\n\n const tooltipWidth = 250;\n const tooltipHeight = tooltipConfig?.showButton ? 180 : 140;\n const offsetX = 15;\n const centerY = Math.max(0, (chart.height - tooltipHeight) / 2);\n const isNearRightEdge =\n tooltip.caretX > chart.width - tooltipWidth - offsetX;\n\n tooltipEl.style.opacity = \"1\";\n tooltipEl.style.top = `${centerY}px`;\n\n if (isNearRightEdge) {\n tooltipEl.style.left = \"auto\";\n tooltipEl.style.right = `${chart.width - tooltip.caretX + offsetX}px`;\n } else {\n tooltipEl.style.left = `${tooltip.caretX + offsetX}px`;\n tooltipEl.style.right = \"auto\";\n }\n };\n\n const data: ChartData<\"line\"> = {\n labels: chartData.labels,\n datasets: [\n {\n label: currentMetric.currentLabel,\n data: chartData.metrics[currentMetric.key]?.currentPeriod || [],\n borderColor: primaryColor,\n borderWidth: isMobile ? 3.5 : 3,\n tension: 0,\n fill: false,\n pointRadius: 0,\n pointHoverRadius: isMobile ? 10 : 8,\n pointHoverBackgroundColor: primaryColor,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 3,\n },\n {\n label: currentMetric.previousLabel,\n data: chartData.metrics[currentMetric.key]?.previousPeriod || [],\n borderColor: secColor,\n borderWidth: isMobile ? 3.5 : 3,\n tension: 0,\n fill: false,\n pointRadius: 0,\n pointHoverRadius: 0,\n },\n ],\n };\n\n const options: ChartOptions<\"line\"> = {\n responsive: true,\n maintainAspectRatio: false,\n layout: {\n padding: {\n left: isMobile ? 10 : 50,\n right: isMobile ? 10 : 50,\n top: isMobile ? 20 : 40,\n bottom: isMobile ? 10 : 20,\n },\n },\n plugins: {\n legend: {\n display: true,\n position: \"bottom\",\n onClick: () => {},\n labels: {\n usePointStyle: true,\n boxWidth: isMobile ? 8 : 6,\n boxHeight: isMobile ? 8 : 6,\n padding: isMobile ? 12 : 15,\n font: {\n size: isMobile ? 13 : 11,\n weight: isMobile ? \"bold\" : \"normal\",\n },\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n },\n },\n tooltip: {\n ...(tooltipConfig\n ? {\n enabled: false,\n position: \"nearest\" as const,\n external: tooltipConfig.enabled\n ? renderExternalTooltip\n : undefined,\n }\n : {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n }),\n },\n },\n scales: {\n x: {\n border: { display: false },\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: isMobile ? 12 : 11 },\n },\n },\n y: {\n beginAtZero: true,\n border: { display: false },\n grid: { color: \"rgba(0, 0, 0, 0.05)\" },\n ticks: { display: false, count: 5 },\n },\n },\n interaction: {\n intersect: false,\n mode: \"index\",\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n style={{ overflow: \"visible\" }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 md:p-6 pb-3 md:pb-4 border-b border-[var(--dashboard-text-secondary,#6b7280)]/10\">\n <h2 className=\"flex items-center gap-2 text-base md:text-lg font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <TitleIcon className=\"w-5 h-5\" />\n {title}\n </h2>\n {onActionClick && actionLabel && (\n <button\n onClick={onActionClick}\n className=\"px-3 md:px-4 py-1.5 md:py-2 text-xs md:text-sm font-medium border rounded-lg transition-colors cursor-pointer\"\n style={{\n color: primaryColor,\n borderColor: primaryColor,\n }}\n >\n {actionLabel}\n </button>\n )}\n </div>\n\n {/* KPI Cards */}\n <div className=\"p-4 md:p-6 pb-3 md:pb-4\">\n <div\n className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 md:gap-4\"\n style={{\n gridTemplateColumns:\n !isMobile && metrics.length <= 4\n ? `repeat(${metrics.length}, minmax(min-content, 1fr))`\n : undefined,\n }}\n >\n {metrics.map((metric) => (\n <KPICard\n key={metric.key}\n title={metric.label}\n value={metric.kpiValue.current}\n variation={metric.kpiValue.variation}\n trend={metric.kpiValue.trend}\n format={metric.format}\n isLoading={isLoading}\n />\n ))}\n </div>\n </div>\n\n {/* Metric Tabs */}\n <div className=\"px-4 md:px-6 pt-3 md:pt-4\">\n <div className=\"flex flex-wrap justify-center gap-2 md:gap-3\">\n {metrics.map((metric) => {\n const Icon = metric.icon;\n return (\n <button\n key={metric.key}\n onClick={() => setSelectedMetricKey(metric.key)}\n className={cn(\n \"flex items-center gap-2 px-4 md:px-6 py-2 rounded-full text-sm font-medium transition-colors cursor-pointer\",\n selectedMetricKey === metric.key\n ? \"bg-[var(--dashboard-surface,#ffffff)] border-2 text-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-surface,#ffffff)] border border-[var(--dashboard-text-secondary,#6b7280)]/30 text-[var(--dashboard-text-secondary,#6b7280)] hover:border-[var(--dashboard-text-secondary,#6b7280)]/50\",\n )}\n style={\n selectedMetricKey === metric.key\n ? { borderColor: primaryColor, color: primaryColor }\n : undefined\n }\n >\n <Icon className=\"w-4 h-4\" />\n {metric.label}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Chart */}\n <div\n className=\"px-4 md:px-6 pb-4 md:pb-6\"\n style={{ overflow: \"visible\", position: \"relative\", zIndex: 10 }}\n >\n <div\n className=\"h-[260px]\"\n style={{ overflow: \"visible\", position: \"relative\", zIndex: 10 }}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <div\n className=\"animate-spin rounded-full h-12 w-12 border-b-2 mx-auto mb-4\"\n style={{ borderColor: primaryColor }}\n />\n <p className=\"text-[var(--dashboard-text-secondary,#6b7280)]\">\n Carregando gráfico...\n </p>\n </div>\n </div>\n ) : (\n <Line data={data} options={options} />\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface FilterBarProps {\n /** Valor do campo de busca */\n searchValue?: string;\n /** Callback de mudanca do campo de busca */\n onSearchChange?: (value: string) => void;\n /** Placeholder do campo de busca */\n searchPlaceholder?: string;\n /** Slot para dropdowns, date pickers e outros filtros */\n children?: ReactNode;\n /** Slot para acoes extras (ex: botao de exportar) */\n actions?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function FilterBar({\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Buscar...\",\n children,\n actions,\n className,\n}: FilterBarProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 sm:flex-row sm:items-center sm:flex-wrap\",\n className,\n )}\n >\n {onSearchChange !== undefined && (\n <div className=\"flex-1 min-w-[200px]\">\n <div className=\"relative flex items-center w-full\">\n <svg\n className=\"absolute left-3 h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n value={searchValue || \"\"}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"flex h-10 w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] pl-10 pr-3 py-2 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm transition-colors duration-200 focus:border-[var(--dashboard-primary,#37a501)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] focus-visible:outline-none\"\n />\n </div>\n </div>\n )}\n\n {children && (\n <div className=\"flex flex-wrap items-center gap-2\">{children}</div>\n )}\n\n {actions && (\n <div className=\"flex items-center gap-2 sm:ml-auto\">{actions}</div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CheckboxProps {\n /** Input name */\n name?: string;\n /** Input id (defaults to name) */\n id?: string;\n /** Label text next to the checkbox */\n label?: string;\n /** Whether checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n /** Disable the checkbox */\n disabled?: boolean;\n /** Size variant */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Primary color override for checked state. Defaults to --dashboard-primary / #ff521d */\n primaryColor?: string;\n /** Additional className on the wrapper label */\n className?: string;\n /** Children rendered as label (takes precedence over label prop) */\n children?: React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\n// Exact values from dashboard.eaigarcom.com LoginForm.tsx:\n// h-4 w-4 (16px) rounded (4px)\n// after:left-[3px] after:top-0 after:w-[6px] after:h-[10px] after:border-r-2 after:border-b-2 after:rotate-45\n// Scaled proportionally for md (22px) and lg (28px)\nconst sizeConfig = {\n sm: { box: 16, radius: 4, icon: { w: 6, h: 10, left: 3, top: 0, border: 2 }, gap: 8, text: 13 },\n md: { box: 22, radius: 6, icon: { w: 8, h: 14, left: 4.5, top: 0, border: 2 }, gap: 10, text: 14 },\n lg: { box: 28, radius: 7, icon: { w: 10, h: 17, left: 6, top: 0, border: 2.5 }, gap: 12, text: 15 },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Checkbox({\n name,\n id,\n label,\n checked = false,\n onChange,\n disabled = false,\n size = \"md\",\n primaryColor,\n className,\n children,\n}: CheckboxProps) {\n const inputId = id || name;\n const cfg = sizeConfig[size];\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #37A501)\";\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n \"inline-flex items-center cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n style={{ gap: cfg.gap }}\n >\n {/* Hidden native input for form submission & accessibility */}\n <input\n type=\"checkbox\"\n id={inputId}\n name={name}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled}\n className=\"sr-only peer\"\n />\n\n {/* Custom checkbox box */}\n <span\n className=\"relative shrink-0 transition-all duration-200\"\n style={{\n width: cfg.box,\n height: cfg.box,\n borderRadius: cfg.radius,\n backgroundColor: checked ? resolvedColor : \"transparent\",\n border: checked\n ? `2px solid ${resolvedColor}`\n : \"2px solid rgba(45,45,45,0.2)\",\n boxShadow: checked\n ? `0 1px 3px color-mix(in srgb, ${resolvedColor} 25%, transparent)`\n : \"none\",\n }}\n aria-hidden=\"true\"\n >\n {/* Checkmark — CSS-only via rotated border trick */}\n <span\n className=\"absolute transition-opacity duration-150\"\n style={{\n opacity: checked ? 1 : 0,\n left: cfg.icon.left,\n top: cfg.icon.top,\n width: cfg.icon.w,\n height: cfg.icon.h,\n borderRight: `${cfg.icon.border}px solid #fff`,\n borderBottom: `${cfg.icon.border}px solid #fff`,\n transform: \"rotate(45deg)\",\n }}\n />\n </span>\n\n {/* Label text */}\n {(children || label) && (\n <span\n className=\"leading-none\"\n style={{\n fontSize: cfg.text,\n color: \"var(--dashboard-text-primary, #2d2d2d)\",\n }}\n >\n {children || label}\n </span>\n )}\n </label>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode, useState, useEffect } from \"react\";\nimport { Checkbox } from \"../Checkbox\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AuthField {\n /** Unique name / id for the field */\n name: string;\n /** Label displayed above the input (omit for placeholder-only mode) */\n label?: string;\n /** HTML input type */\n type?: \"text\" | \"email\" | \"password\" | \"tel\" | \"number\";\n /** Placeholder text */\n placeholder?: string;\n /** Whether the field is required */\n required?: boolean;\n /** Minimum length for validation */\n minLength?: number;\n /** Field-level error message */\n error?: string;\n}\n\nexport interface AuthLink {\n /** Link text */\n label: string;\n /** URL or click handler */\n href?: string;\n /** Link target (e.g., '_blank' for new tab) */\n target?: string;\n /** Custom click handler (takes precedence over href) */\n onClick?: () => void;\n}\n\nexport interface AuthCheckbox {\n /** Checkbox name */\n name: string;\n /** Checkbox label */\n label: string;\n /** Whether checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n}\n\nexport interface AuthBackground {\n /** Solid color, gradient, or CSS value for the page background */\n color?: string;\n /** Background image URL or element (for Next.js Image support) */\n image?: string;\n /** React element for the background (e.g., next/image with fill) */\n imageElement?: ReactNode;\n /** Overlay opacity (0-1) — rendered as bg-black/{opacity} */\n overlayOpacity?: number;\n /** Custom CSS for the background container */\n style?: React.CSSProperties;\n}\n\nexport interface AuthHeadline {\n /** Main headline text */\n text: string;\n /** Highlighted / accent portion (rendered on new line if not found inside text) */\n highlight?: string;\n /** Color of the main text (defaults to #faf3e1) */\n color?: string;\n /** Color of the highlighted text (defaults to primaryColor) */\n highlightColor?: string;\n}\n\nexport interface AuthBranding {\n /** Array of logo elements to render at the bottom-left */\n logos: ReactNode[];\n}\n\nexport interface AuthCardStyle {\n /** Card background color (defaults to #faf3e1) */\n background?: string;\n /** Card border radius in px (defaults to 16 = rounded-2xl) */\n borderRadius?: number;\n /** Card box shadow CSS */\n shadow?: string;\n /** Card max width in px (defaults to 420) */\n maxWidth?: number;\n /** Card padding in px (defaults to 32 = p-8) */\n padding?: number;\n /** Card border */\n border?: string;\n}\n\nexport interface AuthLayoutProps {\n // --- Content ---\n /** Logo element displayed at top of card */\n logo?: ReactNode;\n /** Page title (e.g., \"Painel de Controle\") */\n title: string;\n /** Subtitle / description below the title (supports ReactNode for inline formatting) */\n subtitle?: ReactNode;\n /** Global error message displayed above the form */\n error?: string;\n /** Global success message displayed above the form */\n success?: string;\n\n // --- Form ---\n /** Form field definitions */\n fields: AuthField[];\n /** Current field values keyed by field name */\n values: Record<string, string>;\n /** Callback when a field value changes */\n onFieldChange: (name: string, value: string) => void;\n /** Submit handler */\n onSubmit: (values: Record<string, string>) => void;\n /** Submit button label */\n submitLabel?: string;\n /** Loading label while submitting */\n loadingLabel?: string;\n /** Whether the form is currently submitting */\n isLoading?: boolean;\n /** Checkbox between fields and submit (e.g., \"Lembrar conta\") */\n checkbox?: AuthCheckbox;\n\n // --- Links ---\n /** Primary link below the form */\n primaryLink?: AuthLink;\n /** Secondary link / text (e.g., \"Ainda nao tem cadastro? Cadastre-se\") */\n secondaryLink?: AuthLink & { prefix?: string };\n\n // --- Extra content ---\n /** Content rendered between the submit button and the links */\n extraContent?: ReactNode;\n /** Content rendered above the form (below title/subtitle) */\n headerContent?: ReactNode;\n /** Content rendered just above the submit button (e.g., resend code link) */\n beforeSubmitContent?: ReactNode;\n /** Content rendered at the very bottom of the card */\n footerContent?: ReactNode;\n\n // --- Layout ---\n /** Headline text displayed over the background (top-left, hidden on mobile) */\n headline?: AuthHeadline;\n /** Branding logos at the bottom-left over the background (hidden on mobile) */\n branding?: AuthBranding;\n /** Card horizontal position */\n cardPosition?: \"left\" | \"center\" | \"right\";\n /** Right padding for the card container on lg screens (defaults to 256 = pr-64) */\n cardOffsetRight?: number;\n\n // --- Theming ---\n /** Background configuration */\n background?: AuthBackground;\n /** Card styling overrides */\n cardStyle?: AuthCardStyle;\n /** Primary color (buttons, links, focus rings, checkbox). Defaults to #ff521d */\n primaryColor?: string;\n /** Text color for the title */\n titleColor?: string;\n /** Text alignment for the card header (title + subtitle). Defaults to \"center\" */\n titleAlign?: \"left\" | \"center\" | \"right\";\n\n /** Additional class name for the outermost container */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\n/** Resolves a CSS color value (including var() references) to a computed hex/rgb string */\nfunction useResolvedColor(cssValue: string): string {\n const [resolved, setResolved] = useState(cssValue);\n\n useEffect(() => {\n // If it's already a plain color (not a var()), use as-is\n if (!cssValue.startsWith(\"var(\")) {\n setResolved(cssValue);\n return;\n }\n\n // Create a hidden probe element to read the computed value\n const probe = document.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = cssValue;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n if (computed) setResolved(computed);\n document.body.removeChild(probe);\n }, [cssValue]);\n\n // Re-resolve when CSS vars change (DashboardProvider updates style on root)\n useEffect(() => {\n if (!cssValue.startsWith(\"var(\")) return;\n\n const observer = new MutationObserver(() => {\n const probe = document.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = cssValue;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n if (computed) setResolved(computed);\n document.body.removeChild(probe);\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"style\"],\n });\n\n return () => observer.disconnect();\n }, [cssValue]);\n\n return resolved;\n}\n\n// ---------------------------------------------------------------------------\n// AuthInput — matches Eai Garcom: h-12 rounded-lg border-2 bg-transparent\n// ---------------------------------------------------------------------------\n\nfunction AuthInput({\n name,\n label,\n type = \"text\",\n placeholder,\n required,\n minLength,\n value,\n onChange,\n error,\n resolvedColor,\n computedColor,\n disabled,\n}: {\n name: string;\n label?: string;\n type?: string;\n placeholder?: string;\n required?: boolean;\n minLength?: number;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n error?: string;\n resolvedColor: string;\n computedColor: string;\n disabled?: boolean;\n}) {\n return (\n <div>\n {label && (\n <label\n htmlFor={name}\n className=\"block text-sm font-medium text-[#2d2d2d] mb-1.5\"\n >\n {label}\n </label>\n )}\n <input\n type={type}\n id={name}\n name={name}\n placeholder={placeholder}\n required={required}\n minLength={minLength}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className=\"w-full h-12 rounded-lg border-2 border-[#2d2d2d]/20 bg-transparent px-4 text-sm text-[#2d2d2d] placeholder:text-[#2d2d2d]/60 focus:outline-none transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n ...(error\n ? { borderColor: \"var(--dashboard-status-danger, #EF4444)\" }\n : {}),\n }}\n onFocus={(e) => {\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${computedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n />\n {error && (\n <p className=\"text-xs mt-1 text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// PasswordInput — h-12 with eye toggle, same border style\n// ---------------------------------------------------------------------------\n\nfunction PasswordInput({\n value,\n onChange,\n placeholder,\n name,\n required,\n minLength,\n error,\n resolvedColor,\n computedColor,\n disabled,\n}: {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder?: string;\n name: string;\n required?: boolean;\n minLength?: number;\n error?: string;\n resolvedColor: string;\n computedColor: string;\n disabled?: boolean;\n}) {\n const [visible, setVisible] = useState(false);\n\n return (\n <div>\n <div className=\"relative\">\n <input\n type={visible ? \"text\" : \"password\"}\n id={name}\n name={name}\n placeholder={placeholder}\n required={required}\n minLength={minLength}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className=\"w-full h-12 rounded-lg border-2 border-[#2d2d2d]/20 bg-transparent px-4 pr-11 text-sm text-[#2d2d2d] placeholder:text-[#2d2d2d]/60 focus:outline-none transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n onFocus={(e) => {\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${computedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n />\n <button\n type=\"button\"\n onClick={() => setVisible((v) => !v)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-[#2d2d2d]/50 hover:text-[#2d2d2d] transition-colors cursor-pointer bg-transparent border-none p-0\"\n tabIndex={-1}\n aria-label={visible ? \"Ocultar senha\" : \"Mostrar senha\"}\n disabled={disabled}\n >\n {visible ? (\n // EyeOff icon (lucide)\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n // Eye icon (lucide)\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n {error && (\n <p className=\"text-xs mt-1 text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AuthLayout({\n logo,\n title,\n subtitle,\n error,\n success,\n fields,\n values,\n onFieldChange,\n onSubmit,\n submitLabel = \"Acessar\",\n loadingLabel = \"Entrando...\",\n isLoading = false,\n checkbox,\n primaryLink,\n secondaryLink,\n extraContent,\n headerContent,\n beforeSubmitContent,\n footerContent,\n headline,\n branding,\n cardPosition = \"right\",\n cardOffsetRight = 256,\n background,\n cardStyle,\n primaryColor,\n titleColor,\n titleAlign = \"center\",\n className,\n}: AuthLayoutProps) {\n // CSS var string for style props (e.g., backgroundColor, color)\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #ff521d)\";\n // Computed hex/rgb value for JS string concatenation (e.g., focus ring shadow with opacity)\n const computedColor = useResolvedColor(resolvedColor);\n\n // Background\n const bgCss: React.CSSProperties = {\n backgroundColor: background?.color || \"#1a1a1a\",\n ...background?.style,\n };\n\n // Card\n const cardBg = cardStyle?.background || \"var(--dashboard-secondary, #faf3e1)\";\n const cardCss: React.CSSProperties = {\n backgroundColor: cardBg,\n borderRadius: cardStyle?.borderRadius ?? 16,\n boxShadow:\n cardStyle?.shadow ??\n \"0 0 0 1px rgb(0 0 0 / 0.08), 0 0 12px 4px rgb(0 0 0 / 0.25), 0 0 28px 10px rgb(0 0 0 / 0.20)\",\n maxWidth: cardStyle?.maxWidth ?? 420,\n padding: cardStyle?.padding ?? 32,\n border: cardStyle?.border || \"none\",\n width: \"100%\",\n };\n\n\n\n\n function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n onSubmit(values);\n }\n\n function renderLink(link: AuthLink, extraClass?: string) {\n const style: React.CSSProperties = { color: resolvedColor };\n if (link.onClick) {\n return (\n <button\n type=\"button\"\n onClick={link.onClick}\n className={cn(\n \"bg-transparent border-none cursor-pointer hover:opacity-80 text-sm font-semibold p-0 transition-colors\",\n extraClass,\n )}\n style={style}\n >\n {link.label}\n </button>\n );\n }\n return (\n <a\n href={link.href}\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n className={cn(\n \"hover:opacity-80 text-sm font-semibold transition-colors\",\n extraClass,\n )}\n style={style}\n >\n {link.label}\n </a>\n );\n }\n\n return (\n <div\n className={cn(\"fixed inset-0 flex select-none overflow-hidden\", className)}\n style={bgCss}\n >\n {/* Background left spacer for branding (hidden on mobile) */}\n {branding && branding.logos.length > 0 && (\n <div className=\"relative hidden w-1/3 lg:block\">\n <div className=\"absolute bottom-12 left-12 z-20\">\n <div className=\"flex gap-4 items-center\">\n {branding.logos.map((brandLogo, i) => (\n <React.Fragment key={i}>{brandLogo}</React.Fragment>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Background image */}\n {background?.imageElement ? (\n <div className=\"absolute inset-0 z-0\">{background.imageElement}</div>\n ) : background?.image ? (\n <img\n src={background.image}\n alt=\"\"\n className=\"absolute inset-0 z-0 h-full w-full object-cover\"\n draggable={false}\n />\n ) : null}\n\n {/* Background overlay — bg-black/20 by default */}\n {(background?.image || background?.imageElement) && (\n <div\n className=\"absolute inset-0 z-10\"\n style={{\n backgroundColor: `rgba(0,0,0,${background?.overlayOpacity ?? 0.2})`,\n }}\n />\n )}\n\n {/* Headline — top-left, hidden on mobile */}\n {headline && (\n <div className=\"absolute top-12 left-8 z-20 max-w-md hidden lg:block\">\n <h1\n className=\"text-4xl font-bold mb-4 leading-tight\"\n style={{ color: headline.color || \"#faf3e1\" }}\n >\n {headline.highlight\n ? (() => {\n const idx = headline.text.indexOf(headline.highlight);\n if (idx === -1) {\n return (\n <>\n {headline.text}\n <br />\n <span\n style={{\n color: headline.highlightColor || resolvedColor,\n }}\n >\n {headline.highlight}\n </span>\n </>\n );\n }\n const before = headline.text.slice(0, idx);\n const after = headline.text.slice(\n idx + headline.highlight.length,\n );\n return (\n <>\n {before}\n <span\n style={{\n color: headline.highlightColor || resolvedColor,\n }}\n >\n {headline.highlight}\n </span>\n {after}\n </>\n );\n })()\n : headline.text}\n </h1>\n </div>\n )}\n\n {/* Responsive offset CSS — only applies on lg+ */}\n <style>{`\n .auth-card-container {\n padding-left: 1rem;\n padding-right: 1rem;\n justify-content: center;\n align-content: center;\n }\n @media (min-width: 1024px) {\n .auth-card-container[data-position=\"right\"] {\n justify-content: flex-end;\n padding-right: ${cardOffsetRight}px;\n }\n .auth-card-container[data-position=\"left\"] {\n justify-content: flex-start;\n padding-left: ${cardOffsetRight}px;\n }\n .auth-card-container[data-position=\"center\"] {\n justify-content: center;\n }\n }\n `}</style>\n\n {/* Card container — z-30, flex w-full items-center */}\n <div\n className=\"auth-card-container relative z-30 flex w-full items-center py-8\"\n data-position={cardPosition}\n >\n <div style={{ ...cardCss, maxHeight: \"calc(100vh - 64px)\", overflowY: \"auto\" }}>\n {/* Card header: logo + title + subtitle */}\n <div className={`mb-8 ${titleAlign === \"center\" ? \"text-center\" : titleAlign === \"right\" ? \"text-right\" : \"text-left\"}`}>\n {/* Logo */}\n {logo && (\n <div className={`mb-4 flex ${titleAlign === \"center\" ? \"justify-center\" : titleAlign === \"right\" ? \"justify-end\" : \"justify-start\"}`}>\n {logo}\n </div>\n )}\n\n {/* Title — text-2xl font-bold text-gray-900 mb-2 */}\n <h2\n className=\"text-2xl font-bold mb-2\"\n style={{\n color: titleColor || \"var(--dashboard-text-primary, #111827)\",\n }}\n >\n {title}\n </h2>\n\n {/* Subtitle — text-sm text-gray-600 */}\n {subtitle && (\n <p className=\"text-sm text-gray-600\">{subtitle}</p>\n )}\n </div>\n\n {/* Header content */}\n {headerContent}\n\n {/* Alerts */}\n {error && (\n <div className=\"p-3 rounded-lg text-sm text-center mb-5 bg-red-50 text-red-700 border border-red-200\">\n {error}\n </div>\n )}\n\n {success && (\n <div className=\"p-3 rounded-lg text-sm text-center mb-5 bg-green-50 text-green-700 border border-green-200\">\n {success}\n </div>\n )}\n\n {/* Form — space-y-5 */}\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n {fields.map((field) =>\n field.type === \"password\" ? (\n <PasswordInput\n key={field.name}\n name={field.name}\n placeholder={field.placeholder || field.label}\n required={field.required}\n minLength={field.minLength}\n value={values[field.name] || \"\"}\n onChange={(e) =>\n onFieldChange(field.name, e.target.value)\n }\n error={field.error}\n resolvedColor={resolvedColor}\n computedColor={computedColor}\n disabled={isLoading}\n />\n ) : (\n <AuthInput\n key={field.name}\n name={field.name}\n label={field.label}\n type={field.type || \"text\"}\n placeholder={field.placeholder || field.label}\n required={field.required}\n minLength={field.minLength}\n value={values[field.name] || \"\"}\n onChange={(e) =>\n onFieldChange(field.name, e.target.value)\n }\n error={field.error}\n resolvedColor={resolvedColor}\n computedColor={computedColor}\n disabled={isLoading}\n />\n ),\n )}\n\n {/* Checkbox */}\n {checkbox && (\n <Checkbox\n name={checkbox.name}\n label={checkbox.label}\n checked={checkbox.checked || false}\n onChange={(val) => checkbox.onChange?.(val)}\n disabled={isLoading}\n primaryColor={resolvedColor}\n size=\"sm\"\n />\n )}\n\n {/* Before submit content (e.g., resend code) */}\n {beforeSubmitContent}\n\n {/* Submit button — h-12 rounded-lg font-bold text-base shadow-lg */}\n <button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full h-12 rounded-lg px-5 text-base font-bold text-white transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed shadow-lg hover:shadow-xl hover:opacity-90\"\n style={{\n backgroundColor: resolvedColor,\n \"--tw-ring-color\": resolvedColor,\n } as React.CSSProperties}\n >\n {isLoading ? loadingLabel : submitLabel}\n </button>\n </form>\n\n {/* Extra content */}\n {extraContent && <div className=\"mt-5\">{extraContent}</div>}\n\n {/* Links */}\n {(primaryLink || secondaryLink) && (\n <div className=\"mt-6 text-center\">\n {primaryLink && (\n <p className=\"text-sm text-gray-600\">\n {renderLink(primaryLink)}\n </p>\n )}\n {secondaryLink && (\n <p className={`text-sm text-gray-600 ${primaryLink ? \"mt-6\" : \"\"}`}>\n {secondaryLink.prefix && (\n <>{secondaryLink.prefix}{\" \"}</>\n )}\n {renderLink(secondaryLink)}\n </p>\n )}\n </div>\n )}\n\n {/* Footer content */}\n {footerContent && <div className=\"mt-6\">{footerContent}</div>}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useCallback, KeyboardEvent, ClipboardEvent } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CodeInputProps {\n /** Number of digit boxes (defaults to 6) */\n length?: number;\n /** Current value as a string (e.g. \"12\" for the first two digits filled) */\n value: string;\n /** Called with the full string whenever a digit changes */\n onChange: (value: string) => void;\n /** Disable all inputs */\n disabled?: boolean;\n /** Show error styling */\n error?: boolean;\n /** Primary / accent color for focused box border */\n primaryColor?: string;\n /** Additional className on the container */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function CodeInput({\n length = 6,\n value,\n onChange,\n disabled = false,\n error = false,\n primaryColor,\n className = \"\",\n}: CodeInputProps) {\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #ff521d)\";\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n\n const digits = value.split(\"\").concat(Array(length).fill(\"\")).slice(0, length);\n\n const focusInput = useCallback(\n (idx: number) => {\n const clamped = Math.max(0, Math.min(idx, length - 1));\n inputsRef.current[clamped]?.focus();\n },\n [length],\n );\n\n const updateValue = useCallback(\n (idx: number, digit: string) => {\n const arr = value.split(\"\").concat(Array(length).fill(\"\")).slice(0, length);\n arr[idx] = digit;\n // Trim trailing empty strings\n const newVal = arr.join(\"\").replace(/\\s+$/g, \"\");\n onChange(newVal);\n },\n [value, length, onChange],\n );\n\n const handleInput = useCallback(\n (idx: number, char: string) => {\n if (!/^\\d$/.test(char)) return;\n updateValue(idx, char);\n if (idx < length - 1) {\n focusInput(idx + 1);\n }\n },\n [updateValue, focusInput, length],\n );\n\n const handleKeyDown = useCallback(\n (idx: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\") {\n e.preventDefault();\n if (digits[idx] && digits[idx] !== \"\") {\n updateValue(idx, \"\");\n } else if (idx > 0) {\n updateValue(idx - 1, \"\");\n focusInput(idx - 1);\n }\n } else if (e.key === \"ArrowLeft\" && idx > 0) {\n e.preventDefault();\n focusInput(idx - 1);\n } else if (e.key === \"ArrowRight\" && idx < length - 1) {\n e.preventDefault();\n focusInput(idx + 1);\n }\n },\n [digits, updateValue, focusInput, length],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData(\"text\").replace(/\\D/g, \"\").slice(0, length);\n if (pasted.length > 0) {\n onChange(pasted);\n focusInput(Math.min(pasted.length, length - 1));\n }\n },\n [length, onChange, focusInput],\n );\n\n return (\n <div className={`flex justify-center gap-2 sm:gap-3 ${className}`}>\n {Array.from({ length }).map((_, idx) => (\n <input\n key={idx}\n ref={(el) => { inputsRef.current[idx] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={1}\n disabled={disabled}\n value={digits[idx] || \"\"}\n onChange={(e) => {\n const char = e.target.value.slice(-1);\n handleInput(idx, char);\n }}\n onKeyDown={(e) => handleKeyDown(idx, e)}\n onPaste={handlePaste}\n onFocus={(e) => {\n e.target.select();\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${resolvedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n className=\"w-10 h-11 sm:w-11 sm:h-12 text-center text-lg sm:text-xl font-bold rounded-lg border-2 bg-transparent text-[#2d2d2d] transition-all focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n borderColor: error\n ? \"var(--dashboard-status-danger, #EF4444)\"\n : \"rgba(45,45,45,0.2)\",\n }}\n />\n ))}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface SkeletonProps {\n variant?: \"text\" | \"circle\" | \"rectangle\" | \"card\";\n width?: string | number;\n height?: string | number;\n animate?: boolean;\n className?: string;\n lines?: number;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Skeleton({\n variant = \"text\",\n width,\n height,\n animate = true,\n className,\n lines = 1,\n}: SkeletonProps) {\n const baseStyles =\n \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 relative overflow-hidden\";\n const shimmerStyles = animate\n ? \"after:absolute after:inset-0 after:bg-gradient-to-r after:from-transparent after:via-[var(--dashboard-text-secondary,#6b7280)]/5 after:to-transparent dashboard-animate-shimmer after:content-['']\"\n : \"\";\n\n const variantStyles: Record<string, string> = {\n text: \"h-4 rounded\",\n circle: \"rounded-full\",\n rectangle: \"rounded-lg\",\n card: \"rounded-lg\",\n };\n\n const style: React.CSSProperties = {};\n if (width) style.width = typeof width === \"number\" ? `${width}px` : width;\n if (height) style.height = typeof height === \"number\" ? `${height}px` : height;\n\n if (variant === \"circle\" && !height) {\n style.height = style.width || \"40px\";\n if (!width) style.width = \"40px\";\n }\n\n if (variant === \"card\" && !height) {\n style.height = \"120px\";\n }\n\n if (variant === \"text\" && lines > 1) {\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n {Array.from({ length: lines }).map((_, i) => (\n <div\n key={i}\n className={cn(baseStyles, shimmerStyles, variantStyles.text)}\n style={{\n ...style,\n width: i === lines - 1 ? \"75%\" : style.width || \"100%\",\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={cn(baseStyles, shimmerStyles, variantStyles[variant], className)}\n style={style}\n />\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState, useCallback, ReactNode, useRef, useEffect } from \"react\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n createColumnHelper,\n type ColumnDef,\n type SortingState,\n type ColumnFiltersState,\n type RowSelectionState,\n type PaginationState,\n type Row,\n type Table as TanTable,\n} from \"@tanstack/react-table\";\nimport { ArrowUp, ArrowDown, ArrowUpDown, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { Skeleton } from \"../Skeleton\";\n\nexport type { ColumnDef as DataGridColumn };\nexport { createColumnHelper };\n\nexport interface DataGridProps<T> {\n columns: ColumnDef<T, unknown>[];\n data: T[];\n isLoading?: boolean;\n skeletonRows?: number;\n\n sorting?: SortingState;\n onSortingChange?: (sorting: SortingState) => void;\n\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n\n columnFilters?: ColumnFiltersState;\n onColumnFiltersChange?: (filters: ColumnFiltersState) => void;\n\n rowSelection?: RowSelectionState;\n onRowSelectionChange?: (selection: RowSelectionState) => void;\n enableRowSelection?: boolean | ((row: Row<T>) => boolean);\n\n pagination?: PaginationState;\n onPaginationChange?: (pagination: PaginationState) => void;\n pageCount?: number;\n manualPagination?: boolean;\n pageSizeOptions?: number[];\n\n onRowClick?: (row: T) => void;\n getRowId?: (row: T) => string;\n\n enableVirtualization?: boolean;\n rowHeight?: number;\n\n emptyMessage?: string;\n emptyIcon?: ReactNode;\n\n stickyHeader?: boolean;\n compact?: boolean;\n striped?: boolean;\n bordered?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction SortIcon({ sorted }: { sorted: false | \"asc\" | \"desc\" }) {\n if (sorted === \"asc\") return <ArrowUp className=\"h-3.5 w-3.5\" />;\n if (sorted === \"desc\") return <ArrowDown className=\"h-3.5 w-3.5\" />;\n return <ArrowUpDown className=\"h-3.5 w-3.5 opacity-40\" />;\n}\n\nfunction DataGridSkeleton({\n columns,\n rows,\n compact,\n}: {\n columns: number;\n rows: number;\n compact?: boolean;\n}) {\n const cellPadding = compact ? \"px-4 py-2\" : \"px-6 py-3\";\n return (\n <>\n {Array.from({ length: rows }).map((_, rowIdx) => (\n <tr key={rowIdx}>\n {Array.from({ length: columns }).map((_, colIdx) => (\n <td key={colIdx} className={cellPadding}>\n <Skeleton variant=\"text\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\nfunction VirtualRows<T>({\n table,\n rowHeight,\n onRowClick,\n compact,\n}: {\n table: TanTable<T>;\n rowHeight: number;\n onRowClick?: (row: T) => void;\n compact?: boolean;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [containerHeight, setContainerHeight] = useState(400);\n\n const rows = table.getRowModel().rows;\n const totalHeight = rows.length * rowHeight;\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerHeight(entry.contentRect.height);\n }\n });\n observer.observe(container);\n\n const handleScroll = () => {\n setScrollTop(container.scrollTop);\n };\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n observer.disconnect();\n container.removeEventListener(\"scroll\", handleScroll);\n };\n }, []);\n\n const overscan = 5;\n const startIndex = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);\n const endIndex = Math.min(\n rows.length,\n Math.ceil((scrollTop + containerHeight) / rowHeight) + overscan,\n );\n const visibleRows = rows.slice(startIndex, endIndex);\n\n const cellPadding = compact ? \"px-4 py-2\" : \"px-6 py-4\";\n\n return (\n <div\n ref={containerRef}\n className=\"overflow-auto\"\n style={{ maxHeight: containerHeight }}\n >\n <div style={{ height: totalHeight, position: \"relative\" }}>\n <table className=\"min-w-full divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n <thead className=\"bg-[var(--dashboard-text-secondary,#6b7280)]/5 sticky top-0 z-10\">\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n scope=\"col\"\n className={cn(\n \"text-left text-xs font-semibold text-[var(--dashboard-text-secondary,#6b7280)] uppercase tracking-wider\",\n compact ? \"px-4 py-2\" : \"px-6 py-3\",\n header.column.getCanSort() && \"cursor-pointer select-none\",\n )}\n style={{ width: header.getSize() }}\n onClick={header.column.getToggleSortingHandler()}\n >\n <div className=\"flex items-center gap-1\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {header.column.getCanSort() && (\n <SortIcon sorted={header.column.getIsSorted()} />\n )}\n </div>\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n <tr style={{ height: startIndex * rowHeight }}>\n <td colSpan={table.getAllColumns().length} />\n </tr>\n {visibleRows.map((row) => (\n <tr\n key={row.id}\n onClick={() => onRowClick?.(row.original)}\n className={cn(\n \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/5 transition-colors\",\n onRowClick && \"cursor-pointer\",\n row.getIsSelected() && \"bg-[var(--dashboard-primary,#37a501)]/5\",\n )}\n style={{ height: rowHeight }}\n >\n {row.getVisibleCells().map((cell) => (\n <td\n key={cell.id}\n className={cn(cellPadding, \"text-sm whitespace-nowrap\")}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))}\n <tr style={{ height: (rows.length - endIndex) * rowHeight }}>\n <td colSpan={table.getAllColumns().length} />\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nexport function DataGrid<T>({\n columns,\n data,\n isLoading = false,\n skeletonRows = 5,\n\n sorting: controlledSorting,\n onSortingChange,\n\n globalFilter: controlledGlobalFilter,\n onGlobalFilterChange,\n\n columnFilters: controlledColumnFilters,\n onColumnFiltersChange,\n\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n enableRowSelection = false,\n\n pagination: controlledPagination,\n onPaginationChange,\n pageCount,\n manualPagination = false,\n pageSizeOptions = [10, 20, 30, 50],\n\n onRowClick,\n getRowId,\n\n enableVirtualization = false,\n rowHeight = 48,\n\n emptyMessage = \"Nenhum registro encontrado\",\n emptyIcon,\n\n stickyHeader = false,\n compact = false,\n striped = false,\n bordered = false,\n className,\n}: DataGridProps<T>) {\n const [internalSorting, setInternalSorting] = useState<SortingState>([]);\n const [internalGlobalFilter, setInternalGlobalFilter] = useState(\"\");\n const [internalColumnFilters, setInternalColumnFilters] = useState<ColumnFiltersState>([]);\n const [internalRowSelection, setInternalRowSelection] = useState<RowSelectionState>({});\n const [internalPagination, setInternalPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: 10,\n });\n\n const sorting = controlledSorting ?? internalSorting;\n const globalFilter = controlledGlobalFilter ?? internalGlobalFilter;\n const columnFilters = controlledColumnFilters ?? internalColumnFilters;\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const pagination = controlledPagination ?? internalPagination;\n\n const handleSortingChange = useCallback(\n (updater: SortingState | ((old: SortingState) => SortingState)) => {\n const next = typeof updater === \"function\" ? updater(sorting) : updater;\n onSortingChange ? onSortingChange(next) : setInternalSorting(next);\n },\n [sorting, onSortingChange],\n );\n\n const handleGlobalFilterChange = useCallback(\n (updater: string | ((old: string) => string)) => {\n const next = typeof updater === \"function\" ? updater(globalFilter) : updater;\n onGlobalFilterChange ? onGlobalFilterChange(next) : setInternalGlobalFilter(next);\n },\n [globalFilter, onGlobalFilterChange],\n );\n\n const handleColumnFiltersChange = useCallback(\n (updater: ColumnFiltersState | ((old: ColumnFiltersState) => ColumnFiltersState)) => {\n const next = typeof updater === \"function\" ? updater(columnFilters) : updater;\n onColumnFiltersChange ? onColumnFiltersChange(next) : setInternalColumnFilters(next);\n },\n [columnFilters, onColumnFiltersChange],\n );\n\n const handleRowSelectionChange = useCallback(\n (updater: RowSelectionState | ((old: RowSelectionState) => RowSelectionState)) => {\n const next = typeof updater === \"function\" ? updater(rowSelection) : updater;\n onRowSelectionChange ? onRowSelectionChange(next) : setInternalRowSelection(next);\n },\n [rowSelection, onRowSelectionChange],\n );\n\n const handlePaginationChange = useCallback(\n (updater: PaginationState | ((old: PaginationState) => PaginationState)) => {\n const next = typeof updater === \"function\" ? updater(pagination) : updater;\n onPaginationChange ? onPaginationChange(next) : setInternalPagination(next);\n },\n [pagination, onPaginationChange],\n );\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n globalFilter,\n columnFilters,\n rowSelection,\n pagination,\n },\n onSortingChange: handleSortingChange as never,\n onGlobalFilterChange: handleGlobalFilterChange as never,\n onColumnFiltersChange: handleColumnFiltersChange as never,\n onRowSelectionChange: handleRowSelectionChange as never,\n onPaginationChange: handlePaginationChange as never,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: manualPagination ? undefined : getPaginationRowModel(),\n enableRowSelection,\n getRowId,\n manualPagination,\n pageCount,\n });\n\n const cellPadding = compact ? \"px-4 py-2\" : \"px-6 py-4\";\n const headerPadding = compact ? \"px-4 py-2\" : \"px-6 py-3\";\n\n if (enableVirtualization) {\n return (\n <div\n className={cn(\n \"overflow-hidden rounded-lg bg-[var(--dashboard-surface,#ffffff)] shadow-sm\",\n bordered && \"border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <VirtualRows\n table={table}\n rowHeight={rowHeight}\n onRowClick={onRowClick}\n compact={compact}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"overflow-hidden rounded-lg bg-[var(--dashboard-surface,#ffffff)] shadow-sm\",\n bordered && \"border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n <thead\n className={cn(\n \"bg-[var(--dashboard-text-secondary,#6b7280)]/5\",\n stickyHeader && \"sticky top-0 z-10\",\n )}\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n scope=\"col\"\n className={cn(\n \"text-left text-xs font-semibold text-[var(--dashboard-text-secondary,#6b7280)] uppercase tracking-wider\",\n headerPadding,\n header.column.getCanSort() && \"cursor-pointer select-none\",\n )}\n style={header.getSize() !== 150 ? { width: header.getSize() } : undefined}\n onClick={header.column.getToggleSortingHandler()}\n >\n <div className=\"flex items-center gap-1\">\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {header.column.getCanSort() && (\n <SortIcon sorted={header.column.getIsSorted()} />\n )}\n </div>\n </th>\n ))}\n </tr>\n ))}\n </thead>\n\n <tbody className=\"divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n {isLoading ? (\n <DataGridSkeleton\n columns={columns.length}\n rows={skeletonRows}\n compact={compact}\n />\n ) : table.getRowModel().rows.length === 0 ? (\n <tr>\n <td colSpan={columns.length} className=\"py-12\">\n <div className=\"text-center\">\n {emptyIcon || (\n <svg\n className=\"mx-auto h-10 w-10 text-[var(--dashboard-text-secondary,#6b7280)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )}\n <p className=\"mt-3 text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {emptyMessage}\n </p>\n </div>\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row, rowIndex) => (\n <tr\n key={row.id}\n onClick={() => onRowClick?.(row.original)}\n className={cn(\n \"transition-colors\",\n onRowClick && \"cursor-pointer\",\n \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/5\",\n row.getIsSelected() && \"bg-[var(--dashboard-primary,#37a501)]/5\",\n striped && rowIndex % 2 === 1 && \"bg-[var(--dashboard-text-secondary,#6b7280)]/3\",\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td\n key={cell.id}\n className={cn(\n cellPadding,\n \"text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {(onPaginationChange || !manualPagination) &&\n table.getPageCount() > 1 && (\n <div className=\"flex items-center justify-between gap-4 flex-wrap border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <select\n value={pagination.pageSize}\n onChange={(e) =>\n handlePaginationChange({\n pageIndex: 0,\n pageSize: Number(e.target.value),\n })\n }\n className=\"rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] px-2 py-1 text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n por pagina\n </span>\n </div>\n\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n Pagina {pagination.pageIndex + 1} de {table.getPageCount()}\n </span>\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n className=\"rounded-md p-1.5 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 disabled:opacity-40 disabled:cursor-not-allowed transition-colors cursor-pointer\"\n aria-label=\"Pagina anterior\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n className=\"rounded-md p-1.5 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 disabled:opacity-40 disabled:cursor-not-allowed transition-colors cursor-pointer\"\n aria-label=\"Proxima pagina\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useCallback, ReactNode } from \"react\";\nimport { ChevronRight, GripVertical } from \"lucide-react\";\n\nexport interface TreeNode {\n id: string;\n label: string;\n children?: TreeNode[];\n icon?: ReactNode;\n badge?: ReactNode;\n actions?: ReactNode;\n disabled?: boolean;\n data?: unknown;\n}\n\nexport interface TreeViewProps {\n nodes: TreeNode[];\n onSelect?: (node: TreeNode) => void;\n onExpand?: (nodeId: string, expanded: boolean) => void;\n onMove?: (nodeId: string, targetId: string, position: \"before\" | \"after\" | \"inside\") => void;\n renderNode?: (node: TreeNode, isSelected: boolean, isExpanded: boolean) => ReactNode;\n selectedId?: string;\n defaultExpanded?: string[];\n draggable?: boolean;\n indentSize?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\ninterface TreeItemProps {\n node: TreeNode;\n level: number;\n expanded: Set<string>;\n selectedId?: string;\n draggable?: boolean;\n indentSize: number;\n onSelect?: (node: TreeNode) => void;\n onToggle: (nodeId: string) => void;\n onMove?: TreeViewProps[\"onMove\"];\n renderNode?: TreeViewProps[\"renderNode\"];\n dragState: DragState;\n setDragState: React.Dispatch<React.SetStateAction<DragState>>;\n}\n\ninterface DragState {\n draggingId: string | null;\n targetId: string | null;\n position: \"before\" | \"after\" | \"inside\" | null;\n}\n\nfunction TreeItem({\n node,\n level,\n expanded,\n selectedId,\n draggable,\n indentSize,\n onSelect,\n onToggle,\n onMove,\n renderNode,\n dragState,\n setDragState,\n}: TreeItemProps) {\n const hasChildren = node.children && node.children.length > 0;\n const isExpanded = expanded.has(node.id);\n const isSelected = selectedId === node.id;\n const isDragging = dragState.draggingId === node.id;\n const isDropTarget = dragState.targetId === node.id;\n\n const handleDragStart = (e: React.DragEvent) => {\n if (!draggable || node.disabled) return;\n e.dataTransfer.setData(\"text/plain\", node.id);\n e.dataTransfer.effectAllowed = \"move\";\n setDragState((prev) => ({ ...prev, draggingId: node.id }));\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n if (!draggable || !dragState.draggingId || dragState.draggingId === node.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const y = e.clientY - rect.top;\n const height = rect.height;\n\n let position: \"before\" | \"after\" | \"inside\";\n if (y < height * 0.25) position = \"before\";\n else if (y > height * 0.75) position = \"after\";\n else position = \"inside\";\n\n setDragState((prev) => ({ ...prev, targetId: node.id, position }));\n };\n\n const handleDragLeave = () => {\n setDragState((prev) => {\n if (prev.targetId === node.id) return { ...prev, targetId: null, position: null };\n return prev;\n });\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n if (\n !draggable ||\n !dragState.draggingId ||\n !dragState.position ||\n dragState.draggingId === node.id\n )\n return;\n\n onMove?.(dragState.draggingId, node.id, dragState.position);\n setDragState({ draggingId: null, targetId: null, position: null });\n };\n\n const handleDragEnd = () => {\n setDragState({ draggingId: null, targetId: null, position: null });\n };\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined} aria-selected={isSelected}>\n <div\n className={cn(\n \"group flex items-center gap-1 rounded-md px-2 py-1.5 transition-colors\",\n isSelected\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-primary,#2d2d2d)]\",\n isDragging && \"opacity-40\",\n isDropTarget && dragState.position === \"inside\" && \"ring-2 ring-[var(--dashboard-primary,#37a501)] ring-inset\",\n node.disabled && \"opacity-50 cursor-not-allowed\",\n )}\n style={{ paddingLeft: `${level * indentSize + 4}px` }}\n draggable={draggable && !node.disabled}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n >\n {isDropTarget && dragState.position === \"before\" && (\n <div className=\"absolute left-0 right-0 top-0 h-0.5 bg-[var(--dashboard-primary,#37a501)]\" />\n )}\n {isDropTarget && dragState.position === \"after\" && (\n <div className=\"absolute left-0 right-0 bottom-0 h-0.5 bg-[var(--dashboard-primary,#37a501)]\" />\n )}\n\n {draggable && !node.disabled && (\n <span className=\"flex-shrink-0 opacity-0 group-hover:opacity-60 cursor-grab active:cursor-grabbing\">\n <GripVertical className=\"h-3.5 w-3.5 text-[var(--dashboard-text-secondary,#6b7280)]\" />\n </span>\n )}\n\n <button\n type=\"button\"\n onClick={() => hasChildren && onToggle(node.id)}\n className={cn(\n \"flex-shrink-0 w-5 h-5 flex items-center justify-center rounded transition-transform\",\n hasChildren ? \"cursor-pointer\" : \"invisible\",\n )}\n tabIndex={hasChildren ? 0 : -1}\n aria-label={isExpanded ? \"Recolher\" : \"Expandir\"}\n >\n <ChevronRight\n className={cn(\n \"h-3.5 w-3.5 transition-transform duration-150\",\n isExpanded && \"rotate-90\",\n )}\n />\n </button>\n\n {renderNode ? (\n <div\n className=\"flex-1 min-w-0 cursor-pointer\"\n onClick={() => !node.disabled && onSelect?.(node)}\n >\n {renderNode(node, isSelected, isExpanded)}\n </div>\n ) : (\n <>\n {node.icon && (\n <span className=\"flex-shrink-0 h-4 w-4\">{node.icon}</span>\n )}\n\n <span\n className={cn(\n \"flex-1 min-w-0 text-sm truncate\",\n !node.disabled && \"cursor-pointer\",\n )}\n onClick={() => !node.disabled && onSelect?.(node)}\n >\n {node.label}\n </span>\n\n {node.badge && <span className=\"flex-shrink-0\">{node.badge}</span>}\n\n {node.actions && (\n <span className=\"flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\">\n {node.actions}\n </span>\n )}\n </>\n )}\n </div>\n\n {hasChildren && isExpanded && (\n <ul role=\"group\" className=\"dashboard-animate-expand\">\n {node.children!.map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n level={level + 1}\n expanded={expanded}\n selectedId={selectedId}\n draggable={draggable}\n indentSize={indentSize}\n onSelect={onSelect}\n onToggle={onToggle}\n onMove={onMove}\n renderNode={renderNode}\n dragState={dragState}\n setDragState={setDragState}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nexport function TreeView({\n nodes,\n onSelect,\n onExpand,\n onMove,\n renderNode,\n selectedId,\n defaultExpanded = [],\n draggable = false,\n indentSize = 20,\n className,\n}: TreeViewProps) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set(defaultExpanded));\n const [dragState, setDragState] = useState<DragState>({\n draggingId: null,\n targetId: null,\n position: null,\n });\n\n const handleToggle = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n const willExpand = !next.has(nodeId);\n if (willExpand) next.add(nodeId);\n else next.delete(nodeId);\n onExpand?.(nodeId, willExpand);\n return next;\n });\n },\n [onExpand],\n );\n\n return (\n <ul role=\"tree\" className={cn(\"select-none\", className)}>\n {nodes.map((node) => (\n <TreeItem\n key={node.id}\n node={node}\n level={0}\n expanded={expanded}\n selectedId={selectedId}\n draggable={draggable}\n indentSize={indentSize}\n onSelect={onSelect}\n onToggle={handleToggle}\n onMove={onMove}\n renderNode={renderNode}\n dragState={dragState}\n setDragState={setDragState}\n />\n ))}\n </ul>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Check, AlertCircle } from \"lucide-react\";\n\nexport interface Step {\n id: string;\n label: string;\n description?: string;\n icon?: ReactNode;\n status?: \"pending\" | \"active\" | \"completed\" | \"error\";\n}\n\nexport interface StepperProps {\n steps: Step[];\n activeStep: number;\n onStepChange?: (index: number) => void;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction StepIcon({ step, index }: { step: Step; index: number }) {\n const status = step.status || \"pending\";\n\n if (status === \"completed\") {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)] text-white flex-shrink-0\">\n <Check className=\"h-4 w-4\" />\n </div>\n );\n }\n\n if (status === \"error\") {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[var(--dashboard-status-danger,#EF4444)] text-white flex-shrink-0\">\n <AlertCircle className=\"h-4 w-4\" />\n </div>\n );\n }\n\n if (status === \"active\") {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full border-2 border-[var(--dashboard-primary,#37a501)] bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)] flex-shrink-0\">\n {step.icon || (\n <span className=\"text-sm font-semibold\">{index + 1}</span>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full border-2 border-[var(--dashboard-text-secondary,#6b7280)]/30 text-[var(--dashboard-text-secondary,#6b7280)] flex-shrink-0\">\n {step.icon || (\n <span className=\"text-sm font-medium\">{index + 1}</span>\n )}\n </div>\n );\n}\n\nexport function Stepper({\n steps,\n activeStep,\n onStepChange,\n orientation = \"horizontal\",\n className,\n}: StepperProps) {\n const resolvedSteps = steps.map((step, i) => ({\n ...step,\n status:\n step.status ||\n (i < activeStep ? \"completed\" : i === activeStep ? \"active\" : \"pending\"),\n })) as (Step & { status: \"pending\" | \"active\" | \"completed\" | \"error\" })[];\n\n if (orientation === \"vertical\") {\n return (\n <nav aria-label=\"Progress\" className={className}>\n <ol className=\"flex flex-col\">\n {resolvedSteps.map((step, index) => (\n <li key={step.id} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <button\n type=\"button\"\n onClick={() => onStepChange?.(index)}\n disabled={!onStepChange}\n className={cn(\n \"relative z-10\",\n onStepChange && \"cursor-pointer\",\n !onStepChange && \"cursor-default\",\n )}\n aria-current={step.status === \"active\" ? \"step\" : undefined}\n >\n <StepIcon step={step} index={index} />\n </button>\n {index < resolvedSteps.length - 1 && (\n <div\n className={cn(\n \"w-0.5 flex-1 min-h-[32px]\",\n step.status === \"completed\"\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n />\n )}\n </div>\n\n <div className={cn(\"pb-6\", index === resolvedSteps.length - 1 && \"pb-0\")}>\n <p\n className={cn(\n \"text-sm font-medium leading-8\",\n step.status === \"active\"\n ? \"text-[var(--dashboard-primary,#37a501)]\"\n : step.status === \"completed\"\n ? \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n : step.status === \"error\"\n ? \"text-[var(--dashboard-status-danger,#EF4444)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] mt-0.5\">\n {step.description}\n </p>\n )}\n </div>\n </li>\n ))}\n </ol>\n </nav>\n );\n }\n\n return (\n <nav aria-label=\"Progress\" className={className}>\n <ol className=\"flex items-center\">\n {resolvedSteps.map((step, index) => (\n <li\n key={step.id}\n className={cn(\n \"flex items-center\",\n index < resolvedSteps.length - 1 && \"flex-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => onStepChange?.(index)}\n disabled={!onStepChange}\n className={cn(\n \"flex items-center gap-2 group\",\n onStepChange && \"cursor-pointer\",\n !onStepChange && \"cursor-default\",\n )}\n aria-current={step.status === \"active\" ? \"step\" : undefined}\n >\n <StepIcon step={step} index={index} />\n <div className=\"hidden sm:block text-left\">\n <p\n className={cn(\n \"text-sm font-medium whitespace-nowrap\",\n step.status === \"active\"\n ? \"text-[var(--dashboard-primary,#37a501)]\"\n : step.status === \"completed\"\n ? \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n : step.status === \"error\"\n ? \"text-[var(--dashboard-status-danger,#EF4444)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap\">\n {step.description}\n </p>\n )}\n </div>\n </button>\n\n {index < resolvedSteps.length - 1 && (\n <div\n className={cn(\n \"flex-1 h-0.5 mx-3\",\n step.status === \"completed\"\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n />\n )}\n </li>\n ))}\n </ol>\n </nav>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useCallback, useEffect, ReactNode } from \"react\";\nimport { Upload, X, File, Image as ImageIcon } from \"lucide-react\";\n\nexport interface UploadedFile {\n file: File;\n id: string;\n preview?: string;\n progress?: number;\n}\n\nexport interface FileUploadProps {\n accept?: string;\n maxSize?: number;\n multiple?: boolean;\n onUpload?: (files: File[]) => void;\n onRemove?: (fileId: string) => void;\n preview?: boolean;\n disabled?: boolean;\n label?: string;\n description?: string;\n icon?: ReactNode;\n maxFiles?: number;\n className?: string;\n files?: UploadedFile[];\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction isImageType(type: string): boolean {\n return type.startsWith(\"image/\");\n}\n\nexport function FileUpload({\n accept,\n maxSize,\n multiple = false,\n onUpload,\n onRemove,\n preview = true,\n disabled = false,\n label = \"Arraste arquivos aqui ou clique para selecionar\",\n description,\n icon,\n maxFiles,\n className,\n files: controlledFiles,\n}: FileUploadProps) {\n const [internalFiles, setInternalFiles] = useState<UploadedFile[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const files = controlledFiles || internalFiles;\n\n const validateFiles = useCallback(\n (fileList: File[]): File[] => {\n setError(null);\n const valid: File[] = [];\n\n for (const file of fileList) {\n if (maxSize && file.size > maxSize) {\n setError(`\"${file.name}\" excede o limite de ${formatSize(maxSize)}`);\n continue;\n }\n valid.push(file);\n }\n\n if (maxFiles) {\n const available = maxFiles - files.length;\n if (valid.length > available) {\n setError(`Limite de ${maxFiles} arquivos`);\n return valid.slice(0, Math.max(0, available));\n }\n }\n\n return valid;\n },\n [maxSize, maxFiles, files.length],\n );\n\n const addFiles = useCallback(\n (newFiles: File[]) => {\n const validated = validateFiles(newFiles);\n if (validated.length === 0) return;\n\n const uploaded: UploadedFile[] = validated.map((file) => ({\n file,\n id: `${file.name}-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n preview: isImageType(file.type) ? URL.createObjectURL(file) : undefined,\n }));\n\n if (!controlledFiles) {\n setInternalFiles((prev) => (multiple ? [...prev, ...uploaded] : uploaded));\n }\n\n onUpload?.(validated);\n },\n [validateFiles, multiple, onUpload, controlledFiles],\n );\n\n const handleRemove = useCallback(\n (fileId: string) => {\n if (!controlledFiles) {\n setInternalFiles((prev) => {\n const file = prev.find((f) => f.id === fileId);\n if (file?.preview) URL.revokeObjectURL(file.preview);\n return prev.filter((f) => f.id !== fileId);\n });\n }\n onRemove?.(fileId);\n },\n [onRemove, controlledFiles],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n const droppedFiles = Array.from(e.dataTransfer.files);\n addFiles(droppedFiles);\n },\n [addFiles, disabled],\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n },\n [disabled],\n );\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n }, []);\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const selected = e.target.files ? Array.from(e.target.files) : [];\n addFiles(selected);\n if (inputRef.current) inputRef.current.value = \"\";\n },\n [addFiles],\n );\n\n useEffect(() => {\n return () => {\n internalFiles.forEach((f) => {\n if (f.preview) URL.revokeObjectURL(f.preview);\n });\n };\n }, []);\n\n const descText =\n description ||\n [\n accept && `Formatos: ${accept}`,\n maxSize && `Tamanho max: ${formatSize(maxSize)}`,\n ]\n .filter(Boolean)\n .join(\" | \") ||\n undefined;\n\n return (\n <div className={className}>\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={() => !disabled && inputRef.current?.click()}\n className={cn(\n \"relative flex flex-col items-center justify-center rounded-lg border-2 border-dashed p-6 transition-colors\",\n isDragging\n ? \"border-[var(--dashboard-primary,#37a501)] bg-[var(--dashboard-primary,#37a501)]/5\"\n : \"border-[var(--dashboard-text-secondary,#6b7280)]/30 hover:border-[var(--dashboard-text-secondary,#6b7280)]/50\",\n disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer\",\n )}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={label}\n onKeyDown={(e) => {\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) {\n e.preventDefault();\n inputRef.current?.click();\n }\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleInputChange}\n className=\"hidden\"\n disabled={disabled}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n <div className=\"flex flex-col items-center text-center\">\n {icon || (\n <Upload\n className={cn(\n \"h-8 w-8 mb-3\",\n isDragging\n ? \"text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n />\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {label}\n </p>\n {descText && (\n <p className=\"mt-1 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {descText}\n </p>\n )}\n </div>\n </div>\n\n {error && (\n <p className=\"mt-2 text-xs text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n\n {preview && files.length > 0 && (\n <ul className=\"mt-3 space-y-2\">\n {files.map((uploaded) => (\n <li\n key={uploaded.id}\n className=\"flex items-center gap-3 rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] p-3\"\n >\n {uploaded.preview ? (\n <img\n src={uploaded.preview}\n alt={uploaded.file.name}\n className=\"h-10 w-10 rounded object-cover flex-shrink-0\"\n />\n ) : (\n <div className=\"flex h-10 w-10 items-center justify-center rounded bg-[var(--dashboard-text-secondary,#6b7280)]/10 flex-shrink-0\">\n {isImageType(uploaded.file.type) ? (\n <ImageIcon className=\"h-5 w-5 text-[var(--dashboard-text-secondary,#6b7280)]\" />\n ) : (\n <File className=\"h-5 w-5 text-[var(--dashboard-text-secondary,#6b7280)]\" />\n )}\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] truncate\">\n {uploaded.file.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {formatSize(uploaded.file.size)}\n </p>\n {uploaded.progress !== undefined && uploaded.progress < 100 && (\n <div className=\"mt-1 h-1 w-full rounded-full bg-[var(--dashboard-text-secondary,#6b7280)]/10 overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--dashboard-primary,#37a501)] transition-all duration-300\"\n style={{ width: `${uploaded.progress}%` }}\n />\n </div>\n )}\n </div>\n\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(uploaded.id);\n }}\n className=\"flex-shrink-0 rounded-md p-1 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 transition-colors cursor-pointer\"\n aria-label={`Remover ${uploaded.file.name}`}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n ReactNode,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface TooltipProps {\n content: ReactNode;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n delay?: number;\n children: ReactNode;\n className?: string;\n maxWidth?: number;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Tooltip({\n content,\n position = \"top\",\n delay = 200,\n children,\n className,\n maxWidth = 240,\n}: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const [positioned, setPositioned] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const [actualPosition, setActualPosition] = useState(position);\n const triggerRef = useRef<HTMLElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const idRef = useRef(`tooltip-${Math.random().toString(36).slice(2, 9)}`);\n\n const calculatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current) return;\n\n const trigger = triggerRef.current.getBoundingClientRect();\n const tooltip = tooltipRef.current.getBoundingClientRect();\n const gap = 8;\n\n let top = 0;\n let left = 0;\n let resolvedPosition = position;\n\n // Calculate preferred position\n switch (position) {\n case \"top\":\n top = trigger.top - tooltip.height - gap;\n left = trigger.left + trigger.width / 2 - tooltip.width / 2;\n break;\n case \"bottom\":\n top = trigger.bottom + gap;\n left = trigger.left + trigger.width / 2 - tooltip.width / 2;\n break;\n case \"left\":\n top = trigger.top + trigger.height / 2 - tooltip.height / 2;\n left = trigger.left - tooltip.width - gap;\n break;\n case \"right\":\n top = trigger.top + trigger.height / 2 - tooltip.height / 2;\n left = trigger.right + gap;\n break;\n }\n\n // Flip vertically if overflows\n if (position === \"top\" && top < 8) {\n top = trigger.bottom + gap;\n resolvedPosition = \"bottom\";\n } else if (\n position === \"bottom\" &&\n top + tooltip.height > window.innerHeight - 8\n ) {\n top = trigger.top - tooltip.height - gap;\n resolvedPosition = \"top\";\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, window.innerWidth - tooltip.width - 8));\n top = Math.max(8, Math.min(top, window.innerHeight - tooltip.height - 8));\n\n setCoords({ top, left });\n setActualPosition(resolvedPosition);\n setPositioned(true);\n }, [position]);\n\n const show = useCallback(() => {\n timeoutRef.current = setTimeout(() => {\n setVisible(true);\n setPositioned(false);\n }, delay);\n }, [delay]);\n\n const hide = useCallback(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setVisible(false);\n setPositioned(false);\n }, []);\n\n useEffect(() => {\n if (visible) {\n // Double rAF to ensure the portal is painted before measuring\n requestAnimationFrame(() => {\n requestAnimationFrame(calculatePosition);\n });\n }\n }, [visible, calculatePosition]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n // Attach events to child without wrapping in a span — zero layout impact\n let trigger: ReactNode;\n if (isValidElement(children)) {\n trigger = cloneElement(children as React.ReactElement<any>, {\n ref: triggerRef,\n onMouseEnter: (e: React.MouseEvent) => {\n show();\n (children as any).props?.onMouseEnter?.(e);\n },\n onMouseLeave: (e: React.MouseEvent) => {\n hide();\n (children as any).props?.onMouseLeave?.(e);\n },\n onFocus: (e: React.FocusEvent) => {\n show();\n (children as any).props?.onFocus?.(e);\n },\n onBlur: (e: React.FocusEvent) => {\n hide();\n (children as any).props?.onBlur?.(e);\n },\n \"aria-describedby\": visible ? idRef.current : undefined,\n });\n } else {\n // Fallback: wrap primitives (strings, numbers) in a span\n trigger = (\n <span\n ref={triggerRef as React.RefObject<HTMLSpanElement>}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n aria-describedby={visible ? idRef.current : undefined}\n className=\"inline-flex\"\n >\n {children}\n </span>\n );\n }\n\n // Arrow styles per position\n const arrowClass: Record<string, string> = {\n top: \"left-1/2 -translate-x-1/2 top-full border-t-[var(--dashboard-tooltip-bg,#1a1a1a)] border-x-transparent border-b-transparent\",\n bottom:\n \"left-1/2 -translate-x-1/2 bottom-full border-b-[var(--dashboard-tooltip-bg,#1a1a1a)] border-x-transparent border-t-transparent\",\n left: \"top-1/2 -translate-y-1/2 left-full border-l-[var(--dashboard-tooltip-bg,#1a1a1a)] border-y-transparent border-r-transparent\",\n right:\n \"top-1/2 -translate-y-1/2 right-full border-r-[var(--dashboard-tooltip-bg,#1a1a1a)] border-y-transparent border-l-transparent\",\n };\n\n return (\n <>\n {trigger}\n {visible &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n ref={tooltipRef}\n id={idRef.current}\n role=\"tooltip\"\n className={cn(\n \"fixed z-[10002] rounded-md px-3 py-2 text-xs font-medium\",\n \"bg-[var(--dashboard-tooltip-bg,#1a1a1a)] text-[var(--dashboard-tooltip-text,#ffffff)]\",\n \"shadow-lg pointer-events-none\",\n positioned && \"dashboard-animate-fade-in\",\n className,\n )}\n style={{\n top: coords.top,\n left: coords.left,\n maxWidth,\n opacity: positioned ? 1 : 0,\n }}\n >\n {content}\n {/* Arrow */}\n <span\n className={cn(\n \"absolute w-0 h-0 border-[5px]\",\n arrowClass[actualPosition],\n )}\n />\n </div>,\n document.body,\n )}\n </>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport interface InfoTooltipProps {\n /** The explanation text shown on hover */\n content: ReactNode;\n /** Optional short label (term/acronym) rendered bold before the explanation */\n term?: string;\n /** Icon size in pixels. Default: 14 */\n size?: number;\n /** Tooltip position. Default: \"top\" */\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Max width of the tooltip popup. Default: 280 */\n maxWidth?: number;\n /** Additional CSS classes for the icon wrapper */\n className?: string;\n}\n\nexport function InfoTooltip({\n content,\n term,\n size = 14,\n position = \"top\",\n maxWidth = 280,\n className,\n}: InfoTooltipProps) {\n const tooltipContent = term ? (\n <span className=\"text-xs leading-relaxed\">\n <strong>{term}</strong> — {content}\n </span>\n ) : (\n <span className=\"text-xs leading-relaxed\">{content}</span>\n );\n\n return (\n <Tooltip content={tooltipContent} position={position} maxWidth={maxWidth}>\n <button\n type=\"button\"\n tabIndex={0}\n aria-label={term ? `Informação sobre ${term}` : \"Mais informações\"}\n className={[\n \"inline-flex items-center justify-center rounded-full\",\n \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n \"hover:text-[var(--dashboard-text-primary,#2d2d2d)]\",\n \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n \"transition-colors duration-150 cursor-help\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--dashboard-primary,#2563EB)]/40\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ width: size + 6, height: size + 6 }}\n >\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n </button>\n </Tooltip>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { ChevronRight } from \"lucide-react\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n icon?: ReactNode;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n separator?: ReactNode;\n onNavigate?: (href: string) => void;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Breadcrumb({\n items,\n separator,\n onNavigate,\n className,\n}: BreadcrumbProps) {\n const defaultSeparator = (\n <ChevronRight className=\"h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)] flex-shrink-0\" />\n );\n\n const handleClick = (e: React.MouseEvent, href?: string) => {\n if (href && onNavigate) {\n e.preventDefault();\n onNavigate(href);\n }\n };\n\n return (\n <nav aria-label=\"Breadcrumb\" className={className}>\n <ol className=\"flex items-center gap-1.5 flex-wrap\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={index} className=\"flex items-center gap-1.5\">\n {index > 0 && (\n <span aria-hidden=\"true\">\n {separator || defaultSeparator}\n </span>\n )}\n\n {isLast ? (\n <span\n className={cn(\n \"flex items-center gap-1.5 text-sm font-medium\",\n \"text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n aria-current=\"page\"\n >\n {item.icon && (\n <span className=\"flex-shrink-0 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </span>\n ) : (\n <a\n href={item.href || \"#\"}\n onClick={(e) => handleClick(e, item.href)}\n className={cn(\n \"flex items-center gap-1.5 text-sm\",\n \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n \"hover:text-[var(--dashboard-primary,#37a501)] transition-colors\",\n )}\n >\n {item.icon && (\n <span className=\"flex-shrink-0 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </a>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","\"use client\";\n\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown, X, Check, Search } from \"lucide-react\";\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n value?: string | string[];\n onChange: (value: string | string[]) => void;\n multiple?: boolean;\n searchable?: boolean;\n placeholder?: string;\n label?: string;\n error?: string;\n disabled?: boolean;\n renderOption?: (option: ComboboxOption, isSelected: boolean) => ReactNode;\n noResultsText?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Combobox({\n options,\n value,\n onChange,\n multiple = false,\n searchable = true,\n placeholder = \"Selecione...\",\n label,\n error,\n disabled = false,\n renderOption,\n noResultsText = \"Nenhum resultado encontrado\",\n className,\n}: ComboboxProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [position, setPosition] = useState({ top: 0, left: 0, width: 0 });\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n const selectedValues = useMemo(() => {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n const filtered = useMemo(() => {\n if (!query) return options;\n const lower = query.toLowerCase();\n return options.filter((o) => o.label.toLowerCase().includes(lower));\n }, [options, query]);\n\n const calculatePosition = useCallback(() => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n calculatePosition();\n setIsOpen(true);\n setFocusedIndex(-1);\n setTimeout(() => inputRef.current?.focus(), 0);\n }, [disabled, calculatePosition]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setQuery(\"\");\n setFocusedIndex(-1);\n }, []);\n\n const toggleOption = useCallback(\n (optionValue: string) => {\n if (multiple) {\n const current = selectedValues;\n const next = current.includes(optionValue)\n ? current.filter((v) => v !== optionValue)\n : [...current, optionValue];\n onChange(next);\n } else {\n onChange(optionValue);\n close();\n }\n },\n [multiple, selectedValues, onChange, close],\n );\n\n const removeValue = useCallback(\n (val: string, e?: React.MouseEvent) => {\n e?.stopPropagation();\n if (multiple) {\n onChange(selectedValues.filter((v) => v !== val));\n } else {\n onChange(multiple ? [] : \"\");\n }\n },\n [multiple, selectedValues, onChange],\n );\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClick = (e: MouseEvent) => {\n const portal = document.querySelector(\".dc-combobox-portal\");\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node) &&\n (!portal || !portal.contains(e.target as Node))\n ) {\n close();\n }\n };\n\n const handleScroll = (e: Event) => {\n const portal = document.querySelector(\".dc-combobox-portal\");\n if (!portal || !portal.contains(e.target as Node)) {\n close();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClick);\n window.addEventListener(\"scroll\", handleScroll, true);\n window.addEventListener(\"resize\", close);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n window.removeEventListener(\"scroll\", handleScroll, true);\n window.removeEventListener(\"resize\", close);\n };\n }, [isOpen, close]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n open();\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setFocusedIndex((prev) => {\n const next = prev + 1;\n return next >= filtered.length ? 0 : next;\n });\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setFocusedIndex((prev) => {\n const next = prev - 1;\n return next < 0 ? filtered.length - 1 : next;\n });\n break;\n case \"Enter\":\n e.preventDefault();\n if (focusedIndex >= 0 && filtered[focusedIndex] && !filtered[focusedIndex].disabled) {\n toggleOption(filtered[focusedIndex].value);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n close();\n break;\n }\n },\n [isOpen, open, close, filtered, focusedIndex, toggleOption],\n );\n\n useEffect(() => {\n if (focusedIndex >= 0 && listRef.current) {\n const item = listRef.current.children[focusedIndex] as HTMLElement;\n item?.scrollIntoView({ block: \"nearest\" });\n }\n }, [focusedIndex]);\n\n const selectedLabels = selectedValues\n .map((v) => options.find((o) => o.value === v)?.label)\n .filter(Boolean) as string[];\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n {label && (\n <label className=\"block text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {label}\n </label>\n )}\n\n <div ref={containerRef} onKeyDown={handleKeyDown}>\n <div\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls=\"combobox-listbox\"\n tabIndex={disabled ? -1 : 0}\n onClick={() => (isOpen ? close() : open())}\n className={cn(\n \"flex min-h-[40px] w-full items-center gap-2 rounded-lg border px-3 py-2 transition-colors\",\n isOpen\n ? \"border-[var(--dashboard-primary,#37a501)] ring-2 ring-[var(--dashboard-primary,#37a501)]/20\"\n : error\n ? \"border-[var(--dashboard-status-danger,#EF4444)]\"\n : \"border-[var(--dashboard-text-secondary,#6b7280)]/30 hover:border-[var(--dashboard-text-secondary,#6b7280)]/50\",\n disabled\n ? \"opacity-50 cursor-not-allowed bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : \"cursor-pointer bg-[var(--dashboard-surface,#ffffff)]\",\n )}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-1 min-w-0\">\n {multiple && selectedLabels.length > 0 ? (\n selectedLabels.map((lbl, i) => (\n <span\n key={selectedValues[i]}\n className=\"inline-flex items-center gap-1 rounded-md bg-[var(--dashboard-primary,#37a501)]/10 px-2 py-0.5 text-xs font-medium text-[var(--dashboard-primary,#37a501)]\"\n >\n {lbl}\n <button\n type=\"button\"\n onClick={(e) => removeValue(selectedValues[i], e)}\n className=\"rounded-sm hover:bg-[var(--dashboard-primary,#37a501)]/20 cursor-pointer\"\n aria-label={`Remover ${lbl}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))\n ) : !multiple && selectedLabels.length === 1 ? (\n <span className=\"text-sm text-[var(--dashboard-text-primary,#2d2d2d)] truncate\">\n {selectedLabels[0]}\n </span>\n ) : (\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {placeholder}\n </span>\n )}\n </div>\n\n {!multiple && selectedValues.length > 0 && (\n <button\n type=\"button\"\n onClick={(e) => removeValue(selectedValues[0], e)}\n className=\"flex-shrink-0 rounded-md p-0.5 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 cursor-pointer\"\n aria-label=\"Limpar seleção\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n <ChevronDown\n className={cn(\n \"h-4 w-4 flex-shrink-0 text-[var(--dashboard-text-secondary,#6b7280)] transition-transform\",\n isOpen && \"rotate-180\",\n )}\n />\n </div>\n\n {isOpen &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n className=\"dc-combobox-portal rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] shadow-lg dashboard-animate-fade-in overflow-hidden\"\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n width: position.width,\n zIndex: 10001,\n }}\n >\n {searchable && (\n <div className=\"flex items-center gap-2 border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 px-3 py-2\">\n <Search className=\"h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)] flex-shrink-0\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setFocusedIndex(-1);\n }}\n placeholder=\"Buscar...\"\n className=\"flex-1 bg-transparent text-sm text-[var(--dashboard-text-primary,#2d2d2d)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] outline-none\"\n aria-label=\"Buscar opções\"\n />\n </div>\n )}\n\n <ul\n ref={listRef}\n id=\"combobox-listbox\"\n role=\"listbox\"\n aria-multiselectable={multiple}\n className=\"max-h-60 overflow-y-auto py-1\"\n >\n {filtered.length === 0 ? (\n <li className=\"px-3 py-3 text-center text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {noResultsText}\n </li>\n ) : (\n filtered.map((option, index) => {\n const isSelected = selectedValues.includes(option.value);\n const isFocused = index === focusedIndex;\n\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n data-modal-ignore\n onClick={() => {\n if (!option.disabled) toggleOption(option.value);\n }}\n className={cn(\n \"flex items-center justify-between px-3 py-2 text-sm transition-colors\",\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer\",\n isFocused && \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n !isFocused &&\n !option.disabled &&\n \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n isSelected\n ? \"text-[var(--dashboard-primary,#37a501)] font-medium\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {renderOption ? (\n renderOption(option, isSelected)\n ) : (\n <>\n <span className=\"truncate\">{option.label}</span>\n {isSelected && (\n <Check className=\"h-4 w-4 flex-shrink-0 text-[var(--dashboard-primary,#37a501)]\" />\n )}\n </>\n )}\n </li>\n );\n })\n )}\n </ul>\n </div>,\n document.body,\n )}\n </div>\n\n {error && (\n <p className=\"text-xs text-[var(--dashboard-status-danger,#EF4444)]\">{error}</p>\n )}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { X, Info, CheckCircle, AlertTriangle, AlertOctagon } from \"lucide-react\";\n\nexport interface AlertProps {\n variant?: \"info\" | \"success\" | \"warning\" | \"danger\";\n title?: string;\n description?: ReactNode;\n onClose?: () => void;\n actions?: ReactNode;\n icon?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst variantConfig: Record<\n string,\n { border: string; bg: string; text: string; icon: ReactNode }\n> = {\n info: {\n border: \"border-[var(--dashboard-status-info,#3b82f6)]\",\n bg: \"bg-[var(--dashboard-status-info,#3b82f6)]/5\",\n text: \"text-[var(--dashboard-status-info,#3b82f6)]\",\n icon: <Info className=\"h-5 w-5\" />,\n },\n success: {\n border: \"border-[var(--dashboard-status-success,#10B981)]\",\n bg: \"bg-[var(--dashboard-status-success,#10B981)]/5\",\n text: \"text-[var(--dashboard-status-success,#10B981)]\",\n icon: <CheckCircle className=\"h-5 w-5\" />,\n },\n warning: {\n border: \"border-[var(--dashboard-status-warning,#f59e0b)]\",\n bg: \"bg-[var(--dashboard-status-warning,#f59e0b)]/5\",\n text: \"text-[var(--dashboard-status-warning,#f59e0b)]\",\n icon: <AlertTriangle className=\"h-5 w-5\" />,\n },\n danger: {\n border: \"border-[var(--dashboard-status-danger,#EF4444)]\",\n bg: \"bg-[var(--dashboard-status-danger,#EF4444)]/5\",\n text: \"text-[var(--dashboard-status-danger,#EF4444)]\",\n icon: <AlertOctagon className=\"h-5 w-5\" />,\n },\n};\n\nexport function Alert({\n variant = \"info\",\n title,\n description,\n onClose,\n actions,\n icon,\n className,\n}: AlertProps) {\n const config = variantConfig[variant];\n\n return (\n <div\n className={cn(\n \"rounded-lg border-l-4 p-4\",\n config.border,\n config.bg,\n className,\n )}\n role=\"alert\"\n >\n <div className=\"flex gap-3\">\n <div className={cn(\"flex-shrink-0 mt-0.5\", config.text)}>\n {icon || config.icon}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h3\n className={cn(\n \"text-sm font-semibold\",\n \"text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {title}\n </h3>\n )}\n {description && (\n <div\n className={cn(\n \"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\",\n title && \"mt-1\",\n )}\n >\n {description}\n </div>\n )}\n {actions && <div className=\"mt-3 flex gap-2\">{actions}</div>}\n </div>\n\n {onClose && (\n <button\n onClick={onClose}\n className=\"flex-shrink-0 rounded-md p-1 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 transition-colors cursor-pointer\"\n aria-label=\"Fechar alerta\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Info, AlertTriangle, Lightbulb, ShieldAlert } from \"lucide-react\";\n\nexport interface CalloutProps {\n variant?: \"info\" | \"warning\" | \"tip\" | \"danger\";\n title?: string;\n children?: ReactNode;\n icon?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst variantConfig: Record<\n string,\n { border: string; bg: string; text: string; icon: ReactNode }\n> = {\n info: {\n border: \"border-[var(--dashboard-status-info,#3b82f6)]\",\n bg: \"bg-[var(--dashboard-status-info,#3b82f6)]/5\",\n text: \"text-[var(--dashboard-status-info,#3b82f6)]\",\n icon: <Info className=\"h-4 w-4\" />,\n },\n warning: {\n border: \"border-[var(--dashboard-status-warning,#f59e0b)]\",\n bg: \"bg-[var(--dashboard-status-warning,#f59e0b)]/5\",\n text: \"text-[var(--dashboard-status-warning,#f59e0b)]\",\n icon: <AlertTriangle className=\"h-4 w-4\" />,\n },\n tip: {\n border: \"border-[var(--dashboard-status-success,#10B981)]\",\n bg: \"bg-[var(--dashboard-status-success,#10B981)]/5\",\n text: \"text-[var(--dashboard-status-success,#10B981)]\",\n icon: <Lightbulb className=\"h-4 w-4\" />,\n },\n danger: {\n border: \"border-[var(--dashboard-status-danger,#EF4444)]\",\n bg: \"bg-[var(--dashboard-status-danger,#EF4444)]/5\",\n text: \"text-[var(--dashboard-status-danger,#EF4444)]\",\n icon: <ShieldAlert className=\"h-4 w-4\" />,\n },\n};\n\nexport function Callout({\n variant = \"info\",\n title,\n children,\n icon,\n className,\n}: CalloutProps) {\n const config = variantConfig[variant];\n\n return (\n <div\n className={cn(\n \"rounded-lg border-l-4 p-4 my-4\",\n config.border,\n config.bg,\n className,\n )}\n role=\"note\"\n >\n <div className=\"flex gap-3\">\n <div className={cn(\"flex-shrink-0 mt-0.5\", config.text)}>\n {icon || config.icon}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {title && (\n <p\n className={cn(\n \"text-sm font-semibold\",\n \"text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {title}\n </p>\n )}\n {children && (\n <div\n className={cn(\n \"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\",\n title && \"mt-1\",\n )}\n >\n {children}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { Copy, Check } from \"lucide-react\";\n\nexport interface CodeBlockProps {\n code: string;\n language?: string;\n filename?: string;\n showLineNumbers?: boolean;\n className?: string;\n copyLabel?: string;\n copiedLabel?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function CodeBlock({\n code,\n language,\n filename,\n showLineNumbers = false,\n className,\n copyLabel = \"Copiar\",\n copiedLabel = \"Copiado!\",\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // clipboard API not available\n }\n }, [code]);\n\n const lines = code.split(\"\\n\");\n\n return (\n <div\n className={cn(\n \"relative rounded-lg overflow-hidden border border-[var(--dashboard-text-secondary,#64748B)]/12 my-4\",\n className,\n )}\n >\n {(filename || language) && (\n <div className=\"flex items-center justify-between px-4 py-2 bg-[var(--dashboard-text-primary,#0F172A)] border-b border-[var(--dashboard-text-secondary,#64748B)]/20\">\n {filename && (\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#64748B)] font-mono\">\n {filename}\n </span>\n )}\n {language && !filename && <span />}\n {language && (\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#64748B)]/60\">\n {language}\n </span>\n )}\n </div>\n )}\n\n <div className=\"relative\">\n <pre\n className=\"overflow-x-auto p-4 bg-[var(--dashboard-text-primary,#0F172A)] m-0\"\n data-language={language}\n >\n <code className=\"text-sm font-mono leading-relaxed text-[var(--dashboard-surface,#FFFFFF)]/90\">\n {showLineNumbers\n ? lines.map((line, i) => (\n <span key={i} className=\"table-row\">\n <span className=\"table-cell pr-4 text-right select-none text-[var(--dashboard-text-secondary,#64748B)]/40 text-xs w-8\">\n {i + 1}\n </span>\n <span className=\"table-cell\">\n {line}\n {\"\\n\"}\n </span>\n </span>\n ))\n : code}\n </code>\n </pre>\n\n <button\n onClick={handleCopy}\n className={cn(\n \"absolute top-3 right-3 flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-all duration-200 cursor-pointer\",\n copied\n ? \"bg-[var(--dashboard-status-success,#059669)]/20 text-[var(--dashboard-status-success,#059669)]\"\n : \"bg-[var(--dashboard-surface,#FFFFFF)]/10 text-[var(--dashboard-surface,#FFFFFF)]/60 hover:bg-[var(--dashboard-surface,#FFFFFF)]/20 hover:text-[var(--dashboard-surface,#FFFFFF)]/80\",\n )}\n aria-label={copied ? copiedLabel : copyLabel}\n title={copied ? copiedLabel : copyLabel}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" />\n )}\n <span>{copied ? copiedLabel : copyLabel}</span>\n </button>\n </div>\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Inbox } from \"lucide-react\";\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-12 px-6 text-center\",\n className,\n )}\n >\n <div className=\"flex h-16 w-16 items-center justify-center rounded-full bg-[var(--dashboard-text-secondary,#6b7280)]/10 mb-4\">\n {icon || (\n <Inbox className=\"h-8 w-8 text-[var(--dashboard-text-secondary,#6b7280)]\" />\n )}\n </div>\n\n <h3 className=\"text-lg font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n\n {description && (\n <p className=\"mt-2 max-w-sm text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {description}\n </p>\n )}\n\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface StatusBadgeProps {\n status: string;\n colorMap?: Record<string, string>;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n dot?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst defaultColorMap: Record<string, string> = {\n ACTIVE: \"var(--dashboard-status-success,#10B981)\",\n APPROVED: \"var(--dashboard-status-success,#10B981)\",\n COMPLETED: \"var(--dashboard-status-success,#10B981)\",\n DELIVERED: \"var(--dashboard-status-success,#10B981)\",\n SUCCESS: \"var(--dashboard-status-success,#10B981)\",\n PENDING: \"var(--dashboard-status-warning,#f59e0b)\",\n IN_REVIEW: \"var(--dashboard-status-warning,#f59e0b)\",\n AWAITING: \"var(--dashboard-status-warning,#f59e0b)\",\n DRAFT: \"var(--dashboard-status-warning,#f59e0b)\",\n PROCESSING: \"var(--dashboard-status-info,#3b82f6)\",\n IN_PROGRESS: \"var(--dashboard-status-info,#3b82f6)\",\n SENT: \"var(--dashboard-status-info,#3b82f6)\",\n QUOTED: \"var(--dashboard-status-info,#3b82f6)\",\n CANCELLED: \"var(--dashboard-status-danger,#EF4444)\",\n REJECTED: \"var(--dashboard-status-danger,#EF4444)\",\n EXPIRED: \"var(--dashboard-status-danger,#EF4444)\",\n ERROR: \"var(--dashboard-status-danger,#EF4444)\",\n INACTIVE: \"var(--dashboard-text-secondary,#6b7280)\",\n ARCHIVED: \"var(--dashboard-text-secondary,#6b7280)\",\n};\n\nconst sizeClasses: Record<string, string> = {\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-2.5 py-1 text-sm\",\n lg: \"px-3 py-1 text-sm\",\n};\n\nconst dotSizeClasses: Record<string, string> = {\n sm: \"h-1.5 w-1.5\",\n md: \"h-2 w-2\",\n lg: \"h-2.5 w-2.5\",\n};\n\nfunction formatLabel(status: string): string {\n return status\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport function StatusBadge({\n status,\n colorMap,\n size = \"md\",\n label,\n dot = true,\n className,\n}: StatusBadgeProps) {\n const merged = { ...defaultColorMap, ...colorMap };\n const normalizedStatus = status.toUpperCase().replace(/[\\s-]/g, \"_\");\n const color = merged[normalizedStatus] || \"var(--dashboard-text-secondary,#6b7280)\";\n const displayLabel = label || formatLabel(status);\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full font-medium whitespace-nowrap\",\n sizeClasses[size],\n className,\n )}\n style={{\n color,\n backgroundColor: `color-mix(in srgb, ${color} 12%, transparent)`,\n }}\n >\n {dot && (\n <span\n className={cn(\"rounded-full flex-shrink-0\", dotSizeClasses[size])}\n style={{ backgroundColor: color }}\n />\n )}\n {displayLabel}\n </span>\n );\n}\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\n\ntype ColorValue = React.CSSProperties[\"color\"];\ntype StyleMap = Record<string, React.CSSProperties>;\n\nexport interface IPhoneMockupProps {\n screenWidth: number;\n screenType?: \"legacy\" | \"notch\" | \"island\";\n isLandscape?: boolean;\n className?: string;\n containerStyle?: React.CSSProperties;\n containerStlye?: React.CSSProperties;\n frameColor?: ColorValue;\n frameOnly?: boolean;\n statusbarColor?: ColorValue;\n hideStatusBar?: boolean;\n transparentNavBar?: boolean;\n hideNavBar?: boolean;\n children?: React.ReactNode;\n}\n\ninterface IosVariantProps {\n screenWidth: number;\n frameColor: ColorValue;\n frameOnly: boolean;\n statusbarColor: ColorValue;\n hideStatusBar: boolean;\n transparentNavigationBar: boolean;\n hideNavigationBar: boolean;\n children?: React.ReactNode;\n}\n\ninterface StyleParams {\n screenType: \"notch\" | \"island\";\n isLandscape: boolean;\n getSizeWithRatio: (size: number) => number;\n screenWidth: number;\n mockupHeight: number;\n frameColor: ColorValue;\n frameWidth: number;\n statusbarColor: ColorValue;\n frameOnly: boolean;\n bezelRadius: number;\n}\n\ninterface LegacyStyleParams {\n isLandscape: boolean;\n getSizeWithRatio: (size: number) => number;\n screenWidth: number;\n mockupHeight: number;\n frameColor: ColorValue;\n statusbarColor: ColorValue;\n frameOnly: boolean;\n}\n\nexport function IPhoneMockup({\n screenWidth,\n screenType = \"island\",\n isLandscape = false,\n frameColor = \"#666666\",\n frameOnly = false,\n statusbarColor = \"#CCCCCC\",\n hideStatusBar = false,\n transparentNavBar = false,\n hideNavBar = false,\n className,\n containerStyle,\n containerStlye,\n children,\n}: IPhoneMockupProps) {\n const Mockup = useMemo(() => {\n if (screenType === \"legacy\") {\n return isLandscape ? IPhoneLegacyLandscape : IPhoneLegacyPortrait;\n }\n\n if (screenType === \"notch\") {\n return isLandscape ? IPhoneNotchLandscape : IPhoneNotchPortrait;\n }\n\n return isLandscape ? IPhoneIslandLandscape : IPhoneIslandPortrait;\n }, [isLandscape, screenType]);\n\n return (\n <div className={className} style={containerStyle ?? containerStlye}>\n <Mockup\n screenWidth={screenWidth}\n frameColor={frameColor}\n frameOnly={frameOnly}\n statusbarColor={statusbarColor}\n hideStatusBar={hideStatusBar}\n transparentNavigationBar={transparentNavBar}\n hideNavigationBar={hideNavBar}\n >\n {children}\n </Mockup>\n </div>\n );\n}\n\nfunction createStyles(styles: StyleMap): StyleMap {\n return styles;\n}\n\nfunction getStyles({\n screenType,\n isLandscape,\n getSizeWithRatio,\n screenWidth,\n mockupHeight,\n frameColor,\n frameWidth,\n statusbarColor,\n frameOnly,\n bezelRadius,\n}: StyleParams) {\n const frameWidthValue = frameWidth;\n const halfFrameWidth = Math.floor(frameWidthValue / 2);\n const widthAndFrame = screenWidth + frameWidthValue * 2;\n const heightAndFrame = mockupHeight + frameWidthValue * 2;\n const frameButtonSize = Math.floor(frameWidthValue * 0.9);\n const frameButtonPosition =\n (isLandscape ? mockupHeight : screenWidth) +\n frameWidthValue +\n halfFrameWidth +\n frameButtonSize -\n halfFrameWidth;\n\n const paddingRight = frameOnly\n ? 0\n : isLandscape\n ? 0\n : frameButtonSize - halfFrameWidth;\n const paddingLeft = paddingRight;\n const paddingTop = frameOnly\n ? 0\n : isLandscape\n ? frameButtonSize - halfFrameWidth\n : 0;\n const paddingBottom = paddingTop;\n\n const isIsland = screenType === \"island\";\n const topInset = isLandscape\n ? 0\n : getSizeWithRatio(isIsland ? 59 : 44);\n const leftInset = isLandscape ? getSizeWithRatio(isIsland ? 59 : 44) : 0;\n const rightInset = leftInset;\n const bottomInset = isLandscape ? getSizeWithRatio(21) : getSizeWithRatio(34);\n const powerPosition = getSizeWithRatio(isIsland ? 280 : 250);\n\n return createStyles({\n container: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n boxSizing: \"content-box\",\n position: \"relative\",\n width: widthAndFrame,\n height: heightAndFrame,\n paddingRight,\n paddingLeft,\n paddingTop,\n paddingBottom,\n },\n frame: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n boxSizing: \"border-box\",\n borderRadius: bezelRadius,\n borderStyle: \"solid\",\n borderWidth: frameWidthValue,\n borderColor: frameColor,\n overflow: \"hidden\",\n },\n screen: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n position: \"relative\",\n width: screenWidth,\n height: mockupHeight,\n backgroundColor: \"transparent\",\n overflow: \"hidden\",\n },\n notchContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n width: isLandscape ? leftInset : \"100%\",\n height: isLandscape ? \"100%\" : topInset,\n backgroundColor: statusbarColor,\n alignItems: isLandscape ? \"flex-start\" : \"center\",\n justifyContent: isLandscape ? \"center\" : \"flex-start\",\n },\n notchContainerFullScreen: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"absolute\",\n width: isLandscape ? leftInset : \"100%\",\n height: isLandscape ? \"100%\" : topInset,\n alignItems: isLandscape ? \"flex-start\" : \"center\",\n justifyContent: isLandscape ? \"center\" : \"flex-start\",\n pointerEvents: \"none\",\n },\n safeAreaRight: {\n width: rightInset,\n height: \"100%\",\n backgroundColor: statusbarColor,\n },\n island: {\n width: isLandscape ? getSizeWithRatio(35) : getSizeWithRatio(128),\n height: isLandscape ? getSizeWithRatio(128) : getSizeWithRatio(35),\n backgroundColor: frameColor,\n borderRadius: getSizeWithRatio(50),\n marginTop: isLandscape ? undefined : getSizeWithRatio(13),\n marginLeft: isLandscape ? getSizeWithRatio(13) : undefined,\n },\n notch: {\n width: isLandscape ? getSizeWithRatio(31) : getSizeWithRatio(160),\n height: isLandscape ? getSizeWithRatio(160) : getSizeWithRatio(31),\n backgroundColor: frameColor,\n borderBottomLeftRadius: isLandscape ? 0 : getSizeWithRatio(20),\n borderBottomRightRadius: getSizeWithRatio(20),\n borderTopRightRadius: isLandscape ? getSizeWithRatio(20) : 0,\n },\n swipeContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: bottomInset,\n backgroundColor: statusbarColor,\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n },\n swipeContainerFullScreen: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"absolute\",\n bottom: 0,\n width: \"100%\",\n height: bottomInset,\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n pointerEvents: \"none\",\n },\n swipeBar: {\n backgroundColor: frameColor,\n borderRadius: getSizeWithRatio(100),\n width: isLandscape ? getSizeWithRatio(230) : \"35%\",\n height: getSizeWithRatio(7),\n marginBottom: isLandscape ? getSizeWithRatio(5) : getSizeWithRatio(10),\n },\n silenceSwitch: {\n position: \"absolute\",\n borderRadius: frameWidthValue,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(165),\n left: isLandscape ? getSizeWithRatio(165) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(34) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(34),\n backgroundColor: frameColor,\n },\n volumeUp: {\n position: \"absolute\",\n borderRadius: frameWidthValue,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(230),\n left: isLandscape ? getSizeWithRatio(230) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(65) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(65),\n backgroundColor: frameColor,\n },\n volumeDown: {\n position: \"absolute\",\n borderRadius: frameWidthValue,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(315),\n left: isLandscape ? getSizeWithRatio(315) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(65) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(65),\n backgroundColor: frameColor,\n },\n power: {\n position: \"absolute\",\n borderRadius: frameWidthValue,\n top: isLandscape ? undefined : powerPosition,\n left: isLandscape ? powerPosition : frameButtonPosition,\n bottom: isLandscape ? frameButtonPosition : undefined,\n width: isLandscape ? getSizeWithRatio(105) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(105),\n backgroundColor: frameColor,\n },\n notchPad: {\n alignSelf: \"center\",\n position: \"absolute\",\n top: isLandscape ? undefined : halfFrameWidth,\n left: isLandscape ? halfFrameWidth : undefined,\n width: isLandscape ? getSizeWithRatio(20) : getSizeWithRatio(160),\n height: isLandscape ? getSizeWithRatio(160) : getSizeWithRatio(20),\n backgroundColor: frameColor,\n },\n });\n}\n\nfunction IPhoneIslandPortrait(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n hideNavigationBar,\n transparentNavigationBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 390), 1);\n\n return getStyles({\n screenType: \"island\",\n isLandscape: false,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 9) * 19.5),\n frameColor,\n frameWidth: getSizeWithRatio(10),\n frameOnly,\n statusbarColor,\n bezelRadius: getSizeWithRatio(68),\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && (\n <div style={styles.notchContainer}>\n <div style={styles.island} />\n </div>\n )}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n {!hideNavigationBar && !transparentNavigationBar && (\n <div style={styles.swipeContainer}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {hideStatusBar && (\n <div style={styles.notchContainerFullScreen}>\n <div style={styles.island} />\n </div>\n )}\n {!hideNavigationBar && transparentNavigationBar && (\n <div style={styles.swipeContainerFullScreen}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction IPhoneIslandLandscape(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n hideNavigationBar,\n transparentNavigationBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 844), 1);\n\n return getStyles({\n screenType: \"island\",\n isLandscape: true,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 19.5) * 9),\n frameColor,\n frameWidth: getSizeWithRatio(10),\n frameOnly,\n statusbarColor,\n bezelRadius: getSizeWithRatio(68),\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && (\n <div style={styles.notchContainer}>\n <div style={styles.island} />\n </div>\n )}\n <div style={{ display: \"flex\", flex: 1, flexDirection: \"column\" }}>\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n {!hideNavigationBar && !transparentNavigationBar && (\n <div style={styles.swipeContainer}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {!hideStatusBar && <div style={styles.safeAreaRight} />}\n </div>\n {hideStatusBar && (\n <div style={styles.notchContainerFullScreen}>\n <div style={styles.island} />\n </div>\n )}\n {!hideNavigationBar && transparentNavigationBar && (\n <div style={styles.swipeContainerFullScreen}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction IPhoneNotchPortrait(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n hideNavigationBar,\n transparentNavigationBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 390), 1);\n\n return getStyles({\n screenType: \"notch\",\n isLandscape: false,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 9) * 19.5),\n frameColor,\n frameWidth: getSizeWithRatio(14),\n frameOnly,\n statusbarColor,\n bezelRadius: getSizeWithRatio(64),\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && (\n <div style={styles.notchContainer}>\n <div style={styles.notch} />\n </div>\n )}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n {!hideNavigationBar && !transparentNavigationBar && (\n <div style={styles.swipeContainer}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {hideStatusBar && (\n <div style={styles.notchContainerFullScreen}>\n <div style={styles.notch} />\n </div>\n )}\n {!hideNavigationBar && transparentNavigationBar && (\n <div style={styles.swipeContainerFullScreen}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n <div style={styles.notchPad} />\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction IPhoneNotchLandscape(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n hideNavigationBar,\n transparentNavigationBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 844), 1);\n\n return getStyles({\n screenType: \"notch\",\n isLandscape: true,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 19.5) * 9),\n frameColor,\n frameWidth: getSizeWithRatio(14),\n frameOnly,\n statusbarColor,\n bezelRadius: getSizeWithRatio(64),\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && (\n <div style={styles.notchContainer}>\n <div style={styles.notch} />\n </div>\n )}\n <div style={{ display: \"flex\", flex: 1, flexDirection: \"column\" }}>\n <div\n style={{\n display: \"flex\",\n flex: 1,\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n {children}\n </div>\n {!hideNavigationBar && !transparentNavigationBar && (\n <div style={styles.swipeContainer}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {!hideStatusBar && <div style={styles.safeAreaRight} />}\n </div>\n {hideStatusBar && (\n <div style={styles.notchContainerFullScreen}>\n <div style={styles.notch} />\n </div>\n )}\n {!hideNavigationBar && transparentNavigationBar && (\n <div style={styles.swipeContainerFullScreen}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n <div style={styles.notchPad} />\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction getLegacyStyles({\n isLandscape,\n getSizeWithRatio,\n screenWidth,\n mockupHeight,\n frameColor,\n statusbarColor,\n frameOnly,\n}: LegacyStyleParams) {\n const frameWidth = getSizeWithRatio(22);\n const halfFrameWidth = Math.floor(frameWidth / 2);\n const widthAndFrame = screenWidth + frameWidth * 2;\n const heightAndFrame = mockupHeight + frameWidth * 2;\n const upperBezelSize = getSizeWithRatio(110);\n const lowerBezelSize = getSizeWithRatio(110);\n const frameButtonSize = Math.floor(frameWidth * 0.8);\n const frameButtonPosition =\n (isLandscape ? mockupHeight : screenWidth) +\n frameWidth +\n halfFrameWidth +\n frameButtonSize -\n halfFrameWidth;\n const paddingRight = frameOnly\n ? 0\n : isLandscape\n ? 0\n : frameButtonSize - halfFrameWidth;\n const paddingLeft = paddingRight;\n const paddingTop = frameOnly\n ? 0\n : isLandscape\n ? frameButtonSize - halfFrameWidth\n : 0;\n const paddingBottom = paddingTop;\n const bezelRadius = getSizeWithRatio(60);\n\n return createStyles({\n container: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n boxSizing: \"content-box\",\n position: \"relative\",\n width: isLandscape\n ? screenWidth + upperBezelSize + lowerBezelSize\n : widthAndFrame,\n height: isLandscape\n ? heightAndFrame\n : mockupHeight + upperBezelSize + lowerBezelSize,\n paddingRight,\n paddingLeft,\n paddingTop,\n paddingBottom,\n },\n frame: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isLandscape ? \"flex-start\" : \"center\",\n justifyContent: isLandscape ? \"center\" : \"flex-start\",\n position: \"relative\",\n boxSizing: \"border-box\",\n borderLeftWidth: frameWidth,\n borderLeftStyle: \"solid\",\n borderRightWidth: frameWidth,\n borderRightStyle: \"solid\",\n borderColor: frameColor,\n width: isLandscape ? screenWidth : widthAndFrame,\n height: isLandscape ? heightAndFrame : mockupHeight,\n overflow: \"hidden\",\n },\n upperBezel: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n borderTopLeftRadius: bezelRadius,\n borderTopRightRadius: isLandscape ? 0 : bezelRadius,\n borderBottomLeftRadius: isLandscape ? bezelRadius : 0,\n width: isLandscape ? upperBezelSize : widthAndFrame,\n height: isLandscape ? heightAndFrame : upperBezelSize,\n backgroundColor: frameColor,\n justifyContent: \"center\",\n },\n cameraSpeakerContainer: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n camera: {\n position: \"absolute\",\n left: isLandscape ? undefined : -getSizeWithRatio(38),\n bottom: isLandscape ? -getSizeWithRatio(38) : 0,\n width: getSizeWithRatio(10),\n height: getSizeWithRatio(10),\n borderRadius: getSizeWithRatio(10),\n backgroundColor: statusbarColor,\n },\n speaker: {\n position: \"relative\",\n width: isLandscape ? getSizeWithRatio(10) : getSizeWithRatio(80),\n height: isLandscape ? getSizeWithRatio(80) : getSizeWithRatio(10),\n backgroundColor: statusbarColor,\n borderRadius: getSizeWithRatio(10),\n },\n lowerBezel: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n borderTopRightRadius: isLandscape ? bezelRadius : 0,\n borderBottomLeftRadius: isLandscape ? 0 : bezelRadius,\n borderBottomRightRadius: bezelRadius,\n width: isLandscape ? lowerBezelSize : widthAndFrame,\n height: isLandscape ? heightAndFrame : lowerBezelSize,\n backgroundColor: frameColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n homeButton: {\n width: getSizeWithRatio(65),\n height: getSizeWithRatio(65),\n backgroundColor: statusbarColor,\n borderRadius: getSizeWithRatio(65),\n },\n screen: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n position: \"relative\",\n width: screenWidth,\n height: mockupHeight,\n backgroundColor: \"transparent\",\n },\n statusbar: {\n width: \"100%\",\n height: getSizeWithRatio(20),\n backgroundColor: statusbarColor,\n alignItems: \"center\",\n },\n silenceSwitch: {\n position: \"absolute\",\n borderRadius: frameWidth,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(115),\n left: isLandscape ? getSizeWithRatio(115) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(36) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(36),\n backgroundColor: frameColor,\n },\n volumeUp: {\n position: \"absolute\",\n borderRadius: frameWidth,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(185),\n left: isLandscape ? getSizeWithRatio(185) : undefined,\n right: frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(70) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(70),\n backgroundColor: frameColor,\n },\n volumeDown: {\n position: \"absolute\",\n borderRadius: frameWidth,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(270),\n left: isLandscape ? getSizeWithRatio(270) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(70) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(70),\n backgroundColor: frameColor,\n },\n power: {\n position: \"absolute\",\n borderRadius: frameWidth,\n top: isLandscape ? undefined : getSizeWithRatio(190),\n left: isLandscape ? getSizeWithRatio(190) : frameButtonPosition,\n bottom: isLandscape ? frameButtonPosition : undefined,\n width: isLandscape ? getSizeWithRatio(64) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(64),\n backgroundColor: frameColor,\n },\n });\n}\n\nfunction IPhoneLegacyPortrait(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 375), 1);\n\n return getLegacyStyles({\n isLandscape: false,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 9) * 16),\n frameColor,\n statusbarColor,\n frameOnly,\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.upperBezel}>\n <div style={styles.cameraSpeakerContainer}>\n <div style={styles.speaker}>\n <div style={styles.camera} />\n </div>\n </div>\n </div>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && <div style={styles.statusbar} />}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n </div>\n </div>\n <div style={styles.lowerBezel}>\n <div style={styles.homeButton} />\n </div>\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction IPhoneLegacyLandscape(props: IosVariantProps) {\n const { screenWidth, frameColor, frameOnly, statusbarColor, children } =\n props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 667), 1);\n\n return getLegacyStyles({\n isLandscape: true,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 16) * 9),\n frameColor,\n statusbarColor,\n frameOnly,\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.upperBezel}>\n <div style={styles.cameraSpeakerContainer}>\n <div style={styles.speaker}>\n <div style={styles.camera} />\n </div>\n </div>\n </div>\n <div style={styles.frame}>\n <div style={styles.screen}>\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n </div>\n </div>\n <div style={styles.lowerBezel}>\n <div style={styles.homeButton} />\n </div>\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useId, useState } from \"react\";\nimport {\n Camera,\n Check,\n CheckCheck,\n ChevronLeft,\n Mic,\n MoreVertical,\n Paperclip,\n Phone as PhoneIcon,\n Play,\n Smile,\n Video,\n Wifi,\n} from \"lucide-react\";\nimport { IPhoneMockup, type IPhoneMockupProps } from \"../IPhoneMockup\";\n\nexport type WhatsAppProfileType = \"business\" | \"personal\";\nexport type WhatsAppMessageDirection = \"incoming\" | \"outgoing\";\nexport type WhatsAppMessageType = \"text\" | \"audio\" | \"custom\";\nexport type WhatsAppMockupTheme = \"dark\" | \"light\";\n\nexport interface WhatsAppMockupMessage {\n id?: string;\n direction?: WhatsAppMessageDirection;\n type?: WhatsAppMessageType;\n text?: string;\n time: string;\n read?: boolean;\n duration?: string;\n waveform?: readonly number[];\n hideMeta?: boolean;\n children?: React.ReactNode;\n className?: string;\n contentClassName?: string;\n style?: React.CSSProperties;\n}\n\nexport interface WhatsAppMockupProps extends Pick<\n IPhoneMockupProps,\n | \"frameColor\"\n | \"statusbarColor\"\n | \"containerStyle\"\n | \"frameOnly\"\n | \"hideStatusBar\"\n> {\n screenWidth?: IPhoneMockupProps[\"screenWidth\"];\n contactName: string;\n profilePhoto?: string;\n profilePhotoAlt?: string;\n profileAvatar?: React.ReactNode;\n profileType?: WhatsAppProfileType;\n contactSubtitle?: string | null;\n theme?: WhatsAppMockupTheme;\n headerBackgroundColor?: React.CSSProperties[\"backgroundColor\"];\n profileAvatarBackgroundColor?: React.CSSProperties[\"backgroundColor\"];\n messages?: readonly WhatsAppMockupMessage[];\n statusTime?: string;\n dateLabel?: string | false;\n encryptionNotice?: string | false;\n composerPlaceholder?: string;\n composer?: React.ReactNode;\n showComposer?: boolean;\n showHeaderActions?: boolean;\n showWallpaper?: boolean;\n className?: string;\n phoneClassName?: string;\n screenClassName?: string;\n messagesClassName?: string;\n \"aria-label\"?: string;\n}\n\nconst DEFAULT_WAVEFORM = [\n 10, 18, 27, 14, 31, 23, 38, 17, 29, 21, 12, 25, 15, 32, 19, 11, 23, 15, 29,\n 17,\n] as const;\n\nconst FALLBACK_STATUS_TIME = \"14:32\";\n\nconst WHATSAPP_PALETTES = {\n dark: {\n frame: \"#0a0d12\",\n statusbar: \"#111b21\",\n statusText: \"#e9edef\",\n screen: \"#0b141a\",\n header: \"#111b21\",\n headerText: \"#e9edef\",\n mutedText: \"#aebac1\",\n subtleText: \"#8696a0\",\n action: \"#00a884\",\n wallpaperStroke: \"#e9edef\",\n wallpaperOpacity: 0.045,\n dateBg: \"#182229\",\n dateText: \"#aebac1\",\n noticeBg: \"#182229\",\n noticeText: \"#d0b66b\",\n incoming: \"#202c33\",\n incomingText: \"#e9edef\",\n outgoing: \"#005c4b\",\n outgoingText: \"#e9edef\",\n outgoingMeta: \"#c7d4cf\",\n read: \"#53bdeb\",\n avatarBg: \"#60b531\",\n composer: \"#111b21\",\n composerInput: \"#202c33\",\n composerText: \"#8696a0\",\n micBg: \"#00a884\",\n micIcon: \"#07130f\",\n audioWave: \"#9ad8ca\",\n audioButtonBg: \"#00a884\",\n audioPlayIcon: \"#aebac1\",\n audioWavePlayed: \"#25d366\",\n audioWaveMuted: \"#3b4a52\",\n audioAvatarBg: \"#12b2ca\",\n audioMicBadgeBg: \"#25d366\",\n shadow: \"rgba(0, 0, 0, 0.22)\",\n },\n light: {\n frame: \"#0a0d12\",\n statusbar: \"#f7f5f0\",\n statusText: \"#111b21\",\n screen: \"#efe7db\",\n header: \"#f7f5f0\",\n headerText: \"#111b21\",\n mutedText: \"#667781\",\n subtleText: \"#667781\",\n action: \"#008069\",\n wallpaperStroke: \"#7d6f59\",\n wallpaperOpacity: 0.075,\n dateBg: \"rgba(255, 255, 255, 0.88)\",\n dateText: \"#6b6255\",\n noticeBg: \"#fff7d6\",\n noticeText: \"#7a6420\",\n incoming: \"#ffffff\",\n incomingText: \"#111b21\",\n outgoing: \"#d9fdd3\",\n outgoingText: \"#111b13\",\n outgoingMeta: \"#66756b\",\n read: \"#53bdeb\",\n avatarBg: \"#60b531\",\n composer: \"#f7f5f0\",\n composerInput: \"#ffffff\",\n composerText: \"#667781\",\n micBg: \"#00a884\",\n micIcon: \"#ffffff\",\n audioWave: \"#177866\",\n audioButtonBg: \"#00a884\",\n audioPlayIcon: \"#54656f\",\n audioWavePlayed: \"#25d366\",\n audioWaveMuted: \"#a4b0b6\",\n audioAvatarBg: \"#12b2ca\",\n audioMicBadgeBg: \"#25d366\",\n shadow: \"rgba(15, 23, 42, 0.11)\",\n },\n} as const;\n\ntype WhatsAppPalette = (typeof WHATSAPP_PALETTES)[WhatsAppMockupTheme];\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function WhatsAppMockup({\n contactName,\n profilePhoto,\n profilePhotoAlt,\n profileAvatar,\n profileType = \"business\",\n contactSubtitle,\n theme = \"dark\",\n headerBackgroundColor,\n profileAvatarBackgroundColor,\n messages = [],\n statusTime,\n dateLabel = \"Hoje\",\n encryptionNotice = \"Mensagens e ligações são protegidas com criptografia de ponta a ponta.\",\n composerPlaceholder = \"Mensagem\",\n composer,\n showComposer = true,\n showHeaderActions = true,\n showWallpaper = true,\n screenWidth = 266,\n frameColor,\n statusbarColor,\n containerStyle,\n frameOnly,\n hideStatusBar,\n className,\n phoneClassName,\n screenClassName,\n messagesClassName,\n \"aria-label\": ariaLabel,\n}: WhatsAppMockupProps) {\n const palette = WHATSAPP_PALETTES[theme];\n const resolvedStatusTime = useResolvedStatusTime(statusTime);\n const resolvedFrameColor = frameColor ?? palette.frame;\n const resolvedStatusbarColor = statusbarColor ?? palette.statusbar;\n const subtitle =\n contactSubtitle === undefined\n ? profileType === \"business\"\n ? \"WhatsApp Business\"\n : undefined\n : contactSubtitle || undefined;\n\n return (\n <div\n className={cn(\"inline-block\", className)}\n aria-label={ariaLabel ?? `Conversa no WhatsApp com ${contactName}`}\n >\n <IPhoneMockup\n screenWidth={screenWidth}\n screenType=\"island\"\n frameColor={resolvedFrameColor}\n statusbarColor={resolvedStatusbarColor}\n hideNavBar\n frameOnly={frameOnly}\n hideStatusBar={hideStatusBar}\n containerStyle={containerStyle}\n className={phoneClassName}\n >\n <div\n className={cn(\"flex h-full w-full flex-col\", screenClassName)}\n style={{ backgroundColor: palette.screen, color: palette.headerText }}\n >\n <StatusBar\n time={resolvedStatusTime}\n screenWidth={screenWidth}\n palette={palette}\n />\n <WhatsAppHeader\n contactName={contactName}\n subtitle={subtitle}\n profilePhoto={profilePhoto}\n profilePhotoAlt={profilePhotoAlt}\n profileAvatar={profileAvatar}\n showActions={showHeaderActions}\n backgroundColor={headerBackgroundColor ?? palette.header}\n avatarBackgroundColor={\n profileAvatarBackgroundColor ?? palette.avatarBg\n }\n palette={palette}\n />\n\n <div\n className={cn(\n \"relative flex flex-1 flex-col gap-2 overflow-hidden px-2.5 py-2.5\",\n messagesClassName,\n )}\n >\n {showWallpaper ? <WhatsAppWallpaper palette={palette} /> : null}\n\n {dateLabel ? (\n <div\n className=\"relative z-10 mx-auto rounded-full px-2.5 py-0.5 text-[9px] font-semibold uppercase shadow-[0_1px_2px_rgba(15,23,42,0.08)]\"\n style={{\n backgroundColor: palette.dateBg,\n color: palette.dateText,\n }}\n >\n {dateLabel}\n </div>\n ) : null}\n\n {encryptionNotice ? (\n <div\n className=\"relative z-10 mx-auto max-w-[92%] rounded-md px-2.5 py-1.5 text-center text-[9px] leading-snug shadow-[0_1px_2px_rgba(15,23,42,0.06)]\"\n style={{\n backgroundColor: palette.noticeBg,\n color: palette.noticeText,\n }}\n >\n {encryptionNotice}\n </div>\n ) : null}\n\n {messages.map((message, index) => (\n <WhatsAppMessageBubble\n key={message.id ?? `${message.time}-${index}`}\n message={message}\n palette={palette}\n />\n ))}\n </div>\n\n {showComposer\n ? (composer ?? (\n <WhatsAppComposer\n composerPlaceholder={composerPlaceholder}\n palette={palette}\n />\n ))\n : null}\n </div>\n </IPhoneMockup>\n </div>\n );\n}\n\ninterface StatusBarProps {\n time: string;\n screenWidth: number;\n palette: WhatsAppPalette;\n}\n\nfunction useResolvedStatusTime(statusTime?: string) {\n const [currentTime, setCurrentTime] = useState(FALLBACK_STATUS_TIME);\n\n useEffect(() => {\n if (statusTime) {\n return;\n }\n\n const updateCurrentTime = () => {\n setCurrentTime(formatStatusTime(new Date()));\n };\n\n updateCurrentTime();\n\n let interval: number | undefined;\n const now = new Date();\n const nextMinuteDelay =\n (60 - now.getSeconds()) * 1000 - now.getMilliseconds();\n const timeout = window.setTimeout(() => {\n updateCurrentTime();\n interval = window.setInterval(updateCurrentTime, 60_000);\n }, nextMinuteDelay);\n\n return () => {\n window.clearTimeout(timeout);\n if (interval !== undefined) {\n window.clearInterval(interval);\n }\n };\n }, [statusTime]);\n\n return statusTime ?? currentTime;\n}\n\nfunction formatStatusTime(date: Date) {\n return `${date.getHours().toString().padStart(2, \"0\")}:${date\n .getMinutes()\n .toString()\n .padStart(2, \"0\")}`;\n}\n\nfunction StatusBar({ time, screenWidth, palette }: StatusBarProps) {\n return (\n <div\n aria-hidden\n className=\"absolute left-0 right-0 top-0 z-50 flex items-center justify-between px-6 text-[11px] font-semibold tracking-tight\"\n style={{ height: `${Math.floor((screenWidth * 59) / 390)}px` }}\n >\n <span className=\"tabular-nums\" style={{ color: palette.statusText }}>\n {time}\n </span>\n <div\n className=\"flex items-center gap-1\"\n style={{ color: palette.statusText }}\n >\n <IosSignal color={palette.statusText} />\n <Wifi className=\"h-3 w-3\" strokeWidth={2.4} aria-hidden />\n <IosBattery color={palette.statusText} />\n </div>\n </div>\n );\n}\n\nfunction IosSignal({ color }: { color: string }) {\n return (\n <span className=\"flex h-3 w-3 items-end gap-[1px]\" aria-hidden>\n {[4, 6, 8, 10].map((height) => (\n <span\n key={height}\n className=\"w-[2px] rounded-sm\"\n style={{ height, backgroundColor: color }}\n />\n ))}\n </span>\n );\n}\n\nfunction IosBattery({ color }: { color: string }) {\n return (\n <span className=\"flex items-center gap-[1px]\" aria-hidden>\n <span\n className=\"relative h-[8px] w-[16px] rounded-[2px] border\"\n style={{ borderColor: color }}\n >\n <span\n className=\"absolute bottom-[1px] left-[1px] top-[1px] w-[10px] rounded-[1px]\"\n style={{ backgroundColor: color }}\n />\n </span>\n <span\n className=\"h-[4px] w-[1.5px] rounded-r\"\n style={{ backgroundColor: color }}\n />\n </span>\n );\n}\n\ninterface WhatsAppHeaderProps {\n contactName: string;\n subtitle?: string;\n profilePhoto?: string;\n profilePhotoAlt?: string;\n profileAvatar?: React.ReactNode;\n showActions: boolean;\n backgroundColor: React.CSSProperties[\"backgroundColor\"];\n avatarBackgroundColor: React.CSSProperties[\"backgroundColor\"];\n palette: WhatsAppPalette;\n}\n\nfunction WhatsAppHeader({\n contactName,\n subtitle,\n profilePhoto,\n profilePhotoAlt,\n profileAvatar,\n showActions,\n backgroundColor,\n avatarBackgroundColor,\n palette,\n}: WhatsAppHeaderProps) {\n return (\n <div\n className=\"relative shadow-[0_1px_0_rgba(17,27,33,0.08)]\"\n style={{ backgroundColor, color: palette.headerText }}\n >\n <div className=\"flex items-center gap-2 px-2.5 pb-2 pt-2\">\n <ChevronLeft\n className=\"h-5 w-5 shrink-0\"\n strokeWidth={2.4}\n style={{ color: palette.action }}\n aria-hidden\n />\n <ProfileAvatar\n contactName={contactName}\n profilePhoto={profilePhoto}\n profilePhotoAlt={profilePhotoAlt}\n profileAvatar={profileAvatar}\n backgroundColor={avatarBackgroundColor}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[13px] font-semibold leading-tight\">\n {contactName}\n </p>\n {subtitle ? (\n <p\n className=\"truncate text-[10px] leading-tight\"\n style={{ color: palette.mutedText }}\n >\n {subtitle}\n </p>\n ) : null}\n </div>\n {showActions ? (\n <>\n <Video\n className=\"h-4 w-4 shrink-0\"\n strokeWidth={2.2}\n style={{ color: palette.action }}\n aria-hidden\n />\n <PhoneIcon\n className=\"h-3.5 w-3.5 shrink-0\"\n strokeWidth={2.2}\n style={{ color: palette.action }}\n aria-hidden\n />\n <MoreVertical\n className=\"h-4 w-4 shrink-0\"\n strokeWidth={2.2}\n style={{ color: palette.action }}\n aria-hidden\n />\n </>\n ) : null}\n </div>\n </div>\n );\n}\n\ninterface ProfileAvatarProps {\n contactName: string;\n profilePhoto?: string;\n profilePhotoAlt?: string;\n profileAvatar?: React.ReactNode;\n backgroundColor: React.CSSProperties[\"backgroundColor\"];\n}\n\nfunction ProfileAvatar({\n contactName,\n profilePhoto,\n profilePhotoAlt,\n profileAvatar,\n backgroundColor,\n}: ProfileAvatarProps) {\n if (profileAvatar) {\n return (\n <div\n className=\"flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full\"\n style={{ backgroundColor }}\n >\n {profileAvatar}\n </div>\n );\n }\n\n if (profilePhoto) {\n return (\n <img\n src={profilePhoto}\n alt={profilePhotoAlt ?? contactName}\n className=\"h-8 w-8 shrink-0 rounded-full object-cover\"\n style={{ backgroundColor }}\n />\n );\n }\n\n return (\n <div\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-[11px] font-bold uppercase text-white\"\n style={{ backgroundColor }}\n >\n {getInitials(contactName)}\n </div>\n );\n}\n\nfunction getInitials(name: string) {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n const first = parts[0]?.[0] ?? \"W\";\n const second = parts.length > 1 ? parts[parts.length - 1]?.[0] : undefined;\n return `${first}${second ?? \"\"}`;\n}\n\ninterface WhatsAppMessageBubbleProps {\n message: WhatsAppMockupMessage;\n palette: WhatsAppPalette;\n}\n\nfunction WhatsAppMessageBubble({\n message,\n palette,\n}: WhatsAppMessageBubbleProps) {\n const direction = message.direction ?? \"outgoing\";\n const type = message.type ?? \"text\";\n const isOutgoing = direction === \"outgoing\";\n const isCustom = type === \"custom\";\n const isAudio = type === \"audio\";\n const bubbleColor = isOutgoing ? palette.outgoing : palette.incoming;\n\n // Custom bubbles render their own container — no background, padding,\n // tail, shadow, or auto meta from the design-system. Author owns the visual.\n if (isCustom) {\n return (\n <div\n className={cn(\n \"relative z-10 max-w-[86%]\",\n isOutgoing ? \"ml-auto\" : \"mr-auto\",\n message.className,\n )}\n style={message.style}\n >\n <div className={message.contentClassName}>{message.children}</div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"relative z-10 max-w-[86%] rounded-[14px] px-2.5 py-2 shadow-[0_1px_1.5px_rgba(15,23,42,0.11)]\",\n isOutgoing ? \"ml-auto rounded-tr-[4px]\" : \"mr-auto rounded-tl-[4px]\",\n // Audio bubbles host an absolute meta row at the bottom — reserve space.\n isAudio && \"min-w-[210px] pb-[18px]\",\n message.className,\n )}\n style={{\n backgroundColor: bubbleColor,\n color: isOutgoing ? palette.outgoingText : palette.incomingText,\n boxShadow: `0 1px 1.5px ${palette.shadow}`,\n ...message.style,\n }}\n >\n <BubbleTail\n side={isOutgoing ? \"out\" : \"in\"}\n color={message.style?.backgroundColor?.toString() ?? bubbleColor}\n />\n\n <div\n className={cn(\n // text size & leading set on the container so children (JSX) inherits\n \"text-[10.5px] leading-snug\",\n message.contentClassName,\n )}\n >\n {message.children ??\n (isAudio ? (\n <AudioMessage message={message} palette={palette} />\n ) : (\n <p className=\"max-w-[31ch]\">{message.text}</p>\n ))}\n </div>\n\n {message.hideMeta ? null : isAudio ? (\n <AudioMeta\n duration={message.duration}\n time={message.time}\n direction={direction}\n read={message.read}\n palette={palette}\n />\n ) : (\n <MessageMeta\n time={message.time}\n direction={direction}\n read={message.read}\n palette={palette}\n />\n )}\n </div>\n );\n}\n\ninterface AudioMessageProps {\n message: WhatsAppMockupMessage;\n palette: WhatsAppPalette;\n}\n\nfunction AudioMessage({ message, palette }: AudioMessageProps) {\n const waveform = message.waveform ?? DEFAULT_WAVEFORM;\n // First ~25% of the waveform is rendered as \"played\" (highlighted color).\n const playedThreshold = Math.max(1, Math.round(waveform.length * 0.22));\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Avatar circular com badge de microfone */}\n <div className=\"relative shrink-0\" aria-hidden>\n <span\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-[11px] font-bold uppercase text-white\"\n style={{ backgroundColor: palette.audioAvatarBg }}\n >\n V\n </span>\n <span\n className=\"absolute -bottom-0.5 -right-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full\"\n style={{ backgroundColor: palette.audioMicBadgeBg }}\n >\n <Mic\n className=\"h-2 w-2 text-white\"\n strokeWidth={2.4}\n aria-hidden\n />\n </span>\n </div>\n\n {/* Botão play (sem círculo) */}\n <Play\n className=\"h-4 w-4 shrink-0 fill-current\"\n strokeWidth={0}\n style={{ color: palette.audioPlayIcon }}\n aria-hidden\n />\n\n {/* Waveform: barras tocadas em destaque + restantes em cinza */}\n <div className=\"flex h-5 flex-1 items-center gap-[1.5px]\" aria-hidden>\n {waveform.map((height, index) => (\n <span\n key={`${height}-${index}`}\n className=\"flex-1 rounded-[2px]\"\n style={{\n backgroundColor:\n index < playedThreshold\n ? palette.audioWavePlayed\n : palette.audioWaveMuted,\n height: Math.max(4, Math.round(height * 0.5)),\n }}\n />\n ))}\n </div>\n </div>\n );\n}\n\ninterface AudioMetaProps {\n duration?: string;\n time: string;\n direction: WhatsAppMessageDirection;\n read?: boolean;\n palette: WhatsAppPalette;\n}\n\nfunction AudioMeta({\n duration,\n time,\n direction,\n read,\n palette,\n}: AudioMetaProps) {\n const isOutgoing = direction === \"outgoing\";\n const metaColor = isOutgoing ? palette.outgoingMeta : palette.subtleText;\n\n return (\n <div\n className=\"pointer-events-none absolute bottom-[5px] left-[44px] right-2.5 flex items-center justify-between text-[9px] font-medium leading-none tabular-nums\"\n style={{ color: metaColor }}\n >\n <span>{duration}</span>\n <span className=\"inline-flex items-center gap-[3px] whitespace-nowrap\">\n <span>{time}</span>\n {isOutgoing ? (\n read === undefined ? (\n <Check className=\"h-3 w-3\" strokeWidth={2.5} aria-hidden />\n ) : (\n <CheckCheck\n className=\"h-3 w-3\"\n strokeWidth={2.5}\n style={{ color: read ? palette.read : undefined }}\n aria-hidden\n />\n )\n ) : null}\n </span>\n </div>\n );\n}\n\ninterface MessageMetaProps {\n time: string;\n direction: WhatsAppMessageDirection;\n read?: boolean;\n palette: WhatsAppPalette;\n}\n\nfunction MessageMeta({ time, direction, read, palette }: MessageMetaProps) {\n const isOutgoing = direction === \"outgoing\";\n\n return (\n <div\n className=\"mt-1 flex items-center justify-end gap-1 text-[9px]\"\n style={{ color: isOutgoing ? palette.outgoingMeta : palette.subtleText }}\n >\n <span>{time}</span>\n {isOutgoing ? (\n read === undefined ? (\n <Check className=\"h-3 w-3\" strokeWidth={2.5} aria-hidden />\n ) : (\n <CheckCheck\n className=\"h-3 w-3\"\n strokeWidth={2.5}\n style={{ color: read ? palette.read : undefined }}\n aria-hidden\n />\n )\n ) : null}\n </div>\n );\n}\n\ninterface BubbleTailProps {\n side: \"in\" | \"out\";\n color: string;\n}\n\nfunction BubbleTail({ side, color }: BubbleTailProps) {\n const path =\n side === \"out\"\n ? \"M0 0H14C10 1.8 7.4 4.7 6.4 8.3L5.3 12C4.2 7 2.4 2.9 0 0Z\"\n : \"M14 0H0C4 1.8 6.6 4.7 7.6 8.3L8.7 12C9.8 7 11.6 2.9 14 0Z\";\n\n return (\n <svg\n aria-hidden\n className={cn(\n \"pointer-events-none absolute top-0 h-3.5 w-3.5\",\n side === \"out\" ? \"-right-[7px]\" : \"-left-[7px]\",\n )}\n style={{ fill: color }}\n viewBox=\"0 0 14 12\"\n >\n <path d={path} />\n </svg>\n );\n}\n\nfunction WhatsAppWallpaper({ palette }: { palette: WhatsAppPalette }) {\n const patternId = useId().replace(/:/g, \"\");\n\n return (\n <svg\n aria-hidden\n className=\"pointer-events-none absolute inset-0 h-full w-full\"\n >\n <defs>\n <pattern\n id={patternId}\n width=\"46\"\n height=\"46\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M8 11h12m-6-6v12M31 7c4 0 7 3 7 7 0 5-5 7-7 10-2-3-7-5-7-10 0-4 3-7 7-7Zm-14 25c4 0 6 2 6 5s-2 5-6 5-6-2-6-5 2-5 6-5Zm19 10 6-6m-6 0 6 6\"\n stroke={palette.wallpaperStroke}\n strokeWidth=\"1\"\n fill=\"none\"\n opacity={palette.wallpaperOpacity}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M34 29c3 0 5 2 5 4s-2 4-5 4h-6v-4c0-2 3-4 6-4Z\"\n stroke={palette.wallpaperStroke}\n strokeWidth=\"1\"\n fill=\"none\"\n opacity={palette.wallpaperOpacity}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill={`url(#${patternId})`} />\n </svg>\n );\n}\n\ninterface WhatsAppComposerProps {\n composerPlaceholder: string;\n palette: WhatsAppPalette;\n}\n\nfunction WhatsAppComposer({\n composerPlaceholder,\n palette,\n}: WhatsAppComposerProps) {\n return (\n <div\n className=\"flex items-center gap-1.5 px-2 pb-[22px] pt-2\"\n style={{ backgroundColor: palette.composer }}\n >\n <div\n className=\"flex min-w-0 flex-1 items-center gap-1.5 rounded-full px-2.5 py-1.5 shadow-[0_1px_1px_rgba(15,23,42,0.06)]\"\n style={{\n backgroundColor: palette.composerInput,\n color: palette.composerText,\n }}\n >\n <Smile className=\"h-3.5 w-3.5 shrink-0\" strokeWidth={2} aria-hidden />\n <span className=\"flex-1 truncate text-[10px]\">\n {composerPlaceholder}\n </span>\n <Paperclip\n className=\"h-3.5 w-3.5 shrink-0\"\n strokeWidth={2}\n aria-hidden\n />\n <Camera className=\"h-3.5 w-3.5 shrink-0\" strokeWidth={2} aria-hidden />\n </div>\n <span\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full\"\n style={{ backgroundColor: palette.micBg, color: palette.micIcon }}\n >\n <Mic className=\"h-3.5 w-3.5\" strokeWidth={2.2} aria-hidden />\n </span>\n </div>\n );\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Text } from \"lucide-react\";\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport interface TocItem {\n /** Hash URL — must start with '#'. The id (after the hash) must match an element id in the DOM. */\n url: string;\n title: string;\n /** 1, 2, 3, 4 — controls indentation. */\n depth: number;\n}\n\nexport interface TableOfContentsProps {\n items: TocItem[];\n /** Title shown above the items. Default: 'Nesta página'. Pass null to hide. */\n title?: string | null;\n /** Whether to show the active-range highlight bar (TocThumb). Default true. */\n showThumb?: boolean;\n /** When true, only one item can be active at a time. Default false (multi-active). */\n single?: boolean;\n /** Root margin for the IntersectionObserver. Default '0px 0px -70% 0px'. */\n rootMargin?: string;\n /** Threshold for the IntersectionObserver. Default 0. */\n threshold?: number | number[];\n className?: string;\n /** Called when active set changes. */\n onActiveChange?: (activeIds: string[]) => void;\n}\n\nexport interface TOCProviderProps {\n items: TocItem[];\n single?: boolean;\n rootMargin?: string;\n threshold?: number | number[];\n children: React.ReactNode;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Internal types */\n/* -------------------------------------------------------------------------- */\n\ninterface ObservedItem {\n id: string;\n active: boolean;\n fallback: boolean;\n /** Last update timestamp — used to disambiguate which active item wins. */\n t: number;\n original: TocItem;\n}\n\ntype Listener = (items: ObservedItem[]) => void;\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction getIdFromUrl(url: string): string | null {\n if (typeof url === \"string\" && url.startsWith(\"#\")) return url.slice(1);\n return null;\n}\n\nfunction arraysShallowEqual<T>(a: T[], b: T[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\nfunction findScrollableParent(el: HTMLElement | null): HTMLElement {\n let current = el?.parentElement;\n while (current && current !== document.body) {\n const style = getComputedStyle(current);\n const overflowY = style.overflowY;\n if (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\") {\n // Confirm the element can actually scroll\n if (current.scrollHeight > current.clientHeight) return current;\n }\n current = current.parentElement;\n }\n return document.documentElement;\n}\n\nfunction scrollAnchorIntoView(\n anchor: HTMLElement,\n container: HTMLElement,\n options: { behavior?: ScrollBehavior; block?: \"start\" | \"center\" | \"end\" } = {},\n) {\n const { behavior = \"smooth\", block = \"center\" } = options;\n const containerRect = container.getBoundingClientRect();\n const anchorRect = anchor.getBoundingClientRect();\n\n const offsetTopRelativeToContainer =\n anchorRect.top - containerRect.top + container.scrollTop;\n\n let targetScroll: number;\n if (block === \"center\") {\n targetScroll =\n offsetTopRelativeToContainer - container.clientHeight / 2 + anchor.clientHeight / 2;\n } else if (block === \"end\") {\n targetScroll =\n offsetTopRelativeToContainer - container.clientHeight + anchor.clientHeight;\n } else {\n targetScroll = offsetTopRelativeToContainer;\n }\n\n container.scrollTo({\n top: Math.max(0, targetScroll),\n behavior,\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Observer */\n/* -------------------------------------------------------------------------- */\n\nclass TocObserver {\n items: ObservedItem[] = [];\n single = false;\n private intersectionObserver: IntersectionObserver | null = null;\n private listeners = new Set<Listener>();\n\n listen(fn: Listener): void {\n this.listeners.add(fn);\n }\n\n unlisten(fn: Listener): void {\n this.listeners.delete(fn);\n }\n\n setItems(nextItems: TocItem[]): void {\n if (this.intersectionObserver) {\n for (const item of this.items) {\n const el = document.getElementById(item.id);\n if (el) this.intersectionObserver.unobserve(el);\n }\n }\n\n const next: ObservedItem[] = [];\n for (const item of nextItems) {\n const id = getIdFromUrl(item.url);\n if (!id) continue;\n next.push({\n id,\n active: false,\n fallback: false,\n t: 0,\n original: item,\n });\n }\n\n this.update(next);\n this.observeAll();\n }\n\n watch(options: IntersectionObserverInit): void {\n if (this.intersectionObserver) return;\n if (typeof window === \"undefined\") return;\n this.intersectionObserver = new IntersectionObserver(\n this.handleIntersection.bind(this),\n options,\n );\n this.observeAll();\n }\n\n unwatch(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n }\n\n private handleIntersection(entries: IntersectionObserverEntry[]): void {\n if (entries.length === 0) return;\n\n let hasActive = false;\n const updated = this.items.map((item) => {\n const entry = entries.find((e) => (e.target as HTMLElement).id === item.id);\n let active = entry ? entry.isIntersecting : item.active && !item.fallback;\n if (this.single && hasActive) active = false;\n\n let nextItem = item;\n if (item.active !== active) {\n nextItem = {\n ...item,\n t: Date.now(),\n active,\n fallback: false,\n };\n }\n if (active) hasActive = true;\n return nextItem;\n });\n\n // Fallback: if nothing intersects, mark the closest item to the viewport top as active.\n if (!hasActive && entries[0].rootBounds) {\n const viewTop = entries[0].rootBounds.top;\n let min = Number.POSITIVE_INFINITY;\n let fallbackIdx = -1;\n for (let i = 0; i < updated.length; i++) {\n const el = document.getElementById(updated[i].id);\n if (!el) continue;\n const distance = Math.abs(viewTop - el.getBoundingClientRect().top);\n if (distance < min) {\n min = distance;\n fallbackIdx = i;\n }\n }\n if (fallbackIdx !== -1) {\n updated[fallbackIdx] = {\n ...updated[fallbackIdx],\n active: true,\n fallback: true,\n t: Date.now(),\n };\n }\n }\n\n this.update(updated);\n }\n\n private observeAll(): void {\n if (!this.intersectionObserver) return;\n for (const item of this.items) {\n const el = document.getElementById(item.id);\n if (el) this.intersectionObserver.observe(el);\n }\n }\n\n private update(next: ObservedItem[]): void {\n this.items = next;\n for (const fn of this.listeners) fn(next);\n }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Context + Provider */\n/* -------------------------------------------------------------------------- */\n\nconst ObserverContext = createContext<TocObserver | null>(null);\nconst ItemsContext = createContext<TocItem[]>([]);\nconst LinksRefContext = createContext<React.MutableRefObject<\n Map<string, HTMLAnchorElement>\n> | null>(null);\n\nfunction useObserver(): TocObserver {\n const observer = useContext(ObserverContext);\n if (!observer) {\n throw new Error(\n \"TableOfContents hooks must be used inside <TOCProvider> or <TableOfContents>.\",\n );\n }\n return observer;\n}\n\n/**\n * Headless provider that drives the scrollspy. Use directly when you want to\n * render the visual ToC yourself (e.g. mobile drawer, custom layout).\n */\nexport function TOCProvider({\n items,\n single = false,\n rootMargin = \"0px 0px -70% 0px\",\n threshold = 0,\n children,\n}: TOCProviderProps): React.JSX.Element {\n const observer = useMemo(() => new TocObserver(), []);\n observer.single = single;\n\n useEffect(() => {\n observer.setItems(items);\n }, [observer, items]);\n\n useEffect(() => {\n observer.watch({ rootMargin, threshold });\n return () => observer.unwatch();\n }, [observer, rootMargin, threshold]);\n\n return (\n <ObserverContext.Provider value={observer}>\n <ItemsContext.Provider value={items}>{children}</ItemsContext.Provider>\n </ObserverContext.Provider>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Hooks */\n/* -------------------------------------------------------------------------- */\n\nfunction useObserverState<T>(\n select: (items: ObservedItem[]) => T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const observer = useObserver();\n const [value, setValue] = useState<T>(() => select(observer.items));\n\n // Keep the latest selectors in refs so the effect doesn't re-subscribe each render.\n const selectRef = useRef(select);\n const isEqualRef = useRef(isEqual);\n selectRef.current = select;\n isEqualRef.current = isEqual;\n\n useEffect(() => {\n const listener: Listener = (items) => {\n const next = selectRef.current(items);\n setValue((prev) => (isEqualRef.current(prev, next) ? prev : next));\n };\n observer.listen(listener);\n return () => observer.unlisten(listener);\n }, [observer]);\n\n return value;\n}\n\n/** Returns the id of the most recently activated heading (best guess). */\nexport function useActiveAnchor(): string | undefined {\n return useObserverState<string | undefined>((items) => {\n let best: ObservedItem | undefined;\n for (const item of items) {\n if (!item.active) continue;\n if (!best || item.t > best.t) best = item;\n }\n return best?.id;\n });\n}\n\n/** Returns the ids of every currently active heading. */\nexport function useActiveAnchors(): string[] {\n return useObserverState<string[]>(\n (items) => {\n const out: string[] = [];\n for (const item of items) if (item.active) out.push(item.id);\n return out;\n },\n arraysShallowEqual,\n );\n}\n\n/** Returns the static items list registered with the provider. */\nexport function useTOCItems(): TocItem[] {\n return useContext(ItemsContext);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Visual */\n/* -------------------------------------------------------------------------- */\n\nfunction handleAnchorClick(e: React.MouseEvent<HTMLAnchorElement>, id: string) {\n const el = document.getElementById(id);\n if (!el) return;\n e.preventDefault();\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n if (typeof window !== \"undefined\" && window.history) {\n window.history.replaceState(null, \"\", `#${id}`);\n }\n}\n\ninterface TocAnchorProps {\n item: TocItem;\n}\n\nfunction TocAnchor({ item }: TocAnchorProps) {\n const id = getIdFromUrl(item.url) ?? \"\";\n const activeIds = useActiveAnchors();\n const isActive = id ? activeIds.includes(id) : false;\n const linksRef = useContext(LinksRefContext);\n\n const setRef = useCallback(\n (node: HTMLAnchorElement | null) => {\n if (!linksRef || !id) return;\n if (node) linksRef.current.set(id, node);\n else linksRef.current.delete(id);\n },\n [linksRef, id],\n );\n\n return (\n <a\n ref={setRef}\n href={item.url}\n data-active={isActive}\n onClick={(e) => handleAnchorClick(e, id)}\n className={cn(\n \"py-1.5 text-sm transition-colors scroll-m-4 wrap-anywhere first:pt-0 last:pb-0\",\n \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n \"hover:text-[var(--dashboard-text-primary,#2d2d2d)]\",\n \"data-[active=true]:text-[var(--dashboard-primary,#e74410)]\",\n item.depth <= 2 && \"pl-3\",\n item.depth === 3 && \"pl-6\",\n item.depth >= 4 && \"pl-8\",\n )}\n >\n {item.title}\n </a>\n );\n}\n\ninterface ThumbComputed {\n positions: Array<[number, number]>;\n}\n\nfunction TocThumb({\n computed,\n}: {\n computed: ThumbComputed;\n}) {\n const ref = useRef<HTMLDivElement | null>(null);\n const observer = useObserver();\n\n const calculate = useCallback(\n (items: ObservedItem[]): Record<string, string> => {\n const out: Record<string, string> = {};\n const startIdx = items.findIndex((item) => item.active);\n if (startIdx === -1) return out;\n let endIdx = startIdx;\n for (let i = items.length - 1; i >= startIdx; i--) {\n if (items[i].active) {\n endIdx = i;\n break;\n }\n }\n const startPos = computed.positions[startIdx];\n const endPos = computed.positions[endIdx];\n if (!startPos || !endPos) return out;\n out[\"--track-top\"] = `${startPos[0]}px`;\n out[\"--track-bottom\"] = `${endPos[1]}px`;\n return out;\n },\n [computed],\n );\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const apply = (items: ObservedItem[]) => {\n const styles = calculate(items);\n for (const [k, v] of Object.entries(styles)) {\n el.style.setProperty(k, v);\n }\n };\n apply(observer.items);\n observer.listen(apply);\n return () => observer.unlisten(apply);\n }, [observer, calculate]);\n\n const initialStyles = calculate(observer.items);\n\n return (\n <div\n ref={ref}\n aria-hidden\n className=\"absolute inset-y-0 left-0 w-px bg-[var(--dashboard-primary,#e74410)] transition-[clip-path]\"\n style={{\n clipPath:\n \"polygon(0 var(--track-top, 0), 100% var(--track-top, 0), 100% var(--track-bottom, 0), 0 var(--track-bottom, 0))\",\n ...initialStyles,\n }}\n />\n );\n}\n\ninterface TocListProps {\n items: TocItem[];\n showThumb: boolean;\n}\n\nfunction TocList({ items, showThumb }: TocListProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [computed, setComputed] = useState<ThumbComputed | null>(null);\n\n const recompute = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n if (items.length === 0) {\n setComputed(null);\n return;\n }\n const positions: Array<[number, number]> = [];\n for (const item of items) {\n const el = container.querySelector<HTMLAnchorElement>(\n `a[href=\"${item.url}\"]`,\n );\n if (!el) {\n positions.push([0, 0]);\n continue;\n }\n const styles = window.getComputedStyle(el);\n const top = el.offsetTop + parseFloat(styles.paddingTop || \"0\");\n const bottom =\n el.offsetTop + el.clientHeight - parseFloat(styles.paddingBottom || \"0\");\n positions.push([top, bottom]);\n }\n setComputed({ positions });\n }, [items]);\n\n useLayoutEffect(() => {\n recompute();\n }, [recompute]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => recompute());\n ro.observe(container);\n return () => ro.disconnect();\n }, [recompute]);\n\n return (\n <div className=\"relative\">\n {showThumb && computed && <TocThumb computed={computed} />}\n <div\n ref={containerRef}\n className=\"flex flex-col border-l border-[var(--dashboard-text-secondary,#6b7280)]/15\"\n >\n {items.map((item) => (\n <TocAnchor key={item.url} item={item} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ActiveChangeReporter({\n onActiveChange,\n}: {\n onActiveChange: (ids: string[]) => void;\n}) {\n const ids = useActiveAnchors();\n const cbRef = useRef(onActiveChange);\n cbRef.current = onActiveChange;\n useEffect(() => {\n cbRef.current(ids);\n }, [ids]);\n return null;\n}\n\nfunction ActiveScrollSync({\n linksRef,\n}: {\n linksRef: React.MutableRefObject<Map<string, HTMLAnchorElement>>;\n}) {\n const activeId = useActiveAnchor();\n\n useEffect(() => {\n if (!activeId) return;\n const link = linksRef.current.get(activeId);\n if (!link) return;\n const container = findScrollableParent(link);\n // Don't scroll the page itself — only the inner ToC container.\n if (container === document.documentElement) return;\n scrollAnchorIntoView(link, container);\n }, [activeId, linksRef]);\n\n return null;\n}\n\n/**\n * Adapted from Fumadocs (MIT) — https://github.com/fuma-nama/fumadocs\n *\n * Scrollspy table of contents. Renders a sticky list of headings and tracks\n * which are visible in the viewport via IntersectionObserver. The active\n * range is highlighted with a thin animated bar (TocThumb).\n */\nexport function TableOfContents({\n items,\n title = \"Nesta página\",\n showThumb = true,\n single = false,\n rootMargin = \"0px 0px -70% 0px\",\n threshold = 0,\n className,\n onActiveChange,\n}: TableOfContentsProps): React.JSX.Element {\n const linksRef = useRef<Map<string, HTMLAnchorElement>>(new Map());\n\n return (\n <TOCProvider\n items={items}\n single={single}\n rootMargin={rootMargin}\n threshold={threshold}\n >\n <LinksRefContext.Provider value={linksRef}>\n <nav\n aria-label={typeof title === \"string\" ? title : \"Sumário\"}\n className={cn(\"text-sm\", className)}\n >\n {title !== null && (\n <h3 className=\"inline-flex items-center gap-1.5 text-sm font-medium mb-3 text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <Text className=\"h-4 w-4\" aria-hidden />\n {title}\n </h3>\n )}\n <TocList items={items} showThumb={showThumb} />\n {onActiveChange && (\n <ActiveChangeReporter onActiveChange={onActiveChange} />\n )}\n <ActiveScrollSync linksRef={linksRef} />\n </nav>\n </LinksRefContext.Provider>\n </TOCProvider>\n );\n}\n","import type { SVGProps } from \"react\";\n\n// Brand SVG paths mirror the react-icons/fa Font Awesome definitions used by\n// Meu Construtor, keeping product footers consistent without a react-icons dependency.\nexport const socialIconNames = [\n \"whatsapp\",\n \"instagram\",\n \"linkedin\",\n \"github\",\n \"youtube\",\n] as const;\n\nexport type SocialIconName = (typeof socialIconNames)[number];\n\ninterface SocialIconDefinition {\n viewBox: string;\n path: string;\n}\n\nexport const socialIconPaths: Record<SocialIconName, SocialIconDefinition> = {\n whatsapp: {\n viewBox: \"0 0 448 512\",\n path: \"M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z\",\n },\n instagram: {\n viewBox: \"0 0 448 512\",\n path: \"M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z\",\n },\n linkedin: {\n viewBox: \"0 0 448 512\",\n path: \"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z\",\n },\n github: {\n viewBox: \"0 0 496 512\",\n path: \"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z\",\n },\n youtube: {\n viewBox: \"0 0 576 512\",\n path: \"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z\",\n },\n};\n\nexport interface SocialIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"children\" | \"name\"> {\n /** Social network glyph to render. */\n name: SocialIconName;\n /** Width and height in pixels. Default: 24. */\n size?: number | string;\n /** Accessible label. When omitted, the SVG is hidden from assistive tech. */\n title?: string;\n}\n\nexport function SocialIcon({\n name,\n size = 24,\n title,\n fill = \"currentColor\",\n ...props\n}: SocialIconProps) {\n const icon = socialIconPaths[name];\n\n return (\n <svg\n width={size}\n height={size}\n viewBox={icon.viewBox}\n fill={fill}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden={title ? undefined : true}\n role={title ? \"img\" : undefined}\n {...props}\n >\n {title ? <title>{title}</title> : null}\n <path d={icon.path} />\n </svg>\n );\n}\n\nexport type SocialIconShortcutProps = Omit<SocialIconProps, \"name\">;\n\nexport function WhatsappIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"whatsapp\" {...props} />;\n}\n\nexport function InstagramIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"instagram\" {...props} />;\n}\n\nexport function LinkedinIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"linkedin\" {...props} />;\n}\n\nexport function GithubIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"github\" {...props} />;\n}\n\nexport function YoutubeIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"youtube\" {...props} />;\n}\n","import type { ConversationParticipant } from \"./types\";\n\nexport const cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function getConversationInitials(participant: ConversationParticipant) {\n if (participant.initials) return participant.initials;\n\n const value = participant.name || participant.email || participant.phone || \"?\";\n return value\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part.charAt(0).toUpperCase())\n .join(\"\");\n}\n\nexport function defaultConversationDateFormatter(value: string | Date) {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const day = 24 * 60 * 60 * 1000;\n\n if (diff >= 0 && diff < day) {\n return date.toLocaleTimeString(\"pt-BR\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n }\n\n if (diff >= day && diff < day * 2) return \"Ontem\";\n\n return date.toLocaleDateString(\"pt-BR\", {\n day: \"2-digit\",\n month: \"2-digit\",\n });\n}\n\nexport function defaultConversationTimeFormatter(value: string | Date) {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n\n return date.toLocaleString(\"pt-BR\", {\n day: \"2-digit\",\n month: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationAvatarProps } from \"./types\";\nimport { cn, getConversationInitials } from \"./utils\";\n\nexport function ConversationAvatar({\n participant,\n size = \"md\",\n className,\n}: ConversationAvatarProps) {\n const sizeClass = {\n sm: \"h-9 w-9 text-sm\",\n md: \"h-11 w-11 text-base\",\n lg: \"h-12 w-12 text-lg\",\n }[size];\n\n if (participant.avatarUrl) {\n return (\n <img\n src={participant.avatarUrl}\n alt={participant.name}\n className={cn(\"flex-shrink-0 rounded-full object-cover\", sizeClass, className)}\n />\n );\n }\n\n return (\n <div\n className={cn(\n \"flex flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 font-semibold text-[var(--dashboard-primary,#37a501)]\",\n sizeClass,\n className,\n )}\n >\n {getConversationInitials(participant)}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef } from \"react\";\nimport { AlertTriangle, Bot, Loader2, Paperclip, Send } from \"lucide-react\";\nimport type { ConversationComposerProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationComposer({\n value = \"\",\n onChange,\n onSend,\n onAttachClick,\n onFileSelect,\n acceptedFileTypes,\n placeholder = \"Digite sua mensagem...\",\n disabled = false,\n sending = false,\n uploading = false,\n status = \"active\",\n inactiveLabel = \"IA esta respondendo esta conversa\",\n expiredLabel = \"Janela de atendimento expirada. Envie um template para reabrir a conversa.\",\n attachLabel = \"Enviar arquivo\",\n sendLabel = \"Enviar mensagem\",\n className,\n}: ConversationComposerProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const isExpired = status === \"expired\";\n const isAi = status === \"ai\";\n const isDisabled = disabled || status === \"disabled\" || isExpired || isAi;\n const canAttach = !!onAttachClick || !!onFileSelect;\n\n if (isAi) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-2 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] px-4 py-4 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\",\n className,\n )}\n >\n <Bot size={16} className=\"text-[var(--dashboard-primary,#37a501)]\" />\n {inactiveLabel}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] px-4 py-3 sm:px-6\",\n className,\n )}\n >\n {isExpired && (\n <div className=\"mb-2 flex items-center gap-2 rounded-lg border border-[var(--dashboard-status-warning,#f59e0b)]/30 bg-[var(--dashboard-status-warning,#f59e0b)]/10 p-2 text-xs text-[var(--dashboard-status-warning,#f59e0b)]\">\n <AlertTriangle size={16} className=\"flex-shrink-0\" />\n <p>{expiredLabel}</p>\n </div>\n )}\n\n {onFileSelect && (\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n accept={acceptedFileTypes}\n onChange={(event) => {\n const file = event.target.files?.[0];\n if (file) void onFileSelect(file);\n event.target.value = \"\";\n }}\n />\n )}\n\n <div className=\"flex items-center gap-2\">\n {canAttach && (\n <button\n type=\"button\"\n onClick={() => {\n onAttachClick?.();\n if (onFileSelect) fileInputRef.current?.click();\n }}\n disabled={disabled || sending || uploading}\n className=\"inline-flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg text-[var(--dashboard-text-secondary,#6b7280)] transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/10 hover:text-[var(--dashboard-primary,#37a501)] disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={attachLabel}\n >\n {uploading ? (\n <Loader2 size={18} className=\"animate-spin\" />\n ) : (\n <Paperclip size={18} />\n )}\n </button>\n )}\n\n <input\n type=\"text\"\n value={value}\n onChange={(event) => onChange?.(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n if (!isDisabled && value.trim() && !sending) onSend?.();\n }\n }}\n placeholder={isExpired ? \"Mensagens livres indisponiveis\" : placeholder}\n disabled={isDisabled || sending}\n className=\"h-10 min-w-0 flex-1 rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/25 bg-[var(--dashboard-surface,#ffffff)] px-4 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] outline-none transition-colors focus:border-[var(--dashboard-primary,#37a501)] focus:ring-2 focus:ring-[var(--dashboard-primary,#37a501)]/20 disabled:cursor-not-allowed disabled:bg-[var(--dashboard-text-secondary,#6b7280)]/8 disabled:opacity-60\"\n />\n\n <button\n type=\"button\"\n onClick={onSend}\n disabled={isDisabled || sending || !value.trim()}\n className=\"inline-flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-[var(--dashboard-primary,#37a501)] text-white transition-colors hover:brightness-110 disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={sendLabel}\n >\n {sending ? (\n <Loader2 size={18} className=\"animate-spin\" />\n ) : (\n <Send size={18} />\n )}\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationEventSeparatorProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationEventSeparator({\n label,\n description,\n className,\n}: ConversationEventSeparatorProps) {\n return (\n <div\n className={cn(\"group relative flex w-full items-center gap-3 py-1\", className)}\n title={typeof description === \"string\" ? description : undefined}\n >\n <div className=\"h-px flex-1 bg-[var(--dashboard-text-secondary,#6b7280)]/25\" />\n <span className=\"whitespace-nowrap text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {label}\n </span>\n <div className=\"h-px flex-1 bg-[var(--dashboard-text-secondary,#6b7280)]/25\" />\n {description && (\n <div className=\"pointer-events-none absolute left-1/2 top-full z-10 mt-2 max-w-sm -translate-x-1/2 opacity-0 transition-opacity group-hover:opacity-100\">\n <div className=\"rounded-lg bg-[var(--dashboard-text-primary,#2d2d2d)] px-3 py-2 text-xs text-[var(--dashboard-surface,#ffffff)] shadow-lg\">\n {description}\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationSupportBadgeProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationSupportBadge({\n status,\n label,\n className,\n}: ConversationSupportBadgeProps) {\n if (!status || status === \"none\") return null;\n\n const classes =\n status === \"requested\"\n ? \"bg-[var(--dashboard-status-warning,#f59e0b)] text-white\"\n : \"bg-[var(--dashboard-primary,#37a501)] text-white\";\n\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-[11px] font-semibold\",\n status === \"requested\" && \"animate-pulse\",\n classes,\n className,\n )}\n >\n {label || (status === \"requested\" ? \"Aguardando\" : \"Em suporte\")}\n </span>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type {\n ConversationListItemProps,\n ConversationPreviewCardProps,\n} from \"./types\";\nimport { ConversationAvatar } from \"./ConversationAvatar\";\nimport { ConversationSupportBadge } from \"./ConversationSupportBadge\";\nimport { cn, defaultConversationDateFormatter } from \"./utils\";\n\nexport function ConversationPreviewCard({\n item,\n selected = item.selected,\n onSelect,\n formatDate = defaultConversationDateFormatter,\n variant = \"card\",\n showContact = true,\n showMeta = true,\n showSupportBadge = true,\n showUnreadBadge = true,\n contentClassName,\n className,\n}: ConversationPreviewCardProps) {\n const timeLabel =\n item.lastMessageLabel ||\n (item.lastMessageAt ? formatDate(item.lastMessageAt) : undefined);\n const compact = variant === \"compact\";\n const list = variant === \"list\";\n\n const content = (\n <div\n className={cn(\n \"flex gap-3\",\n compact ? \"px-3 py-3\" : \"px-4 py-4\",\n contentClassName,\n )}\n >\n <ConversationAvatar participant={item.participant} size={compact ? \"md\" : \"lg\"} />\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-1 flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {item.participant.name}\n </h3>\n {showContact && (item.participant.phone || item.participant.email) && (\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {item.participant.phone || item.participant.email}\n </p>\n )}\n </div>\n {timeLabel && (\n <span className=\"flex-shrink-0 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {timeLabel}\n </span>\n )}\n </div>\n\n {item.lastMessage && (\n <p\n className={cn(\n \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n compact ? \"truncate text-xs\" : \"truncate text-sm\",\n )}\n >\n {item.lastMessage}\n </p>\n )}\n\n {(showMeta || showSupportBadge || showUnreadBadge) && (\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {showMeta ? (\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {typeof item.messageCount === \"number\"\n ? `${item.messageCount} mensagens`\n : item.meta}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n {showSupportBadge && (\n <ConversationSupportBadge\n status={item.supportStatus}\n label={item.supportLabel}\n />\n )}\n {showUnreadBadge && !!item.unreadCount && item.unreadCount > 0 && (\n <span className=\"inline-flex min-w-5 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)] px-1.5 py-0.5 text-xs font-semibold text-white\">\n {item.unreadCount}\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n\n const itemClassName = cn(\n \"group w-full text-left transition-colors\",\n onSelect && \"hover:bg-[var(--dashboard-primary,#37a501)]/8\",\n list\n ? selected\n ? \"border-l-4 border-[var(--dashboard-primary,#37a501)] bg-[var(--dashboard-primary,#37a501)]/10\"\n : item.supportStatus === \"requested\"\n ? \"border-l-4 border-[var(--dashboard-status-warning,#f59e0b)] bg-[var(--dashboard-status-warning,#f59e0b)]/8\"\n : item.supportStatus === \"active\"\n ? \"border-l-4 border-[var(--dashboard-primary,#37a501)] bg-[var(--dashboard-primary,#37a501)]/5\"\n : \"border-l-4 border-transparent\"\n : cn(\n \"rounded-lg border bg-[var(--dashboard-surface,#ffffff)] shadow-sm\",\n compact\n ? \"border-[var(--dashboard-text-secondary,#6b7280)]/15\"\n : \"border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n selected\n ? \"border-[var(--dashboard-primary,#37a501)] ring-2 ring-[var(--dashboard-primary,#37a501)]/15\"\n : item.supportStatus === \"requested\"\n ? \"border-[var(--dashboard-status-warning,#f59e0b)]/35\"\n : \"hover:border-[var(--dashboard-primary,#37a501)]/35\",\n ),\n item.disabled && \"cursor-not-allowed opacity-60\",\n className,\n );\n\n if (onSelect) {\n return (\n <button\n type=\"button\"\n disabled={item.disabled}\n onClick={() => onSelect(item)}\n className={itemClassName}\n >\n {content}\n </button>\n );\n }\n\n return <div className={itemClassName}>{content}</div>;\n}\n\nexport function ConversationListItem(props: ConversationListItemProps) {\n return <ConversationPreviewCard {...props} variant=\"list\" />;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Search, X } from \"lucide-react\";\nimport type { ConversationSearchProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationSearch({\n value = \"\",\n placeholder = \"Buscar conversas...\",\n onChange,\n onClear,\n className,\n}: ConversationSearchProps) {\n return (\n <div className={cn(\"relative w-full\", className)}>\n <Search\n size={18}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-[var(--dashboard-primary,#37a501)]/60\"\n />\n <input\n type=\"search\"\n value={value}\n onChange={(event) => onChange?.(event.target.value)}\n placeholder={placeholder}\n className=\"h-10 w-full rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/25 bg-[var(--dashboard-surface,#ffffff)] pl-10 pr-10 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] outline-none transition-colors focus:border-[var(--dashboard-primary,#37a501)] focus:ring-2 focus:ring-[var(--dashboard-primary,#37a501)]/20\"\n />\n {value && (\n <button\n type=\"button\"\n onClick={onClear || (() => onChange?.(\"\"))}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 rounded p-1 text-[var(--dashboard-text-secondary,#6b7280)] transition-colors hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n aria-label=\"Limpar busca\"\n >\n <X size={16} />\n </button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { MessageCircle } from \"lucide-react\";\nimport { EmptyState } from \"../EmptyState\";\nimport { Loading } from \"../Loading\";\nimport type { ConversationListProps } from \"./types\";\nimport { ConversationPreviewCard } from \"./ConversationPreviewCard\";\nimport { ConversationSearch } from \"./ConversationSearch\";\nimport { cn } from \"./utils\";\n\nexport function ConversationList({\n items,\n selectedId,\n searchValue = \"\",\n searchPlaceholder = \"Buscar conversas...\",\n onSearchChange,\n onClearSearch,\n onSelect,\n loading = false,\n emptyTitle = \"Nenhuma conversa encontrada\",\n emptyDescription,\n formatDate,\n className,\n}: ConversationListProps) {\n return (\n <aside\n className={cn(\n \"flex min-h-0 flex-col overflow-hidden border-r border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)]\",\n className,\n )}\n >\n {(onSearchChange || searchValue) && (\n <div className=\"flex h-20 shrink-0 items-center border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 px-4\">\n <ConversationSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n onClear={onClearSearch}\n className=\"w-full\"\n />\n </div>\n )}\n\n <div className=\"conversation-scrollbar min-h-0 flex-1 overflow-y-auto divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/15\">\n {loading ? (\n <div className=\"flex h-full min-h-64 items-center justify-center p-6\">\n <Loading size=\"md\" text=\"Carregando conversas...\" />\n </div>\n ) : items.length === 0 ? (\n <EmptyState\n icon={<MessageCircle className=\"h-8 w-8 text-[var(--dashboard-text-secondary,#6b7280)]\" />}\n title={emptyTitle}\n description={emptyDescription}\n />\n ) : (\n items.map((item) => (\n <ConversationPreviewCard\n key={item.id}\n item={item}\n selected={item.id === selectedId || item.selected}\n onSelect={onSelect}\n formatDate={formatDate}\n variant=\"list\"\n />\n ))\n )}\n </div>\n </aside>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { FileText, Loader2, Paperclip } from \"lucide-react\";\nimport type { ConversationMediaPreviewProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationMediaPreview({\n message,\n onMediaOpen,\n className,\n}: ConversationMediaPreviewProps) {\n const { media, kind } = message;\n\n if (kind === \"loading-media\") {\n return (\n <div className={cn(\"flex items-center gap-2 py-2 text-sm opacity-75\", className)}>\n <Loader2 size={16} className=\"animate-spin\" />\n <span>{message.pendingLabel || \"Carregando midia...\"}</span>\n </div>\n );\n }\n\n if (!media?.url) return null;\n\n if (kind === \"image\") {\n return (\n <button\n type=\"button\"\n onClick={() => onMediaOpen?.(message)}\n className={cn(\"block overflow-hidden rounded-md text-left\", className)}\n >\n <img\n src={media.url}\n alt={media.alt || media.fileName || \"Imagem da conversa\"}\n className=\"max-h-64 max-w-full rounded-md object-contain\"\n loading=\"lazy\"\n />\n </button>\n );\n }\n\n if (kind === \"audio\") {\n return (\n <div className={cn(\"space-y-2\", className)}>\n <audio controls className=\"max-w-full min-w-60\">\n <source src={media.url} type={media.mimeType || \"audio/ogg\"} />\n </audio>\n {message.content && (\n <p className=\"text-xs italic opacity-70\">{message.content}</p>\n )}\n </div>\n );\n }\n\n if (kind === \"video\") {\n return (\n <video controls className={cn(\"max-h-64 max-w-full rounded-md\", className)}>\n <source src={media.url} type={media.mimeType || \"video/mp4\"} />\n </video>\n );\n }\n\n return (\n <a\n href={media.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"flex items-center gap-2 rounded-md bg-current/10 px-3 py-2 transition-colors hover:bg-current/15\",\n className,\n )}\n >\n {kind === \"file\" ? <FileText size={18} /> : <Paperclip size={18} />}\n <span className=\"max-w-52 truncate text-sm\">\n {media.fileName || \"Documento\"}\n </span>\n </a>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationMessageBubbleProps } from \"./types\";\nimport { ConversationEventSeparator } from \"./ConversationEventSeparator\";\nimport { ConversationMediaPreview } from \"./ConversationMediaPreview\";\nimport { cn, defaultConversationTimeFormatter } from \"./utils\";\n\nexport function ConversationMessageBubble({\n message,\n onMediaOpen,\n formatTime = defaultConversationTimeFormatter,\n className,\n}: ConversationMessageBubbleProps) {\n const kind = message.kind || \"text\";\n const timeLabel =\n message.timestampLabel ||\n (message.createdAt ? formatTime(message.createdAt) : undefined);\n\n if (kind === \"event\") {\n return (\n <ConversationEventSeparator\n label={message.eventLabel || message.content}\n description={message.eventDescription}\n className={className}\n />\n );\n }\n\n if (message.direction === \"system\") {\n return (\n <div className={cn(\"flex justify-center\", className)}>\n <div className=\"max-w-lg rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-text-secondary,#6b7280)]/10 px-4 py-2 text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <p className=\"mb-1 text-xs font-medium text-[var(--dashboard-text-secondary,#6b7280)]\">\n {message.authorLabel || \"Sistema\"}\n </p>\n <div className=\"text-sm\">{message.content}</div>\n {timeLabel && (\n <p className=\"mt-1 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {timeLabel}\n </p>\n )}\n </div>\n </div>\n );\n }\n\n if (kind === \"interactive\") {\n return (\n <div\n className={cn(\n \"flex\",\n message.direction === \"outbound\" ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n <div className=\"max-w-lg rounded-lg border border-[var(--dashboard-primary,#37a501)]/25 bg-[var(--dashboard-primary,#37a501)]/10 px-4 py-2\">\n <p className=\"mb-1 text-xs font-medium text-[var(--dashboard-primary,#37a501)]\">\n {message.interactiveLabel || \"Resposta\"}\n </p>\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {message.interactiveTitle || message.content}\n </p>\n {timeLabel && (\n <p className=\"mt-1 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {timeLabel}\n </p>\n )}\n </div>\n </div>\n );\n }\n\n const outbound = message.direction === \"outbound\";\n\n return (\n <div\n className={cn(\n \"flex\",\n outbound ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n <div\n className={cn(\n \"max-w-[78%] rounded-lg px-4 py-3 text-sm shadow-sm\",\n outbound\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"border border-[var(--dashboard-text-secondary,#6b7280)]/18 bg-[var(--dashboard-surface,#ffffff)] text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {message.authorLabel && (\n <p\n className={cn(\n \"mb-1 text-xs font-medium\",\n outbound\n ? \"text-white/75\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {message.authorLabel}\n </p>\n )}\n\n {kind !== \"text\" && (\n <ConversationMediaPreview message={message} onMediaOpen={onMediaOpen} />\n )}\n\n {kind === \"text\" && message.content && (\n <div className=\"whitespace-pre-wrap break-words leading-relaxed\">\n {message.content}\n </div>\n )}\n\n {timeLabel && (\n <p\n className={cn(\n \"mt-1 text-xs\",\n outbound\n ? \"text-white/75\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {timeLabel}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ArrowLeft, Settings } from \"lucide-react\";\nimport type { ConversationThreadHeaderProps } from \"./types\";\nimport { ConversationAvatar } from \"./ConversationAvatar\";\nimport { ConversationSupportBadge } from \"./ConversationSupportBadge\";\nimport { cn } from \"./utils\";\n\nexport function ConversationThreadHeader({\n participant,\n stats,\n subtitle,\n supportStatus,\n supportLabel,\n onBack,\n onSettingsClick,\n actions,\n className,\n}: ConversationThreadHeaderProps) {\n return (\n <div\n className={cn(\n \"flex h-20 shrink-0 items-center border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] px-4 sm:px-6\",\n className,\n )}\n >\n <div className=\"flex w-full items-center gap-3\">\n {onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-[var(--dashboard-primary,#37a501)] transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/10 md:hidden\"\n aria-label=\"Voltar para lista\"\n >\n <ArrowLeft size={18} />\n </button>\n )}\n\n <ConversationAvatar participant={participant} />\n\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-baseline gap-2\">\n <h2 className=\"truncate text-sm font-semibold text-[var(--dashboard-text-primary,#2d2d2d)] sm:text-base\">\n {participant.name}\n </h2>\n {(participant.phone || participant.email) && (\n <span className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {participant.phone || participant.email}\n </span>\n )}\n </div>\n {(subtitle || stats) && (\n <p className=\"mt-0.5 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {subtitle ||\n `${stats?.total ?? 0} mensagens · ${stats?.inbound ?? 0} recebidas · ${stats?.outbound ?? 0} enviadas`}\n </p>\n )}\n </div>\n\n {onSettingsClick && (\n <button\n type=\"button\"\n onClick={onSettingsClick}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-lg text-[var(--dashboard-text-secondary,#6b7280)] transition-colors hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n aria-label=\"Configurar conversa\"\n >\n <Settings size={16} />\n </button>\n )}\n\n <div className=\"ml-auto flex items-center gap-3\">\n <ConversationSupportBadge status={supportStatus} label={supportLabel} />\n {actions}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationUnreadMarkerProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationUnreadMarker({\n label = \"Novas mensagens\",\n className,\n}: ConversationUnreadMarkerProps) {\n return (\n <div className={cn(\"flex w-full items-center gap-3\", className)}>\n <div className=\"h-px flex-1 bg-[var(--dashboard-primary,#37a501)]\" />\n <span className=\"whitespace-nowrap text-xs font-medium text-[var(--dashboard-primary,#37a501)]\">\n {label}\n </span>\n <div className=\"h-px flex-1 bg-[var(--dashboard-primary,#37a501)]\" />\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { MessageCircle } from \"lucide-react\";\nimport { EmptyState } from \"../EmptyState\";\nimport { Loading } from \"../Loading\";\nimport type { ConversationThreadProps } from \"./types\";\nimport { ConversationMessageBubble } from \"./ConversationMessageBubble\";\nimport { ConversationThreadHeader } from \"./ConversationThreadHeader\";\nimport { ConversationUnreadMarker } from \"./ConversationUnreadMarker\";\nimport { cn } from \"./utils\";\n\nexport function ConversationThread({\n participant,\n messages = [],\n stats,\n loading = false,\n loadingLabel = \"Carregando mensagens...\",\n emptyTitle = \"Selecione uma conversa\",\n emptyDescription = \"Escolha uma conversa na lista para visualizar as mensagens.\",\n unreadMessageId,\n unreadLabel,\n headerActions,\n composer,\n supportStatus,\n supportLabel,\n onBack,\n onSettingsClick,\n onMediaOpen,\n formatTime,\n messagesContainerRef,\n className,\n}: ConversationThreadProps) {\n if (!participant) {\n return (\n <section\n className={cn(\n \"flex min-h-0 flex-1 flex-col bg-[var(--dashboard-background,#f2f2f2)]\",\n className,\n )}\n >\n <EmptyState\n icon={<MessageCircle className=\"h-8 w-8 text-[var(--dashboard-primary,#37a501)]/60\" />}\n title={emptyTitle}\n description={emptyDescription}\n className=\"h-full min-h-80 flex-1\"\n />\n </section>\n );\n }\n\n return (\n <section\n className={cn(\n \"flex min-h-0 flex-1 flex-col bg-[var(--dashboard-background,#f2f2f2)]\",\n className,\n )}\n >\n <ConversationThreadHeader\n participant={participant}\n stats={stats}\n actions={headerActions}\n supportStatus={supportStatus}\n supportLabel={supportLabel}\n onBack={onBack}\n onSettingsClick={onSettingsClick}\n />\n\n <div\n ref={messagesContainerRef}\n className=\"conversation-scrollbar min-h-0 flex-1 space-y-4 overflow-y-auto p-4 sm:p-6\"\n >\n {loading ? (\n <div className=\"flex h-full min-h-64 items-center justify-center\">\n <Loading size=\"md\" text={loadingLabel} />\n </div>\n ) : messages.length === 0 ? (\n <EmptyState\n icon={<MessageCircle className=\"h-8 w-8 text-[var(--dashboard-text-secondary,#6b7280)]\" />}\n title=\"Nenhuma mensagem nesta conversa\"\n />\n ) : (\n messages.map((message) => (\n <React.Fragment key={message.id}>\n {unreadMessageId === message.id && (\n <ConversationUnreadMarker label={unreadLabel} />\n )}\n <ConversationMessageBubble\n message={message}\n onMediaOpen={onMediaOpen}\n formatTime={formatTime}\n />\n </React.Fragment>\n ))\n )}\n </div>\n\n {composer}\n </section>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationLayoutProps, ConversationPanelProps } from \"./types\";\nimport { ConversationList } from \"./ConversationList\";\nimport { ConversationThread } from \"./ConversationThread\";\nimport { cn } from \"./utils\";\n\nexport function ConversationLayout({\n title = \"Conversas\",\n subtitle,\n hideHeader = false,\n connected,\n conversations,\n selectedId,\n selectedParticipant,\n messages,\n stats,\n searchValue,\n onSearchChange,\n onClearSearch,\n onSelectConversation,\n listLoading,\n threadLoading,\n threadActions,\n composer,\n supportStatus,\n supportLabel,\n unreadMessageId,\n unreadLabel,\n onBack,\n onSettingsClick,\n onMediaOpen,\n formatListDate,\n formatMessageTime,\n className,\n}: ConversationLayoutProps) {\n return (\n <div\n className={cn(\n \"conversation-panel flex h-full min-h-0 flex-col overflow-hidden rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)]\",\n className,\n )}\n >\n <style>{`\n .conversation-panel .conversation-scrollbar {\n scrollbar-color: var(--dashboard-primary,#37a501) color-mix(in srgb, var(--dashboard-primary,#37a501) 12%, transparent);\n scrollbar-width: thin;\n }\n\n .conversation-panel .conversation-scrollbar::-webkit-scrollbar {\n width: 0.5rem;\n height: 0.5rem;\n }\n\n .conversation-panel .conversation-scrollbar::-webkit-scrollbar-track {\n background: color-mix(in srgb, var(--dashboard-primary,#37a501) 10%, transparent);\n border-radius: 999px;\n }\n\n .conversation-panel .conversation-scrollbar::-webkit-scrollbar-thumb {\n background: var(--dashboard-primary,#37a501);\n border-radius: 999px;\n }\n\n .conversation-panel .conversation-scrollbar::-webkit-scrollbar-thumb:hover {\n background: color-mix(in srgb, var(--dashboard-primary,#37a501) 84%, var(--dashboard-text-primary,#2d2d2d));\n }\n `}</style>\n {!hideHeader && (title || subtitle || typeof connected === \"boolean\") && (\n <div className=\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] px-4 py-4 sm:px-6\">\n {(title || typeof connected === \"boolean\") && (\n <div className=\"flex items-center gap-2\">\n {title && (\n <h1 className=\"text-xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h1>\n )}\n {typeof connected === \"boolean\" && (\n <span\n className={cn(\n \"h-2 w-2 rounded-full\",\n connected\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/40\",\n )}\n title={connected ? \"Conectado em tempo real\" : \"Desconectado\"}\n />\n )}\n </div>\n )}\n {subtitle && (\n <p className=\"mt-1 text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <ConversationList\n items={conversations}\n selectedId={selectedId}\n searchValue={searchValue}\n onSearchChange={onSearchChange}\n onClearSearch={onClearSearch}\n onSelect={onSelectConversation}\n loading={listLoading}\n formatDate={formatListDate}\n className={cn(\n \"w-full md:flex md:w-80 lg:w-96\",\n selectedParticipant ? \"hidden md:flex\" : \"flex\",\n )}\n />\n\n <ConversationThread\n participant={selectedParticipant}\n messages={messages}\n stats={stats}\n loading={threadLoading}\n headerActions={threadActions}\n composer={composer}\n supportStatus={supportStatus}\n supportLabel={supportLabel}\n unreadMessageId={unreadMessageId}\n unreadLabel={unreadLabel}\n onBack={onBack}\n onSettingsClick={onSettingsClick}\n onMediaOpen={onMediaOpen}\n formatTime={formatMessageTime}\n className={cn(selectedParticipant ? \"flex\" : \"hidden md:flex\")}\n />\n </div>\n </div>\n );\n}\n\nexport function ConversationPanel(props: ConversationPanelProps) {\n return <ConversationLayout {...props} />;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationSupportActionsProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationSupportActions({\n status,\n stats,\n reason,\n startLabel = \"Assumir conversa\",\n endLabel = \"Encerrar atendimento\",\n endSilentLabel = \"Encerrar sem notificar\",\n onStart,\n onEnd,\n onEndSilent,\n startDisabled,\n endDisabled,\n endSilentDisabled,\n activeActions,\n inactiveActions,\n className,\n}: ConversationSupportActionsProps) {\n if (status === \"active\") {\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {activeActions}\n {onEndSilent && (\n <button\n type=\"button\"\n onClick={onEndSilent}\n disabled={endSilentDisabled}\n className=\"rounded-lg bg-[var(--dashboard-text-secondary,#6b7280)] px-4 py-2 text-sm font-medium text-white transition-colors hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {endSilentLabel}\n </button>\n )}\n {onEnd && (\n <button\n type=\"button\"\n onClick={onEnd}\n disabled={endDisabled}\n className=\"rounded-lg bg-[var(--dashboard-status-danger,#ef4444)] px-4 py-2 text-sm font-medium text-white transition-colors hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {endLabel}\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n {inactiveActions}\n {(stats || reason) && (\n <div className=\"text-right\">\n {stats && (\n <>\n <p className=\"text-xs font-medium text-[var(--dashboard-primary,#37a501)]\">\n {stats.total ?? 0} mensagens\n </p>\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {stats.inbound ?? 0} recebidas · {stats.outbound ?? 0} enviadas\n </p>\n </>\n )}\n {reason && (\n <p className=\"mt-1 text-xs text-[var(--dashboard-status-warning,#f59e0b)]\">\n {reason}\n </p>\n )}\n </div>\n )}\n {onStart && (\n <button\n type=\"button\"\n onClick={onStart}\n disabled={startDisabled}\n className=\"rounded-lg bg-[var(--dashboard-primary,#37a501)] px-4 py-2 text-sm font-medium text-white transition-colors hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {startLabel}\n </button>\n )}\n </div>\n );\n}\n","import {\n FileText,\n Image as ImageIcon,\n Mic,\n PlaySquare,\n} from \"lucide-react\";\n\nexport { ConversationAvatar } from \"./ConversationAvatar\";\nexport { ConversationComposer } from \"./ConversationComposer\";\nexport { ConversationEventSeparator } from \"./ConversationEventSeparator\";\nexport { ConversationLayout, ConversationPanel } from \"./ConversationLayout\";\nexport { ConversationList } from \"./ConversationList\";\nexport {\n ConversationListItem,\n ConversationPreviewCard,\n} from \"./ConversationPreviewCard\";\nexport { ConversationMediaPreview } from \"./ConversationMediaPreview\";\nexport { ConversationMessageBubble } from \"./ConversationMessageBubble\";\nexport { ConversationSearch } from \"./ConversationSearch\";\nexport { ConversationSupportActions } from \"./ConversationSupportActions\";\nexport { ConversationSupportBadge } from \"./ConversationSupportBadge\";\nexport { ConversationThread } from \"./ConversationThread\";\nexport { ConversationThreadHeader } from \"./ConversationThreadHeader\";\nexport { ConversationUnreadMarker } from \"./ConversationUnreadMarker\";\n\nexport type {\n ConversationAvatarProps,\n ConversationComposerProps,\n ConversationEventSeparatorProps,\n ConversationLayoutProps,\n ConversationListItemData,\n ConversationListItemProps,\n ConversationListProps,\n ConversationMediaPreviewProps,\n ConversationMessageBubbleProps,\n ConversationMessageData,\n ConversationMessageDirection,\n ConversationMessageKind,\n ConversationMessageMedia,\n ConversationPanelProps,\n ConversationParticipant,\n ConversationPreviewCardProps,\n ConversationPreviewVariant,\n ConversationSearchProps,\n ConversationStats,\n ConversationSupportActionsProps,\n ConversationSupportBadgeProps,\n ConversationSupportStatus,\n ConversationThreadHeaderProps,\n ConversationThreadProps,\n ConversationUnreadMarkerProps,\n} from \"./types\";\n\nexport const conversationMessageIcons = {\n image: ImageIcon,\n audio: Mic,\n video: PlaySquare,\n file: FileText,\n};\n","import type { DashboardConfig } from \"./types\";\n\nexport const defaultConfig: DashboardConfig = {\n name: \"Dashboard\",\n colors: {\n primary: \"#2563EB\",\n secondary: \"#F1F5F9\",\n background: \"#F8FAFC\",\n surface: \"#FFFFFF\",\n textPrimary: \"#0F172A\",\n textSecondary: \"#64748B\",\n sidebarBg: \"#f0f0f0\",\n sidebarBorder: \"#e0dfe3\",\n sidebarText: \"#403f52\",\n sidebarActiveText: \"#ff521d\",\n statusSuccess: \"#059669\",\n statusDanger: \"#DC2626\",\n statusWarning: \"#D97706\",\n statusInfo: \"#2563EB\",\n statusNeutral: \"#64748B\",\n tooltipBg: \"#1a1a1a\",\n tooltipText: \"#ffffff\",\n },\n components: {\n modal: {\n closeOnEscape: true,\n closeOnOverlayClick: true,\n },\n toast: {\n duration: 3000,\n position: \"top-right\",\n },\n notification: {\n duration: 5000,\n },\n pagination: {\n itemsPerPageOptions: [10, 20, 30, 50],\n defaultItemsPerPage: 10,\n },\n },\n};\n","import type { DashboardConfig } from \"./types\";\nimport { defaultConfig } from \"./defaults\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nfunction deepMerge<T>(target: T, source: DeepPartial<T>): T {\n const result = { ...target } as Record<string, unknown>;\n const src = source as Record<string, unknown>;\n\n for (const key in src) {\n const sourceVal = src[key];\n const targetVal = result[key];\n\n if (\n sourceVal !== null &&\n sourceVal !== undefined &&\n typeof sourceVal === \"object\" &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === \"object\" &&\n targetVal !== null &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal,\n sourceVal as DeepPartial<typeof targetVal>,\n );\n } else if (sourceVal !== undefined) {\n result[key] = sourceVal;\n }\n }\n\n return result as T;\n}\n\nexport function createConfig(\n overrides: DeepPartial<DashboardConfig> = {},\n): DashboardConfig {\n return deepMerge(defaultConfig, overrides);\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\nimport type { DashboardConfig } from \"../config/types\";\n\nexport const ConfigContext = createContext<DashboardConfig | null>(null);\n\nexport function useConfig(): DashboardConfig {\n const config = useContext(ConfigContext);\n if (!config) {\n throw new Error(\"useConfig must be used within a DashboardProvider\");\n }\n return config;\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nexport interface ThemeContextType {\n theme: Theme;\n setTheme: (theme: Theme) => void;\n resolvedTheme: \"light\" | \"dark\";\n}\n\nexport const ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport function useTheme(): ThemeContextType {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useTheme must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { ThemeContext } from \"../hooks/useTheme\";\nimport type { Theme } from \"../hooks/useTheme\";\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [theme, setThemeState] = useState<Theme>(\"system\");\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n const savedTheme = localStorage.getItem(\"dashboard-theme\") as Theme | null;\n if (savedTheme) {\n setThemeState(savedTheme);\n }\n\n const systemPreference = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\";\n\n const currentTheme = savedTheme || \"system\";\n const resolved =\n currentTheme === \"system\" ? systemPreference : currentTheme;\n setResolvedTheme(resolved);\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = (e: MediaQueryListEvent) => {\n const current = localStorage.getItem(\"dashboard-theme\") as Theme | null;\n if (!current || current === \"system\") {\n const newResolved = e.matches ? \"dark\" : \"light\";\n setResolvedTheme(newResolved);\n document.documentElement.classList.toggle(\n \"dark\",\n newResolved === \"dark\",\n );\n }\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n localStorage.setItem(\"dashboard-theme\", newTheme);\n\n const systemPreference = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\";\n\n const resolved = newTheme === \"system\" ? systemPreference : newTheme;\n setResolvedTheme(resolved);\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n };\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme, resolvedTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport interface LoadingContextType {\n isLoading: boolean;\n showLoading: () => void;\n hideLoading: () => void;\n}\n\nexport const LoadingContext = createContext<LoadingContextType | null>(null);\n\nexport function useLoading(): LoadingContextType {\n const context = useContext(LoadingContext);\n if (!context) {\n throw new Error(\"useLoading must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { LoadingContext } from \"../hooks/useLoading\";\nimport { Loading } from \"../components/Loading\";\n\nexport function LoadingProvider({ children }: { children: React.ReactNode }) {\n const [isLoading, setIsLoading] = useState(false);\n\n const showLoading = () => setIsLoading(true);\n const hideLoading = () => setIsLoading(false);\n\n return (\n <LoadingContext.Provider value={{ isLoading, showLoading, hideLoading }}>\n {children}\n {isLoading && <Loading size=\"lg\" text=\"Carregando...\" fullscreen />}\n </LoadingContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport interface Notification {\n id: string;\n title: string;\n subtitle: string;\n type: \"success\" | \"error\" | \"warning\" | \"info\";\n}\n\nexport interface NotificationsContextType {\n notifications: Notification[];\n addNotification: (notification: Omit<Notification, \"id\">) => void;\n removeNotification: (id: string) => void;\n clearNotifications: () => void;\n}\n\nexport const NotificationsContext =\n createContext<NotificationsContextType | null>(null);\n\nexport function useNotifications(): NotificationsContextType {\n const context = useContext(NotificationsContext);\n if (!context) {\n throw new Error(\"useNotifications must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport { NotificationsContext } from \"../hooks/useNotifications\";\nimport type { Notification } from \"../hooks/useNotifications\";\nimport { useConfig } from \"../hooks/useConfig\";\nimport { Toast } from \"../components/Toast\";\n\nexport function NotificationsProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [notifications, setNotifications] = useState<Notification[]>([]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n const config = useConfig();\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n };\n }, []);\n\n const removeNotification = useCallback((id: string) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setNotifications((prev) => prev.filter((n) => n.id !== id));\n }, []);\n\n const addNotification = useCallback(\n (notification: Omit<Notification, \"id\">) => {\n const id = Math.random().toString(36).substring(2, 9);\n const newNotification: Notification = { ...notification, id };\n setNotifications((prev) => [...prev, newNotification]);\n },\n [],\n );\n\n const clearNotifications = useCallback(() => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n timersRef.current.clear();\n setNotifications([]);\n }, []);\n\n const duration = config.components.notification.duration;\n\n return (\n <NotificationsContext.Provider\n value={{\n notifications,\n addNotification,\n removeNotification,\n clearNotifications,\n }}\n >\n {children}\n {notifications.length > 0 && (\n <div className=\"fixed w-full max-w-[400px] px-4 z-[10002] top-4 left-1/2 -translate-x-1/2 sm:top-5 sm:right-4 sm:left-auto sm:translate-x-0 flex flex-col gap-2\">\n {notifications.map((notification) => (\n <Toast\n key={notification.id}\n title={notification.title}\n subtitle={notification.subtitle}\n type={notification.type}\n duration={duration}\n onClose={() => removeNotification(notification.id)}\n />\n ))}\n </div>\n )}\n </NotificationsContext.Provider>\n );\n}\n","\"use client\";\n\nimport React, { useLayoutEffect, useMemo } from \"react\";\nimport type { DashboardConfig } from \"../config/types\";\nimport { createConfig } from \"../config/createConfig\";\nimport { ConfigContext } from \"../hooks/useConfig\";\nimport { ThemeProvider } from \"./ThemeProvider\";\nimport { LoadingProvider } from \"./LoadingProvider\";\nimport { NotificationsProvider } from \"./NotificationsProvider\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\ninterface DashboardProviderProps {\n config?: DeepPartial<DashboardConfig>;\n children: React.ReactNode;\n}\n\nfunction CSSVarsInjector({ config }: { config: DashboardConfig }) {\n useLayoutEffect(() => {\n const root = document.documentElement;\n const { colors } = config;\n\n root.style.setProperty(\"--dashboard-primary\", colors.primary);\n root.style.setProperty(\"--dashboard-secondary\", colors.secondary);\n root.style.setProperty(\"--dashboard-background\", colors.background);\n root.style.setProperty(\"--dashboard-surface\", colors.surface);\n root.style.setProperty(\"--dashboard-text-primary\", colors.textPrimary);\n root.style.setProperty(\"--dashboard-text-secondary\", colors.textSecondary);\n root.style.setProperty(\"--dashboard-sidebar-bg\", colors.sidebarBg);\n root.style.setProperty(\"--dashboard-sidebar-border\", colors.sidebarBorder);\n root.style.setProperty(\"--dashboard-sidebar-text\", colors.sidebarText);\n root.style.setProperty(\"--dashboard-sidebar-active-text\", colors.sidebarActiveText);\n root.style.setProperty(\"--dashboard-status-success\", colors.statusSuccess);\n root.style.setProperty(\"--dashboard-status-danger\", colors.statusDanger);\n root.style.setProperty(\"--dashboard-status-warning\", colors.statusWarning);\n root.style.setProperty(\"--dashboard-status-info\", colors.statusInfo);\n root.style.setProperty(\"--dashboard-status-neutral\", colors.statusNeutral);\n root.style.setProperty(\"--dashboard-tooltip-bg\", colors.tooltipBg);\n root.style.setProperty(\"--dashboard-tooltip-text\", colors.tooltipText);\n // No cleanup — vars are always overwritten on re-render.\n // Removing them mid-transition causes a flash to hardcoded fallback\n // colors in component classes (e.g. #2A6510 in Sidebar borders).\n }, [config]);\n\n return null;\n}\n\nexport function DashboardProvider({\n config: configOverrides,\n children,\n}: DashboardProviderProps) {\n const config = useMemo(\n () => createConfig(configOverrides),\n [configOverrides],\n );\n\n return (\n <ConfigContext.Provider value={config}>\n <CSSVarsInjector config={config} />\n <ThemeProvider>\n <LoadingProvider>\n <NotificationsProvider>{children}</NotificationsProvider>\n </LoadingProvider>\n </ThemeProvider>\n </ConfigContext.Provider>\n );\n}\n","/**\n * Tokens centralizados de tamanho para componentes de formulário.\n *\n * Garante que Button, Input, Dropdown e outros componentes de linha\n * compartilhem a mesma altura para cada variante de tamanho.\n *\n * Escala baseada no padrão Tailwind / shadcn/ui:\n * sm → h-8 (32px) — compacto, tabelas densas\n * md → h-9 (36px) — padrão\n * lg → h-10 (40px) — destaque\n */\n\nexport type ComponentSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SizeToken {\n /** Altura fixa do componente (Tailwind height class) */\n height: string;\n /** Padding horizontal */\n paddingX: string;\n /** Padding vertical (quando não usa height fixo) */\n paddingY: string;\n /** Classe de font-size do Tailwind */\n font: string;\n}\n\nexport const componentSizes: Record<ComponentSize, SizeToken> = {\n sm: {\n height: \"h-8\",\n paddingX: \"px-3\",\n paddingY: \"py-0\",\n font: \"text-xs\",\n },\n md: {\n height: \"h-9\",\n paddingX: \"px-4\",\n paddingY: \"py-0\",\n font: \"text-sm\",\n },\n lg: {\n height: \"h-10\",\n paddingX: \"px-6\",\n paddingY: \"py-0\",\n font: \"text-base\",\n },\n};\n\n/** Tokens para componentes que não precisam de height fixo (badges, tags) */\nexport interface BadgeSizeToken {\n padding: string;\n font: string;\n}\n\nexport const badgeSizes: Record<ComponentSize, BadgeSizeToken> = {\n sm: { padding: \"px-2 py-0.5\", font: \"text-xs\" },\n md: { padding: \"px-3 py-1\", font: \"text-sm\" },\n lg: { padding: \"px-3 py-1\", font: \"text-sm\" },\n};\n\n/** Tokens de largura máxima para Modal */\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n\nexport const modalSizes: Record<ModalSize, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-2xl\",\n \"2xl\": \"max-w-4xl\",\n \"3xl\": \"max-w-screen-xl\",\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["cn","cn","sizeClasses","cn","cn","locales","cn","cn","cn","sizeConfig","cn","sizeClasses","cn","DefaultLink","cn","cn","cn","cn","ChartJS","Title","Tooltip","cn","ChartJS","Title","Tooltip","cn","ChartJS","Title","Tooltip","cn","ChartJS","Tooltip","cn","cn","ChartJS","Title","ChartTooltip","cn","cn","cn","cn","cn","cn","cn","cn","cn","ImageIcon","cn","cn","cn","cn","variantConfig","cn","cn","cn","cn","cn","PhoneIcon","cn","ImageIcon"],"sources":["../src/components/Loading/index.tsx","../src/components/Button/index.tsx","../src/components/Input/index.tsx","../src/components/Dropdown/index.tsx","../src/components/Table/index.tsx","../src/components/Modal/index.tsx","../src/components/Card/index.tsx","../src/components/Toast/index.tsx","../src/components/Pagination/index.tsx","../src/components/FormField/index.tsx","../src/components/Tabs/index.tsx","../src/components/DateRangePicker/index.tsx","../src/components/DatePicker/index.tsx","../src/components/Title/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/components/BadgeStatus/index.tsx","../src/components/Sidebar/index.tsx","../src/components/Header/index.tsx","../src/components/ThemeSwitcher/index.tsx","../src/components/KPICard/index.tsx","../src/components/PageLayout/index.tsx","../src/components/ComparisonLineChart/index.tsx","../src/components/HorizontalBarChart/index.tsx","../src/components/VerticalBarChart/index.tsx","../src/components/DoughnutChart/index.tsx","../src/components/ProgressBarList/index.tsx","../src/components/MetricPanel/index.tsx","../src/components/FilterBar/index.tsx","../src/components/Checkbox/index.tsx","../src/components/AuthLayout/index.tsx","../src/components/CodeInput/index.tsx","../src/components/Skeleton/index.tsx","../src/components/DataGrid/index.tsx","../src/components/TreeView/index.tsx","../src/components/Stepper/index.tsx","../src/components/FileUpload/index.tsx","../src/components/Tooltip/index.tsx","../src/components/InfoTooltip/index.tsx","../src/components/Breadcrumb/index.tsx","../src/components/Combobox/index.tsx","../src/components/Alert/index.tsx","../src/components/Callout/index.tsx","../src/components/CodeBlock/index.tsx","../src/components/EmptyState/index.tsx","../src/components/StatusBadge/index.tsx","../src/components/IPhoneMockup/index.tsx","../src/components/WhatsAppMockup/index.tsx","../src/components/TableOfContents/index.tsx","../src/components/SocialIcon/index.tsx","../src/components/ConversationPanel/utils.ts","../src/components/ConversationPanel/ConversationAvatar.tsx","../src/components/ConversationPanel/ConversationComposer.tsx","../src/components/ConversationPanel/ConversationEventSeparator.tsx","../src/components/ConversationPanel/ConversationSupportBadge.tsx","../src/components/ConversationPanel/ConversationPreviewCard.tsx","../src/components/ConversationPanel/ConversationSearch.tsx","../src/components/ConversationPanel/ConversationList.tsx","../src/components/ConversationPanel/ConversationMediaPreview.tsx","../src/components/ConversationPanel/ConversationMessageBubble.tsx","../src/components/ConversationPanel/ConversationThreadHeader.tsx","../src/components/ConversationPanel/ConversationUnreadMarker.tsx","../src/components/ConversationPanel/ConversationThread.tsx","../src/components/ConversationPanel/ConversationLayout.tsx","../src/components/ConversationPanel/ConversationSupportActions.tsx","../src/components/ConversationPanel/index.ts","../src/config/defaults.ts","../src/config/createConfig.ts","../src/hooks/useConfig.ts","../src/hooks/useTheme.ts","../src/providers/ThemeProvider.tsx","../src/hooks/useLoading.ts","../src/providers/LoadingProvider.tsx","../src/hooks/useNotifications.ts","../src/providers/NotificationsProvider.tsx","../src/providers/DashboardProvider.tsx","../src/config/sizes.ts"],"sourcesContent":["import React from \"react\";\n\nexport interface LoadingProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n text?: string;\n textColor?: string;\n color?: string;\n variant?: \"spinner\" | \"border\";\n fullscreen?: boolean;\n}\n\nconst sizeMap = {\n sm: \"dashboard-spinner-sm\",\n md: \"dashboard-spinner-md\",\n lg: \"dashboard-spinner-lg\",\n};\n\nexport function Loading({\n size = \"md\",\n className = \"\",\n text,\n textColor,\n color,\n variant = \"spinner\",\n fullscreen = false,\n}: LoadingProps) {\n const variantClass = variant === \"border\" ? \"dashboard-spinner-border\" : \"dashboard-spinner\";\n\n const spinnerStyle = color ? { borderTopColor: color } : undefined;\n\n const spinner = (\n <div\n className={`flex flex-col items-center justify-center gap-4 ${className}`}\n >\n <div\n className={`${variantClass} ${sizeMap[size]}`}\n style={spinnerStyle}\n />\n {text && (\n <p\n className=\"text-sm font-medium animate-pulse\"\n style={{ color: textColor || color || \"var(--dashboard-primary)\" }}\n >\n {text}\n </p>\n )}\n </div>\n );\n\n if (fullscreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-[var(--dashboard-background,#f2f2f2)]/80 backdrop-blur-sm\">\n {spinner}\n </div>\n );\n }\n\n return spinner;\n}\n","import React from \"react\";\nimport { Loading } from \"../Loading\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n isLoading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Button({\n children,\n variant = \"primary\",\n size = \"md\",\n isLoading = false,\n icon,\n iconPosition = \"left\",\n className,\n disabled,\n ...props\n}: ButtonProps) {\n const baseStyles =\n \"font-medium rounded-lg transition-all duration-200 ease-out cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--dashboard-primary,#2563EB)] active:scale-[0.97]\";\n\n const variantStyles = {\n primary:\n \"bg-[var(--dashboard-primary,#2563EB)] text-white hover:brightness-110 hover:shadow-md\",\n secondary:\n \"bg-[var(--dashboard-text-secondary,#64748B)]/10 text-[var(--dashboard-text-primary,#0F172A)] border border-[var(--dashboard-text-secondary,#64748B)]/20 hover:bg-[var(--dashboard-text-secondary,#64748B)]/15 hover:border-[var(--dashboard-text-secondary,#64748B)]/30\",\n danger:\n \"bg-[var(--dashboard-status-danger,#DC2626)] text-white hover:brightness-110 hover:shadow-md\",\n ghost:\n \"bg-transparent hover:bg-[var(--dashboard-text-secondary,#64748B)]/8 text-[var(--dashboard-text-primary,#0F172A)]\",\n };\n\n const sizeStyles = {\n sm: \"h-8 px-2 text-xs sm:px-3 sm:text-sm\",\n md: \"h-9 px-3 text-sm sm:px-4 sm:text-base\",\n lg: \"h-10 px-4 text-base sm:px-6 sm:text-lg\",\n };\n\n const iconOnlySizeStyles = {\n sm: \"h-8 w-8\",\n md: \"h-9 w-9\",\n lg: \"h-10 w-10\",\n };\n\n const isIconOnly =\n !!icon &&\n (children === undefined ||\n children === null ||\n (typeof children === \"string\" && children.trim() === \"\"));\n\n return (\n <button\n className={cn(\n baseStyles,\n variantStyles[variant],\n isIconOnly ? iconOnlySizeStyles[size] : sizeStyles[size],\n className,\n )}\n disabled={disabled || isLoading}\n {...props}\n >\n {isLoading ? (\n <span className=\"flex items-center gap-2\">\n <Loading size=\"sm\" color=\"currentColor\" />\n Carregando...\n </span>\n ) : isIconOnly ? (\n icon\n ) : (\n <>\n {icon && iconPosition === \"left\" && (\n <span className=\"mr-2\">{icon}</span>\n )}\n {children}\n {icon && iconPosition === \"right\" && (\n <span className=\"ml-2\">{icon}</span>\n )}\n </>\n )}\n </button>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n label?: string;\n error?: string;\n children?: ReactNode;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst sizeStyles = {\n sm: \"h-8 px-2.5 text-xs\",\n md: \"h-9 px-3 text-sm\",\n lg: \"h-10 px-4 text-base\",\n};\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", label, error, children, id, size = \"md\", ...props }, ref) => {\n const inputId = id || (label ? `input-${label.toLowerCase().replace(/\\s+/g, \"-\")}` : undefined);\n\n return (\n <div className=\"w-full\">\n {label && (\n <label\n htmlFor={inputId}\n className=\"block text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] mb-1\"\n >\n {label}\n </label>\n )}\n <div className=\"relative flex items-center w-full\">\n <input\n type={type}\n id={inputId}\n className={cn(\n \"flex w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm transition-colors duration-200 focus:border-[var(--dashboard-primary,#37a501)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n sizeStyles[size],\n error ? \"border-[var(--dashboard-status-danger,#EF4444)] focus:border-[var(--dashboard-status-danger,#EF4444)]\" : undefined,\n children ? \"pr-10\" : undefined,\n className,\n )}\n ref={ref}\n {...props}\n />\n {children && (\n <div className=\"absolute right-3 flex items-center\">{children}</div>\n )}\n </div>\n {error && (\n <p className=\"text-[var(--dashboard-status-danger,#EF4444)] text-xs mt-1\">{error}</p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown, Check } from \"lucide-react\";\n\nexport interface DropdownOption {\n value: string;\n label: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport interface DropdownProps {\n options: DropdownOption[];\n value?: string;\n onChange: (value: string) => void;\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n containerClassName?: string;\n fullWidth?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n error?: string;\n variant?: \"default\" | \"underline\" | \"simple\" | \"compact\";\n customDropdownHeight?: string;\n icon?: React.ReactNode;\n fitContent?: boolean;\n isActive?: boolean;\n}\n\nexport function Dropdown({\n options,\n value,\n onChange,\n label,\n placeholder = \"Selecione uma opção\",\n disabled = false,\n className = \"\",\n containerClassName = \"\",\n fullWidth = false,\n size = \"md\",\n error,\n variant = \"default\",\n customDropdownHeight,\n icon,\n fitContent = false,\n isActive = false,\n}: DropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isVisible, setIsVisible] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0, width: 0 });\n const dropdownRef = useRef<HTMLDivElement>(null);\n const selectedOption = options.find((option) => option.value === value);\n\n const sizeStyles = {\n sm: {\n container: \"h-8 px-2.5\",\n text: \"text-xs\",\n wrapper: \"space-y-1\",\n label: \"text-sm\",\n iconPadding: \"pl-8\",\n },\n md: {\n container: \"h-9 px-3\",\n text: \"text-sm\",\n wrapper: \"space-y-2\",\n label: \"text-base\",\n iconPadding: \"pl-10\",\n },\n lg: {\n container: \"h-10 px-4\",\n text: \"text-base\",\n wrapper: \"space-y-3\",\n label: \"text-lg\",\n iconPadding: \"pl-12\",\n },\n };\n\n const selectedStyle = sizeStyles[size];\n\n const variantStyles = {\n default:\n \"rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/30 hover:border-[var(--dashboard-text-secondary,#6b7280)]/50 focus:outline-none focus:ring-2 focus:ring-[var(--dashboard-primary,#37a501)] focus:border-transparent\",\n underline: \"border-b border-[var(--dashboard-text-secondary,#6b7280)]/30 rounded-none hover:border-b-[var(--dashboard-text-secondary,#6b7280)]/50\",\n simple:\n \"rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 hover:border-[var(--dashboard-text-secondary,#6b7280)]/30 focus:outline-none\",\n compact:\n \"rounded-full hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20 focus:outline-none\",\n };\n\n const variantBackgrounds = {\n default: \"bg-[var(--dashboard-surface,#ffffff)]\",\n underline: \"bg-transparent\",\n simple: \"bg-[var(--dashboard-surface,#ffffff)]\",\n compact: \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n };\n\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const rect = dropdownRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled) {\n if (isOpen) {\n handleClose();\n } else {\n calculatePosition();\n setIsVisible(true);\n setTimeout(() => setIsOpen(true), 10);\n }\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n setTimeout(() => setIsVisible(false), 150);\n };\n\n const handleSelect = (option: DropdownOption) => {\n onChange(option.value);\n handleClose();\n };\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n const portal = document.querySelector(\".dashboard-dropdown-portal\");\n if (portal && !portal.contains(event.target as Node)) {\n if (isOpen) handleClose();\n }\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [isOpen]);\n\n useEffect(() => {\n const handleResize = () => {\n if (isOpen) calculatePosition();\n };\n\n const handleScroll = (event: Event) => {\n if (isOpen) {\n const portal = document.querySelector(\".dashboard-dropdown-portal\");\n if (!portal || !portal.contains(event.target as Node)) {\n handleClose();\n }\n }\n };\n\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleScroll, true);\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n window.removeEventListener(\"scroll\", handleScroll, true);\n };\n }, [isOpen]);\n\n return (\n <div\n className={`${selectedStyle.wrapper} ${containerClassName} ${\n fullWidth ? \"w-full\" : fitContent ? \"w-fit\" : \"\"\n }`}\n >\n {label && (\n <label\n className={`block text-[var(--dashboard-text-primary,#2d2d2d)] ${selectedStyle.label}`}\n >\n {label}\n </label>\n )}\n\n <div ref={dropdownRef} className=\"relative\">\n {icon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-[var(--dashboard-text-secondary,#6b7280)] h-4 w-4 pointer-events-none\">\n {icon}\n </div>\n )}\n <div\n onClick={toggleDropdown}\n className={`flex ${\n fullWidth ? \"w-full\" : fitContent ? \"w-fit\" : \"w-full\"\n } items-center justify-between ${selectedStyle.container} ${\n icon ? selectedStyle.iconPadding : \"\"\n } ${\n error\n ? \"rounded-lg border border-[var(--dashboard-status-danger,#EF4444)]\"\n : disabled\n ? \"border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : isActive\n ? \"rounded-lg border border-[var(--dashboard-primary,#37a501)]\"\n : variantStyles[variant]\n } ${className} cursor-pointer transition-colors duration-200 ${\n disabled\n ? \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : selectedOption?.backgroundColor || variantBackgrounds[variant]\n }`}\n style={\n selectedOption?.backgroundColor\n ? { backgroundColor: selectedOption.backgroundColor }\n : undefined\n }\n >\n <span\n className={`block truncate select-none ${selectedStyle.text} ${\n selectedOption\n ? selectedOption.color\n ? \"\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\"\n } ${disabled ? \"text-[var(--dashboard-text-secondary,#6b7280)] opacity-50\" : \"\"}`}\n style={\n selectedOption?.color\n ? { color: selectedOption.color }\n : undefined\n }\n >\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n <ChevronDown\n className={`h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)] transition-transform duration-200 ${\n isOpen ? \"rotate-180 transform\" : \"\"\n }`}\n />\n </div>\n\n {isVisible &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n className={`dashboard-dropdown-portal overflow-y-auto rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] shadow-lg transition-all duration-200 ease-in-out ${\n isOpen\n ? `opacity-100 ${customDropdownHeight || \"max-h-60\"}`\n : \"max-h-0 opacity-0\"\n }`}\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n width: position.width,\n zIndex: 10001,\n }}\n >\n <ul className=\"py-1\">\n {options.length > 0 ? (\n options.map((option) => {\n const isSelected = option.value === value;\n return (\n <li\n data-modal-ignore\n key={option.value}\n onClick={() => handleSelect(option)}\n className={`cursor-pointer px-3 py-2 text-left select-none hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 transition-colors flex items-center justify-between ${\n isSelected\n ? \"text-[var(--dashboard-primary,#37a501)] font-medium\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n } ${selectedStyle.text}`}\n >\n <span>{option.label}</span>\n {isSelected && (\n <Check className=\"h-4 w-4 text-[var(--dashboard-primary,#37a501)]\" />\n )}\n </li>\n );\n })\n ) : (\n <li\n className={`px-3 py-2 text-[var(--dashboard-text-secondary,#6b7280)] italic ${selectedStyle.text}`}\n >\n Não há opções disponíveis\n </li>\n )}\n </ul>\n </div>,\n document.body,\n )}\n </div>\n\n {error && (\n <p className={`mt-1 ${selectedStyle.text} text-[var(--dashboard-status-danger,#EF4444)]`}>{error}</p>\n )}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Loading } from \"../Loading\";\n\nexport interface TableColumn<T> {\n key: string;\n header: string;\n render: (item: T) => ReactNode;\n width?: string;\n align?: \"left\" | \"center\" | \"right\";\n sortable?: boolean;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n onRowClick?: (item: T) => void;\n isLoading?: boolean;\n emptyMessage?: string;\n emptyIcon?: ReactNode;\n loadingComponent?: ReactNode;\n emptyComponent?: ReactNode;\n keyExtractor: (item: T) => string;\n className?: string;\n}\n\nexport function Table<T>({\n columns,\n data,\n onRowClick,\n isLoading = false,\n emptyMessage = \"Nenhum registro encontrado\",\n emptyIcon,\n loadingComponent,\n emptyComponent,\n keyExtractor,\n className = \"\",\n}: TableProps<T>) {\n if (isLoading) {\n return loadingComponent ? <>{loadingComponent}</> : <TableSkeleton />;\n }\n\n if (data.length === 0) {\n return emptyComponent ? (\n <>{emptyComponent}</>\n ) : (\n <TableEmpty message={emptyMessage} icon={emptyIcon} />\n );\n }\n\n return (\n <div\n className={`overflow-x-auto bg-[var(--dashboard-surface,#ffffff)] rounded-xl border border-[var(--dashboard-text-secondary,#64748B)]/12 dashboard-shadow-sm ${className}`}\n >\n <table className=\"min-w-full divide-y divide-[var(--dashboard-text-secondary,#64748B)]/10\">\n <TableHeader columns={columns} />\n <TableBody\n columns={columns}\n data={data}\n onRowClick={onRowClick}\n keyExtractor={keyExtractor}\n />\n </table>\n </div>\n );\n}\n\nexport function TableHeader<T>({ columns }: { columns: TableColumn<T>[] }) {\n const alignClass = (align?: string) =>\n align === \"center\"\n ? \"text-center\"\n : align === \"right\"\n ? \"text-right\"\n : \"text-left\";\n\n return (\n <thead className=\"bg-[var(--dashboard-background,#F8FAFC)] sticky top-0 z-10\">\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n className={`px-6 py-3 text-[0.6875rem] font-semibold text-[var(--dashboard-text-secondary,#64748B)] uppercase tracking-wider ${alignClass(column.align)} ${\n column.width ? `w-[${column.width}]` : \"\"\n }`}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n );\n}\n\nexport function TableBody<T>({\n columns,\n data,\n onRowClick,\n keyExtractor,\n}: {\n columns: TableColumn<T>[];\n data: T[];\n onRowClick?: (item: T) => void;\n keyExtractor: (item: T) => string;\n}) {\n const alignClass = (align?: string) =>\n align === \"center\"\n ? \"text-center\"\n : align === \"right\"\n ? \"text-right\"\n : \"text-left\";\n\n return (\n <tbody className=\"bg-[var(--dashboard-surface,#ffffff)] divide-y divide-[var(--dashboard-text-secondary,#64748B)]/8\">\n {data.map((item, index) => (\n <tr\n key={keyExtractor(item)}\n onClick={() => onRowClick?.(item)}\n className={`transition-colors duration-150 ${\n index % 2 === 1 ? \"bg-[var(--dashboard-text-secondary,#64748B)]/[0.02]\" : \"\"\n } hover:bg-[var(--dashboard-primary,#2563EB)]/[0.04] ${\n onRowClick ? \"cursor-pointer\" : \"\"\n }`}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={`px-6 py-3.5 whitespace-nowrap text-sm leading-snug ${alignClass(column.align)}`}\n >\n {column.render(item)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n );\n}\n\nexport function TableSkeleton() {\n return (\n <div className=\"bg-[var(--dashboard-surface,#ffffff)] rounded-xl border border-[var(--dashboard-text-secondary,#64748B)]/12 dashboard-shadow-sm p-6\">\n <div className=\"flex items-center justify-center h-64\">\n <Loading size=\"lg\" text=\"Carregando dados...\" />\n </div>\n </div>\n );\n}\n\nexport function TableEmpty({\n message,\n icon,\n}: {\n message: string;\n icon?: ReactNode;\n}) {\n return (\n <div className=\"bg-[var(--dashboard-surface,#ffffff)] rounded-xl border border-[var(--dashboard-text-secondary,#64748B)]/12 dashboard-shadow-sm p-12\">\n <div className=\"text-center\">\n {icon || (\n <svg\n className=\"mx-auto h-12 w-12 text-[var(--dashboard-text-secondary,#64748B)]/40\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )}\n <p className=\"mt-4 text-sm text-[var(--dashboard-text-secondary,#64748B)]\">{message}</p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { X } from \"lucide-react\";\nimport { Button } from \"../Button\";\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave?: () => void;\n title?: string;\n children: React.ReactNode;\n showFooter?: boolean;\n saveButtonText?: string;\n cancelButtonText?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n disableSaveButton?: boolean;\n saveButtonVariant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n closeOnEscape?: boolean;\n closeOnOverlayClick?: boolean;\n}\n\nconst ANIMATION_MS = 200;\n\nconst sizeClasses = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-2xl\",\n \"2xl\": \"max-w-4xl\",\n \"3xl\": \"max-w-screen-xl\",\n};\n\nexport function Modal({\n isOpen,\n onClose,\n onSave,\n title = \"\",\n children,\n showFooter = false,\n saveButtonText = \"Salvar\",\n cancelButtonText = \"Cancelar\",\n size = \"md\",\n disableSaveButton = false,\n saveButtonVariant = \"primary\",\n closeOnEscape = true,\n closeOnOverlayClick = true,\n}: ModalProps) {\n const [shouldRender, setShouldRender] = useState(false);\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Show immediately when isOpen becomes true (no frame delay)\n if (isOpen && !shouldRender) {\n setShouldRender(true);\n }\n\n // Derived — no refs, no implicit state machine\n const isClosing = shouldRender && !isOpen;\n\n // Close animation timer: unmount after animation completes\n useEffect(() => {\n if (!isClosing) return;\n const timer = setTimeout(() => setShouldRender(false), ANIMATION_MS);\n return () => clearTimeout(timer);\n }, [isClosing]);\n\n const handleClose = useCallback(() => {\n onClose();\n }, [onClose]);\n\n // Scroll lock — active while rendered (including during close animation)\n useEffect(() => {\n if (!shouldRender) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [shouldRender]);\n\n // Click outside — only when fully open (not during close)\n useEffect(() => {\n if (!closeOnOverlayClick || !shouldRender || !isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (target.closest(\"[data-modal-ignore]\")) return;\n\n const portalSelectors = [\n \".dashboard-dropdown-portal\",\n \".dc-combobox-portal\",\n ];\n for (const selector of portalSelectors) {\n const portal = document.querySelector(selector);\n if (portal?.contains(target)) return;\n }\n\n if (modalRef.current && !modalRef.current.contains(target)) {\n handleClose();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [shouldRender, isOpen, handleClose, closeOnOverlayClick]);\n\n // Escape key — only when fully open (not during close)\n useEffect(() => {\n if (!closeOnEscape || !shouldRender || !isOpen) return;\n\n const handleEscKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") handleClose();\n };\n\n document.addEventListener(\"keydown\", handleEscKey);\n return () => document.removeEventListener(\"keydown\", handleEscKey);\n }, [shouldRender, isOpen, handleClose, closeOnEscape]);\n\n if (!shouldRender) return null;\n\n return (\n <div\n className={`fixed inset-0 z-[10000] flex items-center justify-center bg-black/50 backdrop-blur-sm p-4 ${\n isClosing ? \"dashboard-animate-fade-out\" : \"dashboard-animate-fade-in\"\n }`}\n aria-modal=\"true\"\n role=\"dialog\"\n aria-labelledby={title ? \"modal-title\" : undefined}\n >\n <div\n ref={modalRef}\n className={`w-full rounded-2xl bg-[var(--dashboard-surface,#ffffff)] border border-[var(--dashboard-text-secondary,#64748B)]/10 dashboard-shadow-xl ${\n sizeClasses[size]\n } flex max-h-[90vh] flex-col transition-all duration-200 ease-out ${\n isClosing ? \"scale-[0.98] opacity-0\" : \"scale-100 opacity-100\"\n }`}\n >\n <div className=\"flex h-fit items-center justify-between border-b border-[var(--dashboard-text-secondary,#64748B)]/10 px-6 py-4\">\n {title && (\n <h2\n id=\"modal-title\"\n className=\"text-lg font-semibold text-[var(--dashboard-text-primary,#0F172A)] tracking-tight\"\n >\n {title}\n </h2>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClose}\n className=\"ml-auto rounded-md\"\n aria-label=\"Fechar modal\"\n icon={<X className=\"h-5 w-5\" />}\n />\n </div>\n\n <div className=\"flex-grow overflow-y-auto p-6\">{children}</div>\n\n {showFooter && (\n <div className=\"flex justify-end gap-3 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 p-4\">\n <Button variant=\"secondary\" onClick={handleClose} size=\"md\">\n {cancelButtonText}\n </Button>\n <Button\n variant={saveButtonVariant}\n onClick={onSave}\n disabled={disableSaveButton}\n size=\"md\"\n >\n {saveButtonText}\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface CardProps {\n children: React.ReactNode;\n className?: string;\n title?: string;\n subtitle?: string;\n icon?: React.ReactNode;\n headerActions?: React.ReactNode;\n showDivider?: boolean;\n}\n\nexport function Card({\n children,\n className = \"\",\n title,\n subtitle,\n icon,\n headerActions,\n showDivider = false,\n}: CardProps) {\n return (\n <div\n className={`bg-[var(--dashboard-surface,#ffffff)] rounded-xl border border-[var(--dashboard-text-secondary,#64748B)]/12 transition-shadow duration-200 ease-out dashboard-shadow-sm hover:dashboard-shadow-md ${className}`}\n >\n <div className=\"p-5\">\n {title && (\n <div className={showDivider ? \"mb-5\" : \"mb-3\"}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2.5\">\n {icon && (\n <div className=\"text-[var(--dashboard-text-secondary,#64748B)]\">{icon}</div>\n )}\n <h3\n className={`${showDivider ? \"font-medium\" : \"text-base font-semibold\"} text-[var(--dashboard-text-primary,#0F172A)] truncate tracking-tight`}\n >\n {title}\n </h3>\n </div>\n {headerActions && (\n <div className=\"flex gap-2\">{headerActions}</div>\n )}\n </div>\n {subtitle && (\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#64748B)] mt-1\">\n {subtitle}\n </p>\n )}\n {showDivider && (\n <div className=\"w-full h-px bg-[var(--dashboard-text-secondary,#64748B)]/10 mt-5\" />\n )}\n </div>\n )}\n {children}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState, useCallback } from \"react\";\nimport { X, CheckCircle, XCircle, AlertTriangle, Info } from \"lucide-react\";\n\nexport interface ToastProps {\n title: string;\n subtitle?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n duration?: number;\n onClose: () => void;\n showProgress?: boolean;\n}\n\nconst typeConfig = {\n success: {\n bg: \"bg-[var(--dashboard-status-success,#10B981)]\",\n icon: CheckCircle,\n },\n error: {\n bg: \"bg-[var(--dashboard-status-danger,#EF4444)]\",\n icon: XCircle,\n },\n warning: {\n bg: \"bg-[var(--dashboard-status-warning,#f59e0b)]\",\n icon: AlertTriangle,\n },\n info: {\n bg: \"bg-[var(--dashboard-status-info,#3b82f6)]\",\n icon: Info,\n },\n};\n\nexport function Toast({\n title,\n subtitle,\n type = \"success\",\n duration = 4000,\n onClose,\n showProgress = true,\n}: ToastProps) {\n const [exiting, setExiting] = useState(false);\n\n const handleClose = useCallback(() => {\n setExiting(true);\n setTimeout(onClose, 200);\n }, [onClose]);\n\n useEffect(() => {\n if (duration <= 0) return;\n\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n\n return () => clearTimeout(timer);\n }, [duration, handleClose]);\n\n const { bg, icon: Icon } = typeConfig[type];\n\n return (\n <div\n className={`${bg} text-white rounded-lg shadow-xl shadow-black/15 overflow-hidden ${\n exiting ? \"dashboard-toast-exit\" : \"dashboard-toast-enter\"\n }`}\n role=\"alert\"\n >\n <div className=\"flex items-start gap-3 p-4\">\n <Icon className=\"w-5 h-5 mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-semibold text-sm\">{title}</p>\n {subtitle && <p className=\"text-xs opacity-90 mt-0.5\">{subtitle}</p>}\n </div>\n <button\n onClick={handleClose}\n className=\"shrink-0 hover:opacity-75 transition-opacity cursor-pointer\"\n aria-label=\"Fechar\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n {showProgress && duration > 0 && !exiting && (\n <div className=\"h-0.5 bg-white/20\">\n <div\n className=\"h-full bg-white/60\"\n style={{\n animation: `dashboard-toast-progress ${duration}ms linear forwards`,\n }}\n />\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from \"lucide-react\";\nimport { Button } from \"../Button\";\nimport { Dropdown } from \"../Dropdown\";\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n itemsPerPage: number;\n totalItems: number;\n onItemsPerPageChange?: (itemsPerPage: number) => void;\n itemsPerPageOptions?: number[];\n showPageInfo?: boolean;\n compact?: boolean;\n className?: string;\n}\n\nexport function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n itemsPerPage,\n totalItems,\n onItemsPerPageChange,\n itemsPerPageOptions = [10, 20, 30, 50],\n showPageInfo = true,\n compact = false,\n className = \"\",\n}: PaginationProps) {\n const startItem = (currentPage - 1) * itemsPerPage + 1;\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\n\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisible = compact ? 3 : 5;\n const halfVisible = Math.floor(maxVisible / 2);\n\n if (totalPages <= maxVisible + 2) {\n for (let i = 1; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, currentPage - halfVisible);\n let endPage = Math.min(totalPages - 1, currentPage + halfVisible);\n\n if (currentPage <= halfVisible + 1) {\n endPage = maxVisible;\n } else if (currentPage >= totalPages - halfVisible) {\n startPage = totalPages - maxVisible + 1;\n }\n\n if (startPage > 2) pages.push(\"...\");\n for (let i = startPage; i <= endPage; i++) pages.push(i);\n if (endPage < totalPages - 1) pages.push(\"...\");\n if (totalPages > 1) pages.push(totalPages);\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n const canGoPrevious = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n\n const handlePageClick = (page: number | string) => {\n if (typeof page === \"number\" && page !== currentPage) {\n onPageChange(page);\n }\n };\n\n const dropdownOptions = itemsPerPageOptions.map((opt) => ({\n value: String(opt),\n label: String(opt),\n }));\n\n return (\n <div\n className={`flex items-center justify-between gap-4 flex-wrap px-4 py-3 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 ${className}`}\n >\n {onItemsPerPageChange && !compact && (\n <div className=\"hidden md:flex items-center gap-2\">\n <Dropdown\n options={dropdownOptions}\n value={String(itemsPerPage)}\n onChange={(val) => onItemsPerPageChange(Number(val))}\n size=\"sm\"\n variant=\"compact\"\n fitContent\n />\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n Itens por página\n </span>\n </div>\n )}\n\n {showPageInfo && (\n <div className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {totalItems > 0 ? (\n <>\n <span className=\"hidden sm:inline\">\n Mostrando {startItem} - {endItem} de {totalItems} itens\n </span>\n <span className=\"sm:hidden\">\n {startItem}-{endItem} de {totalItems}\n </span>\n </>\n ) : (\n <span>Nenhum item encontrado</span>\n )}\n </div>\n )}\n\n <div className=\"flex items-center gap-1\">\n {!compact && (\n <div className=\"hidden md:block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(1)}\n disabled={!canGoPrevious}\n icon={<ChevronsLeft size={16} />}\n aria-label=\"Primeira página\"\n />\n </div>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(currentPage - 1)}\n disabled={!canGoPrevious}\n icon={<ChevronLeft size={16} />}\n aria-label=\"Página anterior\"\n />\n\n <div className=\"flex items-center gap-1\">\n {pageNumbers.map((page, index) => (\n <React.Fragment key={`${page}-${index}`}>\n {page === \"...\" ? (\n <span className=\"px-2 text-[var(--dashboard-text-secondary,#6b7280)]\">...</span>\n ) : (\n <Button\n variant={page === currentPage ? \"primary\" : \"ghost\"}\n size=\"sm\"\n onClick={() => handlePageClick(page)}\n className={`min-w-[32px] h-8 !px-2 ${\n page === currentPage ? \"font-medium\" : \"\"\n }`}\n aria-label={`Página ${page}`}\n aria-current={page === currentPage ? \"page\" : undefined}\n >\n {page}\n </Button>\n )}\n </React.Fragment>\n ))}\n </div>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(currentPage + 1)}\n disabled={!canGoNext}\n icon={<ChevronRight size={16} />}\n aria-label=\"Próxima página\"\n />\n\n {!compact && (\n <div className=\"hidden md:block\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => handlePageClick(totalPages)}\n disabled={!canGoNext}\n icon={<ChevronsRight size={16} />}\n aria-label=\"Última página\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { Input } from \"../Input\";\n\nexport interface FormFieldProps {\n label: string;\n name: string;\n type?: \"text\" | \"email\" | \"password\" | \"number\" | \"tel\";\n value: string;\n onChange: (value: string) => void;\n error?: string;\n required?: boolean;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport function FormField({\n label,\n name,\n type = \"text\",\n value,\n onChange,\n error,\n required = false,\n placeholder,\n disabled = false,\n className = \"\",\n}: FormFieldProps) {\n return (\n <div className={className}>\n <label\n htmlFor={name}\n className=\"block text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] mb-1\"\n >\n {label} {required && <span className=\"text-[var(--dashboard-status-danger,#EF4444)]\">*</span>}\n </label>\n <Input\n type={type}\n id={name}\n name={name}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n placeholder={placeholder}\n className={error ? \"border-[var(--dashboard-status-danger,#EF4444)] focus:border-[var(--dashboard-status-danger,#EF4444)]\" : \"\"}\n />\n {error && <p className=\"text-[var(--dashboard-status-danger,#EF4444)] text-xs mt-1\">{error}</p>}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\n\nexport interface Tab {\n id: string;\n label: string;\n count?: number;\n icon?: ReactNode;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n activeTab: string;\n onChange: (tabId: string) => void;\n /** Estilo visual das tabs. Default: \"underline\" */\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Tabs({ tabs, activeTab, onChange, variant = \"underline\", className }: TabsProps) {\n if (variant === \"pill\") {\n return (\n <div className={cn(\"flex flex-wrap gap-2\", className)} role=\"tablist\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id;\n\n return (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"flex items-center gap-2 px-4 py-2 rounded-full text-sm font-medium transition-colors cursor-pointer\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n role=\"tab\"\n aria-selected={isActive}\n >\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={cn(\n \"ml-1 text-xs rounded-full px-1.5 py-0.5\",\n isActive\n ? \"bg-white/20 text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className={cn(\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20\", className)}>\n <nav className=\"flex gap-6\" aria-label=\"Tabs\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.id;\n\n return (\n <button\n key={tab.id}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"relative pb-3 px-1 text-sm font-medium transition-colors border-b-2 flex items-center gap-2 cursor-pointer\",\n isActive\n ? \"text-[var(--dashboard-primary,#37a501)] border-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:text-[var(--dashboard-text-primary,#2d2d2d)] border-transparent\",\n )}\n role=\"tab\"\n aria-selected={isActive}\n >\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className={cn(\n \"ml-1 text-xs rounded-full px-1.5 py-0.5\",\n isActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {tab.count}\n </span>\n )}\n </button>\n );\n })}\n </nav>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport type DateRange = {\n start: Date | null;\n end: Date | null;\n};\n\nexport interface DateRangePickerProps {\n value: DateRange;\n onChange: (range: DateRange) => void;\n locale?: \"pt\" | \"en\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst locales = {\n pt: {\n months: [\n \"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\",\n \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\",\n ],\n weekDays: [\"D\", \"S\", \"T\", \"Q\", \"Q\", \"S\", \"S\"],\n prevMonth: \"Mês anterior\",\n nextMonth: \"Próximo mês\",\n },\n en: {\n months: [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n ],\n weekDays: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n prevMonth: \"Previous month\",\n nextMonth: \"Next month\",\n },\n};\n\nexport function DateRangePicker({\n value,\n onChange,\n locale = \"pt\",\n className,\n}: DateRangePickerProps) {\n const [currentMonth, setCurrentMonth] = useState(new Date());\n const l = locales[locale];\n\n const getDaysInMonth = (date: Date) => {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const startDayOfWeek = firstDay.getDay();\n\n const days: (number | null)[] = [];\n for (let i = 0; i < startDayOfWeek; i++) {\n days.push(null);\n }\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(i);\n }\n return days;\n };\n\n const handleDayClick = (day: number) => {\n const selectedDate = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n\n if (!value.start || (value.start && value.end)) {\n onChange({ start: selectedDate, end: null });\n } else if (value.start && !value.end) {\n if (selectedDate >= value.start) {\n onChange({ start: value.start, end: selectedDate });\n } else {\n onChange({ start: selectedDate, end: value.start });\n }\n }\n };\n\n const isDateInRange = (day: number) => {\n if (!value.start || !value.end) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date > value.start && date < value.end;\n };\n\n const isStartDate = (day: number) => {\n if (!value.start) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date.getTime() === value.start.getTime();\n };\n\n const isEndDate = (day: number) => {\n if (!value.end) return false;\n const date = new Date(\n currentMonth.getFullYear(),\n currentMonth.getMonth(),\n day,\n );\n return date.getTime() === value.end.getTime();\n };\n\n const previousMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1),\n );\n };\n\n const nextMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1),\n );\n };\n\n const days = getDaysInMonth(currentMonth);\n\n return (\n <div\n className={cn(\n \"w-64 bg-[var(--dashboard-surface,#ffffff)] rounded-lg p-4 shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={previousMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.prevMonth}\n >\n <ChevronLeft className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n\n <h2 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {l.months[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h2>\n\n <button\n onClick={nextMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.nextMonth}\n >\n <ChevronRight className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-7\">\n {l.weekDays.map((day, index) => (\n <div\n key={index}\n className=\"h-8 w-8 flex items-center justify-center text-xs font-medium text-[var(--dashboard-text-secondary,#6b7280)]\"\n >\n {day}\n </div>\n ))}\n\n {days.map((day, index) => {\n if (day === null) {\n return <div key={`empty-${index}`} className=\"h-8 w-8\" />;\n }\n\n const inRange = isDateInRange(day);\n const isStart = isStartDate(day);\n const isEnd = isEndDate(day);\n const isSelected = isStart || isEnd;\n const hasCompletePeriod = value.start && value.end;\n\n return (\n <div key={day} className=\"relative h-8 w-8\">\n {hasCompletePeriod && (inRange || isStart || isEnd) && (\n <div\n className={cn(\n \"absolute inset-0 bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n isStart && \"rounded-l-full\",\n isEnd && \"rounded-r-full\",\n )}\n />\n )}\n <button\n onClick={() => handleDayClick(day)}\n className={cn(\n \"relative h-8 w-8 flex items-center justify-center text-xs font-medium transition-colors z-10 rounded-full cursor-pointer\",\n isSelected\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white hover:opacity-90\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {day}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport interface DatePickerProps {\n value: Date | null;\n onChange: (date: Date | null) => void;\n locale?: \"pt\" | \"en\";\n minDate?: Date;\n maxDate?: Date;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst locales = {\n pt: {\n months: [\n \"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\",\n \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\",\n ],\n weekDays: [\"D\", \"S\", \"T\", \"Q\", \"Q\", \"S\", \"S\"],\n prevMonth: \"Mês anterior\",\n nextMonth: \"Próximo mês\",\n },\n en: {\n months: [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n ],\n weekDays: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n prevMonth: \"Previous month\",\n nextMonth: \"Next month\",\n },\n};\n\nconst startOfDay = (date: Date) =>\n new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\nexport function DatePicker({\n value,\n onChange,\n locale = \"pt\",\n minDate,\n maxDate,\n className,\n}: DatePickerProps) {\n const [currentMonth, setCurrentMonth] = useState(\n value ?? new Date(),\n );\n const l = locales[locale];\n\n const getDaysInMonth = (date: Date) => {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const startDayOfWeek = firstDay.getDay();\n\n const days: (number | null)[] = [];\n for (let i = 0; i < startDayOfWeek; i++) {\n days.push(null);\n }\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(i);\n }\n return days;\n };\n\n const buildDate = (day: number) =>\n new Date(currentMonth.getFullYear(), currentMonth.getMonth(), day);\n\n const isDisabled = (day: number) => {\n const date = buildDate(day);\n if (minDate && date < startOfDay(minDate)) return true;\n if (maxDate && date > startOfDay(maxDate)) return true;\n return false;\n };\n\n const isSelected = (day: number) => {\n if (!value) return false;\n const date = buildDate(day);\n return date.getTime() === startOfDay(value).getTime();\n };\n\n const handleDayClick = (day: number) => {\n if (isDisabled(day)) return;\n onChange(buildDate(day));\n };\n\n const previousMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1),\n );\n };\n\n const nextMonth = () => {\n setCurrentMonth(\n new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1),\n );\n };\n\n const days = getDaysInMonth(currentMonth);\n\n return (\n <div\n className={cn(\n \"w-64 bg-[var(--dashboard-surface,#ffffff)] rounded-lg p-4 shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={previousMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.prevMonth}\n >\n <ChevronLeft className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n\n <h2 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {l.months[currentMonth.getMonth()]} {currentMonth.getFullYear()}\n </h2>\n\n <button\n type=\"button\"\n onClick={nextMonth}\n className=\"p-1 hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded transition-colors cursor-pointer\"\n aria-label={l.nextMonth}\n >\n <ChevronRight className=\"w-4 h-4 text-[var(--dashboard-text-primary,#2d2d2d)]\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-7\">\n {l.weekDays.map((day, index) => (\n <div\n key={index}\n className=\"h-8 w-8 flex items-center justify-center text-xs font-medium text-[var(--dashboard-text-secondary,#6b7280)]\"\n >\n {day}\n </div>\n ))}\n\n {days.map((day, index) => {\n if (day === null) {\n return <div key={`empty-${index}`} className=\"h-8 w-8\" />;\n }\n\n const selected = isSelected(day);\n const disabled = isDisabled(day);\n\n return (\n <div key={day} className=\"relative h-8 w-8\">\n <button\n type=\"button\"\n onClick={() => handleDayClick(day)}\n disabled={disabled}\n className={cn(\n \"relative h-8 w-8 flex items-center justify-center text-xs font-medium transition-colors z-10 rounded-full\",\n disabled\n ? \"text-[var(--dashboard-text-secondary,#6b7280)]/40 cursor-not-allowed\"\n : \"cursor-pointer\",\n !disabled && selected\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white hover:opacity-90\"\n : !disabled &&\n \"text-[var(--dashboard-text-primary,#2d2d2d)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {day}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n weight?: \"normal\" | \"medium\" | \"semibold\" | \"bold\" | \"extrabold\";\n align?: \"left\" | \"center\" | \"right\";\n color?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst defaultSizeByLevel: Record<number, string> = {\n 1: \"text-2xl sm:text-3xl md:text-4xl lg:text-5xl\",\n 2: \"text-xl sm:text-2xl md:text-3xl lg:text-4xl\",\n 3: \"text-lg sm:text-xl md:text-2xl lg:text-3xl\",\n 4: \"text-base sm:text-lg md:text-xl lg:text-2xl\",\n 5: \"text-sm sm:text-base md:text-lg lg:text-xl\",\n 6: \"text-xs sm:text-sm md:text-base lg:text-lg\",\n};\n\nconst customSizes: Record<string, string> = {\n xs: \"text-xs sm:text-sm\",\n sm: \"text-sm sm:text-base\",\n md: \"text-base sm:text-lg\",\n lg: \"text-lg sm:text-xl md:text-2xl\",\n xl: \"text-xl sm:text-2xl md:text-3xl\",\n \"2xl\": \"text-2xl sm:text-3xl md:text-4xl\",\n \"3xl\": \"text-3xl sm:text-4xl md:text-5xl lg:text-6xl\",\n};\n\nconst weightStyles: Record<string, string> = {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n extrabold: \"font-extrabold\",\n};\n\nconst alignStyles: Record<string, string> = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\nexport function Title({\n children,\n level = 1,\n size,\n weight = \"bold\",\n align = \"left\",\n color,\n className,\n ...props\n}: TitleProps) {\n const Tag = `h${level}` as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n const sizeClass = size ? customSizes[size] : defaultSizeByLevel[level];\n const colorClass = color || \"text-[var(--dashboard-text-primary,#2d2d2d)]\";\n\n return (\n <Tag\n className={cn(\n sizeClass,\n weightStyles[weight],\n alignStyles[align],\n colorClass,\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n );\n}\n","import React from \"react\";\n\nexport interface ToggleSwitchProps {\n enabled: boolean;\n onChange: (enabled: boolean) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst sizeConfig = {\n sm: {\n track: \"h-5 w-9\",\n thumb: \"h-3 w-3\",\n translateOn: \"translate-x-5\",\n translateOff: \"translate-x-1\",\n },\n md: {\n track: \"h-6 w-11\",\n thumb: \"h-4 w-4\",\n translateOn: \"translate-x-6\",\n translateOff: \"translate-x-1\",\n },\n lg: {\n track: \"h-7 w-14\",\n thumb: \"h-5 w-5\",\n translateOn: \"translate-x-8\",\n translateOff: \"translate-x-1\",\n },\n};\n\nexport function ToggleSwitch({\n enabled,\n onChange,\n disabled = false,\n size = \"md\",\n label,\n className,\n}: ToggleSwitchProps) {\n const config = sizeConfig[size];\n\n return (\n <div className={cn(\"inline-flex items-center gap-2\", className)}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={label}\n disabled={disabled}\n onClick={() => onChange(!enabled)}\n className={cn(\n \"relative inline-flex items-center rounded-full transition-colors outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--dashboard-primary,#37a501)]\",\n config.track,\n enabled\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/30\",\n disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n )}\n >\n <span\n className={cn(\n \"inline-block transform rounded-full bg-white shadow-sm transition-transform\",\n config.thumb,\n enabled ? config.translateOn : config.translateOff,\n )}\n />\n </button>\n {label && (\n <span\n className={cn(\n \"text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\",\n disabled && \"opacity-50\",\n )}\n >\n {label}\n </span>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface BadgeStatusProps {\n label: string;\n variant?: \"success\" | \"warning\" | \"danger\" | \"info\" | \"neutral\";\n color?: string;\n bgColor?: string;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst variantStyles: Record<string, { color: string; bgColor: string }> = {\n success: {\n color: \"text-[var(--dashboard-status-success,#10B981)]\",\n bgColor: \"bg-[var(--dashboard-status-success,#10B981)]/10\",\n },\n warning: {\n color: \"text-[var(--dashboard-status-warning,#f59e0b)]\",\n bgColor: \"bg-[var(--dashboard-status-warning,#f59e0b)]/10\",\n },\n danger: {\n color: \"text-[var(--dashboard-status-danger,#EF4444)]\",\n bgColor: \"bg-[var(--dashboard-status-danger,#EF4444)]/10\",\n },\n info: {\n color: \"text-[var(--dashboard-status-info,#3b82f6)]\",\n bgColor: \"bg-[var(--dashboard-status-info,#3b82f6)]/10\",\n },\n neutral: {\n color: \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n bgColor: \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n },\n};\n\nconst sizeClasses: Record<string, string> = {\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-3 py-1 text-sm\",\n};\n\nexport function BadgeStatus({\n label,\n variant = \"neutral\",\n color,\n bgColor,\n size = \"md\",\n className,\n}: BadgeStatusProps) {\n const styles = variantStyles[variant];\n const useCustomColors = color || bgColor;\n\n return (\n <span\n className={cn(\n \"inline-flex w-fit items-center justify-center rounded-full font-medium whitespace-nowrap\",\n sizeClasses[size],\n !useCustomColors && styles.color,\n !useCustomColors && styles.bgColor,\n className,\n )}\n style={\n useCustomColors\n ? {\n color: color || undefined,\n backgroundColor: bgColor || undefined,\n }\n : undefined\n }\n >\n {label}\n </span>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, ReactNode } from \"react\";\nimport { LogOut, ChevronDown, ChevronRight, User } from \"lucide-react\";\n\nexport interface SidebarMenuItem {\n id: string;\n label: string;\n href: string;\n icon: React.ComponentType<{\n size?: number;\n className?: string;\n style?: React.CSSProperties;\n }>;\n /** Optional section header — rendered above this item when set */\n section?: string;\n /** Child items — renders as expandable sub-menu */\n children?: SidebarMenuItem[];\n /** When true, the item is rendered in a non-interactive disabled state */\n disabled?: boolean;\n}\n\nexport interface SidebarUser {\n name: string;\n email: string;\n subtitle?: string;\n}\n\nexport interface SidebarProps {\n menuItems: SidebarMenuItem[];\n logo: ReactNode;\n collapsedLogo?: ReactNode;\n currentPath: string;\n linkComponent?: React.ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n }>;\n isCollapsed?: boolean;\n onToggleCollapse?: () => void;\n user?: SidebarUser;\n onUserClick?: () => void;\n onLogout?: () => void;\n logoutLabel?: string;\n /** Extra items rendered in the footer, above the logout button */\n footerItems?: SidebarMenuItem[];\n /** Arbitrary content rendered between the user info block and footerItems */\n footerSlot?: ReactNode;\n /** Initial expanded sub-menu IDs (pass from server to avoid hydration mismatch). */\n defaultExpandedIds?: string[];\n /** Cookie/localStorage key for persisting expanded state across reloads. */\n persistExpandedKey?: string;\n /** When false, the mobile header is not rendered (use when an external app header is in place). Default: true */\n showMobileHeader?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction DefaultLink({\n href,\n className,\n children,\n}: {\n href: string;\n className?: string;\n children: ReactNode;\n}) {\n return (\n <a href={href} className={className}>\n {children}\n </a>\n );\n}\n\nexport function Sidebar({\n menuItems,\n logo,\n collapsedLogo,\n currentPath,\n linkComponent: LinkComponent = DefaultLink,\n isCollapsed = false,\n onToggleCollapse,\n user,\n onUserClick,\n onLogout,\n logoutLabel = \"Sair\",\n footerItems,\n footerSlot,\n defaultExpandedIds,\n persistExpandedKey,\n showMobileHeader = true,\n className,\n}: SidebarProps) {\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n const [expandedIds, setExpandedIds] = useState<Set<string>>(\n () => new Set(defaultExpandedIds ?? []),\n );\n\n const cubicBezier = \"cubic-bezier(0.4, 0, 0.2, 1)\";\n\n // Auto-expand any ancestor of an item whose href matches the current path.\n // Recursive — supports nesting at arbitrary depth.\n useEffect(() => {\n function collectAncestorsOfActive(\n items: SidebarMenuItem[],\n acc: string[],\n ): boolean {\n let hasActive = false;\n for (const item of items) {\n const selfActive = currentPath === item.href;\n let childActive = false;\n if (item.children && item.children.length > 0) {\n childActive = collectAncestorsOfActive(item.children, acc);\n if (childActive) acc.push(item.id);\n }\n if (selfActive || childActive) hasActive = true;\n }\n return hasActive;\n }\n\n const idsToExpand: string[] = [];\n collectAncestorsOfActive(menuItems, idsToExpand);\n if (footerItems) collectAncestorsOfActive(footerItems, idsToExpand);\n\n if (idsToExpand.length > 0) {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n for (const id of idsToExpand) next.add(id);\n return next;\n });\n }\n }, [currentPath, menuItems, footerItems]);\n\n // Persist expanded IDs to cookie (SSR-readable) + localStorage (fallback)\n useEffect(() => {\n if (persistExpandedKey && typeof document !== \"undefined\") {\n const json = JSON.stringify([...expandedIds]);\n try { localStorage.setItem(persistExpandedKey, json); } catch { /* ignore */ }\n document.cookie = `${persistExpandedKey}=${encodeURIComponent(json)}; path=/; max-age=31536000; SameSite=Lax`;\n }\n }, [expandedIds, persistExpandedKey]);\n\n function toggleExpand(id: string) {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n function isItemActive(item: SidebarMenuItem): boolean {\n if (currentPath === item.href) return true;\n return hasActiveDescendant(item);\n }\n\n /** True if the item or any nested descendant matches `currentPath`. */\n function hasActiveDescendant(item: SidebarMenuItem): boolean {\n if (!item.children) return false;\n for (const child of item.children) {\n if (currentPath === child.href) return true;\n if (hasActiveDescendant(child)) return true;\n }\n return false;\n }\n\n /**\n * Counts how many descendant nodes are currently visible in the tree —\n * i.e. all direct children, plus all descendants of expanded children\n * (recurse only inside expanded branches). Used to size the `maxHeight`\n * animation container so it fits the full expanded subtree.\n */\n function countVisibleDescendants(item: SidebarMenuItem): number {\n if (!item.children || item.children.length === 0) return 0;\n let count = item.children.length;\n for (const child of item.children) {\n if (expandedIds.has(child.id)) {\n count += countVisibleDescendants(child);\n }\n }\n return count;\n }\n\n /** Group items by section — items before any section go into a null group */\n function groupBySection(items: SidebarMenuItem[]) {\n const groups: { section: string | null; items: SidebarMenuItem[] }[] = [];\n for (const item of items) {\n if (item.section) {\n groups.push({ section: item.section, items: [item] });\n } else {\n if (groups.length === 0) groups.push({ section: null, items: [] });\n groups[groups.length - 1]!.items.push(item);\n }\n }\n return groups;\n }\n\n // ── Shared render helpers ──────────────────────────────────────────\n\n function renderSectionHeader(section: string, collapsed: boolean) {\n if (collapsed) {\n return (\n <div className=\"my-2 mx-2 border-t border-[var(--dashboard-sidebar-border,#e0dfe3)]\" />\n );\n }\n return (\n <div className=\"mb-1 mt-5 px-4 text-[11px] font-bold uppercase tracking-wider text-[var(--dashboard-sidebar-text,#403f52)]/80\">\n {section}\n </div>\n );\n }\n\n /**\n * Renders a nested child item (inside an expanded parent). Recursive —\n * if the child itself has `children`, renders as expandable and recurses.\n * Styling is the \"child\" variant (smaller icon, smaller text, indented)\n * regardless of depth, to keep visual consistency across levels.\n */\n function renderChildItem(item: SidebarMenuItem): React.ReactNode {\n const ChildIcon = item.icon;\n const childActive = currentPath === item.href;\n const hasChildren = item.children && item.children.length > 0;\n const isExpanded = expandedIds.has(item.id);\n const isChildActive = hasActiveDescendant(item);\n\n if (hasChildren) {\n return (\n <div key={item.id}>\n <button\n onClick={() => toggleExpand(item.id)}\n className={cn(\n \"w-full flex items-center pl-4 pr-4 py-2 rounded-r-lg text-[13px] cursor-pointer\",\n childActive || isChildActive\n ? \"text-[var(--dashboard-sidebar-active-text,#ff521d)] font-semibold\"\n : \"text-[var(--dashboard-sidebar-text,#403f52)] hover:text-[var(--dashboard-sidebar-active-text,#ff521d)]\",\n )}\n style={{ transition: \"background-color 200ms, color 200ms\" }}\n >\n <ChildIcon size={15} className=\"mr-2 flex-shrink-0\" />\n <span className=\"whitespace-nowrap flex-1 text-left\">\n {item.label}\n </span>\n <ChevronRight\n size={12}\n className={cn(\n \"ml-auto flex-shrink-0 transition-transform duration-200\",\n isExpanded ? \"rotate-90\" : \"\",\n )}\n />\n </button>\n <div\n className=\"overflow-hidden transition-all duration-200 ml-4 border-l-2 border-[var(--dashboard-sidebar-border,#e0dfe3)]\"\n style={{\n maxHeight: isExpanded\n ? `${countVisibleDescendants(item) * 40}px`\n : \"0\",\n }}\n >\n {item.children!.map((grandchild) => renderChildItem(grandchild))}\n </div>\n </div>\n );\n }\n\n return (\n <LinkComponent key={item.id} href={item.href} className=\"block\">\n <div\n className={cn(\n \"w-full flex items-center pl-4 pr-4 py-2 rounded-r-lg text-[13px] cursor-pointer\",\n childActive\n ? \"text-[var(--dashboard-sidebar-active-text,#ff521d)] font-semibold border-l-2 border-[var(--dashboard-primary,#ff521d)] -ml-[2px]\"\n : \"text-[var(--dashboard-sidebar-text,#403f52)] hover:text-[var(--dashboard-sidebar-active-text,#ff521d)]\",\n )}\n style={{ transition: \"background-color 200ms, color 200ms\" }}\n >\n <ChildIcon size={15} className=\"mr-2 flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{item.label}</span>\n </div>\n </LinkComponent>\n );\n }\n\n function renderMenuItem(\n item: SidebarMenuItem,\n collapsed: boolean,\n mobile: boolean,\n ) {\n const Icon = item.icon;\n const hasChildren = item.children && item.children.length > 0;\n const isActive = currentPath === item.href;\n const isExpanded = expandedIds.has(item.id);\n const isChildActive = item.children?.some(\n (c) => currentPath === c.href,\n );\n\n if (hasChildren) {\n return (\n <div key={item.id}>\n <button\n onClick={() => toggleExpand(item.id)}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer\",\n collapsed && !mobile ? \"justify-center\" : \"justify-start\",\n isChildActive\n ? \"text-[var(--dashboard-sidebar-active-text,#ff521d)]\"\n : \"text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-[var(--dashboard-primary,#ff521d)]/10\",\n )}\n style={{ transition: \"background-color 200ms, color 200ms\" }}\n title={collapsed && !mobile ? item.label : undefined}\n >\n <Icon\n size={20}\n style={{\n marginRight: collapsed && !mobile ? 0 : \"0.75rem\",\n flexShrink: 0,\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n {(!collapsed || mobile) && (\n <>\n <span className=\"whitespace-nowrap flex-1 text-left\">\n {item.label}\n </span>\n <ChevronRight\n size={14}\n className={cn(\n \"ml-auto flex-shrink-0 transition-transform duration-200\",\n isExpanded ? \"rotate-90\" : \"\",\n )}\n />\n </>\n )}\n </button>\n {/* Children — recursive: supports arbitrary nesting depth */}\n {(!collapsed || mobile) && (\n <div\n className=\"overflow-hidden transition-all duration-200 ml-7 border-l-2 border-[var(--dashboard-sidebar-border,#e0dfe3)]\"\n style={{\n maxHeight: isExpanded\n ? `${countVisibleDescendants(item) * 40}px`\n : \"0\",\n }}\n >\n {item.children!.map((child) => renderChildItem(child))}\n </div>\n )}\n </div>\n );\n }\n\n // Simple item (no children)\n return (\n <LinkComponent key={item.id} href={item.href} className=\"block\">\n <div\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer\",\n collapsed && !mobile ? \"justify-center\" : \"justify-start\",\n isActive\n ? \"bg-[var(--dashboard-primary,#ff521d)]/25 text-[var(--dashboard-sidebar-active-text,#ff521d)]\"\n : \"text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-[var(--dashboard-primary,#ff521d)]/10\",\n )}\n style={{ transition: \"background-color 200ms, color 200ms\" }}\n title={collapsed && !mobile ? item.label : undefined}\n >\n <Icon\n size={20}\n style={{\n marginRight: collapsed && !mobile ? 0 : \"0.75rem\",\n flexShrink: 0,\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n <span\n className=\"whitespace-nowrap overflow-hidden\"\n style={\n !mobile\n ? {\n width: collapsed ? 0 : \"auto\",\n opacity: collapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }\n : undefined\n }\n >\n {item.label}\n </span>\n </div>\n </LinkComponent>\n );\n }\n\n function renderMenuGroups(collapsed: boolean, mobile: boolean) {\n const groups = groupBySection(menuItems);\n return groups.map((group, i) => (\n <div key={group.section || `group-${i}`} className=\"space-y-1\">\n {group.section && renderSectionHeader(group.section, collapsed)}\n {group.items.map((item) => renderMenuItem(item, collapsed, mobile))}\n </div>\n ));\n }\n\n // ── Mobile Header ──────────────────────────────────────────────────\n\n const mobileHeader = (\n <header className=\"xl:hidden fixed top-0 left-0 right-0 z-40 bg-[var(--dashboard-sidebar-bg,#f0f0f0)] border-b border-[var(--dashboard-sidebar-border,#e0dfe3)]\">\n <div className=\"flex items-center justify-center px-4 h-16 relative\">\n <div className=\"flex items-center\">{logo}</div>\n <button\n onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\n className=\"absolute right-4 inline-flex items-center justify-center rounded-lg text-sm font-medium transition-colors cursor-pointer bg-black/5 text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-black/10 h-10 w-10\"\n aria-label=\"Menu\"\n aria-expanded={isMobileMenuOpen}\n >\n <ChevronDown\n size={24}\n className={`transition-transform duration-200 ${isMobileMenuOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n </div>\n\n <nav\n className={`absolute top-16 left-0 right-0 bg-[var(--dashboard-sidebar-bg,#f0f0f0)] border-b border-[var(--dashboard-sidebar-border,#e0dfe3)] shadow-lg transition-all duration-200 ${\n isMobileMenuOpen\n ? \"max-h-[calc(100vh-4rem)] overflow-y-auto\"\n : \"max-h-0 overflow-hidden\"\n }`}\n >\n <div className=\"px-4 py-2\">\n {renderMenuGroups(false, true)}\n\n <div className=\"mt-2 pt-2 border-t border-[var(--dashboard-sidebar-border,#e0dfe3)] space-y-2\">\n {user && (\n <button\n onClick={onUserClick}\n className=\"w-full flex items-center px-4 py-3 rounded-lg bg-[var(--dashboard-primary,#ff521d)]/5 hover:bg-[var(--dashboard-primary,#ff521d)]/10 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#ff521d)]/30 text-[var(--dashboard-sidebar-text,#403f52)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div className=\"ml-3 text-left\">\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#403f52)]/60 whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-sidebar-text,#403f52)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#403f52)]/60 whitespace-nowrap truncate\">\n {user.email}\n </p>\n </div>\n </button>\n )}\n\n {footerSlot}\n\n {footerItems?.map((item) => renderMenuItem(item, false, true))}\n\n {onLogout && (\n <button\n onClick={onLogout}\n className=\"w-full flex items-center justify-start px-4 py-3 rounded-lg text-sm font-medium transition-colors cursor-pointer text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-[var(--dashboard-primary,#ff521d)]/10\"\n >\n <LogOut size={20} className=\"mr-3 flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{logoutLabel}</span>\n </button>\n )}\n </div>\n </div>\n </nav>\n </header>\n );\n\n // ── Desktop Sidebar ────────────────────────────────────────────────\n\n const desktopSidebar = (\n <aside\n className={cn(\n \"hidden xl:flex xl:flex-col xl:fixed xl:left-0 xl:top-0 xl:h-screen bg-[var(--dashboard-sidebar-bg,#f0f0f0)] border-r border-[var(--dashboard-sidebar-border,#e0dfe3)] overflow-visible\",\n isCollapsed ? \"xl:w-[109px]\" : \"xl:w-[280px]\",\n className,\n )}\n style={{ transition: `width 400ms ${cubicBezier}` }}\n >\n {/* Toggle Button */}\n {onToggleCollapse && (\n <button\n onClick={onToggleCollapse}\n className=\"absolute top-16 -right-[18px] -translate-y-1/2 z-50 flex items-center justify-center cursor-pointer\"\n aria-label={isCollapsed ? \"Expandir sidebar\" : \"Recolher sidebar\"}\n style={{ width: \"20px\", height: \"193px\" }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"193\"\n viewBox=\"0 0 20 193\"\n fill=\"none\"\n className=\"absolute inset-0\"\n >\n {/* Fill shape — extended to x=0 to fully cover the aside border-r */}\n <path\n d=\"M10.2036 118.86C14.8518 115.918 19.5 107.801 19.5 95.9116C19.5 84.0223 15.672 76.4939 10.2036 72.9634C4.73505 69.4329 2.54765 63.5488 1.72738 55.8994L0 55.8994L0 136.512L1.72738 136.512C2.82108 125.921 5.55533 121.802 10.2036 118.86Z\"\n fill=\"var(--dashboard-sidebar-bg,#f0f0f0)\"\n />\n {/* Outer curve stroke — traces only the curved portion */}\n <path\n d=\"M1.72738 55.8994C2.54765 63.5488 4.73505 69.4329 10.2036 72.9634C15.672 76.4939 19.5 84.0223 19.5 95.9116C19.5 107.801 14.8518 115.918 10.2036 118.86C5.55533 121.802 2.82108 125.921 1.72738 136.512\"\n stroke=\"var(--dashboard-sidebar-border,#e0dfe3)\"\n strokeWidth=\"1\"\n fill=\"none\"\n />\n </svg>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n className={`relative z-10 ${isCollapsed ? \"\" : \"rotate-180\"}`}\n style={{ transition: `transform 400ms ${cubicBezier}` }}\n >\n <path\n d=\"M4.5 2L8.5 6L4.5 10\"\n stroke=\"var(--dashboard-sidebar-text,#403f52)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div className=\"flex flex-col h-full overflow-y-auto\">\n {/* Logo */}\n <div className=\"flex justify-center items-center py-6 px-4 border-b border-[var(--dashboard-sidebar-border,#e0dfe3)] overflow-hidden relative h-[88px]\">\n {collapsedLogo && (\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n style={{\n opacity: isCollapsed ? 1 : 0,\n transition: `opacity 400ms ${cubicBezier}`,\n pointerEvents: isCollapsed ? \"auto\" : \"none\",\n }}\n >\n {collapsedLogo}\n </div>\n )}\n <div\n className=\"flex items-center justify-center\"\n style={{\n opacity: !isCollapsed || !collapsedLogo ? 1 : 0,\n transition: `opacity 400ms ${cubicBezier}`,\n pointerEvents:\n !isCollapsed || !collapsedLogo ? \"auto\" : \"none\",\n }}\n >\n {logo}\n </div>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex-1 px-3 py-3 space-y-0.5 overflow-y-auto\">\n {renderMenuGroups(isCollapsed, false)}\n </nav>\n\n {/* Footer */}\n <footer className=\"p-4 border-t border-[var(--dashboard-sidebar-border,#e0dfe3)] space-y-2\">\n {user && (\n <button\n onClick={onUserClick}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg bg-[var(--dashboard-primary,#ff521d)]/5 hover:bg-[var(--dashboard-primary,#ff521d)]/10 transition-colors cursor-pointer\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n )}\n title={\n isCollapsed\n ? `${user.subtitle ? user.subtitle + \" - \" : \"\"}${user.name}`\n : undefined\n }\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#ff521d)]/30 text-[var(--dashboard-sidebar-text,#403f52)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div\n className=\"overflow-hidden text-left\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n marginLeft: isCollapsed ? 0 : \"0.75rem\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, margin 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#403f52)]/60 whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-sidebar-text,#403f52)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#403f52)]/60 whitespace-nowrap truncate\">\n {user.email}\n </p>\n </div>\n </button>\n )}\n\n {footerSlot}\n\n {footerItems?.map((item) => renderMenuItem(item, isCollapsed, false))}\n\n {onLogout && (\n <button\n onClick={onLogout}\n className={cn(\n \"w-full flex items-center px-4 py-3 rounded-lg text-sm font-medium cursor-pointer text-[var(--dashboard-sidebar-text,#403f52)] hover:bg-[var(--dashboard-primary,#ff521d)]/10\",\n isCollapsed ? \"justify-center\" : \"justify-start\",\n )}\n style={{ transition: \"background-color 200ms\" }}\n title={isCollapsed ? logoutLabel : undefined}\n >\n <LogOut\n size={20}\n style={{\n marginRight: isCollapsed ? 0 : \"0.75rem\",\n transition: `margin 400ms ${cubicBezier}`,\n }}\n />\n <span\n className=\"whitespace-nowrap overflow-hidden\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {logoutLabel}\n </span>\n </button>\n )}\n </footer>\n </div>\n </aside>\n );\n\n return (\n <>\n {showMobileHeader && mobileHeader}\n {desktopSidebar}\n </>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode, useState, useRef, useEffect } from \"react\";\nimport { Building2, Check, ChevronDown, LogOut, Menu, User, X } from \"lucide-react\";\nimport type { SidebarMenuItem, SidebarUser } from \"../Sidebar\";\n\nexport interface HeaderMenuChild {\n id: string;\n label: string;\n href: string;\n icon: React.ComponentType<{ size?: number; className?: string; style?: React.CSSProperties }>;\n disabled?: boolean;\n}\n\nexport interface HeaderMenuGroup {\n id: string;\n label: string;\n icon: React.ComponentType<{ size?: number; className?: string; style?: React.CSSProperties }>;\n children: HeaderMenuChild[];\n}\n\nexport type HeaderMenuItem = SidebarMenuItem | HeaderMenuGroup;\n\nexport type HeaderUser = SidebarUser;\n\nexport interface HeaderEstablishment {\n id: string;\n label: string;\n description?: string;\n active?: boolean;\n disabled?: boolean;\n}\n\nexport interface HeaderProps {\n /** Itens de navegacao exibidos no header */\n menuItems: HeaderMenuItem[];\n /** Logo principal */\n logo: ReactNode;\n /** Rota ativa */\n currentPath: string;\n /** Componente de link do framework consumidor */\n linkComponent?: React.ComponentType<{\n href: string;\n className?: string;\n onClick?: () => void;\n children: ReactNode;\n }>;\n /** Usuario autenticado */\n user?: HeaderUser;\n /** Estabelecimentos exibidos no menu do usuario */\n establishments?: HeaderEstablishment[];\n /** Label da secao de estabelecimentos */\n establishmentsLabel?: string;\n /** Callback ao selecionar um estabelecimento */\n onEstablishmentChange?: (establishmentId: string) => void;\n /** Acoes extras exibidas antes do usuario */\n actions?: ReactNode;\n /** Callback ao clicar no usuario */\n onUserClick?: () => void;\n /** Callback de logout */\n onLogout?: () => void;\n logoutLabel?: string;\n /** Label do botao de menu mobile */\n menuLabel?: string;\n /** Abre dropdowns de navegacao no hover em layouts desktop. Default: true */\n openDropdownOnHover?: boolean;\n /** Offset lateral no desktop quando existe sidebar fixa */\n desktopOffsetLeft?: number | string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction isGroup(item: HeaderMenuItem): item is HeaderMenuGroup {\n return \"children\" in item && Array.isArray(item.children);\n}\n\nfunction DefaultLink({\n href,\n className,\n onClick,\n children,\n}: {\n href: string;\n className?: string;\n onClick?: () => void;\n children: ReactNode;\n}) {\n return (\n <a href={href} className={className} onClick={onClick}>\n {children}\n </a>\n );\n}\n\nfunction useOnClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n handler: () => void\n) {\n useEffect(() => {\n const listener = (event: MouseEvent | TouchEvent) => {\n if (!ref.current || ref.current.contains(event.target as Node)) return;\n handler();\n };\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [ref, handler]);\n}\n\nexport function Header({\n menuItems,\n logo,\n currentPath,\n linkComponent: LinkComponent = DefaultLink,\n user,\n establishments = [],\n establishmentsLabel = \"Estabelecimento\",\n onEstablishmentChange,\n actions,\n onUserClick,\n onLogout,\n logoutLabel = \"Sair\",\n menuLabel = \"Menu\",\n openDropdownOnHover = true,\n desktopOffsetLeft = 0,\n className,\n}: HeaderProps) {\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n const [isUserMenuOpen, setIsUserMenuOpen] = useState(false);\n const [openDropdownId, setOpenDropdownId] = useState<string | null>(null);\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const userMenuRef = useRef<HTMLDivElement>(null);\n const hoverCloseTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useOnClickOutside(dropdownRef, () => setOpenDropdownId(null));\n useOnClickOutside(userMenuRef, () => setIsUserMenuOpen(false));\n\n useEffect(() => {\n return () => {\n if (hoverCloseTimeoutRef.current) {\n clearTimeout(hoverCloseTimeoutRef.current);\n }\n };\n }, []);\n\n const clearHoverCloseTimeout = () => {\n if (!hoverCloseTimeoutRef.current) return;\n clearTimeout(hoverCloseTimeoutRef.current);\n hoverCloseTimeoutRef.current = null;\n };\n\n const closeMenus = () => {\n clearHoverCloseTimeout();\n setIsMobileMenuOpen(false);\n setIsUserMenuOpen(false);\n setOpenDropdownId(null);\n };\n\n const isItemActive = (item: HeaderMenuItem) => {\n if (isGroup(item)) {\n return item.children.some(\n (child) =>\n currentPath === child.href ||\n (child.href !== \"/dashboard\" && currentPath.startsWith(child.href))\n );\n }\n return currentPath === item.href;\n };\n\n const renderNavLink = (\n item: SidebarMenuItem,\n options: { mobile?: boolean } = {}\n ) => {\n const Icon = item.icon;\n const active = currentPath === item.href;\n\n if (item.disabled) {\n return (\n <span\n key={item.id}\n className={cn(\n \"flex items-center gap-2 rounded-lg text-sm font-medium cursor-not-allowed\",\n options.mobile\n ? \"px-4 py-3\"\n : \"h-10 px-3\",\n \"text-[var(--dashboard-text-secondary,#6b7280)]/40\"\n )}\n title=\"Em breve\"\n >\n <Icon size={18} className=\"flex-shrink-0 opacity-40\" />\n <span className=\"line-through opacity-50\">{item.label}</span>\n </span>\n );\n }\n\n return (\n <LinkComponent\n key={item.id}\n href={item.href}\n className=\"block\"\n onClick={closeMenus}\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-lg text-sm font-medium transition-colors\",\n options.mobile\n ? \"px-4 py-3\"\n : \"h-10 px-3\",\n active\n ? \"bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-primary,#37a501)]/8 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n )}\n aria-current={active ? \"page\" : undefined}\n >\n <Icon size={18} className=\"flex-shrink-0\" />\n <span>{item.label}</span>\n </div>\n </LinkComponent>\n );\n };\n\n const renderDropdown = (\n group: HeaderMenuGroup,\n options: { mobile?: boolean } = {}\n ) => {\n const Icon = group.icon;\n const groupActive = isItemActive(group);\n const isOpen = openDropdownId === group.id;\n\n if (options.mobile) {\n return (\n <div key={group.id} className=\"space-y-1\">\n <div className=\"flex items-center gap-2 px-4 py-2 text-xs font-semibold uppercase tracking-wider text-[var(--dashboard-text-secondary,#6b7280)]\">\n <Icon size={16} />\n {group.label}\n </div>\n <div className=\"ml-3 space-y-1 border-l border-[var(--dashboard-text-secondary,#6b7280)]/20 pl-3\">\n {group.children.map((child) => {\n const active = currentPath === child.href;\n return (\n child.disabled ? (\n <span\n key={child.id}\n className=\"flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-medium cursor-not-allowed text-[var(--dashboard-text-secondary,#6b7280)]/40\"\n title=\"Em breve\"\n >\n <child.icon size={16} className=\"flex-shrink-0 opacity-40\" />\n <span className=\"line-through opacity-50\">{child.label}</span>\n </span>\n ) : (\n <LinkComponent\n key={child.id}\n href={child.href}\n className=\"block\"\n onClick={closeMenus}\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-medium transition-colors\",\n active\n ? \"bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-primary,#37a501)]/8 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n )}\n >\n <child.icon size={16} className=\"flex-shrink-0\" />\n <span>{child.label}</span>\n </div>\n </LinkComponent>\n )\n );\n })}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={group.id}\n className=\"relative\"\n ref={isOpen ? dropdownRef : undefined}\n onMouseEnter={() => {\n if (!openDropdownOnHover) return;\n clearHoverCloseTimeout();\n setOpenDropdownId(group.id);\n }}\n onMouseLeave={() => {\n if (!openDropdownOnHover) return;\n hoverCloseTimeoutRef.current = setTimeout(() => {\n setOpenDropdownId((current) => (current === group.id ? null : current));\n hoverCloseTimeoutRef.current = null;\n }, 120);\n }}\n >\n <button\n type=\"button\"\n onClick={() => {\n clearHoverCloseTimeout();\n setOpenDropdownId((prev) => (prev === group.id ? null : group.id));\n }}\n className={cn(\n \"flex h-10 items-center gap-1.5 rounded-lg px-3 text-sm font-medium transition-colors\",\n groupActive\n ? \"bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-primary,#37a501)]/8 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n )}\n aria-expanded={isOpen}\n >\n <Icon size={18} className=\"flex-shrink-0\" />\n <span>{group.label}</span>\n <ChevronDown\n size={14}\n className={cn(\"flex-shrink-0 transition-transform\", isOpen && \"rotate-180\")}\n />\n </button>\n\n {isOpen && (\n <div className=\"absolute left-1/2 top-[calc(100%+0.5rem)] z-50 w-max min-w-full max-w-[24rem] -translate-x-1/2 rounded-xl border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] p-1.5 shadow-xl\">\n {group.children.map((child) => {\n const active = currentPath === child.href;\n return (\n child.disabled ? (\n <span\n key={child.id}\n className=\"flex cursor-not-allowed items-center gap-2 rounded-lg px-3 py-2 text-sm text-[var(--dashboard-text-secondary,#6b7280)]/40\"\n title=\"Em breve\"\n >\n <child.icon size={16} className=\"flex-shrink-0 opacity-40\" />\n <span className=\"whitespace-nowrap line-through opacity-50\">{child.label}</span>\n </span>\n ) : (\n <LinkComponent\n key={child.id}\n href={child.href}\n className=\"block\"\n onClick={() => setOpenDropdownId(null)}\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-lg px-3 py-2 text-sm transition-colors\",\n active\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)] font-semibold\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]/80 hover:bg-[var(--dashboard-primary,#37a501)]/8 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n )}\n >\n <child.icon size={16} className=\"flex-shrink-0\" />\n <span className=\"whitespace-nowrap\">{child.label}</span>\n {active && (\n <span className=\"ml-auto h-1.5 w-1.5 rounded-full bg-[var(--dashboard-primary,#37a501)]\" />\n )}\n </div>\n </LinkComponent>\n )\n );\n })}\n </div>\n )}\n </div>\n );\n };\n\n const renderNavItem = (\n item: HeaderMenuItem,\n options: { mobile?: boolean } = {}\n ) => {\n if (isGroup(item)) {\n return renderDropdown(item, options);\n }\n return renderNavLink(item, options);\n };\n\n const desktopOffset =\n typeof desktopOffsetLeft === \"number\"\n ? `${desktopOffsetLeft}px`\n : desktopOffsetLeft;\n const userEstablishments =\n establishments.length > 0\n ? establishments\n : user?.subtitle\n ? [\n {\n id: \"current\",\n label: user.subtitle,\n active: true,\n },\n ]\n : [];\n\n return (\n <>\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed inset-x-0 top-0 z-30 h-2 bg-[var(--dashboard-background,#f2f2f2)]\"\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed left-[var(--dashboard-page-gutter,0px)] right-[var(--dashboard-page-gutter,0px)] top-2 z-30 h-5 bg-[var(--dashboard-background,#f2f2f2)] transition-[left,right] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)] min-[800px]:left-[calc(var(--dashboard-header-offset-left,0px)+var(--dashboard-page-gutter,0px))]\"\n style={\n {\n \"--dashboard-header-offset-left\": desktopOffset,\n } as React.CSSProperties\n }\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed left-[var(--dashboard-page-gutter,0px)] top-2 z-30 h-14 w-5 bg-[var(--dashboard-background,#f2f2f2)] transition-[left] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)] min-[800px]:left-[calc(var(--dashboard-header-offset-left,0px)+var(--dashboard-page-gutter,0px))]\"\n style={\n {\n \"--dashboard-header-offset-left\": desktopOffset,\n } as React.CSSProperties\n }\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed right-[var(--dashboard-page-gutter,0px)] top-2 z-30 h-14 w-5 bg-[var(--dashboard-background,#f2f2f2)] transition-[right] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)]\"\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed left-[var(--dashboard-page-gutter,0px)] right-[var(--dashboard-page-gutter,0px)] top-2 z-30 h-20 rounded-2xl bg-[var(--dashboard-background,#f2f2f2)] transition-[left,right] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)] min-[800px]:left-[calc(var(--dashboard-header-offset-left,0px)+var(--dashboard-page-gutter,0px))]\"\n style={\n {\n \"--dashboard-header-offset-left\": desktopOffset,\n } as React.CSSProperties\n }\n />\n\n <header\n className={cn(\n \"fixed left-[var(--dashboard-page-gutter,0px)] right-[var(--dashboard-page-gutter,0px)] top-2 z-40 rounded-2xl border border-[var(--dashboard-text-secondary,#6b7280)]/15 bg-[var(--dashboard-surface,#ffffff)] text-[var(--dashboard-text-primary,#2d2d2d)] dashboard-header-shadow transition-[left,right] duration-[400ms] ease-[cubic-bezier(0.4,0,0.2,1)] min-[800px]:left-[calc(var(--dashboard-header-offset-left,0px)+var(--dashboard-page-gutter,0px))]\",\n className,\n )}\n style={\n {\n \"--dashboard-header-offset-left\": desktopOffset,\n } as React.CSSProperties\n }\n >\n <div className=\"flex h-20 items-center gap-4 px-4 sm:px-5 min-[800px]:grid min-[800px]:grid-cols-[minmax(7rem,1fr)_auto_minmax(3rem,1fr)] min-[800px]:gap-3 min-[1000px]:grid-cols-[minmax(8rem,1fr)_auto_minmax(10rem,1fr)] min-[1120px]:gap-4\">\n <div className=\"flex min-w-0 flex-1 items-center gap-4 lg:flex-none min-[800px]:col-start-1 min-[800px]:justify-self-start\">\n <div className=\"flex min-w-0 items-center\">{logo}</div>\n </div>\n\n <nav\n className=\"hidden min-w-0 items-center justify-center gap-1 min-[800px]:col-start-2 min-[800px]:flex\"\n aria-label=\"Navegacao principal\"\n >\n {menuItems.map((item) => renderNavItem(item))}\n </nav>\n\n <div className=\"hidden items-center gap-3 min-[800px]:col-start-3 min-[800px]:flex min-[800px]:justify-self-end\">\n {actions}\n\n {user && (\n <div className=\"relative w-11 min-[1000px]:w-[220px] min-[1120px]:w-[260px]\" ref={userMenuRef}>\n <button\n type=\"button\"\n onClick={() => setIsUserMenuOpen((open) => !open)}\n className=\"flex h-11 w-full items-center justify-center gap-3 rounded-lg bg-[var(--dashboard-background,#f2f2f2)] px-0 text-left transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8 min-[1000px]:justify-start min-[1000px]:px-3\"\n aria-expanded={isUserMenuOpen}\n aria-label={user.name}\n >\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <User size={16} />\n </div>\n <div className=\"hidden min-w-0 flex-1 min-[1000px]:block\">\n {user.subtitle && (\n <p className=\"truncate text-[11px] leading-4 text-[var(--dashboard-text-secondary,#6b7280)]\">\n {user.subtitle}\n </p>\n )}\n <p className=\"truncate text-sm font-medium leading-4\">\n {user.name}\n </p>\n </div>\n <ChevronDown\n size={16}\n className={cn(\n \"ml-auto hidden flex-shrink-0 transition-transform min-[1000px]:block\",\n isUserMenuOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {isUserMenuOpen && (\n <div className=\"absolute right-0 top-[calc(100%+0.5rem)] w-[260px] rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] p-2 text-[var(--dashboard-text-primary,#2d2d2d)] shadow-xl min-[1000px]:w-full\">\n <button\n type=\"button\"\n onClick={() => {\n setIsUserMenuOpen(false);\n onUserClick?.();\n }}\n className=\"flex w-full items-center gap-3 rounded-lg px-3 py-3 text-left transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8\"\n >\n <div className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <User size={17} />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold\">\n {user.name}\n </p>\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {user.email}\n </p>\n </div>\n </button>\n\n {userEstablishments.length > 0 && (\n <div className=\"mt-1 border-t border-[var(--dashboard-text-secondary,#6b7280)]/15 pt-2\">\n <p className=\"px-3 pb-1 text-[11px] font-semibold uppercase tracking-wide text-[var(--dashboard-text-secondary,#6b7280)]\">\n {establishmentsLabel}\n </p>\n <div className=\"space-y-1\">\n {userEstablishments.map((establishment) => {\n const isDisabled =\n establishment.disabled ||\n !onEstablishmentChange ||\n establishment.active;\n\n return (\n <button\n key={establishment.id}\n type=\"button\"\n onClick={() => {\n if (isDisabled) return;\n setIsUserMenuOpen(false);\n onEstablishmentChange?.(establishment.id);\n }}\n disabled={isDisabled}\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left transition-colors\",\n establishment.active\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"hover:bg-[var(--dashboard-primary,#37a501)]/8\",\n isDisabled\n ? establishment.active\n ? \"cursor-default\"\n : \"cursor-not-allowed opacity-60\"\n : \"cursor-pointer\",\n )}\n >\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <Building2 size={15} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold\">\n {establishment.label}\n </p>\n {establishment.description && (\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {establishment.description}\n </p>\n )}\n </div>\n {establishment.active && (\n <Check size={16} className=\"flex-shrink-0\" />\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {onLogout && (\n <button\n type=\"button\"\n onClick={() => {\n setIsUserMenuOpen(false);\n onLogout();\n }}\n className=\"mt-1 flex w-full items-center gap-3 rounded-lg px-3 py-3 text-sm font-medium transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8\"\n >\n <LogOut size={18} />\n {logoutLabel}\n </button>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={() => setIsMobileMenuOpen((open) => !open)}\n className=\"inline-flex h-10 w-10 items-center justify-center rounded-lg bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)] transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/15 min-[800px]:hidden\"\n aria-label={menuLabel}\n aria-expanded={isMobileMenuOpen}\n >\n {isMobileMenuOpen ? <X size={22} /> : <Menu size={22} />}\n </button>\n </div>\n\n <div\n className={cn(\n \"overflow-hidden border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] shadow-lg transition-[max-height] duration-200 min-[800px]:hidden\",\n isMobileMenuOpen ? \"max-h-[calc(100vh-4rem)]\" : \"max-h-0\",\n )}\n >\n <div className=\"max-h-[calc(100vh-4rem)] overflow-y-auto px-4 py-3\">\n <nav className=\"space-y-1\" aria-label=\"Navegacao principal\">\n {menuItems.map((item) => renderNavItem(item, { mobile: true }))}\n </nav>\n\n {(user || actions || onLogout) && (\n <div className=\"mt-3 space-y-2 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 pt-3\">\n {actions}\n\n {user && (\n <>\n <button\n type=\"button\"\n onClick={() => {\n closeMenus();\n onUserClick?.();\n }}\n className=\"flex w-full items-center gap-3 rounded-lg bg-[var(--dashboard-background,#f2f2f2)] px-4 py-3 text-left transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8\"\n >\n <div className=\"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <User size={17} />\n </div>\n <div className=\"min-w-0\">\n {user.subtitle && (\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {user.subtitle}\n </p>\n )}\n <p className=\"truncate text-sm font-semibold\">{user.name}</p>\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {user.email}\n </p>\n </div>\n </button>\n\n {userEstablishments.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-4 pt-2 text-[11px] font-semibold uppercase tracking-wide text-[var(--dashboard-text-secondary,#6b7280)]\">\n {establishmentsLabel}\n </p>\n {userEstablishments.map((establishment) => {\n const isDisabled =\n establishment.disabled ||\n !onEstablishmentChange ||\n establishment.active;\n\n return (\n <button\n key={establishment.id}\n type=\"button\"\n onClick={() => {\n if (isDisabled) return;\n closeMenus();\n onEstablishmentChange?.(establishment.id);\n }}\n disabled={isDisabled}\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-4 py-3 text-left transition-colors\",\n establishment.active\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"hover:bg-[var(--dashboard-primary,#37a501)]/8\",\n isDisabled\n ? establishment.active\n ? \"cursor-default\"\n : \"cursor-not-allowed opacity-60\"\n : \"cursor-pointer\",\n )}\n >\n <div className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 text-[var(--dashboard-primary,#37a501)]\">\n <Building2 size={15} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold\">\n {establishment.label}\n </p>\n {establishment.description && (\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {establishment.description}\n </p>\n )}\n </div>\n {establishment.active && (\n <Check size={16} className=\"flex-shrink-0\" />\n )}\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n\n {onLogout && (\n <button\n type=\"button\"\n onClick={() => {\n closeMenus();\n onLogout();\n }}\n className=\"flex w-full items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/8\"\n >\n <LogOut size={18} />\n {logoutLabel}\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n </header>\n </>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Moon, Sun, Monitor } from \"lucide-react\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\nexport interface ThemeSwitcherProps {\n /** Current theme mode */\n mode: ThemeMode;\n /** Called when the user selects a different mode */\n onModeChange: (mode: ThemeMode) => void;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst modes: {\n value: ThemeMode;\n icon: React.ComponentType<{ size?: number; className?: string }>;\n label: string;\n}[] = [\n { value: \"light\", icon: Sun, label: \"Claro\" },\n { value: \"dark\", icon: Moon, label: \"Escuro\" },\n { value: \"system\", icon: Monitor, label: \"Sistema\" },\n];\n\nexport function ThemeSwitcher({\n mode,\n onModeChange,\n className,\n}: ThemeSwitcherProps) {\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-1 rounded-lg bg-[var(--dashboard-background,#f2f2f2)] p-1\",\n className,\n )}\n >\n {modes.map(({ value, icon: Icon, label }) => (\n <button\n key={value}\n type=\"button\"\n onClick={() => onModeChange(value)}\n className={cn(\n \"flex cursor-pointer items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n mode === value\n ? \"bg-[var(--dashboard-surface,#ffffff)] text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)] hover:text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n title={label}\n >\n <Icon size={14} />\n <span>{label}</span>\n </button>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nexport type KPIValueFormat = \"currency\" | \"number\" | \"percentage\" | \"rating\";\n\nexport interface KPICardProps {\n title: string;\n value: number;\n variation: number;\n trend: \"up\" | \"down\" | \"stable\";\n format?: KPIValueFormat;\n benchmark?: string;\n icon?: React.ReactNode;\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction formatValue(value: number, format: KPIValueFormat): string {\n switch (format) {\n case \"currency\":\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\",\n }).format(value);\n case \"percentage\":\n return `${value.toFixed(1)}%`;\n case \"rating\":\n return `${value.toFixed(1)}/5.0`;\n default:\n return new Intl.NumberFormat(\"pt-BR\").format(value);\n }\n}\n\nconst trendConfigs = {\n up: {\n icon: \"\\u2191\",\n color:\n \"text-[var(--dashboard-status-success,#059669)] bg-[var(--dashboard-status-success,#059669)]/8\",\n },\n down: {\n icon: \"\\u2193\",\n color:\n \"text-[var(--dashboard-status-danger,#DC2626)] bg-[var(--dashboard-status-danger,#DC2626)]/8\",\n },\n stable: {\n icon: \"\\u2192\",\n color:\n \"text-[var(--dashboard-text-secondary,#64748B)] bg-[var(--dashboard-text-secondary,#64748B)]/8\",\n },\n};\n\nexport function KPICard({\n title,\n value,\n variation,\n trend,\n format = \"number\",\n benchmark,\n icon,\n isLoading,\n className,\n}: KPICardProps) {\n if (isLoading) return <KPICardSkeleton className={className} />;\n\n const trendConfig = trendConfigs[trend];\n\n return (\n <div\n className={cn(\n \"dashboard-kpi-card h-full w-full min-w-0 bg-[var(--dashboard-surface,#ffffff)] rounded-xl p-4 md:p-5 border border-[var(--dashboard-text-secondary,#64748B)]/12 transition-all duration-200 ease-out dashboard-shadow-sm hover:dashboard-shadow-md flex flex-col\",\n className,\n )}\n >\n <style>{`\n .dashboard-kpi-card {\n container-type: inline-size;\n }\n\n @container (max-width: 13.5rem) {\n .dashboard-kpi-card__content {\n gap: 0.45rem;\n }\n\n .dashboard-kpi-card__value {\n font-size: 1.55rem;\n line-height: 1;\n }\n\n .dashboard-kpi-card__trend {\n padding-inline: 0.5rem;\n gap: 0.2rem;\n }\n\n .dashboard-kpi-card__trend-value {\n font-size: 0.75rem;\n line-height: 1rem;\n }\n }\n\n @container (max-width: 11.5rem) {\n .dashboard-kpi-card__value {\n font-size: 1.4rem;\n }\n\n .dashboard-kpi-card__trend {\n padding-inline: 0.4rem;\n padding-block: 0.2rem;\n }\n\n .dashboard-kpi-card__trend-value {\n font-size: 0.7rem;\n }\n }\n\n @container (max-width: 9.75rem) {\n .dashboard-kpi-card__content {\n gap: 0.35rem;\n }\n\n .dashboard-kpi-card__value {\n font-size: 1.25rem;\n }\n\n .dashboard-kpi-card__trend {\n padding-inline: 0.32rem;\n }\n\n .dashboard-kpi-card__trend-icon {\n font-size: 0.9rem;\n }\n\n .dashboard-kpi-card__trend-value {\n font-size: 0.625rem;\n line-height: 0.875rem;\n }\n }\n `}</style>\n <div className=\"flex justify-between items-start mb-4 gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {icon && (\n <span\n className=\"shrink-0 text-[var(--dashboard-text-secondary,#64748B)]\"\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n <h3 className=\"min-w-0 truncate text-xs font-semibold uppercase tracking-wider text-[var(--dashboard-text-secondary,#64748B)]\">\n {title}\n </h3>\n </div>\n {benchmark && (\n <span\n className=\"text-xs text-[var(--dashboard-text-secondary,#64748B)]/50 ml-2 whitespace-nowrap flex-shrink-0\"\n title=\"Benchmark de referência\"\n >\n {benchmark}\n </span>\n )}\n </div>\n\n <div className=\"dashboard-kpi-card__content flex min-w-0 items-end gap-3 flex-1\">\n <p className=\"dashboard-kpi-card__value min-w-0 text-3xl font-bold text-[var(--dashboard-text-primary,#0F172A)] whitespace-nowrap tracking-tight\">\n {formatValue(value, format)}\n </p>\n <div\n className={cn(\n \"dashboard-kpi-card__trend inline-flex items-center gap-1 px-2 py-1 rounded-full flex-shrink-0 mb-1\",\n trendConfig.color,\n )}\n >\n <span className=\"dashboard-kpi-card__trend-icon text-sm leading-none\">{trendConfig.icon}</span>\n <span className=\"dashboard-kpi-card__trend-value text-xs font-semibold whitespace-nowrap\">\n {Math.abs(variation).toFixed(1)}%\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nfunction KPICardSkeleton({ className }: { className?: string }) {\n return (\n <div\n className={cn(\n \"h-full bg-[var(--dashboard-surface,#ffffff)] rounded-xl p-4 md:p-5 border border-[var(--dashboard-text-secondary,#64748B)]/12 dashboard-shadow-sm animate-pulse flex flex-col\",\n className,\n )}\n >\n <div className=\"h-3 bg-[var(--dashboard-text-secondary,#64748B)]/10 rounded w-2/3 mb-4\" />\n <div className=\"flex items-end gap-3 flex-1\">\n <div className=\"h-8 bg-[var(--dashboard-text-secondary,#64748B)]/10 rounded w-1/2\" />\n <div className=\"h-5 bg-[var(--dashboard-text-secondary,#64748B)]/10 rounded-full w-1/4\" />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface PageLayoutProps {\n /** Texto curto acima do titulo principal */\n eyebrow?: string;\n /** Titulo principal da pagina */\n title: string;\n /** Descricao opcional da pagina (aparece abaixo do titulo) */\n description?: string;\n /** Componentes de filtros ou acoes para o header (ex: PeriodFilter, botoes) */\n headerActions?: ReactNode;\n /** Header principal da aplicacao, usado em layouts com navegacao superior */\n appHeader?: ReactNode;\n /** Conteudo principal da pagina */\n children: ReactNode;\n /** Se true, aplica padding no conteudo. Default: true */\n contentPadding?: boolean;\n /** Classes extras aplicadas no wrapper do conteudo */\n contentClassName?: string;\n /** Faz o conteudo ocupar a altura util da viewport, com scroll interno no filho */\n contentFillViewport?: boolean;\n /** Componente de sidebar a ser renderizado */\n sidebar?: ReactNode;\n /** Se a sidebar esta recolhida */\n sidebarCollapsed?: boolean;\n /** Largura da sidebar expandida em px. Default: 280 */\n sidebarWidth?: number;\n /** Largura da sidebar recolhida em px. Default: 109 */\n sidebarCollapsedWidth?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function PageLayout({\n eyebrow,\n title,\n description,\n headerActions,\n appHeader,\n children,\n contentPadding = true,\n contentClassName,\n contentFillViewport = false,\n sidebar,\n sidebarCollapsed = false,\n sidebarWidth = 280,\n sidebarCollapsedWidth = 109,\n className,\n}: PageLayoutProps) {\n const marginLeft = sidebar\n ? sidebarCollapsed\n ? `max(0px, ${sidebarCollapsedWidth}px)`\n : `max(0px, ${sidebarWidth}px)`\n : \"0px\";\n const mainTopPadding = appHeader\n ? \"pt-24\"\n : sidebar\n ? \"pt-16 xl:pt-0\"\n : \"pt-0\";\n const layoutContainer = \"mx-[var(--dashboard-page-gutter)]\";\n\n return (\n <div\n className={cn(\n \"min-h-screen bg-[var(--dashboard-background,#f2f2f2)] [--dashboard-page-gutter:1.5rem] sm:[--dashboard-page-gutter:2rem] lg:[--dashboard-page-gutter:2.5rem] xl:[--dashboard-page-gutter:3rem]\",\n className,\n )}\n >\n {appHeader}\n {sidebar}\n <main\n className={cn(\n mainTopPadding,\n \"box-border flex flex-col\",\n contentFillViewport ? \"h-dvh overflow-hidden\" : \"min-h-dvh\",\n )}\n style={{\n marginLeft,\n transition: \"margin-left 400ms cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n <style>{`\n @media (max-width: 1279px) {\n main {\n margin-left: 0 !important;\n }\n }\n `}</style>\n\n {/* Header com titulo e acoes */}\n <div\n className={cn(\n layoutContainer,\n \"mt-4 box-border px-6 py-5 sm:px-8 lg:px-10\",\n )}\n >\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"min-w-0\">\n {eyebrow && (\n <p className=\"mb-1 text-xs font-semibold uppercase tracking-[0.16em] text-[var(--dashboard-text-secondary,#6b7280)]\">\n {eyebrow}\n </p>\n )}\n <h1 className=\"text-2xl font-semibold leading-tight tracking-tight text-[var(--dashboard-text-primary,#2d2d2d)] sm:text-3xl\">\n {title}\n </h1>\n {description && (\n <p className=\"mt-2 text-sm font-medium text-[var(--dashboard-text-secondary,#6b7280)]\">\n {description}\n </p>\n )}\n </div>\n\n {headerActions && (\n <div className=\"flex max-w-full justify-start lg:justify-end\">\n {headerActions}\n </div>\n )}\n </div>\n </div>\n\n {/* Conteudo principal */}\n <div\n className={\n contentPadding\n ? cn(layoutContainer, \"min-h-0 flex-1 pb-6 pt-5\", contentClassName)\n : cn(\"min-h-0 flex-1\", contentClassName)\n }\n >\n {children}\n </div>\n </main>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Line } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler,\n);\n\nexport interface ComparisonLineChartProps {\n /** Labels do eixo X (ex: datas) */\n labels: string[];\n /** Dados do periodo atual */\n currentPeriodData: number[];\n /** Dados do periodo anterior */\n previousPeriodData: number[];\n /** Label da legenda do periodo atual */\n currentPeriodLabel?: string;\n /** Label da legenda do periodo anterior */\n previousPeriodLabel?: string;\n /** Titulo do grafico */\n title?: string;\n /** Cor principal (default: --dashboard-primary) */\n color?: string;\n /** Altura do container do grafico em px. Default: 300 */\n height?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ComparisonLineChart({\n labels,\n currentPeriodData,\n previousPeriodData,\n currentPeriodLabel = \"Período atual\",\n previousPeriodLabel = \"Período anterior\",\n title,\n color,\n height = 300,\n className,\n}: ComparisonLineChartProps) {\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const data = {\n labels,\n datasets: [\n {\n label: currentPeriodLabel,\n data: currentPeriodData,\n borderColor: primaryColor,\n backgroundColor: `${primaryColor}1a`,\n borderWidth: 2,\n tension: 0.4,\n fill: true,\n pointRadius: 0,\n pointHoverRadius: 6,\n pointHoverBackgroundColor: primaryColor,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 2,\n },\n {\n label: previousPeriodLabel,\n data: previousPeriodData,\n borderColor: `${primaryColor}66`,\n backgroundColor: `${primaryColor}0d`,\n borderWidth: 2,\n tension: 0.4,\n fill: true,\n pointRadius: 0,\n pointHoverRadius: 6,\n pointHoverBackgroundColor: `${primaryColor}66`,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 2,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n display: true,\n position: \"bottom\" as const,\n labels: {\n usePointStyle: true,\n boxWidth: 6,\n boxHeight: 6,\n padding: 15,\n font: { size: 11 },\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n },\n },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n displayColors: true,\n usePointStyle: true,\n boxWidth: 6,\n boxHeight: 6,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n },\n },\n y: {\n beginAtZero: true,\n grid: { color: \"rgba(0, 0, 0, 0.05)\", drawBorder: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n precision: 0,\n },\n },\n },\n interaction: {\n intersect: false,\n mode: \"index\" as const,\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6\",\n className,\n )}\n >\n {title && (\n <h3 className=\"text-base font-semibold mb-4 text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n )}\n <div style={{ height }}>\n <Line data={data} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n);\n\nexport interface HorizontalBarChartTab {\n id: string;\n label: string;\n}\n\nexport interface HorizontalBarChartProps {\n /** Labels do eixo Y (ex: horarios) */\n labels: string[];\n /** Dados por tab. Chave = tab.id, valor = array de numeros */\n datasets: Record<string, number[]>;\n /** Tabs para alternar entre datasets */\n tabs?: HorizontalBarChartTab[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Cor das barras (default: --dashboard-primary) */\n color?: string;\n /** Label para tooltip (ex: \"vendas\", \"pedidos\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\", \"pedido\") */\n valueLabelSingular?: string;\n /** Texto para melhor item (ex: \"Melhor horário\") */\n bestItemLabel?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function HorizontalBarChart({\n labels,\n datasets,\n tabs,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n bestItemLabel = \"Melhor item\",\n className,\n}: HorizontalBarChartProps) {\n const tabKeys = tabs ? tabs.map((t) => t.id) : Object.keys(datasets);\n const [activeTab, setActiveTab] = useState(tabKeys[0]);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 640);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\n }, []);\n\n const activeData = datasets[activeTab] || [];\n const maxValue = Math.max(...activeData);\n const bestIndex = activeData.indexOf(maxValue);\n const bestLabel = labels[bestIndex];\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const minBarValue = maxValue > 0 ? maxValue * 0.02 : 0.05;\n const displayData = activeData.map((v) => (v === 0 ? minBarValue : v));\n\n const chartData = {\n labels,\n datasets: [\n {\n label: valueLabel,\n data: displayData,\n backgroundColor: primaryColor,\n borderRadius: isMobile ? 8 : 4,\n barThickness: isMobile ? 36 : 24,\n },\n ],\n };\n\n const options = {\n indexAxis: \"y\" as const,\n responsive: true,\n maintainAspectRatio: false,\n layout: {\n padding: {\n right: isMobile ? 35 : 30,\n left: isMobile ? 10 : 0,\n top: isMobile ? 15 : 0,\n bottom: isMobile ? 15 : 0,\n },\n },\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: isMobile ? 6 : 12,\n displayColors: false,\n titleFont: { size: isMobile ? 10 : 12, weight: \"bold\" as const },\n bodyFont: { size: isMobile ? 9 : 11 },\n callbacks: {\n label: (context: { dataIndex: number }) => {\n const realValue = activeData[context.dataIndex];\n return realValue === 1\n ? `${realValue} ${singular}`\n : `${realValue} ${valueLabel}`;\n },\n },\n },\n },\n scales: {\n x: {\n beginAtZero: true,\n border: { display: false },\n grid: { display: false },\n ticks: { display: false },\n },\n y: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: isMobile ? 16 : 13 },\n padding: isMobile ? 12 : 4,\n },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-5 sm:p-6 min-h-[850px] sm:h-full flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n {tabs && tabs.length > 1 && (\n <div className=\"flex gap-2 mb-4 flex-wrap\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n \"px-3.5 py-2 sm:px-4 sm:py-2 rounded-full text-sm font-medium transition-colors whitespace-nowrap cursor-pointer\",\n activeTab === tab.id\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n )}\n\n {maxValue > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm sm:text-base text-[var(--dashboard-text-secondary,#6b7280)] mb-1\">\n {bestItemLabel}\n </p>\n <p className=\"text-xl sm:text-2xl font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {bestLabel}{\" \"}\n <span className=\"text-base font-normal text-[var(--dashboard-text-secondary,#6b7280)]\">\n {maxValue} {maxValue === 1 ? singular : valueLabel}\n </span>\n </p>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0\">\n <Bar key={`chart-${isMobile ? \"m\" : \"d\"}`} data={chartData} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n);\n\nexport interface VerticalBarChartProps {\n /** Labels do eixo X (ex: dias da semana) */\n labels: string[];\n /** Valores para cada label */\n data: number[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Cor das barras (default: --dashboard-primary) */\n color?: string;\n /** Label do tooltip (ex: \"vendas\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\") */\n valueLabelSingular?: string;\n /** Texto para melhor item (ex: \"Melhor dia\") */\n bestItemLabel?: string;\n /** Maximo de caracteres dos labels. Default: 3 */\n labelMaxChars?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function VerticalBarChart({\n labels,\n data: values,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n bestItemLabel = \"Melhor item\",\n labelMaxChars = 3,\n className,\n}: VerticalBarChartProps) {\n const maxValue = Math.max(...values);\n const bestIndex = values.indexOf(maxValue);\n const bestLabel = labels[bestIndex];\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const chartData = {\n labels,\n datasets: [\n {\n label: valueLabel,\n data: values,\n backgroundColor: primaryColor,\n borderRadius: { topLeft: 4, topRight: 4 },\n barThickness: 40,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n displayColors: false,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n callbacks: {\n label: (context: { parsed: { y: number | null } }) => {\n const v = context.parsed.y ?? 0;\n return v === 1 ? `${v} ${singular}` : `${v} ${valueLabel}`;\n },\n },\n },\n },\n scales: {\n x: {\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: 11 },\n callback: (_value: number | string, index: number): string => {\n return labels[index]\n ? labels[index].substring(0, labelMaxChars)\n : String(_value);\n },\n },\n },\n y: {\n beginAtZero: true,\n border: { display: false },\n grid: { display: false },\n ticks: { display: false },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6 flex-1 flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n {bestLabel && maxValue > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mb-1\">\n {bestItemLabel}\n </p>\n <p className=\"text-lg font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {bestLabel}{\" \"}\n <span className=\"text-sm font-normal text-[var(--dashboard-text-secondary,#6b7280)]\">\n {maxValue} {maxValue === 1 ? singular : valueLabel}\n </span>\n </p>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0 relative\">\n <Bar data={chartData} options={options} />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Doughnut } from \"react-chartjs-2\";\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from \"chart.js\";\n\nChartJS.register(ArcElement, Tooltip, Legend);\n\nexport interface DoughnutChartItem {\n label: string;\n value: number;\n color?: string;\n}\n\nexport interface DoughnutChartProps {\n /** Dados do gráfico */\n items: DoughnutChartItem[];\n /** Titulo do grafico */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: React.ReactNode;\n /** Texto central (ex: total) */\n centerLabel?: string;\n /** Valor central */\n centerValue?: string;\n /** Mostrar legenda lateral? Default: true */\n showLegend?: boolean;\n /** Formato dos valores na legenda */\n formatValue?: (value: number) => string;\n /** Espessura do anel (cutout %). Default: 65 */\n cutout?: number;\n /** Altura do grafico em px. Default: 240 */\n height?: number;\n className?: string;\n}\n\nconst DEFAULT_COLORS = [\n \"#2563EB\",\n \"#059669\",\n \"#D97706\",\n \"#DC2626\",\n \"#7C3AED\",\n \"#0891B2\",\n \"#DB2777\",\n \"#65A30D\",\n \"#EA580C\",\n \"#4F46E5\",\n];\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function DoughnutChart({\n items,\n title,\n titleIcon,\n centerLabel,\n centerValue,\n showLegend = true,\n formatValue,\n cutout = 65,\n height = 240,\n className,\n}: DoughnutChartProps) {\n const total = items.reduce((sum, item) => sum + item.value, 0);\n const format = formatValue || ((v: number) => String(v));\n\n const colors = items.map(\n (item, i) => item.color || DEFAULT_COLORS[i % DEFAULT_COLORS.length],\n );\n\n const chartData = {\n labels: items.map((i) => i.label),\n datasets: [\n {\n data: items.map((i) => i.value),\n backgroundColor: colors,\n borderColor: \"var(--dashboard-surface, #ffffff)\",\n borderWidth: 2,\n hoverOffset: 4,\n },\n ],\n };\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n cutout: `${cutout}%`,\n plugins: {\n legend: { display: false },\n tooltip: {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n padding: 12,\n displayColors: true,\n titleFont: { size: 12, weight: \"bold\" as const },\n bodyFont: { size: 11 },\n callbacks: {\n label: (context: { label: string; parsed: number }) => {\n const pct =\n total > 0 ? ((context.parsed / total) * 100).toFixed(1) : \"0\";\n return ` ${context.label}: ${format(context.parsed)} (${pct}%)`;\n },\n },\n },\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n <div\n className={cn(\n \"flex items-center\",\n showLegend ? \"gap-6\" : \"justify-center\",\n )}\n >\n {/* Chart */}\n <div className=\"relative flex-shrink-0\" style={{ width: height, height }}>\n <Doughnut data={chartData} options={options} />\n {(centerLabel || centerValue) && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center pointer-events-none\">\n {centerValue && (\n <span className=\"text-2xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {centerValue}\n </span>\n )}\n {centerLabel && (\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {centerLabel}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Legend */}\n {showLegend && items.length > 0 && (\n <div className=\"flex-1 min-w-0 space-y-2\">\n {items.map((item, i) => {\n const pct =\n total > 0 ? ((item.value / total) * 100).toFixed(1) : \"0\";\n return (\n <div key={item.label} className=\"flex items-center gap-2\">\n <span\n className=\"w-3 h-3 rounded-full flex-shrink-0\"\n style={{ backgroundColor: colors[i] }}\n />\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] truncate flex-1\">\n {item.label}\n </span>\n <span className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] whitespace-nowrap\">\n {format(item.value)}\n </span>\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap\">\n {pct}%\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface ProgressBarListItem {\n /** Label do item */\n label: string;\n /** Valor numerico */\n value: number;\n /** Icone opcional */\n icon?: ReactNode;\n}\n\nexport interface ProgressBarListProps {\n /** Itens da lista */\n items: ProgressBarListItem[];\n /** Titulo da lista */\n title?: string;\n /** Icone ao lado do titulo */\n titleIcon?: ReactNode;\n /** Cor da barra de progresso (default: --dashboard-primary) */\n color?: string;\n /** Label do valor (ex: \"vendas\") */\n valueLabel?: string;\n /** Label no singular (ex: \"venda\") */\n valueLabelSingular?: string;\n /** Ordenar automaticamente por valor desc. Default: true */\n sortByValue?: boolean;\n /** Formatar valor customizado */\n formatValue?: (value: number) => string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ProgressBarList({\n items,\n title,\n titleIcon,\n color,\n valueLabel = \"itens\",\n valueLabelSingular,\n sortByValue = true,\n formatValue,\n className,\n}: ProgressBarListProps) {\n const sortedItems = sortByValue\n ? [...items].sort((a, b) => b.value - a.value)\n : items;\n const maxValue = Math.max(...items.map((i) => i.value));\n const singular = valueLabelSingular || valueLabel.replace(/s$/, \"\");\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const defaultFormat = (v: number) =>\n `${v} ${v === 1 ? singular : valueLabel}`;\n\n const fmt = formatValue || defaultFormat;\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20 p-6 flex-1 flex flex-col\",\n className,\n )}\n >\n {title && (\n <div className=\"flex items-center gap-2 mb-4\">\n {titleIcon}\n <h3 className=\"text-base font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n </div>\n )}\n\n <div className=\"space-y-6 flex-1 flex flex-col justify-center\">\n {sortedItems.map((item, index) => (\n <div key={index} className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-4 min-w-[180px]\">\n {item.icon && (\n <div\n className=\"w-10 h-10 rounded-lg flex items-center justify-center flex-shrink-0\"\n style={{ backgroundColor: primaryColor }}\n >\n <div className=\"w-6 h-6 text-white\">{item.icon}</div>\n </div>\n )}\n <span className=\"text-base font-medium text-[var(--dashboard-text-secondary,#6b7280)]\">\n {item.label}\n </span>\n </div>\n <div className=\"flex items-center gap-4 flex-1\">\n <div className=\"flex-1 bg-[var(--dashboard-text-secondary,#6b7280)]/10 rounded-full h-3 overflow-hidden\">\n <div\n className=\"h-full transition-all duration-500 rounded-full\"\n style={{\n width:\n maxValue > 0\n ? `${(item.value / maxValue) * 100}%`\n : \"0%\",\n backgroundColor: primaryColor,\n }}\n />\n </div>\n <span\n className=\"text-base font-bold min-w-[90px] text-right\"\n style={{ color: primaryColor }}\n >\n {fmt(item.value)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { Line } from \"react-chartjs-2\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip as ChartTooltip,\n Legend,\n Filler,\n ChartData,\n ChartOptions,\n TooltipModel,\n} from \"chart.js\";\nimport { KPICard, KPIValueFormat } from \"../KPICard\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n ChartTooltip,\n Legend,\n Filler,\n);\n\nexport interface MetricPanelMetric {\n /** Chave unica da metrica */\n key: string;\n /** Label exibida na tab e KPI */\n label: string;\n /** Icone da tab */\n icon: React.ComponentType<{ className?: string }>;\n /** Label da legenda do periodo atual */\n currentLabel: string;\n /** Label da legenda do periodo anterior */\n previousLabel: string;\n /** Formato do valor */\n format: KPIValueFormat;\n /** Unidade opcional (ex: \"pedidos\") */\n unit?: string;\n /** Valores do KPI */\n kpiValue: {\n current: number;\n previous: number;\n variation: number;\n trend: \"up\" | \"down\" | \"stable\";\n };\n}\n\nexport interface MetricPanelChartData {\n labels: string[];\n metrics: Record<\n string,\n { currentPeriod: number[]; previousPeriod: number[] }\n >;\n}\n\nexport interface MetricPanelTooltipConfig {\n enabled: boolean;\n showButton?: boolean;\n buttonLabel?: string;\n onButtonClick?: (dataIndex: number, date: string) => void;\n customContent?: (params: {\n value: number;\n previousValue: number;\n variation: number;\n date: string;\n dayName: string;\n previousDate: string;\n formattedValue: string;\n formattedPrevious: string;\n metricUnit: string;\n }) => string;\n}\n\nexport interface MetricPanelProps {\n /** Titulo do painel */\n title: string;\n /** Icone do titulo */\n titleIcon: React.ComponentType<{ className?: string }>;\n /** Configuracoes das metricas */\n metrics: MetricPanelMetric[];\n /** Dados do grafico */\n chartData: MetricPanelChartData;\n /** Cor principal */\n color?: string;\n /** Cor secundaria (periodo anterior) */\n secondaryColor?: string;\n /** Callback do botao de acao */\n onActionClick?: () => void;\n /** Label do botao de acao */\n actionLabel?: string;\n /** Configuracao do tooltip interativo do grafico */\n tooltipConfig?: MetricPanelTooltipConfig;\n /** Estado de loading */\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction formatMetricValue(value: number, format: KPIValueFormat) {\n switch (format) {\n case \"currency\":\n return new Intl.NumberFormat(\"pt-BR\", {\n style: \"currency\",\n currency: \"BRL\",\n }).format(value);\n case \"percentage\":\n return `${value.toFixed(2)}%`;\n case \"rating\":\n return value.toFixed(2);\n case \"number\":\n default:\n return new Intl.NumberFormat(\"pt-BR\").format(Math.round(value));\n }\n}\n\nfunction calculateVariation(current: number, previous: number) {\n if (previous === 0) return 0;\n return ((current - previous) / previous) * 100;\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction getTooltipDateInfo(label: string) {\n const dayNames = [\n \"Domingo\",\n \"Segunda\",\n \"Terca\",\n \"Quarta\",\n \"Quinta\",\n \"Sexta\",\n \"Sabado\",\n ];\n const [day, month] = label.split(\"/\").map(Number);\n\n if (!day || !month) {\n return {\n dayName: \"\",\n previousDate: \"\",\n };\n }\n\n const date = new Date(new Date().getFullYear(), month - 1, day);\n const previousDate = new Date(date);\n previousDate.setDate(previousDate.getDate() - 7);\n\n return {\n dayName: dayNames[date.getDay()],\n previousDate: `${String(previousDate.getDate()).padStart(2, \"0\")}/${String(\n previousDate.getMonth() + 1,\n ).padStart(2, \"0\")}`,\n };\n}\n\nexport function MetricPanel({\n title,\n titleIcon: TitleIcon,\n metrics,\n chartData,\n color,\n secondaryColor,\n onActionClick,\n actionLabel,\n tooltipConfig,\n isLoading = false,\n className,\n}: MetricPanelProps) {\n const [selectedMetricKey, setSelectedMetricKey] = useState(metrics[0]?.key);\n const [isMobile, setIsMobile] = useState(false);\n const hideTooltipTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const isTooltipHoveredRef = useRef(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 768);\n check();\n window.addEventListener(\"resize\", check);\n return () => {\n window.removeEventListener(\"resize\", check);\n if (hideTooltipTimeoutRef.current) {\n clearTimeout(hideTooltipTimeoutRef.current);\n }\n };\n }, []);\n\n const currentMetric =\n metrics.find((m) => m.key === selectedMetricKey) || metrics[0];\n\n const primaryColor =\n color ||\n (typeof document !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n .getPropertyValue(\"--dashboard-primary\")\n .trim()\n : \"\") ||\n \"#37a501\";\n\n const secColor = secondaryColor || `${primaryColor}66`;\n\n const renderExternalTooltip = (context: {\n chart: ChartJS;\n tooltip: TooltipModel<\"line\">;\n }) => {\n const { chart, tooltip } = context;\n const parent = chart.canvas.parentElement;\n if (!parent) return;\n\n let tooltipEl = parent.querySelector<HTMLDivElement>(\n \":scope > .metric-panel-chart-tooltip\",\n );\n\n if (!tooltipEl) {\n tooltipEl = document.createElement(\"div\");\n tooltipEl.className = \"metric-panel-chart-tooltip\";\n tooltipEl.style.position = \"absolute\";\n tooltipEl.style.pointerEvents = \"auto\";\n tooltipEl.style.transition = \"opacity 0.2s ease\";\n tooltipEl.style.zIndex = \"100\";\n tooltipEl.style.opacity = \"0\";\n const createdTooltipEl = tooltipEl;\n createdTooltipEl.addEventListener(\"mouseenter\", () => {\n isTooltipHoveredRef.current = true;\n if (hideTooltipTimeoutRef.current) {\n clearTimeout(hideTooltipTimeoutRef.current);\n hideTooltipTimeoutRef.current = null;\n }\n });\n createdTooltipEl.addEventListener(\"mouseleave\", () => {\n isTooltipHoveredRef.current = false;\n createdTooltipEl.style.opacity = \"0\";\n });\n parent.appendChild(createdTooltipEl);\n }\n\n if (hideTooltipTimeoutRef.current) {\n clearTimeout(hideTooltipTimeoutRef.current);\n hideTooltipTimeoutRef.current = null;\n }\n\n if (tooltip.opacity === 0) {\n hideTooltipTimeoutRef.current = setTimeout(() => {\n if (!isTooltipHoveredRef.current && tooltipEl) {\n tooltipEl.style.opacity = \"0\";\n }\n }, 300);\n return;\n }\n\n const dataPoint = tooltip.dataPoints?.find(\n (point) => point.datasetIndex === 0,\n );\n\n if (!dataPoint) {\n tooltipEl.style.opacity = \"0\";\n return;\n }\n\n const dataIndex = dataPoint.dataIndex;\n const label = dataPoint.label;\n const currentValue =\n typeof dataPoint.parsed.y === \"number\" ? dataPoint.parsed.y : 0;\n const previousValue =\n chartData.metrics[currentMetric.key]?.previousPeriod[dataIndex] || 0;\n const variation = calculateVariation(currentValue, previousValue);\n const formattedValue = formatMetricValue(\n currentValue,\n currentMetric.format,\n );\n const formattedPrevious = formatMetricValue(\n previousValue,\n currentMetric.format,\n );\n const { dayName, previousDate } = getTooltipDateInfo(label);\n const metricUnit = currentMetric.unit || \"\";\n const isButtonDisabled = currentValue === 0;\n const safeLabel = escapeHtml(label);\n const safeDayName = escapeHtml(dayName);\n const safePreviousDate = escapeHtml(previousDate);\n const safeMetricUnit = escapeHtml(metricUnit);\n const variationSign = variation > 0 ? \"+\" : \"\";\n const variationIcon = variation >= 0 ? \"▲\" : \"▼\";\n const variationColor =\n variation >= 0\n ? \"var(--dashboard-status-success,#10B981)\"\n : \"var(--dashboard-status-danger,#EF4444)\";\n\n if (tooltipConfig?.customContent) {\n tooltipEl.innerHTML = tooltipConfig.customContent({\n value: currentValue,\n previousValue,\n variation,\n date: label,\n dayName,\n previousDate,\n formattedValue,\n formattedPrevious,\n metricUnit,\n });\n } else {\n tooltipEl.innerHTML = `\n <div style=\"\n background: var(--dashboard-surface,#ffffff);\n border-radius: 8px;\n box-shadow: 0 8px 20px rgba(15, 23, 42, 0.14);\n border: 1px solid rgba(93, 114, 128, 0.2);\n color: var(--dashboard-text-primary,#2d2d2d);\n padding: 12px;\n min-width: 220px;\n max-width: 250px;\n font-family: inherit;\n \">\n <div style=\"\n font-size: 11px;\n font-weight: 500;\n color: var(--dashboard-text-secondary,#6b7280);\n margin-bottom: 8px;\n \">\n ${safeDayName ? `${safeDayName} ` : \"\"}${safeLabel}\n </div>\n <div style=\"\n display: flex;\n align-items: baseline;\n gap: 6px;\n margin-bottom: 10px;\n \">\n <div style=\"\n font-size: 22px;\n font-weight: 700;\n color: ${primaryColor};\n line-height: 1;\n \">\n ${escapeHtml(formattedValue)}${safeMetricUnit ? ` ${safeMetricUnit}` : \"\"}\n </div>\n <div style=\"\n display: flex;\n align-items: center;\n gap: 3px;\n color: ${variationColor};\n font-size: 13px;\n font-weight: 600;\n \">\n <span style=\"font-size: 10px;\">${variationIcon}</span>\n <span>${variationSign}${Math.abs(variation).toFixed(2)}%</span>\n </div>\n </div>\n <div style=\"\n font-size: 11px;\n color: var(--dashboard-text-secondary,#6b7280);\n line-height: 1.35;\n margin-bottom: ${tooltipConfig?.showButton ? \"10px\" : \"0\"};\n padding-bottom: ${tooltipConfig?.showButton ? \"10px\" : \"0\"};\n border-bottom: ${tooltipConfig?.showButton ? \"1px solid rgba(93, 114, 128, 0.2)\" : \"none\"};\n \">\n em relacao aos <strong style=\"color: var(--dashboard-text-primary,#2d2d2d);\">${escapeHtml(\n formattedPrevious,\n )}${safeMetricUnit ? ` ${safeMetricUnit}` : \"\"}</strong>${\n safePreviousDate\n ? ` do dia <strong style=\"color: var(--dashboard-text-primary,#2d2d2d);\">${safePreviousDate}</strong>`\n : \"\"\n }\n </div>\n ${\n tooltipConfig?.showButton && tooltipConfig.buttonLabel\n ? `\n <button type=\"button\" data-tooltip-action ${isButtonDisabled ? \"disabled\" : \"\"} style=\"\n width: 100%;\n padding: 8px 12px;\n background: ${isButtonDisabled ? \"rgba(93, 114, 128, 0.08)\" : \"var(--dashboard-surface,#ffffff)\"};\n color: ${isButtonDisabled ? \"var(--dashboard-text-secondary,#6b7280)\" : primaryColor};\n border: 2px solid ${isButtonDisabled ? \"rgba(93, 114, 128, 0.2)\" : primaryColor};\n border-radius: 6px;\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n cursor: ${isButtonDisabled ? \"not-allowed\" : \"pointer\"};\n opacity: ${isButtonDisabled ? \"0.65\" : \"1\"};\n \">\n ${escapeHtml(tooltipConfig.buttonLabel)}\n </button>\n `\n : \"\"\n }\n </div>\n `;\n }\n\n const actionButton = tooltipEl.querySelector<HTMLButtonElement>(\n \"[data-tooltip-action]\",\n );\n if (actionButton && !isButtonDisabled) {\n actionButton.onclick = () =>\n tooltipConfig?.onButtonClick?.(dataIndex, label);\n actionButton.onmouseenter = () => {\n actionButton.style.background = primaryColor;\n actionButton.style.color = \"#ffffff\";\n };\n actionButton.onmouseleave = () => {\n actionButton.style.background = \"var(--dashboard-surface,#ffffff)\";\n actionButton.style.color = primaryColor;\n };\n }\n\n const tooltipWidth = 250;\n const tooltipHeight = tooltipConfig?.showButton ? 180 : 140;\n const offsetX = 15;\n const centerY = Math.max(0, (chart.height - tooltipHeight) / 2);\n const isNearRightEdge =\n tooltip.caretX > chart.width - tooltipWidth - offsetX;\n\n tooltipEl.style.opacity = \"1\";\n tooltipEl.style.top = `${centerY}px`;\n\n if (isNearRightEdge) {\n tooltipEl.style.left = \"auto\";\n tooltipEl.style.right = `${chart.width - tooltip.caretX + offsetX}px`;\n } else {\n tooltipEl.style.left = `${tooltip.caretX + offsetX}px`;\n tooltipEl.style.right = \"auto\";\n }\n };\n\n const data: ChartData<\"line\"> = {\n labels: chartData.labels,\n datasets: [\n {\n label: currentMetric.currentLabel,\n data: chartData.metrics[currentMetric.key]?.currentPeriod || [],\n borderColor: primaryColor,\n borderWidth: isMobile ? 3.5 : 3,\n tension: 0,\n fill: false,\n pointRadius: 0,\n pointHoverRadius: isMobile ? 10 : 8,\n pointHoverBackgroundColor: primaryColor,\n pointHoverBorderColor: \"#fff\",\n pointHoverBorderWidth: 3,\n },\n {\n label: currentMetric.previousLabel,\n data: chartData.metrics[currentMetric.key]?.previousPeriod || [],\n borderColor: secColor,\n borderWidth: isMobile ? 3.5 : 3,\n tension: 0,\n fill: false,\n pointRadius: 0,\n pointHoverRadius: 0,\n },\n ],\n };\n\n const options: ChartOptions<\"line\"> = {\n responsive: true,\n maintainAspectRatio: false,\n layout: {\n padding: {\n left: isMobile ? 10 : 50,\n right: isMobile ? 10 : 50,\n top: isMobile ? 20 : 40,\n bottom: isMobile ? 10 : 20,\n },\n },\n plugins: {\n legend: {\n display: true,\n position: \"bottom\",\n onClick: () => {},\n labels: {\n usePointStyle: true,\n boxWidth: isMobile ? 8 : 6,\n boxHeight: isMobile ? 8 : 6,\n padding: isMobile ? 12 : 15,\n font: {\n size: isMobile ? 13 : 11,\n weight: isMobile ? \"bold\" : \"normal\",\n },\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n },\n },\n tooltip: {\n ...(tooltipConfig\n ? {\n enabled: false,\n position: \"nearest\" as const,\n external: tooltipConfig.enabled\n ? renderExternalTooltip\n : undefined,\n }\n : {\n backgroundColor: \"rgba(45, 45, 45, 0.95)\",\n titleColor: \"#fff\",\n bodyColor: \"#fff\",\n borderColor: primaryColor,\n borderWidth: 1,\n padding: 12,\n }),\n },\n },\n scales: {\n x: {\n border: { display: false },\n grid: { display: false },\n ticks: {\n color: \"var(--dashboard-text-secondary, #6b7280)\",\n font: { size: isMobile ? 12 : 11 },\n },\n },\n y: {\n beginAtZero: true,\n border: { display: false },\n grid: { color: \"rgba(0, 0, 0, 0.05)\" },\n ticks: { display: false, count: 5 },\n },\n },\n interaction: {\n intersect: false,\n mode: \"index\",\n },\n };\n\n return (\n <div\n className={cn(\n \"bg-[var(--dashboard-surface,#ffffff)] rounded-lg shadow-sm border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n style={{ overflow: \"visible\" }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 md:p-6 pb-3 md:pb-4 border-b border-[var(--dashboard-text-secondary,#6b7280)]/10\">\n <h2 className=\"flex items-center gap-2 text-base md:text-lg font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <TitleIcon className=\"w-5 h-5\" />\n {title}\n </h2>\n {onActionClick && actionLabel && (\n <button\n onClick={onActionClick}\n className=\"px-3 md:px-4 py-1.5 md:py-2 text-xs md:text-sm font-medium border rounded-lg transition-colors cursor-pointer\"\n style={{\n color: primaryColor,\n borderColor: primaryColor,\n }}\n >\n {actionLabel}\n </button>\n )}\n </div>\n\n {/* KPI Cards */}\n <div className=\"p-4 md:p-6 pb-3 md:pb-4\">\n <div\n className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 md:gap-4\"\n style={{\n gridTemplateColumns:\n !isMobile && metrics.length <= 4\n ? `repeat(${metrics.length}, minmax(min-content, 1fr))`\n : undefined,\n }}\n >\n {metrics.map((metric) => (\n <KPICard\n key={metric.key}\n title={metric.label}\n value={metric.kpiValue.current}\n variation={metric.kpiValue.variation}\n trend={metric.kpiValue.trend}\n format={metric.format}\n isLoading={isLoading}\n />\n ))}\n </div>\n </div>\n\n {/* Metric Tabs */}\n <div className=\"px-4 md:px-6 pt-3 md:pt-4\">\n <div className=\"flex flex-wrap justify-center gap-2 md:gap-3\">\n {metrics.map((metric) => {\n const Icon = metric.icon;\n return (\n <button\n key={metric.key}\n onClick={() => setSelectedMetricKey(metric.key)}\n className={cn(\n \"flex items-center gap-2 px-4 md:px-6 py-2 rounded-full text-sm font-medium transition-colors cursor-pointer\",\n selectedMetricKey === metric.key\n ? \"bg-[var(--dashboard-surface,#ffffff)] border-2 text-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-surface,#ffffff)] border border-[var(--dashboard-text-secondary,#6b7280)]/30 text-[var(--dashboard-text-secondary,#6b7280)] hover:border-[var(--dashboard-text-secondary,#6b7280)]/50\",\n )}\n style={\n selectedMetricKey === metric.key\n ? { borderColor: primaryColor, color: primaryColor }\n : undefined\n }\n >\n <Icon className=\"w-4 h-4\" />\n {metric.label}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Chart */}\n <div\n className=\"px-4 md:px-6 pb-4 md:pb-6\"\n style={{ overflow: \"visible\", position: \"relative\", zIndex: 10 }}\n >\n <div\n className=\"h-[260px]\"\n style={{ overflow: \"visible\", position: \"relative\", zIndex: 10 }}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <div\n className=\"animate-spin rounded-full h-12 w-12 border-b-2 mx-auto mb-4\"\n style={{ borderColor: primaryColor }}\n />\n <p className=\"text-[var(--dashboard-text-secondary,#6b7280)]\">\n Carregando gráfico...\n </p>\n </div>\n </div>\n ) : (\n <Line data={data} options={options} />\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\n\nexport interface FilterBarProps {\n /** Valor do campo de busca */\n searchValue?: string;\n /** Callback de mudanca do campo de busca */\n onSearchChange?: (value: string) => void;\n /** Placeholder do campo de busca */\n searchPlaceholder?: string;\n /** Slot para dropdowns, date pickers e outros filtros */\n children?: ReactNode;\n /** Slot para acoes extras (ex: botao de exportar) */\n actions?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function FilterBar({\n searchValue,\n onSearchChange,\n searchPlaceholder = \"Buscar...\",\n children,\n actions,\n className,\n}: FilterBarProps) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 sm:flex-row sm:items-center sm:flex-wrap\",\n className,\n )}\n >\n {onSearchChange !== undefined && (\n <div className=\"flex-1 min-w-[200px]\">\n <div className=\"relative flex items-center w-full\">\n <svg\n className=\"absolute left-3 h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n type=\"text\"\n value={searchValue || \"\"}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"flex h-10 w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] pl-10 pr-3 py-2 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] shadow-sm transition-colors duration-200 focus:border-[var(--dashboard-primary,#37a501)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] focus-visible:outline-none\"\n />\n </div>\n </div>\n )}\n\n {children && (\n <div className=\"flex flex-wrap items-center gap-2\">{children}</div>\n )}\n\n {actions && (\n <div className=\"flex items-center gap-2 sm:ml-auto\">{actions}</div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CheckboxProps {\n /** Input name */\n name?: string;\n /** Input id (defaults to name) */\n id?: string;\n /** Label text next to the checkbox */\n label?: string;\n /** Whether checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n /** Disable the checkbox */\n disabled?: boolean;\n /** Size variant */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Primary color override for checked state. Defaults to --dashboard-primary / #ff521d */\n primaryColor?: string;\n /** Additional className on the wrapper label */\n className?: string;\n /** Children rendered as label (takes precedence over label prop) */\n children?: React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\n// Exact values from dashboard.eaigarcom.com LoginForm.tsx:\n// h-4 w-4 (16px) rounded (4px)\n// after:left-[3px] after:top-0 after:w-[6px] after:h-[10px] after:border-r-2 after:border-b-2 after:rotate-45\n// Scaled proportionally for md (22px) and lg (28px)\nconst sizeConfig = {\n sm: { box: 16, radius: 4, icon: { w: 6, h: 10, left: 3, top: 0, border: 2 }, gap: 8, text: 13 },\n md: { box: 22, radius: 6, icon: { w: 8, h: 14, left: 4.5, top: 0, border: 2 }, gap: 10, text: 14 },\n lg: { box: 28, radius: 7, icon: { w: 10, h: 17, left: 6, top: 0, border: 2.5 }, gap: 12, text: 15 },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Checkbox({\n name,\n id,\n label,\n checked = false,\n onChange,\n disabled = false,\n size = \"md\",\n primaryColor,\n className,\n children,\n}: CheckboxProps) {\n const inputId = id || name;\n const cfg = sizeConfig[size];\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #37A501)\";\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n \"inline-flex items-center cursor-pointer select-none\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n )}\n style={{ gap: cfg.gap }}\n >\n {/* Hidden native input for form submission & accessibility */}\n <input\n type=\"checkbox\"\n id={inputId}\n name={name}\n checked={checked}\n onChange={(e) => onChange?.(e.target.checked)}\n disabled={disabled}\n className=\"sr-only peer\"\n />\n\n {/* Custom checkbox box */}\n <span\n className=\"relative shrink-0 transition-all duration-200\"\n style={{\n width: cfg.box,\n height: cfg.box,\n borderRadius: cfg.radius,\n backgroundColor: checked ? resolvedColor : \"transparent\",\n border: checked\n ? `2px solid ${resolvedColor}`\n : \"2px solid rgba(45,45,45,0.2)\",\n boxShadow: checked\n ? `0 1px 3px color-mix(in srgb, ${resolvedColor} 25%, transparent)`\n : \"none\",\n }}\n aria-hidden=\"true\"\n >\n {/* Checkmark — CSS-only via rotated border trick */}\n <span\n className=\"absolute transition-opacity duration-150\"\n style={{\n opacity: checked ? 1 : 0,\n left: cfg.icon.left,\n top: cfg.icon.top,\n width: cfg.icon.w,\n height: cfg.icon.h,\n borderRight: `${cfg.icon.border}px solid #fff`,\n borderBottom: `${cfg.icon.border}px solid #fff`,\n transform: \"rotate(45deg)\",\n }}\n />\n </span>\n\n {/* Label text */}\n {(children || label) && (\n <span\n className=\"leading-none\"\n style={{\n fontSize: cfg.text,\n color: \"var(--dashboard-text-primary, #2d2d2d)\",\n }}\n >\n {children || label}\n </span>\n )}\n </label>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode, useState, useEffect } from \"react\";\nimport { Checkbox } from \"../Checkbox\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AuthField {\n /** Unique name / id for the field */\n name: string;\n /** Label displayed above the input (omit for placeholder-only mode) */\n label?: string;\n /** HTML input type */\n type?: \"text\" | \"email\" | \"password\" | \"tel\" | \"number\";\n /** Placeholder text */\n placeholder?: string;\n /** Whether the field is required */\n required?: boolean;\n /** Minimum length for validation */\n minLength?: number;\n /** Field-level error message */\n error?: string;\n}\n\nexport interface AuthLink {\n /** Link text */\n label: string;\n /** URL or click handler */\n href?: string;\n /** Link target (e.g., '_blank' for new tab) */\n target?: string;\n /** Custom click handler (takes precedence over href) */\n onClick?: () => void;\n}\n\nexport interface AuthCheckbox {\n /** Checkbox name */\n name: string;\n /** Checkbox label */\n label: string;\n /** Whether checked */\n checked?: boolean;\n /** Change handler */\n onChange?: (checked: boolean) => void;\n}\n\nexport interface AuthBackground {\n /** Solid color, gradient, or CSS value for the page background */\n color?: string;\n /** Background image URL or element (for Next.js Image support) */\n image?: string;\n /** React element for the background (e.g., next/image with fill) */\n imageElement?: ReactNode;\n /** Overlay opacity (0-1) — rendered as bg-black/{opacity} */\n overlayOpacity?: number;\n /** Custom CSS for the background container */\n style?: React.CSSProperties;\n}\n\nexport interface AuthHeadline {\n /** Main headline text */\n text: string;\n /** Highlighted / accent portion (rendered on new line if not found inside text) */\n highlight?: string;\n /** Color of the main text (defaults to #faf3e1) */\n color?: string;\n /** Color of the highlighted text (defaults to primaryColor) */\n highlightColor?: string;\n}\n\nexport interface AuthBranding {\n /** Array of logo elements to render at the bottom-left */\n logos: ReactNode[];\n}\n\nexport interface AuthCardStyle {\n /** Card background color (defaults to #faf3e1) */\n background?: string;\n /** Card border radius in px (defaults to 16 = rounded-2xl) */\n borderRadius?: number;\n /** Card box shadow CSS */\n shadow?: string;\n /** Card max width in px (defaults to 420) */\n maxWidth?: number;\n /** Card padding in px (defaults to 32 = p-8) */\n padding?: number;\n /** Card border */\n border?: string;\n}\n\nexport interface AuthLayoutProps {\n // --- Content ---\n /** Logo element displayed at top of card */\n logo?: ReactNode;\n /** Page title (e.g., \"Painel de Controle\") */\n title: string;\n /** Subtitle / description below the title (supports ReactNode for inline formatting) */\n subtitle?: ReactNode;\n /** Global error message displayed above the form */\n error?: string;\n /** Global success message displayed above the form */\n success?: string;\n\n // --- Form ---\n /** Form field definitions */\n fields: AuthField[];\n /** Current field values keyed by field name */\n values: Record<string, string>;\n /** Callback when a field value changes */\n onFieldChange: (name: string, value: string) => void;\n /** Submit handler */\n onSubmit: (values: Record<string, string>) => void;\n /** Submit button label */\n submitLabel?: string;\n /** Loading label while submitting */\n loadingLabel?: string;\n /** Whether the form is currently submitting */\n isLoading?: boolean;\n /** Checkbox between fields and submit (e.g., \"Lembrar conta\") */\n checkbox?: AuthCheckbox;\n\n // --- Links ---\n /** Primary link below the form */\n primaryLink?: AuthLink;\n /** Secondary link / text (e.g., \"Ainda nao tem cadastro? Cadastre-se\") */\n secondaryLink?: AuthLink & { prefix?: string };\n\n // --- Extra content ---\n /** Content rendered between the submit button and the links */\n extraContent?: ReactNode;\n /** Content rendered above the form (below title/subtitle) */\n headerContent?: ReactNode;\n /** Content rendered just above the submit button (e.g., resend code link) */\n beforeSubmitContent?: ReactNode;\n /** Content rendered at the very bottom of the card */\n footerContent?: ReactNode;\n\n // --- Layout ---\n /** Headline text displayed over the background (top-left, hidden on mobile) */\n headline?: AuthHeadline;\n /** Branding logos at the bottom-left over the background (hidden on mobile) */\n branding?: AuthBranding;\n /** Card horizontal position */\n cardPosition?: \"left\" | \"center\" | \"right\";\n /** Right padding for the card container on lg screens (defaults to 256 = pr-64) */\n cardOffsetRight?: number;\n\n // --- Theming ---\n /** Background configuration */\n background?: AuthBackground;\n /** Card styling overrides */\n cardStyle?: AuthCardStyle;\n /** Primary color (buttons, links, focus rings, checkbox). Defaults to #ff521d */\n primaryColor?: string;\n /** Text color for the title */\n titleColor?: string;\n /** Text alignment for the card header (title + subtitle). Defaults to \"center\" */\n titleAlign?: \"left\" | \"center\" | \"right\";\n\n /** Additional class name for the outermost container */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\n/** Resolves a CSS color value (including var() references) to a computed hex/rgb string */\nfunction useResolvedColor(cssValue: string): string {\n const [resolved, setResolved] = useState(cssValue);\n\n useEffect(() => {\n // If it's already a plain color (not a var()), use as-is\n if (!cssValue.startsWith(\"var(\")) {\n setResolved(cssValue);\n return;\n }\n\n // Create a hidden probe element to read the computed value\n const probe = document.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = cssValue;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n if (computed) setResolved(computed);\n document.body.removeChild(probe);\n }, [cssValue]);\n\n // Re-resolve when CSS vars change (DashboardProvider updates style on root)\n useEffect(() => {\n if (!cssValue.startsWith(\"var(\")) return;\n\n const observer = new MutationObserver(() => {\n const probe = document.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = cssValue;\n document.body.appendChild(probe);\n const computed = getComputedStyle(probe).color;\n if (computed) setResolved(computed);\n document.body.removeChild(probe);\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"style\"],\n });\n\n return () => observer.disconnect();\n }, [cssValue]);\n\n return resolved;\n}\n\n// ---------------------------------------------------------------------------\n// AuthInput — matches Eai Garcom: h-12 rounded-lg border-2 bg-transparent\n// ---------------------------------------------------------------------------\n\nfunction AuthInput({\n name,\n label,\n type = \"text\",\n placeholder,\n required,\n minLength,\n value,\n onChange,\n error,\n resolvedColor,\n computedColor,\n disabled,\n}: {\n name: string;\n label?: string;\n type?: string;\n placeholder?: string;\n required?: boolean;\n minLength?: number;\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n error?: string;\n resolvedColor: string;\n computedColor: string;\n disabled?: boolean;\n}) {\n return (\n <div>\n {label && (\n <label\n htmlFor={name}\n className=\"block text-sm font-medium text-[#2d2d2d] mb-1.5\"\n >\n {label}\n </label>\n )}\n <input\n type={type}\n id={name}\n name={name}\n placeholder={placeholder}\n required={required}\n minLength={minLength}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className=\"w-full h-12 rounded-lg border-2 border-[#2d2d2d]/20 bg-transparent px-4 text-sm text-[#2d2d2d] placeholder:text-[#2d2d2d]/60 focus:outline-none transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n ...(error\n ? { borderColor: \"var(--dashboard-status-danger, #EF4444)\" }\n : {}),\n }}\n onFocus={(e) => {\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${computedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n />\n {error && (\n <p className=\"text-xs mt-1 text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// PasswordInput — h-12 with eye toggle, same border style\n// ---------------------------------------------------------------------------\n\nfunction PasswordInput({\n value,\n onChange,\n placeholder,\n name,\n required,\n minLength,\n error,\n resolvedColor,\n computedColor,\n disabled,\n}: {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder?: string;\n name: string;\n required?: boolean;\n minLength?: number;\n error?: string;\n resolvedColor: string;\n computedColor: string;\n disabled?: boolean;\n}) {\n const [visible, setVisible] = useState(false);\n\n return (\n <div>\n <div className=\"relative\">\n <input\n type={visible ? \"text\" : \"password\"}\n id={name}\n name={name}\n placeholder={placeholder}\n required={required}\n minLength={minLength}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className=\"w-full h-12 rounded-lg border-2 border-[#2d2d2d]/20 bg-transparent px-4 pr-11 text-sm text-[#2d2d2d] placeholder:text-[#2d2d2d]/60 focus:outline-none transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n onFocus={(e) => {\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${computedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n />\n <button\n type=\"button\"\n onClick={() => setVisible((v) => !v)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-[#2d2d2d]/50 hover:text-[#2d2d2d] transition-colors cursor-pointer bg-transparent border-none p-0\"\n tabIndex={-1}\n aria-label={visible ? \"Ocultar senha\" : \"Mostrar senha\"}\n disabled={disabled}\n >\n {visible ? (\n // EyeOff icon (lucide)\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n // Eye icon (lucide)\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n {error && (\n <p className=\"text-xs mt-1 text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AuthLayout({\n logo,\n title,\n subtitle,\n error,\n success,\n fields,\n values,\n onFieldChange,\n onSubmit,\n submitLabel = \"Acessar\",\n loadingLabel = \"Entrando...\",\n isLoading = false,\n checkbox,\n primaryLink,\n secondaryLink,\n extraContent,\n headerContent,\n beforeSubmitContent,\n footerContent,\n headline,\n branding,\n cardPosition = \"right\",\n cardOffsetRight = 256,\n background,\n cardStyle,\n primaryColor,\n titleColor,\n titleAlign = \"center\",\n className,\n}: AuthLayoutProps) {\n // CSS var string for style props (e.g., backgroundColor, color)\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #ff521d)\";\n // Computed hex/rgb value for JS string concatenation (e.g., focus ring shadow with opacity)\n const computedColor = useResolvedColor(resolvedColor);\n\n // Background\n const bgCss: React.CSSProperties = {\n backgroundColor: background?.color || \"#1a1a1a\",\n ...background?.style,\n };\n\n // Card\n const cardBg = cardStyle?.background || \"var(--dashboard-secondary, #faf3e1)\";\n const cardCss: React.CSSProperties = {\n backgroundColor: cardBg,\n borderRadius: cardStyle?.borderRadius ?? 16,\n boxShadow:\n cardStyle?.shadow ??\n \"0 0 0 1px rgb(0 0 0 / 0.08), 0 0 12px 4px rgb(0 0 0 / 0.25), 0 0 28px 10px rgb(0 0 0 / 0.20)\",\n maxWidth: cardStyle?.maxWidth ?? 420,\n padding: cardStyle?.padding ?? 32,\n border: cardStyle?.border || \"none\",\n width: \"100%\",\n };\n\n\n\n\n function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n onSubmit(values);\n }\n\n function renderLink(link: AuthLink, extraClass?: string) {\n const style: React.CSSProperties = { color: resolvedColor };\n if (link.onClick) {\n return (\n <button\n type=\"button\"\n onClick={link.onClick}\n className={cn(\n \"bg-transparent border-none cursor-pointer hover:opacity-80 text-sm font-semibold p-0 transition-colors\",\n extraClass,\n )}\n style={style}\n >\n {link.label}\n </button>\n );\n }\n return (\n <a\n href={link.href}\n target={link.target}\n rel={link.target === '_blank' ? 'noopener noreferrer' : undefined}\n className={cn(\n \"hover:opacity-80 text-sm font-semibold transition-colors\",\n extraClass,\n )}\n style={style}\n >\n {link.label}\n </a>\n );\n }\n\n return (\n <div\n className={cn(\"fixed inset-0 flex select-none overflow-hidden\", className)}\n style={bgCss}\n >\n {/* Background left spacer for branding (hidden on mobile) */}\n {branding && branding.logos.length > 0 && (\n <div className=\"relative hidden w-1/3 lg:block\">\n <div className=\"absolute bottom-12 left-12 z-20\">\n <div className=\"flex gap-4 items-center\">\n {branding.logos.map((brandLogo, i) => (\n <React.Fragment key={i}>{brandLogo}</React.Fragment>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Background image */}\n {background?.imageElement ? (\n <div className=\"absolute inset-0 z-0\">{background.imageElement}</div>\n ) : background?.image ? (\n <img\n src={background.image}\n alt=\"\"\n className=\"absolute inset-0 z-0 h-full w-full object-cover\"\n draggable={false}\n />\n ) : null}\n\n {/* Background overlay — bg-black/20 by default */}\n {(background?.image || background?.imageElement) && (\n <div\n className=\"absolute inset-0 z-10\"\n style={{\n backgroundColor: `rgba(0,0,0,${background?.overlayOpacity ?? 0.2})`,\n }}\n />\n )}\n\n {/* Headline — top-left, hidden on mobile */}\n {headline && (\n <div className=\"absolute top-12 left-8 z-20 max-w-md hidden lg:block\">\n <h1\n className=\"text-4xl font-bold mb-4 leading-tight\"\n style={{ color: headline.color || \"#faf3e1\" }}\n >\n {headline.highlight\n ? (() => {\n const idx = headline.text.indexOf(headline.highlight);\n if (idx === -1) {\n return (\n <>\n {headline.text}\n <br />\n <span\n style={{\n color: headline.highlightColor || resolvedColor,\n }}\n >\n {headline.highlight}\n </span>\n </>\n );\n }\n const before = headline.text.slice(0, idx);\n const after = headline.text.slice(\n idx + headline.highlight.length,\n );\n return (\n <>\n {before}\n <span\n style={{\n color: headline.highlightColor || resolvedColor,\n }}\n >\n {headline.highlight}\n </span>\n {after}\n </>\n );\n })()\n : headline.text}\n </h1>\n </div>\n )}\n\n {/* Responsive offset CSS — only applies on lg+ */}\n <style>{`\n .auth-card-container {\n padding-left: 1rem;\n padding-right: 1rem;\n justify-content: center;\n align-content: center;\n }\n @media (min-width: 1024px) {\n .auth-card-container[data-position=\"right\"] {\n justify-content: flex-end;\n padding-right: ${cardOffsetRight}px;\n }\n .auth-card-container[data-position=\"left\"] {\n justify-content: flex-start;\n padding-left: ${cardOffsetRight}px;\n }\n .auth-card-container[data-position=\"center\"] {\n justify-content: center;\n }\n }\n `}</style>\n\n {/* Card container — z-30, flex w-full items-center */}\n <div\n className=\"auth-card-container relative z-30 flex w-full items-center py-8\"\n data-position={cardPosition}\n >\n <div style={{ ...cardCss, maxHeight: \"calc(100vh - 64px)\", overflowY: \"auto\" }}>\n {/* Card header: logo + title + subtitle */}\n <div className={`mb-8 ${titleAlign === \"center\" ? \"text-center\" : titleAlign === \"right\" ? \"text-right\" : \"text-left\"}`}>\n {/* Logo */}\n {logo && (\n <div className={`mb-4 flex ${titleAlign === \"center\" ? \"justify-center\" : titleAlign === \"right\" ? \"justify-end\" : \"justify-start\"}`}>\n {logo}\n </div>\n )}\n\n {/* Title — text-2xl font-bold text-gray-900 mb-2 */}\n <h2\n className=\"text-2xl font-bold mb-2\"\n style={{\n color: titleColor || \"var(--dashboard-text-primary, #111827)\",\n }}\n >\n {title}\n </h2>\n\n {/* Subtitle — text-sm text-gray-600 */}\n {subtitle && (\n <p className=\"text-sm text-gray-600\">{subtitle}</p>\n )}\n </div>\n\n {/* Header content */}\n {headerContent}\n\n {/* Alerts */}\n {error && (\n <div className=\"p-3 rounded-lg text-sm text-center mb-5 bg-red-50 text-red-700 border border-red-200\">\n {error}\n </div>\n )}\n\n {success && (\n <div className=\"p-3 rounded-lg text-sm text-center mb-5 bg-green-50 text-green-700 border border-green-200\">\n {success}\n </div>\n )}\n\n {/* Form — space-y-5 */}\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n {fields.map((field) =>\n field.type === \"password\" ? (\n <PasswordInput\n key={field.name}\n name={field.name}\n placeholder={field.placeholder || field.label}\n required={field.required}\n minLength={field.minLength}\n value={values[field.name] || \"\"}\n onChange={(e) =>\n onFieldChange(field.name, e.target.value)\n }\n error={field.error}\n resolvedColor={resolvedColor}\n computedColor={computedColor}\n disabled={isLoading}\n />\n ) : (\n <AuthInput\n key={field.name}\n name={field.name}\n label={field.label}\n type={field.type || \"text\"}\n placeholder={field.placeholder || field.label}\n required={field.required}\n minLength={field.minLength}\n value={values[field.name] || \"\"}\n onChange={(e) =>\n onFieldChange(field.name, e.target.value)\n }\n error={field.error}\n resolvedColor={resolvedColor}\n computedColor={computedColor}\n disabled={isLoading}\n />\n ),\n )}\n\n {/* Checkbox */}\n {checkbox && (\n <Checkbox\n name={checkbox.name}\n label={checkbox.label}\n checked={checkbox.checked || false}\n onChange={(val) => checkbox.onChange?.(val)}\n disabled={isLoading}\n primaryColor={resolvedColor}\n size=\"sm\"\n />\n )}\n\n {/* Before submit content (e.g., resend code) */}\n {beforeSubmitContent}\n\n {/* Submit button — h-12 rounded-lg font-bold text-base shadow-lg */}\n <button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full h-12 rounded-lg px-5 text-base font-bold text-white transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed shadow-lg hover:shadow-xl hover:opacity-90\"\n style={{\n backgroundColor: resolvedColor,\n \"--tw-ring-color\": resolvedColor,\n } as React.CSSProperties}\n >\n {isLoading ? loadingLabel : submitLabel}\n </button>\n </form>\n\n {/* Extra content */}\n {extraContent && <div className=\"mt-5\">{extraContent}</div>}\n\n {/* Links */}\n {(primaryLink || secondaryLink) && (\n <div className=\"mt-6 text-center\">\n {primaryLink && (\n <p className=\"text-sm text-gray-600\">\n {renderLink(primaryLink)}\n </p>\n )}\n {secondaryLink && (\n <p className={`text-sm text-gray-600 ${primaryLink ? \"mt-6\" : \"\"}`}>\n {secondaryLink.prefix && (\n <>{secondaryLink.prefix}{\" \"}</>\n )}\n {renderLink(secondaryLink)}\n </p>\n )}\n </div>\n )}\n\n {/* Footer content */}\n {footerContent && <div className=\"mt-6\">{footerContent}</div>}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useCallback, KeyboardEvent, ClipboardEvent } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CodeInputProps {\n /** Number of digit boxes (defaults to 6) */\n length?: number;\n /** Current value as a string (e.g. \"12\" for the first two digits filled) */\n value: string;\n /** Called with the full string whenever a digit changes */\n onChange: (value: string) => void;\n /** Disable all inputs */\n disabled?: boolean;\n /** Show error styling */\n error?: boolean;\n /** Primary / accent color for focused box border */\n primaryColor?: string;\n /** Additional className on the container */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function CodeInput({\n length = 6,\n value,\n onChange,\n disabled = false,\n error = false,\n primaryColor,\n className = \"\",\n}: CodeInputProps) {\n const resolvedColor = primaryColor || \"var(--dashboard-primary, #ff521d)\";\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n\n const digits = value.split(\"\").concat(Array(length).fill(\"\")).slice(0, length);\n\n const focusInput = useCallback(\n (idx: number) => {\n const clamped = Math.max(0, Math.min(idx, length - 1));\n inputsRef.current[clamped]?.focus();\n },\n [length],\n );\n\n const updateValue = useCallback(\n (idx: number, digit: string) => {\n const arr = value.split(\"\").concat(Array(length).fill(\"\")).slice(0, length);\n arr[idx] = digit;\n // Trim trailing empty strings\n const newVal = arr.join(\"\").replace(/\\s+$/g, \"\");\n onChange(newVal);\n },\n [value, length, onChange],\n );\n\n const handleInput = useCallback(\n (idx: number, char: string) => {\n if (!/^\\d$/.test(char)) return;\n updateValue(idx, char);\n if (idx < length - 1) {\n focusInput(idx + 1);\n }\n },\n [updateValue, focusInput, length],\n );\n\n const handleKeyDown = useCallback(\n (idx: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\") {\n e.preventDefault();\n if (digits[idx] && digits[idx] !== \"\") {\n updateValue(idx, \"\");\n } else if (idx > 0) {\n updateValue(idx - 1, \"\");\n focusInput(idx - 1);\n }\n } else if (e.key === \"ArrowLeft\" && idx > 0) {\n e.preventDefault();\n focusInput(idx - 1);\n } else if (e.key === \"ArrowRight\" && idx < length - 1) {\n e.preventDefault();\n focusInput(idx + 1);\n }\n },\n [digits, updateValue, focusInput, length],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData(\"text\").replace(/\\D/g, \"\").slice(0, length);\n if (pasted.length > 0) {\n onChange(pasted);\n focusInput(Math.min(pasted.length, length - 1));\n }\n },\n [length, onChange, focusInput],\n );\n\n return (\n <div className={`flex justify-center gap-2 sm:gap-3 ${className}`}>\n {Array.from({ length }).map((_, idx) => (\n <input\n key={idx}\n ref={(el) => { inputsRef.current[idx] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={1}\n disabled={disabled}\n value={digits[idx] || \"\"}\n onChange={(e) => {\n const char = e.target.value.slice(-1);\n handleInput(idx, char);\n }}\n onKeyDown={(e) => handleKeyDown(idx, e)}\n onPaste={handlePaste}\n onFocus={(e) => {\n e.target.select();\n e.target.style.borderColor = resolvedColor;\n e.target.style.boxShadow = `0 0 0 3px color-mix(in srgb, ${resolvedColor} 20%, transparent)`;\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"\";\n e.target.style.boxShadow = \"\";\n }}\n className=\"w-10 h-11 sm:w-11 sm:h-12 text-center text-lg sm:text-xl font-bold rounded-lg border-2 bg-transparent text-[#2d2d2d] transition-all focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n borderColor: error\n ? \"var(--dashboard-status-danger, #EF4444)\"\n : \"rgba(45,45,45,0.2)\",\n }}\n />\n ))}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface SkeletonProps {\n variant?: \"text\" | \"circle\" | \"rectangle\" | \"card\";\n width?: string | number;\n height?: string | number;\n animate?: boolean;\n className?: string;\n lines?: number;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Skeleton({\n variant = \"text\",\n width,\n height,\n animate = true,\n className,\n lines = 1,\n}: SkeletonProps) {\n const baseStyles =\n \"bg-[var(--dashboard-text-secondary,#6b7280)]/10 relative overflow-hidden\";\n const shimmerStyles = animate\n ? \"after:absolute after:inset-0 after:bg-gradient-to-r after:from-transparent after:via-[var(--dashboard-text-secondary,#6b7280)]/5 after:to-transparent dashboard-animate-shimmer after:content-['']\"\n : \"\";\n\n const variantStyles: Record<string, string> = {\n text: \"h-4 rounded\",\n circle: \"rounded-full\",\n rectangle: \"rounded-lg\",\n card: \"rounded-lg\",\n };\n\n const style: React.CSSProperties = {};\n if (width) style.width = typeof width === \"number\" ? `${width}px` : width;\n if (height) style.height = typeof height === \"number\" ? `${height}px` : height;\n\n if (variant === \"circle\" && !height) {\n style.height = style.width || \"40px\";\n if (!width) style.width = \"40px\";\n }\n\n if (variant === \"card\" && !height) {\n style.height = \"120px\";\n }\n\n if (variant === \"text\" && lines > 1) {\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n {Array.from({ length: lines }).map((_, i) => (\n <div\n key={i}\n className={cn(baseStyles, shimmerStyles, variantStyles.text)}\n style={{\n ...style,\n width: i === lines - 1 ? \"75%\" : style.width || \"100%\",\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={cn(baseStyles, shimmerStyles, variantStyles[variant], className)}\n style={style}\n />\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState, useCallback, ReactNode, useRef, useEffect } from \"react\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n createColumnHelper,\n type ColumnDef,\n type SortingState,\n type ColumnFiltersState,\n type RowSelectionState,\n type PaginationState,\n type Row,\n type Table as TanTable,\n} from \"@tanstack/react-table\";\nimport { ArrowUp, ArrowDown, ArrowUpDown, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { Skeleton } from \"../Skeleton\";\n\nexport type { ColumnDef as DataGridColumn };\nexport { createColumnHelper };\n\nexport interface DataGridProps<T> {\n columns: ColumnDef<T, unknown>[];\n data: T[];\n isLoading?: boolean;\n skeletonRows?: number;\n\n sorting?: SortingState;\n onSortingChange?: (sorting: SortingState) => void;\n\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n\n columnFilters?: ColumnFiltersState;\n onColumnFiltersChange?: (filters: ColumnFiltersState) => void;\n\n rowSelection?: RowSelectionState;\n onRowSelectionChange?: (selection: RowSelectionState) => void;\n enableRowSelection?: boolean | ((row: Row<T>) => boolean);\n\n pagination?: PaginationState;\n onPaginationChange?: (pagination: PaginationState) => void;\n pageCount?: number;\n manualPagination?: boolean;\n pageSizeOptions?: number[];\n\n onRowClick?: (row: T) => void;\n getRowId?: (row: T) => string;\n\n enableVirtualization?: boolean;\n rowHeight?: number;\n\n emptyMessage?: string;\n emptyIcon?: ReactNode;\n\n stickyHeader?: boolean;\n compact?: boolean;\n striped?: boolean;\n bordered?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction SortIcon({ sorted }: { sorted: false | \"asc\" | \"desc\" }) {\n if (sorted === \"asc\") return <ArrowUp className=\"h-3.5 w-3.5\" />;\n if (sorted === \"desc\") return <ArrowDown className=\"h-3.5 w-3.5\" />;\n return <ArrowUpDown className=\"h-3.5 w-3.5 opacity-40\" />;\n}\n\nfunction DataGridSkeleton({\n columns,\n rows,\n compact,\n}: {\n columns: number;\n rows: number;\n compact?: boolean;\n}) {\n const cellPadding = compact ? \"px-4 py-2\" : \"px-6 py-3\";\n return (\n <>\n {Array.from({ length: rows }).map((_, rowIdx) => (\n <tr key={rowIdx}>\n {Array.from({ length: columns }).map((_, colIdx) => (\n <td key={colIdx} className={cellPadding}>\n <Skeleton variant=\"text\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\nfunction VirtualRows<T>({\n table,\n rowHeight,\n onRowClick,\n compact,\n}: {\n table: TanTable<T>;\n rowHeight: number;\n onRowClick?: (row: T) => void;\n compact?: boolean;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [containerHeight, setContainerHeight] = useState(400);\n\n const rows = table.getRowModel().rows;\n const totalHeight = rows.length * rowHeight;\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerHeight(entry.contentRect.height);\n }\n });\n observer.observe(container);\n\n const handleScroll = () => {\n setScrollTop(container.scrollTop);\n };\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n observer.disconnect();\n container.removeEventListener(\"scroll\", handleScroll);\n };\n }, []);\n\n const overscan = 5;\n const startIndex = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);\n const endIndex = Math.min(\n rows.length,\n Math.ceil((scrollTop + containerHeight) / rowHeight) + overscan,\n );\n const visibleRows = rows.slice(startIndex, endIndex);\n\n const cellPadding = compact ? \"px-4 py-2\" : \"px-6 py-4\";\n\n return (\n <div\n ref={containerRef}\n className=\"overflow-auto\"\n style={{ maxHeight: containerHeight }}\n >\n <div style={{ height: totalHeight, position: \"relative\" }}>\n <table className=\"min-w-full divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n <thead className=\"bg-[var(--dashboard-text-secondary,#6b7280)]/5 sticky top-0 z-10\">\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n scope=\"col\"\n className={cn(\n \"text-left text-xs font-semibold text-[var(--dashboard-text-secondary,#6b7280)] uppercase tracking-wider\",\n compact ? \"px-4 py-2\" : \"px-6 py-3\",\n header.column.getCanSort() && \"cursor-pointer select-none\",\n )}\n style={{ width: header.getSize() }}\n onClick={header.column.getToggleSortingHandler()}\n >\n <div className=\"flex items-center gap-1\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {header.column.getCanSort() && (\n <SortIcon sorted={header.column.getIsSorted()} />\n )}\n </div>\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n <tr style={{ height: startIndex * rowHeight }}>\n <td colSpan={table.getAllColumns().length} />\n </tr>\n {visibleRows.map((row) => (\n <tr\n key={row.id}\n onClick={() => onRowClick?.(row.original)}\n className={cn(\n \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/5 transition-colors\",\n onRowClick && \"cursor-pointer\",\n row.getIsSelected() && \"bg-[var(--dashboard-primary,#37a501)]/5\",\n )}\n style={{ height: rowHeight }}\n >\n {row.getVisibleCells().map((cell) => (\n <td\n key={cell.id}\n className={cn(cellPadding, \"text-sm whitespace-nowrap\")}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))}\n <tr style={{ height: (rows.length - endIndex) * rowHeight }}>\n <td colSpan={table.getAllColumns().length} />\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nexport function DataGrid<T>({\n columns,\n data,\n isLoading = false,\n skeletonRows = 5,\n\n sorting: controlledSorting,\n onSortingChange,\n\n globalFilter: controlledGlobalFilter,\n onGlobalFilterChange,\n\n columnFilters: controlledColumnFilters,\n onColumnFiltersChange,\n\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n enableRowSelection = false,\n\n pagination: controlledPagination,\n onPaginationChange,\n pageCount,\n manualPagination = false,\n pageSizeOptions = [10, 20, 30, 50],\n\n onRowClick,\n getRowId,\n\n enableVirtualization = false,\n rowHeight = 48,\n\n emptyMessage = \"Nenhum registro encontrado\",\n emptyIcon,\n\n stickyHeader = false,\n compact = false,\n striped = false,\n bordered = false,\n className,\n}: DataGridProps<T>) {\n const [internalSorting, setInternalSorting] = useState<SortingState>([]);\n const [internalGlobalFilter, setInternalGlobalFilter] = useState(\"\");\n const [internalColumnFilters, setInternalColumnFilters] = useState<ColumnFiltersState>([]);\n const [internalRowSelection, setInternalRowSelection] = useState<RowSelectionState>({});\n const [internalPagination, setInternalPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: 10,\n });\n\n const sorting = controlledSorting ?? internalSorting;\n const globalFilter = controlledGlobalFilter ?? internalGlobalFilter;\n const columnFilters = controlledColumnFilters ?? internalColumnFilters;\n const rowSelection = controlledRowSelection ?? internalRowSelection;\n const pagination = controlledPagination ?? internalPagination;\n\n const handleSortingChange = useCallback(\n (updater: SortingState | ((old: SortingState) => SortingState)) => {\n const next = typeof updater === \"function\" ? updater(sorting) : updater;\n onSortingChange ? onSortingChange(next) : setInternalSorting(next);\n },\n [sorting, onSortingChange],\n );\n\n const handleGlobalFilterChange = useCallback(\n (updater: string | ((old: string) => string)) => {\n const next = typeof updater === \"function\" ? updater(globalFilter) : updater;\n onGlobalFilterChange ? onGlobalFilterChange(next) : setInternalGlobalFilter(next);\n },\n [globalFilter, onGlobalFilterChange],\n );\n\n const handleColumnFiltersChange = useCallback(\n (updater: ColumnFiltersState | ((old: ColumnFiltersState) => ColumnFiltersState)) => {\n const next = typeof updater === \"function\" ? updater(columnFilters) : updater;\n onColumnFiltersChange ? onColumnFiltersChange(next) : setInternalColumnFilters(next);\n },\n [columnFilters, onColumnFiltersChange],\n );\n\n const handleRowSelectionChange = useCallback(\n (updater: RowSelectionState | ((old: RowSelectionState) => RowSelectionState)) => {\n const next = typeof updater === \"function\" ? updater(rowSelection) : updater;\n onRowSelectionChange ? onRowSelectionChange(next) : setInternalRowSelection(next);\n },\n [rowSelection, onRowSelectionChange],\n );\n\n const handlePaginationChange = useCallback(\n (updater: PaginationState | ((old: PaginationState) => PaginationState)) => {\n const next = typeof updater === \"function\" ? updater(pagination) : updater;\n onPaginationChange ? onPaginationChange(next) : setInternalPagination(next);\n },\n [pagination, onPaginationChange],\n );\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n globalFilter,\n columnFilters,\n rowSelection,\n pagination,\n },\n onSortingChange: handleSortingChange as never,\n onGlobalFilterChange: handleGlobalFilterChange as never,\n onColumnFiltersChange: handleColumnFiltersChange as never,\n onRowSelectionChange: handleRowSelectionChange as never,\n onPaginationChange: handlePaginationChange as never,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: manualPagination ? undefined : getPaginationRowModel(),\n enableRowSelection,\n getRowId,\n manualPagination,\n pageCount,\n });\n\n const cellPadding = compact ? \"px-4 py-2\" : \"px-6 py-4\";\n const headerPadding = compact ? \"px-4 py-2\" : \"px-6 py-3\";\n\n if (enableVirtualization) {\n return (\n <div\n className={cn(\n \"overflow-hidden rounded-lg bg-[var(--dashboard-surface,#ffffff)] shadow-sm\",\n bordered && \"border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <VirtualRows\n table={table}\n rowHeight={rowHeight}\n onRowClick={onRowClick}\n compact={compact}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"overflow-hidden rounded-lg bg-[var(--dashboard-surface,#ffffff)] shadow-sm\",\n bordered && \"border border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n className,\n )}\n >\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n <thead\n className={cn(\n \"bg-[var(--dashboard-text-secondary,#6b7280)]/5\",\n stickyHeader && \"sticky top-0 z-10\",\n )}\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n scope=\"col\"\n className={cn(\n \"text-left text-xs font-semibold text-[var(--dashboard-text-secondary,#6b7280)] uppercase tracking-wider\",\n headerPadding,\n header.column.getCanSort() && \"cursor-pointer select-none\",\n )}\n style={header.getSize() !== 150 ? { width: header.getSize() } : undefined}\n onClick={header.column.getToggleSortingHandler()}\n >\n <div className=\"flex items-center gap-1\">\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {header.column.getCanSort() && (\n <SortIcon sorted={header.column.getIsSorted()} />\n )}\n </div>\n </th>\n ))}\n </tr>\n ))}\n </thead>\n\n <tbody className=\"divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/20\">\n {isLoading ? (\n <DataGridSkeleton\n columns={columns.length}\n rows={skeletonRows}\n compact={compact}\n />\n ) : table.getRowModel().rows.length === 0 ? (\n <tr>\n <td colSpan={columns.length} className=\"py-12\">\n <div className=\"text-center\">\n {emptyIcon || (\n <svg\n className=\"mx-auto h-10 w-10 text-[var(--dashboard-text-secondary,#6b7280)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )}\n <p className=\"mt-3 text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {emptyMessage}\n </p>\n </div>\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row, rowIndex) => (\n <tr\n key={row.id}\n onClick={() => onRowClick?.(row.original)}\n className={cn(\n \"transition-colors\",\n onRowClick && \"cursor-pointer\",\n \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/5\",\n row.getIsSelected() && \"bg-[var(--dashboard-primary,#37a501)]/5\",\n striped && rowIndex % 2 === 1 && \"bg-[var(--dashboard-text-secondary,#6b7280)]/3\",\n )}\n >\n {row.getVisibleCells().map((cell) => (\n <td\n key={cell.id}\n className={cn(\n cellPadding,\n \"text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {(onPaginationChange || !manualPagination) &&\n table.getPageCount() > 1 && (\n <div className=\"flex items-center justify-between gap-4 flex-wrap border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <select\n value={pagination.pageSize}\n onChange={(e) =>\n handlePaginationChange({\n pageIndex: 0,\n pageSize: Number(e.target.value),\n })\n }\n className=\"rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] px-2 py-1 text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n por pagina\n </span>\n </div>\n\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n Pagina {pagination.pageIndex + 1} de {table.getPageCount()}\n </span>\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n className=\"rounded-md p-1.5 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 disabled:opacity-40 disabled:cursor-not-allowed transition-colors cursor-pointer\"\n aria-label=\"Pagina anterior\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n className=\"rounded-md p-1.5 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 disabled:opacity-40 disabled:cursor-not-allowed transition-colors cursor-pointer\"\n aria-label=\"Proxima pagina\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useCallback, ReactNode } from \"react\";\nimport { ChevronRight, GripVertical } from \"lucide-react\";\n\nexport interface TreeNode {\n id: string;\n label: string;\n children?: TreeNode[];\n icon?: ReactNode;\n badge?: ReactNode;\n actions?: ReactNode;\n disabled?: boolean;\n data?: unknown;\n}\n\nexport interface TreeViewProps {\n nodes: TreeNode[];\n onSelect?: (node: TreeNode) => void;\n onExpand?: (nodeId: string, expanded: boolean) => void;\n onMove?: (nodeId: string, targetId: string, position: \"before\" | \"after\" | \"inside\") => void;\n renderNode?: (node: TreeNode, isSelected: boolean, isExpanded: boolean) => ReactNode;\n selectedId?: string;\n defaultExpanded?: string[];\n draggable?: boolean;\n indentSize?: number;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\ninterface TreeItemProps {\n node: TreeNode;\n level: number;\n expanded: Set<string>;\n selectedId?: string;\n draggable?: boolean;\n indentSize: number;\n onSelect?: (node: TreeNode) => void;\n onToggle: (nodeId: string) => void;\n onMove?: TreeViewProps[\"onMove\"];\n renderNode?: TreeViewProps[\"renderNode\"];\n dragState: DragState;\n setDragState: React.Dispatch<React.SetStateAction<DragState>>;\n}\n\ninterface DragState {\n draggingId: string | null;\n targetId: string | null;\n position: \"before\" | \"after\" | \"inside\" | null;\n}\n\nfunction TreeItem({\n node,\n level,\n expanded,\n selectedId,\n draggable,\n indentSize,\n onSelect,\n onToggle,\n onMove,\n renderNode,\n dragState,\n setDragState,\n}: TreeItemProps) {\n const hasChildren = node.children && node.children.length > 0;\n const isExpanded = expanded.has(node.id);\n const isSelected = selectedId === node.id;\n const isDragging = dragState.draggingId === node.id;\n const isDropTarget = dragState.targetId === node.id;\n\n const handleDragStart = (e: React.DragEvent) => {\n if (!draggable || node.disabled) return;\n e.dataTransfer.setData(\"text/plain\", node.id);\n e.dataTransfer.effectAllowed = \"move\";\n setDragState((prev) => ({ ...prev, draggingId: node.id }));\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n if (!draggable || !dragState.draggingId || dragState.draggingId === node.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const y = e.clientY - rect.top;\n const height = rect.height;\n\n let position: \"before\" | \"after\" | \"inside\";\n if (y < height * 0.25) position = \"before\";\n else if (y > height * 0.75) position = \"after\";\n else position = \"inside\";\n\n setDragState((prev) => ({ ...prev, targetId: node.id, position }));\n };\n\n const handleDragLeave = () => {\n setDragState((prev) => {\n if (prev.targetId === node.id) return { ...prev, targetId: null, position: null };\n return prev;\n });\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n if (\n !draggable ||\n !dragState.draggingId ||\n !dragState.position ||\n dragState.draggingId === node.id\n )\n return;\n\n onMove?.(dragState.draggingId, node.id, dragState.position);\n setDragState({ draggingId: null, targetId: null, position: null });\n };\n\n const handleDragEnd = () => {\n setDragState({ draggingId: null, targetId: null, position: null });\n };\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined} aria-selected={isSelected}>\n <div\n className={cn(\n \"group flex items-center gap-1 rounded-md px-2 py-1.5 transition-colors\",\n isSelected\n ? \"bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)]\"\n : \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 text-[var(--dashboard-text-primary,#2d2d2d)]\",\n isDragging && \"opacity-40\",\n isDropTarget && dragState.position === \"inside\" && \"ring-2 ring-[var(--dashboard-primary,#37a501)] ring-inset\",\n node.disabled && \"opacity-50 cursor-not-allowed\",\n )}\n style={{ paddingLeft: `${level * indentSize + 4}px` }}\n draggable={draggable && !node.disabled}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n >\n {isDropTarget && dragState.position === \"before\" && (\n <div className=\"absolute left-0 right-0 top-0 h-0.5 bg-[var(--dashboard-primary,#37a501)]\" />\n )}\n {isDropTarget && dragState.position === \"after\" && (\n <div className=\"absolute left-0 right-0 bottom-0 h-0.5 bg-[var(--dashboard-primary,#37a501)]\" />\n )}\n\n {draggable && !node.disabled && (\n <span className=\"flex-shrink-0 opacity-0 group-hover:opacity-60 cursor-grab active:cursor-grabbing\">\n <GripVertical className=\"h-3.5 w-3.5 text-[var(--dashboard-text-secondary,#6b7280)]\" />\n </span>\n )}\n\n <button\n type=\"button\"\n onClick={() => hasChildren && onToggle(node.id)}\n className={cn(\n \"flex-shrink-0 w-5 h-5 flex items-center justify-center rounded transition-transform\",\n hasChildren ? \"cursor-pointer\" : \"invisible\",\n )}\n tabIndex={hasChildren ? 0 : -1}\n aria-label={isExpanded ? \"Recolher\" : \"Expandir\"}\n >\n <ChevronRight\n className={cn(\n \"h-3.5 w-3.5 transition-transform duration-150\",\n isExpanded && \"rotate-90\",\n )}\n />\n </button>\n\n {renderNode ? (\n <div\n className=\"flex-1 min-w-0 cursor-pointer\"\n onClick={() => !node.disabled && onSelect?.(node)}\n >\n {renderNode(node, isSelected, isExpanded)}\n </div>\n ) : (\n <>\n {node.icon && (\n <span className=\"flex-shrink-0 h-4 w-4\">{node.icon}</span>\n )}\n\n <span\n className={cn(\n \"flex-1 min-w-0 text-sm truncate\",\n !node.disabled && \"cursor-pointer\",\n )}\n onClick={() => !node.disabled && onSelect?.(node)}\n >\n {node.label}\n </span>\n\n {node.badge && <span className=\"flex-shrink-0\">{node.badge}</span>}\n\n {node.actions && (\n <span className=\"flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\">\n {node.actions}\n </span>\n )}\n </>\n )}\n </div>\n\n {hasChildren && isExpanded && (\n <ul role=\"group\" className=\"dashboard-animate-expand\">\n {node.children!.map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n level={level + 1}\n expanded={expanded}\n selectedId={selectedId}\n draggable={draggable}\n indentSize={indentSize}\n onSelect={onSelect}\n onToggle={onToggle}\n onMove={onMove}\n renderNode={renderNode}\n dragState={dragState}\n setDragState={setDragState}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nexport function TreeView({\n nodes,\n onSelect,\n onExpand,\n onMove,\n renderNode,\n selectedId,\n defaultExpanded = [],\n draggable = false,\n indentSize = 20,\n className,\n}: TreeViewProps) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set(defaultExpanded));\n const [dragState, setDragState] = useState<DragState>({\n draggingId: null,\n targetId: null,\n position: null,\n });\n\n const handleToggle = useCallback(\n (nodeId: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n const willExpand = !next.has(nodeId);\n if (willExpand) next.add(nodeId);\n else next.delete(nodeId);\n onExpand?.(nodeId, willExpand);\n return next;\n });\n },\n [onExpand],\n );\n\n return (\n <ul role=\"tree\" className={cn(\"select-none\", className)}>\n {nodes.map((node) => (\n <TreeItem\n key={node.id}\n node={node}\n level={0}\n expanded={expanded}\n selectedId={selectedId}\n draggable={draggable}\n indentSize={indentSize}\n onSelect={onSelect}\n onToggle={handleToggle}\n onMove={onMove}\n renderNode={renderNode}\n dragState={dragState}\n setDragState={setDragState}\n />\n ))}\n </ul>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Check, AlertCircle } from \"lucide-react\";\n\nexport interface Step {\n id: string;\n label: string;\n description?: string;\n icon?: ReactNode;\n status?: \"pending\" | \"active\" | \"completed\" | \"error\";\n}\n\nexport interface StepperProps {\n steps: Step[];\n activeStep: number;\n onStepChange?: (index: number) => void;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction StepIcon({ step, index }: { step: Step; index: number }) {\n const status = step.status || \"pending\";\n\n if (status === \"completed\") {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)] text-white flex-shrink-0\">\n <Check className=\"h-4 w-4\" />\n </div>\n );\n }\n\n if (status === \"error\") {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[var(--dashboard-status-danger,#EF4444)] text-white flex-shrink-0\">\n <AlertCircle className=\"h-4 w-4\" />\n </div>\n );\n }\n\n if (status === \"active\") {\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full border-2 border-[var(--dashboard-primary,#37a501)] bg-[var(--dashboard-primary,#37a501)]/10 text-[var(--dashboard-primary,#37a501)] flex-shrink-0\">\n {step.icon || (\n <span className=\"text-sm font-semibold\">{index + 1}</span>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full border-2 border-[var(--dashboard-text-secondary,#6b7280)]/30 text-[var(--dashboard-text-secondary,#6b7280)] flex-shrink-0\">\n {step.icon || (\n <span className=\"text-sm font-medium\">{index + 1}</span>\n )}\n </div>\n );\n}\n\nexport function Stepper({\n steps,\n activeStep,\n onStepChange,\n orientation = \"horizontal\",\n className,\n}: StepperProps) {\n const resolvedSteps = steps.map((step, i) => ({\n ...step,\n status:\n step.status ||\n (i < activeStep ? \"completed\" : i === activeStep ? \"active\" : \"pending\"),\n })) as (Step & { status: \"pending\" | \"active\" | \"completed\" | \"error\" })[];\n\n if (orientation === \"vertical\") {\n return (\n <nav aria-label=\"Progress\" className={className}>\n <ol className=\"flex flex-col\">\n {resolvedSteps.map((step, index) => (\n <li key={step.id} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <button\n type=\"button\"\n onClick={() => onStepChange?.(index)}\n disabled={!onStepChange}\n className={cn(\n \"relative z-10\",\n onStepChange && \"cursor-pointer\",\n !onStepChange && \"cursor-default\",\n )}\n aria-current={step.status === \"active\" ? \"step\" : undefined}\n >\n <StepIcon step={step} index={index} />\n </button>\n {index < resolvedSteps.length - 1 && (\n <div\n className={cn(\n \"w-0.5 flex-1 min-h-[32px]\",\n step.status === \"completed\"\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n />\n )}\n </div>\n\n <div className={cn(\"pb-6\", index === resolvedSteps.length - 1 && \"pb-0\")}>\n <p\n className={cn(\n \"text-sm font-medium leading-8\",\n step.status === \"active\"\n ? \"text-[var(--dashboard-primary,#37a501)]\"\n : step.status === \"completed\"\n ? \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n : step.status === \"error\"\n ? \"text-[var(--dashboard-status-danger,#EF4444)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] mt-0.5\">\n {step.description}\n </p>\n )}\n </div>\n </li>\n ))}\n </ol>\n </nav>\n );\n }\n\n return (\n <nav aria-label=\"Progress\" className={className}>\n <ol className=\"flex items-center\">\n {resolvedSteps.map((step, index) => (\n <li\n key={step.id}\n className={cn(\n \"flex items-center\",\n index < resolvedSteps.length - 1 && \"flex-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => onStepChange?.(index)}\n disabled={!onStepChange}\n className={cn(\n \"flex items-center gap-2 group\",\n onStepChange && \"cursor-pointer\",\n !onStepChange && \"cursor-default\",\n )}\n aria-current={step.status === \"active\" ? \"step\" : undefined}\n >\n <StepIcon step={step} index={index} />\n <div className=\"hidden sm:block text-left\">\n <p\n className={cn(\n \"text-sm font-medium whitespace-nowrap\",\n step.status === \"active\"\n ? \"text-[var(--dashboard-primary,#37a501)]\"\n : step.status === \"completed\"\n ? \"text-[var(--dashboard-text-primary,#2d2d2d)]\"\n : step.status === \"error\"\n ? \"text-[var(--dashboard-status-danger,#EF4444)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)] whitespace-nowrap\">\n {step.description}\n </p>\n )}\n </div>\n </button>\n\n {index < resolvedSteps.length - 1 && (\n <div\n className={cn(\n \"flex-1 h-0.5 mx-3\",\n step.status === \"completed\"\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/20\",\n )}\n />\n )}\n </li>\n ))}\n </ol>\n </nav>\n );\n}\n","\"use client\";\n\nimport React, { useState, useRef, useCallback, useEffect, ReactNode } from \"react\";\nimport { Upload, X, File, Image as ImageIcon } from \"lucide-react\";\n\nexport interface UploadedFile {\n file: File;\n id: string;\n preview?: string;\n progress?: number;\n}\n\nexport interface FileUploadProps {\n accept?: string;\n maxSize?: number;\n multiple?: boolean;\n onUpload?: (files: File[]) => void;\n onRemove?: (fileId: string) => void;\n preview?: boolean;\n disabled?: boolean;\n label?: string;\n description?: string;\n icon?: ReactNode;\n maxFiles?: number;\n className?: string;\n files?: UploadedFile[];\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction isImageType(type: string): boolean {\n return type.startsWith(\"image/\");\n}\n\nexport function FileUpload({\n accept,\n maxSize,\n multiple = false,\n onUpload,\n onRemove,\n preview = true,\n disabled = false,\n label = \"Arraste arquivos aqui ou clique para selecionar\",\n description,\n icon,\n maxFiles,\n className,\n files: controlledFiles,\n}: FileUploadProps) {\n const [internalFiles, setInternalFiles] = useState<UploadedFile[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const files = controlledFiles || internalFiles;\n\n const validateFiles = useCallback(\n (fileList: File[]): File[] => {\n setError(null);\n const valid: File[] = [];\n\n for (const file of fileList) {\n if (maxSize && file.size > maxSize) {\n setError(`\"${file.name}\" excede o limite de ${formatSize(maxSize)}`);\n continue;\n }\n valid.push(file);\n }\n\n if (maxFiles) {\n const available = maxFiles - files.length;\n if (valid.length > available) {\n setError(`Limite de ${maxFiles} arquivos`);\n return valid.slice(0, Math.max(0, available));\n }\n }\n\n return valid;\n },\n [maxSize, maxFiles, files.length],\n );\n\n const addFiles = useCallback(\n (newFiles: File[]) => {\n const validated = validateFiles(newFiles);\n if (validated.length === 0) return;\n\n const uploaded: UploadedFile[] = validated.map((file) => ({\n file,\n id: `${file.name}-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n preview: isImageType(file.type) ? URL.createObjectURL(file) : undefined,\n }));\n\n if (!controlledFiles) {\n setInternalFiles((prev) => (multiple ? [...prev, ...uploaded] : uploaded));\n }\n\n onUpload?.(validated);\n },\n [validateFiles, multiple, onUpload, controlledFiles],\n );\n\n const handleRemove = useCallback(\n (fileId: string) => {\n if (!controlledFiles) {\n setInternalFiles((prev) => {\n const file = prev.find((f) => f.id === fileId);\n if (file?.preview) URL.revokeObjectURL(file.preview);\n return prev.filter((f) => f.id !== fileId);\n });\n }\n onRemove?.(fileId);\n },\n [onRemove, controlledFiles],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n if (disabled) return;\n const droppedFiles = Array.from(e.dataTransfer.files);\n addFiles(droppedFiles);\n },\n [addFiles, disabled],\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n },\n [disabled],\n );\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n }, []);\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const selected = e.target.files ? Array.from(e.target.files) : [];\n addFiles(selected);\n if (inputRef.current) inputRef.current.value = \"\";\n },\n [addFiles],\n );\n\n useEffect(() => {\n return () => {\n internalFiles.forEach((f) => {\n if (f.preview) URL.revokeObjectURL(f.preview);\n });\n };\n }, []);\n\n const descText =\n description ||\n [\n accept && `Formatos: ${accept}`,\n maxSize && `Tamanho max: ${formatSize(maxSize)}`,\n ]\n .filter(Boolean)\n .join(\" | \") ||\n undefined;\n\n return (\n <div className={className}>\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={() => !disabled && inputRef.current?.click()}\n className={cn(\n \"relative flex flex-col items-center justify-center rounded-lg border-2 border-dashed p-6 transition-colors\",\n isDragging\n ? \"border-[var(--dashboard-primary,#37a501)] bg-[var(--dashboard-primary,#37a501)]/5\"\n : \"border-[var(--dashboard-text-secondary,#6b7280)]/30 hover:border-[var(--dashboard-text-secondary,#6b7280)]/50\",\n disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer\",\n )}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={label}\n onKeyDown={(e) => {\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) {\n e.preventDefault();\n inputRef.current?.click();\n }\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleInputChange}\n className=\"hidden\"\n disabled={disabled}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n <div className=\"flex flex-col items-center text-center\">\n {icon || (\n <Upload\n className={cn(\n \"h-8 w-8 mb-3\",\n isDragging\n ? \"text-[var(--dashboard-primary,#37a501)]\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n />\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {label}\n </p>\n {descText && (\n <p className=\"mt-1 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {descText}\n </p>\n )}\n </div>\n </div>\n\n {error && (\n <p className=\"mt-2 text-xs text-[var(--dashboard-status-danger,#EF4444)]\">\n {error}\n </p>\n )}\n\n {preview && files.length > 0 && (\n <ul className=\"mt-3 space-y-2\">\n {files.map((uploaded) => (\n <li\n key={uploaded.id}\n className=\"flex items-center gap-3 rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] p-3\"\n >\n {uploaded.preview ? (\n <img\n src={uploaded.preview}\n alt={uploaded.file.name}\n className=\"h-10 w-10 rounded object-cover flex-shrink-0\"\n />\n ) : (\n <div className=\"flex h-10 w-10 items-center justify-center rounded bg-[var(--dashboard-text-secondary,#6b7280)]/10 flex-shrink-0\">\n {isImageType(uploaded.file.type) ? (\n <ImageIcon className=\"h-5 w-5 text-[var(--dashboard-text-secondary,#6b7280)]\" />\n ) : (\n <File className=\"h-5 w-5 text-[var(--dashboard-text-secondary,#6b7280)]\" />\n )}\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)] truncate\">\n {uploaded.file.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {formatSize(uploaded.file.size)}\n </p>\n {uploaded.progress !== undefined && uploaded.progress < 100 && (\n <div className=\"mt-1 h-1 w-full rounded-full bg-[var(--dashboard-text-secondary,#6b7280)]/10 overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--dashboard-primary,#37a501)] transition-all duration-300\"\n style={{ width: `${uploaded.progress}%` }}\n />\n </div>\n )}\n </div>\n\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(uploaded.id);\n }}\n className=\"flex-shrink-0 rounded-md p-1 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 transition-colors cursor-pointer\"\n aria-label={`Remover ${uploaded.file.name}`}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n ReactNode,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface TooltipProps {\n content: ReactNode;\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n delay?: number;\n children: ReactNode;\n className?: string;\n maxWidth?: number;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Tooltip({\n content,\n position = \"top\",\n delay = 200,\n children,\n className,\n maxWidth = 240,\n}: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const [positioned, setPositioned] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const [actualPosition, setActualPosition] = useState(position);\n const triggerRef = useRef<HTMLElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const idRef = useRef(`tooltip-${Math.random().toString(36).slice(2, 9)}`);\n\n const calculatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current) return;\n\n const trigger = triggerRef.current.getBoundingClientRect();\n const tooltip = tooltipRef.current.getBoundingClientRect();\n const gap = 8;\n\n let top = 0;\n let left = 0;\n let resolvedPosition = position;\n\n // Calculate preferred position\n switch (position) {\n case \"top\":\n top = trigger.top - tooltip.height - gap;\n left = trigger.left + trigger.width / 2 - tooltip.width / 2;\n break;\n case \"bottom\":\n top = trigger.bottom + gap;\n left = trigger.left + trigger.width / 2 - tooltip.width / 2;\n break;\n case \"left\":\n top = trigger.top + trigger.height / 2 - tooltip.height / 2;\n left = trigger.left - tooltip.width - gap;\n break;\n case \"right\":\n top = trigger.top + trigger.height / 2 - tooltip.height / 2;\n left = trigger.right + gap;\n break;\n }\n\n // Flip vertically if overflows\n if (position === \"top\" && top < 8) {\n top = trigger.bottom + gap;\n resolvedPosition = \"bottom\";\n } else if (\n position === \"bottom\" &&\n top + tooltip.height > window.innerHeight - 8\n ) {\n top = trigger.top - tooltip.height - gap;\n resolvedPosition = \"top\";\n }\n\n // Clamp to viewport\n left = Math.max(8, Math.min(left, window.innerWidth - tooltip.width - 8));\n top = Math.max(8, Math.min(top, window.innerHeight - tooltip.height - 8));\n\n setCoords({ top, left });\n setActualPosition(resolvedPosition);\n setPositioned(true);\n }, [position]);\n\n const show = useCallback(() => {\n timeoutRef.current = setTimeout(() => {\n setVisible(true);\n setPositioned(false);\n }, delay);\n }, [delay]);\n\n const hide = useCallback(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setVisible(false);\n setPositioned(false);\n }, []);\n\n useEffect(() => {\n if (visible) {\n // Double rAF to ensure the portal is painted before measuring\n requestAnimationFrame(() => {\n requestAnimationFrame(calculatePosition);\n });\n }\n }, [visible, calculatePosition]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n // Attach events to child without wrapping in a span — zero layout impact\n let trigger: ReactNode;\n if (isValidElement(children)) {\n trigger = cloneElement(children as React.ReactElement<any>, {\n ref: triggerRef,\n onMouseEnter: (e: React.MouseEvent) => {\n show();\n (children as any).props?.onMouseEnter?.(e);\n },\n onMouseLeave: (e: React.MouseEvent) => {\n hide();\n (children as any).props?.onMouseLeave?.(e);\n },\n onFocus: (e: React.FocusEvent) => {\n show();\n (children as any).props?.onFocus?.(e);\n },\n onBlur: (e: React.FocusEvent) => {\n hide();\n (children as any).props?.onBlur?.(e);\n },\n \"aria-describedby\": visible ? idRef.current : undefined,\n });\n } else {\n // Fallback: wrap primitives (strings, numbers) in a span\n trigger = (\n <span\n ref={triggerRef as React.RefObject<HTMLSpanElement>}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n aria-describedby={visible ? idRef.current : undefined}\n className=\"inline-flex\"\n >\n {children}\n </span>\n );\n }\n\n // Arrow styles per position\n const arrowClass: Record<string, string> = {\n top: \"left-1/2 -translate-x-1/2 top-full border-t-[var(--dashboard-tooltip-bg,#1a1a1a)] border-x-transparent border-b-transparent\",\n bottom:\n \"left-1/2 -translate-x-1/2 bottom-full border-b-[var(--dashboard-tooltip-bg,#1a1a1a)] border-x-transparent border-t-transparent\",\n left: \"top-1/2 -translate-y-1/2 left-full border-l-[var(--dashboard-tooltip-bg,#1a1a1a)] border-y-transparent border-r-transparent\",\n right:\n \"top-1/2 -translate-y-1/2 right-full border-r-[var(--dashboard-tooltip-bg,#1a1a1a)] border-y-transparent border-l-transparent\",\n };\n\n return (\n <>\n {trigger}\n {visible &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n ref={tooltipRef}\n id={idRef.current}\n role=\"tooltip\"\n className={cn(\n \"fixed z-[10002] rounded-md px-3 py-2 text-xs font-medium\",\n \"bg-[var(--dashboard-tooltip-bg,#1a1a1a)] text-[var(--dashboard-tooltip-text,#ffffff)]\",\n \"shadow-lg pointer-events-none\",\n positioned && \"dashboard-animate-fade-in\",\n className,\n )}\n style={{\n top: coords.top,\n left: coords.left,\n maxWidth,\n opacity: positioned ? 1 : 0,\n }}\n >\n {content}\n {/* Arrow */}\n <span\n className={cn(\n \"absolute w-0 h-0 border-[5px]\",\n arrowClass[actualPosition],\n )}\n />\n </div>,\n document.body,\n )}\n </>\n );\n}\n","\"use client\";\n\nimport React, { ReactNode } from \"react\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport interface InfoTooltipProps {\n /** The explanation text shown on hover */\n content: ReactNode;\n /** Optional short label (term/acronym) rendered bold before the explanation */\n term?: string;\n /** Icon size in pixels. Default: 14 */\n size?: number;\n /** Tooltip position. Default: \"top\" */\n position?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Max width of the tooltip popup. Default: 280 */\n maxWidth?: number;\n /** Additional CSS classes for the icon wrapper */\n className?: string;\n}\n\nexport function InfoTooltip({\n content,\n term,\n size = 14,\n position = \"top\",\n maxWidth = 280,\n className,\n}: InfoTooltipProps) {\n const tooltipContent = term ? (\n <span className=\"text-xs leading-relaxed\">\n <strong>{term}</strong> — {content}\n </span>\n ) : (\n <span className=\"text-xs leading-relaxed\">{content}</span>\n );\n\n return (\n <Tooltip content={tooltipContent} position={position} maxWidth={maxWidth}>\n <button\n type=\"button\"\n tabIndex={0}\n aria-label={term ? `Informação sobre ${term}` : \"Mais informações\"}\n className={[\n \"inline-flex items-center justify-center rounded-full\",\n \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n \"hover:text-[var(--dashboard-text-primary,#2d2d2d)]\",\n \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n \"transition-colors duration-150 cursor-help\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--dashboard-primary,#2563EB)]/40\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{ width: size + 6, height: size + 6 }}\n >\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n </button>\n </Tooltip>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { ChevronRight } from \"lucide-react\";\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n icon?: ReactNode;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n separator?: ReactNode;\n onNavigate?: (href: string) => void;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Breadcrumb({\n items,\n separator,\n onNavigate,\n className,\n}: BreadcrumbProps) {\n const defaultSeparator = (\n <ChevronRight className=\"h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)] flex-shrink-0\" />\n );\n\n const handleClick = (e: React.MouseEvent, href?: string) => {\n if (href && onNavigate) {\n e.preventDefault();\n onNavigate(href);\n }\n };\n\n return (\n <nav aria-label=\"Breadcrumb\" className={className}>\n <ol className=\"flex items-center gap-1.5 flex-wrap\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={index} className=\"flex items-center gap-1.5\">\n {index > 0 && (\n <span aria-hidden=\"true\">\n {separator || defaultSeparator}\n </span>\n )}\n\n {isLast ? (\n <span\n className={cn(\n \"flex items-center gap-1.5 text-sm font-medium\",\n \"text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n aria-current=\"page\"\n >\n {item.icon && (\n <span className=\"flex-shrink-0 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </span>\n ) : (\n <a\n href={item.href || \"#\"}\n onClick={(e) => handleClick(e, item.href)}\n className={cn(\n \"flex items-center gap-1.5 text-sm\",\n \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n \"hover:text-[var(--dashboard-primary,#37a501)] transition-colors\",\n )}\n >\n {item.icon && (\n <span className=\"flex-shrink-0 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </a>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","\"use client\";\n\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown, X, Check, Search } from \"lucide-react\";\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n value?: string | string[];\n onChange: (value: string | string[]) => void;\n multiple?: boolean;\n searchable?: boolean;\n placeholder?: string;\n label?: string;\n error?: string;\n disabled?: boolean;\n renderOption?: (option: ComboboxOption, isSelected: boolean) => ReactNode;\n noResultsText?: string;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function Combobox({\n options,\n value,\n onChange,\n multiple = false,\n searchable = true,\n placeholder = \"Selecione...\",\n label,\n error,\n disabled = false,\n renderOption,\n noResultsText = \"Nenhum resultado encontrado\",\n className,\n}: ComboboxProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [position, setPosition] = useState({ top: 0, left: 0, width: 0 });\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n const selectedValues = useMemo(() => {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n const filtered = useMemo(() => {\n if (!query) return options;\n const lower = query.toLowerCase();\n return options.filter((o) => o.label.toLowerCase().includes(lower));\n }, [options, query]);\n\n const calculatePosition = useCallback(() => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setPosition({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }, []);\n\n const open = useCallback(() => {\n if (disabled) return;\n calculatePosition();\n setIsOpen(true);\n setFocusedIndex(-1);\n setTimeout(() => inputRef.current?.focus(), 0);\n }, [disabled, calculatePosition]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setQuery(\"\");\n setFocusedIndex(-1);\n }, []);\n\n const toggleOption = useCallback(\n (optionValue: string) => {\n if (multiple) {\n const current = selectedValues;\n const next = current.includes(optionValue)\n ? current.filter((v) => v !== optionValue)\n : [...current, optionValue];\n onChange(next);\n } else {\n onChange(optionValue);\n close();\n }\n },\n [multiple, selectedValues, onChange, close],\n );\n\n const removeValue = useCallback(\n (val: string, e?: React.MouseEvent) => {\n e?.stopPropagation();\n if (multiple) {\n onChange(selectedValues.filter((v) => v !== val));\n } else {\n onChange(multiple ? [] : \"\");\n }\n },\n [multiple, selectedValues, onChange],\n );\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClick = (e: MouseEvent) => {\n const portal = document.querySelector(\".dc-combobox-portal\");\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node) &&\n (!portal || !portal.contains(e.target as Node))\n ) {\n close();\n }\n };\n\n const handleScroll = (e: Event) => {\n const portal = document.querySelector(\".dc-combobox-portal\");\n if (!portal || !portal.contains(e.target as Node)) {\n close();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClick);\n window.addEventListener(\"scroll\", handleScroll, true);\n window.addEventListener(\"resize\", close);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n window.removeEventListener(\"scroll\", handleScroll, true);\n window.removeEventListener(\"resize\", close);\n };\n }, [isOpen, close]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n open();\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setFocusedIndex((prev) => {\n const next = prev + 1;\n return next >= filtered.length ? 0 : next;\n });\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setFocusedIndex((prev) => {\n const next = prev - 1;\n return next < 0 ? filtered.length - 1 : next;\n });\n break;\n case \"Enter\":\n e.preventDefault();\n if (focusedIndex >= 0 && filtered[focusedIndex] && !filtered[focusedIndex].disabled) {\n toggleOption(filtered[focusedIndex].value);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n close();\n break;\n }\n },\n [isOpen, open, close, filtered, focusedIndex, toggleOption],\n );\n\n useEffect(() => {\n if (focusedIndex >= 0 && listRef.current) {\n const item = listRef.current.children[focusedIndex] as HTMLElement;\n item?.scrollIntoView({ block: \"nearest\" });\n }\n }, [focusedIndex]);\n\n const selectedLabels = selectedValues\n .map((v) => options.find((o) => o.value === v)?.label)\n .filter(Boolean) as string[];\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n {label && (\n <label className=\"block text-sm text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {label}\n </label>\n )}\n\n <div ref={containerRef} onKeyDown={handleKeyDown}>\n <div\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls=\"combobox-listbox\"\n tabIndex={disabled ? -1 : 0}\n onClick={() => (isOpen ? close() : open())}\n className={cn(\n \"flex min-h-[40px] w-full items-center gap-2 rounded-lg border px-3 py-2 transition-colors\",\n isOpen\n ? \"border-[var(--dashboard-primary,#37a501)] ring-2 ring-[var(--dashboard-primary,#37a501)]/20\"\n : error\n ? \"border-[var(--dashboard-status-danger,#EF4444)]\"\n : \"border-[var(--dashboard-text-secondary,#6b7280)]/30 hover:border-[var(--dashboard-text-secondary,#6b7280)]/50\",\n disabled\n ? \"opacity-50 cursor-not-allowed bg-[var(--dashboard-text-secondary,#6b7280)]/10\"\n : \"cursor-pointer bg-[var(--dashboard-surface,#ffffff)]\",\n )}\n >\n <div className=\"flex flex-1 flex-wrap items-center gap-1 min-w-0\">\n {multiple && selectedLabels.length > 0 ? (\n selectedLabels.map((lbl, i) => (\n <span\n key={selectedValues[i]}\n className=\"inline-flex items-center gap-1 rounded-md bg-[var(--dashboard-primary,#37a501)]/10 px-2 py-0.5 text-xs font-medium text-[var(--dashboard-primary,#37a501)]\"\n >\n {lbl}\n <button\n type=\"button\"\n onClick={(e) => removeValue(selectedValues[i], e)}\n className=\"rounded-sm hover:bg-[var(--dashboard-primary,#37a501)]/20 cursor-pointer\"\n aria-label={`Remover ${lbl}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))\n ) : !multiple && selectedLabels.length === 1 ? (\n <span className=\"text-sm text-[var(--dashboard-text-primary,#2d2d2d)] truncate\">\n {selectedLabels[0]}\n </span>\n ) : (\n <span className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {placeholder}\n </span>\n )}\n </div>\n\n {!multiple && selectedValues.length > 0 && (\n <button\n type=\"button\"\n onClick={(e) => removeValue(selectedValues[0], e)}\n className=\"flex-shrink-0 rounded-md p-0.5 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 cursor-pointer\"\n aria-label=\"Limpar seleção\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n <ChevronDown\n className={cn(\n \"h-4 w-4 flex-shrink-0 text-[var(--dashboard-text-secondary,#6b7280)] transition-transform\",\n isOpen && \"rotate-180\",\n )}\n />\n </div>\n\n {isOpen &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n className=\"dc-combobox-portal rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] shadow-lg dashboard-animate-fade-in overflow-hidden\"\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n width: position.width,\n zIndex: 10001,\n }}\n >\n {searchable && (\n <div className=\"flex items-center gap-2 border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 px-3 py-2\">\n <Search className=\"h-4 w-4 text-[var(--dashboard-text-secondary,#6b7280)] flex-shrink-0\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setFocusedIndex(-1);\n }}\n placeholder=\"Buscar...\"\n className=\"flex-1 bg-transparent text-sm text-[var(--dashboard-text-primary,#2d2d2d)] placeholder:text-[var(--dashboard-text-secondary,#6b7280)] outline-none\"\n aria-label=\"Buscar opções\"\n />\n </div>\n )}\n\n <ul\n ref={listRef}\n id=\"combobox-listbox\"\n role=\"listbox\"\n aria-multiselectable={multiple}\n className=\"max-h-60 overflow-y-auto py-1\"\n >\n {filtered.length === 0 ? (\n <li className=\"px-3 py-3 text-center text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {noResultsText}\n </li>\n ) : (\n filtered.map((option, index) => {\n const isSelected = selectedValues.includes(option.value);\n const isFocused = index === focusedIndex;\n\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n data-modal-ignore\n onClick={() => {\n if (!option.disabled) toggleOption(option.value);\n }}\n className={cn(\n \"flex items-center justify-between px-3 py-2 text-sm transition-colors\",\n option.disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"cursor-pointer\",\n isFocused && \"bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n !isFocused &&\n !option.disabled &&\n \"hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10\",\n isSelected\n ? \"text-[var(--dashboard-primary,#37a501)] font-medium\"\n : \"text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {renderOption ? (\n renderOption(option, isSelected)\n ) : (\n <>\n <span className=\"truncate\">{option.label}</span>\n {isSelected && (\n <Check className=\"h-4 w-4 flex-shrink-0 text-[var(--dashboard-primary,#37a501)]\" />\n )}\n </>\n )}\n </li>\n );\n })\n )}\n </ul>\n </div>,\n document.body,\n )}\n </div>\n\n {error && (\n <p className=\"text-xs text-[var(--dashboard-status-danger,#EF4444)]\">{error}</p>\n )}\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { X, Info, CheckCircle, AlertTriangle, AlertOctagon } from \"lucide-react\";\n\nexport interface AlertProps {\n variant?: \"info\" | \"success\" | \"warning\" | \"danger\";\n title?: string;\n description?: ReactNode;\n onClose?: () => void;\n actions?: ReactNode;\n icon?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst variantConfig: Record<\n string,\n { border: string; bg: string; text: string; icon: ReactNode }\n> = {\n info: {\n border: \"border-[var(--dashboard-status-info,#3b82f6)]\",\n bg: \"bg-[var(--dashboard-status-info,#3b82f6)]/5\",\n text: \"text-[var(--dashboard-status-info,#3b82f6)]\",\n icon: <Info className=\"h-5 w-5\" />,\n },\n success: {\n border: \"border-[var(--dashboard-status-success,#10B981)]\",\n bg: \"bg-[var(--dashboard-status-success,#10B981)]/5\",\n text: \"text-[var(--dashboard-status-success,#10B981)]\",\n icon: <CheckCircle className=\"h-5 w-5\" />,\n },\n warning: {\n border: \"border-[var(--dashboard-status-warning,#f59e0b)]\",\n bg: \"bg-[var(--dashboard-status-warning,#f59e0b)]/5\",\n text: \"text-[var(--dashboard-status-warning,#f59e0b)]\",\n icon: <AlertTriangle className=\"h-5 w-5\" />,\n },\n danger: {\n border: \"border-[var(--dashboard-status-danger,#EF4444)]\",\n bg: \"bg-[var(--dashboard-status-danger,#EF4444)]/5\",\n text: \"text-[var(--dashboard-status-danger,#EF4444)]\",\n icon: <AlertOctagon className=\"h-5 w-5\" />,\n },\n};\n\nexport function Alert({\n variant = \"info\",\n title,\n description,\n onClose,\n actions,\n icon,\n className,\n}: AlertProps) {\n const config = variantConfig[variant];\n\n return (\n <div\n className={cn(\n \"rounded-lg border-l-4 p-4\",\n config.border,\n config.bg,\n className,\n )}\n role=\"alert\"\n >\n <div className=\"flex gap-3\">\n <div className={cn(\"flex-shrink-0 mt-0.5\", config.text)}>\n {icon || config.icon}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h3\n className={cn(\n \"text-sm font-semibold\",\n \"text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {title}\n </h3>\n )}\n {description && (\n <div\n className={cn(\n \"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\",\n title && \"mt-1\",\n )}\n >\n {description}\n </div>\n )}\n {actions && <div className=\"mt-3 flex gap-2\">{actions}</div>}\n </div>\n\n {onClose && (\n <button\n onClick={onClose}\n className=\"flex-shrink-0 rounded-md p-1 text-[var(--dashboard-text-secondary,#6b7280)] hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 transition-colors cursor-pointer\"\n aria-label=\"Fechar alerta\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Info, AlertTriangle, Lightbulb, ShieldAlert } from \"lucide-react\";\n\nexport interface CalloutProps {\n variant?: \"info\" | \"warning\" | \"tip\" | \"danger\";\n title?: string;\n children?: ReactNode;\n icon?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst variantConfig: Record<\n string,\n { border: string; bg: string; text: string; icon: ReactNode }\n> = {\n info: {\n border: \"border-[var(--dashboard-status-info,#3b82f6)]\",\n bg: \"bg-[var(--dashboard-status-info,#3b82f6)]/5\",\n text: \"text-[var(--dashboard-status-info,#3b82f6)]\",\n icon: <Info className=\"h-4 w-4\" />,\n },\n warning: {\n border: \"border-[var(--dashboard-status-warning,#f59e0b)]\",\n bg: \"bg-[var(--dashboard-status-warning,#f59e0b)]/5\",\n text: \"text-[var(--dashboard-status-warning,#f59e0b)]\",\n icon: <AlertTriangle className=\"h-4 w-4\" />,\n },\n tip: {\n border: \"border-[var(--dashboard-status-success,#10B981)]\",\n bg: \"bg-[var(--dashboard-status-success,#10B981)]/5\",\n text: \"text-[var(--dashboard-status-success,#10B981)]\",\n icon: <Lightbulb className=\"h-4 w-4\" />,\n },\n danger: {\n border: \"border-[var(--dashboard-status-danger,#EF4444)]\",\n bg: \"bg-[var(--dashboard-status-danger,#EF4444)]/5\",\n text: \"text-[var(--dashboard-status-danger,#EF4444)]\",\n icon: <ShieldAlert className=\"h-4 w-4\" />,\n },\n};\n\nexport function Callout({\n variant = \"info\",\n title,\n children,\n icon,\n className,\n}: CalloutProps) {\n const config = variantConfig[variant];\n\n return (\n <div\n className={cn(\n \"rounded-lg border-l-4 p-4 my-4\",\n config.border,\n config.bg,\n className,\n )}\n role=\"note\"\n >\n <div className=\"flex gap-3\">\n <div className={cn(\"flex-shrink-0 mt-0.5\", config.text)}>\n {icon || config.icon}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {title && (\n <p\n className={cn(\n \"text-sm font-semibold\",\n \"text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {title}\n </p>\n )}\n {children && (\n <div\n className={cn(\n \"text-sm text-[var(--dashboard-text-secondary,#6b7280)]\",\n title && \"mt-1\",\n )}\n >\n {children}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { Copy, Check } from \"lucide-react\";\n\nexport interface CodeBlockProps {\n code: string;\n language?: string;\n filename?: string;\n showLineNumbers?: boolean;\n className?: string;\n copyLabel?: string;\n copiedLabel?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function CodeBlock({\n code,\n language,\n filename,\n showLineNumbers = false,\n className,\n copyLabel = \"Copiar\",\n copiedLabel = \"Copiado!\",\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // clipboard API not available\n }\n }, [code]);\n\n const lines = code.split(\"\\n\");\n\n return (\n <div\n className={cn(\n \"relative rounded-lg overflow-hidden border border-[var(--dashboard-text-secondary,#64748B)]/12 my-4\",\n className,\n )}\n >\n {(filename || language) && (\n <div className=\"flex items-center justify-between px-4 py-2 bg-[var(--dashboard-text-primary,#0F172A)] border-b border-[var(--dashboard-text-secondary,#64748B)]/20\">\n {filename && (\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#64748B)] font-mono\">\n {filename}\n </span>\n )}\n {language && !filename && <span />}\n {language && (\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#64748B)]/60\">\n {language}\n </span>\n )}\n </div>\n )}\n\n <div className=\"relative\">\n <pre\n className=\"overflow-x-auto p-4 bg-[var(--dashboard-text-primary,#0F172A)] m-0\"\n data-language={language}\n >\n <code className=\"text-sm font-mono leading-relaxed text-[var(--dashboard-surface,#FFFFFF)]/90\">\n {showLineNumbers\n ? lines.map((line, i) => (\n <span key={i} className=\"table-row\">\n <span className=\"table-cell pr-4 text-right select-none text-[var(--dashboard-text-secondary,#64748B)]/40 text-xs w-8\">\n {i + 1}\n </span>\n <span className=\"table-cell\">\n {line}\n {\"\\n\"}\n </span>\n </span>\n ))\n : code}\n </code>\n </pre>\n\n <button\n onClick={handleCopy}\n className={cn(\n \"absolute top-3 right-3 flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-all duration-200 cursor-pointer\",\n copied\n ? \"bg-[var(--dashboard-status-success,#059669)]/20 text-[var(--dashboard-status-success,#059669)]\"\n : \"bg-[var(--dashboard-surface,#FFFFFF)]/10 text-[var(--dashboard-surface,#FFFFFF)]/60 hover:bg-[var(--dashboard-surface,#FFFFFF)]/20 hover:text-[var(--dashboard-surface,#FFFFFF)]/80\",\n )}\n aria-label={copied ? copiedLabel : copyLabel}\n title={copied ? copiedLabel : copyLabel}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" />\n )}\n <span>{copied ? copiedLabel : copyLabel}</span>\n </button>\n </div>\n </div>\n );\n}\n","import React, { ReactNode } from \"react\";\nimport { Inbox } from \"lucide-react\";\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-12 px-6 text-center\",\n className,\n )}\n >\n <div className=\"flex h-16 w-16 items-center justify-center rounded-full bg-[var(--dashboard-text-secondary,#6b7280)]/10 mb-4\">\n {icon || (\n <Inbox className=\"h-8 w-8 text-[var(--dashboard-text-secondary,#6b7280)]\" />\n )}\n </div>\n\n <h3 className=\"text-lg font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h3>\n\n {description && (\n <p className=\"mt-2 max-w-sm text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {description}\n </p>\n )}\n\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface StatusBadgeProps {\n status: string;\n colorMap?: Record<string, string>;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n dot?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nconst defaultColorMap: Record<string, string> = {\n ACTIVE: \"var(--dashboard-status-success,#10B981)\",\n APPROVED: \"var(--dashboard-status-success,#10B981)\",\n COMPLETED: \"var(--dashboard-status-success,#10B981)\",\n DELIVERED: \"var(--dashboard-status-success,#10B981)\",\n SUCCESS: \"var(--dashboard-status-success,#10B981)\",\n PENDING: \"var(--dashboard-status-warning,#f59e0b)\",\n IN_REVIEW: \"var(--dashboard-status-warning,#f59e0b)\",\n AWAITING: \"var(--dashboard-status-warning,#f59e0b)\",\n DRAFT: \"var(--dashboard-status-warning,#f59e0b)\",\n PROCESSING: \"var(--dashboard-status-info,#3b82f6)\",\n IN_PROGRESS: \"var(--dashboard-status-info,#3b82f6)\",\n SENT: \"var(--dashboard-status-info,#3b82f6)\",\n QUOTED: \"var(--dashboard-status-info,#3b82f6)\",\n CANCELLED: \"var(--dashboard-status-danger,#EF4444)\",\n REJECTED: \"var(--dashboard-status-danger,#EF4444)\",\n EXPIRED: \"var(--dashboard-status-danger,#EF4444)\",\n ERROR: \"var(--dashboard-status-danger,#EF4444)\",\n INACTIVE: \"var(--dashboard-text-secondary,#6b7280)\",\n ARCHIVED: \"var(--dashboard-text-secondary,#6b7280)\",\n};\n\nconst sizeClasses: Record<string, string> = {\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-2.5 py-1 text-sm\",\n lg: \"px-3 py-1 text-sm\",\n};\n\nconst dotSizeClasses: Record<string, string> = {\n sm: \"h-1.5 w-1.5\",\n md: \"h-2 w-2\",\n lg: \"h-2.5 w-2.5\",\n};\n\nfunction formatLabel(status: string): string {\n return status\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport function StatusBadge({\n status,\n colorMap,\n size = \"md\",\n label,\n dot = true,\n className,\n}: StatusBadgeProps) {\n const merged = { ...defaultColorMap, ...colorMap };\n const normalizedStatus = status.toUpperCase().replace(/[\\s-]/g, \"_\");\n const color = merged[normalizedStatus] || \"var(--dashboard-text-secondary,#6b7280)\";\n const displayLabel = label || formatLabel(status);\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full font-medium whitespace-nowrap\",\n sizeClasses[size],\n className,\n )}\n style={{\n color,\n backgroundColor: `color-mix(in srgb, ${color} 12%, transparent)`,\n }}\n >\n {dot && (\n <span\n className={cn(\"rounded-full flex-shrink-0\", dotSizeClasses[size])}\n style={{ backgroundColor: color }}\n />\n )}\n {displayLabel}\n </span>\n );\n}\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\n\ntype ColorValue = React.CSSProperties[\"color\"];\ntype StyleMap = Record<string, React.CSSProperties>;\n\nexport interface IPhoneMockupProps {\n screenWidth: number;\n screenType?: \"legacy\" | \"notch\" | \"island\";\n isLandscape?: boolean;\n className?: string;\n containerStyle?: React.CSSProperties;\n containerStlye?: React.CSSProperties;\n frameColor?: ColorValue;\n frameOnly?: boolean;\n statusbarColor?: ColorValue;\n hideStatusBar?: boolean;\n transparentNavBar?: boolean;\n hideNavBar?: boolean;\n children?: React.ReactNode;\n}\n\ninterface IosVariantProps {\n screenWidth: number;\n frameColor: ColorValue;\n frameOnly: boolean;\n statusbarColor: ColorValue;\n hideStatusBar: boolean;\n transparentNavigationBar: boolean;\n hideNavigationBar: boolean;\n children?: React.ReactNode;\n}\n\ninterface StyleParams {\n screenType: \"notch\" | \"island\";\n isLandscape: boolean;\n getSizeWithRatio: (size: number) => number;\n screenWidth: number;\n mockupHeight: number;\n frameColor: ColorValue;\n frameWidth: number;\n statusbarColor: ColorValue;\n frameOnly: boolean;\n bezelRadius: number;\n}\n\ninterface LegacyStyleParams {\n isLandscape: boolean;\n getSizeWithRatio: (size: number) => number;\n screenWidth: number;\n mockupHeight: number;\n frameColor: ColorValue;\n statusbarColor: ColorValue;\n frameOnly: boolean;\n}\n\nexport function IPhoneMockup({\n screenWidth,\n screenType = \"island\",\n isLandscape = false,\n frameColor = \"#666666\",\n frameOnly = false,\n statusbarColor = \"#CCCCCC\",\n hideStatusBar = false,\n transparentNavBar = false,\n hideNavBar = false,\n className,\n containerStyle,\n containerStlye,\n children,\n}: IPhoneMockupProps) {\n const Mockup = useMemo(() => {\n if (screenType === \"legacy\") {\n return isLandscape ? IPhoneLegacyLandscape : IPhoneLegacyPortrait;\n }\n\n if (screenType === \"notch\") {\n return isLandscape ? IPhoneNotchLandscape : IPhoneNotchPortrait;\n }\n\n return isLandscape ? IPhoneIslandLandscape : IPhoneIslandPortrait;\n }, [isLandscape, screenType]);\n\n return (\n <div className={className} style={containerStyle ?? containerStlye}>\n <Mockup\n screenWidth={screenWidth}\n frameColor={frameColor}\n frameOnly={frameOnly}\n statusbarColor={statusbarColor}\n hideStatusBar={hideStatusBar}\n transparentNavigationBar={transparentNavBar}\n hideNavigationBar={hideNavBar}\n >\n {children}\n </Mockup>\n </div>\n );\n}\n\nfunction createStyles(styles: StyleMap): StyleMap {\n return styles;\n}\n\nfunction getStyles({\n screenType,\n isLandscape,\n getSizeWithRatio,\n screenWidth,\n mockupHeight,\n frameColor,\n frameWidth,\n statusbarColor,\n frameOnly,\n bezelRadius,\n}: StyleParams) {\n const frameWidthValue = frameWidth;\n const halfFrameWidth = Math.floor(frameWidthValue / 2);\n const widthAndFrame = screenWidth + frameWidthValue * 2;\n const heightAndFrame = mockupHeight + frameWidthValue * 2;\n const frameButtonSize = Math.floor(frameWidthValue * 0.9);\n const frameButtonPosition =\n (isLandscape ? mockupHeight : screenWidth) +\n frameWidthValue +\n halfFrameWidth +\n frameButtonSize -\n halfFrameWidth;\n\n const paddingRight = frameOnly\n ? 0\n : isLandscape\n ? 0\n : frameButtonSize - halfFrameWidth;\n const paddingLeft = paddingRight;\n const paddingTop = frameOnly\n ? 0\n : isLandscape\n ? frameButtonSize - halfFrameWidth\n : 0;\n const paddingBottom = paddingTop;\n\n const isIsland = screenType === \"island\";\n const topInset = isLandscape\n ? 0\n : getSizeWithRatio(isIsland ? 59 : 44);\n const leftInset = isLandscape ? getSizeWithRatio(isIsland ? 59 : 44) : 0;\n const rightInset = leftInset;\n const bottomInset = isLandscape ? getSizeWithRatio(21) : getSizeWithRatio(34);\n const powerPosition = getSizeWithRatio(isIsland ? 280 : 250);\n\n return createStyles({\n container: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n boxSizing: \"content-box\",\n position: \"relative\",\n width: widthAndFrame,\n height: heightAndFrame,\n paddingRight,\n paddingLeft,\n paddingTop,\n paddingBottom,\n },\n frame: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n boxSizing: \"border-box\",\n borderRadius: bezelRadius,\n borderStyle: \"solid\",\n borderWidth: frameWidthValue,\n borderColor: frameColor,\n overflow: \"hidden\",\n },\n screen: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n position: \"relative\",\n width: screenWidth,\n height: mockupHeight,\n backgroundColor: \"transparent\",\n overflow: \"hidden\",\n },\n notchContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n width: isLandscape ? leftInset : \"100%\",\n height: isLandscape ? \"100%\" : topInset,\n backgroundColor: statusbarColor,\n alignItems: isLandscape ? \"flex-start\" : \"center\",\n justifyContent: isLandscape ? \"center\" : \"flex-start\",\n },\n notchContainerFullScreen: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"absolute\",\n width: isLandscape ? leftInset : \"100%\",\n height: isLandscape ? \"100%\" : topInset,\n alignItems: isLandscape ? \"flex-start\" : \"center\",\n justifyContent: isLandscape ? \"center\" : \"flex-start\",\n pointerEvents: \"none\",\n },\n safeAreaRight: {\n width: rightInset,\n height: \"100%\",\n backgroundColor: statusbarColor,\n },\n island: {\n width: isLandscape ? getSizeWithRatio(35) : getSizeWithRatio(128),\n height: isLandscape ? getSizeWithRatio(128) : getSizeWithRatio(35),\n backgroundColor: frameColor,\n borderRadius: getSizeWithRatio(50),\n marginTop: isLandscape ? undefined : getSizeWithRatio(13),\n marginLeft: isLandscape ? getSizeWithRatio(13) : undefined,\n },\n notch: {\n width: isLandscape ? getSizeWithRatio(31) : getSizeWithRatio(160),\n height: isLandscape ? getSizeWithRatio(160) : getSizeWithRatio(31),\n backgroundColor: frameColor,\n borderBottomLeftRadius: isLandscape ? 0 : getSizeWithRatio(20),\n borderBottomRightRadius: getSizeWithRatio(20),\n borderTopRightRadius: isLandscape ? getSizeWithRatio(20) : 0,\n },\n swipeContainer: {\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: bottomInset,\n backgroundColor: statusbarColor,\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n },\n swipeContainerFullScreen: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"absolute\",\n bottom: 0,\n width: \"100%\",\n height: bottomInset,\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n pointerEvents: \"none\",\n },\n swipeBar: {\n backgroundColor: frameColor,\n borderRadius: getSizeWithRatio(100),\n width: isLandscape ? getSizeWithRatio(230) : \"35%\",\n height: getSizeWithRatio(7),\n marginBottom: isLandscape ? getSizeWithRatio(5) : getSizeWithRatio(10),\n },\n silenceSwitch: {\n position: \"absolute\",\n borderRadius: frameWidthValue,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(165),\n left: isLandscape ? getSizeWithRatio(165) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(34) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(34),\n backgroundColor: frameColor,\n },\n volumeUp: {\n position: \"absolute\",\n borderRadius: frameWidthValue,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(230),\n left: isLandscape ? getSizeWithRatio(230) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(65) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(65),\n backgroundColor: frameColor,\n },\n volumeDown: {\n position: \"absolute\",\n borderRadius: frameWidthValue,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(315),\n left: isLandscape ? getSizeWithRatio(315) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(65) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(65),\n backgroundColor: frameColor,\n },\n power: {\n position: \"absolute\",\n borderRadius: frameWidthValue,\n top: isLandscape ? undefined : powerPosition,\n left: isLandscape ? powerPosition : frameButtonPosition,\n bottom: isLandscape ? frameButtonPosition : undefined,\n width: isLandscape ? getSizeWithRatio(105) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(105),\n backgroundColor: frameColor,\n },\n notchPad: {\n alignSelf: \"center\",\n position: \"absolute\",\n top: isLandscape ? undefined : halfFrameWidth,\n left: isLandscape ? halfFrameWidth : undefined,\n width: isLandscape ? getSizeWithRatio(20) : getSizeWithRatio(160),\n height: isLandscape ? getSizeWithRatio(160) : getSizeWithRatio(20),\n backgroundColor: frameColor,\n },\n });\n}\n\nfunction IPhoneIslandPortrait(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n hideNavigationBar,\n transparentNavigationBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 390), 1);\n\n return getStyles({\n screenType: \"island\",\n isLandscape: false,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 9) * 19.5),\n frameColor,\n frameWidth: getSizeWithRatio(10),\n frameOnly,\n statusbarColor,\n bezelRadius: getSizeWithRatio(68),\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && (\n <div style={styles.notchContainer}>\n <div style={styles.island} />\n </div>\n )}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n {!hideNavigationBar && !transparentNavigationBar && (\n <div style={styles.swipeContainer}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {hideStatusBar && (\n <div style={styles.notchContainerFullScreen}>\n <div style={styles.island} />\n </div>\n )}\n {!hideNavigationBar && transparentNavigationBar && (\n <div style={styles.swipeContainerFullScreen}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction IPhoneIslandLandscape(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n hideNavigationBar,\n transparentNavigationBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 844), 1);\n\n return getStyles({\n screenType: \"island\",\n isLandscape: true,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 19.5) * 9),\n frameColor,\n frameWidth: getSizeWithRatio(10),\n frameOnly,\n statusbarColor,\n bezelRadius: getSizeWithRatio(68),\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && (\n <div style={styles.notchContainer}>\n <div style={styles.island} />\n </div>\n )}\n <div style={{ display: \"flex\", flex: 1, flexDirection: \"column\" }}>\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n {!hideNavigationBar && !transparentNavigationBar && (\n <div style={styles.swipeContainer}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {!hideStatusBar && <div style={styles.safeAreaRight} />}\n </div>\n {hideStatusBar && (\n <div style={styles.notchContainerFullScreen}>\n <div style={styles.island} />\n </div>\n )}\n {!hideNavigationBar && transparentNavigationBar && (\n <div style={styles.swipeContainerFullScreen}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction IPhoneNotchPortrait(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n hideNavigationBar,\n transparentNavigationBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 390), 1);\n\n return getStyles({\n screenType: \"notch\",\n isLandscape: false,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 9) * 19.5),\n frameColor,\n frameWidth: getSizeWithRatio(14),\n frameOnly,\n statusbarColor,\n bezelRadius: getSizeWithRatio(64),\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && (\n <div style={styles.notchContainer}>\n <div style={styles.notch} />\n </div>\n )}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n {!hideNavigationBar && !transparentNavigationBar && (\n <div style={styles.swipeContainer}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {hideStatusBar && (\n <div style={styles.notchContainerFullScreen}>\n <div style={styles.notch} />\n </div>\n )}\n {!hideNavigationBar && transparentNavigationBar && (\n <div style={styles.swipeContainerFullScreen}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n <div style={styles.notchPad} />\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction IPhoneNotchLandscape(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n hideNavigationBar,\n transparentNavigationBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 844), 1);\n\n return getStyles({\n screenType: \"notch\",\n isLandscape: true,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 19.5) * 9),\n frameColor,\n frameWidth: getSizeWithRatio(14),\n frameOnly,\n statusbarColor,\n bezelRadius: getSizeWithRatio(64),\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && (\n <div style={styles.notchContainer}>\n <div style={styles.notch} />\n </div>\n )}\n <div style={{ display: \"flex\", flex: 1, flexDirection: \"column\" }}>\n <div\n style={{\n display: \"flex\",\n flex: 1,\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n >\n {children}\n </div>\n {!hideNavigationBar && !transparentNavigationBar && (\n <div style={styles.swipeContainer}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n {!hideStatusBar && <div style={styles.safeAreaRight} />}\n </div>\n {hideStatusBar && (\n <div style={styles.notchContainerFullScreen}>\n <div style={styles.notch} />\n </div>\n )}\n {!hideNavigationBar && transparentNavigationBar && (\n <div style={styles.swipeContainerFullScreen}>\n <div style={styles.swipeBar} />\n </div>\n )}\n </div>\n <div style={styles.notchPad} />\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction getLegacyStyles({\n isLandscape,\n getSizeWithRatio,\n screenWidth,\n mockupHeight,\n frameColor,\n statusbarColor,\n frameOnly,\n}: LegacyStyleParams) {\n const frameWidth = getSizeWithRatio(22);\n const halfFrameWidth = Math.floor(frameWidth / 2);\n const widthAndFrame = screenWidth + frameWidth * 2;\n const heightAndFrame = mockupHeight + frameWidth * 2;\n const upperBezelSize = getSizeWithRatio(110);\n const lowerBezelSize = getSizeWithRatio(110);\n const frameButtonSize = Math.floor(frameWidth * 0.8);\n const frameButtonPosition =\n (isLandscape ? mockupHeight : screenWidth) +\n frameWidth +\n halfFrameWidth +\n frameButtonSize -\n halfFrameWidth;\n const paddingRight = frameOnly\n ? 0\n : isLandscape\n ? 0\n : frameButtonSize - halfFrameWidth;\n const paddingLeft = paddingRight;\n const paddingTop = frameOnly\n ? 0\n : isLandscape\n ? frameButtonSize - halfFrameWidth\n : 0;\n const paddingBottom = paddingTop;\n const bezelRadius = getSizeWithRatio(60);\n\n return createStyles({\n container: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n boxSizing: \"content-box\",\n position: \"relative\",\n width: isLandscape\n ? screenWidth + upperBezelSize + lowerBezelSize\n : widthAndFrame,\n height: isLandscape\n ? heightAndFrame\n : mockupHeight + upperBezelSize + lowerBezelSize,\n paddingRight,\n paddingLeft,\n paddingTop,\n paddingBottom,\n },\n frame: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isLandscape ? \"flex-start\" : \"center\",\n justifyContent: isLandscape ? \"center\" : \"flex-start\",\n position: \"relative\",\n boxSizing: \"border-box\",\n borderLeftWidth: frameWidth,\n borderLeftStyle: \"solid\",\n borderRightWidth: frameWidth,\n borderRightStyle: \"solid\",\n borderColor: frameColor,\n width: isLandscape ? screenWidth : widthAndFrame,\n height: isLandscape ? heightAndFrame : mockupHeight,\n overflow: \"hidden\",\n },\n upperBezel: {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n borderTopLeftRadius: bezelRadius,\n borderTopRightRadius: isLandscape ? 0 : bezelRadius,\n borderBottomLeftRadius: isLandscape ? bezelRadius : 0,\n width: isLandscape ? upperBezelSize : widthAndFrame,\n height: isLandscape ? heightAndFrame : upperBezelSize,\n backgroundColor: frameColor,\n justifyContent: \"center\",\n },\n cameraSpeakerContainer: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n camera: {\n position: \"absolute\",\n left: isLandscape ? undefined : -getSizeWithRatio(38),\n bottom: isLandscape ? -getSizeWithRatio(38) : 0,\n width: getSizeWithRatio(10),\n height: getSizeWithRatio(10),\n borderRadius: getSizeWithRatio(10),\n backgroundColor: statusbarColor,\n },\n speaker: {\n position: \"relative\",\n width: isLandscape ? getSizeWithRatio(10) : getSizeWithRatio(80),\n height: isLandscape ? getSizeWithRatio(80) : getSizeWithRatio(10),\n backgroundColor: statusbarColor,\n borderRadius: getSizeWithRatio(10),\n },\n lowerBezel: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n borderTopRightRadius: isLandscape ? bezelRadius : 0,\n borderBottomLeftRadius: isLandscape ? 0 : bezelRadius,\n borderBottomRightRadius: bezelRadius,\n width: isLandscape ? lowerBezelSize : widthAndFrame,\n height: isLandscape ? heightAndFrame : lowerBezelSize,\n backgroundColor: frameColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n homeButton: {\n width: getSizeWithRatio(65),\n height: getSizeWithRatio(65),\n backgroundColor: statusbarColor,\n borderRadius: getSizeWithRatio(65),\n },\n screen: {\n display: \"flex\",\n flexDirection: isLandscape ? \"row\" : \"column\",\n position: \"relative\",\n width: screenWidth,\n height: mockupHeight,\n backgroundColor: \"transparent\",\n },\n statusbar: {\n width: \"100%\",\n height: getSizeWithRatio(20),\n backgroundColor: statusbarColor,\n alignItems: \"center\",\n },\n silenceSwitch: {\n position: \"absolute\",\n borderRadius: frameWidth,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(115),\n left: isLandscape ? getSizeWithRatio(115) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(36) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(36),\n backgroundColor: frameColor,\n },\n volumeUp: {\n position: \"absolute\",\n borderRadius: frameWidth,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(185),\n left: isLandscape ? getSizeWithRatio(185) : undefined,\n right: frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(70) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(70),\n backgroundColor: frameColor,\n },\n volumeDown: {\n position: \"absolute\",\n borderRadius: frameWidth,\n top: isLandscape ? frameButtonPosition : getSizeWithRatio(270),\n left: isLandscape ? getSizeWithRatio(270) : undefined,\n right: isLandscape ? undefined : frameButtonPosition,\n width: isLandscape ? getSizeWithRatio(70) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(70),\n backgroundColor: frameColor,\n },\n power: {\n position: \"absolute\",\n borderRadius: frameWidth,\n top: isLandscape ? undefined : getSizeWithRatio(190),\n left: isLandscape ? getSizeWithRatio(190) : frameButtonPosition,\n bottom: isLandscape ? frameButtonPosition : undefined,\n width: isLandscape ? getSizeWithRatio(64) : frameButtonSize,\n height: isLandscape ? frameButtonSize : getSizeWithRatio(64),\n backgroundColor: frameColor,\n },\n });\n}\n\nfunction IPhoneLegacyPortrait(props: IosVariantProps) {\n const {\n screenWidth,\n frameColor,\n frameOnly,\n statusbarColor,\n hideStatusBar,\n children,\n } = props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 375), 1);\n\n return getLegacyStyles({\n isLandscape: false,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 9) * 16),\n frameColor,\n statusbarColor,\n frameOnly,\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.upperBezel}>\n <div style={styles.cameraSpeakerContainer}>\n <div style={styles.speaker}>\n <div style={styles.camera} />\n </div>\n </div>\n </div>\n <div style={styles.frame}>\n <div style={styles.screen}>\n {!hideStatusBar && <div style={styles.statusbar} />}\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n </div>\n </div>\n <div style={styles.lowerBezel}>\n <div style={styles.homeButton} />\n </div>\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n\nfunction IPhoneLegacyLandscape(props: IosVariantProps) {\n const { screenWidth, frameColor, frameOnly, statusbarColor, children } =\n props;\n const styles = useMemo(() => {\n const getSizeWithRatio = (size: number) =>\n Math.max(Math.floor((screenWidth * size) / 667), 1);\n\n return getLegacyStyles({\n isLandscape: true,\n getSizeWithRatio,\n screenWidth,\n mockupHeight: Math.floor((screenWidth / 16) * 9),\n frameColor,\n statusbarColor,\n frameOnly,\n });\n }, [screenWidth, frameColor, statusbarColor, frameOnly]);\n\n return (\n <div style={styles.container}>\n <div style={styles.upperBezel}>\n <div style={styles.cameraSpeakerContainer}>\n <div style={styles.speaker}>\n <div style={styles.camera} />\n </div>\n </div>\n </div>\n <div style={styles.frame}>\n <div style={styles.screen}>\n <div style={{ display: \"flex\", flex: 1, overflow: \"hidden\" }}>\n {children}\n </div>\n </div>\n </div>\n <div style={styles.lowerBezel}>\n <div style={styles.homeButton} />\n </div>\n {!frameOnly && (\n <>\n <div style={styles.silenceSwitch} />\n <div style={styles.volumeUp} />\n <div style={styles.volumeDown} />\n <div style={styles.power} />\n </>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useId, useState } from \"react\";\nimport {\n Camera,\n Check,\n CheckCheck,\n ChevronLeft,\n Mic,\n MoreVertical,\n Paperclip,\n Phone as PhoneIcon,\n Play,\n Smile,\n Video,\n Wifi,\n} from \"lucide-react\";\nimport { IPhoneMockup, type IPhoneMockupProps } from \"../IPhoneMockup\";\n\nexport type WhatsAppProfileType = \"business\" | \"personal\";\nexport type WhatsAppMessageDirection = \"incoming\" | \"outgoing\";\nexport type WhatsAppMessageType = \"text\" | \"audio\" | \"custom\";\nexport type WhatsAppMockupTheme = \"dark\" | \"light\";\n\nexport interface WhatsAppMockupMessage {\n id?: string;\n direction?: WhatsAppMessageDirection;\n type?: WhatsAppMessageType;\n text?: string;\n time: string;\n read?: boolean;\n duration?: string;\n waveform?: readonly number[];\n hideMeta?: boolean;\n children?: React.ReactNode;\n className?: string;\n contentClassName?: string;\n style?: React.CSSProperties;\n}\n\nexport interface WhatsAppMockupProps extends Pick<\n IPhoneMockupProps,\n | \"frameColor\"\n | \"statusbarColor\"\n | \"containerStyle\"\n | \"frameOnly\"\n | \"hideStatusBar\"\n> {\n screenWidth?: IPhoneMockupProps[\"screenWidth\"];\n contactName: string;\n profilePhoto?: string;\n profilePhotoAlt?: string;\n profileAvatar?: React.ReactNode;\n profileType?: WhatsAppProfileType;\n contactSubtitle?: string | null;\n theme?: WhatsAppMockupTheme;\n headerBackgroundColor?: React.CSSProperties[\"backgroundColor\"];\n profileAvatarBackgroundColor?: React.CSSProperties[\"backgroundColor\"];\n messages?: readonly WhatsAppMockupMessage[];\n statusTime?: string;\n dateLabel?: string | false;\n encryptionNotice?: string | false;\n composerPlaceholder?: string;\n composer?: React.ReactNode;\n showComposer?: boolean;\n showHeaderActions?: boolean;\n showWallpaper?: boolean;\n className?: string;\n phoneClassName?: string;\n screenClassName?: string;\n messagesClassName?: string;\n \"aria-label\"?: string;\n}\n\nconst DEFAULT_WAVEFORM = [\n 10, 18, 27, 14, 31, 23, 38, 17, 29, 21, 12, 25, 15, 32, 19, 11, 23, 15, 29,\n 17,\n] as const;\n\nconst FALLBACK_STATUS_TIME = \"14:32\";\n\nconst WHATSAPP_PALETTES = {\n dark: {\n frame: \"#0a0d12\",\n statusbar: \"#111b21\",\n statusText: \"#e9edef\",\n screen: \"#0b141a\",\n header: \"#111b21\",\n headerText: \"#e9edef\",\n mutedText: \"#aebac1\",\n subtleText: \"#8696a0\",\n action: \"#00a884\",\n wallpaperStroke: \"#e9edef\",\n wallpaperOpacity: 0.045,\n dateBg: \"#182229\",\n dateText: \"#aebac1\",\n noticeBg: \"#182229\",\n noticeText: \"#d0b66b\",\n incoming: \"#202c33\",\n incomingText: \"#e9edef\",\n outgoing: \"#005c4b\",\n outgoingText: \"#e9edef\",\n outgoingMeta: \"#c7d4cf\",\n read: \"#53bdeb\",\n avatarBg: \"#60b531\",\n composer: \"#111b21\",\n composerInput: \"#202c33\",\n composerText: \"#8696a0\",\n micBg: \"#00a884\",\n micIcon: \"#07130f\",\n audioWave: \"#9ad8ca\",\n audioButtonBg: \"#00a884\",\n audioPlayIcon: \"#aebac1\",\n audioWavePlayed: \"#25d366\",\n audioWaveMuted: \"#3b4a52\",\n audioAvatarBg: \"#12b2ca\",\n audioMicBadgeBg: \"#25d366\",\n shadow: \"rgba(0, 0, 0, 0.22)\",\n },\n light: {\n frame: \"#0a0d12\",\n statusbar: \"#f7f5f0\",\n statusText: \"#111b21\",\n screen: \"#efe7db\",\n header: \"#f7f5f0\",\n headerText: \"#111b21\",\n mutedText: \"#667781\",\n subtleText: \"#667781\",\n action: \"#008069\",\n wallpaperStroke: \"#7d6f59\",\n wallpaperOpacity: 0.075,\n dateBg: \"rgba(255, 255, 255, 0.88)\",\n dateText: \"#6b6255\",\n noticeBg: \"#fff7d6\",\n noticeText: \"#7a6420\",\n incoming: \"#ffffff\",\n incomingText: \"#111b21\",\n outgoing: \"#d9fdd3\",\n outgoingText: \"#111b13\",\n outgoingMeta: \"#66756b\",\n read: \"#53bdeb\",\n avatarBg: \"#60b531\",\n composer: \"#f7f5f0\",\n composerInput: \"#ffffff\",\n composerText: \"#667781\",\n micBg: \"#00a884\",\n micIcon: \"#ffffff\",\n audioWave: \"#177866\",\n audioButtonBg: \"#00a884\",\n audioPlayIcon: \"#54656f\",\n audioWavePlayed: \"#25d366\",\n audioWaveMuted: \"#a4b0b6\",\n audioAvatarBg: \"#12b2ca\",\n audioMicBadgeBg: \"#25d366\",\n shadow: \"rgba(15, 23, 42, 0.11)\",\n },\n} as const;\n\ntype WhatsAppPalette = (typeof WHATSAPP_PALETTES)[WhatsAppMockupTheme];\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function WhatsAppMockup({\n contactName,\n profilePhoto,\n profilePhotoAlt,\n profileAvatar,\n profileType = \"business\",\n contactSubtitle,\n theme = \"dark\",\n headerBackgroundColor,\n profileAvatarBackgroundColor,\n messages = [],\n statusTime,\n dateLabel = \"Hoje\",\n encryptionNotice = \"Mensagens e ligações são protegidas com criptografia de ponta a ponta.\",\n composerPlaceholder = \"Mensagem\",\n composer,\n showComposer = true,\n showHeaderActions = true,\n showWallpaper = true,\n screenWidth = 266,\n frameColor,\n statusbarColor,\n containerStyle,\n frameOnly,\n hideStatusBar,\n className,\n phoneClassName,\n screenClassName,\n messagesClassName,\n \"aria-label\": ariaLabel,\n}: WhatsAppMockupProps) {\n const palette = WHATSAPP_PALETTES[theme];\n const resolvedStatusTime = useResolvedStatusTime(statusTime);\n const resolvedFrameColor = frameColor ?? palette.frame;\n const resolvedStatusbarColor = statusbarColor ?? palette.statusbar;\n const subtitle =\n contactSubtitle === undefined\n ? profileType === \"business\"\n ? \"WhatsApp Business\"\n : undefined\n : contactSubtitle || undefined;\n\n return (\n <div\n className={cn(\"inline-block\", className)}\n aria-label={ariaLabel ?? `Conversa no WhatsApp com ${contactName}`}\n >\n <IPhoneMockup\n screenWidth={screenWidth}\n screenType=\"island\"\n frameColor={resolvedFrameColor}\n statusbarColor={resolvedStatusbarColor}\n hideNavBar\n frameOnly={frameOnly}\n hideStatusBar={hideStatusBar}\n containerStyle={containerStyle}\n className={phoneClassName}\n >\n <div\n className={cn(\"flex h-full w-full flex-col\", screenClassName)}\n style={{ backgroundColor: palette.screen, color: palette.headerText }}\n >\n <StatusBar\n time={resolvedStatusTime}\n screenWidth={screenWidth}\n palette={palette}\n />\n <WhatsAppHeader\n contactName={contactName}\n subtitle={subtitle}\n profilePhoto={profilePhoto}\n profilePhotoAlt={profilePhotoAlt}\n profileAvatar={profileAvatar}\n showActions={showHeaderActions}\n backgroundColor={headerBackgroundColor ?? palette.header}\n avatarBackgroundColor={\n profileAvatarBackgroundColor ?? palette.avatarBg\n }\n palette={palette}\n />\n\n <div\n className={cn(\n \"relative flex flex-1 flex-col gap-2 overflow-hidden px-2.5 py-2.5\",\n messagesClassName,\n )}\n >\n {showWallpaper ? <WhatsAppWallpaper palette={palette} /> : null}\n\n {dateLabel ? (\n <div\n className=\"relative z-10 mx-auto rounded-full px-2.5 py-0.5 text-[9px] font-semibold uppercase shadow-[0_1px_2px_rgba(15,23,42,0.08)]\"\n style={{\n backgroundColor: palette.dateBg,\n color: palette.dateText,\n }}\n >\n {dateLabel}\n </div>\n ) : null}\n\n {encryptionNotice ? (\n <div\n className=\"relative z-10 mx-auto max-w-[92%] rounded-md px-2.5 py-1.5 text-center text-[9px] leading-snug shadow-[0_1px_2px_rgba(15,23,42,0.06)]\"\n style={{\n backgroundColor: palette.noticeBg,\n color: palette.noticeText,\n }}\n >\n {encryptionNotice}\n </div>\n ) : null}\n\n {messages.map((message, index) => (\n <WhatsAppMessageBubble\n key={message.id ?? `${message.time}-${index}`}\n message={message}\n palette={palette}\n />\n ))}\n </div>\n\n {showComposer\n ? (composer ?? (\n <WhatsAppComposer\n composerPlaceholder={composerPlaceholder}\n palette={palette}\n />\n ))\n : null}\n </div>\n </IPhoneMockup>\n </div>\n );\n}\n\ninterface StatusBarProps {\n time: string;\n screenWidth: number;\n palette: WhatsAppPalette;\n}\n\nfunction useResolvedStatusTime(statusTime?: string) {\n const [currentTime, setCurrentTime] = useState(FALLBACK_STATUS_TIME);\n\n useEffect(() => {\n if (statusTime) {\n return;\n }\n\n const updateCurrentTime = () => {\n setCurrentTime(formatStatusTime(new Date()));\n };\n\n updateCurrentTime();\n\n let interval: number | undefined;\n const now = new Date();\n const nextMinuteDelay =\n (60 - now.getSeconds()) * 1000 - now.getMilliseconds();\n const timeout = window.setTimeout(() => {\n updateCurrentTime();\n interval = window.setInterval(updateCurrentTime, 60_000);\n }, nextMinuteDelay);\n\n return () => {\n window.clearTimeout(timeout);\n if (interval !== undefined) {\n window.clearInterval(interval);\n }\n };\n }, [statusTime]);\n\n return statusTime ?? currentTime;\n}\n\nfunction formatStatusTime(date: Date) {\n return `${date.getHours().toString().padStart(2, \"0\")}:${date\n .getMinutes()\n .toString()\n .padStart(2, \"0\")}`;\n}\n\nfunction StatusBar({ time, screenWidth, palette }: StatusBarProps) {\n return (\n <div\n aria-hidden\n className=\"absolute left-0 right-0 top-0 z-50 flex items-center justify-between px-6 text-[11px] font-semibold tracking-tight\"\n style={{ height: `${Math.floor((screenWidth * 59) / 390)}px` }}\n >\n <span className=\"tabular-nums\" style={{ color: palette.statusText }}>\n {time}\n </span>\n <div\n className=\"flex items-center gap-1\"\n style={{ color: palette.statusText }}\n >\n <IosSignal color={palette.statusText} />\n <Wifi className=\"h-3 w-3\" strokeWidth={2.4} aria-hidden />\n <IosBattery color={palette.statusText} />\n </div>\n </div>\n );\n}\n\nfunction IosSignal({ color }: { color: string }) {\n return (\n <span className=\"flex h-3 w-3 items-end gap-[1px]\" aria-hidden>\n {[4, 6, 8, 10].map((height) => (\n <span\n key={height}\n className=\"w-[2px] rounded-sm\"\n style={{ height, backgroundColor: color }}\n />\n ))}\n </span>\n );\n}\n\nfunction IosBattery({ color }: { color: string }) {\n return (\n <span className=\"flex items-center gap-[1px]\" aria-hidden>\n <span\n className=\"relative h-[8px] w-[16px] rounded-[2px] border\"\n style={{ borderColor: color }}\n >\n <span\n className=\"absolute bottom-[1px] left-[1px] top-[1px] w-[10px] rounded-[1px]\"\n style={{ backgroundColor: color }}\n />\n </span>\n <span\n className=\"h-[4px] w-[1.5px] rounded-r\"\n style={{ backgroundColor: color }}\n />\n </span>\n );\n}\n\ninterface WhatsAppHeaderProps {\n contactName: string;\n subtitle?: string;\n profilePhoto?: string;\n profilePhotoAlt?: string;\n profileAvatar?: React.ReactNode;\n showActions: boolean;\n backgroundColor: React.CSSProperties[\"backgroundColor\"];\n avatarBackgroundColor: React.CSSProperties[\"backgroundColor\"];\n palette: WhatsAppPalette;\n}\n\nfunction WhatsAppHeader({\n contactName,\n subtitle,\n profilePhoto,\n profilePhotoAlt,\n profileAvatar,\n showActions,\n backgroundColor,\n avatarBackgroundColor,\n palette,\n}: WhatsAppHeaderProps) {\n return (\n <div\n className=\"relative shadow-[0_1px_0_rgba(17,27,33,0.08)]\"\n style={{ backgroundColor, color: palette.headerText }}\n >\n <div className=\"flex items-center gap-2 px-2.5 pb-2 pt-2\">\n <ChevronLeft\n className=\"h-5 w-5 shrink-0\"\n strokeWidth={2.4}\n style={{ color: palette.action }}\n aria-hidden\n />\n <ProfileAvatar\n contactName={contactName}\n profilePhoto={profilePhoto}\n profilePhotoAlt={profilePhotoAlt}\n profileAvatar={profileAvatar}\n backgroundColor={avatarBackgroundColor}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[13px] font-semibold leading-tight\">\n {contactName}\n </p>\n {subtitle ? (\n <p\n className=\"truncate text-[10px] leading-tight\"\n style={{ color: palette.mutedText }}\n >\n {subtitle}\n </p>\n ) : null}\n </div>\n {showActions ? (\n <>\n <Video\n className=\"h-4 w-4 shrink-0\"\n strokeWidth={2.2}\n style={{ color: palette.action }}\n aria-hidden\n />\n <PhoneIcon\n className=\"h-3.5 w-3.5 shrink-0\"\n strokeWidth={2.2}\n style={{ color: palette.action }}\n aria-hidden\n />\n <MoreVertical\n className=\"h-4 w-4 shrink-0\"\n strokeWidth={2.2}\n style={{ color: palette.action }}\n aria-hidden\n />\n </>\n ) : null}\n </div>\n </div>\n );\n}\n\ninterface ProfileAvatarProps {\n contactName: string;\n profilePhoto?: string;\n profilePhotoAlt?: string;\n profileAvatar?: React.ReactNode;\n backgroundColor: React.CSSProperties[\"backgroundColor\"];\n}\n\nfunction ProfileAvatar({\n contactName,\n profilePhoto,\n profilePhotoAlt,\n profileAvatar,\n backgroundColor,\n}: ProfileAvatarProps) {\n if (profileAvatar) {\n return (\n <div\n className=\"flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full\"\n style={{ backgroundColor }}\n >\n {profileAvatar}\n </div>\n );\n }\n\n if (profilePhoto) {\n return (\n <img\n src={profilePhoto}\n alt={profilePhotoAlt ?? contactName}\n className=\"h-8 w-8 shrink-0 rounded-full object-cover\"\n style={{ backgroundColor }}\n />\n );\n }\n\n return (\n <div\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-[11px] font-bold uppercase text-white\"\n style={{ backgroundColor }}\n >\n {getInitials(contactName)}\n </div>\n );\n}\n\nfunction getInitials(name: string) {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n const first = parts[0]?.[0] ?? \"W\";\n const second = parts.length > 1 ? parts[parts.length - 1]?.[0] : undefined;\n return `${first}${second ?? \"\"}`;\n}\n\ninterface WhatsAppMessageBubbleProps {\n message: WhatsAppMockupMessage;\n palette: WhatsAppPalette;\n}\n\nfunction WhatsAppMessageBubble({\n message,\n palette,\n}: WhatsAppMessageBubbleProps) {\n const direction = message.direction ?? \"outgoing\";\n const type = message.type ?? \"text\";\n const isOutgoing = direction === \"outgoing\";\n const isCustom = type === \"custom\";\n const isAudio = type === \"audio\";\n const bubbleColor = isOutgoing ? palette.outgoing : palette.incoming;\n\n // Custom bubbles render their own container — no background, padding,\n // tail, shadow, or auto meta from the design-system. Author owns the visual.\n if (isCustom) {\n return (\n <div\n className={cn(\n \"relative z-10 max-w-[86%]\",\n isOutgoing ? \"ml-auto\" : \"mr-auto\",\n message.className,\n )}\n style={message.style}\n >\n <div className={message.contentClassName}>{message.children}</div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"relative z-10 max-w-[86%] rounded-[14px] px-2.5 py-2 shadow-[0_1px_1.5px_rgba(15,23,42,0.11)]\",\n isOutgoing ? \"ml-auto rounded-tr-[4px]\" : \"mr-auto rounded-tl-[4px]\",\n // Audio bubbles host an absolute meta row at the bottom — reserve space.\n isAudio && \"min-w-[210px] pb-[18px]\",\n message.className,\n )}\n style={{\n backgroundColor: bubbleColor,\n color: isOutgoing ? palette.outgoingText : palette.incomingText,\n boxShadow: `0 1px 1.5px ${palette.shadow}`,\n ...message.style,\n }}\n >\n <BubbleTail\n side={isOutgoing ? \"out\" : \"in\"}\n color={message.style?.backgroundColor?.toString() ?? bubbleColor}\n />\n\n <div\n className={cn(\n // text size & leading set on the container so children (JSX) inherits\n \"text-[10.5px] leading-snug\",\n message.contentClassName,\n )}\n >\n {message.children ??\n (isAudio ? (\n <AudioMessage message={message} palette={palette} />\n ) : (\n <p className=\"max-w-[31ch]\">{message.text}</p>\n ))}\n </div>\n\n {message.hideMeta ? null : isAudio ? (\n <AudioMeta\n duration={message.duration}\n time={message.time}\n direction={direction}\n read={message.read}\n palette={palette}\n />\n ) : (\n <MessageMeta\n time={message.time}\n direction={direction}\n read={message.read}\n palette={palette}\n />\n )}\n </div>\n );\n}\n\ninterface AudioMessageProps {\n message: WhatsAppMockupMessage;\n palette: WhatsAppPalette;\n}\n\nfunction AudioMessage({ message, palette }: AudioMessageProps) {\n const waveform = message.waveform ?? DEFAULT_WAVEFORM;\n // First ~25% of the waveform is rendered as \"played\" (highlighted color).\n const playedThreshold = Math.max(1, Math.round(waveform.length * 0.22));\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Avatar circular com badge de microfone */}\n <div className=\"relative shrink-0\" aria-hidden>\n <span\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-[11px] font-bold uppercase text-white\"\n style={{ backgroundColor: palette.audioAvatarBg }}\n >\n V\n </span>\n <span\n className=\"absolute -bottom-0.5 -right-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full\"\n style={{ backgroundColor: palette.audioMicBadgeBg }}\n >\n <Mic\n className=\"h-2 w-2 text-white\"\n strokeWidth={2.4}\n aria-hidden\n />\n </span>\n </div>\n\n {/* Botão play (sem círculo) */}\n <Play\n className=\"h-4 w-4 shrink-0 fill-current\"\n strokeWidth={0}\n style={{ color: palette.audioPlayIcon }}\n aria-hidden\n />\n\n {/* Waveform: barras tocadas em destaque + restantes em cinza */}\n <div className=\"flex h-5 flex-1 items-center gap-[1.5px]\" aria-hidden>\n {waveform.map((height, index) => (\n <span\n key={`${height}-${index}`}\n className=\"flex-1 rounded-[2px]\"\n style={{\n backgroundColor:\n index < playedThreshold\n ? palette.audioWavePlayed\n : palette.audioWaveMuted,\n height: Math.max(4, Math.round(height * 0.5)),\n }}\n />\n ))}\n </div>\n </div>\n );\n}\n\ninterface AudioMetaProps {\n duration?: string;\n time: string;\n direction: WhatsAppMessageDirection;\n read?: boolean;\n palette: WhatsAppPalette;\n}\n\nfunction AudioMeta({\n duration,\n time,\n direction,\n read,\n palette,\n}: AudioMetaProps) {\n const isOutgoing = direction === \"outgoing\";\n const metaColor = isOutgoing ? palette.outgoingMeta : palette.subtleText;\n\n return (\n <div\n className=\"pointer-events-none absolute bottom-[5px] left-[44px] right-2.5 flex items-center justify-between text-[9px] font-medium leading-none tabular-nums\"\n style={{ color: metaColor }}\n >\n <span>{duration}</span>\n <span className=\"inline-flex items-center gap-[3px] whitespace-nowrap\">\n <span>{time}</span>\n {isOutgoing ? (\n read === undefined ? (\n <Check className=\"h-3 w-3\" strokeWidth={2.5} aria-hidden />\n ) : (\n <CheckCheck\n className=\"h-3 w-3\"\n strokeWidth={2.5}\n style={{ color: read ? palette.read : undefined }}\n aria-hidden\n />\n )\n ) : null}\n </span>\n </div>\n );\n}\n\ninterface MessageMetaProps {\n time: string;\n direction: WhatsAppMessageDirection;\n read?: boolean;\n palette: WhatsAppPalette;\n}\n\nfunction MessageMeta({ time, direction, read, palette }: MessageMetaProps) {\n const isOutgoing = direction === \"outgoing\";\n\n return (\n <div\n className=\"mt-1 flex items-center justify-end gap-1 text-[9px]\"\n style={{ color: isOutgoing ? palette.outgoingMeta : palette.subtleText }}\n >\n <span>{time}</span>\n {isOutgoing ? (\n read === undefined ? (\n <Check className=\"h-3 w-3\" strokeWidth={2.5} aria-hidden />\n ) : (\n <CheckCheck\n className=\"h-3 w-3\"\n strokeWidth={2.5}\n style={{ color: read ? palette.read : undefined }}\n aria-hidden\n />\n )\n ) : null}\n </div>\n );\n}\n\ninterface BubbleTailProps {\n side: \"in\" | \"out\";\n color: string;\n}\n\nfunction BubbleTail({ side, color }: BubbleTailProps) {\n const path =\n side === \"out\"\n ? \"M0 0H14C10 1.8 7.4 4.7 6.4 8.3L5.3 12C4.2 7 2.4 2.9 0 0Z\"\n : \"M14 0H0C4 1.8 6.6 4.7 7.6 8.3L8.7 12C9.8 7 11.6 2.9 14 0Z\";\n\n return (\n <svg\n aria-hidden\n className={cn(\n \"pointer-events-none absolute top-0 h-3.5 w-3.5\",\n side === \"out\" ? \"-right-[7px]\" : \"-left-[7px]\",\n )}\n style={{ fill: color }}\n viewBox=\"0 0 14 12\"\n >\n <path d={path} />\n </svg>\n );\n}\n\nfunction WhatsAppWallpaper({ palette }: { palette: WhatsAppPalette }) {\n const patternId = useId().replace(/:/g, \"\");\n\n return (\n <svg\n aria-hidden\n className=\"pointer-events-none absolute inset-0 h-full w-full\"\n >\n <defs>\n <pattern\n id={patternId}\n width=\"46\"\n height=\"46\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M8 11h12m-6-6v12M31 7c4 0 7 3 7 7 0 5-5 7-7 10-2-3-7-5-7-10 0-4 3-7 7-7Zm-14 25c4 0 6 2 6 5s-2 5-6 5-6-2-6-5 2-5 6-5Zm19 10 6-6m-6 0 6 6\"\n stroke={palette.wallpaperStroke}\n strokeWidth=\"1\"\n fill=\"none\"\n opacity={palette.wallpaperOpacity}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M34 29c3 0 5 2 5 4s-2 4-5 4h-6v-4c0-2 3-4 6-4Z\"\n stroke={palette.wallpaperStroke}\n strokeWidth=\"1\"\n fill=\"none\"\n opacity={palette.wallpaperOpacity}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill={`url(#${patternId})`} />\n </svg>\n );\n}\n\ninterface WhatsAppComposerProps {\n composerPlaceholder: string;\n palette: WhatsAppPalette;\n}\n\nfunction WhatsAppComposer({\n composerPlaceholder,\n palette,\n}: WhatsAppComposerProps) {\n return (\n <div\n className=\"flex items-center gap-1.5 px-2 pb-[22px] pt-2\"\n style={{ backgroundColor: palette.composer }}\n >\n <div\n className=\"flex min-w-0 flex-1 items-center gap-1.5 rounded-full px-2.5 py-1.5 shadow-[0_1px_1px_rgba(15,23,42,0.06)]\"\n style={{\n backgroundColor: palette.composerInput,\n color: palette.composerText,\n }}\n >\n <Smile className=\"h-3.5 w-3.5 shrink-0\" strokeWidth={2} aria-hidden />\n <span className=\"flex-1 truncate text-[10px]\">\n {composerPlaceholder}\n </span>\n <Paperclip\n className=\"h-3.5 w-3.5 shrink-0\"\n strokeWidth={2}\n aria-hidden\n />\n <Camera className=\"h-3.5 w-3.5 shrink-0\" strokeWidth={2} aria-hidden />\n </div>\n <span\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full\"\n style={{ backgroundColor: palette.micBg, color: palette.micIcon }}\n >\n <Mic className=\"h-3.5 w-3.5\" strokeWidth={2.2} aria-hidden />\n </span>\n </div>\n );\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Text } from \"lucide-react\";\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport interface TocItem {\n /** Hash URL — must start with '#'. The id (after the hash) must match an element id in the DOM. */\n url: string;\n title: string;\n /** 1, 2, 3, 4 — controls indentation. */\n depth: number;\n}\n\nexport interface TableOfContentsProps {\n items: TocItem[];\n /** Title shown above the items. Default: 'Nesta página'. Pass null to hide. */\n title?: string | null;\n /** Whether to show the active-range highlight bar (TocThumb). Default true. */\n showThumb?: boolean;\n /** When true, only one item can be active at a time. Default false (multi-active). */\n single?: boolean;\n /** Root margin for the IntersectionObserver. Default '0px 0px -70% 0px'. */\n rootMargin?: string;\n /** Threshold for the IntersectionObserver. Default 0. */\n threshold?: number | number[];\n className?: string;\n /** Called when active set changes. */\n onActiveChange?: (activeIds: string[]) => void;\n}\n\nexport interface TOCProviderProps {\n items: TocItem[];\n single?: boolean;\n rootMargin?: string;\n threshold?: number | number[];\n children: React.ReactNode;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Internal types */\n/* -------------------------------------------------------------------------- */\n\ninterface ObservedItem {\n id: string;\n active: boolean;\n fallback: boolean;\n /** Last update timestamp — used to disambiguate which active item wins. */\n t: number;\n original: TocItem;\n}\n\ntype Listener = (items: ObservedItem[]) => void;\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nfunction getIdFromUrl(url: string): string | null {\n if (typeof url === \"string\" && url.startsWith(\"#\")) return url.slice(1);\n return null;\n}\n\nfunction arraysShallowEqual<T>(a: T[], b: T[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\nfunction findScrollableParent(el: HTMLElement | null): HTMLElement {\n let current = el?.parentElement;\n while (current && current !== document.body) {\n const style = getComputedStyle(current);\n const overflowY = style.overflowY;\n if (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\") {\n // Confirm the element can actually scroll\n if (current.scrollHeight > current.clientHeight) return current;\n }\n current = current.parentElement;\n }\n return document.documentElement;\n}\n\nfunction scrollAnchorIntoView(\n anchor: HTMLElement,\n container: HTMLElement,\n options: { behavior?: ScrollBehavior; block?: \"start\" | \"center\" | \"end\" } = {},\n) {\n const { behavior = \"smooth\", block = \"center\" } = options;\n const containerRect = container.getBoundingClientRect();\n const anchorRect = anchor.getBoundingClientRect();\n\n const offsetTopRelativeToContainer =\n anchorRect.top - containerRect.top + container.scrollTop;\n\n let targetScroll: number;\n if (block === \"center\") {\n targetScroll =\n offsetTopRelativeToContainer - container.clientHeight / 2 + anchor.clientHeight / 2;\n } else if (block === \"end\") {\n targetScroll =\n offsetTopRelativeToContainer - container.clientHeight + anchor.clientHeight;\n } else {\n targetScroll = offsetTopRelativeToContainer;\n }\n\n container.scrollTo({\n top: Math.max(0, targetScroll),\n behavior,\n });\n}\n\n/* -------------------------------------------------------------------------- */\n/* Observer */\n/* -------------------------------------------------------------------------- */\n\nclass TocObserver {\n items: ObservedItem[] = [];\n single = false;\n private intersectionObserver: IntersectionObserver | null = null;\n private listeners = new Set<Listener>();\n\n listen(fn: Listener): void {\n this.listeners.add(fn);\n }\n\n unlisten(fn: Listener): void {\n this.listeners.delete(fn);\n }\n\n setItems(nextItems: TocItem[]): void {\n if (this.intersectionObserver) {\n for (const item of this.items) {\n const el = document.getElementById(item.id);\n if (el) this.intersectionObserver.unobserve(el);\n }\n }\n\n const next: ObservedItem[] = [];\n for (const item of nextItems) {\n const id = getIdFromUrl(item.url);\n if (!id) continue;\n next.push({\n id,\n active: false,\n fallback: false,\n t: 0,\n original: item,\n });\n }\n\n this.update(next);\n this.observeAll();\n }\n\n watch(options: IntersectionObserverInit): void {\n if (this.intersectionObserver) return;\n if (typeof window === \"undefined\") return;\n this.intersectionObserver = new IntersectionObserver(\n this.handleIntersection.bind(this),\n options,\n );\n this.observeAll();\n }\n\n unwatch(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = null;\n }\n\n private handleIntersection(entries: IntersectionObserverEntry[]): void {\n if (entries.length === 0) return;\n\n let hasActive = false;\n const updated = this.items.map((item) => {\n const entry = entries.find((e) => (e.target as HTMLElement).id === item.id);\n let active = entry ? entry.isIntersecting : item.active && !item.fallback;\n if (this.single && hasActive) active = false;\n\n let nextItem = item;\n if (item.active !== active) {\n nextItem = {\n ...item,\n t: Date.now(),\n active,\n fallback: false,\n };\n }\n if (active) hasActive = true;\n return nextItem;\n });\n\n // Fallback: if nothing intersects, mark the closest item to the viewport top as active.\n if (!hasActive && entries[0].rootBounds) {\n const viewTop = entries[0].rootBounds.top;\n let min = Number.POSITIVE_INFINITY;\n let fallbackIdx = -1;\n for (let i = 0; i < updated.length; i++) {\n const el = document.getElementById(updated[i].id);\n if (!el) continue;\n const distance = Math.abs(viewTop - el.getBoundingClientRect().top);\n if (distance < min) {\n min = distance;\n fallbackIdx = i;\n }\n }\n if (fallbackIdx !== -1) {\n updated[fallbackIdx] = {\n ...updated[fallbackIdx],\n active: true,\n fallback: true,\n t: Date.now(),\n };\n }\n }\n\n this.update(updated);\n }\n\n private observeAll(): void {\n if (!this.intersectionObserver) return;\n for (const item of this.items) {\n const el = document.getElementById(item.id);\n if (el) this.intersectionObserver.observe(el);\n }\n }\n\n private update(next: ObservedItem[]): void {\n this.items = next;\n for (const fn of this.listeners) fn(next);\n }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Context + Provider */\n/* -------------------------------------------------------------------------- */\n\nconst ObserverContext = createContext<TocObserver | null>(null);\nconst ItemsContext = createContext<TocItem[]>([]);\nconst LinksRefContext = createContext<React.MutableRefObject<\n Map<string, HTMLAnchorElement>\n> | null>(null);\n\nfunction useObserver(): TocObserver {\n const observer = useContext(ObserverContext);\n if (!observer) {\n throw new Error(\n \"TableOfContents hooks must be used inside <TOCProvider> or <TableOfContents>.\",\n );\n }\n return observer;\n}\n\n/**\n * Headless provider that drives the scrollspy. Use directly when you want to\n * render the visual ToC yourself (e.g. mobile drawer, custom layout).\n */\nexport function TOCProvider({\n items,\n single = false,\n rootMargin = \"0px 0px -70% 0px\",\n threshold = 0,\n children,\n}: TOCProviderProps): React.JSX.Element {\n const observer = useMemo(() => new TocObserver(), []);\n observer.single = single;\n\n useEffect(() => {\n observer.setItems(items);\n }, [observer, items]);\n\n useEffect(() => {\n observer.watch({ rootMargin, threshold });\n return () => observer.unwatch();\n }, [observer, rootMargin, threshold]);\n\n return (\n <ObserverContext.Provider value={observer}>\n <ItemsContext.Provider value={items}>{children}</ItemsContext.Provider>\n </ObserverContext.Provider>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Hooks */\n/* -------------------------------------------------------------------------- */\n\nfunction useObserverState<T>(\n select: (items: ObservedItem[]) => T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const observer = useObserver();\n const [value, setValue] = useState<T>(() => select(observer.items));\n\n // Keep the latest selectors in refs so the effect doesn't re-subscribe each render.\n const selectRef = useRef(select);\n const isEqualRef = useRef(isEqual);\n selectRef.current = select;\n isEqualRef.current = isEqual;\n\n useEffect(() => {\n const listener: Listener = (items) => {\n const next = selectRef.current(items);\n setValue((prev) => (isEqualRef.current(prev, next) ? prev : next));\n };\n observer.listen(listener);\n return () => observer.unlisten(listener);\n }, [observer]);\n\n return value;\n}\n\n/** Returns the id of the most recently activated heading (best guess). */\nexport function useActiveAnchor(): string | undefined {\n return useObserverState<string | undefined>((items) => {\n let best: ObservedItem | undefined;\n for (const item of items) {\n if (!item.active) continue;\n if (!best || item.t > best.t) best = item;\n }\n return best?.id;\n });\n}\n\n/** Returns the ids of every currently active heading. */\nexport function useActiveAnchors(): string[] {\n return useObserverState<string[]>(\n (items) => {\n const out: string[] = [];\n for (const item of items) if (item.active) out.push(item.id);\n return out;\n },\n arraysShallowEqual,\n );\n}\n\n/** Returns the static items list registered with the provider. */\nexport function useTOCItems(): TocItem[] {\n return useContext(ItemsContext);\n}\n\n/* -------------------------------------------------------------------------- */\n/* Visual */\n/* -------------------------------------------------------------------------- */\n\nfunction handleAnchorClick(e: React.MouseEvent<HTMLAnchorElement>, id: string) {\n const el = document.getElementById(id);\n if (!el) return;\n e.preventDefault();\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n if (typeof window !== \"undefined\" && window.history) {\n window.history.replaceState(null, \"\", `#${id}`);\n }\n}\n\ninterface TocAnchorProps {\n item: TocItem;\n}\n\nfunction TocAnchor({ item }: TocAnchorProps) {\n const id = getIdFromUrl(item.url) ?? \"\";\n const activeIds = useActiveAnchors();\n const isActive = id ? activeIds.includes(id) : false;\n const linksRef = useContext(LinksRefContext);\n\n const setRef = useCallback(\n (node: HTMLAnchorElement | null) => {\n if (!linksRef || !id) return;\n if (node) linksRef.current.set(id, node);\n else linksRef.current.delete(id);\n },\n [linksRef, id],\n );\n\n return (\n <a\n ref={setRef}\n href={item.url}\n data-active={isActive}\n onClick={(e) => handleAnchorClick(e, id)}\n className={cn(\n \"py-1.5 text-sm transition-colors scroll-m-4 wrap-anywhere first:pt-0 last:pb-0\",\n \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n \"hover:text-[var(--dashboard-text-primary,#2d2d2d)]\",\n \"data-[active=true]:text-[var(--dashboard-primary,#e74410)]\",\n item.depth <= 2 && \"pl-3\",\n item.depth === 3 && \"pl-6\",\n item.depth >= 4 && \"pl-8\",\n )}\n >\n {item.title}\n </a>\n );\n}\n\ninterface ThumbComputed {\n positions: Array<[number, number]>;\n}\n\nfunction TocThumb({\n computed,\n}: {\n computed: ThumbComputed;\n}) {\n const ref = useRef<HTMLDivElement | null>(null);\n const observer = useObserver();\n\n const calculate = useCallback(\n (items: ObservedItem[]): Record<string, string> => {\n const out: Record<string, string> = {};\n const startIdx = items.findIndex((item) => item.active);\n if (startIdx === -1) return out;\n let endIdx = startIdx;\n for (let i = items.length - 1; i >= startIdx; i--) {\n if (items[i].active) {\n endIdx = i;\n break;\n }\n }\n const startPos = computed.positions[startIdx];\n const endPos = computed.positions[endIdx];\n if (!startPos || !endPos) return out;\n out[\"--track-top\"] = `${startPos[0]}px`;\n out[\"--track-bottom\"] = `${endPos[1]}px`;\n return out;\n },\n [computed],\n );\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const apply = (items: ObservedItem[]) => {\n const styles = calculate(items);\n for (const [k, v] of Object.entries(styles)) {\n el.style.setProperty(k, v);\n }\n };\n apply(observer.items);\n observer.listen(apply);\n return () => observer.unlisten(apply);\n }, [observer, calculate]);\n\n const initialStyles = calculate(observer.items);\n\n return (\n <div\n ref={ref}\n aria-hidden\n className=\"absolute inset-y-0 left-0 w-px bg-[var(--dashboard-primary,#e74410)] transition-[clip-path]\"\n style={{\n clipPath:\n \"polygon(0 var(--track-top, 0), 100% var(--track-top, 0), 100% var(--track-bottom, 0), 0 var(--track-bottom, 0))\",\n ...initialStyles,\n }}\n />\n );\n}\n\ninterface TocListProps {\n items: TocItem[];\n showThumb: boolean;\n}\n\nfunction TocList({ items, showThumb }: TocListProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [computed, setComputed] = useState<ThumbComputed | null>(null);\n\n const recompute = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n if (items.length === 0) {\n setComputed(null);\n return;\n }\n const positions: Array<[number, number]> = [];\n for (const item of items) {\n const el = container.querySelector<HTMLAnchorElement>(\n `a[href=\"${item.url}\"]`,\n );\n if (!el) {\n positions.push([0, 0]);\n continue;\n }\n const styles = window.getComputedStyle(el);\n const top = el.offsetTop + parseFloat(styles.paddingTop || \"0\");\n const bottom =\n el.offsetTop + el.clientHeight - parseFloat(styles.paddingBottom || \"0\");\n positions.push([top, bottom]);\n }\n setComputed({ positions });\n }, [items]);\n\n useLayoutEffect(() => {\n recompute();\n }, [recompute]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => recompute());\n ro.observe(container);\n return () => ro.disconnect();\n }, [recompute]);\n\n return (\n <div className=\"relative\">\n {showThumb && computed && <TocThumb computed={computed} />}\n <div\n ref={containerRef}\n className=\"flex flex-col border-l border-[var(--dashboard-text-secondary,#6b7280)]/15\"\n >\n {items.map((item) => (\n <TocAnchor key={item.url} item={item} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ActiveChangeReporter({\n onActiveChange,\n}: {\n onActiveChange: (ids: string[]) => void;\n}) {\n const ids = useActiveAnchors();\n const cbRef = useRef(onActiveChange);\n cbRef.current = onActiveChange;\n useEffect(() => {\n cbRef.current(ids);\n }, [ids]);\n return null;\n}\n\nfunction ActiveScrollSync({\n linksRef,\n}: {\n linksRef: React.MutableRefObject<Map<string, HTMLAnchorElement>>;\n}) {\n const activeId = useActiveAnchor();\n\n useEffect(() => {\n if (!activeId) return;\n const link = linksRef.current.get(activeId);\n if (!link) return;\n const container = findScrollableParent(link);\n // Don't scroll the page itself — only the inner ToC container.\n if (container === document.documentElement) return;\n scrollAnchorIntoView(link, container);\n }, [activeId, linksRef]);\n\n return null;\n}\n\n/**\n * Adapted from Fumadocs (MIT) — https://github.com/fuma-nama/fumadocs\n *\n * Scrollspy table of contents. Renders a sticky list of headings and tracks\n * which are visible in the viewport via IntersectionObserver. The active\n * range is highlighted with a thin animated bar (TocThumb).\n */\nexport function TableOfContents({\n items,\n title = \"Nesta página\",\n showThumb = true,\n single = false,\n rootMargin = \"0px 0px -70% 0px\",\n threshold = 0,\n className,\n onActiveChange,\n}: TableOfContentsProps): React.JSX.Element {\n const linksRef = useRef<Map<string, HTMLAnchorElement>>(new Map());\n\n return (\n <TOCProvider\n items={items}\n single={single}\n rootMargin={rootMargin}\n threshold={threshold}\n >\n <LinksRefContext.Provider value={linksRef}>\n <nav\n aria-label={typeof title === \"string\" ? title : \"Sumário\"}\n className={cn(\"text-sm\", className)}\n >\n {title !== null && (\n <h3 className=\"inline-flex items-center gap-1.5 text-sm font-medium mb-3 text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <Text className=\"h-4 w-4\" aria-hidden />\n {title}\n </h3>\n )}\n <TocList items={items} showThumb={showThumb} />\n {onActiveChange && (\n <ActiveChangeReporter onActiveChange={onActiveChange} />\n )}\n <ActiveScrollSync linksRef={linksRef} />\n </nav>\n </LinksRefContext.Provider>\n </TOCProvider>\n );\n}\n","import type { SVGProps } from \"react\";\n\n// Brand SVG paths mirror the react-icons/fa Font Awesome definitions used by\n// Meu Construtor, keeping product footers consistent without a react-icons dependency.\nexport const socialIconNames = [\n \"whatsapp\",\n \"instagram\",\n \"linkedin\",\n \"github\",\n \"youtube\",\n] as const;\n\nexport type SocialIconName = (typeof socialIconNames)[number];\n\ninterface SocialIconDefinition {\n viewBox: string;\n path: string;\n}\n\nexport const socialIconPaths: Record<SocialIconName, SocialIconDefinition> = {\n whatsapp: {\n viewBox: \"0 0 448 512\",\n path: \"M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z\",\n },\n instagram: {\n viewBox: \"0 0 448 512\",\n path: \"M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z\",\n },\n linkedin: {\n viewBox: \"0 0 448 512\",\n path: \"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z\",\n },\n github: {\n viewBox: \"0 0 496 512\",\n path: \"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z\",\n },\n youtube: {\n viewBox: \"0 0 576 512\",\n path: \"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z\",\n },\n};\n\nexport interface SocialIconProps\n extends Omit<SVGProps<SVGSVGElement>, \"children\" | \"name\"> {\n /** Social network glyph to render. */\n name: SocialIconName;\n /** Width and height in pixels. Default: 24. */\n size?: number | string;\n /** Accessible label. When omitted, the SVG is hidden from assistive tech. */\n title?: string;\n}\n\nexport function SocialIcon({\n name,\n size = 24,\n title,\n fill = \"currentColor\",\n ...props\n}: SocialIconProps) {\n const icon = socialIconPaths[name];\n\n return (\n <svg\n width={size}\n height={size}\n viewBox={icon.viewBox}\n fill={fill}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden={title ? undefined : true}\n role={title ? \"img\" : undefined}\n {...props}\n >\n {title ? <title>{title}</title> : null}\n <path d={icon.path} />\n </svg>\n );\n}\n\nexport type SocialIconShortcutProps = Omit<SocialIconProps, \"name\">;\n\nexport function WhatsappIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"whatsapp\" {...props} />;\n}\n\nexport function InstagramIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"instagram\" {...props} />;\n}\n\nexport function LinkedinIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"linkedin\" {...props} />;\n}\n\nexport function GithubIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"github\" {...props} />;\n}\n\nexport function YoutubeIcon(props: SocialIconShortcutProps) {\n return <SocialIcon name=\"youtube\" {...props} />;\n}\n","import type { ConversationParticipant } from \"./types\";\n\nexport const cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function getConversationInitials(participant: ConversationParticipant) {\n if (participant.initials) return participant.initials;\n\n const value = participant.name || participant.email || participant.phone || \"?\";\n return value\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part.charAt(0).toUpperCase())\n .join(\"\");\n}\n\nexport function defaultConversationDateFormatter(value: string | Date) {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const day = 24 * 60 * 60 * 1000;\n\n if (diff >= 0 && diff < day) {\n return date.toLocaleTimeString(\"pt-BR\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n }\n\n if (diff >= day && diff < day * 2) return \"Ontem\";\n\n return date.toLocaleDateString(\"pt-BR\", {\n day: \"2-digit\",\n month: \"2-digit\",\n });\n}\n\nexport function defaultConversationTimeFormatter(value: string | Date) {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n\n return date.toLocaleString(\"pt-BR\", {\n day: \"2-digit\",\n month: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationAvatarProps } from \"./types\";\nimport { cn, getConversationInitials } from \"./utils\";\n\nexport function ConversationAvatar({\n participant,\n size = \"md\",\n className,\n}: ConversationAvatarProps) {\n const sizeClass = {\n sm: \"h-9 w-9 text-sm\",\n md: \"h-11 w-11 text-base\",\n lg: \"h-12 w-12 text-lg\",\n }[size];\n\n if (participant.avatarUrl) {\n return (\n <img\n src={participant.avatarUrl}\n alt={participant.name}\n className={cn(\"flex-shrink-0 rounded-full object-cover\", sizeClass, className)}\n />\n );\n }\n\n return (\n <div\n className={cn(\n \"flex flex-shrink-0 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)]/12 font-semibold text-[var(--dashboard-primary,#37a501)]\",\n sizeClass,\n className,\n )}\n >\n {getConversationInitials(participant)}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef } from \"react\";\nimport { AlertTriangle, Bot, Loader2, Paperclip, Send } from \"lucide-react\";\nimport type { ConversationComposerProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationComposer({\n value = \"\",\n onChange,\n onSend,\n onAttachClick,\n onFileSelect,\n acceptedFileTypes,\n placeholder = \"Digite sua mensagem...\",\n disabled = false,\n sending = false,\n uploading = false,\n status = \"active\",\n inactiveLabel = \"IA esta respondendo esta conversa\",\n expiredLabel = \"Janela de atendimento expirada. Envie um template para reabrir a conversa.\",\n attachLabel = \"Enviar arquivo\",\n sendLabel = \"Enviar mensagem\",\n className,\n}: ConversationComposerProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const isExpired = status === \"expired\";\n const isAi = status === \"ai\";\n const isDisabled = disabled || status === \"disabled\" || isExpired || isAi;\n const canAttach = !!onAttachClick || !!onFileSelect;\n\n if (isAi) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-2 border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] px-4 py-4 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\",\n className,\n )}\n >\n <Bot size={16} className=\"text-[var(--dashboard-primary,#37a501)]\" />\n {inactiveLabel}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"border-t border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] px-4 py-3 sm:px-6\",\n className,\n )}\n >\n {isExpired && (\n <div className=\"mb-2 flex items-center gap-2 rounded-lg border border-[var(--dashboard-status-warning,#f59e0b)]/30 bg-[var(--dashboard-status-warning,#f59e0b)]/10 p-2 text-xs text-[var(--dashboard-status-warning,#f59e0b)]\">\n <AlertTriangle size={16} className=\"flex-shrink-0\" />\n <p>{expiredLabel}</p>\n </div>\n )}\n\n {onFileSelect && (\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n accept={acceptedFileTypes}\n onChange={(event) => {\n const file = event.target.files?.[0];\n if (file) void onFileSelect(file);\n event.target.value = \"\";\n }}\n />\n )}\n\n <div className=\"flex items-center gap-2\">\n {canAttach && (\n <button\n type=\"button\"\n onClick={() => {\n onAttachClick?.();\n if (onFileSelect) fileInputRef.current?.click();\n }}\n disabled={disabled || sending || uploading}\n className=\"inline-flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg text-[var(--dashboard-text-secondary,#6b7280)] transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/10 hover:text-[var(--dashboard-primary,#37a501)] disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={attachLabel}\n >\n {uploading ? (\n <Loader2 size={18} className=\"animate-spin\" />\n ) : (\n <Paperclip size={18} />\n )}\n </button>\n )}\n\n <input\n type=\"text\"\n value={value}\n onChange={(event) => onChange?.(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n if (!isDisabled && value.trim() && !sending) onSend?.();\n }\n }}\n placeholder={isExpired ? \"Mensagens livres indisponiveis\" : placeholder}\n disabled={isDisabled || sending}\n className=\"h-10 min-w-0 flex-1 rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/25 bg-[var(--dashboard-surface,#ffffff)] px-4 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] outline-none transition-colors focus:border-[var(--dashboard-primary,#37a501)] focus:ring-2 focus:ring-[var(--dashboard-primary,#37a501)]/20 disabled:cursor-not-allowed disabled:bg-[var(--dashboard-text-secondary,#6b7280)]/8 disabled:opacity-60\"\n />\n\n <button\n type=\"button\"\n onClick={onSend}\n disabled={isDisabled || sending || !value.trim()}\n className=\"inline-flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-[var(--dashboard-primary,#37a501)] text-white transition-colors hover:brightness-110 disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={sendLabel}\n >\n {sending ? (\n <Loader2 size={18} className=\"animate-spin\" />\n ) : (\n <Send size={18} />\n )}\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationEventSeparatorProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationEventSeparator({\n label,\n description,\n className,\n}: ConversationEventSeparatorProps) {\n return (\n <div\n className={cn(\"group relative flex w-full items-center gap-3 py-1\", className)}\n title={typeof description === \"string\" ? description : undefined}\n >\n <div className=\"h-px flex-1 bg-[var(--dashboard-text-secondary,#6b7280)]/25\" />\n <span className=\"whitespace-nowrap text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {label}\n </span>\n <div className=\"h-px flex-1 bg-[var(--dashboard-text-secondary,#6b7280)]/25\" />\n {description && (\n <div className=\"pointer-events-none absolute left-1/2 top-full z-10 mt-2 max-w-sm -translate-x-1/2 opacity-0 transition-opacity group-hover:opacity-100\">\n <div className=\"rounded-lg bg-[var(--dashboard-text-primary,#2d2d2d)] px-3 py-2 text-xs text-[var(--dashboard-surface,#ffffff)] shadow-lg\">\n {description}\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationSupportBadgeProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationSupportBadge({\n status,\n label,\n className,\n}: ConversationSupportBadgeProps) {\n if (!status || status === \"none\") return null;\n\n const classes =\n status === \"requested\"\n ? \"bg-[var(--dashboard-status-warning,#f59e0b)] text-white\"\n : \"bg-[var(--dashboard-primary,#37a501)] text-white\";\n\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-[11px] font-semibold\",\n status === \"requested\" && \"animate-pulse\",\n classes,\n className,\n )}\n >\n {label || (status === \"requested\" ? \"Aguardando\" : \"Em suporte\")}\n </span>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type {\n ConversationListItemProps,\n ConversationPreviewCardProps,\n} from \"./types\";\nimport { ConversationAvatar } from \"./ConversationAvatar\";\nimport { ConversationSupportBadge } from \"./ConversationSupportBadge\";\nimport { cn, defaultConversationDateFormatter } from \"./utils\";\n\nexport function ConversationPreviewCard({\n item,\n selected = item.selected,\n onSelect,\n formatDate = defaultConversationDateFormatter,\n variant = \"card\",\n showContact = true,\n showMeta = true,\n showSupportBadge = true,\n showUnreadBadge = true,\n contentClassName,\n className,\n}: ConversationPreviewCardProps) {\n const timeLabel =\n item.lastMessageLabel ||\n (item.lastMessageAt ? formatDate(item.lastMessageAt) : undefined);\n const compact = variant === \"compact\";\n const list = variant === \"list\";\n\n const content = (\n <div\n className={cn(\n \"flex gap-3\",\n compact ? \"px-3 py-3\" : \"px-4 py-4\",\n contentClassName,\n )}\n >\n <ConversationAvatar participant={item.participant} size={compact ? \"md\" : \"lg\"} />\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-1 flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {item.participant.name}\n </h3>\n {showContact && (item.participant.phone || item.participant.email) && (\n <p className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {item.participant.phone || item.participant.email}\n </p>\n )}\n </div>\n {timeLabel && (\n <span className=\"flex-shrink-0 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {timeLabel}\n </span>\n )}\n </div>\n\n {item.lastMessage && (\n <p\n className={cn(\n \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n compact ? \"truncate text-xs\" : \"truncate text-sm\",\n )}\n >\n {item.lastMessage}\n </p>\n )}\n\n {(showMeta || showSupportBadge || showUnreadBadge) && (\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {showMeta ? (\n <span className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {typeof item.messageCount === \"number\"\n ? `${item.messageCount} mensagens`\n : item.meta}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n {showSupportBadge && (\n <ConversationSupportBadge\n status={item.supportStatus}\n label={item.supportLabel}\n />\n )}\n {showUnreadBadge && !!item.unreadCount && item.unreadCount > 0 && (\n <span className=\"inline-flex min-w-5 items-center justify-center rounded-full bg-[var(--dashboard-primary,#37a501)] px-1.5 py-0.5 text-xs font-semibold text-white\">\n {item.unreadCount}\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n\n const itemClassName = cn(\n \"group w-full text-left transition-colors\",\n onSelect && \"hover:bg-[var(--dashboard-primary,#37a501)]/8\",\n list\n ? selected\n ? \"border-l-4 border-[var(--dashboard-primary,#37a501)] bg-[var(--dashboard-primary,#37a501)]/10\"\n : item.supportStatus === \"requested\"\n ? \"border-l-4 border-[var(--dashboard-status-warning,#f59e0b)] bg-[var(--dashboard-status-warning,#f59e0b)]/8\"\n : item.supportStatus === \"active\"\n ? \"border-l-4 border-[var(--dashboard-primary,#37a501)] bg-[var(--dashboard-primary,#37a501)]/5\"\n : \"border-l-4 border-transparent\"\n : cn(\n \"rounded-lg border bg-[var(--dashboard-surface,#ffffff)] shadow-sm\",\n compact\n ? \"border-[var(--dashboard-text-secondary,#6b7280)]/15\"\n : \"border-[var(--dashboard-text-secondary,#6b7280)]/20\",\n selected\n ? \"border-[var(--dashboard-primary,#37a501)] ring-2 ring-[var(--dashboard-primary,#37a501)]/15\"\n : item.supportStatus === \"requested\"\n ? \"border-[var(--dashboard-status-warning,#f59e0b)]/35\"\n : \"hover:border-[var(--dashboard-primary,#37a501)]/35\",\n ),\n item.disabled && \"cursor-not-allowed opacity-60\",\n className,\n );\n\n if (onSelect) {\n return (\n <button\n type=\"button\"\n disabled={item.disabled}\n onClick={() => onSelect(item)}\n className={itemClassName}\n >\n {content}\n </button>\n );\n }\n\n return <div className={itemClassName}>{content}</div>;\n}\n\nexport function ConversationListItem(props: ConversationListItemProps) {\n return <ConversationPreviewCard {...props} variant=\"list\" />;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Search, X } from \"lucide-react\";\nimport type { ConversationSearchProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationSearch({\n value = \"\",\n placeholder = \"Buscar conversas...\",\n onChange,\n onClear,\n className,\n}: ConversationSearchProps) {\n return (\n <div className={cn(\"relative w-full\", className)}>\n <Search\n size={18}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-[var(--dashboard-primary,#37a501)]/60\"\n />\n <input\n type=\"search\"\n value={value}\n onChange={(event) => onChange?.(event.target.value)}\n placeholder={placeholder}\n className=\"h-10 w-full rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/25 bg-[var(--dashboard-surface,#ffffff)] pl-10 pr-10 text-sm text-[var(--dashboard-text-primary,#2d2d2d)] outline-none transition-colors focus:border-[var(--dashboard-primary,#37a501)] focus:ring-2 focus:ring-[var(--dashboard-primary,#37a501)]/20\"\n />\n {value && (\n <button\n type=\"button\"\n onClick={onClear || (() => onChange?.(\"\"))}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 rounded p-1 text-[var(--dashboard-text-secondary,#6b7280)] transition-colors hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n aria-label=\"Limpar busca\"\n >\n <X size={16} />\n </button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { MessageCircle } from \"lucide-react\";\nimport { EmptyState } from \"../EmptyState\";\nimport { Loading } from \"../Loading\";\nimport type { ConversationListProps } from \"./types\";\nimport { ConversationPreviewCard } from \"./ConversationPreviewCard\";\nimport { ConversationSearch } from \"./ConversationSearch\";\nimport { cn } from \"./utils\";\n\nexport function ConversationList({\n items,\n selectedId,\n searchValue = \"\",\n searchPlaceholder = \"Buscar conversas...\",\n onSearchChange,\n onClearSearch,\n onSelect,\n loading = false,\n emptyTitle = \"Nenhuma conversa encontrada\",\n emptyDescription,\n formatDate,\n className,\n}: ConversationListProps) {\n return (\n <aside\n className={cn(\n \"flex min-h-0 flex-col overflow-hidden border-r border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)]\",\n className,\n )}\n >\n {(onSearchChange || searchValue) && (\n <div className=\"flex h-20 shrink-0 items-center border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 px-4\">\n <ConversationSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n onClear={onClearSearch}\n className=\"w-full\"\n />\n </div>\n )}\n\n <div className=\"conversation-scrollbar min-h-0 flex-1 overflow-y-auto divide-y divide-[var(--dashboard-text-secondary,#6b7280)]/15\">\n {loading ? (\n <div className=\"flex h-full min-h-64 items-center justify-center p-6\">\n <Loading size=\"md\" text=\"Carregando conversas...\" />\n </div>\n ) : items.length === 0 ? (\n <EmptyState\n icon={<MessageCircle className=\"h-8 w-8 text-[var(--dashboard-text-secondary,#6b7280)]\" />}\n title={emptyTitle}\n description={emptyDescription}\n />\n ) : (\n items.map((item) => (\n <ConversationPreviewCard\n key={item.id}\n item={item}\n selected={item.id === selectedId || item.selected}\n onSelect={onSelect}\n formatDate={formatDate}\n variant=\"list\"\n />\n ))\n )}\n </div>\n </aside>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { FileText, Loader2, Paperclip } from \"lucide-react\";\nimport type { ConversationMediaPreviewProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationMediaPreview({\n message,\n onMediaOpen,\n className,\n}: ConversationMediaPreviewProps) {\n const { media, kind } = message;\n\n if (kind === \"loading-media\") {\n return (\n <div className={cn(\"flex items-center gap-2 py-2 text-sm opacity-75\", className)}>\n <Loader2 size={16} className=\"animate-spin\" />\n <span>{message.pendingLabel || \"Carregando midia...\"}</span>\n </div>\n );\n }\n\n if (!media?.url) return null;\n\n if (kind === \"image\") {\n return (\n <button\n type=\"button\"\n onClick={() => onMediaOpen?.(message)}\n className={cn(\"block overflow-hidden rounded-md text-left\", className)}\n >\n <img\n src={media.url}\n alt={media.alt || media.fileName || \"Imagem da conversa\"}\n className=\"max-h-64 max-w-full rounded-md object-contain\"\n loading=\"lazy\"\n />\n </button>\n );\n }\n\n if (kind === \"audio\") {\n return (\n <div className={cn(\"space-y-2\", className)}>\n <audio controls className=\"max-w-full min-w-60\">\n <source src={media.url} type={media.mimeType || \"audio/ogg\"} />\n </audio>\n {message.content && (\n <p className=\"text-xs italic opacity-70\">{message.content}</p>\n )}\n </div>\n );\n }\n\n if (kind === \"video\") {\n return (\n <video controls className={cn(\"max-h-64 max-w-full rounded-md\", className)}>\n <source src={media.url} type={media.mimeType || \"video/mp4\"} />\n </video>\n );\n }\n\n return (\n <a\n href={media.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"flex items-center gap-2 rounded-md bg-current/10 px-3 py-2 transition-colors hover:bg-current/15\",\n className,\n )}\n >\n {kind === \"file\" ? <FileText size={18} /> : <Paperclip size={18} />}\n <span className=\"max-w-52 truncate text-sm\">\n {media.fileName || \"Documento\"}\n </span>\n </a>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationMessageBubbleProps } from \"./types\";\nimport { ConversationEventSeparator } from \"./ConversationEventSeparator\";\nimport { ConversationMediaPreview } from \"./ConversationMediaPreview\";\nimport { cn, defaultConversationTimeFormatter } from \"./utils\";\n\nexport function ConversationMessageBubble({\n message,\n onMediaOpen,\n formatTime = defaultConversationTimeFormatter,\n className,\n}: ConversationMessageBubbleProps) {\n const kind = message.kind || \"text\";\n const timeLabel =\n message.timestampLabel ||\n (message.createdAt ? formatTime(message.createdAt) : undefined);\n\n if (kind === \"event\") {\n return (\n <ConversationEventSeparator\n label={message.eventLabel || message.content}\n description={message.eventDescription}\n className={className}\n />\n );\n }\n\n if (message.direction === \"system\") {\n return (\n <div className={cn(\"flex justify-center\", className)}>\n <div className=\"max-w-lg rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-text-secondary,#6b7280)]/10 px-4 py-2 text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <p className=\"mb-1 text-xs font-medium text-[var(--dashboard-text-secondary,#6b7280)]\">\n {message.authorLabel || \"Sistema\"}\n </p>\n <div className=\"text-sm\">{message.content}</div>\n {timeLabel && (\n <p className=\"mt-1 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {timeLabel}\n </p>\n )}\n </div>\n </div>\n );\n }\n\n if (kind === \"interactive\") {\n return (\n <div\n className={cn(\n \"flex\",\n message.direction === \"outbound\" ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n <div className=\"max-w-lg rounded-lg border border-[var(--dashboard-primary,#37a501)]/25 bg-[var(--dashboard-primary,#37a501)]/10 px-4 py-2\">\n <p className=\"mb-1 text-xs font-medium text-[var(--dashboard-primary,#37a501)]\">\n {message.interactiveLabel || \"Resposta\"}\n </p>\n <p className=\"text-sm font-medium text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {message.interactiveTitle || message.content}\n </p>\n {timeLabel && (\n <p className=\"mt-1 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {timeLabel}\n </p>\n )}\n </div>\n </div>\n );\n }\n\n const outbound = message.direction === \"outbound\";\n\n return (\n <div\n className={cn(\n \"flex\",\n outbound ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n <div\n className={cn(\n \"max-w-[78%] rounded-lg px-4 py-3 text-sm shadow-sm\",\n outbound\n ? \"bg-[var(--dashboard-primary,#37a501)] text-white\"\n : \"border border-[var(--dashboard-text-secondary,#6b7280)]/18 bg-[var(--dashboard-surface,#ffffff)] text-[var(--dashboard-text-primary,#2d2d2d)]\",\n )}\n >\n {message.authorLabel && (\n <p\n className={cn(\n \"mb-1 text-xs font-medium\",\n outbound\n ? \"text-white/75\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {message.authorLabel}\n </p>\n )}\n\n {kind !== \"text\" && (\n <ConversationMediaPreview message={message} onMediaOpen={onMediaOpen} />\n )}\n\n {kind === \"text\" && message.content && (\n <div className=\"whitespace-pre-wrap break-words leading-relaxed\">\n {message.content}\n </div>\n )}\n\n {timeLabel && (\n <p\n className={cn(\n \"mt-1 text-xs\",\n outbound\n ? \"text-white/75\"\n : \"text-[var(--dashboard-text-secondary,#6b7280)]\",\n )}\n >\n {timeLabel}\n </p>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ArrowLeft, Settings } from \"lucide-react\";\nimport type { ConversationThreadHeaderProps } from \"./types\";\nimport { ConversationAvatar } from \"./ConversationAvatar\";\nimport { ConversationSupportBadge } from \"./ConversationSupportBadge\";\nimport { cn } from \"./utils\";\n\nexport function ConversationThreadHeader({\n participant,\n stats,\n subtitle,\n supportStatus,\n supportLabel,\n onBack,\n onSettingsClick,\n actions,\n className,\n}: ConversationThreadHeaderProps) {\n return (\n <div\n className={cn(\n \"flex h-20 shrink-0 items-center border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] px-4 sm:px-6\",\n className,\n )}\n >\n <div className=\"flex w-full items-center gap-3\">\n {onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-[var(--dashboard-primary,#37a501)] transition-colors hover:bg-[var(--dashboard-primary,#37a501)]/10 md:hidden\"\n aria-label=\"Voltar para lista\"\n >\n <ArrowLeft size={18} />\n </button>\n )}\n\n <ConversationAvatar participant={participant} />\n\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-baseline gap-2\">\n <h2 className=\"truncate text-sm font-semibold text-[var(--dashboard-text-primary,#2d2d2d)] sm:text-base\">\n {participant.name}\n </h2>\n {(participant.phone || participant.email) && (\n <span className=\"truncate text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {participant.phone || participant.email}\n </span>\n )}\n </div>\n {(subtitle || stats) && (\n <p className=\"mt-0.5 text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {subtitle ||\n `${stats?.total ?? 0} mensagens · ${stats?.inbound ?? 0} recebidas · ${stats?.outbound ?? 0} enviadas`}\n </p>\n )}\n </div>\n\n {onSettingsClick && (\n <button\n type=\"button\"\n onClick={onSettingsClick}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-lg text-[var(--dashboard-text-secondary,#6b7280)] transition-colors hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 hover:text-[var(--dashboard-text-primary,#2d2d2d)]\"\n aria-label=\"Configurar conversa\"\n >\n <Settings size={16} />\n </button>\n )}\n\n <div className=\"ml-auto flex items-center gap-3\">\n <ConversationSupportBadge status={supportStatus} label={supportLabel} />\n {actions}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationUnreadMarkerProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationUnreadMarker({\n label = \"Novas mensagens\",\n className,\n}: ConversationUnreadMarkerProps) {\n return (\n <div className={cn(\"flex w-full items-center gap-3\", className)}>\n <div className=\"h-px flex-1 bg-[var(--dashboard-primary,#37a501)]\" />\n <span className=\"whitespace-nowrap text-xs font-medium text-[var(--dashboard-primary,#37a501)]\">\n {label}\n </span>\n <div className=\"h-px flex-1 bg-[var(--dashboard-primary,#37a501)]\" />\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { MessageCircle } from \"lucide-react\";\nimport { EmptyState } from \"../EmptyState\";\nimport { Loading } from \"../Loading\";\nimport type { ConversationThreadProps } from \"./types\";\nimport { ConversationMessageBubble } from \"./ConversationMessageBubble\";\nimport { ConversationThreadHeader } from \"./ConversationThreadHeader\";\nimport { ConversationUnreadMarker } from \"./ConversationUnreadMarker\";\nimport { cn } from \"./utils\";\n\nexport function ConversationThread({\n participant,\n messages = [],\n stats,\n loading = false,\n loadingLabel = \"Carregando mensagens...\",\n emptyTitle = \"Selecione uma conversa\",\n emptyDescription = \"Escolha uma conversa na lista para visualizar as mensagens.\",\n unreadMessageId,\n unreadLabel,\n headerActions,\n composer,\n supportStatus,\n supportLabel,\n onBack,\n onSettingsClick,\n onMediaOpen,\n formatTime,\n messagesContainerRef,\n className,\n}: ConversationThreadProps) {\n if (!participant) {\n return (\n <section\n className={cn(\n \"flex min-h-0 flex-1 flex-col bg-[var(--dashboard-background,#f2f2f2)]\",\n className,\n )}\n >\n <EmptyState\n icon={<MessageCircle className=\"h-8 w-8 text-[var(--dashboard-primary,#37a501)]/60\" />}\n title={emptyTitle}\n description={emptyDescription}\n className=\"h-full min-h-80 flex-1\"\n />\n </section>\n );\n }\n\n return (\n <section\n className={cn(\n \"flex min-h-0 flex-1 flex-col bg-[var(--dashboard-background,#f2f2f2)]\",\n className,\n )}\n >\n <ConversationThreadHeader\n participant={participant}\n stats={stats}\n actions={headerActions}\n supportStatus={supportStatus}\n supportLabel={supportLabel}\n onBack={onBack}\n onSettingsClick={onSettingsClick}\n />\n\n <div\n ref={messagesContainerRef}\n className=\"conversation-scrollbar min-h-0 flex-1 space-y-4 overflow-y-auto p-4 sm:p-6\"\n >\n {loading ? (\n <div className=\"flex h-full min-h-64 items-center justify-center\">\n <Loading size=\"md\" text={loadingLabel} />\n </div>\n ) : messages.length === 0 ? (\n <EmptyState\n icon={<MessageCircle className=\"h-8 w-8 text-[var(--dashboard-text-secondary,#6b7280)]\" />}\n title=\"Nenhuma mensagem nesta conversa\"\n />\n ) : (\n messages.map((message) => (\n <React.Fragment key={message.id}>\n {unreadMessageId === message.id && (\n <ConversationUnreadMarker label={unreadLabel} />\n )}\n <ConversationMessageBubble\n message={message}\n onMediaOpen={onMediaOpen}\n formatTime={formatTime}\n />\n </React.Fragment>\n ))\n )}\n </div>\n\n {composer}\n </section>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationLayoutProps, ConversationPanelProps } from \"./types\";\nimport { ConversationList } from \"./ConversationList\";\nimport { ConversationThread } from \"./ConversationThread\";\nimport { cn } from \"./utils\";\n\nexport function ConversationLayout({\n title = \"Conversas\",\n subtitle,\n hideHeader = false,\n connected,\n conversations,\n selectedId,\n selectedParticipant,\n messages,\n stats,\n searchValue,\n onSearchChange,\n onClearSearch,\n onSelectConversation,\n listLoading,\n threadLoading,\n threadActions,\n composer,\n supportStatus,\n supportLabel,\n unreadMessageId,\n unreadLabel,\n onBack,\n onSettingsClick,\n onMediaOpen,\n formatListDate,\n formatMessageTime,\n className,\n}: ConversationLayoutProps) {\n return (\n <div\n className={cn(\n \"conversation-panel flex h-full min-h-0 flex-col overflow-hidden rounded-lg border border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)]\",\n className,\n )}\n >\n <style>{`\n .conversation-panel .conversation-scrollbar {\n scrollbar-color: var(--dashboard-primary,#37a501) color-mix(in srgb, var(--dashboard-primary,#37a501) 12%, transparent);\n scrollbar-width: thin;\n }\n\n .conversation-panel .conversation-scrollbar::-webkit-scrollbar {\n width: 0.5rem;\n height: 0.5rem;\n }\n\n .conversation-panel .conversation-scrollbar::-webkit-scrollbar-track {\n background: color-mix(in srgb, var(--dashboard-primary,#37a501) 10%, transparent);\n border-radius: 999px;\n }\n\n .conversation-panel .conversation-scrollbar::-webkit-scrollbar-thumb {\n background: var(--dashboard-primary,#37a501);\n border-radius: 999px;\n }\n\n .conversation-panel .conversation-scrollbar::-webkit-scrollbar-thumb:hover {\n background: color-mix(in srgb, var(--dashboard-primary,#37a501) 84%, var(--dashboard-text-primary,#2d2d2d));\n }\n `}</style>\n {!hideHeader && (title || subtitle || typeof connected === \"boolean\") && (\n <div className=\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 bg-[var(--dashboard-surface,#ffffff)] px-4 py-4 sm:px-6\">\n {(title || typeof connected === \"boolean\") && (\n <div className=\"flex items-center gap-2\">\n {title && (\n <h1 className=\"text-xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h1>\n )}\n {typeof connected === \"boolean\" && (\n <span\n className={cn(\n \"h-2 w-2 rounded-full\",\n connected\n ? \"bg-[var(--dashboard-primary,#37a501)]\"\n : \"bg-[var(--dashboard-text-secondary,#6b7280)]/40\",\n )}\n title={connected ? \"Conectado em tempo real\" : \"Desconectado\"}\n />\n )}\n </div>\n )}\n {subtitle && (\n <p className=\"mt-1 text-sm text-[var(--dashboard-text-secondary,#6b7280)]\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <ConversationList\n items={conversations}\n selectedId={selectedId}\n searchValue={searchValue}\n onSearchChange={onSearchChange}\n onClearSearch={onClearSearch}\n onSelect={onSelectConversation}\n loading={listLoading}\n formatDate={formatListDate}\n className={cn(\n \"w-full md:flex md:w-80 lg:w-96\",\n selectedParticipant ? \"hidden md:flex\" : \"flex\",\n )}\n />\n\n <ConversationThread\n participant={selectedParticipant}\n messages={messages}\n stats={stats}\n loading={threadLoading}\n headerActions={threadActions}\n composer={composer}\n supportStatus={supportStatus}\n supportLabel={supportLabel}\n unreadMessageId={unreadMessageId}\n unreadLabel={unreadLabel}\n onBack={onBack}\n onSettingsClick={onSettingsClick}\n onMediaOpen={onMediaOpen}\n formatTime={formatMessageTime}\n className={cn(selectedParticipant ? \"flex\" : \"hidden md:flex\")}\n />\n </div>\n </div>\n );\n}\n\nexport function ConversationPanel(props: ConversationPanelProps) {\n return <ConversationLayout {...props} />;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport type { ConversationSupportActionsProps } from \"./types\";\nimport { cn } from \"./utils\";\n\nexport function ConversationSupportActions({\n status,\n stats,\n reason,\n startLabel = \"Assumir conversa\",\n endLabel = \"Encerrar atendimento\",\n endSilentLabel = \"Encerrar sem notificar\",\n onStart,\n onEnd,\n onEndSilent,\n startDisabled,\n endDisabled,\n endSilentDisabled,\n activeActions,\n inactiveActions,\n className,\n}: ConversationSupportActionsProps) {\n if (status === \"active\") {\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {activeActions}\n {onEndSilent && (\n <button\n type=\"button\"\n onClick={onEndSilent}\n disabled={endSilentDisabled}\n className=\"rounded-lg bg-[var(--dashboard-text-secondary,#6b7280)] px-4 py-2 text-sm font-medium text-white transition-colors hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {endSilentLabel}\n </button>\n )}\n {onEnd && (\n <button\n type=\"button\"\n onClick={onEnd}\n disabled={endDisabled}\n className=\"rounded-lg bg-[var(--dashboard-status-danger,#ef4444)] px-4 py-2 text-sm font-medium text-white transition-colors hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {endLabel}\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex items-center gap-3\", className)}>\n {inactiveActions}\n {(stats || reason) && (\n <div className=\"text-right\">\n {stats && (\n <>\n <p className=\"text-xs font-medium text-[var(--dashboard-primary,#37a501)]\">\n {stats.total ?? 0} mensagens\n </p>\n <p className=\"text-xs text-[var(--dashboard-text-secondary,#6b7280)]\">\n {stats.inbound ?? 0} recebidas · {stats.outbound ?? 0} enviadas\n </p>\n </>\n )}\n {reason && (\n <p className=\"mt-1 text-xs text-[var(--dashboard-status-warning,#f59e0b)]\">\n {reason}\n </p>\n )}\n </div>\n )}\n {onStart && (\n <button\n type=\"button\"\n onClick={onStart}\n disabled={startDisabled}\n className=\"rounded-lg bg-[var(--dashboard-primary,#37a501)] px-4 py-2 text-sm font-medium text-white transition-colors hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {startLabel}\n </button>\n )}\n </div>\n );\n}\n","import {\n FileText,\n Image as ImageIcon,\n Mic,\n PlaySquare,\n} from \"lucide-react\";\n\nexport { ConversationAvatar } from \"./ConversationAvatar\";\nexport { ConversationComposer } from \"./ConversationComposer\";\nexport { ConversationEventSeparator } from \"./ConversationEventSeparator\";\nexport { ConversationLayout, ConversationPanel } from \"./ConversationLayout\";\nexport { ConversationList } from \"./ConversationList\";\nexport {\n ConversationListItem,\n ConversationPreviewCard,\n} from \"./ConversationPreviewCard\";\nexport { ConversationMediaPreview } from \"./ConversationMediaPreview\";\nexport { ConversationMessageBubble } from \"./ConversationMessageBubble\";\nexport { ConversationSearch } from \"./ConversationSearch\";\nexport { ConversationSupportActions } from \"./ConversationSupportActions\";\nexport { ConversationSupportBadge } from \"./ConversationSupportBadge\";\nexport { ConversationThread } from \"./ConversationThread\";\nexport { ConversationThreadHeader } from \"./ConversationThreadHeader\";\nexport { ConversationUnreadMarker } from \"./ConversationUnreadMarker\";\n\nexport type {\n ConversationAvatarProps,\n ConversationComposerProps,\n ConversationEventSeparatorProps,\n ConversationLayoutProps,\n ConversationListItemData,\n ConversationListItemProps,\n ConversationListProps,\n ConversationMediaPreviewProps,\n ConversationMessageBubbleProps,\n ConversationMessageData,\n ConversationMessageDirection,\n ConversationMessageKind,\n ConversationMessageMedia,\n ConversationPanelProps,\n ConversationParticipant,\n ConversationPreviewCardProps,\n ConversationPreviewVariant,\n ConversationSearchProps,\n ConversationStats,\n ConversationSupportActionsProps,\n ConversationSupportBadgeProps,\n ConversationSupportStatus,\n ConversationThreadHeaderProps,\n ConversationThreadProps,\n ConversationUnreadMarkerProps,\n} from \"./types\";\n\nexport const conversationMessageIcons = {\n image: ImageIcon,\n audio: Mic,\n video: PlaySquare,\n file: FileText,\n};\n","import type { DashboardConfig } from \"./types\";\n\nexport const defaultConfig: DashboardConfig = {\n name: \"Dashboard\",\n colors: {\n primary: \"#2563EB\",\n secondary: \"#F1F5F9\",\n background: \"#F8FAFC\",\n surface: \"#FFFFFF\",\n textPrimary: \"#0F172A\",\n textSecondary: \"#64748B\",\n sidebarBg: \"#f0f0f0\",\n sidebarBorder: \"#e0dfe3\",\n sidebarText: \"#403f52\",\n sidebarActiveText: \"#ff521d\",\n statusSuccess: \"#059669\",\n statusDanger: \"#DC2626\",\n statusWarning: \"#D97706\",\n statusInfo: \"#2563EB\",\n statusNeutral: \"#64748B\",\n tooltipBg: \"#1a1a1a\",\n tooltipText: \"#ffffff\",\n },\n components: {\n modal: {\n closeOnEscape: true,\n closeOnOverlayClick: true,\n },\n toast: {\n duration: 3000,\n position: \"top-right\",\n },\n notification: {\n duration: 5000,\n },\n pagination: {\n itemsPerPageOptions: [10, 20, 30, 50],\n defaultItemsPerPage: 10,\n },\n },\n};\n","import type { DashboardConfig } from \"./types\";\nimport { defaultConfig } from \"./defaults\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nfunction deepMerge<T>(target: T, source: DeepPartial<T>): T {\n const result = { ...target } as Record<string, unknown>;\n const src = source as Record<string, unknown>;\n\n for (const key in src) {\n const sourceVal = src[key];\n const targetVal = result[key];\n\n if (\n sourceVal !== null &&\n sourceVal !== undefined &&\n typeof sourceVal === \"object\" &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === \"object\" &&\n targetVal !== null &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal,\n sourceVal as DeepPartial<typeof targetVal>,\n );\n } else if (sourceVal !== undefined) {\n result[key] = sourceVal;\n }\n }\n\n return result as T;\n}\n\nexport function createConfig(\n overrides: DeepPartial<DashboardConfig> = {},\n): DashboardConfig {\n return deepMerge(defaultConfig, overrides);\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\nimport type { DashboardConfig } from \"../config/types\";\n\nexport const ConfigContext = createContext<DashboardConfig | null>(null);\n\nexport function useConfig(): DashboardConfig {\n const config = useContext(ConfigContext);\n if (!config) {\n throw new Error(\"useConfig must be used within a DashboardProvider\");\n }\n return config;\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport type Theme = \"light\" | \"dark\" | \"system\";\n\nexport interface ThemeContextType {\n theme: Theme;\n setTheme: (theme: Theme) => void;\n resolvedTheme: \"light\" | \"dark\";\n}\n\nexport const ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport function useTheme(): ThemeContextType {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useTheme must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { ThemeContext } from \"../hooks/useTheme\";\nimport type { Theme } from \"../hooks/useTheme\";\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [theme, setThemeState] = useState<Theme>(\"system\");\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n useEffect(() => {\n const savedTheme = localStorage.getItem(\"dashboard-theme\") as Theme | null;\n if (savedTheme) {\n setThemeState(savedTheme);\n }\n\n const systemPreference = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\";\n\n const currentTheme = savedTheme || \"system\";\n const resolved =\n currentTheme === \"system\" ? systemPreference : currentTheme;\n setResolvedTheme(resolved);\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const handleChange = (e: MediaQueryListEvent) => {\n const current = localStorage.getItem(\"dashboard-theme\") as Theme | null;\n if (!current || current === \"system\") {\n const newResolved = e.matches ? \"dark\" : \"light\";\n setResolvedTheme(newResolved);\n document.documentElement.classList.toggle(\n \"dark\",\n newResolved === \"dark\",\n );\n }\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n localStorage.setItem(\"dashboard-theme\", newTheme);\n\n const systemPreference = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\";\n\n const resolved = newTheme === \"system\" ? systemPreference : newTheme;\n setResolvedTheme(resolved);\n document.documentElement.classList.toggle(\"dark\", resolved === \"dark\");\n };\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme, resolvedTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport interface LoadingContextType {\n isLoading: boolean;\n showLoading: () => void;\n hideLoading: () => void;\n}\n\nexport const LoadingContext = createContext<LoadingContextType | null>(null);\n\nexport function useLoading(): LoadingContextType {\n const context = useContext(LoadingContext);\n if (!context) {\n throw new Error(\"useLoading must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { LoadingContext } from \"../hooks/useLoading\";\nimport { Loading } from \"../components/Loading\";\n\nexport function LoadingProvider({ children }: { children: React.ReactNode }) {\n const [isLoading, setIsLoading] = useState(false);\n\n const showLoading = () => setIsLoading(true);\n const hideLoading = () => setIsLoading(false);\n\n return (\n <LoadingContext.Provider value={{ isLoading, showLoading, hideLoading }}>\n {children}\n {isLoading && <Loading size=\"lg\" text=\"Carregando...\" fullscreen />}\n </LoadingContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useContext, createContext } from \"react\";\n\nexport interface Notification {\n id: string;\n title: string;\n subtitle: string;\n type: \"success\" | \"error\" | \"warning\" | \"info\";\n}\n\nexport interface NotificationsContextType {\n notifications: Notification[];\n addNotification: (notification: Omit<Notification, \"id\">) => void;\n removeNotification: (id: string) => void;\n clearNotifications: () => void;\n}\n\nexport const NotificationsContext =\n createContext<NotificationsContextType | null>(null);\n\nexport function useNotifications(): NotificationsContextType {\n const context = useContext(NotificationsContext);\n if (!context) {\n throw new Error(\"useNotifications must be used within a DashboardProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport { NotificationsContext } from \"../hooks/useNotifications\";\nimport type { Notification } from \"../hooks/useNotifications\";\nimport { useConfig } from \"../hooks/useConfig\";\nimport { Toast } from \"../components/Toast\";\n\nexport function NotificationsProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [notifications, setNotifications] = useState<Notification[]>([]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n const config = useConfig();\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n };\n }, []);\n\n const removeNotification = useCallback((id: string) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setNotifications((prev) => prev.filter((n) => n.id !== id));\n }, []);\n\n const addNotification = useCallback(\n (notification: Omit<Notification, \"id\">) => {\n const id = Math.random().toString(36).substring(2, 9);\n const newNotification: Notification = { ...notification, id };\n setNotifications((prev) => [...prev, newNotification]);\n },\n [],\n );\n\n const clearNotifications = useCallback(() => {\n timersRef.current.forEach((timer) => clearTimeout(timer));\n timersRef.current.clear();\n setNotifications([]);\n }, []);\n\n const duration = config.components.notification.duration;\n\n return (\n <NotificationsContext.Provider\n value={{\n notifications,\n addNotification,\n removeNotification,\n clearNotifications,\n }}\n >\n {children}\n {notifications.length > 0 && (\n <div className=\"fixed w-full max-w-[400px] px-4 z-[10002] top-4 left-1/2 -translate-x-1/2 sm:top-5 sm:right-4 sm:left-auto sm:translate-x-0 flex flex-col gap-2\">\n {notifications.map((notification) => (\n <Toast\n key={notification.id}\n title={notification.title}\n subtitle={notification.subtitle}\n type={notification.type}\n duration={duration}\n onClose={() => removeNotification(notification.id)}\n />\n ))}\n </div>\n )}\n </NotificationsContext.Provider>\n );\n}\n","\"use client\";\n\nimport React, { useLayoutEffect, useMemo } from \"react\";\nimport type { DashboardConfig } from \"../config/types\";\nimport { createConfig } from \"../config/createConfig\";\nimport { ConfigContext } from \"../hooks/useConfig\";\nimport { ThemeProvider } from \"./ThemeProvider\";\nimport { LoadingProvider } from \"./LoadingProvider\";\nimport { NotificationsProvider } from \"./NotificationsProvider\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\ninterface DashboardProviderProps {\n config?: DeepPartial<DashboardConfig>;\n children: React.ReactNode;\n}\n\nfunction CSSVarsInjector({ config }: { config: DashboardConfig }) {\n useLayoutEffect(() => {\n const root = document.documentElement;\n const { colors } = config;\n\n root.style.setProperty(\"--dashboard-primary\", colors.primary);\n root.style.setProperty(\"--dashboard-secondary\", colors.secondary);\n root.style.setProperty(\"--dashboard-background\", colors.background);\n root.style.setProperty(\"--dashboard-surface\", colors.surface);\n root.style.setProperty(\"--dashboard-text-primary\", colors.textPrimary);\n root.style.setProperty(\"--dashboard-text-secondary\", colors.textSecondary);\n root.style.setProperty(\"--dashboard-sidebar-bg\", colors.sidebarBg);\n root.style.setProperty(\"--dashboard-sidebar-border\", colors.sidebarBorder);\n root.style.setProperty(\"--dashboard-sidebar-text\", colors.sidebarText);\n root.style.setProperty(\"--dashboard-sidebar-active-text\", colors.sidebarActiveText);\n root.style.setProperty(\"--dashboard-status-success\", colors.statusSuccess);\n root.style.setProperty(\"--dashboard-status-danger\", colors.statusDanger);\n root.style.setProperty(\"--dashboard-status-warning\", colors.statusWarning);\n root.style.setProperty(\"--dashboard-status-info\", colors.statusInfo);\n root.style.setProperty(\"--dashboard-status-neutral\", colors.statusNeutral);\n root.style.setProperty(\"--dashboard-tooltip-bg\", colors.tooltipBg);\n root.style.setProperty(\"--dashboard-tooltip-text\", colors.tooltipText);\n // No cleanup — vars are always overwritten on re-render.\n // Removing them mid-transition causes a flash to hardcoded fallback\n // colors in component classes (e.g. #2A6510 in Sidebar borders).\n }, [config]);\n\n return null;\n}\n\nexport function DashboardProvider({\n config: configOverrides,\n children,\n}: DashboardProviderProps) {\n const config = useMemo(\n () => createConfig(configOverrides),\n [configOverrides],\n );\n\n return (\n <ConfigContext.Provider value={config}>\n <CSSVarsInjector config={config} />\n <ThemeProvider>\n <LoadingProvider>\n <NotificationsProvider>{children}</NotificationsProvider>\n </LoadingProvider>\n </ThemeProvider>\n </ConfigContext.Provider>\n );\n}\n","/**\n * Tokens centralizados de tamanho para componentes de formulário.\n *\n * Garante que Button, Input, Dropdown e outros componentes de linha\n * compartilhem a mesma altura para cada variante de tamanho.\n *\n * Escala baseada no padrão Tailwind / shadcn/ui:\n * sm → h-8 (32px) — compacto, tabelas densas\n * md → h-9 (36px) — padrão\n * lg → h-10 (40px) — destaque\n */\n\nexport type ComponentSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SizeToken {\n /** Altura fixa do componente (Tailwind height class) */\n height: string;\n /** Padding horizontal */\n paddingX: string;\n /** Padding vertical (quando não usa height fixo) */\n paddingY: string;\n /** Classe de font-size do Tailwind */\n font: string;\n}\n\nexport const componentSizes: Record<ComponentSize, SizeToken> = {\n sm: {\n height: \"h-8\",\n paddingX: \"px-3\",\n paddingY: \"py-0\",\n font: \"text-xs\",\n },\n md: {\n height: \"h-9\",\n paddingX: \"px-4\",\n paddingY: \"py-0\",\n font: \"text-sm\",\n },\n lg: {\n height: \"h-10\",\n paddingX: \"px-6\",\n paddingY: \"py-0\",\n font: \"text-base\",\n },\n};\n\n/** Tokens para componentes que não precisam de height fixo (badges, tags) */\nexport interface BadgeSizeToken {\n padding: string;\n font: string;\n}\n\nexport const badgeSizes: Record<ComponentSize, BadgeSizeToken> = {\n sm: { padding: \"px-2 py-0.5\", font: \"text-xs\" },\n md: { padding: \"px-3 py-1\", font: \"text-sm\" },\n lg: { padding: \"px-3 py-1\", font: \"text-sm\" },\n};\n\n/** Tokens de largura máxima para Modal */\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\";\n\nexport const modalSizes: Record<ModalSize, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-2xl\",\n \"2xl\": \"max-w-4xl\",\n \"3xl\": \"max-w-screen-xl\",\n};\n"],"mappings":"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"}