@tree-ia/design-system 1.5.3 → 1.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +7 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +40 -30
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["cn","cn","cn","cn","cn","cn","sizeConfig","cn","sizeClasses","cn","cn","cn","cn","ChartJS","Title","Tooltip","cn","ChartJS","Title","Tooltip","cn","ChartJS","Title","Tooltip","cn","ChartJS","Tooltip","cn","cn","ChartJS","Title","Tooltip","cn","cn","cn","cn","cn","cn","cn","cn","cn","ImageIcon","cn","cn","cn","cn","cn"],"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/Title/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/components/BadgeStatus/index.tsx","../src/components/Sidebar/index.tsx","../src/hooks/useTheme.ts","../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/Breadcrumb/index.tsx","../src/components/Combobox/index.tsx","../src/components/Alert/index.tsx","../src/components/EmptyState/index.tsx","../src/components/StatusBadge/index.tsx","../src/config/defaults.ts","../src/config/createConfig.ts","../src/hooks/useConfig.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"],"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: \"px-2 py-1 text-xs sm:px-3 sm:py-1.5 sm:text-sm\",\n md: \"px-3 py-1.5 text-sm sm:px-4 sm:py-2 sm:text-base\",\n lg: \"px-4 py-2 text-base sm:px-6 sm:py-3 sm:text-lg\",\n };\n\n const iconOnlySizeStyles = {\n sm: \"w-7 h-7 sm:w-8 sm:h-8\",\n md: \"w-9 h-9 sm:w-10 sm:h-10\",\n lg: \"w-10 h-10 sm:w-12 sm:h-12\",\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 React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n children?: ReactNode;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", label, error, children, id, ...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 h-10 w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] px-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 disabled:cursor-not-allowed disabled:opacity-50\",\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?: \"small\" | \"medium\" | \"large\";\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 = \"medium\",\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 small: {\n container: \"h-8 px-2\",\n text: \"text-xs\",\n wrapper: \"space-y-1\",\n label: \"text-sm\",\n iconPadding: \"pl-8\",\n },\n medium: {\n container: \"h-10 px-3\",\n text: \"text-sm\",\n wrapper: \"space-y-2\",\n label: \"text-base\",\n iconPadding: \"pl-10\",\n },\n large: {\n container: \"h-12 px-4\",\n text: \"text-lg\",\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?: \"small\" | \"medium\" | \"large\" | \"extraLarge\" | \"largeXl\";\n disableSaveButton?: boolean;\n saveButtonVariant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n closeOnEscape?: boolean;\n closeOnOverlayClick?: boolean;\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 = \"medium\",\n disableSaveButton = false,\n saveButtonVariant = \"primary\",\n closeOnEscape = true,\n closeOnOverlayClick = true,\n}: ModalProps) {\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(isOpen);\n const modalRef = useRef<HTMLDivElement>(null);\n const prevIsOpenRef = useRef(false);\n\n const sizeClasses = {\n small: \"max-w-sm\",\n medium: \"max-w-md\",\n large: \"max-w-lg\",\n largeXl: \"max-w-4xl\",\n extraLarge: \"max-w-screen-xl\",\n };\n\n useEffect(() => {\n if (isOpen && !prevIsOpenRef.current) {\n setShouldRender(true);\n setIsClosing(false);\n } else if (!isOpen && prevIsOpenRef.current) {\n setIsClosing(true);\n const timer = setTimeout(() => {\n setShouldRender(false);\n setIsClosing(false);\n }, 150);\n return () => clearTimeout(timer);\n }\n prevIsOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleClose = useCallback(() => {\n setIsClosing(true);\n setTimeout(() => {\n setIsClosing(false);\n onClose();\n }, 150);\n }, [onClose]);\n\n useEffect(() => {\n if (!closeOnOverlayClick) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n modalRef.current &&\n !modalRef.current.contains(event.target as Node) &&\n !target.closest(\"[data-modal-ignore]\")\n ) {\n handleClose();\n }\n };\n\n if (shouldRender && !isClosing) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n if (!shouldRender) {\n document.body.style.overflow = \"auto\";\n }\n };\n }, [shouldRender, isClosing, handleClose, closeOnOverlayClick]);\n\n useEffect(() => {\n if (!closeOnEscape) return;\n\n const handleEscKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n handleClose();\n }\n };\n\n if (shouldRender && !isClosing) {\n document.addEventListener(\"keydown\", handleEscKey);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscKey);\n };\n }, [shouldRender, isClosing, handleClose, closeOnEscape]);\n\n if (!shouldRender && !isOpen) 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=\"small\"\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","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 items-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}\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 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 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,#2A6510)]\" />\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,#FFFFFF)]/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,#5DD611)]\"\n : \"text-[var(--dashboard-sidebar-text,#FFFFFF)] hover:bg-[var(--dashboard-primary,#37a501)]/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,#2A6510)]\"\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,#5DD611)] font-semibold border-l-2 border-[var(--dashboard-primary,#37a501)] -ml-[2px]\"\n : \"text-[var(--dashboard-sidebar-text,#FFFFFF)] hover:text-[var(--dashboard-sidebar-active-text,#5DD611)]\",\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,#37a501)]/25 text-[var(--dashboard-sidebar-active-text,#5DD611)]\"\n : \"text-[var(--dashboard-sidebar-text,#FFFFFF)] hover:bg-[var(--dashboard-primary,#37a501)]/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,#1B4D08)] border-b border-[var(--dashboard-sidebar-border,#2A6510)]\">\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-white/10 text-[var(--dashboard-sidebar-text,#FFFFFF)] hover:bg-white/20 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,#1B4D08)] border-b border-[var(--dashboard-sidebar-border,#2A6510)] 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,#2A6510)] 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,#37a501)]/5 hover:bg-[var(--dashboard-primary,#37a501)]/10 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#37a501)]/30 text-[var(--dashboard-sidebar-text,#FFFFFF)] 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,#FFFFFF)]/60 whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-sidebar-text,#FFFFFF)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#FFFFFF)]/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,#FFFFFF)] hover:bg-[var(--dashboard-primary,#37a501)]/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,#1B4D08)] border-r border-[var(--dashboard-sidebar-border,#2A6510)] 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 <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.8994L1.72738 136.512C2.82108 125.921 5.55533 121.802 10.2036 118.86Z\"\n fill=\"var(--dashboard-sidebar-bg,#1B4D08)\"\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,#FFFFFF)\"\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,#2A6510)] 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,#2A6510)] 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,#37a501)]/5 hover:bg-[var(--dashboard-primary,#37a501)]/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,#37a501)]/30 text-[var(--dashboard-sidebar-text,#FFFFFF)] flex-shrink-0\">\n <User size={16} />\n </div>\n <div\n className=\"ml-3 overflow-hidden text-left\"\n style={{\n width: isCollapsed ? 0 : \"auto\",\n opacity: isCollapsed ? 0 : 1,\n transition: `width 400ms ${cubicBezier}, opacity 400ms ${cubicBezier}`,\n }}\n >\n {user.subtitle && (\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#FFFFFF)]/60 whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-sidebar-text,#FFFFFF)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#FFFFFF)]/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,#FFFFFF)] hover:bg-[var(--dashboard-primary,#37a501)]/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 {mobileHeader}\n {desktopSidebar}\n </>\n );\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 from \"react\";\nimport { Moon, Sun } from \"lucide-react\";\nimport { useTheme } from \"../../hooks/useTheme\";\n\nexport interface ThemeSwitcherProps {\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function ThemeSwitcher({ className }: ThemeSwitcherProps) {\n const { resolvedTheme, setTheme } = useTheme();\n\n const toggle = () => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n };\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={cn(\n \"relative inline-flex items-center justify-center h-9 w-9 rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] shadow-sm transition-colors cursor-pointer hover:bg-[var(--dashboard-text-secondary,#6b7280)]/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--dashboard-primary,#37a501)] focus-visible:ring-offset-2\",\n className,\n )}\n aria-label=\"Alternar tema\"\n >\n <Sun className=\"h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n <span className=\"sr-only\">Alternar tema</span>\n </button>\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 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 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 \"h-full w-full bg-[var(--dashboard-surface,#ffffff)] rounded-xl p-6 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 <div className=\"flex justify-between items-start mb-4\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-[var(--dashboard-text-secondary,#64748B)] whitespace-nowrap\">\n {title}\n </h3>\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=\"flex items-end gap-3 flex-1\">\n <p className=\"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 \"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=\"text-sm\">{trendConfig.icon}</span>\n <span className=\"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-6 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 /** 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 /** Conteudo principal da pagina */\n children: ReactNode;\n /** Se true, aplica padding no conteudo. Default: true */\n contentPadding?: 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 title,\n description,\n headerActions,\n children,\n contentPadding = true,\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\n return (\n <div className={cn(\"min-h-screen bg-[var(--dashboard-background,#f2f2f2)]\", className)}>\n {sidebar}\n <main\n className={cn(\"pt-16 xl:pt-0\", !sidebar && \"pt-0\")}\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 className=\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 px-6 py-4 bg-[var(--dashboard-surface,#ffffff)]\">\n <div className=\"mb-4\">\n <h1 className=\"text-2xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h1>\n {description && (\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mt-1\">\n {description}\n </p>\n )}\n </div>\n\n {headerActions && <div>{headerActions}</div>}\n </div>\n\n {/* Conteudo principal */}\n <div className={contentPadding ? \"p-6\" : \"\"}>{children}</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 } 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 ChartData,\n ChartOptions,\n} from \"chart.js\";\nimport { KPICard, KPIValueFormat } from \"../KPICard\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\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 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 /** Estado de loading */\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function MetricPanel({\n title,\n titleIcon: TitleIcon,\n metrics,\n chartData,\n color,\n secondaryColor,\n onActionClick,\n actionLabel,\n isLoading = false,\n className,\n}: MetricPanelProps) {\n const [selectedMetricKey, setSelectedMetricKey] = useState(metrics[0]?.key);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 768);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\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 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 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 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-lg md:text-xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <TitleIcon className=\"w-5 h-5 md:w-6 md:h-6\" />\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, { useState, useRef, useEffect, useCallback, ReactNode } 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 [coords, setCoords] = useState({ top: 0, left: 0 });\n const triggerRef = useRef<HTMLSpanElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>();\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\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 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 }, [position]);\n\n const show = useCallback(() => {\n timeoutRef.current = setTimeout(() => {\n setVisible(true);\n }, delay);\n }, [delay]);\n\n const hide = useCallback(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setVisible(false);\n }, []);\n\n useEffect(() => {\n if (visible) {\n requestAnimationFrame(calculatePosition);\n }\n }, [visible, calculatePosition]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n return (\n <>\n <span\n ref={triggerRef}\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 {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-text-primary,#2d2d2d)] text-white\",\n \"shadow-lg dashboard-animate-fade-in pointer-events-none\",\n className,\n )}\n style={{\n top: coords.top,\n left: coords.left,\n maxWidth,\n }}\n >\n {content}\n </div>,\n document.body,\n )}\n </>\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 { 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-xs\",\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","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: \"#0F172A\",\n sidebarBorder: \"#1E293B\",\n sidebarText: \"#CBD5E1\",\n sidebarActiveText: \"#FFFFFF\",\n statusSuccess: \"#059669\",\n statusDanger: \"#DC2626\",\n statusWarning: \"#D97706\",\n statusInfo: \"#2563EB\",\n statusNeutral: \"#64748B\",\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 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, { useEffect, 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 useEffect(() => {\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\n return () => {\n root.style.removeProperty(\"--dashboard-primary\");\n root.style.removeProperty(\"--dashboard-secondary\");\n root.style.removeProperty(\"--dashboard-background\");\n root.style.removeProperty(\"--dashboard-surface\");\n root.style.removeProperty(\"--dashboard-text-primary\");\n root.style.removeProperty(\"--dashboard-text-secondary\");\n root.style.removeProperty(\"--dashboard-sidebar-bg\");\n root.style.removeProperty(\"--dashboard-sidebar-border\");\n root.style.removeProperty(\"--dashboard-sidebar-text\");\n root.style.removeProperty(\"--dashboard-sidebar-active-text\");\n root.style.removeProperty(\"--dashboard-status-success\");\n root.style.removeProperty(\"--dashboard-status-danger\");\n root.style.removeProperty(\"--dashboard-status-warning\");\n root.style.removeProperty(\"--dashboard-status-info\");\n root.style.removeProperty(\"--dashboard-status-neutral\");\n };\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["cn","cn","cn","cn","cn","cn","sizeConfig","cn","sizeClasses","cn","cn","cn","cn","ChartJS","Title","Tooltip","cn","ChartJS","Title","Tooltip","cn","ChartJS","Title","Tooltip","cn","ChartJS","Tooltip","cn","cn","ChartJS","Title","Tooltip","cn","cn","cn","cn","cn","cn","cn","cn","cn","ImageIcon","cn","cn","cn","cn","cn"],"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/Title/index.tsx","../src/components/ToggleSwitch/index.tsx","../src/components/BadgeStatus/index.tsx","../src/components/Sidebar/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/Breadcrumb/index.tsx","../src/components/Combobox/index.tsx","../src/components/Alert/index.tsx","../src/components/EmptyState/index.tsx","../src/components/StatusBadge/index.tsx","../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"],"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: \"px-2 py-1 text-xs sm:px-3 sm:py-1.5 sm:text-sm\",\n md: \"px-3 py-1.5 text-sm sm:px-4 sm:py-2 sm:text-base\",\n lg: \"px-4 py-2 text-base sm:px-6 sm:py-3 sm:text-lg\",\n };\n\n const iconOnlySizeStyles = {\n sm: \"w-7 h-7 sm:w-8 sm:h-8\",\n md: \"w-9 h-9 sm:w-10 sm:h-10\",\n lg: \"w-10 h-10 sm:w-12 sm:h-12\",\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 React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n children?: ReactNode;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", label, error, children, id, ...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 h-10 w-full rounded-md border border-[var(--dashboard-text-secondary,#6b7280)]/30 bg-[var(--dashboard-surface,#ffffff)] px-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 disabled:cursor-not-allowed disabled:opacity-50\",\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?: \"small\" | \"medium\" | \"large\";\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 = \"medium\",\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 small: {\n container: \"h-8 px-2\",\n text: \"text-xs\",\n wrapper: \"space-y-1\",\n label: \"text-sm\",\n iconPadding: \"pl-8\",\n },\n medium: {\n container: \"h-10 px-3\",\n text: \"text-sm\",\n wrapper: \"space-y-2\",\n label: \"text-base\",\n iconPadding: \"pl-10\",\n },\n large: {\n container: \"h-12 px-4\",\n text: \"text-lg\",\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?: \"small\" | \"medium\" | \"large\" | \"extraLarge\" | \"largeXl\";\n disableSaveButton?: boolean;\n saveButtonVariant?: \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\n closeOnEscape?: boolean;\n closeOnOverlayClick?: boolean;\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 = \"medium\",\n disableSaveButton = false,\n saveButtonVariant = \"primary\",\n closeOnEscape = true,\n closeOnOverlayClick = true,\n}: ModalProps) {\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(isOpen);\n const modalRef = useRef<HTMLDivElement>(null);\n const prevIsOpenRef = useRef(false);\n\n const sizeClasses = {\n small: \"max-w-sm\",\n medium: \"max-w-md\",\n large: \"max-w-lg\",\n largeXl: \"max-w-4xl\",\n extraLarge: \"max-w-screen-xl\",\n };\n\n useEffect(() => {\n if (isOpen && !prevIsOpenRef.current) {\n setShouldRender(true);\n setIsClosing(false);\n } else if (!isOpen && prevIsOpenRef.current) {\n setIsClosing(true);\n const timer = setTimeout(() => {\n setShouldRender(false);\n setIsClosing(false);\n }, 150);\n return () => clearTimeout(timer);\n }\n prevIsOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleClose = useCallback(() => {\n setIsClosing(true);\n setTimeout(() => {\n setIsClosing(false);\n onClose();\n }, 150);\n }, [onClose]);\n\n useEffect(() => {\n if (!closeOnOverlayClick) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n modalRef.current &&\n !modalRef.current.contains(event.target as Node) &&\n !target.closest(\"[data-modal-ignore]\")\n ) {\n handleClose();\n }\n };\n\n if (shouldRender && !isClosing) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.body.style.overflow = \"hidden\";\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n if (!shouldRender) {\n document.body.style.overflow = \"auto\";\n }\n };\n }, [shouldRender, isClosing, handleClose, closeOnOverlayClick]);\n\n useEffect(() => {\n if (!closeOnEscape) return;\n\n const handleEscKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n handleClose();\n }\n };\n\n if (shouldRender && !isClosing) {\n document.addEventListener(\"keydown\", handleEscKey);\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscKey);\n };\n }, [shouldRender, isClosing, handleClose, closeOnEscape]);\n\n if (!shouldRender && !isOpen) 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=\"small\"\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","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 items-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}\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 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 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,#2A6510)]\" />\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,#FFFFFF)]/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,#5DD611)]\"\n : \"text-[var(--dashboard-sidebar-text,#FFFFFF)] hover:bg-[var(--dashboard-primary,#37a501)]/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,#2A6510)]\"\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,#5DD611)] font-semibold border-l-2 border-[var(--dashboard-primary,#37a501)] -ml-[2px]\"\n : \"text-[var(--dashboard-sidebar-text,#FFFFFF)] hover:text-[var(--dashboard-sidebar-active-text,#5DD611)]\",\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,#37a501)]/25 text-[var(--dashboard-sidebar-active-text,#5DD611)]\"\n : \"text-[var(--dashboard-sidebar-text,#FFFFFF)] hover:bg-[var(--dashboard-primary,#37a501)]/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,#1B4D08)] border-b border-[var(--dashboard-sidebar-border,#2A6510)]\">\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-white/10 text-[var(--dashboard-sidebar-text,#FFFFFF)] hover:bg-white/20 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,#1B4D08)] border-b border-[var(--dashboard-sidebar-border,#2A6510)] 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,#2A6510)] 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,#37a501)]/5 hover:bg-[var(--dashboard-primary,#37a501)]/10 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-[var(--dashboard-primary,#37a501)]/30 text-[var(--dashboard-sidebar-text,#FFFFFF)] 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,#FFFFFF)]/60 whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-sidebar-text,#FFFFFF)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#FFFFFF)]/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,#FFFFFF)] hover:bg-[var(--dashboard-primary,#37a501)]/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,#1B4D08)] border-r border-[var(--dashboard-sidebar-border,#2A6510)] 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 <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.8994L1.72738 136.512C2.82108 125.921 5.55533 121.802 10.2036 118.86Z\"\n fill=\"var(--dashboard-sidebar-bg,#1B4D08)\"\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,#FFFFFF)\"\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,#2A6510)] 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,#2A6510)] 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,#37a501)]/5 hover:bg-[var(--dashboard-primary,#37a501)]/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,#37a501)]/30 text-[var(--dashboard-sidebar-text,#FFFFFF)] 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,#FFFFFF)]/60 whitespace-nowrap truncate\">\n {user.subtitle}\n </p>\n )}\n <p className=\"text-sm font-medium text-[var(--dashboard-sidebar-text,#FFFFFF)] whitespace-nowrap truncate\">\n {user.name}\n </p>\n <p className=\"text-xs text-[var(--dashboard-sidebar-text,#FFFFFF)]/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,#FFFFFF)] hover:bg-[var(--dashboard-primary,#37a501)]/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 {mobileHeader}\n {desktopSidebar}\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 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 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 \"h-full w-full bg-[var(--dashboard-surface,#ffffff)] rounded-xl p-6 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 <div className=\"flex justify-between items-start mb-4\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-[var(--dashboard-text-secondary,#64748B)] whitespace-nowrap\">\n {title}\n </h3>\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=\"flex items-end gap-3 flex-1\">\n <p className=\"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 \"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=\"text-sm\">{trendConfig.icon}</span>\n <span className=\"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-6 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 /** 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 /** Conteudo principal da pagina */\n children: ReactNode;\n /** Se true, aplica padding no conteudo. Default: true */\n contentPadding?: 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 title,\n description,\n headerActions,\n children,\n contentPadding = true,\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\n return (\n <div className={cn(\"min-h-screen bg-[var(--dashboard-background,#f2f2f2)]\", className)}>\n {sidebar}\n <main\n className={cn(\"pt-16 xl:pt-0\", !sidebar && \"pt-0\")}\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 className=\"border-b border-[var(--dashboard-text-secondary,#6b7280)]/20 px-6 py-4 bg-[var(--dashboard-surface,#ffffff)]\">\n <div className=\"mb-4\">\n <h1 className=\"text-2xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n {title}\n </h1>\n {description && (\n <p className=\"text-sm text-[var(--dashboard-text-secondary,#6b7280)] mt-1\">\n {description}\n </p>\n )}\n </div>\n\n {headerActions && <div>{headerActions}</div>}\n </div>\n\n {/* Conteudo principal */}\n <div className={contentPadding ? \"p-6\" : \"\"}>{children}</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 } 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 ChartData,\n ChartOptions,\n} from \"chart.js\";\nimport { KPICard, KPIValueFormat } from \"../KPICard\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\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 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 /** Estado de loading */\n isLoading?: boolean;\n className?: string;\n}\n\nconst cn = (...classes: (string | undefined | false | null)[]) =>\n classes.filter(Boolean).join(\" \");\n\nexport function MetricPanel({\n title,\n titleIcon: TitleIcon,\n metrics,\n chartData,\n color,\n secondaryColor,\n onActionClick,\n actionLabel,\n isLoading = false,\n className,\n}: MetricPanelProps) {\n const [selectedMetricKey, setSelectedMetricKey] = useState(metrics[0]?.key);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const check = () => setIsMobile(window.innerWidth < 768);\n check();\n window.addEventListener(\"resize\", check);\n return () => window.removeEventListener(\"resize\", check);\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 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 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 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-lg md:text-xl font-bold text-[var(--dashboard-text-primary,#2d2d2d)]\">\n <TitleIcon className=\"w-5 h-5 md:w-6 md:h-6\" />\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, { useState, useRef, useEffect, useCallback, ReactNode } 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 [coords, setCoords] = useState({ top: 0, left: 0 });\n const triggerRef = useRef<HTMLSpanElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>();\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\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 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 }, [position]);\n\n const show = useCallback(() => {\n timeoutRef.current = setTimeout(() => {\n setVisible(true);\n }, delay);\n }, [delay]);\n\n const hide = useCallback(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setVisible(false);\n }, []);\n\n useEffect(() => {\n if (visible) {\n requestAnimationFrame(calculatePosition);\n }\n }, [visible, calculatePosition]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n return (\n <>\n <span\n ref={triggerRef}\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 {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-text-primary,#2d2d2d)] text-white\",\n \"shadow-lg dashboard-animate-fade-in pointer-events-none\",\n className,\n )}\n style={{\n top: coords.top,\n left: coords.left,\n maxWidth,\n }}\n >\n {content}\n </div>,\n document.body,\n )}\n </>\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 { 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-xs\",\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","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: \"#0F172A\",\n sidebarBorder: \"#1E293B\",\n sidebarText: \"#CBD5E1\",\n sidebarActiveText: \"#FFFFFF\",\n statusSuccess: \"#059669\",\n statusDanger: \"#DC2626\",\n statusWarning: \"#D97706\",\n statusInfo: \"#2563EB\",\n statusNeutral: \"#64748B\",\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, { useEffect, 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 useEffect(() => {\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\n return () => {\n root.style.removeProperty(\"--dashboard-primary\");\n root.style.removeProperty(\"--dashboard-secondary\");\n root.style.removeProperty(\"--dashboard-background\");\n root.style.removeProperty(\"--dashboard-surface\");\n root.style.removeProperty(\"--dashboard-text-primary\");\n root.style.removeProperty(\"--dashboard-text-secondary\");\n root.style.removeProperty(\"--dashboard-sidebar-bg\");\n root.style.removeProperty(\"--dashboard-sidebar-border\");\n root.style.removeProperty(\"--dashboard-sidebar-text\");\n root.style.removeProperty(\"--dashboard-sidebar-active-text\");\n root.style.removeProperty(\"--dashboard-status-success\");\n root.style.removeProperty(\"--dashboard-status-danger\");\n root.style.removeProperty(\"--dashboard-status-warning\");\n root.style.removeProperty(\"--dashboard-status-info\");\n root.style.removeProperty(\"--dashboard-status-neutral\");\n };\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"],"mappings":"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"}
|