analytica-frontend-lib 1.4.75 → 1.4.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/utils.ts","../../src/components/Text/Text.tsx","../../src/components/Button/Button.tsx","../../src/components/Modal/utils/videoUtils.ts","../../src/components/Modal/Modal.tsx","../../src/components/TextArea/TextArea.tsx","../../src/components/SimulationsPage/index.ts","../../src/components/SimulationsPage/SimulationsPage.tsx","../../src/components/PageContainer/PageContainer.tsx","../../src/components/TableProvider/TableProvider.tsx","../../src/components/Table/Table.tsx","../../src/components/NoSearchResult/NoSearchResult.tsx","../../src/components/EmptyState/EmptyState.tsx","../../src/components/Skeleton/Skeleton.tsx","../../src/components/Table/TablePagination.tsx","../../src/components/Filter/useTableFilter.ts","../../src/components/CheckBoxGroup/CheckBoxGroup.helpers.ts","../../src/components/Search/Search.tsx","../../src/components/DropdownMenu/DropdownMenu.tsx","../../src/components/ThemeToggle/ThemeToggle.tsx","../../src/components/SelectionButton/SelectionButton.tsx","../../src/hooks/useTheme.ts","../../src/store/themeStore.ts","../../src/utils/cookieUtils.ts","../../src/utils/domainUtils.ts","../../src/store/themeStorage.ts","../../src/components/Filter/FilterModal.tsx","../../src/components/CheckBoxGroup/CheckBoxGroup.tsx","../../src/index.ts","../../src/components/Badge/Badge.tsx","../../src/components/HtmlMathRenderer/KatexMath.tsx","../../src/components/HtmlMathRenderer/HtmlMathRenderer.tsx","../../src/components/MarkdownMathRenderer/MarkdownMathRenderer.tsx","../../src/components/HtmlMathRenderer/utils.ts","../../src/components/CheckBox/CheckBox.tsx","../../src/components/Divider/Divider.tsx","../../src/components/Radio/Radio.tsx","../../src/components/ProgressBar/ProgressBar.tsx","../../src/components/Accordation/Accordation.tsx","../../src/components/Card/Card.tsx","../../src/components/IconRender/IconRender.tsx","../../src/assets/icons/subjects/ChatPT.tsx","../../src/assets/icons/subjects/ChatEN.tsx","../../src/assets/icons/subjects/ChatES.tsx","../../src/assets/icons/subjects/BookOpenText.tsx","../../src/assets/icons/subjects/Microscope.tsx","../../src/assets/icons/subjects/HeadCircuit.tsx","../../src/components/Accordation/AccordionGroup.tsx","../../src/components/shared/StatCard/StatCard.tsx","../../src/utils/studentActivityCorrection/constants.ts","../../src/utils/studentActivityCorrection/utils.ts","../../src/components/Alternative/Alternative.tsx","../../src/hooks/useSimulations.ts","../../src/components/SimulationsPage/SimulationsDetailModal.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport { syncDropdownState } from './dropdown';\nexport {\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n areFiltersEqual,\n} from './activityFilters';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './questionTypeUtils';\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n formatActivityDateToBrazilian,\n} from './activityDetailsUtils';\n\n/**\n * Format a number as a rounded percentage string\n * @param value - Number to format (0-100)\n * @returns Formatted string with % suffix (e.g., \"72%\")\n */\nexport function formatPercentageRounded(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nexport { formatScore } from './formatScore';\n\n/**\n * Convert hex color to rgba with opacity for background\n * @param hex - Hex color (e.g., \"#4B0082\")\n * @param opacity - Opacity value (0-1)\n * @returns rgba string\n */\nexport function hexToRgba(hex: string, opacity: number): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return `rgba(107, 114, 128, ${opacity})`; // fallback gray\n const r = Number.parseInt(result[1], 16);\n const g = Number.parseInt(result[2], 16);\n const b = Number.parseInt(result[3], 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n}\n\n/**\n * Maps Tailwind bg-* class to CSS variable\n * @param bgClass - Tailwind background class (e.g., \"bg-error-600\")\n * @returns CSS variable string (e.g., \"var(--color-error-600)\")\n */\nexport function bgClassToCssVar(bgClass: string): string {\n return `var(--color-${bgClass.replace('bg-', '')})`;\n}\n\n/**\n * Converts polar coordinates to Cartesian for SVG arc path calculations.\n * Angles are in degrees, with 0° at the top (12 o'clock position).\n * @param cx - Center X coordinate\n * @param cy - Center Y coordinate\n * @param r - Radius\n * @param angleDeg - Angle in degrees\n * @returns Cartesian coordinates { x, y }\n */\nexport function polarToCartesian(\n cx: number,\n cy: number,\n r: number,\n angleDeg: number\n): { x: number; y: number } {\n const rad = ((angleDeg - 90) * Math.PI) / 180;\n return { x: cx + r * Math.cos(rad), y: cy + r * Math.sin(rad) };\n}\n\n/**\n * Generates an SVG filled arc (pie slice) path string.\n * @param cx - Center X coordinate\n * @param cy - Center Y coordinate\n * @param r - Radius\n * @param startAngle - Start angle in degrees\n * @param endAngle - End angle in degrees\n * @returns SVG path string for the arc\n */\nexport function describeArc(\n cx: number,\n cy: number,\n r: number,\n startAngle: number,\n endAngle: number\n): string {\n const span = endAngle - startAngle;\n\n // For full circle (or near-full), use two arcs to avoid SVG arc degeneracy\n if (span >= 359.99) {\n const midAngle = startAngle + 180;\n const s = polarToCartesian(cx, cy, r, startAngle);\n const m = polarToCartesian(cx, cy, r, midAngle);\n return `M ${cx} ${cy} L ${s.x} ${s.y} A ${r} ${r} 0 1 1 ${m.x} ${m.y} A ${r} ${r} 0 1 1 ${s.x} ${s.y} Z`;\n }\n\n const s = polarToCartesian(cx, cy, r, endAngle);\n const e = polarToCartesian(cx, cy, r, startAngle);\n const largeArc = span > 180 ? 1 : 0;\n return `M ${cx} ${cy} L ${s.x} ${s.y} A ${r} ${r} 0 ${largeArc} 0 ${e.x} ${e.y} Z`;\n}\n\n/**\n * Retorna a cor hexadecimal com opacidade 0.3 (4d) se não estiver em dark mode.\n * Se estiver em dark mode, retorna a cor original.\n *\n * @param hexColor - Cor hexadecimal (ex: \"#0066b8\" ou \"0066b8\")\n * @param isDark - booleano indicando se está em dark mode\n * @returns string - cor hexadecimal com opacidade se necessário\n */\nexport function getSubjectColorWithOpacity(\n hexColor: string | undefined,\n isDark: boolean\n): string | undefined {\n if (!hexColor) return undefined;\n // Remove o '#' se existir\n let color = hexColor.replace(/^#/, '').toLowerCase();\n\n if (isDark) {\n // Se está em dark mode, sempre remove opacidade se existir\n if (color.length === 8) {\n color = color.slice(0, 6);\n }\n return `#${color}`;\n } else {\n // Se não está em dark mode (light mode)\n let resultColor: string;\n if (color.length === 6) {\n // Adiciona opacidade 0.3 (4D) para cores de 6 dígitos\n resultColor = `#${color}4d`;\n } else if (color.length === 8) {\n // Já tem opacidade, retorna como está\n resultColor = `#${color}`;\n } else {\n // Para outros tamanhos (3, 4, 5 dígitos), retorna como está\n resultColor = `#${color}`;\n }\n return resultColor;\n }\n}\n","import { ComponentPropsWithRef, ElementType, ReactNode } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Base text component props\n */\ntype BaseTextProps = {\n /** Content to be displayed */\n children?: ReactNode;\n /** Text size variant */\n size?:\n | '2xs'\n | 'xs'\n | 'sm'\n | 'md'\n | 'lg'\n | 'xl'\n | '2xl'\n | '3xl'\n | '4xl'\n | '5xl'\n | '6xl';\n /** Font weight variant */\n weight?:\n | 'hairline'\n | 'light'\n | 'normal'\n | 'medium'\n | 'semibold'\n | 'bold'\n | 'extrabold'\n | 'black';\n /** Color variant - white for light backgrounds, black for dark backgrounds */\n color?: string;\n /** Additional CSS classes to apply */\n className?: string;\n};\n\n/**\n * Polymorphic text component props that ensures type safety based on the 'as' prop\n */\ntype TextProps<T extends ElementType = 'p'> = BaseTextProps & {\n /** HTML tag to render */\n as?: T;\n} & Omit<ComponentPropsWithRef<T>, keyof BaseTextProps>;\n\n/**\n * Text component for Analytica Ensino platforms\n *\n * A flexible polymorphic text component with multiple sizes, weights, and colors.\n * Automatically adapts to dark and light themes with full type safety.\n *\n * @param children - The content to display\n * @param size - The text size variant (2xs, xs, sm, md, lg, xl, 2xl, 3xl, 4xl, 5xl, 6xl)\n * @param weight - The font weight variant (hairline, light, normal, medium, semibold, bold, extrabold, black)\n * @param color - The color variant - adapts to theme\n * @param as - The HTML tag to render - determines allowed attributes via TypeScript\n * @param className - Additional CSS classes\n * @param props - HTML attributes valid for the chosen tag only\n * @returns A styled text element with type-safe attributes\n *\n * @example\n * ```tsx\n * <Text size=\"lg\" weight=\"bold\" color=\"text-info-800\">\n * This is a large, bold text\n * </Text>\n *\n * <Text as=\"a\" href=\"/link\" target=\"_blank\">\n * Link with type-safe anchor attributes\n * </Text>\n *\n * <Text as=\"button\" onClick={handleClick} disabled>\n * Button with type-safe button attributes\n * </Text>\n * ```\n */\nconst Text = <T extends ElementType = 'p'>({\n children,\n size = 'md',\n weight = 'normal',\n color = 'text-text-950',\n as,\n className = '',\n ...props\n}: TextProps<T>) => {\n let sizeClasses: string;\n let weightClasses: string;\n\n // Text size classes mapping\n const sizeClassMap = {\n '2xs': 'text-2xs',\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-md',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n '3xl': 'text-3xl',\n '4xl': 'text-4xl',\n '5xl': 'text-5xl',\n '6xl': 'text-6xl',\n } as const;\n\n sizeClasses = sizeClassMap[size] ?? sizeClassMap.md;\n\n // Font weight classes mapping\n const weightClassMap = {\n hairline: 'font-hairline',\n light: 'font-light',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n extrabold: 'font-extrabold',\n black: 'font-black',\n } as const;\n\n weightClasses = weightClassMap[weight] ?? weightClassMap.normal;\n\n const baseClasses = 'font-primary';\n const Component = as ?? ('p' as ElementType);\n\n return (\n <Component\n className={cn(baseClasses, sizeClasses, weightClasses, color, className)}\n {...props}\n >\n {children}\n </Component>\n );\n};\n\nexport default Text;\n","import { ButtonHTMLAttributes, ReactNode, forwardRef } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for variant and action class combinations\n */\nconst VARIANT_ACTION_CLASSES = {\n solid: {\n primary:\n 'bg-primary-950 text-text border border-primary-950 hover:bg-primary-800 hover:border-primary-800 focus-visible:outline-none focus-visible:bg-primary-950 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-primary-700 active:border-primary-700 disabled:bg-primary-500 disabled:border-primary-500 disabled:opacity-40 disabled:cursor-not-allowed',\n secondary:\n 'bg-text-950 text-text border border-text-800 hover:bg-text-800 hover:border-text-950 focus-visible:outline-none focus-visible:bg-text-900 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-text-700 active:border-text-700 disabled:bg-text-500 disabled:border-text-500 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-success-500 text-text border border-success-500 hover:bg-success-600 hover:border-success-600 focus-visible:outline-none focus-visible:bg-success-500 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-success-700 active:border-success-700 disabled:bg-success-500 disabled:border-success-500 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-error-500 text-text border border-error-500 hover:bg-error-600 hover:border-error-600 focus-visible:outline-none focus-visible:bg-error-500 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-error-700 active:border-error-700 disabled:bg-error-500 disabled:border-error-500 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n outline: {\n primary:\n 'bg-transparent text-primary-950 border border-primary-950 hover:bg-background-50 hover:text-primary-400 hover:border-primary-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-primary-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-primary-700 active:border-primary-700 disabled:opacity-40 disabled:cursor-not-allowed',\n secondary:\n 'bg-transparent text-text-950 border border-text-800 hover:bg-background-50 hover:text-text-700 hover:border-text-700 focus-visible:border-0 focus-visible:outline-none focus-visible:text-text-900 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-text-700 active:border-text-700 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-transparent text-success-500 border border-success-300 hover:bg-background-50 hover:text-success-400 hover:border-success-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-success-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-success-700 active:border-success-700 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-transparent text-error-500 border border-error-300 hover:bg-background-50 hover:text-error-400 hover:border-error-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-error-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-error-700 active:border-error-700 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n link: {\n primary:\n 'bg-transparent text-primary-950 hover:text-primary-400 focus-visible:outline-none focus-visible:text-primary-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-primary-700 disabled:opacity-40 disabled:cursor-not-allowed',\n secondary:\n 'bg-transparent text-text-950 hover:text-text-800 focus-visible:outline-none focus-visible:text-text-900 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-text-700 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-transparent text-success-500 hover:text-success-400 focus-visible:outline-none focus-visible:text-success-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-success-700 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-transparent text-error-500 hover:text-error-400 focus-visible:outline-none focus-visible:text-error-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-error-700 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n} as const;\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n 'extra-small': 'text-xs px-3.5 py-2',\n small: 'text-sm px-4 py-2.5',\n medium: 'text-md px-5 py-2.5',\n large: 'text-lg px-6 py-3',\n 'extra-large': 'text-lg px-7 py-3.5',\n} as const;\n\n/**\n * Button component props interface\n */\ntype ButtonProps = {\n /** Content to be displayed inside the button */\n children: ReactNode;\n /** Ícone à esquerda do texto */\n iconLeft?: ReactNode;\n /** Ícone à direita do texto */\n iconRight?: ReactNode;\n /** Size of the button */\n size?: 'extra-small' | 'small' | 'medium' | 'large' | 'extra-large';\n /** Visual variant of the button. Use 'raw' for no default styling */\n variant?: 'solid' | 'outline' | 'link' | 'raw';\n /** Action type of the button */\n action?: 'primary' | 'secondary' | 'positive' | 'negative';\n /** Additional CSS classes to apply */\n className?: string;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * Button component for Analytica Ensino platforms\n *\n * A flexible button component with multiple variants, sizes and actions.\n *\n * @param children - The content to display inside the button\n * @param size - The size variant (extra-small, small, medium, large, extra-large)\n * @param variant - The visual style variant (solid, outline, link)\n * @param action - The action type (primary, secondary, positive, negative)\n * @param className - Additional CSS classes\n * @param props - All other standard button HTML attributes\n * @returns A styled button element\n *\n * @example\n * ```tsx\n * <Button variant=\"solid\" action=\"primary\" size=\"medium\" onClick={() => console.log('clicked')}>\n * Click me\n * </Button>\n * ```\n */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n iconLeft,\n iconRight,\n size = 'medium',\n variant = 'solid',\n action = 'primary',\n className = '',\n disabled,\n type = 'button',\n ...props\n },\n ref\n ) => {\n // Raw variant: no default styling, only className\n if (variant === 'raw') {\n return (\n <button\n ref={ref}\n className={className}\n disabled={disabled}\n type={type}\n {...props}\n >\n {iconLeft && (\n <span className=\"mr-2 flex items-center\">{iconLeft}</span>\n )}\n {children}\n {iconRight && (\n <span className=\"ml-2 flex items-center\">{iconRight}</span>\n )}\n </button>\n );\n }\n\n // Get classes from lookup tables\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_ACTION_CLASSES[variant][action];\n\n const baseClasses =\n 'inline-flex items-center justify-center rounded-full cursor-pointer font-medium';\n\n return (\n <button\n ref={ref}\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n disabled={disabled}\n type={type}\n {...props}\n >\n {iconLeft && <span className=\"mr-2 flex items-center\">{iconLeft}</span>}\n {children}\n {iconRight && (\n <span className=\"ml-2 flex items-center\">{iconRight}</span>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport default Button;\n","/**\n * Video utilities for Modal component\n *\n * Utilities to handle YouTube video embedding and URL detection\n */\n\n/**\n * Check if a given URL is a YouTube URL\n *\n * @param url - The URL to check\n * @returns true if the URL is from YouTube, false otherwise\n */\nexport const isYouTubeUrl = (url: string): boolean => {\n const youtubeRegex =\n /^(https?:\\/\\/)?((www|m|music)\\.)?(youtube\\.com|youtu\\.be|youtube-nocookie\\.com)\\/.+/i;\n return youtubeRegex.test(url);\n};\n\n/**\n * Validate if hostname is a legitimate YouTube host\n *\n * @param host - The hostname to validate\n * @returns The type of YouTube host or null if invalid\n */\nconst isValidYouTubeHost = (\n host: string\n): 'youtu.be' | 'youtube' | 'nocookie' | null => {\n if (host === 'youtu.be') return 'youtu.be';\n\n const isValidYouTubeCom =\n host === 'youtube.com' ||\n (host.endsWith('.youtube.com') &&\n /^(www|m|music)\\.youtube\\.com$/.test(host));\n\n if (isValidYouTubeCom) return 'youtube';\n\n const isValidNoCookie =\n host === 'youtube-nocookie.com' ||\n (host.endsWith('.youtube-nocookie.com') &&\n /^(www|m|music)\\.youtube-nocookie\\.com$/.test(host));\n\n if (isValidNoCookie) return 'nocookie';\n\n return null;\n};\n\n/**\n * Extract video ID from youtu.be path\n *\n * @param pathname - The URL pathname\n * @returns The video ID or null\n */\nconst extractYoutuBeId = (pathname: string): string | null => {\n const firstSeg = pathname.split('/').filter(Boolean)[0];\n return firstSeg || null;\n};\n\n/**\n * Extract video ID from YouTube or nocookie domains\n *\n * @param pathname - The URL pathname\n * @param searchParams - The URL search parameters\n * @returns The video ID or null\n */\nconst extractYouTubeId = (\n pathname: string,\n searchParams: URLSearchParams\n): string | null => {\n const parts = pathname.split('/').filter(Boolean);\n const [first, second] = parts;\n\n if (first === 'embed' && second) return second;\n if (first === 'shorts' && second) return second;\n if (first === 'live' && second) return second;\n\n const v = searchParams.get('v');\n if (v) return v;\n\n return null;\n};\n\n/**\n * Extract YouTube video ID from URL\n *\n * @param url - The YouTube URL\n * @returns The video ID if found, null otherwise\n */\nexport const getYouTubeVideoId = (url: string): string | null => {\n try {\n const u = new URL(url);\n const hostType = isValidYouTubeHost(u.hostname.toLowerCase());\n\n if (!hostType) return null;\n\n if (hostType === 'youtu.be') {\n return extractYoutuBeId(u.pathname);\n }\n\n return extractYouTubeId(u.pathname, u.searchParams);\n } catch {\n return null;\n }\n};\n\n/**\n * Generate YouTube embed URL for iframe\n *\n * @param videoId - The YouTube video ID\n * @returns The embed URL for the video\n */\nexport const getYouTubeEmbedUrl = (videoId: string): string => {\n return `https://www.youtube-nocookie.com/embed/${videoId}?autoplay=0&rel=0&modestbranding=1`;\n};\n","import { ReactNode, useEffect, useId } from 'react';\nimport { X } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\nimport Button from '../Button/Button';\nimport {\n isYouTubeUrl,\n getYouTubeVideoId,\n getYouTubeEmbedUrl,\n} from './utils/videoUtils';\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n xs: 'max-w-[360px]',\n sm: 'max-w-[420px]',\n md: 'max-w-[510px]',\n lg: 'max-w-[640px]',\n xl: 'max-w-[970px]',\n} as const;\n\n/**\n * Modal component props interface\n */\ntype ModalProps = {\n contentClassName?: string;\n /** Whether the modal is open */\n isOpen: boolean;\n /** Function to close the modal */\n onClose: () => void;\n /**\n * Modal title. Aceita string OU ReactNode pra permitir elementos inline\n * (ex: botão de voltar + label). Como é renderizado dentro de <h2>,\n * quando ReactNode use APENAS phrasing content (`<span>`, `<button>`,\n * ícones) — nunca `<div>` ou `<p>`.\n */\n title: ReactNode;\n /** Modal description/content */\n children?: ReactNode;\n /** Size of the modal */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Additional CSS classes for the modal content */\n className?: string;\n /** Whether pressing Escape should close the modal */\n closeOnEscape?: boolean;\n /** Footer content (typically buttons) */\n footer?: ReactNode;\n /** Hide the close button */\n hideCloseButton?: boolean;\n /** Modal variant */\n variant?: 'default' | 'activity';\n /** Description for activity variant */\n description?: string;\n /** Image URL for activity variant */\n image?: string;\n /** Alt text for activity image (leave empty for decorative images) */\n imageAlt?: string;\n /** Action link for activity variant */\n actionLink?: string;\n /** Action button label for activity variant */\n actionLabel?: string;\n};\n\n/**\n * Modal component for Analytica Ensino platforms\n *\n * A flexible modal component with multiple size variants and customizable behavior.\n *\n * @param isOpen - Whether the modal is currently open\n * @param onClose - Callback function called when the modal should be closed\n * @param title - The title displayed at the top of the modal\n * @param children - The main content of the modal\n * @param size - The size variant (xs, sm, md, lg, xl)\n * @param className - Additional CSS classes for the modal content\n * @param closeOnEscape - Whether pressing Escape closes the modal (default: true)\n * @param footer - Footer content, typically action buttons\n * @param hideCloseButton - Whether to hide the X close button (default: false)\n * @returns A modal overlay with content\n *\n * @example\n * ```tsx\n * <Modal\n * isOpen={isModalOpen}\n * onClose={() => setIsModalOpen(false)}\n * title=\"Invite your team\"\n * size=\"md\"\n * footer={\n * <div className=\"flex gap-3\">\n * <Button variant=\"outline\" onClick={() => setIsModalOpen(false)}>Cancel</Button>\n * <Button variant=\"solid\" onClick={handleExplore}>Explore</Button>\n * </div>\n * }\n * >\n * Elevate user interactions with our versatile modals.\n * </Modal>\n * ```\n */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n children,\n size = 'md',\n className = '',\n closeOnEscape = true,\n footer,\n hideCloseButton = false,\n variant = 'default',\n description,\n image,\n imageAlt,\n actionLink,\n actionLabel,\n contentClassName = '',\n}: ModalProps) => {\n const titleId = useId();\n\n // Handle escape key\n useEffect(() => {\n if (!isOpen || !closeOnEscape) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, closeOnEscape, onClose]);\n\n // Handle body scroll lock and scrollbar shift fix\n useEffect(() => {\n if (!isOpen) return;\n\n // Calculate scrollbar width before hiding overflow\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n // Save original styles\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n // Apply scroll lock\n document.body.style.overflow = 'hidden';\n\n // Fix scrollbar shift: add padding to compensate for lost scrollbar\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n\n // Create overlay to cover the padding area with backdrop color\n const overlay = document.createElement('div');\n overlay.id = 'modal-scrollbar-overlay';\n overlay.style.cssText = `\n position: fixed;\n top: 0;\n right: 0;\n width: ${scrollbarWidth}px;\n height: 100vh;\n background-color: rgb(0 0 0 / 0.6);\n z-index: 40;\n pointer-events: none;\n `;\n document.body.appendChild(overlay);\n }\n\n return () => {\n // Restore original styles\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n\n // Remove overlay\n const overlay = document.getElementById('modal-scrollbar-overlay');\n if (overlay) {\n overlay.remove();\n }\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const sizeClasses = SIZE_CLASSES[size];\n const baseClasses =\n 'bg-secondary-50 rounded-3xl shadow-hard-shadow-2 border border-border-100 w-full mx-4 max-h-[calc(100dvh-2rem)] flex flex-col overflow-hidden';\n // Reset dialog default styles to prevent positioning issues\n const dialogResetClasses = 'p-0 m-0 border-none outline-none static';\n const modalClasses = cn(\n baseClasses,\n sizeClasses,\n dialogResetClasses,\n className\n );\n\n // Normalize URLs missing protocol\n const normalizeUrl = (href: string) =>\n /^https?:\\/\\//i.test(href) ? href : `https://${href}`;\n\n // Handle action link click\n const handleActionClick = () => {\n if (actionLink) {\n window.open(normalizeUrl(actionLink), '_blank', 'noopener,noreferrer');\n }\n };\n\n // Activity variant rendering\n if (variant === 'activity') {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs border-none p-0 m-0 w-full cursor-default\">\n <dialog\n className={modalClasses}\n aria-labelledby={titleId}\n aria-modal=\"true\"\n open\n >\n {/* Header simples com X */}\n <div className=\"flex justify-end p-6 pb-0\">\n {!hideCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-text-500 hover:text-text-700 hover:bg-background-50 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indicator-info focus:ring-offset-2\"\n aria-label=\"Fechar modal\"\n >\n <X size={18} />\n </button>\n )}\n </div>\n\n {/* Conteúdo centralizado */}\n <div className=\"flex flex-col items-center px-6 pb-6 gap-5 flex-1 min-h-0 overflow-y-auto\">\n {/* Imagem ilustrativa */}\n {image && (\n <div className=\"flex justify-center\">\n <img\n src={image}\n alt={imageAlt ?? ''}\n className=\"w-[122px] h-[122px] object-contain\"\n />\n </div>\n )}\n\n {/* Título */}\n <h2\n id={titleId}\n className=\"text-lg font-semibold text-text-950 text-center\"\n >\n {title}\n </h2>\n\n {/* Descrição */}\n {description && (\n <p className=\"text-sm font-normal text-text-400 text-center max-w-md leading-[21px]\">\n {description}\n </p>\n )}\n\n {/* Ação: Botão ou Vídeo Embedado */}\n {actionLink && (\n <div className=\"w-full\">\n {(() => {\n const normalized = normalizeUrl(actionLink);\n const isYT = isYouTubeUrl(normalized);\n if (!isYT) return null;\n const id = getYouTubeVideoId(normalized);\n if (!id) {\n return (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"large\"\n className=\"w-full\"\n onClick={handleActionClick}\n >\n {actionLabel || 'Iniciar Atividade'}\n </Button>\n );\n }\n return (\n <iframe\n src={getYouTubeEmbedUrl(id)}\n className=\"w-full aspect-video rounded-lg\"\n allowFullScreen\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n title=\"Vídeo YouTube\"\n />\n );\n })()}\n {!isYouTubeUrl(normalizeUrl(actionLink)) && (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"large\"\n className=\"w-full\"\n onClick={handleActionClick}\n >\n {actionLabel || 'Iniciar Atividade'}\n </Button>\n )}\n </div>\n )}\n </div>\n </dialog>\n </div>\n );\n }\n\n // Default variant rendering\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs border-none p-0 m-0 w-full cursor-default\">\n <dialog\n className={modalClasses}\n aria-labelledby={titleId}\n aria-modal=\"true\"\n open\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-6\">\n <h2 id={titleId} className=\"text-lg font-semibold text-text-950\">\n {title}\n </h2>\n {!hideCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-text-500 hover:text-text-700 hover:bg-background-50 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indicator-info focus:ring-offset-2\"\n aria-label=\"Fechar modal\"\n >\n <X size={18} />\n </button>\n )}\n </div>\n\n {/* Content */}\n {children && (\n <div\n className={cn(\n 'px-6 pb-6 flex-1 min-h-0 overflow-y-auto',\n contentClassName\n )}\n >\n <div\n className={cn(\n 'text-text-500 font-normal text-sm leading-6',\n contentClassName?.includes('flex') &&\n 'flex flex-col flex-1 min-h-0'\n )}\n >\n {children}\n </div>\n </div>\n )}\n\n {/* Footer */}\n {footer && (\n <div className=\"flex justify-end gap-3 px-6 pb-6\">{footer}</div>\n )}\n </dialog>\n </div>\n );\n};\n\nexport default Modal;\n","import {\n TextareaHTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n useEffect,\n useRef,\n useImperativeHandle,\n ChangeEvent,\n FocusEvent,\n} from 'react';\nimport { WarningCircle } from 'phosphor-react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * TextArea size variants\n */\ntype TextAreaSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * TextArea visual state\n */\ntype TextAreaState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations with exact pixel specifications\n */\nconst SIZE_CLASSES = {\n small: {\n textarea: 'h-24 text-sm', // 96px height, 14px font\n textSize: 'sm' as const,\n },\n medium: {\n textarea: 'h-24 text-base', // 96px height, 16px font\n textSize: 'md' as const,\n },\n large: {\n textarea: 'h-24 text-lg', // 96px height, 18px font\n textSize: 'lg' as const,\n },\n extraLarge: {\n textarea: 'h-24 text-xl', // 96px height, 20px font\n textSize: 'xl' as const,\n },\n} as const;\n\n/**\n * Base textarea styling classes using design system colors\n */\nconst BASE_TEXTAREA_CLASSES =\n 'w-full box-border p-3 bg-background border border-solid rounded-[4px] resize-none focus:outline-none font-roboto font-normal leading-[150%] placeholder:text-text-600 transition-all duration-200';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n base: 'border-border-300 bg-background text-text-600',\n hover: 'hover:border-border-400',\n focus: 'focus:border-border-500',\n },\n hovered: {\n base: 'border-border-400 bg-background text-text-600',\n hover: '',\n focus: 'focus:border-border-500',\n },\n focused: {\n base: 'border-2 border-primary-950 bg-background text-text-900',\n hover: '',\n focus: '',\n },\n invalid: {\n base: 'border-2 border-red-700 bg-white text-gray-800',\n hover: 'hover:border-red-700',\n focus: 'focus:border-red-700',\n },\n disabled: {\n base: 'border-border-300 bg-background text-text-600 cursor-not-allowed opacity-40',\n hover: '',\n focus: '',\n },\n} as const;\n\n/**\n * TextArea component props interface\n */\nexport type TextAreaProps = {\n /** Label text to display above the textarea */\n label?: ReactNode;\n /** Size variant of the textarea */\n size?: TextAreaSize;\n /** Visual state of the textarea */\n state?: TextAreaState;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Show character count when maxLength is provided */\n showCharacterCount?: boolean;\n /** Enable auto-resize based on content */\n autoResize?: boolean;\n /** Minimum height when autoResize is enabled (default: 96px) */\n minHeight?: number;\n} & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>;\n\n/**\n * TextArea component for Analytica Ensino platforms\n *\n * A textarea component with essential states, sizes and themes.\n * Uses exact design specifications with 288px width, 96px height, and specific\n * color values. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic textarea\n * <TextArea label=\"Description\" placeholder=\"Enter description...\" />\n *\n * // Small size\n * <TextArea size=\"small\" label=\"Comment\" />\n *\n * // Invalid state\n * <TextArea state=\"invalid\" label=\"Required field\" errorMessage=\"This field is required\" />\n *\n * // Disabled state\n * <TextArea disabled label=\"Read-only field\" />\n *\n * // Auto-resize textarea\n * <TextArea autoResize minHeight={200} placeholder=\"Grows with content...\" />\n * ```\n */\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n errorMessage,\n helperMessage,\n className = '',\n labelClassName = '',\n disabled,\n id,\n onChange,\n placeholder,\n required,\n showCharacterCount = false,\n maxLength,\n value,\n autoResize = false,\n minHeight = 96,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `textarea-${generatedId}`;\n\n // Internal ref for auto-resize\n const internalRef = useRef<HTMLTextAreaElement>(null);\n\n // Expose ref to parent\n useImperativeHandle(ref, () => internalRef.current as HTMLTextAreaElement);\n\n // Internal state for focus tracking\n const [isFocused, setIsFocused] = useState(false);\n\n // Calculate current character count\n const currentLength = typeof value === 'string' ? value.length : 0;\n const isNearLimit = maxLength && currentLength >= maxLength * 0.8;\n\n // Auto-resize effect\n useEffect(() => {\n if (autoResize && internalRef.current) {\n const textarea = internalRef.current;\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.max(textarea.scrollHeight, minHeight)}px`;\n }\n }, [autoResize, minHeight, value]);\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n };\n\n // Handle focus events\n const handleFocus = (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n props.onFocus?.(event);\n };\n\n // Handle blur events\n const handleBlur = (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n props.onBlur?.(event);\n };\n\n // Determine current state based on props and focus\n let currentState = disabled ? 'disabled' : state;\n\n // Override state based on focus\n if (\n isFocused &&\n currentState !== 'invalid' &&\n currentState !== 'disabled'\n ) {\n currentState = 'focused';\n }\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Get styling classes\n const stateClasses = STATE_CLASSES[currentState];\n\n // Get height classes based on autoResize\n const heightClasses = autoResize\n ? 'h-auto overflow-hidden'\n : sizeClasses.textarea;\n\n // Get font size from size classes (extract only the text size)\n const fontSizeClass =\n sizeClasses.textarea.split(' ').find((c) => c.startsWith('text-')) ??\n 'text-base';\n\n // Get final textarea classes\n const textareaClasses = cn(\n BASE_TEXTAREA_CLASSES,\n autoResize ? fontSizeClass : sizeClasses.textarea,\n heightClasses,\n stateClasses.base,\n stateClasses.hover,\n stateClasses.focus,\n className\n );\n\n return (\n <div className={`flex flex-col`}>\n {/* Label */}\n {label && (\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"medium\"\n color=\"text-text-950\"\n className={cn('mb-1.5', labelClassName)}\n >\n {label}{' '}\n {required && <span className=\"text-indicator-error\">*</span>}\n </Text>\n )}\n\n {/* Textarea */}\n <textarea\n ref={internalRef}\n id={inputId}\n disabled={disabled}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className={textareaClasses}\n placeholder={placeholder}\n required={required}\n maxLength={maxLength}\n value={value}\n {...props}\n />\n\n {/* Error message */}\n {errorMessage && (\n <p className=\"flex gap-1 items-center text-sm text-indicator-error mt-1.5\">\n <WarningCircle size={16} /> {errorMessage}\n </p>\n )}\n\n {/* Helper text or Character count */}\n {!errorMessage && showCharacterCount && maxLength && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className={`mt-1.5 ${isNearLimit ? 'text-indicator-warning' : 'text-text-500'}`}\n >\n {currentLength}/{maxLength} caracteres\n </Text>\n )}\n {!errorMessage &&\n helperMessage &&\n !(showCharacterCount && maxLength) && (\n <Text size=\"sm\" weight=\"normal\" className=\"mt-1.5 text-text-500\">\n {helperMessage}\n </Text>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea';\n\nexport default TextArea;\n","export { SimulationsPage } from './SimulationsPage';\nexport type { SimulationsPageProps } from './SimulationsPage';\nexport { SimulationsDetailModal } from './SimulationsDetailModal';\nexport type { SimulationsDetailModalProps } from './SimulationsDetailModal';\n","import { useCallback, useMemo, useState } from 'react';\nimport { UserCircle } from 'phosphor-react';\nimport { PageContainer } from '../PageContainer/PageContainer';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport { TableProvider } from '../TableProvider';\nimport type { ColumnConfig, TableParams } from '../TableProvider';\nimport type { BaseApiClient } from '../../types/api';\nimport { createUseSimulations } from '../../hooks/useSimulations';\nimport type { SimulationsStudentItem } from '../../types/simulations';\nimport { SimulationsDetailModal } from './SimulationsDetailModal';\n\nexport interface SimulationsPageProps {\n /** API client used to fetch students and simulations */\n readonly api: BaseApiClient;\n /** Image shown when a search returns no results */\n readonly noSearchImage?: string;\n}\n\nconst DEFAULT_LIMIT = 10;\n\n/**\n * Teacher-facing simulations page: a paginated list of students with how many\n * simulations each answered, plus a \"Ver simulados\" action that opens a nested\n * detail modal.\n */\nexport function SimulationsPage({ api, noSearchImage }: SimulationsPageProps) {\n const useSimulations = useMemo(() => createUseSimulations(api), [api]);\n const { fetchStudents } = useSimulations();\n\n const [students, setStudents] = useState<SimulationsStudentItem[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [selected, setSelected] = useState<{\n userInstitutionId: string;\n name: string;\n } | null>(null);\n\n const handleParamsChange = useCallback(\n (params: TableParams) => {\n setLoading(true);\n fetchStudents({\n page: params.page,\n limit: params.limit,\n search: params.search?.trim() || undefined,\n })\n .then((result) => {\n setStudents(result.data);\n setTotal(result.total);\n })\n .catch(() => {\n setStudents([]);\n setTotal(0);\n })\n .finally(() => setLoading(false));\n },\n [fetchStudents]\n );\n\n const columns = useMemo<ColumnConfig<SimulationsStudentItem>[]>(\n () => [\n {\n key: 'name',\n label: 'Estudante',\n render: (_value, row) => (\n <span className=\"flex items-center gap-2\">\n <UserCircle size={24} weight=\"fill\" className=\"text-info-700\" />\n <Text size=\"sm\" className=\"text-text-950\">\n {row.name}\n </Text>\n </span>\n ),\n },\n {\n key: 'class',\n label: 'Turma',\n render: (_value, row) => (\n <Text size=\"sm\" className=\"text-text-900\">\n {row.class ?? '-'}\n </Text>\n ),\n },\n {\n key: 'simulationsCount',\n label: 'Simulados',\n render: (_value, row) => (\n <Text size=\"sm\" className=\"text-text-900\">\n {row.simulationsCount}\n </Text>\n ),\n },\n {\n key: 'actions',\n label: '',\n render: (_value, row) => (\n <div className=\"flex justify-end\">\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={() =>\n setSelected({\n userInstitutionId: row.userInstitutionId,\n name: row.name,\n })\n }\n >\n Ver simulados\n </Button>\n </div>\n ),\n },\n ],\n []\n );\n\n return (\n <PageContainer innerClassName=\"max-w-[1150px]\">\n <div className=\"mb-4 flex flex-col gap-1\">\n <Text size=\"2xl\" weight=\"bold\" className=\"text-text-950\">\n Simulados\n </Text>\n <Text size=\"sm\" className=\"text-text-600\">\n Veja o resultado de todos os simulados realizados por cada estudante\n </Text>\n </div>\n\n <TableProvider<SimulationsStudentItem>\n data={students}\n headers={columns}\n loading={loading}\n variant=\"borderless\"\n enableSearch\n enablePagination\n rowKey=\"userInstitutionId\"\n searchPlaceholder=\"Buscar estudante\"\n onParamsChange={handleParamsChange}\n paginationConfig={{\n itemLabel: 'estudantes',\n itemsPerPageOptions: [10, 20, 50],\n defaultItemsPerPage: DEFAULT_LIMIT,\n totalItems: total,\n }}\n noSearchResultState={{ image: noSearchImage }}\n />\n\n <SimulationsDetailModal\n api={api}\n isOpen={selected !== null}\n onClose={() => setSelected(null)}\n student={selected}\n />\n </PageContainer>\n );\n}\n","import { ReactNode } from 'react';\nimport { cn } from '../../utils/utils';\n\nexport interface PageContainerProps {\n /** Conteudo da pagina renderizado dentro do container interno */\n children: ReactNode;\n /** Classes CSS adicionais aplicadas ao container externo (wrapper full-width) */\n className?: string;\n /**\n * Classes CSS adicionais aplicadas ao container interno (limita a largura).\n * Use para sobrescrever a `max-w-[1000px]` padrao em projetos que precisam\n * de uma largura diferente. Ex.: `innerClassName=\"max-w-[1150px]\"`.\n * Tailwind-merge resolve o conflito mantendo apenas o ultimo `max-w-*`.\n */\n innerClassName?: string;\n}\n\nexport function PageContainer({\n children,\n className,\n innerClassName,\n}: Readonly<PageContainerProps>) {\n return (\n <div\n className={cn(\n 'flex flex-col w-full min-h-full items-center pb-5 relative',\n className\n )}\n >\n <div\n className={cn(\n 'flex flex-col w-full max-w-[1000px] lg:px-0 px-4',\n innerClassName\n )}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport default PageContainer;\n","import {\n useState,\n useEffect,\n useMemo,\n useCallback,\n ReactNode,\n ChangeEvent,\n} from 'react';\nimport Table, {\n TableBody,\n TableHead,\n TableRow,\n TableCell,\n useTableSort,\n TablePagination,\n} from '../Table/Table';\nimport { useTableFilter, FilterConfig } from '../Filter/useTableFilter';\nimport Search from '../Search/Search';\nimport { FilterModal } from '../Filter/FilterModal';\nimport Button from '../Button/Button';\nimport { Funnel } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Column configuration with flexible rendering options\n */\nexport interface ColumnConfig<T = Record<string, unknown>> {\n /** Column key (must match data object key) */\n key: string;\n /** Column label - can be string or JSX */\n label: string | ReactNode;\n /** Enable sorting for this column */\n sortable?: boolean;\n /** Custom render function for cell content */\n render?: (value: unknown, row: T, index: number) => ReactNode;\n /** Column width */\n width?: string;\n /** Additional CSS classes */\n className?: string;\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * Combined parameters sent via onParamsChange\n */\nexport interface TableParams {\n /** Current page number */\n page: number;\n /** Items per page */\n limit: number;\n /** Search query */\n search?: string;\n /** Active filters (dynamic keys based on filter configs) */\n [key: string]: unknown;\n /** Sort column */\n sortBy?: string;\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Pagination configuration\n */\nexport interface PaginationConfig {\n /** Label for items (e.g., \"atividades\") */\n itemLabel?: string;\n /** Items per page options */\n itemsPerPageOptions?: number[];\n /** Default items per page */\n defaultItemsPerPage?: number;\n /** Total items (for displaying pagination info) */\n totalItems?: number;\n /** Total pages (if known from backend) */\n totalPages?: number;\n}\n\n/**\n * Empty state configuration\n */\nexport interface EmptyStateConfig {\n /** Custom component to render when table is empty (no data and no search active) */\n component?: ReactNode;\n /** Image to display in empty state (path from project) */\n image?: string;\n /** Title text for empty state */\n title?: string;\n /** Description text for empty state */\n description?: string;\n /** Button text for empty state action (optional) */\n buttonText?: string;\n /** Icon to display on button (optional) */\n buttonIcon?: ReactNode;\n /** Callback when empty state button is clicked */\n onButtonClick?: () => void;\n /** Button variant (solid, outline, or link) */\n buttonVariant?: 'solid' | 'outline' | 'link';\n /** Button action color (primary, positive, or negative) */\n buttonAction?: 'primary' | 'positive' | 'negative';\n}\n\n/**\n * Loading state configuration\n */\nexport interface LoadingStateConfig {\n /** Custom component to render when table is loading */\n component?: ReactNode;\n}\n\n/**\n * No search result state configuration\n */\nexport interface NoSearchResultConfig {\n /** Custom component to render when search returns no results */\n component?: ReactNode;\n /** Title for no search result state */\n title?: string;\n /** Description for no search result state */\n description?: string;\n /** Image to display in no search result state */\n image?: string;\n}\n\n/**\n * Table components exposed via render prop\n */\nexport interface TableComponents {\n /** Search and filter controls */\n controls: ReactNode;\n /** Table with data */\n table: ReactNode;\n /** Pagination controls */\n pagination: ReactNode;\n}\n\n/**\n * TableProvider Props\n */\nexport interface TableProviderProps<T = Record<string, unknown>> {\n /** Data to display in the table */\n readonly data: T[];\n /** Column configurations */\n readonly headers: ColumnConfig<T>[];\n /** Loading state */\n readonly loading?: boolean;\n /** Table variant */\n readonly variant?: 'default' | 'borderless';\n\n /** Enable search functionality */\n readonly enableSearch?: boolean;\n /** Enable filters functionality */\n readonly enableFilters?: boolean;\n /** Enable table sorting */\n readonly enableTableSort?: boolean;\n /** Enable pagination */\n readonly enablePagination?: boolean;\n /** Enable row click functionality */\n readonly enableRowClick?: boolean;\n\n /** Initial filter configurations */\n readonly initialFilters?: FilterConfig[];\n /** Pagination configuration */\n readonly paginationConfig?: PaginationConfig;\n /** Search placeholder text */\n readonly searchPlaceholder?: string;\n /** Additional CSS classes for the search container */\n readonly searchContainerClassName?: string;\n /** Empty state configuration (when table is empty with no search) */\n readonly emptyState?: EmptyStateConfig;\n /** Loading state configuration (when table is loading) */\n readonly loadingState?: LoadingStateConfig;\n /** No search result state configuration (when search returns no results) */\n readonly noSearchResultState?: NoSearchResultConfig;\n /** Key field name to use for unique row identification (recommended for better performance) */\n readonly rowKey?: keyof T;\n\n /** Callback when any parameter changes */\n readonly onParamsChange?: (params: TableParams) => void;\n /** Callback when row is clicked */\n readonly onRowClick?: (row: T, index: number) => void;\n\n /**\n * Content to display in the header area (e.g., action buttons)\n * Rendered above the search/filter controls\n */\n readonly headerContent?: ReactNode;\n\n /**\n * Additional CSS classes for the container wrapper\n */\n readonly containerClassName?: string;\n\n /**\n * Render prop for custom layout control\n * When provided, gives full control over component positioning\n * @param components - Table components (controls, table, pagination)\n * @returns Custom layout JSX\n *\n * @example\n * ```tsx\n * <TableProvider {...props}>\n * {({ controls, table, pagination }) => (\n * <>\n * <div className=\"mb-4\">{controls}</div>\n * <div className=\"bg-white p-6\">\n * {table}\n * {pagination}\n * </div>\n * </>\n * )}\n * </TableProvider>\n * ```\n */\n readonly children?: (components: TableComponents) => ReactNode;\n}\n\n/**\n * TableProvider - Self-contained table component with search, filters, sorting, and pagination\n *\n * @example\n * ```tsx\n * <TableProvider\n * data={activities}\n * headers={[\n * { key: 'title', label: 'Título', sortable: true },\n * { key: 'status', label: 'Status', render: (value) => <Badge>{value}</Badge> }\n * ]}\n * loading={loading}\n * variant=\"borderless\"\n * enableSearch\n * enableFilters\n * enableTableSort\n * enablePagination\n * enableRowClick\n * initialFilters={filterConfigs}\n * paginationConfig={{ itemLabel: 'atividades' }}\n * onParamsChange={handleParamsChange}\n * onRowClick={handleRowClick}\n * />\n * ```\n */\nexport function TableProvider<T extends Record<string, unknown>>({\n data,\n headers,\n loading = false,\n variant = 'default',\n enableSearch = false,\n enableFilters = false,\n enableTableSort = false,\n enablePagination = false,\n enableRowClick = false,\n initialFilters = [],\n paginationConfig = {},\n searchPlaceholder = 'Buscar...',\n searchContainerClassName,\n emptyState,\n loadingState,\n noSearchResultState,\n rowKey,\n onParamsChange,\n onRowClick,\n headerContent,\n containerClassName,\n children,\n}: TableProviderProps<T>) {\n // Search state\n const [searchQuery, setSearchQuery] = useState('');\n const [inputValue, setInputValue] = useState('');\n\n // Sorting state - always call hook (React Rules of Hooks)\n const sortResultRaw = useTableSort(data, { syncWithUrl: true });\n const sortResult = enableTableSort\n ? sortResultRaw\n : {\n sortedData: data,\n sortColumn: null,\n sortDirection: null,\n handleSort: () => {},\n };\n\n const { sortedData, sortColumn, sortDirection, handleSort } = sortResult;\n\n // Filter state - always call hook (React Rules of Hooks)\n const filterResultRaw = useTableFilter(initialFilters, { syncWithUrl: true });\n\n // Memoize disabled filter result to prevent recreating object on every render\n const disabledFilterResult = useMemo(\n () => ({\n filterConfigs: [],\n activeFilters: {},\n hasActiveFilters: false,\n activeFiltersCount: 0,\n updateFilters: () => {},\n applyFilters: () => {},\n clearFilters: () => {},\n }),\n []\n );\n\n const filterResult = enableFilters ? filterResultRaw : disabledFilterResult;\n\n const {\n filterConfigs,\n activeFilters,\n activeFiltersCount,\n updateFilters,\n applyFilters,\n clearFilters,\n } = filterResult;\n\n // Pagination state (only if enabled)\n const {\n defaultItemsPerPage = 10,\n itemsPerPageOptions = [10, 20, 50, 100],\n itemLabel = 'itens',\n totalItems,\n totalPages,\n } = paginationConfig;\n\n const [currentPage, setCurrentPage] = useState(1);\n const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);\n\n // Filter modal state\n const [isFilterModalOpen, setIsFilterModalOpen] = useState(false);\n\n // Combine all parameters\n const combinedParams = useMemo((): TableParams => {\n const params: TableParams = {\n page: currentPage,\n limit: itemsPerPage,\n };\n\n if (enableSearch && searchQuery) {\n params.search = searchQuery;\n }\n\n if (enableFilters) {\n Object.assign(params, activeFilters);\n }\n\n if (enableTableSort && sortColumn && sortDirection) {\n params.sortBy = sortColumn;\n params.sortOrder = sortDirection;\n }\n\n return params;\n }, [\n currentPage,\n itemsPerPage,\n searchQuery,\n activeFilters,\n sortColumn,\n sortDirection,\n enableSearch,\n enableFilters,\n enableTableSort,\n ]);\n\n // Notify parent when parameters change\n // Note: onParamsChange is omitted from dependencies intentionally to prevent infinite loops\n useEffect(() => {\n onParamsChange?.(combinedParams);\n }, [combinedParams]);\n\n // Handle search changes\n const handleSearchChange = useCallback((value: string) => {\n setSearchQuery(value);\n setCurrentPage(1); // Reset to first page on search\n }, []);\n\n const handleInputChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n }, []);\n\n // Handle filter apply\n const handleFilterApply = useCallback(() => {\n applyFilters();\n setIsFilterModalOpen(false);\n setCurrentPage(1); // Reset to first page on filter\n }, [applyFilters]);\n\n // Handle pagination change\n const handlePageChange = useCallback((page: number) => {\n setCurrentPage(page);\n }, []);\n\n const handleItemsPerPageChange = useCallback((items: number) => {\n setItemsPerPage(items);\n setCurrentPage(1); // Reset to first page when changing items per page\n }, []);\n\n // Handle row click\n const handleRowClickInternal = useCallback(\n (row: T, index: number) => {\n if (enableRowClick && onRowClick) {\n onRowClick(row, index);\n }\n },\n [enableRowClick, onRowClick]\n );\n\n // Detect if pagination should be managed internally\n const useInternalPagination = useMemo(\n () =>\n enablePagination &&\n !onParamsChange &&\n totalItems === undefined &&\n totalPages === undefined,\n [enablePagination, onParamsChange, totalItems, totalPages]\n );\n\n // Calculate total pages from data if not provided\n const calculatedTotalPages =\n totalPages ??\n Math.ceil(\n (totalItems ??\n (useInternalPagination ? sortedData.length : data.length)) /\n itemsPerPage\n );\n const calculatedTotalItems =\n totalItems ?? (useInternalPagination ? sortedData.length : data.length);\n\n // Apply pagination to data when managed internally\n const displayData = useMemo(() => {\n if (!useInternalPagination) {\n return sortedData;\n }\n\n const start = (currentPage - 1) * itemsPerPage;\n return sortedData.slice(start, start + itemsPerPage);\n }, [useInternalPagination, sortedData, currentPage, itemsPerPage]);\n\n // Empty state check\n const isEmpty = data.length === 0;\n\n // Calculate state control booleans - Table is responsible for rendering, TableProvider controls WHEN\n const showLoading = loading;\n const showNoSearchResult =\n !loading && data.length === 0 && searchQuery.trim() !== '';\n const showEmpty = !loading && data.length === 0 && searchQuery.trim() === '';\n\n // Extract components for render prop pattern\n const controls = (enableSearch || enableFilters) && (\n <div className=\"flex items-center gap-4\">\n {/* Filter Button */}\n {enableFilters && (\n <Button\n variant=\"outline\"\n size=\"medium\"\n onClick={() => setIsFilterModalOpen(true)}\n >\n <Funnel size={20} />\n Filtros\n {activeFiltersCount > 0 && (\n <span className=\"ml-2 rounded-full bg-primary-500 px-2 py-0.5 text-xs text-white\">\n {activeFiltersCount}\n </span>\n )}\n </Button>\n )}\n\n {/* Search */}\n {enableSearch && (\n <div\n className={cn('flex-1 flex justify-end', searchContainerClassName)}\n >\n <Search\n value={inputValue}\n onChange={handleInputChange}\n onSearch={handleSearchChange}\n onClear={() => {\n setInputValue('');\n handleSearchChange('');\n }}\n options={[]}\n placeholder={searchPlaceholder}\n debounceMs={300}\n />\n </div>\n )}\n </div>\n );\n\n // Header with content and controls\n const headerSection = (headerContent || controls) && (\n <div className=\"flex flex-col lg:flex-row items-stretch lg:items-center justify-between gap-4\">\n {/* Header Content (e.g., action buttons) */}\n {headerContent && <div>{headerContent}</div>}\n\n {/* Controls (search and filters) */}\n {controls && <div className=\"flex-1 lg:flex-none\">{controls}</div>}\n </div>\n );\n\n const table = (\n <div className=\"w-full overflow-x-auto\">\n <Table\n variant={variant}\n showLoading={showLoading}\n loadingState={loadingState}\n showNoSearchResult={showNoSearchResult}\n noSearchResultState={noSearchResultState}\n showEmpty={showEmpty}\n emptyState={emptyState}\n >\n {/* Table Header */}\n <thead>\n <TableRow\n variant={variant === 'borderless' ? 'defaultBorderless' : 'default'}\n >\n {headers.map((header, index) => (\n <TableHead\n key={`header-${header.key}-${index}`}\n sortable={enableTableSort && header.sortable}\n sortDirection={\n enableTableSort && sortColumn === header.key\n ? sortDirection\n : null\n }\n onSort={() =>\n enableTableSort && header.sortable && handleSort(header.key)\n }\n className={header.className}\n style={header.width ? { width: header.width } : undefined}\n >\n {header.label}\n </TableHead>\n ))}\n </TableRow>\n </thead>\n\n {/* Table Body */}\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={headers.length} className=\"text-center py-8\">\n <span className=\"text-text-400 text-sm\">Carregando...</span>\n </TableCell>\n </TableRow>\n ) : (\n displayData.map((row, rowIndex) => {\n // Calculate effective index for row click and keys\n const effectiveIndex = useInternalPagination\n ? (currentPage - 1) * itemsPerPage + rowIndex\n : rowIndex;\n\n const rowKeyValue = rowKey\n ? (() => {\n const keyValue = row[rowKey];\n if (keyValue === null || keyValue === undefined) {\n return `row-${effectiveIndex}`;\n }\n if (typeof keyValue === 'object') {\n return JSON.stringify(keyValue);\n }\n return String(keyValue);\n })()\n : `row-${effectiveIndex}`;\n return (\n <TableRow\n key={rowKeyValue}\n variant={\n variant === 'borderless' ? 'defaultBorderless' : 'default'\n }\n clickable={enableRowClick}\n onClick={() => handleRowClickInternal(row, effectiveIndex)}\n >\n {headers.map((header, cellIndex) => {\n const value = row[header.key];\n\n let defaultContent = '';\n\n if (value !== null && value !== undefined) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n // Only convert primitives directly to string\n defaultContent = String(value);\n } else if (typeof value === 'object') {\n // Serialize objects and arrays with JSON\n defaultContent = JSON.stringify(value);\n } else if (typeof value === 'function') {\n // Handle functions - don't expose function code\n defaultContent = '[Function]';\n } else if (typeof value === 'symbol') {\n // Handle symbols\n defaultContent = String(value);\n }\n // All possible types covered - no else needed\n }\n\n const content = header.render\n ? header.render(value, row, effectiveIndex)\n : defaultContent;\n\n return (\n <TableCell\n key={`cell-${effectiveIndex}-${cellIndex}`}\n className={header.className}\n style={{\n textAlign: header.align,\n }}\n >\n {content}\n </TableCell>\n );\n })}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n );\n\n const pagination = enablePagination && !isEmpty && (\n <div className=\"flex justify-end\">\n <TablePagination\n currentPage={currentPage}\n totalPages={calculatedTotalPages}\n totalItems={calculatedTotalItems}\n itemsPerPage={itemsPerPage}\n itemsPerPageOptions={itemsPerPageOptions}\n onPageChange={handlePageChange}\n onItemsPerPageChange={handleItemsPerPageChange}\n itemLabel={itemLabel}\n />\n </div>\n );\n\n // If children prop provided, use render props pattern\n if (children) {\n return (\n <>\n {children({\n controls: headerSection || controls || null,\n table,\n pagination,\n })}\n {/* Filter Modal */}\n {enableFilters && (\n <FilterModal\n isOpen={isFilterModalOpen}\n onClose={() => setIsFilterModalOpen(false)}\n filterConfigs={filterConfigs}\n onFiltersChange={updateFilters}\n onApply={handleFilterApply}\n onClear={clearFilters}\n />\n )}\n </>\n );\n }\n\n // Default layout (backward compatible)\n const wrapperClassName = containerClassName || 'w-full space-y-4';\n return (\n <div className={wrapperClassName}>\n {headerSection}\n {table}\n {pagination}\n\n {/* Filter Modal */}\n {enableFilters && (\n <FilterModal\n isOpen={isFilterModalOpen}\n onClose={() => setIsFilterModalOpen(false)}\n filterConfigs={filterConfigs}\n onFiltersChange={updateFilters}\n onApply={handleFilterApply}\n onClear={clearFilters}\n />\n )}\n </div>\n );\n}\n\nexport default TableProvider;\n","import React, {\n forwardRef,\n HTMLAttributes,\n TdHTMLAttributes,\n ThHTMLAttributes,\n useState,\n useMemo,\n useEffect,\n Children,\n isValidElement,\n ReactNode,\n} from 'react';\nimport { cn } from '../../utils/utils';\nimport { CaretUp, CaretDown } from 'phosphor-react';\nimport NoSearchResult from '../NoSearchResult/NoSearchResult';\nimport EmptyState from '../EmptyState/EmptyState';\nimport { SkeletonTable } from '../Skeleton/Skeleton';\nimport type {\n EmptyStateConfig,\n LoadingStateConfig,\n NoSearchResultConfig,\n} from '../TableProvider/TableProvider';\n\ntype TableVariant = 'default' | 'borderless';\ntype TableRowState = 'default' | 'selected' | 'invalid' | 'disabled';\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface UseTableSortOptions {\n /** Se true, sincroniza o estado de ordenação com os parâmetros da URL */\n syncWithUrl?: boolean;\n}\n\n/**\n * Hook para gerenciar ordenação de dados da tabela\n *\n * @param data - Array de dados a serem ordenados\n * @param options - Opções de configuração do hook\n * @returns Objeto com dados ordenados, coluna/direção atual e função de sort\n *\n * @example\n * ```tsx\n * const activities = [\n * { id: 1, name: 'Task A', date: '2024-01-01' },\n * { id: 2, name: 'Task B', date: '2024-01-02' },\n * ];\n *\n * // Sem sincronização com URL\n * const { sortedData, sortColumn, sortDirection, handleSort } = useTableSort(activities);\n *\n * // Com sincronização com URL\n * const { sortedData, sortColumn, sortDirection, handleSort } = useTableSort(activities, { syncWithUrl: true });\n *\n * <TableHead\n * sortDirection={sortColumn === 'name' ? sortDirection : null}\n * onSort={() => handleSort('name')}\n * >\n * Name\n * </TableHead>\n * ```\n */\nexport function useTableSort<T extends Record<string, unknown>>(\n data: T[],\n options: UseTableSortOptions = {}\n) {\n const { syncWithUrl = false } = options;\n\n // Inicializar estado a partir da URL se syncWithUrl estiver habilitado\n const getInitialState = () => {\n if (!syncWithUrl || globalThis.window === undefined) {\n return { column: null, direction: null };\n }\n\n const params = new URLSearchParams(globalThis.location.search);\n const sortBy = params.get('sortBy');\n const sort = params.get('sort');\n\n if (sortBy && sort && (sort === 'ASC' || sort === 'DESC')) {\n return {\n column: sortBy,\n direction: sort.toLowerCase() as SortDirection,\n };\n }\n\n return { column: null, direction: null };\n };\n\n const initialState = getInitialState();\n const [sortColumn, setSortColumn] = useState<string | null>(\n initialState.column\n );\n const [sortDirection, setSortDirection] = useState<SortDirection>(\n initialState.direction\n );\n\n // Atualizar URL quando o estado de ordenação mudar\n useEffect(() => {\n if (!syncWithUrl || globalThis.window === undefined) return;\n\n const url = new URL(globalThis.location.href);\n const params = url.searchParams;\n\n if (sortColumn && sortDirection) {\n params.set('sortBy', sortColumn);\n params.set('sort', sortDirection.toUpperCase());\n } else {\n params.delete('sortBy');\n params.delete('sort');\n }\n\n // Atualizar URL sem recarregar a página\n globalThis.history.replaceState({}, '', url.toString());\n }, [sortColumn, sortDirection, syncWithUrl]);\n\n const handleSort = (column: string) => {\n if (sortColumn === column) {\n if (sortDirection === 'asc') {\n setSortDirection('desc');\n } else if (sortDirection === 'desc') {\n setSortColumn(null);\n setSortDirection(null);\n }\n } else {\n setSortColumn(column);\n setSortDirection('asc');\n }\n };\n\n const sortedData = useMemo(() => {\n if (!sortColumn || !sortDirection) {\n return data;\n }\n\n return [...data].sort((a, b) => {\n const aValue = a[sortColumn as keyof T];\n const bValue = b[sortColumn as keyof T];\n\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n const comparison = aValue.localeCompare(bValue);\n return sortDirection === 'asc' ? comparison : -comparison;\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return sortDirection === 'asc' ? aValue - bValue : bValue - aValue;\n }\n\n return 0;\n });\n }, [data, sortColumn, sortDirection]);\n\n return { sortedData, sortColumn, sortDirection, handleSort };\n}\n\ninterface TableProps extends HTMLAttributes<HTMLTableElement> {\n variant?: TableVariant;\n\n /** Show loading state (controlled by TableProvider) */\n showLoading?: boolean;\n /** Loading state configuration */\n loadingState?: LoadingStateConfig;\n\n /** Show no search result state (controlled by TableProvider) */\n showNoSearchResult?: boolean;\n /** No search result state configuration */\n noSearchResultState?: NoSearchResultConfig;\n\n /** Show empty state (controlled by TableProvider) */\n showEmpty?: boolean;\n /** Empty state configuration */\n emptyState?: EmptyStateConfig;\n}\n\ninterface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n state?: TableRowState;\n}\n\n/**\n * Renders the table header and caption from children\n */\nconst renderHeaderElements = (children: ReactNode) => {\n return Children.map(children, (child) => {\n if (\n isValidElement(child) &&\n (child.type === TableCaption || child.type === TableHeader)\n ) {\n return child;\n }\n return null;\n });\n};\n\n/**\n * Gets no search result content based on configuration\n */\nconst getNoSearchResultContent = (\n config: NoSearchResultConfig,\n defaultTitle: string,\n defaultDescription: string\n) => {\n if (config.component) {\n return config.component;\n }\n\n if (config.image) {\n return (\n <NoSearchResult\n image={config.image}\n title={config.title || defaultTitle}\n description={config.description || defaultDescription}\n />\n );\n }\n\n return (\n <div className=\"text-center\">\n <p className=\"text-text-600 text-lg font-semibold mb-2\">\n {config.title || defaultTitle}\n </p>\n <p className=\"text-text-500 text-sm\">\n {config.description || defaultDescription}\n </p>\n </div>\n );\n};\n\n/**\n * Gets empty state content based on configuration\n */\nconst getEmptyStateContent = (\n config: EmptyStateConfig | undefined,\n defaultTitle: string,\n defaultDescription: string\n) => {\n if (config?.component) {\n return config.component;\n }\n\n return (\n <EmptyState\n image={config?.image}\n title={config?.title || defaultTitle}\n description={config?.description || defaultDescription}\n buttonText={config?.buttonText}\n buttonIcon={config?.buttonIcon}\n onButtonClick={config?.onButtonClick}\n buttonVariant={config?.buttonVariant}\n buttonAction={config?.buttonAction}\n />\n );\n};\n\n/**\n * Renders table wrapper with header and state content\n */\nconst renderTableWrapper = (\n variant: TableVariant,\n tableRef: React.Ref<HTMLTableElement>,\n className: string | undefined,\n children: ReactNode,\n stateContent: ReactNode,\n tableProps: HTMLAttributes<HTMLTableElement>\n) => {\n return (\n <div\n className={cn(\n 'relative w-full overflow-x-auto',\n variant === 'default' && 'border border-border-200 rounded-xl'\n )}\n >\n <table\n ref={tableRef}\n className={cn(\n 'analytica-table w-full caption-bottom text-sm border-separate border-spacing-0',\n className\n )}\n {...tableProps}\n >\n {renderHeaderElements(children)}\n </table>\n <div className=\"py-8 flex justify-center\">{stateContent}</div>\n </div>\n );\n};\n\nconst Table = forwardRef<HTMLTableElement, TableProps>(\n (\n {\n variant = 'default',\n className,\n children,\n showLoading = false,\n loadingState,\n showNoSearchResult = false,\n noSearchResultState,\n showEmpty = false,\n emptyState,\n ...props\n },\n ref\n ) => {\n // Default configurations\n const defaultNoSearchResultState: NoSearchResultConfig = {\n title: 'Nenhum resultado encontrado',\n description:\n 'Não encontramos nenhum resultado com esse nome. Tente revisar a busca ou usar outra palavra-chave.',\n };\n\n const defaultEmptyState: EmptyStateConfig = {\n title: 'Nenhum dado disponível',\n description: 'Não há dados para exibir no momento.',\n };\n\n const finalNoSearchResultState =\n noSearchResultState || defaultNoSearchResultState;\n const finalEmptyState = emptyState || defaultEmptyState;\n\n // Render Loading State FIRST (highest priority)\n if (showLoading) {\n const loadingContent = loadingState?.component || (\n <SkeletonTable rows={5} columns={4} showHeader={false} />\n );\n return renderTableWrapper(\n variant,\n ref,\n className,\n children,\n loadingContent,\n props\n );\n }\n\n // Render NoSearchResult outside table\n if (showNoSearchResult) {\n const noSearchContent = getNoSearchResultContent(\n finalNoSearchResultState,\n defaultNoSearchResultState.title || '',\n defaultNoSearchResultState.description || ''\n );\n return renderTableWrapper(\n variant,\n ref,\n className,\n children,\n noSearchContent,\n props\n );\n }\n\n // Render Empty State outside table (same pattern as NoSearchResult)\n if (showEmpty) {\n const emptyContent = getEmptyStateContent(\n finalEmptyState,\n defaultEmptyState.title || 'Nenhum dado disponível',\n defaultEmptyState.description || 'Não há dados para exibir no momento.'\n );\n return renderTableWrapper(\n variant,\n ref,\n className,\n children,\n emptyContent,\n props\n );\n }\n\n return (\n <div\n className={cn(\n 'relative w-full overflow-x-auto',\n variant === 'default' && 'border border-border-200 rounded-xl'\n )}\n >\n <table\n ref={ref}\n className={cn(\n variant === 'default' && 'analytica-table',\n variant === 'default' && 'border-separate border-spacing-0',\n 'w-full caption-bottom text-sm',\n className\n )}\n {...props}\n >\n {/* Render fallback caption only if no TableCaption provided */}\n {!Children.toArray(children).some(\n (child) => isValidElement(child) && child.type === TableCaption\n ) && <caption className=\"sr-only\">My Table</caption>}\n {children}\n </table>\n </div>\n );\n }\n);\n\nTable.displayName = 'Table';\n\nconst TableHeader = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn('[&_tr:first-child]:border-0', className)}\n {...props}\n />\n));\nTableHeader.displayName = 'TableHeader';\n\ninterface TableBodyProps extends HTMLAttributes<HTMLTableSectionElement> {\n variant?: TableVariant;\n}\n\nconst TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, variant = 'default', ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\n '[&_tr:last-child]:border-border-200',\n variant === 'default' && 'border-t border-border-200',\n className\n )}\n {...props}\n />\n )\n);\nTableBody.displayName = 'TableBody';\n\ninterface TableFooterProps extends HTMLAttributes<HTMLTableSectionElement> {\n variant?: TableVariant;\n}\n\nconst TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ variant = 'default', className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'bg-background-50 font-medium [&>tr]:last:border-b-0 px-6 py-3.5',\n variant === 'default' && 'border-t border-border-200',\n className\n )}\n {...props}\n />\n )\n);\nTableFooter.displayName = 'TableFooter';\n\nconst VARIANT_STATES_ROW = {\n default: {\n default: 'border border-border-200',\n defaultBorderless: 'border-b border-border-200',\n borderless: '',\n },\n selected: {\n default: 'border-b-2 border-indicator-primary',\n defaultBorderless: 'border-b border-indicator-primary',\n borderless: 'bg-indicator-primary/10',\n },\n invalid: {\n default: 'border-b-2 border-indicator-error',\n defaultBorderless: 'border-b border-indicator-error',\n borderless: 'bg-indicator-error/10',\n },\n disabled: {\n default:\n 'border-b border-border-100 bg-background-50 opacity-50 cursor-not-allowed',\n defaultBorderless:\n 'border-b border-border-100 bg-background-50 opacity-50 cursor-not-allowed',\n borderless: 'bg-background-50 opacity-50 cursor-not-allowed',\n },\n} as const;\n\ninterface TableRowPropsExtended extends TableRowProps {\n variant?: TableVariant | 'defaultBorderless';\n clickable?: boolean;\n}\n\nconst TableRow = forwardRef<HTMLTableRowElement, TableRowPropsExtended>(\n (\n {\n variant = 'default',\n state = 'default',\n clickable = false,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <tr\n ref={ref}\n className={cn(\n 'transition-colors',\n state === 'disabled' ? '' : 'hover:bg-muted/50',\n state === 'disabled' || !clickable ? '' : 'cursor-pointer',\n VARIANT_STATES_ROW[state][variant],\n className\n )}\n aria-disabled={state === 'disabled'}\n {...props}\n />\n );\n }\n);\nTableRow.displayName = 'TableRow';\n\ninterface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {\n /** Enable sorting on this column (default: true) */\n sortable?: boolean;\n /** Current sort direction for this column */\n sortDirection?: SortDirection;\n /** Callback when column header is clicked */\n onSort?: () => void;\n}\n\nconst TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(\n (\n {\n className,\n sortable = true,\n sortDirection = null,\n onSort,\n children,\n ...props\n },\n ref\n ) => {\n const handleClick = () => {\n if (sortable && onSort) {\n onSort();\n }\n };\n\n return (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-6 py-3.5 text-left align-middle font-bold text-base text-text-800 tracking-[0.2px] leading-none [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px] whitespace-nowrap',\n sortable && 'cursor-pointer select-none hover:bg-muted/30',\n className\n )}\n onClick={handleClick}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n {children}\n {sortable && (\n <div className=\"flex flex-col\">\n {sortDirection === 'asc' && (\n <CaretUp size={16} weight=\"fill\" className=\"text-text-800\" />\n )}\n {sortDirection === 'desc' && (\n <CaretDown size={16} weight=\"fill\" className=\"text-text-800\" />\n )}\n </div>\n )}\n </div>\n </th>\n );\n }\n);\nTableHead.displayName = 'TableHead';\n\nconst TableCell = forwardRef<\n HTMLTableCellElement,\n TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px] text-base font-normal text-text-800 leading-[150%] tracking-normal px-6 py-3.5 whitespace-nowrap',\n className\n )}\n {...props}\n />\n));\nTableCell.displayName = 'TableCell';\n\nconst TableCaption = forwardRef<\n HTMLTableCaptionElement,\n HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\n 'border-t border-border-200 text-sm text-text-800 px-6 py-3.5',\n className\n )}\n {...props}\n />\n));\nTableCaption.displayName = 'TableCaption';\n\nexport { default as TablePagination } from './TablePagination';\nexport type { TablePaginationProps } from './TablePagination';\n\nexport default Table;\nexport {\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","import Text from '../Text/Text';\n\nexport interface NoSearchResultProps {\n /**\n * Image source for the illustration\n */\n image: string;\n /**\n * Title text to display\n * @default \"Nenhum resultado encontrado\"\n */\n title?: string;\n /**\n * Description text to display below the title\n * @default \"Não encontramos nenhum resultado com esse nome. Tente revisar a busca ou usar outra palavra-chave.\"\n */\n description?: string;\n}\n\n/**\n * Component displayed when no search results are found\n * Shows an illustration with customizable title and description in horizontal layout\n *\n * @example\n * ```tsx\n * import { NoSearchResult } from 'analytica-frontend-lib';\n * import noSearchImage from './assets/no-search.png';\n *\n * <NoSearchResult\n * image={noSearchImage}\n * title=\"Nenhum resultado encontrado\"\n * description=\"Tente usar outros filtros\"\n * />\n * ```\n */\nconst NoSearchResult = ({ image, title, description }: NoSearchResultProps) => {\n const displayTitle = title || 'Nenhum resultado encontrado';\n const displayDescription =\n description ||\n 'Não encontramos nenhum resultado com esse nome. Tente revisar a busca ou usar outra palavra-chave.';\n\n return (\n <div className=\"flex flex-col lg:flex-row justify-center items-center gap-6 lg:gap-8 w-full max-w-4xl min-h-96 px-4 lg:px-0\">\n {/* Illustration */}\n <div className=\"w-48 h-48 lg:w-72 lg:h-72 flex-shrink-0 relative max-w-full\">\n <img\n src={image}\n alt=\"No search results\"\n className=\"w-full h-full object-contain\"\n />\n </div>\n\n {/* Text Content */}\n <div className=\"flex flex-col items-center lg:items-start w-full max-w-md min-w-0\">\n {/* Header Container */}\n <div className=\"flex flex-row justify-center lg:justify-between items-end px-6 pt-6 pb-4 w-full rounded-t-xl\">\n {/* Title */}\n <Text\n as=\"h2\"\n className=\"text-text-950 font-semibold text-xl lg:text-3xl leading-tight w-full flex items-center justify-center lg:justify-start text-center lg:text-left\"\n >\n {displayTitle}\n </Text>\n </div>\n\n {/* Description Container */}\n <div className=\"flex flex-row justify-center items-center px-6 gap-2 w-full\">\n {/* Description */}\n <Text className=\"text-text-600 font-normal text-base lg:text-lg leading-relaxed w-full text-center lg:text-justify\">\n {displayDescription}\n </Text>\n </div>\n </div>\n </div>\n );\n};\n\nexport default NoSearchResult;\n","import { type ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\n\nexport interface EmptyStateProps {\n /**\n * Image source for the illustration (optional)\n * Can be a string (URL) or a ReactNode (component)\n */\n image?: string | ReactNode;\n /**\n * Title text to display\n * @default \"Nenhum dado disponível\"\n */\n title?: string;\n /**\n * Description text to display below the title\n * @default \"Não há dados para exibir no momento.\"\n */\n description?: string;\n /**\n * Button text (optional - if not provided, button won't be displayed)\n */\n buttonText?: string;\n /**\n * Icon to display on the left side of the button\n */\n buttonIcon?: ReactNode;\n /**\n * Callback function when button is clicked\n */\n onButtonClick?: () => void;\n /**\n * Button variant\n * @default \"solid\"\n */\n buttonVariant?: 'solid' | 'outline' | 'link';\n /**\n * Button action color\n * @default \"primary\"\n */\n buttonAction?: 'primary' | 'positive' | 'negative';\n /**\n * Text size variant\n * @default \"large\"\n */\n size?: 'compact' | 'large';\n}\n\n/**\n * Component displayed when there is no data to show (empty state)\n * Shows an illustration with customizable title, description, and optional button in horizontal layout\n *\n * @example\n * ```tsx\n * import { EmptyState } from 'analytica-frontend-lib';\n * import activityImage from './assets/activity.png';\n * import { Plus } from 'phosphor-react';\n *\n * // Large variant (default) - for main page empty states\n * <EmptyState\n * image={activityImage}\n * title=\"Incentive sua turma ao aprendizado\"\n * description=\"Crie uma nova atividade e ajude seus alunos a colocarem o conteúdo em prática!\"\n * buttonText=\"Criar atividade\"\n * buttonIcon={<Plus size={18} />}\n * buttonVariant=\"outline\"\n * onButtonClick={handleCreateActivity}\n * />\n *\n * // Compact variant - for inline/contextual empty states\n * <EmptyState\n * image={activityImage}\n * title=\"Nenhum resultado encontrado\"\n * description=\"Utilize o filtro ao lado para encontrar questões.\"\n * size=\"compact\"\n * />\n * ```\n */\nconst EmptyState = ({\n image,\n title,\n description,\n buttonText,\n buttonIcon,\n onButtonClick,\n buttonVariant = 'solid',\n buttonAction = 'primary',\n size = 'large',\n}: EmptyStateProps) => {\n const displayTitle = title || 'Nenhum dado disponível';\n const displayDescription =\n description || 'Não há dados para exibir no momento.';\n\n const titleClassName =\n size === 'compact'\n ? 'text-text-600 text-sm font-semibold text-center'\n : 'text-text-950 text-3xl font-semibold text-center';\n\n const descriptionClassName =\n size === 'compact'\n ? 'text-text-600 text-sm font-normal text-center'\n : 'text-text-600 text-[18px] font-normal text-center';\n\n const containerMinHeight = size === 'compact' ? 'min-h-0' : 'min-h-[705px]';\n\n return (\n <div\n className={`flex flex-col justify-center items-center gap-6 w-full ${containerMinHeight} bg-background rounded-xl p-6`}\n >\n {/* Illustration */}\n {image && (\n <div className=\"max-w-[170px] max-h-[150px] flex items-center justify-center\">\n {typeof image === 'string' ? (\n <img\n src={image}\n alt={displayTitle}\n className=\"w-full h-full max-w-[170px] max-h-[150px]\"\n />\n ) : (\n <div className=\"w-[170px] h-[150px] flex items-center justify-center\">\n {image}\n </div>\n )}\n </div>\n )}\n\n {/* Text Content Container */}\n <div className=\"flex flex-col items-center gap-4 w-full max-w-[600px] px-6\">\n {/* Title */}\n <Text as=\"h2\" className={titleClassName}>\n {displayTitle}\n </Text>\n\n {/* Description */}\n <Text className={descriptionClassName}>{displayDescription}</Text>\n </div>\n\n {/* Button */}\n {buttonText && onButtonClick && (\n <Button\n variant={buttonVariant}\n action={buttonAction}\n size=\"large\"\n onClick={onButtonClick}\n iconLeft={buttonIcon}\n className=\"rounded-full px-5 py-2.5\"\n >\n {buttonText}\n </Button>\n )}\n </div>\n );\n};\n\nexport default EmptyState;\n","import { forwardRef, HTMLAttributes, CSSProperties } from 'react';\nimport { cn } from '../../utils/utils';\n\ninterface SkeletonProps extends HTMLAttributes<HTMLDivElement> {\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded';\n width?: string | number;\n height?: string | number;\n animation?: 'pulse' | 'none';\n lines?: number;\n spacing?: 'none' | 'small' | 'medium' | 'large';\n}\n\nconst SKELETON_ANIMATION_CLASSES = {\n pulse: 'animate-pulse',\n none: '',\n};\n\nconst SKELETON_VARIANT_CLASSES = {\n text: 'h-4 bg-background-200 rounded',\n circular: 'bg-background-200 rounded-full',\n rectangular: 'bg-background-200',\n rounded: 'bg-background-200 rounded-lg',\n};\n\nconst SPACING_CLASSES = {\n none: '',\n small: 'space-y-1',\n medium: 'space-y-2',\n large: 'space-y-3',\n};\n\nconst Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n (\n {\n variant = 'text',\n width,\n height,\n animation = 'pulse',\n lines = 1,\n spacing = 'none',\n className = '',\n children,\n ...props\n },\n ref\n ) => {\n const animationClass = SKELETON_ANIMATION_CLASSES[animation];\n const variantClass = SKELETON_VARIANT_CLASSES[variant];\n const spacingClass = SPACING_CLASSES[spacing];\n\n const style: CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n };\n\n // Se for múltiplas linhas de texto\n if (variant === 'text' && lines > 1) {\n return (\n <div\n ref={ref}\n className={cn('flex flex-col', spacingClass, className)}\n {...props}\n >\n {Array.from({ length: lines }, (_, index) => (\n <div\n key={index}\n className={cn(variantClass, animationClass)}\n style={index === lines - 1 ? { width: '60%' } : undefined}\n />\n ))}\n </div>\n );\n }\n\n // Se for um único elemento\n return (\n <div\n ref={ref}\n className={cn(variantClass, animationClass, className)}\n style={style}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\n// Componentes específicos para casos comuns\nconst SkeletonText = forwardRef<HTMLDivElement, Omit<SkeletonProps, 'variant'>>(\n (props, ref) => <Skeleton ref={ref} variant=\"text\" {...props} />\n);\n\nconst SkeletonCircle = forwardRef<\n HTMLDivElement,\n Omit<SkeletonProps, 'variant'>\n>((props, ref) => <Skeleton ref={ref} variant=\"circular\" {...props} />);\n\nconst SkeletonRectangle = forwardRef<\n HTMLDivElement,\n Omit<SkeletonProps, 'variant'>\n>((props, ref) => <Skeleton ref={ref} variant=\"rectangular\" {...props} />);\n\nconst SkeletonRounded = forwardRef<\n HTMLDivElement,\n Omit<SkeletonProps, 'variant'>\n>((props, ref) => <Skeleton ref={ref} variant=\"rounded\" {...props} />);\n\n// Componente para card skeleton\ninterface SkeletonCardProps extends HTMLAttributes<HTMLDivElement> {\n showAvatar?: boolean;\n showTitle?: boolean;\n showDescription?: boolean;\n showActions?: boolean;\n lines?: number;\n}\n\nconst SkeletonCard = forwardRef<HTMLDivElement, SkeletonCardProps>(\n (\n {\n showAvatar = true,\n showTitle = true,\n showDescription = true,\n showActions = true,\n lines = 2,\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full p-4 bg-background border border-border-200 rounded-lg',\n className\n )}\n {...props}\n >\n <div className=\"flex items-start space-x-3\">\n {showAvatar && <SkeletonCircle width={40} height={40} />}\n\n <div className=\"flex-1 space-y-2\">\n {showTitle && <SkeletonText width=\"60%\" height={20} />}\n\n {showDescription && <SkeletonText lines={lines} spacing=\"small\" />}\n </div>\n </div>\n\n {showActions && (\n <div className=\"flex justify-end space-x-2 mt-4\">\n <SkeletonRectangle width={80} height={32} />\n <SkeletonRectangle width={80} height={32} />\n </div>\n )}\n </div>\n );\n }\n);\n\n// Componente para lista skeleton\ninterface SkeletonListProps extends HTMLAttributes<HTMLDivElement> {\n items?: number;\n showAvatar?: boolean;\n showTitle?: boolean;\n showDescription?: boolean;\n lines?: number;\n}\n\nconst SkeletonList = forwardRef<HTMLDivElement, SkeletonListProps>(\n (\n {\n items = 3,\n showAvatar = true,\n showTitle = true,\n showDescription = true,\n lines = 1,\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <div ref={ref} className={cn('space-y-3', className)} {...props}>\n {Array.from({ length: items }, (_, index) => (\n <div key={index} className=\"flex items-start space-x-3 p-3\">\n {showAvatar && <SkeletonCircle width={32} height={32} />}\n\n <div className=\"flex-1 space-y-2\">\n {showTitle && <SkeletonText width=\"40%\" height={16} />}\n\n {showDescription && (\n <SkeletonText lines={lines} spacing=\"small\" />\n )}\n </div>\n </div>\n ))}\n </div>\n );\n }\n);\n\n// Componente para tabela skeleton\ninterface SkeletonTableProps extends HTMLAttributes<HTMLDivElement> {\n rows?: number;\n columns?: number;\n showHeader?: boolean;\n}\n\nconst SkeletonTable = forwardRef<HTMLDivElement, SkeletonTableProps>(\n (\n { rows = 5, columns = 4, showHeader = true, className = '', ...props },\n ref\n ) => {\n return (\n <div ref={ref} className={cn('w-full', className)} {...props}>\n {showHeader && (\n <div className=\"flex space-x-2 mb-3\">\n {Array.from({ length: columns }, (_, index) => (\n <SkeletonText\n key={index}\n width={`${100 / columns}%`}\n height={20}\n />\n ))}\n </div>\n )}\n\n <div className=\"space-y-2\">\n {Array.from({ length: rows }, (_, rowIndex) => (\n <div key={rowIndex} className=\"flex space-x-2\">\n {Array.from({ length: columns }, (_, colIndex) => (\n <SkeletonText\n key={colIndex}\n width={`${100 / columns}%`}\n height={16}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n }\n);\n\nexport {\n Skeleton,\n SkeletonText,\n SkeletonCircle,\n SkeletonRectangle,\n SkeletonRounded,\n SkeletonCard,\n SkeletonList,\n SkeletonTable,\n};\n","import { HTMLAttributes, ChangeEvent } from 'react';\nimport { CaretLeft, CaretRight, CaretDown } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\nexport interface TablePaginationProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Total number of items\n */\n totalItems: number;\n /**\n * Current page (1-based)\n */\n currentPage: number;\n /**\n * Total number of pages\n */\n totalPages: number;\n /**\n * Items per page\n */\n itemsPerPage: number;\n /**\n * Available options for items per page\n * @default [10, 20, 50, 100]\n */\n itemsPerPageOptions?: number[];\n /**\n * Callback when page changes\n */\n onPageChange: (page: number) => void;\n /**\n * Callback when items per page changes\n */\n onItemsPerPageChange?: (itemsPerPage: number) => void;\n /**\n * Customizable label for items (e.g., \"escolas\", \"alunos\", \"atividades\")\n * @default \"itens\"\n */\n itemLabel?: string;\n}\n\n/**\n * Table pagination component with navigation controls and items per page selector\n *\n * @example\n * ```tsx\n * import { TablePagination } from 'analytica-frontend-lib';\n *\n * <TablePagination\n * totalItems={1000}\n * currentPage={1}\n * totalPages={10}\n * itemsPerPage={10}\n * itemsPerPageOptions={[10, 20, 50, 100]}\n * onPageChange={(page) => setCurrentPage(page)}\n * onItemsPerPageChange={(items) => setItemsPerPage(items)}\n * itemLabel=\"escolas\"\n * />\n * ```\n */\nconst TablePagination = ({\n totalItems,\n currentPage,\n totalPages,\n itemsPerPage,\n itemsPerPageOptions = [10, 20, 50, 100],\n onPageChange,\n onItemsPerPageChange,\n itemLabel = 'itens',\n className,\n ...props\n}: TablePaginationProps) => {\n const startItem = totalItems === 0 ? 0 : (currentPage - 1) * itemsPerPage + 1;\n const endItem =\n totalItems === 0 ? 0 : Math.min(currentPage * itemsPerPage, totalItems);\n\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handleItemsPerPageChange = (e: ChangeEvent<HTMLSelectElement>) => {\n if (onItemsPerPageChange) {\n onItemsPerPageChange(Number(e.target.value));\n }\n };\n\n const isFirstPage = currentPage === 1;\n const isLastPage = currentPage === totalPages;\n\n return (\n <div\n className={cn(\n 'flex flex-col sm:flex-row items-center gap-3 sm:gap-4 w-full bg-background-50 rounded-xl p-4',\n 'sm:justify-between',\n className\n )}\n {...props}\n >\n {/* Items count - isolado à esquerda no desktop */}\n <span className=\"font-normal text-xs leading-[14px] text-text-800\">\n {startItem} - {endItem} de {totalItems} {itemLabel}\n </span>\n\n {/* Grupo direita: selector + page info + botões */}\n <div className=\"flex flex-wrap sm:flex-nowrap items-center gap-2 sm:gap-4 justify-center sm:justify-start\">\n {/* Items per page selector */}\n {onItemsPerPageChange && (\n <div className=\"relative\">\n <select\n value={itemsPerPage}\n onChange={handleItemsPerPageChange}\n className=\"w-24 h-9 py-0 px-3 pr-8 bg-background border border-border-300 rounded appearance-none cursor-pointer font-normal text-sm leading-[21px] text-text-900\"\n aria-label=\"Items por página\"\n >\n {itemsPerPageOptions.map((option) => (\n <option key={option} value={option}>\n {option} itens\n </option>\n ))}\n </select>\n <CaretDown\n size={14}\n weight=\"regular\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-background-600 pointer-events-none\"\n />\n </div>\n )}\n\n {/* Page info */}\n <span className=\"font-normal text-xs leading-[14px] text-text-950\">\n Página {currentPage} de {totalPages}\n </span>\n\n {/* Previous button */}\n <button\n onClick={handlePrevious}\n disabled={isFirstPage}\n className={cn(\n 'flex flex-row justify-center items-center py-2 px-4 gap-2 rounded-3xl transition-all',\n isFirstPage\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-primary-950/10 cursor-pointer'\n )}\n aria-label=\"Página anterior\"\n >\n <CaretLeft size={12} weight=\"bold\" className=\"text-primary-950\" />\n <span className=\"font-medium text-xs leading-[14px] text-primary-950\">\n Anterior\n </span>\n </button>\n\n {/* Next button */}\n <button\n onClick={handleNext}\n disabled={isLastPage}\n className={cn(\n 'flex flex-row justify-center items-center py-2 px-4 gap-2 rounded-3xl transition-all',\n isLastPage\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-primary-950/10 cursor-pointer'\n )}\n aria-label=\"Próxima página\"\n >\n <span className=\"font-medium text-xs leading-[14px] text-primary-950\">\n Próxima\n </span>\n <CaretRight size={12} weight=\"bold\" className=\"text-primary-950\" />\n </button>\n </div>\n </div>\n );\n};\n\nTablePagination.displayName = 'TablePagination';\n\nexport default TablePagination;\n","import { useEffect, useState, useCallback, useMemo } from 'react';\nimport type { CategoryConfig } from '../CheckBoxGroup/CheckBoxGroup';\nimport { calculateFormattedItemsForAutoSelection } from '../CheckBoxGroup/CheckBoxGroup.helpers';\n\nexport type FilterConfig = {\n key: string;\n label: string;\n categories: CategoryConfig[];\n};\n\n/**\n * Merge new filter configs with previous state, preserving user selections\n */\nconst mergeConfigsWithSelections = (\n newConfigs: FilterConfig[],\n prevConfigs: FilterConfig[]\n): FilterConfig[] => {\n let changed = false;\n\n const result = newConfigs.map((newConfig, i) => ({\n ...newConfig,\n categories: newConfig.categories.map((newCat, j) => {\n const prevCat = prevConfigs[i]?.categories[j];\n const prevItems = prevCat?.itens ?? [];\n const newItems = newCat.itens ?? [];\n\n if (prevItems.length !== newItems.length) {\n changed = true;\n }\n\n if (prevCat?.key === newCat.key && prevCat?.selectedIds?.length) {\n const availableIds = new Set(newItems.map((item) => item.id));\n const selectedIds = prevCat.selectedIds.filter((id) =>\n availableIds.has(id)\n );\n if (selectedIds.length !== prevCat.selectedIds.length) {\n changed = true;\n }\n return { ...newCat, selectedIds };\n }\n return newCat;\n }),\n }));\n\n return changed ? result : prevConfigs;\n};\n\nexport type UseTableFilterOptions = {\n syncWithUrl?: boolean;\n};\n\nexport type UseTableFilterReturn = {\n filterConfigs: FilterConfig[];\n activeFilters: Record<string, string[]>;\n hasActiveFilters: boolean;\n activeFiltersCount: number;\n updateFilters: (configs: FilterConfig[]) => void;\n applyFilters: () => void;\n clearFilters: () => void;\n};\n\n/**\n * Hook for managing table filters with URL synchronization\n *\n * @param initialConfigs - Initial filter configurations\n * @param options - Hook options including URL sync\n * @returns Filter state and management functions\n *\n * @example\n * ```tsx\n * const { filterConfigs, activeFilters, updateFilters, applyFilters } = useTableFilter(\n * [\n * {\n * key: 'academic',\n * label: 'Dados Acadêmicos',\n * categories: [...]\n * }\n * ],\n * { syncWithUrl: true }\n * );\n * ```\n */\nexport const useTableFilter = (\n initialConfigs: FilterConfig[],\n options: UseTableFilterOptions = {}\n): UseTableFilterReturn => {\n const { syncWithUrl = false } = options;\n\n // Get initial state from URL if syncWithUrl is enabled\n const getInitialState = useCallback((): FilterConfig[] => {\n if (!syncWithUrl || globalThis.window === undefined) {\n return initialConfigs;\n }\n\n const params = new URLSearchParams(globalThis.window.location.search);\n const configsWithUrlState = initialConfigs.map((config) => ({\n ...config,\n categories: config.categories.map((category) => {\n const urlValue = params.get(`filter_${category.key}`);\n const selectedIds = urlValue ? urlValue.split(',').filter(Boolean) : [];\n return {\n ...category,\n selectedIds,\n };\n }),\n }));\n\n return configsWithUrlState;\n }, [initialConfigs, syncWithUrl]);\n\n const [filterConfigs, setFilterConfigs] =\n useState<FilterConfig[]>(getInitialState);\n\n // Calculate active filters (only categories with selections)\n // Memoize to prevent creating new object reference on every render\n const activeFilters = useMemo(() => {\n const filters: Record<string, string[]> = {};\n\n for (const config of filterConfigs) {\n for (const category of config.categories) {\n if (category.selectedIds && category.selectedIds.length > 0) {\n filters[category.key] = category.selectedIds;\n }\n }\n }\n\n return filters;\n }, [filterConfigs]);\n\n const hasActiveFilters = Object.keys(activeFilters).length > 0;\n\n // Count only filters that were manually selected by the user,\n // excluding categories that were auto-selected because they have only 1 available item\n const activeFiltersCount = useMemo(() => {\n const allCategories = filterConfigs.flatMap((config) => config.categories);\n\n let count = 0;\n for (const category of allCategories) {\n if (!category.selectedIds || category.selectedIds.length === 0) continue;\n\n const availableItems = calculateFormattedItemsForAutoSelection(\n category,\n allCategories\n );\n\n const isAutoSelected =\n availableItems.length === 1 &&\n category.selectedIds.length === 1 &&\n category.selectedIds[0] === availableItems[0]?.id;\n\n if (!isAutoSelected) {\n count++;\n }\n }\n\n return count;\n }, [filterConfigs]);\n\n /**\n * Update filter configs (temporary state, not applied to URL yet)\n */\n const updateFilters = useCallback((configs: FilterConfig[]) => {\n setFilterConfigs(configs);\n }, []);\n\n /**\n * Apply filters to URL (commit the changes)\n */\n const applyFilters = useCallback(() => {\n if (!syncWithUrl || globalThis.window === undefined) {\n return;\n }\n\n const url = new URL(globalThis.window.location.href);\n const params = url.searchParams;\n\n // Update URL parameters for each category\n for (const config of filterConfigs) {\n for (const category of config.categories) {\n const paramKey = `filter_${category.key}`;\n\n if (category.selectedIds && category.selectedIds.length > 0) {\n params.set(paramKey, category.selectedIds.join(','));\n } else {\n params.delete(paramKey);\n }\n }\n }\n\n // Update URL without page reload\n globalThis.window.history.replaceState({}, '', url.toString());\n }, [filterConfigs, syncWithUrl]);\n\n /**\n * Clear all filters\n */\n const clearFilters = useCallback(() => {\n const clearedConfigs = filterConfigs.map((config) => ({\n ...config,\n categories: config.categories.map((category) => ({\n ...category,\n selectedIds: [],\n })),\n }));\n\n setFilterConfigs(clearedConfigs);\n\n // If syncWithUrl, also clear URL parameters\n if (syncWithUrl && globalThis.window !== undefined) {\n const url = new URL(globalThis.window.location.href);\n const params = url.searchParams;\n\n for (const config of filterConfigs) {\n for (const category of config.categories) {\n params.delete(`filter_${category.key}`);\n }\n }\n\n globalThis.window.history.replaceState({}, '', url.toString());\n }\n }, [filterConfigs, syncWithUrl]);\n\n // Sync filter configs when initialConfigs items change (e.g., async data loaded)\n useEffect(() => {\n setFilterConfigs((prev) =>\n mergeConfigsWithSelections(initialConfigs, prev)\n );\n }, [initialConfigs]);\n\n // Sync with URL on mount and when URL changes externally\n useEffect(() => {\n if (!syncWithUrl || globalThis.window === undefined) {\n return;\n }\n\n const handlePopState = () => {\n setFilterConfigs(getInitialState());\n };\n\n globalThis.window.addEventListener('popstate', handlePopState);\n return () =>\n globalThis.window.removeEventListener('popstate', handlePopState);\n }, [syncWithUrl, getInitialState]);\n\n return {\n filterConfigs,\n activeFilters,\n hasActiveFilters,\n activeFiltersCount,\n updateFilters,\n applyFilters,\n clearFilters,\n };\n};\n","import type { CategoryConfig, Item } from './CheckBoxGroup';\n\n/**\n * Helper function to efficiently compare selectedIds arrays\n */\nexport const areSelectedIdsEqual = (\n ids1?: string[],\n ids2?: string[]\n): boolean => {\n if (ids1 === ids2) return true;\n if (!ids1 || !ids2) return ids1 === ids2;\n if (ids1.length !== ids2.length) return false;\n\n for (let i = 0; i < ids1.length; i++) {\n if (ids1[i] !== ids2[i]) return false;\n }\n return true;\n};\n\n/**\n * Helper function to check if category is enabled based on dependencies\n */\nexport const isCategoryEnabled = (\n category: CategoryConfig,\n allCategories: CategoryConfig[]\n): boolean => {\n if (!category.dependsOn || category.dependsOn.length === 0) {\n return true;\n }\n return category.dependsOn.every((depKey) => {\n const depCat = allCategories.find((c) => c.key === depKey);\n return depCat?.selectedIds && depCat.selectedIds.length > 0;\n });\n};\n\n/**\n * Helper function to check if an item matches a filter\n */\nexport const isItemMatchingFilter = (\n item: Item,\n filter: { key: string; internalField: string },\n allCategories: CategoryConfig[]\n): boolean => {\n const parentCat = allCategories.find((c) => c.key === filter.key);\n const parentSelectedIds = parentCat?.selectedIds || [];\n const itemFieldValue = item[filter.internalField];\n return parentSelectedIds.includes(String(itemFieldValue));\n};\n\n/**\n * Helper function to get badge text for category\n */\nexport const getBadgeText = (\n category: CategoryConfig,\n formattedItems: { groupLabel?: string; itens: Item[] }[]\n): string => {\n const visibleIds = formattedItems\n .flatMap((group) => group.itens || [])\n .map((i) => i.id);\n const selectedVisibleCount = visibleIds.filter((id) =>\n category.selectedIds?.includes(id)\n ).length;\n const totalVisible = visibleIds.length;\n return `${selectedVisibleCount} de ${totalVisible} ${\n selectedVisibleCount === 1 ? 'selecionado' : 'selecionados'\n }`;\n};\n\n/**\n * Helper function to handle accordion value change logic\n * Returns the new accordion value or null if should not change\n */\nexport const handleAccordionValueChange = (\n value: string | string[] | undefined,\n categories: CategoryConfig[],\n isCategoryEnabledFn: (category: CategoryConfig) => boolean\n): string | null => {\n if (typeof value !== 'string') {\n if (!value) {\n return '';\n }\n return null; // Don't change for array values\n }\n\n if (!value) {\n return '';\n }\n\n // Prevent opening disabled categories\n const category = categories.find((c) => c.key === value);\n if (!category) {\n return null; // Category not found, don't change\n }\n\n const isEnabled = isCategoryEnabledFn(category);\n if (!isEnabled) {\n return null; // Don't allow opening disabled accordions\n }\n\n return value;\n};\n\n/**\n * Helper function to calculate filtered items for auto-selection\n * This function determines which items are visible/filtered for a category\n */\nexport const calculateFormattedItemsForAutoSelection = (\n category: CategoryConfig,\n allCategories: CategoryConfig[]\n): Item[] => {\n if (!category?.dependsOn || category.dependsOn.length === 0) {\n return category?.itens || [];\n }\n\n // Check if category is enabled based on dependencies\n const isEnabled = isCategoryEnabled(category, allCategories);\n\n // If category is disabled, return empty items array\n if (!isEnabled) {\n return [];\n }\n\n const filters =\n (category.filteredBy as {\n key: string;\n internalField: string;\n label?: string;\n }[]) || [];\n\n if (filters.length === 0) {\n return category?.itens || [];\n }\n\n const selectedIdsArr = filters.map((f) => {\n const parentCat = allCategories.find((c) => c.key === f.key);\n if (!parentCat?.selectedIds?.length) {\n return [];\n }\n return parentCat.selectedIds;\n });\n\n if (selectedIdsArr.some((arr) => arr.length === 0)) {\n return [];\n }\n\n // Filter items based on selected parent IDs\n const filteredItems = (category.itens || []).filter((item) =>\n filters.every((filter) => isItemMatchingFilter(item, filter, allCategories))\n );\n\n return filteredItems;\n};\n","import { X, MagnifyingGlass } from 'phosphor-react';\nimport {\n InputHTMLAttributes,\n forwardRef,\n useState,\n useId,\n useMemo,\n useEffect,\n useRef,\n ChangeEvent,\n MouseEvent,\n KeyboardEvent,\n} from 'react';\nimport DropdownMenu, {\n DropdownMenuContent,\n DropdownMenuItem,\n createDropdownStore,\n} from '../DropdownMenu/DropdownMenu';\n\n/**\n * Search component props interface\n */\ntype SearchProps = {\n /** List of options to show in dropdown */\n options: string[];\n /** Callback when an option is selected from dropdown */\n onSelect?: (value: string) => void;\n /** Callback when search input changes */\n onSearch?: (query: string) => void;\n /** Control dropdown visibility externally */\n showDropdown?: boolean;\n /** Callback when dropdown open state changes */\n onDropdownChange?: (open: boolean) => void;\n /** Maximum height of dropdown in pixels */\n dropdownMaxHeight?: number;\n /** Text to show when no results are found */\n noResultsText?: string;\n /** Debounce delay in ms for onSearch. Default 0 (no debounce). */\n debounceMs?: number;\n /** Additional CSS classes to apply to the input */\n className?: string;\n /** Additional CSS classes to apply to the container */\n containerClassName?: string;\n /** Callback when clear button is clicked */\n onClear?: () => void;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'onSelect'>;\n\n/**\n * Search component for Analytica Ensino platforms\n *\n * A specialized search input component with dropdown suggestions.\n * Features filtering, keyboard navigation, and customizable options.\n *\n * @param options - Array of search options to display in dropdown\n * @param onSelect - Callback when an option is selected\n * @param onSearch - Callback when search query changes\n * @param placeholder - Placeholder text for the input\n * @param noResultsText - Text to show when no results are found\n * @param dropdownMaxHeight - Maximum height of dropdown in pixels\n * @param className - Additional CSS classes for the input\n * @param containerClassName - Additional CSS classes for the container\n * @param props - All other standard input HTML attributes\n * @returns A styled search input with dropdown functionality\n *\n * @example\n * ```tsx\n * // Basic search\n * <Search\n * options={['Filosofia', 'Física', 'Matemática']}\n * placeholder=\"Buscar matéria...\"\n * onSelect={(value) => console.log('Selected:', value)}\n * />\n *\n * // With custom filtering\n * <Search\n * options={materias}\n * onSearch={(query) => setFilteredMaterias(filterMaterias(query))}\n * noResultsText=\"Nenhum resultado encontrado\"\n * />\n * ```\n */\n\n/**\n * Filter options based on search query\n */\nconst filterOptions = (options: string[], query: string): string[] => {\n if (!query || query.length < 1) return [];\n\n return options.filter((option) =>\n option.toLowerCase().includes(query.toLowerCase())\n );\n};\n\n/**\n * Updates input value and creates appropriate change event\n */\nconst updateInputValue = (\n value: string,\n ref:\n | { current: HTMLInputElement | null }\n | ((instance: HTMLInputElement | null) => void)\n | null,\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void\n) => {\n if (!onChange) return;\n\n if (ref && 'current' in ref && ref.current) {\n ref.current.value = value;\n const event = new Event('input', { bubbles: true });\n Object.defineProperty(event, 'target', {\n writable: false,\n value: ref.current,\n });\n onChange(event as unknown as ChangeEvent<HTMLInputElement>);\n } else {\n // Fallback for cases where ref is not available\n const event = {\n target: { value },\n currentTarget: { value },\n } as ChangeEvent<HTMLInputElement>;\n onChange(event);\n }\n};\n\nconst Search = forwardRef<HTMLInputElement, SearchProps>(\n (\n {\n options = [],\n onSelect,\n onSearch,\n showDropdown: controlledShowDropdown,\n onDropdownChange,\n dropdownMaxHeight = 240,\n noResultsText = 'Nenhum resultado encontrado',\n className = '',\n containerClassName = '',\n disabled,\n readOnly,\n id,\n onClear,\n value,\n onChange,\n placeholder = 'Buscar...',\n onKeyDown: userOnKeyDown,\n debounceMs = 0,\n ...props\n },\n ref\n ) => {\n // Dropdown state and logic\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [forceClose, setForceClose] = useState(false);\n const justSelectedRef = useRef(false);\n const dropdownStore = useRef(createDropdownStore()).current;\n const dropdownRef = useRef<HTMLDivElement>(null);\n const inputElRef = useRef<HTMLInputElement>(null);\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n };\n }, []);\n\n // Filter options based on input value\n const filteredOptions = useMemo(() => {\n if (!options.length) {\n return [];\n }\n const filtered = filterOptions(options, (value as string) || '');\n return filtered;\n }, [options, value]);\n\n // Control dropdown visibility\n const showDropdown =\n !forceClose &&\n (controlledShowDropdown ??\n (dropdownOpen && value && String(value).length > 0));\n\n // Helper to keep all consumers in sync\n const setOpenAndNotify = (open: boolean) => {\n setDropdownOpen(open);\n dropdownStore.setState({ open });\n onDropdownChange?.(open);\n };\n\n // Handle dropdown visibility changes\n useEffect(() => {\n // Don't reopen dropdown if we just selected an option\n if (justSelectedRef.current) {\n justSelectedRef.current = false;\n return;\n }\n // Respect forceClose even if value is non-empty\n if (forceClose) {\n setOpenAndNotify(false);\n return;\n }\n\n const shouldShow = Boolean(value && String(value).length > 0);\n setOpenAndNotify(shouldShow);\n }, [value, forceClose, onDropdownChange, dropdownStore]);\n\n // Handle option selection\n const handleSelectOption = (option: string) => {\n justSelectedRef.current = true; // Prevent immediate dropdown reopen\n setForceClose(true); // Force dropdown to close immediately\n onSelect?.(option);\n setOpenAndNotify(false);\n\n // Update input value if onChange is provided\n updateInputValue(option, ref, onChange);\n };\n\n // Handle click outside dropdown\n useEffect(() => {\n const handleClickOutside = (event: globalThis.MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setOpenAndNotify(false);\n }\n };\n\n if (showDropdown) {\n document.addEventListener('click', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('click', handleClickOutside);\n };\n }, [showDropdown, dropdownStore, onDropdownChange]);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `search-${generatedId}`;\n const dropdownId = `${inputId}-dropdown`;\n\n // Handle clear button\n const handleClear = () => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n debounceTimer.current = null;\n }\n if (onClear) {\n onClear();\n } else {\n updateInputValue('', ref, onChange);\n }\n };\n\n // Handle clear button click - mantém foco no input\n const handleClearClick = (e: MouseEvent) => {\n e.preventDefault(); // Evita que o input perca foco\n e.stopPropagation(); // Para propagação do evento\n handleClear();\n };\n\n // Handle search icon click - focus on input\n const handleSearchIconClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n inputElRef.current?.focus();\n }, 0);\n };\n\n // Handle input change\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setForceClose(false); // Allow dropdown to open when user types\n onChange?.(e);\n if (debounceMs > 0) {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n const value = e.target.value;\n debounceTimer.current = setTimeout(() => {\n onSearch?.(value);\n }, debounceMs);\n } else {\n onSearch?.(e.target.value);\n }\n };\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n // Let consumer run first; if they prevent default, skip our logic\n userOnKeyDown?.(e);\n if (e.defaultPrevented) return;\n\n if (e.key === 'Enter') {\n e.preventDefault();\n\n // If dropdown is open and there are filtered options, select the first one\n if (showDropdown && filteredOptions.length > 0) {\n handleSelectOption(filteredOptions[0]);\n } else if (value) {\n // If no dropdown or no options, execute search\n onSearch?.(String(value));\n setForceClose(true);\n setOpenAndNotify(false);\n }\n }\n };\n\n // Helper function for input state classes\n const getInputStateClasses = (disabled?: boolean, readOnly?: boolean) => {\n if (disabled) return 'cursor-not-allowed opacity-40';\n if (readOnly) return 'cursor-default focus:outline-none !text-text-900';\n return 'hover:border-border-400';\n };\n\n // Determine which icon to show\n const hasValue = String(value ?? '').length > 0;\n const showClearButton = hasValue && !disabled && !readOnly;\n const showSearchIcon = !hasValue && !disabled && !readOnly;\n\n return (\n <div\n ref={dropdownRef}\n className={`w-full max-w-lg md:w-[488px] ${containerClassName}`}\n >\n {/* Search Input Container */}\n <div className=\"relative flex items-center\">\n {/* Search Input Field */}\n <input\n ref={(node) => {\n // Forward to parent\n if (ref) {\n if (typeof ref === 'function') ref(node);\n else\n (ref as { current: HTMLInputElement | null }).current = node;\n }\n // Keep our own handle\n inputElRef.current = node;\n }}\n id={inputId}\n type=\"text\"\n className={`w-full py-0 px-4 pr-10 font-normal text-text-900 focus:outline-primary-950 border rounded-full bg-background focus:bg-primary-50 border-border-300 focus:border-2 focus:border-primary-950 h-10 placeholder:text-text-600 ${getInputStateClasses(disabled, readOnly)} ${className}`}\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n aria-expanded={showDropdown ? 'true' : undefined}\n aria-haspopup={options.length > 0 ? 'listbox' : undefined}\n aria-controls={showDropdown ? dropdownId : undefined}\n aria-autocomplete=\"list\"\n role={options.length > 0 ? 'combobox' : undefined}\n {...props}\n />\n\n {/* Right Icon - Clear Button */}\n {showClearButton && (\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2\">\n <button\n type=\"button\"\n className=\"p-0 border-0 bg-transparent cursor-pointer\"\n onMouseDown={handleClearClick}\n aria-label=\"Limpar busca\"\n >\n <span className=\"w-6 h-6 text-text-800 flex items-center justify-center hover:text-text-600 transition-colors\">\n <X />\n </span>\n </button>\n </div>\n )}\n\n {/* Right Icon - Search Icon */}\n {showSearchIcon && (\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2\">\n <button\n type=\"button\"\n className=\"p-0 border-0 bg-transparent cursor-pointer\"\n onMouseDown={handleSearchIconClick}\n aria-label=\"Buscar\"\n >\n <span className=\"w-6 h-6 text-text-800 flex items-center justify-center hover:text-text-600 transition-colors\">\n <MagnifyingGlass />\n </span>\n </button>\n </div>\n )}\n </div>\n\n {/* Search Dropdown */}\n {showDropdown && (\n <DropdownMenu open={showDropdown} onOpenChange={setDropdownOpen}>\n <DropdownMenuContent\n id={dropdownId}\n className=\"w-full mt-1\"\n style={{ maxHeight: dropdownMaxHeight }}\n align=\"start\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => (\n <DropdownMenuItem\n key={option}\n onClick={() => handleSelectOption(option)}\n className=\"text-text-700 text-base leading-6 cursor-pointer\"\n >\n {option}\n </DropdownMenuItem>\n ))\n ) : (\n <div className=\"px-3 py-3 text-text-700 text-base\">\n {noResultsText}\n </div>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n }\n);\n\nSearch.displayName = 'Search';\n\nexport default Search;\n","import { CaretRight, SignOut, User } from 'phosphor-react';\nimport {\n forwardRef,\n ReactNode,\n ButtonHTMLAttributes,\n useEffect,\n useLayoutEffect,\n useRef,\n HTMLAttributes,\n MouseEvent,\n KeyboardEvent,\n isValidElement,\n Children,\n cloneElement,\n ReactElement,\n useState,\n RefObject,\n CSSProperties,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { create, StoreApi, useStore } from 'zustand';\nimport Button from '../Button/Button';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport Modal from '../Modal/Modal';\nimport { ThemeToggle } from '../ThemeToggle/ThemeToggle';\nimport type { ThemeMode } from '@/hooks/useTheme';\nimport { useTheme } from '../../hooks/useTheme';\n\ninterface DropdownStore {\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\ntype DropdownStoreApi = StoreApi<DropdownStore>;\n\nexport function createDropdownStore(): DropdownStoreApi {\n return create<DropdownStore>((set) => ({\n open: false,\n // Bail out when the value didn't change. Skipping `set` here prevents\n // zustand from creating a new state object, which in turn keeps\n // `useStore(store, (s) => s)` subscribers from re-rendering on no-op\n // syncs (e.g. the `useEffect [propOpen]` controlled-mode bridge).\n setOpen: (open) => set((state) => (state.open === open ? state : { open })),\n }));\n}\n\nexport const useDropdownStore = (externalStore?: DropdownStoreApi) => {\n if (!externalStore) {\n throw new Error(\n 'Component must be used within a DropdownMenu (store is missing)'\n );\n }\n\n return externalStore;\n};\n\nconst injectStore = (\n children: ReactNode,\n store: DropdownStoreApi\n): ReactNode => {\n return Children.map(children, (child) => {\n if (isValidElement(child)) {\n const typedChild = child as ReactElement<{\n store?: DropdownStoreApi;\n children?: ReactNode;\n }>;\n\n // Aqui tu checa o displayName do componente\n const displayName = (\n typedChild.type as unknown as { displayName: string }\n ).displayName;\n\n // Lista de componentes que devem receber o store\n const allowed = [\n 'DropdownMenuTrigger',\n 'DropdownContent',\n 'DropdownMenuContent',\n 'DropdownMenuSeparator',\n 'DropdownMenuItem',\n 'MenuLabel',\n 'ProfileMenuTrigger',\n 'ProfileMenuHeader',\n 'ProfileMenuFooter',\n 'ProfileToggleTheme',\n ];\n\n let newProps: Partial<{\n store: DropdownStoreApi;\n children: ReactNode;\n }> = {};\n\n if (allowed.includes(displayName)) {\n newProps.store = store;\n }\n\n if (typedChild.props.children) {\n newProps.children = injectStore(typedChild.props.children, store);\n }\n\n return cloneElement(typedChild, newProps);\n }\n\n return child;\n });\n};\n\ninterface DropdownMenuProps {\n children: ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nconst DropdownMenu = ({\n children,\n open: propOpen,\n onOpenChange,\n}: DropdownMenuProps) => {\n const storeRef = useRef<DropdownStoreApi | null>(null);\n storeRef.current ??= createDropdownStore();\n const store = storeRef.current;\n const { open, setOpen: storeSetOpen } = useStore(store, (s) => s);\n\n const setOpen = (newOpen: boolean) => {\n storeSetOpen(newOpen);\n };\n\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n const handleArrowDownOrArrowUp = (event: globalThis.KeyboardEvent) => {\n const menuContent = menuRef.current?.querySelector('[role=\"menu\"]');\n if (menuContent) {\n event.preventDefault();\n\n const items = Array.from(\n menuContent.querySelectorAll(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n )\n ).filter((el): el is HTMLElement => el instanceof HTMLElement);\n\n if (items.length === 0) return;\n\n const focusedItem = document.activeElement as HTMLElement;\n const currentIndex = items.indexOf(focusedItem);\n\n let nextIndex;\n if (event.key === 'ArrowDown') {\n nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;\n } else {\n // ArrowUp\n nextIndex =\n currentIndex === -1\n ? items.length - 1\n : (currentIndex - 1 + items.length) % items.length;\n }\n\n items[nextIndex]?.focus();\n }\n };\n\n const handleDownkey = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n handleArrowDownOrArrowUp(event);\n }\n };\n\n const handleClickOutside = (event: Event) => {\n const target = event.target as Node;\n\n if (menuRef.current?.contains(target)) {\n return;\n }\n\n if (\n target instanceof Element &&\n target.closest('[data-dropdown-content=\"true\"]')\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n useEffect(() => {\n if (open) {\n document.addEventListener('pointerdown', handleClickOutside);\n document.addEventListener('keydown', handleDownkey);\n }\n\n return () => {\n document.removeEventListener('pointerdown', handleClickOutside);\n document.removeEventListener('keydown', handleDownkey);\n };\n }, [open]);\n\n useEffect(() => {\n onOpenChange?.(open);\n }, [open, onOpenChange]);\n\n useEffect(() => {\n if (propOpen !== undefined) {\n setOpen(propOpen);\n }\n }, [propOpen]);\n\n return (\n <div className=\"relative\" ref={menuRef}>\n {injectStore(children, store)}\n </div>\n );\n};\n\n// Componentes genéricos do DropdownMenu\nconst DropdownMenuTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n }\n>(({ className, children, onClick, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n className={cn(\n 'appearance-none bg-transparent border-none p-0',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n});\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger';\n\nconst ITEM_SIZE_CLASSES = {\n small: 'text-sm',\n medium: 'text-md',\n} as const;\n\nconst SIDE_CLASSES = {\n top: 'bottom-full',\n right: 'top-full',\n bottom: 'top-full',\n left: 'top-full',\n};\n\nconst ALIGN_CLASSES = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n};\n\nconst MENUCONTENT_VARIANT_CLASSES = {\n menu: 'p-1',\n profile: 'p-6',\n};\n\nconst MenuLabel = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n inset?: boolean;\n store?: DropdownStoreApi;\n }\n>(({ className, inset, store: _store, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('text-sm w-full', inset ? 'pl-8' : '', className)}\n {...props}\n />\n );\n});\nMenuLabel.displayName = 'MenuLabel';\n\nconst DropdownMenuContent = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n align?: 'start' | 'center' | 'end';\n side?: 'top' | 'right' | 'bottom' | 'left';\n variant?: 'menu' | 'profile';\n sideOffset?: number;\n store?: DropdownStoreApi;\n portal?: boolean;\n triggerRef?: RefObject<HTMLElement | null>;\n }\n>(\n (\n {\n className,\n align = 'start',\n side = 'bottom',\n variant = 'menu',\n sideOffset = 4,\n children,\n store: externalStore,\n portal = false,\n triggerRef,\n ...props\n },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const [isVisible, setIsVisible] = useState(open);\n const [portalPosition, setPortalPosition] = useState({ top: 0, left: 0 });\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (open) {\n setIsVisible(true);\n } else {\n const timer = setTimeout(() => setIsVisible(false), 200);\n return () => clearTimeout(timer);\n }\n }, [open]);\n\n useLayoutEffect(() => {\n if (portal && open && triggerRef?.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n let top = rect.bottom + sideOffset;\n let left = rect.left;\n\n // Handle horizontal sides (left/right)\n if (side === 'left') {\n left = rect.left - sideOffset;\n top = rect.top;\n } else if (side === 'right') {\n left = rect.right + sideOffset;\n top = rect.top;\n } else {\n // Handle vertical sides (top/bottom)\n if (align === 'end') {\n left = rect.right;\n } else if (align === 'center') {\n left = rect.left + rect.width / 2;\n }\n\n if (side === 'top') {\n top = rect.top - sideOffset;\n }\n }\n\n setPortalPosition((prev) =>\n prev.top === top && prev.left === left ? prev : { top, left }\n );\n }\n }, [portal, open, triggerRef, align, side, sideOffset]);\n\n if (!isVisible) return null;\n\n const getPositionClasses = () => {\n if (portal) {\n return 'fixed';\n }\n const vertical = SIDE_CLASSES[side];\n const horizontal = ALIGN_CLASSES[align];\n\n return `absolute ${vertical} ${horizontal}`;\n };\n\n const getPortalAlignStyle = () => {\n if (!portal) return {};\n\n const baseStyle: CSSProperties = {\n top: portalPosition.top,\n };\n\n if (align === 'end') {\n baseStyle.right = window.innerWidth - portalPosition.left;\n } else if (align === 'center') {\n baseStyle.left = portalPosition.left;\n baseStyle.transform = 'translateX(-50%)';\n } else {\n baseStyle.left = portalPosition.left;\n }\n\n return baseStyle;\n };\n\n const variantClasses = MENUCONTENT_VARIANT_CLASSES[variant];\n\n const content = (\n <div\n ref={portal ? contentRef : ref}\n role=\"menu\"\n data-dropdown-content=\"true\"\n className={`\n bg-background z-50 min-w-[210px] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md border-border-100\n ${open ? 'animate-in fade-in-0 zoom-in-95' : 'animate-out fade-out-0 zoom-out-95'}\n ${getPositionClasses()}\n ${variantClasses}\n ${className}\n `}\n style={{\n ...(portal\n ? getPortalAlignStyle()\n : {\n marginTop: side === 'bottom' ? sideOffset : undefined,\n marginBottom: side === 'top' ? sideOffset : undefined,\n marginLeft: side === 'right' ? sideOffset : undefined,\n marginRight: side === 'left' ? sideOffset : undefined,\n }),\n }}\n {...props}\n >\n {children}\n </div>\n );\n\n if (portal && typeof document !== 'undefined') {\n return createPortal(content, document.body);\n }\n\n return content;\n }\n);\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n\nconst DropdownMenuItem = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n inset?: boolean;\n size?: 'small' | 'medium';\n iconLeft?: ReactNode;\n iconRight?: ReactNode;\n disabled?: boolean;\n variant?: 'profile' | 'menu';\n store?: DropdownStoreApi;\n preventClose?: boolean;\n }\n>(\n (\n {\n className,\n size = 'small',\n children,\n iconRight,\n iconLeft,\n disabled = false,\n onClick,\n variant = 'menu',\n store: externalStore,\n preventClose = false,\n ...props\n },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n const sizeClasses = ITEM_SIZE_CLASSES[size];\n\n const handleClick = (\n e: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>\n ) => {\n if (disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (e.type === 'click') {\n onClick?.(e as MouseEvent<HTMLDivElement>);\n } else if (e.type === 'keydown') {\n // For keyboard events, trigger click if Enter or Space was pressed\n const keyEvent = e as KeyboardEvent<HTMLDivElement>;\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n (e.currentTarget as HTMLElement).click();\n }\n // honor any user-provided key handler\n props.onKeyDown?.(keyEvent);\n }\n if (!preventClose) {\n setOpen(false);\n }\n };\n\n const getVariantClasses = () => {\n if (variant === 'profile') {\n return 'relative flex flex-row justify-between select-none items-center gap-2 rounded-sm p-4 text-sm outline-none transition-colors [&>svg]:size-6 [&>svg]:shrink-0';\n }\n return 'relative flex select-none items-center gap-2 rounded-sm p-3 text-sm outline-none transition-colors [&>svg]:size-4 [&>svg]:shrink-0';\n };\n\n const getVariantProps = () => {\n return variant === 'profile' ? { 'data-variant': 'profile' } : {};\n };\n\n return (\n <div\n ref={ref}\n role=\"menuitem\"\n {...getVariantProps()}\n aria-disabled={disabled}\n className={`\n focus-visible:bg-background-50\n ${getVariantClasses()}\n ${sizeClasses}\n ${className}\n ${\n disabled\n ? 'cursor-not-allowed text-text-400'\n : 'cursor-pointer hover:bg-background-50 text-text-700 focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground'\n }\n `}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n handleClick(e);\n }\n }}\n tabIndex={disabled ? -1 : 0}\n {...props}\n >\n {iconLeft}\n <div className=\"w-full\">{children}</div>\n {iconRight}\n </div>\n );\n }\n);\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n\nconst DropdownMenuSeparator = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }\n>(({ className, store: _store, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('my-1 h-px bg-border-200', className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\n\n// Componentes específicos do ProfileMenu\nconst ProfileMenuTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & { store?: DropdownStoreApi }\n>(({ className, onClick, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n className={cn(\n 'rounded-lg size-10 bg-primary-50 flex items-center justify-center cursor-pointer',\n className\n )}\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n {...props}\n >\n <span className=\"size-6 rounded-full bg-primary-100 flex items-center justify-center\">\n <User className=\"text-primary-950\" size={18} />\n </span>\n </button>\n );\n});\nProfileMenuTrigger.displayName = 'ProfileMenuTrigger';\n\nconst ProfileMenuHeader = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n name: string;\n email: string;\n photoUrl?: string | null;\n store?: DropdownStoreApi;\n }\n>(({ className, name, email, photoUrl, store: _store, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuHeader\"\n className={cn(\n 'flex flex-row gap-4 items-center min-w-[280px]',\n className\n )}\n {...props}\n >\n <span className=\"w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center overflow-hidden flex-shrink-0\">\n {photoUrl ? (\n <img\n src={photoUrl}\n alt=\"Foto de perfil\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <User size={34} className=\"text-primary-800\" />\n )}\n </span>\n <div className=\"flex flex-col min-w-0\">\n <Text\n size=\"xl\"\n weight=\"bold\"\n color=\"text-text-950\"\n className=\"truncate\"\n >\n {name}\n </Text>\n <Text size=\"md\" color=\"text-text-600\" className=\"truncate\">\n {email}\n </Text>\n </div>\n </div>\n );\n});\nProfileMenuHeader.displayName = 'ProfileMenuHeader';\n\nconst ProfileMenuInfo = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n schoolName: string;\n classYearName: string;\n schoolYearName: string;\n store?: DropdownStoreApi;\n }\n>(\n (\n {\n className,\n schoolName,\n classYearName,\n schoolYearName,\n store: _store,\n ...props\n },\n ref\n ) => {\n if (!schoolName && !classYearName && !schoolYearName) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuInfo\"\n className={cn('flex flex-row gap-4 items-center', className)}\n {...props}\n >\n <span className=\"w-16 h-16\" />\n <div className=\"flex flex-col \">\n {schoolName && (\n <Text size=\"md\" color=\"text-text-600\">\n {schoolName}\n </Text>\n )}\n\n {(classYearName || schoolYearName) && (\n <span className=\"flex flex-row items-center gap-2\">\n {classYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n {classYearName}\n </Text>\n )}\n {classYearName && schoolYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n ●\n </Text>\n )}\n {schoolYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n {schoolYearName}\n </Text>\n )}\n </span>\n )}\n </div>\n </div>\n );\n }\n);\nProfileMenuInfo.displayName = 'ProfileMenuInfo';\n\nconst ProfileToggleTheme = ({\n store: externalStore,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }) => {\n const { themeMode, setTheme } = useTheme();\n const [modalThemeToggle, setModalThemeToggle] = useState(false);\n const [selectedTheme, setSelectedTheme] = useState<ThemeMode>(themeMode);\n\n const internalStoreRef = useRef<DropdownStoreApi | null>(null);\n internalStoreRef.current ??= createDropdownStore();\n const store = externalStore ?? internalStoreRef.current;\n const setOpen = useStore(store, (s) => s.setOpen);\n\n const handleClick = (e: MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setModalThemeToggle(true);\n };\n\n const handleSave = () => {\n setTheme(selectedTheme);\n setModalThemeToggle(false);\n setOpen(false); // Close dropdown after saving\n };\n\n const handleCancel = () => {\n setSelectedTheme(themeMode); // Reset to current theme\n setModalThemeToggle(false);\n setOpen(false); // Close dropdown after canceling\n };\n\n return (\n <>\n <DropdownMenuItem\n variant=\"profile\"\n preventClose={true}\n store={store}\n iconLeft={\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 2.75C15.085 2.75276 17.5637 3.78054 19.3916 5.6084C21.2195 7.43628 22.2473 9.915 22.25 12.5C22.25 14.4284 21.6778 16.3136 20.6064 17.917C19.5352 19.5201 18.0128 20.7699 16.2314 21.5078C14.4499 22.2458 12.489 22.4387 10.5977 22.0625C8.70642 21.6863 6.96899 20.758 5.60547 19.3945C4.24197 18.031 3.31374 16.2936 2.9375 14.4023C2.56129 12.511 2.75423 10.5501 3.49219 8.76855C4.23012 6.98718 5.47982 5.46483 7.08301 4.39355C8.68639 3.32221 10.5716 2.75 12.5 2.75ZM11.75 4.28516C9.70145 4.47452 7.7973 5.42115 6.41016 6.94043C5.02299 8.4599 4.25247 10.4426 4.25 12.5C4.25247 14.5574 5.02299 16.5401 6.41016 18.0596C7.7973 19.5789 9.70145 20.5255 11.75 20.7148V4.28516Z\"\n fill=\"currentColor\"\n />\n </svg>\n }\n iconRight={<CaretRight />}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n setModalThemeToggle(true);\n }\n }}\n {...props}\n >\n <Text size=\"md\" color=\"text-text-700\">\n Aparência\n </Text>\n </DropdownMenuItem>\n\n <Modal\n isOpen={modalThemeToggle}\n onClose={handleCancel}\n title=\"Aparência\"\n size=\"md\"\n footer={\n <div className=\"flex gap-3\">\n <Button variant=\"outline\" onClick={handleCancel}>\n Cancelar\n </Button>\n <Button variant=\"solid\" onClick={handleSave}>\n Salvar\n </Button>\n </div>\n }\n >\n <div className=\"flex flex-col\">\n <p className=\"text-sm text-text-500\">Escolha o tema:</p>\n <ThemeToggle variant=\"with-save\" onToggle={setSelectedTheme} />\n </div>\n </Modal>\n </>\n );\n};\nProfileToggleTheme.displayName = 'ProfileToggleTheme';\n\nconst ProfileMenuSection = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }\n>(({ className, children, store: _store, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('flex flex-col p-2', className)} {...props}>\n {children}\n </div>\n );\n});\nProfileMenuSection.displayName = 'ProfileMenuSection';\n\nconst ProfileMenuFooter = ({\n className,\n disabled = false,\n onClick,\n store: externalStore,\n ...props\n}: HTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n}) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n\n return (\n <Button\n variant=\"outline\"\n className={cn('w-full', className)}\n disabled={disabled}\n onClick={(e) => {\n setOpen(false);\n onClick?.(e);\n }}\n {...props}\n >\n <span className=\"mr-2 flex items-center\">\n <SignOut className=\"text-inherit\" />\n </span>\n <Text color=\"inherit\">Sair</Text>\n </Button>\n );\n};\nProfileMenuFooter.displayName = 'ProfileMenuFooter';\n\n// Exportações\nexport default DropdownMenu;\nexport {\n // Componentes genéricos\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n MenuLabel,\n DropdownMenuSeparator,\n\n // Componentes específicos do ProfileMenu\n ProfileMenuTrigger,\n ProfileMenuHeader,\n ProfileMenuSection,\n ProfileMenuFooter,\n ProfileToggleTheme,\n ProfileMenuInfo,\n};\n","import { Moon, Sun } from 'phosphor-react';\nimport { useState, useEffect } from 'react';\nimport SelectionButton from '../SelectionButton/SelectionButton';\nimport type { ThemeMode } from '@/hooks/useTheme';\nimport { useTheme } from '../../hooks/useTheme';\n\ninterface ThemeToggleProps {\n variant?: 'default' | 'with-save';\n onToggle?: (theme: ThemeMode) => void;\n}\n\nexport const ThemeToggle = ({\n variant = 'default',\n onToggle,\n}: ThemeToggleProps) => {\n const { themeMode, setTheme } = useTheme();\n const [tempTheme, setTempTheme] = useState<ThemeMode>(themeMode);\n\n // Update temp theme when themeMode changes externally\n useEffect(() => {\n setTempTheme(themeMode);\n }, [themeMode]);\n\n const problemTypes = [\n {\n id: 'light' as ThemeMode,\n title: 'Claro',\n icon: <Sun size={24} />,\n },\n {\n id: 'dark' as ThemeMode,\n title: 'Escuro',\n icon: <Moon size={24} />,\n },\n {\n id: 'system' as ThemeMode,\n title: 'Sistema',\n icon: (\n <svg\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 2.75C15.085 2.75276 17.5637 3.78054 19.3916 5.6084C21.2195 7.43628 22.2473 9.915 22.25 12.5C22.25 14.4284 21.6778 16.3136 20.6064 17.917C19.5352 19.5201 18.0128 20.7699 16.2314 21.5078C14.4499 22.2458 12.489 22.4387 10.5977 22.0625C8.70642 21.6863 6.96899 20.758 5.60547 19.3945C4.24197 18.031 3.31374 16.2936 2.9375 14.4023C2.56129 12.511 2.75423 10.5501 3.49219 8.76855C4.23012 6.98718 5.47982 5.46483 7.08301 4.39355C8.68639 3.32221 10.5716 2.75 12.5 2.75ZM11.75 4.28516C9.70145 4.47452 7.7973 5.42115 6.41016 6.94043C5.02299 8.4599 4.25247 10.4426 4.25 12.5C4.25247 14.5574 5.02299 16.5401 6.41016 18.0596C7.7973 19.5789 9.70145 20.5255 11.75 20.7148V4.28516Z\"\n fill=\"#525252\"\n />\n </svg>\n ),\n },\n ];\n\n const handleThemeSelect = (selectedTheme: ThemeMode) => {\n if (variant === 'with-save') {\n setTempTheme(selectedTheme);\n } else {\n setTheme(selectedTheme);\n }\n\n if (onToggle) {\n onToggle(selectedTheme);\n }\n };\n\n const currentTheme = variant === 'with-save' ? tempTheme : themeMode;\n\n return (\n <div className=\"flex flex-row gap-2 sm:gap-4 py-2\">\n {problemTypes.map((type) => (\n <SelectionButton\n key={type.id}\n icon={type.icon}\n label={type.title}\n selected={currentTheme === type.id}\n onClick={() => handleThemeSelect(type.id)}\n className=\"w-full p-2 sm:p-4\"\n />\n ))}\n </div>\n );\n};\n","import { ButtonHTMLAttributes, ReactNode, forwardRef } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * SelectionButton component props interface\n */\ntype SelectionButtonProps = {\n /** Ícone a ser exibido no botão (opcional) */\n icon?: ReactNode;\n /** Texto/label a ser exibido ao lado do ícone */\n label: ReactNode;\n /** Estado de seleção do botão */\n selected?: boolean;\n /** Additional CSS classes to apply */\n className?: string;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * SelectionButton component for Analytica Ensino platforms\n *\n * Um botão com ícone e texto para ações e navegação com estado de seleção.\n * Ideal para filtros, tags, categorias, seleção de tipos, etc.\n * Suporta forwardRef para acesso programático ao elemento DOM.\n *\n * @param icon - O ícone a ser exibido no botão\n * @param label - O texto/label a ser exibido\n * @param selected - Estado de seleção do botão\n * @param className - Classes CSS adicionais\n * @param props - Todos os outros atributos HTML padrão de button\n * @returns Um elemento button estilizado\n *\n * @example\n * ```tsx\n * <SelectionButton\n * icon={<TagIcon />}\n * label=\"Categoria\"\n * selected={false}\n * onClick={() => handleSelection()}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Usando ref para foco programático\n * const buttonRef = useRef<HTMLButtonElement>(null);\n *\n * const handleFocus = () => {\n * buttonRef.current?.focus();\n * };\n *\n * <SelectionButton\n * ref={buttonRef}\n * icon={<TagIcon />}\n * label=\"Categoria\"\n * selected={isSelected}\n * onClick={() => setSelected(!isSelected)}\n * />\n * ```\n */\nconst SelectionButton = forwardRef<HTMLButtonElement, SelectionButtonProps>(\n (\n { icon, label, selected = false, className = '', disabled, ...props },\n ref\n ) => {\n // Classes base para todos os estados\n const baseClasses = [\n 'inline-flex',\n 'items-center',\n 'justify-start',\n 'gap-2',\n 'p-4',\n 'rounded-xl',\n 'cursor-pointer',\n 'border',\n 'border-border-50',\n 'bg-background',\n 'text-sm',\n 'text-text-700',\n 'font-bold',\n 'shadow-soft-shadow-1',\n 'hover:bg-background-100',\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-indicator-info',\n 'focus-visible:ring-offset-0',\n 'focus-visible:shadow-none',\n 'active:ring-2',\n 'active:ring-primary-950',\n 'active:ring-offset-0',\n 'active:shadow-none',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n ];\n\n const stateClasses = selected\n ? ['ring-primary-950', 'ring-2', 'ring-offset-0', 'shadow-none']\n : [];\n\n const allClasses = [...baseClasses, ...stateClasses].join(' ');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(allClasses, className)}\n disabled={disabled}\n aria-pressed={selected}\n {...props}\n >\n {icon && (\n <span className=\"flex items-center justify-center w-6 h-6\">\n {icon}\n </span>\n )}\n <span>{label}</span>\n </button>\n );\n }\n);\n\nSelectionButton.displayName = 'SelectionButton';\n\nexport default SelectionButton;\n","import { useEffect, useMemo } from 'react';\nimport { useThemeStore, ThemeMode } from '../store/themeStore';\n\nexport type { ThemeMode };\n\n/**\n * Hook para gerenciar temas e branding institucional\n * Este hook permite alternar entre temas light, dark e automático baseado nas preferências do sistema\n * e fornece acesso aos dados de branding lidos diretamente das meta tags HTML\n * Utiliza Zustand para persistir o estado de tema entre múltiplos arquivos e sessões\n */\nexport const useTheme = () => {\n const {\n themeMode,\n isDark,\n toggleTheme,\n setTheme,\n initializeTheme,\n handleSystemThemeChange,\n } = useThemeStore();\n\n // Read branding data from meta tags\n const branding = useMemo(() => {\n if (typeof document === 'undefined') {\n return {\n theme: null,\n favicon: null,\n icon: null,\n mainLogo: null,\n internalLogo: null,\n loginImage: null,\n };\n }\n\n return {\n theme:\n document.querySelector('meta[name=\"theme\"]')?.getAttribute('content') ??\n null,\n favicon:\n document.querySelector('link[rel=\"icon\"]')?.getAttribute('href') ??\n null,\n icon:\n document\n .querySelector('link[rel=\"apple-touch-icon\"]')\n ?.getAttribute('href') ?? null,\n mainLogo:\n document\n .querySelector('meta[name=\"main-logo\"]')\n ?.getAttribute('content') ?? null,\n internalLogo:\n document\n .querySelector('meta[name=\"internal-logo\"]')\n ?.getAttribute('content') ?? null,\n loginImage:\n document\n .querySelector('meta[name=\"login-image\"]')\n ?.getAttribute('content') ?? null,\n };\n }, []);\n\n useEffect(() => {\n // Initialize theme on first render\n initializeTheme();\n\n // Listener para mudanças nas preferências do sistema (apenas quando mode é 'system')\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n mediaQuery.addEventListener('change', handleSystemThemeChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleSystemThemeChange);\n };\n }, [initializeTheme, handleSystemThemeChange]);\n\n return {\n themeMode,\n isDark,\n toggleTheme,\n setTheme,\n branding,\n };\n};\n","import { create } from 'zustand';\nimport { createJSONStorage, devtools, persist } from 'zustand/middleware';\nimport { themeCookieStorage } from './themeStorage';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\n/**\n * Theme store state interface\n */\nexport interface ThemeState {\n /**\n * Current theme mode\n */\n themeMode: ThemeMode;\n /**\n * Whether the current theme is dark\n */\n isDark: boolean;\n}\n\n/**\n * Theme store actions interface\n */\nexport interface ThemeActions {\n /**\n * Apply theme based on the mode selected\n */\n applyTheme: (mode: ThemeMode) => void;\n /**\n * Toggle between themes\n */\n toggleTheme: () => void;\n /**\n * Set a specific theme mode\n */\n setTheme: (mode: ThemeMode) => void;\n /**\n * Set the white-label theme from institution branding\n */\n setWhiteLabelTheme: (theme: string | null) => void;\n /**\n * Clear the white-label theme and revert to default\n */\n clearWhiteLabelTheme: () => void;\n /**\n * Initialize theme on app start\n */\n initializeTheme: () => void;\n /**\n * Handle system theme change\n */\n handleSystemThemeChange: () => void;\n}\n\nexport type ThemeStore = ThemeState & ThemeActions;\n\n/**\n * Mapa de tema light institucional → tema dark correspondente.\n * Adicionar entradas aqui ao introduzir novas instituições.\n */\nconst DARK_THEME_MAP: Record<string, string> = {\n 'base-light': 'base-dark',\n 'enem-parana-light': 'enem-parana-dark',\n 'enem-paraiba-light': 'enem-paraiba-dark',\n 'analytica-light': 'analytica-dark',\n};\n\n/**\n * Resolve o seletor CSS dark concreto com base no tema institucional (light)\n * salvo em `data-original-theme`. Fallback: 'base-dark', que também responde\n * ao seletor legado [data-theme='dark'] preservando compat com apps antigos.\n */\nconst resolveDarkTheme = (originalTheme: string | undefined): string => {\n if (!originalTheme) return 'base-dark';\n return DARK_THEME_MAP[originalTheme] ?? 'base-dark';\n};\n\n/**\n * Apply theme to DOM based on mode\n */\nconst applyThemeToDOM = (mode: ThemeMode): boolean => {\n const htmlElement = document.documentElement;\n const originalTheme = htmlElement.dataset.originalTheme;\n\n if (mode === 'dark') {\n htmlElement.dataset.theme = resolveDarkTheme(originalTheme);\n return true;\n } else if (mode === 'light') {\n if (originalTheme) {\n htmlElement.dataset.theme = originalTheme;\n }\n return false;\n } else if (mode === 'system') {\n const isSystemDark = window.matchMedia(\n '(prefers-color-scheme: dark)'\n ).matches;\n if (isSystemDark) {\n htmlElement.dataset.theme = resolveDarkTheme(originalTheme);\n return true;\n } else if (originalTheme) {\n htmlElement.dataset.theme = originalTheme;\n return false;\n }\n }\n return false;\n};\n\n/**\n * Save original theme from white label (reads from HTML meta tag or data-theme attribute)\n */\nconst saveOriginalTheme = () => {\n const htmlElement = document.documentElement;\n const currentTheme =\n htmlElement.dataset.theme ||\n document.querySelector('meta[name=\"theme\"]')?.getAttribute('content');\n\n if (currentTheme && !htmlElement.dataset.originalTheme) {\n htmlElement.dataset.originalTheme = currentTheme;\n }\n};\n\n/**\n * Theme store using Zustand with persistence\n */\nexport const useThemeStore = create<ThemeStore>()(\n devtools(\n persist(\n (set, get) => ({\n // Initial state\n themeMode: 'system',\n isDark: false,\n\n // Actions\n applyTheme: (mode: ThemeMode) => {\n const isDark = applyThemeToDOM(mode);\n set({ isDark });\n },\n\n toggleTheme: () => {\n const { themeMode, applyTheme } = get();\n let newMode: ThemeMode;\n\n if (themeMode === 'light') {\n newMode = 'dark';\n } else if (themeMode === 'dark') {\n newMode = 'light';\n } else {\n // Se estiver em 'system', vai para 'dark'\n newMode = 'dark';\n }\n\n set({ themeMode: newMode });\n applyTheme(newMode);\n },\n\n setTheme: (mode: ThemeMode) => {\n const { applyTheme } = get();\n set({ themeMode: mode });\n applyTheme(mode);\n },\n\n setWhiteLabelTheme: (theme: string | null) => {\n const htmlElement = document.documentElement;\n\n if (theme) {\n // Set the white-label theme as the original theme\n htmlElement.dataset.originalTheme = theme;\n\n // Apply theme based on current mode\n const { themeMode, applyTheme } = get();\n if (themeMode === 'light' || themeMode === 'system') {\n htmlElement.dataset.theme = theme;\n }\n\n applyTheme(themeMode);\n }\n },\n\n clearWhiteLabelTheme: () => {\n const htmlElement = document.documentElement;\n\n // Remove white-label theme attributes\n delete htmlElement.dataset.originalTheme;\n delete htmlElement.dataset.theme;\n\n // Restore original theme from page metadata\n saveOriginalTheme();\n\n // Re-apply current theme mode to use defaults\n const { themeMode, applyTheme } = get();\n applyTheme(themeMode);\n },\n\n initializeTheme: () => {\n const { themeMode, applyTheme } = get();\n\n // Save original theme from white label\n saveOriginalTheme();\n\n // Apply the current theme mode\n applyTheme(themeMode);\n },\n\n handleSystemThemeChange: () => {\n const { themeMode, applyTheme } = get();\n // Only respond to system changes when in system mode\n if (themeMode === 'system') {\n applyTheme('system');\n }\n },\n }),\n {\n name: 'theme-store', // Storage key (cookie + localStorage)\n // Root-domain cookie so login and app subdomains share the theme\n storage: createJSONStorage(() => themeCookieStorage),\n partialize: (state) => ({\n themeMode: state.themeMode,\n }), // Só persiste o themeMode, não o isDark\n }\n ),\n {\n name: 'theme-store',\n }\n )\n);\n","/**\n * Options for writing a cookie\n */\nexport interface CookieOptions {\n /**\n * Cookie Domain attribute; omitted when undefined (host-only cookie)\n */\n domain?: string;\n /**\n * Cookie Path attribute (default '/')\n */\n path?: string;\n /**\n * Max-Age in seconds\n */\n maxAge?: number;\n /**\n * SameSite attribute (default 'Lax')\n */\n sameSite?: 'Lax' | 'Strict' | 'None';\n /**\n * Adds the Secure attribute when true\n */\n secure?: boolean;\n}\n\n/**\n * Reads a cookie value by name\n *\n * @param name - The cookie name\n * @returns The decoded cookie value, or null when absent or malformed\n */\nexport const getCookie = (name: string): string | null => {\n if (typeof document === 'undefined') {\n return null;\n }\n const prefix = `${encodeURIComponent(name)}=`;\n const match = document.cookie\n .split('; ')\n .find((entry) => entry.startsWith(prefix));\n if (!match) {\n return null;\n }\n try {\n return decodeURIComponent(match.slice(prefix.length));\n } catch {\n return null; // malformed percent-encoding\n }\n};\n\n/**\n * Writes a cookie with the given options\n *\n * @param name - The cookie name\n * @param value - The cookie value (URL-encoded before writing)\n * @param options - Cookie attributes (domain, path, maxAge, sameSite, secure)\n */\nexport const setCookie = (\n name: string,\n value: string,\n options: CookieOptions = {}\n): void => {\n if (typeof document === 'undefined') {\n return;\n }\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\n parts.push(`Path=${options.path ?? '/'}`);\n if (options.maxAge !== undefined) {\n parts.push(`Max-Age=${options.maxAge}`);\n }\n if (options.domain) {\n parts.push(`Domain=${options.domain}`);\n }\n parts.push(`SameSite=${options.sameSite ?? 'Lax'}`);\n if (options.secure) {\n parts.push('Secure');\n }\n document.cookie = parts.join('; ');\n};\n\n/**\n * Removes a cookie by expiring it immediately\n *\n * @param name - The cookie name\n * @param options - Domain and path must match the cookie being removed\n */\nexport const removeCookie = (\n name: string,\n options: Pick<CookieOptions, 'domain' | 'path'> = {}\n): void => {\n setCookie(name, '', { ...options, maxAge: 0 });\n};\n","/**\n * Resolves the root hostname shared by all application subdomains.\n * Mirrors the subdomain rules used by `getRootDomain` (Auth), without\n * protocol or port. Useful for the cookie `Domain` attribute so that a\n * cookie set on a subdomain is visible on the root domain and vice versa.\n *\n * @param hostname - The hostname to resolve (e.g. window.location.hostname)\n * @returns The root hostname, or null for localhost / IP literals\n * (callers should omit the cookie Domain attribute in that case)\n *\n * @example\n * ```typescript\n * resolveRootHostname('aluno.analiticaensino.com.br'); // 'analiticaensino.com.br'\n * resolveRootHostname('aluno.hml.analiticaensino.com.br'); // 'hml.analiticaensino.com.br'\n * resolveRootHostname('sub.example.com'); // 'example.com'\n * resolveRootHostname('localhost'); // null\n * resolveRootHostname('127.0.0.1'); // null\n * ```\n */\nexport const resolveRootHostname = (hostname: string): string | null => {\n if (hostname === 'localhost') {\n return null;\n }\n\n // IP literals: no subdomain logic applies\n const isIPv4 = /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(hostname);\n const isIPv6 = hostname.includes(':'); // simple check is sufficient here\n if (isIPv4 || isIPv6) {\n return null;\n }\n\n const parts = hostname.split('.');\n // Label-based detection: matches 'hml' and 'hml-*' labels (e.g. hml-aluno)\n // without false positives on substrings like 'html'\n const isHml = parts.some(\n (label) => label === 'hml' || label.startsWith('hml-')\n );\n\n // Handle Brazilian .com.br domains and similar patterns\n if (parts.length >= 3 && parts.at(-2) === 'com' && parts.at(-1) === 'br') {\n if (parts.length === 3) {\n // Already at root level for .com.br (e.g., analiticaensino.com.br)\n return hostname;\n }\n // For domains like aluno.analiticaensino.com.br, return analiticaensino.com.br\n const base = parts.slice(-3).join('.');\n // If in hml environment, resolve to hml.base (e.g., hml.analiticaensino.com.br)\n return isHml && !base.startsWith('hml.') ? `hml.${base}` : base;\n }\n\n // Only treat as subdomain if there are 3+ parts (e.g., subdomain.example.com)\n if (parts.length > 2) {\n const base = parts.slice(-2).join('.');\n return isHml && !base.startsWith('hml.') ? `hml.${base}` : base;\n }\n\n // For 2-part domains (example.com) or single domains, return as-is\n return hostname;\n};\n","import type { StateStorage } from 'zustand/middleware';\nimport { getCookie, setCookie, removeCookie } from '../utils/cookieUtils';\nimport { resolveRootHostname } from '../utils/domainUtils';\n\nconst ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\n\n/**\n * Resolves the cookie Domain attribute for the current location.\n * Returns undefined on localhost / IP literals so the cookie stays host-only.\n *\n * @returns The root domain for the cookie, or undefined\n */\nconst cookieDomain = (): string | undefined =>\n resolveRootHostname(globalThis.location.hostname) ?? undefined;\n\n/**\n * Reads a value from localStorage without throwing\n * (storage can be disabled in privacy mode or sandboxed iframes)\n *\n * @param name - The storage key\n * @returns The stored value, or null when absent or unavailable\n */\nconst readLocalStorage = (name: string): string | null => {\n try {\n return globalThis.localStorage.getItem(name);\n } catch {\n return null;\n }\n};\n\n/**\n * Returns the value only when it contains valid JSON, null otherwise\n * (guards against corrupted persisted values)\n *\n * @param raw - The raw persisted value, or null when absent\n * @returns The same value when it is valid JSON, or null\n */\nconst validJsonOrNull = (raw: string | null): string | null => {\n if (raw === null) {\n return null;\n }\n try {\n JSON.parse(raw);\n return raw;\n } catch {\n return null;\n }\n};\n\n/**\n * Zustand StateStorage that persists theme state in a cookie scoped to the\n * root domain, so the login app (root domain) and the profile apps\n * (subdomains) all share the chosen theme. Reads fall back to localStorage\n * for users that persisted the theme before the cookie storage existed, and\n * writes go to both stores for backward compatibility with older library\n * versions that read only localStorage.\n */\nexport const themeCookieStorage: StateStorage = {\n getItem: (name: string): string | null => {\n if (typeof document === 'undefined') {\n return null;\n }\n // A corrupted cookie must not block the localStorage fallback\n return (\n validJsonOrNull(getCookie(name)) ??\n validJsonOrNull(readLocalStorage(name))\n );\n },\n setItem: (name: string, value: string): void => {\n if (typeof document === 'undefined') {\n return;\n }\n setCookie(name, value, {\n domain: cookieDomain(),\n path: '/',\n maxAge: ONE_YEAR_IN_SECONDS,\n sameSite: 'Lax',\n secure: globalThis.location.protocol === 'https:',\n });\n try {\n globalThis.localStorage.setItem(name, value);\n } catch {\n // localStorage unavailable; the cookie is the source of truth\n }\n },\n removeItem: (name: string): void => {\n if (typeof document === 'undefined') {\n return;\n }\n removeCookie(name, { domain: cookieDomain(), path: '/' });\n try {\n globalThis.localStorage.removeItem(name);\n } catch {\n // ignore: nothing to clean up when storage is unavailable\n }\n },\n};\n","import Modal from '../Modal/Modal';\nimport { CheckboxGroup } from '../CheckBoxGroup/CheckBoxGroup';\nimport Button from '../Button/Button';\nimport type { FilterConfig } from './useTableFilter';\nimport { FILTER_GROUP } from '../../enums/FilterEnums';\n\nexport type FilterModalProps = {\n /**\n * Controls modal visibility\n */\n isOpen: boolean;\n\n /**\n * Callback when modal should close\n */\n onClose: () => void;\n\n /**\n * Filter configurations with categories\n */\n filterConfigs: FilterConfig[];\n\n /**\n * Callback when filters change (temporary, before applying)\n */\n onFiltersChange: (configs: FilterConfig[]) => void;\n\n /**\n * Callback when \"Aplicar\" button is clicked\n */\n onApply: () => void;\n\n /**\n * Callback when \"Limpar filtros\" button is clicked\n */\n onClear: () => void;\n\n /**\n * Modal title\n * @default \"Filtros\"\n */\n title?: string;\n\n /**\n * Modal size\n * @default \"md\"\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n /**\n * Apply button label\n * @default \"Aplicar\"\n */\n applyLabel?: string;\n\n /**\n * Clear button label\n * @default \"Limpar filtros\"\n */\n clearLabel?: string;\n};\n\n/**\n * FilterModal component - A modal for table filtering with CheckboxGroup\n *\n * Integrates Modal, CheckboxGroup, and Button components to create a\n * complete filtering interface. Works with useTableFilter hook for URL synchronization.\n *\n * @example\n * ```tsx\n * const { filterConfigs, updateFilters, applyFilters, clearFilters } = useTableFilter(\n * initialConfigs,\n * { syncWithUrl: true }\n * );\n *\n * <FilterModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * filterConfigs={filterConfigs}\n * onFiltersChange={updateFilters}\n * onApply={() => {\n * applyFilters();\n * setIsOpen(false);\n * }}\n * onClear={clearFilters}\n * />\n * ```\n */\nexport const FilterModal = ({\n isOpen,\n onClose,\n filterConfigs,\n onFiltersChange,\n onApply,\n onClear,\n title = 'Filtros',\n size = 'md',\n applyLabel = 'Aplicar',\n clearLabel = 'Limpar filtros',\n}: FilterModalProps) => {\n const handleCategoryChange = (\n configIndex: number,\n updatedCategories: (typeof filterConfigs)[0]['categories']\n ) => {\n const newConfigs = [...filterConfigs];\n newConfigs[configIndex] = {\n ...newConfigs[configIndex],\n categories: updatedCategories,\n };\n onFiltersChange(newConfigs);\n };\n\n const handleApply = () => {\n onApply();\n onClose();\n };\n\n const handleClear = () => {\n onClear();\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n size={size}\n footer={\n <div className=\"flex gap-3 justify-end w-full\">\n <Button variant=\"outline\" onClick={handleClear}>\n {clearLabel}\n </Button>\n <Button onClick={handleApply}>{applyLabel}</Button>\n </div>\n }\n >\n <div className=\"flex flex-col gap-6\">\n {filterConfigs.map((config, index) => (\n <div key={config.key} className=\"flex flex-col gap-4\">\n {/* Section Header */}\n <div className=\"flex items-center gap-2 text-text-400 text-sm font-medium uppercase\">\n {config.key === FILTER_GROUP.ACADEMIC && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-text-400\"\n >\n <path\n d=\"M8 2L2 5.33333L8 8.66667L14 5.33333L8 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 10.6667L8 14L14 10.6667\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 8L8 11.3333L14 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n {config.key === FILTER_GROUP.CONTENT && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-text-400\"\n >\n <path\n d=\"M3.33333 2H12.6667C13.403 2 14 2.59695 14 3.33333V12.6667C14 13.403 13.403 14 12.6667 14H3.33333C2.59695 14 2 13.403 2 12.6667V3.33333C2 2.59695 2.59695 2 3.33333 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 6H14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 2V14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n <span>{config.label}</span>\n </div>\n\n {/* CheckboxGroup */}\n <CheckboxGroup\n categories={config.categories}\n onCategoriesChange={(updatedCategories) =>\n handleCategoryChange(index, updatedCategories)\n }\n />\n </div>\n ))}\n </div>\n </Modal>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n AccordionGroup,\n Badge,\n CardAccordation,\n CheckBox,\n cn,\n Text,\n Divider,\n} from '../../';\nimport {\n areSelectedIdsEqual,\n isCategoryEnabled as isCategoryEnabledHelper,\n getBadgeText as getBadgeTextHelper,\n handleAccordionValueChange as handleAccordionValueChangeHelper,\n calculateFormattedItemsForAutoSelection,\n} from './CheckBoxGroup.helpers';\n\nexport type Item = {\n id: string;\n name: string;\n [key: string]: unknown;\n};\n\nexport type CategoryConfig = {\n key: string;\n label: string;\n selectedIds?: string[];\n dependsOn?: string[];\n itens?: Item[];\n filteredBy?: { key: string; internalField: string }[];\n};\n\nexport const CheckboxGroup = ({\n categories,\n onCategoriesChange,\n compactSingleItem = true,\n showDivider = true,\n showSingleItem = false,\n disableAutoSelection = false,\n}: {\n categories: CategoryConfig[];\n onCategoriesChange: (categories: CategoryConfig[]) => void;\n compactSingleItem?: boolean;\n showDivider?: boolean;\n showSingleItem?: boolean;\n disableAutoSelection?: boolean;\n}) => {\n const [openAccordion, setOpenAccordion] = useState<string>('');\n\n // Refs to prevent infinite loops and track auto-selection state\n const onCategoriesChangeRef = useRef(onCategoriesChange);\n const previousCategoriesRef = useRef<CategoryConfig[]>(categories);\n // Track which categories have had auto-selection applied (by stringified selectedIds)\n const appliedAutoSelectionRef = useRef<string>('');\n\n // Update ref when onCategoriesChange changes\n useEffect(() => {\n onCategoriesChangeRef.current = onCategoriesChange;\n }, [onCategoriesChange]);\n\n // Use helper function for comparing selectedIds arrays\n\n // Auto-seleciona categorias com apenas um item (considerando itens filtrados)\n const categoriesWithAutoSelection = useMemo(() => {\n // Se auto-seleção está desabilitada, retorna as categorias sem modificação\n if (disableAutoSelection) {\n return categories;\n }\n\n return categories.map((category) => {\n // Get filtered/visible items for this category\n const filteredItems = calculateFormattedItemsForAutoSelection(\n category,\n categories\n );\n\n // Se tem apenas um item filtrado/visível e nenhum está selecionado, auto-seleciona\n if (\n filteredItems.length === 1 &&\n (!category.selectedIds || category.selectedIds.length === 0)\n ) {\n return {\n ...category,\n selectedIds: [filteredItems[0].id],\n };\n }\n return category;\n });\n }, [categories, disableAutoSelection]);\n\n // Aplica a auto-seleção se necessário\n // Note: onCategoriesChange should be memoized by the parent component to prevent re-renders\n useEffect(() => {\n // Check if categories have actually changed by comparing with previous reference\n const categoriesChanged = categories !== previousCategoriesRef.current;\n previousCategoriesRef.current = categories;\n\n // Check for auto-selection changes using efficient comparison\n const hasAutoSelectionChanges = categoriesWithAutoSelection.some(\n (cat, index) => {\n const originalCat = categories[index];\n return !areSelectedIdsEqual(cat.selectedIds, originalCat.selectedIds);\n }\n );\n\n if (!hasAutoSelectionChanges) {\n // No auto-selection needed, reset tracking if categories changed\n if (categoriesChanged) {\n appliedAutoSelectionRef.current = '';\n }\n return;\n }\n\n // Create a signature of the auto-selection to prevent duplicate notifications\n const autoSelectionSignature = JSON.stringify(\n categoriesWithAutoSelection.map((c) => c.selectedIds)\n );\n\n // Only notify if this exact auto-selection hasn't been applied yet\n if (appliedAutoSelectionRef.current !== autoSelectionSignature) {\n appliedAutoSelectionRef.current = autoSelectionSignature;\n onCategoriesChangeRef.current(categoriesWithAutoSelection);\n }\n }, [categoriesWithAutoSelection, categories]);\n\n const isCheckBoxIsSelected = (categoryKey: string, itemId: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return false;\n return category.selectedIds?.includes(itemId) || false;\n };\n\n const isMinimalOneCheckBoxIsSelected = (categoryKey: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return false;\n\n // Obtém apenas os itens filtrados (visíveis)\n const formattedItems = getFormattedItems(categoryKey);\n const filteredItems = formattedItems.flatMap((group) => group.itens || []);\n const filteredItemIds = filteredItems.map((item) => item.id);\n\n // Verifica se pelo menos um item filtrado está selecionado\n return filteredItemIds.some((itemId) =>\n category.selectedIds?.includes(itemId)\n );\n };\n\n const areAllFilteredItemsSelected = (categoryKey: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return false;\n\n // Obtém apenas os itens filtrados (visíveis)\n const formattedItems = getFormattedItems(categoryKey);\n const filteredItems = formattedItems.flatMap((group) => group.itens || []);\n\n // Se não há itens filtrados, retorna false\n if (filteredItems.length === 0) return false;\n\n const filteredItemIds = filteredItems.map((item) => item.id);\n\n // Verifica se TODOS os itens filtrados estão selecionados\n return filteredItemIds.every((itemId) =>\n category.selectedIds?.includes(itemId)\n );\n };\n\n // Helper function to create combination of two arrays\n const createCombinations = (\n acc: string[][],\n currentArray: string[]\n ): string[][] => {\n const combinations: string[][] = [];\n for (const existingCombo of acc) {\n for (const item of currentArray) {\n combinations.push([...existingCombo, item]);\n }\n }\n return combinations;\n };\n\n // Helper function to calculate cartesian product of arrays\n const cartesian = (arr: string[][]): string[][] => {\n return arr.reduce(createCombinations, [[]] as string[][]);\n };\n\n // Helper function to get selected IDs for filters\n const getSelectedIdsForFilters = (\n filters: { key: string; internalField: string; label?: string }[]\n ) => {\n return filters.map((f) => {\n const parentCat = categories.find((c) => c.key === f.key);\n if (!parentCat?.selectedIds?.length) {\n return [];\n }\n return parentCat.selectedIds;\n });\n };\n\n // Helper function to generate group label for single filter\n const generateSingleFilterLabel = (\n filter: { key: string; internalField: string },\n comboId: string\n ) => {\n const cat = categories.find((c) => c.key === filter.key);\n return cat?.itens?.find((i) => i.id === comboId)?.name || comboId;\n };\n\n // Helper function to generate group label for multiple filters\n const generateMultipleFiltersLabel = (\n filters: { key: string; internalField: string }[],\n comboIds: string[]\n ) => {\n const firstCat = categories.find((c) => c.key === filters[0].key);\n const firstVal =\n firstCat?.itens?.find((i) => i.id === comboIds[0])?.name || comboIds[0];\n\n const labelParts: string[] = [firstVal];\n\n for (let idx = 1; idx < filters.length; idx++) {\n const f = filters[idx];\n const cat = categories.find((c) => c.key === f.key);\n const val =\n cat?.itens?.find((i) => i.id === comboIds[idx])?.name || comboIds[idx];\n labelParts.push(`(${val})`);\n }\n return labelParts.join(' ');\n };\n\n // Helper function to process combination and add to grouped map\n const processCombination = (\n comboIds: string[],\n filters: { key: string; internalField: string; label?: string }[],\n category: CategoryConfig,\n groupedMap: Record<string, { groupLabel?: string; itens: Item[] }>\n ) => {\n const filteredItems = (category?.itens || []).filter((item) =>\n filters.every((f, idx) => item[f.internalField] === comboIds[idx])\n );\n\n if (filteredItems.length === 0) return;\n\n let groupLabel: string | undefined = undefined;\n\n if (filters.length === 1) {\n groupLabel = generateSingleFilterLabel(filters[0], comboIds[0]);\n } else if (filters.length > 1) {\n groupLabel = generateMultipleFiltersLabel(filters, comboIds);\n }\n\n const key = groupLabel || '';\n if (!groupedMap[key]) {\n groupedMap[key] = groupLabel ? { groupLabel, itens: [] } : { itens: [] };\n }\n groupedMap[key].itens.push(...filteredItems);\n };\n\n // Helper function to calculate formatted items for a category\n const calculateFormattedItems = (categoryKey: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n\n if (!category?.dependsOn || category.dependsOn.length === 0) {\n return [{ itens: category?.itens || [] }];\n }\n\n // Check if category is enabled based on dependencies (inline to avoid stale closure)\n const isEnabled = category.dependsOn.every((depKey) => {\n const depCat = categories.find((c) => c.key === depKey);\n return depCat?.selectedIds && depCat.selectedIds.length > 0;\n });\n\n // If category is disabled, return empty items array to hide all items\n if (!isEnabled) {\n return [{ itens: [] }];\n }\n\n const filters =\n (category.filteredBy as {\n key: string;\n internalField: string;\n label?: string;\n }[]) || [];\n\n if (filters.length === 0) {\n return [{ itens: category?.itens || [] }];\n }\n\n const selectedIdsArr = getSelectedIdsForFilters(filters);\n\n if (selectedIdsArr.some((arr) => arr.length === 0)) {\n return [{ itens: [] }];\n }\n\n const combinations = cartesian(selectedIdsArr);\n const groupedMap: Record<string, { groupLabel?: string; itens: Item[] }> =\n {};\n\n for (const comboIds of combinations) {\n processCombination(comboIds, filters, category, groupedMap);\n }\n\n const groupedItems = Object.values(groupedMap).filter(\n (g) => g.itens.length\n );\n\n return groupedItems.length ? groupedItems : [{ itens: [] }];\n };\n\n const formattedItemsMap = useMemo(() => {\n const formattedItemsMap: Record<\n string,\n { groupLabel?: string; itens: Item[] }[]\n > = {};\n\n for (const category of categories) {\n const formattedItems = calculateFormattedItems(category.key);\n formattedItemsMap[category.key] = formattedItems;\n }\n\n return formattedItemsMap;\n }, [categories]);\n\n const getFormattedItems = (categoryKey: string) => {\n return formattedItemsMap[categoryKey] || [{ itens: [] }];\n };\n\n // Helper function to get badge text for category\n const getBadgeText = (category: CategoryConfig): string => {\n const formattedItems = getFormattedItems(category.key);\n return getBadgeTextHelper(category, formattedItems);\n };\n\n // Helper function to check if category is enabled\n const isCategoryEnabled = (category: CategoryConfig): boolean => {\n return isCategoryEnabledHelper(category, categories);\n };\n\n // Helper function to handle accordion value change\n const handleAccordionValueChange = (value: string | string[] | undefined) => {\n const newValue = handleAccordionValueChangeHelper(\n value,\n categories,\n isCategoryEnabled\n );\n if (newValue !== null) {\n setOpenAccordion(newValue);\n }\n };\n\n const getDependentCategories = (categoryKey: string): string[] => {\n return categories\n .filter((cat) => cat.dependsOn?.includes(categoryKey))\n .map((cat) => cat.key);\n };\n\n // Helper function to find items to remove from dependent category\n const findItemsToRemove = (\n depCategory: CategoryConfig,\n relevantFilter: { key: string; internalField: string },\n deselectedItemId: string\n ): string[] => {\n return (\n depCategory.itens\n ?.filter(\n (item) => item[relevantFilter.internalField] === deselectedItemId\n )\n .map((item) => item.id) || []\n );\n };\n\n // Helper function to process dependent category for deselection\n const processDependentCategory = (\n depCategoryKey: string,\n categoryKey: string,\n deselectedItemId: string,\n itemsToDeselect: Record<string, string[]>\n ) => {\n const depCategory = categories.find((c) => c.key === depCategoryKey);\n if (!depCategory?.filteredBy) return;\n\n const relevantFilter = depCategory.filteredBy.find(\n (f) => f.key === categoryKey\n );\n if (!relevantFilter) return;\n\n const itemsToRemove = findItemsToRemove(\n depCategory,\n relevantFilter,\n deselectedItemId\n );\n if (itemsToRemove.length > 0) {\n itemsToDeselect[depCategoryKey] = itemsToRemove;\n }\n };\n\n const getItemsToDeselect = (\n categoryKey: string,\n deselectedItemId: string\n ) => {\n const deselectedItem = categories\n .find((c) => c.key === categoryKey)\n ?.itens?.find((item) => item.id === deselectedItemId);\n if (!deselectedItem) return {};\n\n const itemsToDeselect: Record<string, string[]> = {};\n const dependentCategories = getDependentCategories(categoryKey);\n\n for (const depCategoryKey of dependentCategories) {\n processDependentCategory(\n depCategoryKey,\n categoryKey,\n deselectedItemId,\n itemsToDeselect\n );\n }\n\n return itemsToDeselect;\n };\n\n // Helper function to update category with new selected IDs\n const updateCategorySelectedIds = (\n updatedCategories: CategoryConfig[],\n depCategoryIndex: number,\n depCategory: CategoryConfig,\n itemIds: string[]\n ): CategoryConfig[] => {\n const newSelectedIds =\n depCategory.selectedIds?.filter((id) => !itemIds.includes(id)) || [];\n\n updatedCategories[depCategoryIndex] = {\n ...depCategory,\n selectedIds: newSelectedIds,\n };\n\n return updatedCategories;\n };\n\n // Helper function to apply recursive cascade deselection\n const applyRecursiveCascade = (\n depCategoryKey: string,\n itemIds: string[],\n updatedCategories: CategoryConfig[]\n ): CategoryConfig[] => {\n let result = updatedCategories;\n for (const itemId of itemIds) {\n result = applyCascadeDeselection(depCategoryKey, itemId, result);\n }\n return result;\n };\n\n const applyCascadeDeselection = (\n categoryKey: string,\n deselectedItemId: string,\n currentCategories: CategoryConfig[]\n ): CategoryConfig[] => {\n const itemsToDeselect = getItemsToDeselect(categoryKey, deselectedItemId);\n let updatedCategories = [...currentCategories];\n\n for (const [depCategoryKey, itemIds] of Object.entries(itemsToDeselect)) {\n const depCategoryIndex = updatedCategories.findIndex(\n (c) => c.key === depCategoryKey\n );\n\n if (depCategoryIndex !== -1) {\n const depCategory = updatedCategories[depCategoryIndex];\n updatedCategories = updateCategorySelectedIds(\n updatedCategories,\n depCategoryIndex,\n depCategory,\n itemIds\n );\n updatedCategories = applyRecursiveCascade(\n depCategoryKey,\n itemIds,\n updatedCategories\n );\n }\n }\n\n return updatedCategories;\n };\n\n const toggleAllInCategory = (categoryKey: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return;\n\n // Obtém apenas os itens filtrados (visíveis)\n const formattedItems = getFormattedItems(categoryKey);\n const filteredItems = formattedItems.flatMap((group) => group.itens || []);\n const filteredItemIds = filteredItems.map((item) => item.id);\n\n // Verifica quantos itens filtrados estão selecionados\n const selectedFilteredCount = filteredItemIds.filter((itemId) =>\n category.selectedIds?.includes(itemId)\n ).length;\n\n // Se NENHUM item filtrado está selecionado OU pelo menos um está selecionado mas não todos,\n // então seleciona todos os itens filtrados\n // Se TODOS os itens filtrados estão selecionados, então deseleciona todos os filtrados\n const allFilteredSelected =\n selectedFilteredCount === filteredItemIds.length;\n\n const newSelection = allFilteredSelected\n ? category.selectedIds?.filter((id) => !filteredItemIds.includes(id)) ||\n []\n : [\n ...(category.selectedIds || []),\n ...filteredItemIds.filter(\n (id) => !category.selectedIds?.includes(id)\n ),\n ];\n\n let updatedCategories = categories.map((c) =>\n c.key === categoryKey ? { ...c, selectedIds: newSelection } : c\n );\n\n // Se está deselecionando, aplica cascata para os itens que foram deselecionados\n if (allFilteredSelected) {\n for (const itemId of filteredItemIds) {\n updatedCategories = applyCascadeDeselection(\n categoryKey,\n itemId,\n updatedCategories\n );\n }\n }\n\n onCategoriesChange(updatedCategories);\n };\n\n const toggleItem = (categoryKey: string, itemId: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return;\n const isCurrentlySelected = category.selectedIds?.includes(itemId);\n const newSelection = isCurrentlySelected\n ? category.selectedIds?.filter((id) => id !== itemId)\n : [...(category.selectedIds || []), itemId];\n\n let updatedCategories = categories.map((c) =>\n c.key === categoryKey ? { ...c, selectedIds: newSelection } : c\n );\n\n // Se está deselecionando, aplica cascata\n if (isCurrentlySelected) {\n updatedCategories = applyCascadeDeselection(\n categoryKey,\n itemId,\n updatedCategories\n );\n }\n\n onCategoriesChange(updatedCategories);\n };\n\n // Helper component to render individual checkbox item\n const renderCheckboxItem = (item: Item, categoryKey: string) => {\n // Generate unique ID by combining category key and item id to avoid conflicts\n const uniqueId = `${categoryKey}-${item.id}`;\n\n return (\n <div key={item.id} className=\"flex items-center gap-3 px-2\">\n <CheckBox\n id={uniqueId}\n checked={isCheckBoxIsSelected(categoryKey, item.id)}\n onChange={() => toggleItem(categoryKey, item.id)}\n />\n <label\n htmlFor={uniqueId}\n className=\"text-sm text-text-950 cursor-pointer select-none\"\n >\n {item.name}\n </label>\n </div>\n );\n };\n\n // Helper component to render formatted group\n const renderFormattedGroup = (\n formattedGroup: { groupLabel?: string; itens: Item[] },\n idx: number,\n categoryKey: string\n ) => (\n <div\n key={formattedGroup.groupLabel || `group-${idx}`}\n className=\"flex flex-col gap-3\"\n >\n {'groupLabel' in formattedGroup && formattedGroup.groupLabel && (\n <Text size=\"sm\" className=\"mt-2\" weight=\"semibold\">\n {formattedGroup.groupLabel}\n </Text>\n )}\n {formattedGroup.itens?.map((item: Item) =>\n renderCheckboxItem(item, categoryKey)\n )}\n </div>\n );\n\n // Helper component to render accordion trigger\n const renderAccordionTrigger = (\n category: CategoryConfig,\n isEnabled: boolean\n ) => {\n const allSelected = areAllFilteredItemsSelected(category.key);\n const someSelected = isMinimalOneCheckBoxIsSelected(category.key);\n\n return (\n <div className=\"flex items-center justify-between w-full p-2\">\n <div className=\"flex items-center gap-3\">\n <CheckBox\n checked={allSelected}\n disabled={!isEnabled}\n indeterminate={someSelected && !allSelected}\n onChange={() => toggleAllInCategory(category.key)}\n />\n <Text\n size=\"sm\"\n weight=\"medium\"\n className={cn('text-text-800', !isEnabled && 'opacity-40')}\n >\n {category.label}\n </Text>\n </div>\n {(openAccordion === category.key || isEnabled) && (\n <Badge variant=\"solid\" action=\"info\">\n {getBadgeText(category)}\n </Badge>\n )}\n </div>\n );\n };\n\n // Helper component to render compact single item view\n const renderCompactSingleItem = (category: CategoryConfig) => {\n const formattedItems = getFormattedItems(category.key);\n const allItems = formattedItems.flatMap((group) => group.itens || []);\n\n if (allItems.length !== 1) {\n return null;\n }\n\n const singleItem = allItems[0];\n\n return (\n <div\n key={category.key}\n className=\"flex items-center justify-between w-full px-3 py-2\"\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-800\">\n {category.label}\n </Text>\n <Text size=\"sm\" className=\"text-text-950\">\n {singleItem.name}\n </Text>\n </div>\n );\n };\n\n // Helper component to render category accordion\n const renderCategoryAccordion = (category: CategoryConfig) => {\n // Check if category is enabled based on dependencies\n const isEnabled = isCategoryEnabled(category);\n const hasOnlyOneItem = category.itens?.length === 1;\n\n if (hasOnlyOneItem && !compactSingleItem && !showSingleItem) {\n return null;\n }\n\n const formattedItems = getFormattedItems(category.key);\n const allItems = formattedItems.flatMap((group) => group.itens || []);\n const hasOnlyOneAvailableItem = allItems.length === 1;\n\n // If compactSingleItem is enabled and there's only one available item, render compact version\n if (compactSingleItem && hasOnlyOneAvailableItem && isEnabled) {\n return (\n <div key={category.key}>\n {renderCompactSingleItem(category)}\n {showDivider && <Divider />}\n </div>\n );\n }\n\n const hasNoItems = formattedItems.every(\n (group) => !group.itens || group.itens.length === 0\n );\n\n return (\n <div key={category.key}>\n <CardAccordation\n value={category.key}\n disabled={!isEnabled}\n className={cn(\n 'bg-transparent border-0',\n openAccordion === category.key && 'bg-background-50 border-none'\n )}\n trigger={renderAccordionTrigger(category, isEnabled)}\n >\n <div className=\"flex flex-col gap-3 pt-2\">\n {hasNoItems && isEnabled ? (\n <div className=\"px-2 py-4\">\n <Text size=\"sm\" className=\"text-text-500 text-center\">\n Sem dados\n </Text>\n </div>\n ) : (\n formattedItems.map((formattedGroup, idx) =>\n renderFormattedGroup(formattedGroup, idx, category.key)\n )\n )}\n </div>\n </CardAccordation>\n {openAccordion !== category.key && showDivider && <Divider />}\n </div>\n );\n };\n\n // Auto-collapse accordion when category becomes disabled\n useEffect(() => {\n if (!openAccordion) return;\n\n const category = categories.find((c) => c.key === openAccordion);\n if (!category) return;\n\n // Check if the open category is now disabled\n const isEnabled = isCategoryEnabled(category);\n\n // If category is disabled, close it\n if (!isEnabled) {\n // Use setTimeout to ensure this runs after any other state updates\n setTimeout(() => {\n setOpenAccordion('');\n }, 0);\n }\n }, [categories, openAccordion]);\n\n return (\n <AccordionGroup\n type=\"single\"\n collapsible\n value={openAccordion}\n onValueChange={handleAccordionValueChange}\n >\n {categories.map(renderCategoryAccordion)}\n </AccordionGroup>\n );\n};\n","// Complete bundle index - includes all components\n// Individual imports still recommended for better tree-shaking\n\n// CSS import\nimport './styles.css';\n\n// Layout Components\nexport { PageContainer } from './components/PageContainer/PageContainer';\nexport type { PageContainerProps } from './components/PageContainer/PageContainer';\n\n// Basic Components\nexport { default as Text } from './components/Text/Text';\nexport { default as Button } from './components/Button/Button';\nexport { default as Badge } from './components/Badge/Badge';\nexport { default as Alert } from './components/Alert/Alert';\nexport { default as LatexRenderer } from './components/LatexRenderer/LatexRenderer';\nexport type { LatexRendererProps } from './components/LatexRenderer/LatexRenderer';\nexport {\n HtmlMathRenderer,\n processHtmlWithMath,\n sanitizeHtmlForDisplay,\n cleanLatex,\n containsMath,\n stripHtml,\n looksLikeLatex,\n isLikelyMarkdown,\n} from './components/HtmlMathRenderer';\nexport type {\n HtmlMathRendererProps,\n MathPart,\n} from './components/HtmlMathRenderer';\nexport {\n MarkdownMathRenderer,\n protectCurrencyInlineMath,\n reflowDisplayMath,\n} from './components/MarkdownMathRenderer';\nexport type { MarkdownMathRendererProps } from './components/MarkdownMathRenderer';\nexport { default as IconButton } from './components/IconButton/IconButton';\nexport { Tooltip } from './components/Tooltip/Tooltip';\nexport type { TooltipProps } from './components/Tooltip/Tooltip';\nexport { TruncatedText } from './components/TruncatedText/TruncatedText';\nexport type {\n TruncatedTextProps,\n TruncatedTextSize,\n TruncatedTextWeight,\n TruncatedTextTooltipPosition,\n} from './components/TruncatedText/TruncatedText';\nexport { default as IconRoundedButton } from './components/IconRoundedButton/IconRoundedButton';\nexport { default as NavButton } from './components/NavButton/NavButton';\nexport { default as SelectionButton } from './components/SelectionButton/SelectionButton';\nexport { default as CheckBox } from './components/CheckBox/CheckBox';\nexport { default as ToggleSwitch } from './components/ToggleSwitch/ToggleSwitch';\nexport type { ToggleSwitchProps } from './components/ToggleSwitch/ToggleSwitch';\nexport { default as ImageUpload } from './components/ImageUpload/ImageUpload';\nexport type { ImageUploadProps } from './components/ImageUpload/ImageUpload';\nexport { default as FileDropzone } from './components/FileDropzone/FileDropzone';\nexport type {\n FileDropzoneProps,\n FileType,\n} from './components/FileDropzone/FileDropzone';\nexport {\n default as CheckboxList,\n CheckboxListItem,\n} from './components/CheckBox/CheckboxList';\n\n// CheckboxGroup Component\nexport {\n CheckboxGroup,\n type CategoryConfig,\n type Item,\n} from './components/CheckBoxGroup/CheckBoxGroup';\nexport { AlertsManager } from './components/AlertManager/AlertsManager';\nexport { useAlertFormStore } from './components/AlertManager/useAlertForm';\nexport { AlertsManagerView } from './components/AlertManagerView/AlertsManagerView';\nexport type {\n AlertViewData,\n RecipientStatus,\n} from './components/AlertManagerView/AlertsManagerView';\nexport type {\n AlertsConfig,\n AlertData,\n RecipientItem,\n} from './components/AlertManager/types';\nexport { AppHeader } from './components/AppHeader/AppHeader';\nexport type {\n AppHeaderProps,\n AppHeaderUser,\n AppHeaderSessionInfo,\n AppHeaderNotifications,\n} from './components/AppHeader/AppHeader';\nexport { AppLayout } from './components/AppLayout/AppLayout';\nexport type {\n AppLayoutProps,\n AppLayoutMenuItem,\n} from './components/AppLayout/AppLayout';\nexport {\n default as Radio,\n RadioGroup,\n RadioGroupItem,\n} from './components/Radio/Radio';\nexport { default as TextArea } from './components/TextArea/TextArea';\nexport { default as Toast } from './components/Toast/Toast';\nexport { default as Toaster } from './components/Toast/utils/Toaster';\nexport { default as Divider } from './components/Divider/Divider';\nexport { default as useToastStore } from './components/Toast/utils/ToastStore';\nexport { default as Input } from './components/Input/Input';\nexport { default as ColorPicker } from './components/ColorPicker/ColorPicker';\nexport type { ColorPickerProps } from './components/ColorPicker/ColorPicker';\nexport { default as Search } from './components/Search/Search';\nexport { default as Chips } from './components/Chips/Chips';\nexport { default as ProgressBar } from './components/ProgressBar/ProgressBar';\nexport { default as ProgressCircle } from './components/ProgressCircle/ProgressCircle';\nexport { default as Stepper } from './components/Stepper/Stepper';\nexport { default as Calendar } from './components/Calendar/Calendar';\nexport { DateTimeInput } from './components/DateTimeInput';\nexport type { DateTimeInputProps } from './components/DateTimeInput';\nexport { default as Modal } from './components/Modal/Modal';\nexport { default as CorrectActivityModal } from './components/CorrectActivityModal/CorrectActivityModal';\nexport type { CorrectActivityModalProps } from './components/CorrectActivityModal/CorrectActivityModal';\nexport {\n QUESTION_STATUS as CORRECTION_QUESTION_STATUS,\n getQuestionStatusBadgeConfig,\n convertApiResponseToCorrectionData,\n} from './utils/studentActivityCorrection';\nexport type {\n QuestionStatus as CorrectionQuestionStatus,\n StudentQuestion,\n StudentActivityCorrectionData,\n QuestionsAnswersByStudentResponse,\n} from './utils/studentActivityCorrection';\n\n// FileAttachment Component\nexport { default as FileAttachment } from './components/FileAttachment/FileAttachment';\nexport {\n generateFileId,\n formatFileSize,\n} from './components/FileAttachment/FileAttachment';\nexport type {\n FileAttachmentProps,\n AttachedFile,\n} from './components/FileAttachment/FileAttachment';\n\nexport { AlertDialog } from './components/AlertDialog/AlertDialog';\nexport { default as LoadingModal } from './components/LoadingModal/loadingModal';\nexport { default as ProgressModal } from './components/ProgressModal/ProgressModal';\nexport type { ProgressModalProps } from './components/ProgressModal/ProgressModal';\nexport { default as ScoreCircle } from './components/ScoreCircle/ScoreCircle';\nexport type {\n ScoreCircleProps,\n ScoreCircleVariant,\n} from './components/ScoreCircle/ScoreCircle';\nexport { default as ImagePreviewCard } from './components/ImagePreviewCard/ImagePreviewCard';\nexport type { ImagePreviewCardProps } from './components/ImagePreviewCard/ImagePreviewCard';\nexport { default as NotificationCard } from './components/NotificationCard/NotificationCard';\nexport { default as CalendarCard } from './components/CalendarCard/CalendarCard';\nexport type { CalendarCardProps } from './components/CalendarCard/CalendarCard';\nexport { ThemeToggle } from './components/ThemeToggle/ThemeToggle';\n\n// Choropleth Map Component\nexport { default as ChoroplethMap } from './components/ChoroplethMap/ChoroplethMap';\nexport type {\n ChoroplethMapProps,\n RegionData,\n MapBounds,\n LegendItem,\n ColorClass,\n} from './components/ChoroplethMap/ChoroplethMap.types';\n\n// Map Data Hook\nexport { createUseMapData } from './hooks/useMapData';\nexport type { UseMapDataReturn } from './hooks/useMapData';\nexport { REPORT_PERIOD, REPORT_MODAL_VARIANT } from './types/common';\nexport type {\n MapFilters as MapDataFilters,\n MapDataRegion,\n MapDataApiResponse,\n MapDataBounds,\n} from './types/mapData';\n\n// Export notification card types\nexport type {\n NotificationItem,\n NotificationGroup,\n} from './components/NotificationCard/NotificationCard';\n\n// Subject Components\nexport {\n SubjectInfo,\n getSubjectInfo,\n getSubjectIcon,\n getSubjectColorClass,\n getSubjectName,\n} from './components/SubjectInfo/SubjectInfo';\nexport type {\n SubjectData,\n IconProps as SubjectIconProps,\n} from './components/SubjectInfo/SubjectInfo';\n\n// Notification Store\nexport {\n createNotificationStore,\n formatTimeAgo,\n} from './store/notificationStore';\nexport { createUseNotificationStore } from './hooks/useNotificationStore';\nexport {\n createUseNotifications,\n createNotificationsHook,\n} from './hooks/useNotifications';\nexport { NotificationEntityType } from './types/notifications';\nexport { questionTypeLabels } from './types/questionTypes';\nexport type {\n Notification,\n NotificationType,\n BackendNotification,\n BackendNotificationsResponse,\n NotificationsResponse,\n FetchNotificationsParams,\n NotificationApiClient,\n} from './types/notifications';\nexport type {\n NotificationState,\n NotificationActions,\n NotificationStore,\n} from './store/notificationStore';\n\n// Activity Filters Data Hook (consolidated hook for all filter data)\nexport {\n createUseActivityFiltersData,\n createActivityFiltersDataHook,\n} from './hooks/useActivityFiltersData';\nexport type {\n UseActivityFiltersDataReturn,\n UseActivityFiltersDataOptions,\n} from './hooks/useActivityFiltersData';\n\n// Questions List Hook\nexport {\n createUseQuestionsList,\n createQuestionsListHook,\n} from './hooks/useQuestionsList';\nexport { CreateActivity } from './components/ActivityCreate/ActivityCreate';\nexport {\n ActivityType,\n ActivityStatus,\n} from './components/ActivityCreate/ActivityCreate';\nexport type {\n ActivityData,\n BackendFiltersFormat,\n ActivityDraftResponse,\n ActivityPreFiltersInput,\n ActivityCreatePayload,\n ActivityCreateResponse,\n School,\n SchoolYear,\n Class,\n Student,\n} from './components/ActivityCreate/ActivityCreate';\n\n// RecommendedLessonCreate Component\nexport { RecommendedLessonCreate } from './components/RecommendedLessonCreate';\nexport type {\n LessonBackendFiltersFormat,\n RecommendedLessonDraftResponse,\n RecommendedLessonData,\n RecommendedLessonPreFiltersInput,\n RecommendedLessonCreatePayload,\n RecommendedLessonCreateResponse,\n} from './components/RecommendedLessonCreate';\nexport type { UseQuestionsListReturn } from './hooks/useQuestionsList';\nexport type {\n Question as QuestionActivity,\n Pagination,\n QuestionsFilterBody,\n QuestionOptionActivity,\n KnowledgeMatrixItemActivity,\n QuestionBankYearActivity,\n PaginationActivity,\n QuestionsListResponseActivity,\n} from './types/questions';\nexport { DIFFICULTY_LEVEL_ENUM, QUESTION_STATUS_ENUM } from './types/questions';\n\n// API Types\nexport type { BaseApiClient } from './types/api';\n\n// Theme Store\nexport { useThemeStore } from './store/themeStore';\nexport type { ThemeStore, ThemeState, ThemeActions } from './store/themeStore';\n\n// Storage Keys\nexport { KEYS, FEATURE_FLAGS_KEYS } from './utils/keys';\n\n// DropdownMenu Components\nexport {\n default as DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n ProfileMenuTrigger,\n ProfileMenuFooter,\n ProfileMenuHeader,\n ProfileMenuInfo,\n ProfileMenuSection,\n MenuLabel,\n DropdownMenuSeparator,\n ProfileToggleTheme,\n} from './components/DropdownMenu/DropdownMenu';\n\nexport {\n default as Table,\n TableHeader,\n TableBody,\n TableRow,\n TableHead,\n TableCell,\n TableFooter,\n TableCaption,\n TablePagination,\n useTableSort,\n} from './components/Table/Table';\nexport type {\n UseTableSortOptions,\n SortDirection,\n} from './components/Table/Table';\n\n// Filter Components\nexport { FilterModal, useTableFilter } from './components/Filter';\nexport type {\n FilterModalProps,\n FilterConfig,\n UseTableFilterOptions,\n UseTableFilterReturn,\n} from './components/Filter';\n\n// SimulatedFilters Components\nexport {\n SimulatedFiltersModal,\n StudentsFilterSection,\n useUserAccessData as useSimulatedUserAccessData,\n useStudentsFilter as useSimulatedStudentsFilter,\n} from './components/SimulatedFilters';\nexport type {\n SimulatedFilters,\n SimulatedFiltersModalProps,\n SchoolItem as SimulatedSchoolItem,\n SchoolYearItem as SimulatedSchoolYearItem,\n ClassItem as SimulatedClassItem,\n StudentFilterItem,\n StudentGroup,\n UserAccessDataApiResponse as SimulatedUserAccessDataApiResponse,\n StudentsFilterApiResponse as SimulatedStudentsFilterApiResponse,\n StudentsFilterParams,\n UseUserAccessDataState,\n UseUserAccessDataReturn,\n UseStudentsFilterState,\n UseStudentsFilterReturn,\n StudentsFilterSectionProps,\n} from './components/SimulatedFilters';\n\n// GeneralOverviewSection Component\nexport {\n GeneralOverviewSection,\n useGeneralOverview,\n} from './components/GeneralOverviewSection';\nexport type {\n AreaKnowledgePerformance,\n EssayPerformance,\n GeneralOverviewData,\n SubjectItem as GeneralOverviewSubjectItem,\n GeneralOverviewParams,\n GeneralOverviewApiResponse,\n UseGeneralOverviewState,\n UseGeneralOverviewReturn,\n GeneralOverviewSectionProps,\n GeneralOverviewLabels,\n} from './components/GeneralOverviewSection';\n\n// AreaKnowledgeSelector Component\nexport {\n AreaKnowledgeSelector,\n ESSAY_AREA_ID,\n} from './components/AreaKnowledgeSelector';\nexport type { AreaKnowledgeSelectorProps } from './components/AreaKnowledgeSelector';\n\n// SimulatedSubjectMenu Component\nexport {\n SimulatedSubjectMenu,\n useSimulatedSubjects,\n} from './components/SimulatedSubjectMenu';\nexport type {\n SimulatedSubjectItem,\n SimulatedSubjectsApiResponse,\n UseSimulatedSubjectsState,\n UseSimulatedSubjectsReturn,\n SimulatedSubjectMenuProps,\n} from './components/SimulatedSubjectMenu';\n\n// SimulatedStudentRanking Component\nexport {\n SimulatedStudentRanking,\n SimulatedRankingCard,\n} from './components/SimulatedStudentRanking';\nexport type {\n RankingVariant,\n SimulatedStudentRankingItem,\n SimulatedStudentRankingProps,\n SimulatedRankingCardProps,\n} from './components/SimulatedStudentRanking';\n\n// PerformanceDistributionChart Component\nexport { PerformanceDistributionChart } from './components/PerformanceDistributionChart';\nexport type {\n SimulatedPerformanceCounters,\n SliceData,\n PerformanceDistributionChartProps,\n} from './components/PerformanceDistributionChart';\n\n// SimulatedStudentDetailsModal Component\nexport {\n SimulatedStudentDetailsModal,\n useSimulatedStudentDetails,\n isStudentSubjectsData,\n isStudentContentsData,\n simulationTypeToActivityFilters,\n SIMULATED_PERFORMANCE_TAG_CONFIG,\n PERFORMANCE_TAG_TO_BADGE_ACTION,\n PerformanceBadgeAction,\n ReportSimulationType,\n} from './components/SimulatedStudentDetailsModal';\nexport type {\n SimulatedPerformanceTag,\n SimulatedPerformanceTagConfig,\n SimulationType,\n StudentDetailsInfo,\n SubjectPerformanceItem,\n StudentContentPerformanceItem,\n StudentSubjectsData,\n StudentContentsData,\n StudentDetailsData,\n ActivityFilters as SimulatedActivityFilters,\n StudentDetailsParams,\n StudentDetailsApiResponse,\n UseSimulatedStudentDetailsState,\n UseSimulatedStudentDetailsReturn,\n SimulatedStudentDetailsModalProps,\n} from './components/SimulatedStudentDetailsModal';\n\n// SimulatedContentsPerformance Hook\nexport { useSimulatedContents } from './components/SimulatedContentsPerformance';\nexport type {\n SimulatedContentItem,\n ContentsPerformanceData,\n SimulatedContentsParams,\n ContentsPerformanceApiResponse,\n UseSimulatedContentsState,\n UseSimulatedContentsReturn,\n} from './components/SimulatedContentsPerformance';\n\n// SimulatedContentDetailsModal Component\nexport {\n SimulatedContentDetailsModal,\n useSimulatedContentDetails,\n} from './components/SimulatedContentDetailsModal';\nexport type {\n ContentDetailsInfo,\n ContentPerformanceCounters,\n ContentStudentItem,\n ContentStudentsPaginated,\n ContentDetailsData,\n ContentDetailsParams,\n ContentDetailsApiResponse,\n UseSimulatedContentDetailsState,\n UseSimulatedContentDetailsReturn,\n SimulatedContentDetailsModalProps,\n} from './components/SimulatedContentDetailsModal';\n\n// EssayCompetencies Components\nexport {\n EssayCompetenciesTable,\n EssayCompetenceDetailsModal,\n useEssayCompetenciesOverview,\n useEssayCompetenceDetails,\n} from './components/EssayCompetencies';\nexport type {\n EssayCompetencyOverviewItem,\n EssayCompetenciesOverviewData,\n EssayCompetenciesOverviewParams,\n EssayCompetenciesOverviewApiResponse,\n EssayCompetenceInfo,\n EssayCompetenceCounters,\n EssayCompetenceStudentItem,\n EssayCompetenceStudentsPaginated,\n EssayCompetenceDetailsData,\n EssayCompetenceDetailsParams,\n EssayCompetenceDetailsApiResponse,\n UseEssayCompetenciesOverviewState,\n UseEssayCompetenciesOverviewReturn,\n UseEssayCompetenceDetailsState,\n UseEssayCompetenceDetailsReturn,\n EssayCompetenciesTableProps,\n EssayCompetenceDetailsModalProps,\n} from './components/EssayCompetencies';\n\n// SimulatedStudentsOverview Hook\nexport { useSimulatedOverview } from './components/SimulatedStudentsOverview';\nexport type {\n SimulatedStudentItem,\n SimulatedStudentsPaginated,\n SimulatedOverviewData,\n SimulatedOverviewParams,\n SimulatedOverviewApiResponse,\n UseSimulatedOverviewState,\n UseSimulatedOverviewReturn,\n} from './components/SimulatedStudentsOverview';\n\n// EssayStudentDetailsModal Component\nexport {\n EssayStudentDetailsModal,\n useEssayStudentDetails,\n} from './components/EssayStudentDetailsModal';\nexport type {\n EssayCompetencyPerformance,\n EssayStudentInfo,\n EssayStudentDetailsData,\n EssayStudentDetailsParams,\n EssayStudentDetailsApiResponse,\n UseEssayStudentDetailsState,\n UseEssayStudentDetailsReturn,\n EssayStudentDetailsLabels,\n EssayStudentDetailsModalProps,\n} from './components/EssayStudentDetailsModal';\n\n// ActivityFilters Component\nexport {\n ActivityFilters,\n ActivityFiltersPopover,\n} from './components/ActivityFilters/ActivityFilters';\nexport type {\n ActivityFiltersProps,\n ActivityFiltersPopoverProps,\n} from './components/ActivityFilters/ActivityFilters';\nexport type {\n ActivityFiltersData,\n Bank,\n BankYear,\n KnowledgeArea,\n KnowledgeItem,\n KnowledgeStructureState,\n} from './types/activityFilters';\n\nexport type { TablePaginationProps } from './components/Table/Table';\n\n// TableProvider Component\nexport { TableProvider } from './components/TableProvider';\nexport type {\n ColumnConfig,\n TableParams,\n PaginationConfig,\n TableProviderProps,\n EmptyStateConfig,\n} from './components/TableProvider';\n\n// Select Components\nexport {\n default as Select,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectItem,\n} from './components/Select/Select';\n\n// SearchSelect Component (Select with search functionality)\nexport { default as SearchSelect } from './components/SearchSelect/SearchSelect';\nexport type {\n SearchSelectProps,\n SearchSelectOption,\n SearchSelectPagination,\n} from './components/SearchSelect/SearchSelect';\n\n// TypeSelector Component (Activity/Exam type switcher)\nexport {\n TypeSelector,\n default as TypeSelectorDefault,\n} from './components/TypeSelector';\nexport type { TypeSelectorProps } from './components/TypeSelector';\nexport {\n type ActivityCategory,\n type ActiveTab,\n type TypeLabels,\n type TypeRoutes,\n type TypeConfig,\n ATIVIDADE_LABELS,\n PROVA_LABELS,\n DEFAULT_STATUS_OPTIONS,\n getTabPath,\n getTabFromPath,\n createActivityCategoryConfig,\n} from './components/TypeSelector';\n\n// Menu Components\nexport {\n default as Menu,\n MenuItem,\n MenuOverflow,\n MenuContent,\n} from './components/Menu/Menu';\n\n// PeriodSelector Component\nexport {\n PeriodSelector,\n Period,\n PERIOD_OPTIONS,\n} from './components/PeriodSelector';\nexport type {\n PeriodTab,\n PeriodValue,\n PeriodSelectorProps,\n} from './components/PeriodSelector';\n\n// Card Components\nexport {\n CardActivitiesResults,\n CardPerformance,\n CardProgress,\n CardQuestions,\n CardResults,\n CardSimulado,\n CardStatus,\n CardTopic,\n CardTest,\n CardSimulationHistory,\n CardAudio,\n CardEssayHistory,\n EssayStatus,\n EssayReviewStatus,\n} from './components/Card/Card';\nexport type {\n EssayHistoryItem,\n EssayHistoryData,\n} from './components/Card/Card';\nexport { StatisticsCard } from './components/StatisticsCard/StatisticsCard';\nexport {\n StudentRanking,\n RankingCard,\n} from './components/StudentRanking/StudentRanking';\nexport type {\n StudentRankingProps,\n StudentRankingItem,\n StudentRankingVariant,\n RankingCardProps,\n} from './components/StudentRanking/StudentRanking';\nexport { QuestionsData } from './components/QuestionsData/QuestionsData';\nexport type {\n QuestionsDataProps,\n QuestionsDataItem,\n} from './components/QuestionsData/QuestionsData';\n\n// Skeleton Components\nexport {\n Skeleton,\n SkeletonText,\n SkeletonCircle,\n SkeletonRectangle,\n SkeletonRounded,\n SkeletonCard,\n SkeletonList,\n SkeletonTable,\n} from './components/Skeleton/Skeleton';\n\n// Media Components\nexport { default as NotFound } from './components/NotFound/NotFound';\nexport { default as RestrictedAccess } from './components/RestrictedAccess/RestrictedAccess';\nexport type { RestrictedAccessProps } from './components/RestrictedAccess/RestrictedAccess';\nexport { default as TokenValidation } from './components/TokenValidation/TokenValidation';\nexport type { TokenValidationProps } from './components/TokenValidation/TokenValidation';\nexport { default as NoSearchResult } from './components/NoSearchResult/NoSearchResult';\nexport type { NoSearchResultProps } from './components/NoSearchResult/NoSearchResult';\nexport { default as EmptyState } from './components/EmptyState/EmptyState';\nexport type { EmptyStateProps } from './components/EmptyState/EmptyState';\nexport { default as VideoPlayer } from './components/VideoPlayer/VideoPlayer';\nexport { default as Whiteboard } from './components/Whiteboard/Whiteboard';\nexport { default as DownloadButton } from './components/DownloadButton/DownloadButton';\n\n// RichEditor - WYSIWYG editor with LaTeX support (requires @tiptap/* dependencies)\nexport { RichEditor } from './components/RichEditor/RichEditor';\nexport { FormulaDialog } from './components/RichEditor/components/FormulaDialog';\nexport { MathNode } from './components/RichEditor/components/MathNode';\nexport {\n processLatexInHtml,\n unprocessLatexInHtml,\n} from './components/RichEditor/components/utils';\nexport type {\n DownloadContent,\n DownloadButtonProps,\n} from './components/DownloadButton/DownloadButton';\n\n// Auth Components\nexport type { AuthContextType } from './components/Auth/Auth';\nexport {\n AuthProvider,\n ProtectedRoute,\n PublicRoute,\n withAuth,\n useAuth,\n useAuthGuard,\n useRouteAuth,\n getRootDomain,\n} from './components/Auth/Auth';\nexport { useTokenInUrl } from './components/Auth/useTokenInUrl';\nexport {\n CardAccordation,\n AccordionGroup,\n} from './components/Accordation/index';\nexport {\n AlternativesList,\n HeaderAlternative,\n} from './components/Alternative/Alternative';\nexport { createZustandAuthAdapter } from './components/Auth/zustandAuthAdapter';\nexport { useUrlAuthentication } from './components/Auth/useUrlAuthentication';\nexport { useApiConfig } from './components/Auth/useApiConfig';\n\n// Quiz Components\nexport { QuizVariant } from './components/Quiz/Quiz.types';\nexport {\n QuizTitle,\n Quiz,\n QuizHeader,\n QuizContent,\n QuizQuestionList,\n QuizFooter,\n} from './components/Quiz/Quiz';\nexport {\n getStatusBadge,\n QuizImageQuestion,\n QuizAlternative,\n QuizMultipleChoice,\n QuizDissertative,\n QuizTrueOrFalse,\n QuizConnectDots,\n} from './components/Quiz/QuizContent';\nexport {\n QuizHeaderResult,\n QuizListResult,\n QuizResultHeaderTitle,\n QuizResultTitle,\n QuizResultPerformance,\n QuizListResultByMateria,\n} from './components/Quiz/QuizResult';\nexport { TeacherFeedbackSection } from './components/Quiz/TeacherFeedbackSection';\nexport type { TeacherFeedbackSectionProps } from './components/Quiz/TeacherFeedbackSection';\nexport { useQuizStore } from './components/Quiz/useQuizStore';\nexport { formatExamInfo } from './components/Quiz/Quiz.utils';\n\n// Quiz Types and Enums\nexport {\n QUESTION_DIFFICULTY,\n QUESTION_TYPE,\n QUESTION_STATUS,\n ANSWER_STATUS,\n SUBTYPE_ENUM,\n QUIZ_TYPE,\n} from './components/Quiz/useQuizStore';\nexport { TrueFalseEnum } from './enums/Quiz';\nexport { SubjectEnum } from './enums/SubjectEnum';\nexport type {\n QuestionResult,\n Question,\n UserAnswerItem,\n QuizState,\n QuizInterface,\n DraftAnswerItem,\n SaveDraftPayload,\n DraftApiClient,\n} from './components/Quiz/useQuizStore';\n\n// Multiple Choice and Icon Components\nexport { MultipleChoiceList } from './components/MultipleChoice/MultipleChoice';\nexport { FillInBlanks } from './components/FillInBlanks/FillInBlanks';\nexport type {\n FillInBlanksProps,\n FillInBlanksOption,\n} from './components/FillInBlanks/FillInBlanks';\nexport { ConnectDots } from './components/ConnectDots/ConnectDots';\nexport type {\n ConnectDotsProps,\n ConnectDotsOption,\n} from './components/ConnectDots/ConnectDots';\nexport { default as IconRender } from './components/IconRender/IconRender';\n\n// Hooks\nexport { useMobile, getDeviceType } from './hooks/useMobile';\nexport type { DeviceType } from './hooks/useMobile';\nexport { useTheme } from './hooks/useTheme';\nexport type { ThemeMode } from './hooks/useTheme';\nexport { useBrandingLogo } from './hooks/useBrandingLogo';\nexport type {\n BrandingLogoVariant,\n UseBrandingLogoOptions,\n} from './hooks/useBrandingLogo';\nexport { BrandingLogo } from './components/BrandingLogo/BrandingLogo';\nexport type { BrandingLogoProps } from './components/BrandingLogo/BrandingLogo';\nexport { UserIcon } from './components/UserIcon/UserIcon';\nexport type { UserIconProps } from './components/UserIcon/UserIcon';\nexport { useDraftAutoSave } from './hooks/useDraftAutoSave';\nexport type {\n ApiClient as DraftApiClientAdapter,\n UseDraftAutoSaveOptions,\n} from './hooks/useDraftAutoSave';\nexport { useCep } from './hooks/useCep';\nexport type { CepData } from './hooks/useCep';\n\n// BreadcrumbMenu Components\nexport { BreadcrumbMenu } from './components/BreadcrumbMenu/BreadcrumbMenu';\nexport type { BreadcrumbMenuProps } from './components/BreadcrumbMenu/BreadcrumbMenu';\nexport { useBreadcrumbBuilder } from './components/BreadcrumbMenu/useBreadcrumbBuilder';\nexport type {\n BreadcrumbBuilderConfig,\n BreadcrumbLevel,\n BreadcrumbLevelWithData,\n BreadcrumbLevelStatic,\n} from './components/BreadcrumbMenu/useBreadcrumbBuilder';\nexport { useUrlParams } from './components/BreadcrumbMenu/useUrlParams';\nexport type { UrlParamsConfig } from './components/BreadcrumbMenu/useUrlParams';\nexport { useBreadcrumb } from './components/BreadcrumbMenu/breadcrumbStore';\nexport type { BreadcrumbItem } from './components/BreadcrumbMenu/breadcrumbStore';\n// Auth Hooks\nexport { useAppInitialization } from './hooks/useAppInitialization';\nexport { useAppContent } from './hooks/useAppContent';\nexport { useInstitutionId, useInstitution } from './hooks/useInstitution';\nexport type { InstitutionData } from './hooks/useInstitution';\nexport { useAuthStore } from './store/authStore';\nexport { useAppStore } from './store/appStore';\nexport { useQuestionFiltersStore } from './store/questionFiltersStore';\nexport type { QuestionFiltersState } from './store/questionFiltersStore';\nexport { useLessonFiltersStore } from './store/lessonFiltersStore';\nexport type { LessonFiltersState } from './store/lessonFiltersStore';\nexport { useModulesStore, DEFAULT_SIMULATIONS } from './store/modulesStore';\nexport type {\n ModulesState,\n ModulesConfig,\n SimulationsConfig,\n SimulationVisibility,\n} from './store/modulesStore';\nexport { useModules } from './hooks/useModules';\nexport type { UseModulesReturn } from './hooks/useModules';\nexport { ModuleProtectedRoute } from './components/ModuleProtectedRoute';\nexport type { ModuleProtectedRouteProps } from './components/ModuleProtectedRoute';\nexport type {\n AuthState,\n SessionInfo,\n AuthTokens,\n User,\n UserProfile,\n} from './store/authStore';\nexport { ActivityCardQuestionBanks } from './components/ActivityCardQuestionBanks/ActivityCardQuestionBanks';\nexport { ActivityCardQuestionPreview } from './components/ActivityCardQuestionPreview/ActivityCardQuestionPreview';\nexport { ActivityListQuestions } from './components/ActivityListQuestions/ActivityListQuestions';\nexport type { ActivityListQuestionsProps } from './components/ActivityListQuestions/ActivityListQuestions';\nexport type {\n ActivityCardQuestionPreviewProps,\n MatchingPairPreview,\n} from './components/ActivityCardQuestionPreview/ActivityCardQuestionPreview';\nexport { ActivityPreview } from './components/ActivityPreview/ActivityPreview';\nexport type {\n ActivityPreviewProps,\n PreviewQuestion,\n} from './components/ActivityPreview/ActivityPreview';\n\nexport { LessonPreview } from './components/LessonPreview/LessonPreview';\nexport type {\n LessonPreviewProps,\n PreviewLesson,\n} from './components/LessonPreview/LessonPreview';\n\nexport {\n QuestionsPdfGenerator,\n QuestionsPdfContent,\n useQuestionsPdfPrint,\n} from './components/QuestionsPdfGenerator';\nexport type { QuestionsPdfGeneratorProps } from './components/QuestionsPdfGenerator';\n// Utils\nexport {\n cn,\n getSubjectColorWithOpacity,\n syncDropdownState,\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n formatScore,\n formatPercentageRounded,\n} from './utils/utils';\nexport { convertActivityFiltersToQuestionsFilter } from './utils/questionFiltersConverter';\nexport {\n MASK_TYPE,\n applyInputMask,\n formatCep,\n formatCnpj,\n formatCpf,\n formatDocument,\n formatPhone,\n maskCepInput,\n maskCnpjInput,\n maskCpfInput,\n maskPhoneInput,\n} from './utils/brazilianFormatters';\nexport { BR_STATES_FULL, UF_LIST } from './utils/brazilianStates';\nexport type { UF } from './utils/brazilianStates';\nexport { default as MaskedInput } from './components/MaskedInput/MaskedInput';\nexport type { MaskedInputProps } from './components/MaskedInput/MaskedInput';\nexport { default as HierarchicalCheckboxGroup } from './components/HierarchicalCheckboxGroup/HierarchicalCheckboxGroup';\nexport type {\n HierarchicalCheckboxGroupItem,\n HierarchicalCheckboxGroupProps,\n HierarchicalCheckboxItem,\n HierarchicalCheckboxItemsLayout,\n} from './components/HierarchicalCheckboxGroup/HierarchicalCheckboxGroup';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './utils/questionTypeUtils';\n// Activity Details Types\nexport {\n STUDENT_ACTIVITY_STATUS,\n ACTIVITY_AVAILABILITY,\n studentActivityStatusSchema,\n} from './types/activityDetails';\n\n// Lesson Availability Types\nexport { LESSON_AVAILABILITY } from './types/lessonAvailability';\nexport type {\n LessonAvailability,\n LessonAvailabilityResult,\n} from './types/lessonAvailability';\n\n// Lesson Availability Utils\nexport {\n checkLessonAvailability,\n isLessonNotYetAvailable,\n isLessonExpired,\n} from './utils/lessonAvailabilityUtils';\n\n// Calendar Activity Utils (timezone-safe date helpers shared by aluno/professor)\nexport {\n getActivityDateKey,\n getCalendarActivityStatus,\n filterActivitiesFromDate,\n} from './utils/calendarActivityUtils';\nexport type { DatedActivity } from './utils/calendarActivityUtils';\n\n// Activity Details Utils\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n formatActivityDateToBrazilian,\n} from './utils/utils';\nexport type {\n StudentActivityStatus,\n ActivityAvailability,\n ActivityStudentData,\n Pagination as ActivityDetailsPagination,\n GeneralStats,\n QuestionStats,\n ActivityMetadata,\n ActivityDetailsData,\n ActivityDetailsQueryParams,\n ActivityStudentTableItem,\n StatusBadgeConfig,\n} from './types/activityDetails';\n\n// Activity Details Component\nexport { ActivityDetails } from './components/ActivityDetails/ActivityDetails';\nexport type { ActivityDetailsProps } from './components/ActivityDetails/ActivityDetails';\nexport { useActivityDetails } from './hooks/useActivityDetails';\nexport type { UseActivityDetailsReturn } from './hooks/useActivityDetails';\n\n// Support Components\nexport {\n Support,\n TicketModal,\n getCategoryIcon,\n supportSchema,\n} from './components/Support';\nexport type {\n SupportProps,\n TicketModalProps,\n SupportFormData,\n} from './components/Support';\n\n// Support Types\nexport {\n SupportStatus,\n SupportCategory,\n getStatusBadgeAction,\n getStatusText,\n getCategoryText,\n mapApiStatusToInternal,\n mapInternalStatusToApi,\n SupportType,\n} from './types/support';\nexport type {\n TicketStatus,\n ProblemType,\n TabType,\n SupportResponse,\n SupportTicket,\n CreateSupportTicketRequest,\n CreateSupportTicketResponse,\n SupportTicketAPI,\n SupportPagination,\n GetSupportTicketsResponse,\n SupportAnswerAPI,\n GetSupportAnswersResponse,\n SubmitSupportAnswerRequest,\n SubmitSupportAnswerResponse,\n SupportApiClient,\n SupportFeatureFlags,\n} from './types/support';\n\n// Zendesk Widget Component\nexport { ZendeskWidget } from './components/ZendeskWidget';\nexport type { ZendeskWidgetProps } from './components/ZendeskWidget';\n\n// Support Feature Flag Hook\nexport { useSupportFeatureFlag } from './hooks/useSupportFeatureFlag';\nexport type {\n UseSupportFeatureFlagConfig,\n UseSupportFeatureFlagReturn,\n} from './hooks/useSupportFeatureFlag';\n\n// SendActivityModal Component\nexport { SendActivityModal } from './components/SendActivityModal';\nexport { useSendActivityModal } from './components/SendActivityModal';\nexport type {\n SendActivityModalProps,\n SendActivityFormData,\n ActivitySubtype,\n StepErrors,\n StepState,\n StepConfig,\n SendActivityModalInitialData,\n} from './components/SendActivityModal';\nexport {\n validateActivityStep,\n validateRecipientStep,\n validateDeadlineStep,\n validateStep,\n isStepValid,\n isFormValid,\n ERROR_MESSAGES,\n} from './components/SendActivityModal';\n\n// ChooseActivityModelModal Component\nexport { ChooseActivityModelModal } from './components/ChooseActivityModelModal';\nexport type { ChooseActivityModelModalProps } from './components/ChooseActivityModelModal';\n\n// SaveActivityModelModal Component\nexport { SaveActivityModelModal } from './components/SaveActivityModelModal';\nexport type { SaveActivityModelModalProps } from './components/SaveActivityModelModal';\n\n// SendLessonModal Component\nexport { SendLessonModal } from './components/SendLessonModal';\nexport { useSendLessonModal } from './components/SendLessonModal';\nexport type {\n SendLessonModalProps,\n SendLessonFormData,\n StepErrors as SendLessonStepErrors,\n StepState as SendLessonStepState,\n StepConfig as SendLessonStepConfig,\n} from './components/SendLessonModal';\n\n// Recommended Lessons / RecommendedClass History Component\nexport {\n RecommendedLessonsHistory,\n RecommendedClassPageTab,\n} from './components/RecommendedLessonsHistory';\nexport type { RecommendedLessonsHistoryProps } from './components/RecommendedLessonsHistory';\n\n// Recommended Lesson Details Component\nexport {\n RecommendedLessonDetails,\n StudentPerformanceModal,\n} from './components/RecommendedLessonDetails';\nexport type {\n RecommendedLessonDetailsProps,\n StudentPerformanceModalProps,\n StudentPerformanceData,\n StudentPerformanceLabels,\n LessonProgress,\n LessonQuestion,\n QuestionAlternative,\n LessonDetailsLabels,\n DisplayStudent,\n} from './components/RecommendedLessonDetails';\n\n// Recommended Lessons Hook Factory\nexport {\n createUseRecommendedLessonsHistory,\n createRecommendedLessonsHistoryHook,\n determineRecommendedClassStatus,\n transformRecommendedClassToTableItem,\n handleRecommendedClassFetchError,\n recommendedClassHistoryApiResponseSchema,\n} from './hooks/useRecommendedLessons';\nexport type {\n UseRecommendedLessonsHistoryState,\n UseRecommendedLessonsHistoryReturn,\n} from './hooks/useRecommendedLessons';\n\n// Recommended Lessons Page Hook Factory\nexport {\n createUseRecommendedLessonsPage,\n createRecommendedLessonsPageHook,\n} from './hooks/useRecommendedLessonsPage';\nexport type {\n UseRecommendedLessonsPageConfig,\n UseRecommendedLessonsPageReturn,\n RecommendedLessonsApiClient,\n RecommendedLessonsUserData,\n RecommendedLessonsPagePaths,\n RecommendedLessonsPageEndpoints,\n RecommendedLessonsPageTexts,\n UserInstitution as RecommendedLessonsUserInstitution,\n SubTeacherTopicClass as RecommendedLessonsSubTeacherTopicClass,\n} from './hooks/useRecommendedLessonsPage';\n\n// Recommended Lesson Details Hook Factory\nexport {\n createUseRecommendedLessonDetails,\n createRecommendedLessonDetailsHook,\n handleLessonDetailsFetchError,\n recommendedClassApiResponseSchema,\n recommendedClassDetailsApiResponseSchema,\n historyApiResponseSchema,\n} from './hooks/useRecommendedLessonDetails';\nexport type {\n UseRecommendedLessonDetailsState,\n UseRecommendedLessonDetailsReturn,\n LessonDetailsApiClient,\n} from './hooks/useRecommendedLessonDetails';\n\n// Recommended Lessons Types\nexport {\n RecommendedClassApiStatus,\n RecommendedClassDisplayStatus,\n RecommendedClassBadgeActionType,\n getRecommendedClassStatusBadgeAction,\n RECOMMENDED_CLASS_FILTER_STATUS_OPTIONS,\n RECOMMENDED_CLASS_STATUS_OPTIONS,\n StudentLessonStatus,\n getStudentStatusBadgeAction,\n isDeadlinePassed,\n deriveStudentStatus,\n formatDaysToComplete,\n RecommendedClassDraftType,\n RECOMMENDED_CLASS_ACTIVITY_STATUS,\n} from './types/recommendedLessons';\nexport type {\n RecommendedClassSubject,\n RecommendedClassCreator,\n RecommendedClassStats,\n RecommendedClassBreakdown,\n RecommendedClassData,\n RecommendedClassHistoryItem,\n RecommendedClassTableItem,\n RecommendedClassHistoryApiResponse,\n RecommendedClassHistoryFilters,\n RecommendedClassHistoryPagination,\n RecommendedClassFilterOption,\n RecommendedClassUserFilterData,\n // Lesson Details API Types\n RecommendedClassDetailStudent,\n RecommendedClassDetailAggregated,\n RecommendedClassDetailContentPerformanceItem,\n RecommendedClassDetailContentPerformance,\n RecommendedClassDetailsData,\n RecommendedClassDetailsApiResponse,\n RecommendedClassLessonSubject,\n RecommendedClassLesson,\n RecommendedClassLessonProgress,\n RecommendedClassLessonsItem,\n RecommendedClassMetadata,\n RecommendedClassApiResponse,\n LessonDetailsData,\n // RecommendedClass Models Types\n RecommendedClassModelResponse,\n RecommendedClassModelTableItem,\n RecommendedClassModelsApiResponse,\n RecommendedClassModelFilters,\n RecommendedClassModelPagination,\n // RecommendedClass Activity Types\n RecommendedClassActivityStatus,\n RecommendedClassActivity,\n RecommendedClassSupUsersActivities,\n RecommendedClassActivities,\n} from './types/recommendedLessons';\n\n// RecommendedClass Models Hook Factory\nexport {\n createUseRecommendedClassModels,\n createRecommendedClassModelsHook,\n transformRecommendedClassModelToTableItem,\n handleRecommendedClassModelFetchError,\n recommendedClassModelsApiResponseSchema,\n DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION,\n} from './hooks/useRecommendedClassModels';\nexport type {\n UseRecommendedClassModelsState,\n UseRecommendedClassModelsReturn,\n} from './hooks/useRecommendedClassModels';\n\n// RecommendedClass Drafts Hook Factory\nexport {\n createUseRecommendedClassDrafts,\n createRecommendedClassDraftsHook,\n handleRecommendedClassDraftFetchError,\n DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION,\n} from './hooks/useRecommendedClassDrafts';\nexport type {\n UseRecommendedClassDraftsState,\n UseRecommendedClassDraftsReturn,\n} from './hooks/useRecommendedClassDrafts';\n\n// RecommendedClass Drafts Tab Component\nexport { RecommendedClassDraftsTab } from './components/RecommendedLessonsHistory/tabs/DraftsTab';\nexport type { RecommendedClassDraftsTabProps } from './components/RecommendedLessonsHistory/tabs/DraftsTab';\n\n// Activities History Component\nexport { ActivitiesHistory } from './components/ActivitiesHistory';\nexport type { ActivitiesHistoryProps } from './components/ActivitiesHistory';\n\n// Activity Page Layout Component\nexport {\n ActivityPageLayout,\n ActivityTab,\n} from './components/ActivityPageLayout';\nexport type { ActivityPageLayoutProps } from './components/ActivityPageLayout';\n\n// Unified History Page Component\nexport { UnifiedHistoryPage } from './components/UnifiedHistoryPage';\nexport type {\n UnifiedHistoryPageProps,\n UserData as UnifiedHistoryPageUserData,\n ApiFilterOptions as UnifiedHistoryPageApiFilterOptions,\n} from './components/UnifiedHistoryPage';\n\n// Unified Draft Model Page Component\nexport { UnifiedDraftModelPage } from './components/UnifiedDraftModelPage';\nexport type {\n UnifiedDraftModelPageProps,\n UserData as UnifiedDraftModelPageUserData,\n} from './components/UnifiedDraftModelPage';\n\n// Activities History Hook Factory\nexport {\n createUseActivitiesHistory,\n createActivitiesHistoryHook,\n transformActivityToTableItem,\n extractActivityFilterOptions,\n DEFAULT_ACTIVITIES_PAGINATION,\n DEFAULT_ACTIVITY_FILTER_OPTIONS,\n} from './hooks/useActivitiesHistory';\nexport type {\n UseActivitiesHistoryOptions,\n UseActivitiesHistoryState,\n UseActivitiesHistoryReturn,\n ActivityApiFilterOptions,\n} from './hooks/useActivitiesHistory';\n\n// Activity Drafts Hook Factory\nexport {\n createUseActivityDrafts,\n createActivityDraftsHook,\n transformDraftToTableItem as transformActivityDraftToTableItem,\n DEFAULT_DRAFTS_PAGINATION,\n} from './hooks/useActivityDrafts';\nexport type {\n UseActivityDraftsOptions,\n UseActivityDraftsState,\n UseActivityDraftsReturn,\n} from './hooks/useActivityDrafts';\n\n// Activity Models Hook Factory\nexport {\n createUseActivityModels,\n createActivityModelsHook,\n transformModelToTableItem,\n DEFAULT_MODELS_PAGINATION,\n} from './hooks/useActivityModels';\n\n// Activity Draft Model Page Hook (shared logic for drafts/models pages)\nexport { useActivityDraftModelPage } from './hooks/useActivityDraftModelPage';\nexport type {\n UseActivityDraftModelPageOptions,\n UseActivityDraftModelPageReturn,\n} from './hooks/useActivityDraftModelPage';\nexport type {\n UseActivityModelsOptions,\n UseActivityModelsState,\n UseActivityModelsReturn,\n} from './hooks/useActivityModels';\n\n// Students Highlight Hook Factory\nexport {\n createUseStudentsHighlight,\n createStudentsHighlightHook,\n calculatePerformancePercentage,\n transformStudentHighlightItem,\n handleStudentsHighlightFetchError,\n studentsHighlightApiResponseSchema,\n PERIOD_TABS,\n} from './hooks/useStudentsHighlight';\nexport type {\n StudentsHighlightPeriod,\n StudentsHighlightType,\n TrendDirection,\n StudentsHighlightFilters,\n StudentHighlightApiItem,\n StudentsHighlightApiResponse,\n StudentHighlightItem,\n UseStudentsHighlightState,\n UseStudentsHighlightReturn,\n} from './hooks/useStudentsHighlight';\n\n// Questions Data Hook Factory\nexport {\n createUseQuestionsData,\n createQuestionsDataHook,\n transformQuestionsData,\n handleQuestionsDataFetchError,\n questionsDataApiResponseSchema,\n} from './hooks/useQuestionsData';\nexport type {\n QuestionsDataPeriod,\n QuestionsDataTrendDirection,\n QuestionsDataFilters,\n QuestionsDataTrend,\n QuestionsDataApiData,\n QuestionsDataApiResponse,\n QuestionsDataHookResult,\n UseQuestionsDataState,\n UseQuestionsDataReturn,\n} from './hooks/useQuestionsData';\n\n// Activities History Types\nexport {\n ActivityApiStatus,\n ActivityDisplayStatus,\n ActivityBadgeActionType,\n ActivityDraftType,\n getActivityStatusBadgeAction,\n mapActivityStatusToDisplay,\n ACTIVITY_FILTER_STATUS_OPTIONS,\n} from './types/activitiesHistory';\nexport type {\n ActivityHistoryResponse,\n ActivityTableItem,\n ActivityPagination,\n ActivitiesHistoryApiResponse,\n ActivityHistoryFilters,\n ActivityDraftFilters,\n ActivityModelResponse,\n ActivityModelTableItem,\n ActivityModelsApiResponse,\n ActivityModelFilters,\n ActivityFilterOption,\n ActivityUserFilterData,\n} from './types/activitiesHistory';\n\n// Subject Mappers\nexport {\n mapSubjectNameToEnum,\n mapSubjectEnumToName,\n} from './utils/subjectMappers';\n\n// Subject Cell Renderer\nexport { renderSubjectCell } from './utils/renderSubjectCell';\nexport { renderTextCell } from './utils/renderTextCell';\n\n// Filter Helpers (robust version with deduplication)\nexport {\n getSchoolOptionsFromUserData,\n getSubjectOptionsFromUserData,\n getSchoolYearOptionsFromUserData,\n getClassOptionsFromUserData,\n buildUserFilterData,\n mergeFilterOptions,\n} from './utils/filterHelpers';\nexport type {\n UserInstitutionData,\n SubTeacherTopicClassData,\n UserFilterSourceData,\n} from './utils/filterHelpers';\n\n// Draft Model Filter Helpers\nexport { createDraftsModelsFiltersConfig } from './utils/draftModelFilterHelpers';\n\n// Pagination Types\nexport type { PaginationData } from './types/pagination';\n\n// Chat Hooks\nexport { useChat, createUseChat, WS_STATES } from './hooks/useChat';\nexport type { UseChatOptions, UseChatReturn } from './hooks/useChat';\nexport { useChatRooms, createUseChatRooms } from './hooks/useChatRooms';\nexport type {\n UseChatRoomsOptions,\n UseChatRoomsReturn,\n} from './hooks/useChatRooms';\n\n// Chat Types\nexport { CHAT_MESSAGE_TYPES, PROFILE_ROLES } from './types/chat';\nexport type {\n ChatMessageType,\n ChatUser,\n AvailableUsers,\n ChatRoom,\n ChatRoomWithDetails,\n ChatMessage,\n ChatParticipant,\n WSUserInfo,\n WSClientMessageType,\n WSServerMessageType,\n WSClientMessage,\n WSServerMessage,\n ChatApiClient,\n AvailableUsersResponse,\n CreateRoomResponse,\n GetRoomsResponse,\n GetRoomDetailsResponse,\n} from './types/chat';\n\n// Chat Component\nexport { Chat, ChatLoading } from './components/Chat';\nexport type { ChatProps } from './components/Chat';\n\n// Chat Utils\nexport {\n getChatWsUrl,\n getChatUserInfo,\n isChatUserInfoValid,\n} from './utils/chatUtils';\nexport type { ChatUserInfo } from './utils/chatUtils';\n\n// Chatbot Hook\nexport { createUseChatbot } from './hooks/useChatbot';\nexport type { UseChatbotReturn } from './hooks/useChatbot';\n\n// Chatbot Types\nexport { CHATBOT_MESSAGE_ROLES } from './types/chatbot';\nexport type {\n ChatbotRole,\n ChatbotMessage as ChatbotMessageData,\n ChatbotConversation,\n ChatbotCurrentContext,\n SendChatbotMessagePayload,\n SendChatbotMessageResult,\n ChatbotUser,\n ChatbotApiClient,\n} from './types/chatbot';\n\n// Chatbot Components\nexport {\n Chatbot,\n ChatbotFab,\n ChatbotPanel,\n ChatbotMessageList,\n ChatbotMessage,\n ChatbotInput,\n ChatbotTypingIndicator,\n ChatbotConversationList,\n ChatbotContentRenderer,\n} from './components/Chatbot';\nexport type {\n ChatbotProps,\n ChatbotFabProps,\n ChatbotPanelProps,\n ChatbotMessageListProps,\n ChatbotMessageProps,\n ChatbotInputProps,\n ChatbotTypingIndicatorProps,\n ChatbotConversationListProps,\n ChatbotContentRendererProps,\n} from './components/Chatbot';\n\n// Accessibility Widget\nexport {\n AccessibilityWidget,\n AccessibilityFab,\n AccessibilityPanel,\n LibrasFab,\n VLibrasLoader,\n ReadingAid,\n ColorBlindFilters,\n TTSController,\n WebSpeechProvider,\n} from './components/AccessibilityWidget';\nexport type {\n AccessibilityWidgetProps,\n AccessibilityFabProps,\n AccessibilityFabPosition,\n AccessibilityFabVerticalAlign,\n AccessibilityPanelProps,\n LibrasFabProps,\n TTSProvider,\n TTSVoice,\n TTSSpeakOptions,\n TTSProviderEvents,\n} from './components/AccessibilityWidget';\n\n// Accessibility Store + Hook\nexport {\n useAccessibilityStore,\n DEFAULT_ACCESSIBILITY_PREFERENCES,\n ColorBlindMode,\n getColorBlindClass,\n getColorBlindFilterId,\n} from './store/accessibilityStore';\nexport type {\n AccessibilityStore,\n AccessibilityState,\n AccessibilityActions,\n AccessibilityPreferences,\n ContrastMode,\n SaturationMode,\n FontSizeLevel,\n SpacingLevel,\n ReadingAid as ReadingAidMode,\n TTSMode,\n TTSStatus,\n} from './store/accessibilityStore';\nexport { useA11yPreferences } from './hooks/useA11yPreferences';\nexport { useA11yKeyboardShortcut } from './hooks/useA11yKeyboardShortcut';\nexport { useTTS } from './hooks/useTTS';\nexport type { UseTTSReturn } from './hooks/useTTS';\n\n// Forum Component\nexport { Forum } from './components/Forum/Forum';\nexport type { ForumProps } from './components/Forum/Forum';\n\n// Forum Hook\nexport { createUseForum } from './hooks/useForum';\nexport type { UseForumReturn } from './hooks/useForum';\n\n// Forum Types\nexport type {\n ForumPostBase,\n ForumTopic,\n ForumReply,\n ForumPagination,\n ForumTopicsResponse,\n ForumTopicDetailResponse,\n ForumApiClient,\n} from './types/forum';\n\n// General Activity Types (calendar, activity list)\nexport {\n ActivityStatus as GeneralActivityStatus,\n ActivityFilter,\n CalendarActivityStatus,\n} from './types/activities';\nexport type {\n Activity,\n CalendarActivity,\n ActivityResponse,\n CalendarActivitiesResponse,\n} from './types/activities';\n\n// Send Activity Hook\nexport { useSendActivity } from './hooks/useSendActivity';\nexport type {\n UseSendActivityConfig,\n UseSendActivityReturn,\n SendActivityCategoriesData,\n CreateActivityPayload,\n StudentPayload,\n ActivityModelItem,\n RecipientItem as SendActivityRecipientItem,\n} from './types/sendActivity';\n\n// Performance Types and Utils\nexport {\n PERFORMANCE_TAG_CONFIG,\n getPerformanceTag,\n getPerformanceTagConfig,\n} from './types/performance';\nexport { PerformanceTag } from './types/performance';\nexport type { PerformanceTagConfig, TimeInterval } from './types/performance';\n\n// Student Performance Details Modal\nexport { StudentPerformanceDetailsModal } from './components/StudentPerformanceDetailsModal';\nexport type {\n StudentPerformanceDetailsModalProps,\n StudentPerformanceDetailsData,\n StudentPerformanceDetailsLabels,\n ActivityProgress,\n} from './components/StudentPerformanceDetailsModal';\n\n// Student Lesson Progress Modal\nexport { StudentLessonProgressModal } from './components/StudentLessonProgressModal';\nexport type {\n StudentLessonProgressModalProps,\n StudentLessonProgressData,\n StudentLessonProgressLabels,\n TopicProgressItem,\n SubtopicProgressItem,\n ContentProgressItem,\n LessonProgressStatus,\n} from './components/StudentLessonProgressModal';\nexport { DEFAULT_LESSON_PROGRESS_LABELS } from './components/StudentLessonProgressModal';\n\n// TimeChart Components\nexport {\n TimeChart,\n TIME_CHART_CATEGORY_KEY,\n STUDENT_CATEGORIES,\n DEFAULT_CATEGORIES,\n calculateHourTicks,\n bgClassToCssVar,\n} from './components/TimeChart/TimeChart';\nexport type {\n TimeChartProps,\n TimeChartData,\n TimeChartCategory,\n TimeChartDayData,\n TimeChartRequest,\n TimeChartStudentPeriodItem,\n TimeChartStudentItemBreakdown,\n TimeChartStudentData,\n TimeChartDefaultPeriodItem,\n TimeChartDefaultItemBreakdown,\n TimeChartDefaultData,\n TimeChartResponse,\n} from './components/TimeChart/TimeChart';\n\n// TimeReport Components\nexport {\n TimeReport,\n TimeCard,\n formatHoursToTime,\n getTrendDirection,\n formatVariation,\n} from './components/TimeReport/TimeReport';\nexport type {\n TimeReportProps,\n TimeCardProps,\n TimeReportTab,\n TimeCardData,\n TimeCardTrend,\n TimeReportPeriod,\n TimeReportRequest,\n TimeMetric,\n TimeReportData,\n TimeReportResponse,\n} from './components/TimeReport/TimeReport';\n\n// PerformanceReport Components\nexport {\n PerformanceReport,\n PerformanceCard,\n} from './components/PerformanceReport/PerformanceReport';\nexport type {\n PerformanceReportProps,\n PerformanceCardProps,\n PerformanceReportTab,\n PerformanceCardData,\n PerformanceReportPeriod,\n PerformanceReportRequest,\n PerformanceStudentData,\n PerformanceDefaultData,\n PerformanceReportResponse,\n} from './components/PerformanceReport/PerformanceReport';\n\n// PerformanceQuestionsData Components\nexport {\n PerformanceQuestionsData,\n PerformanceQuestionsVariant,\n} from './components/PerformanceQuestionsData/PerformanceQuestionsData';\nexport type {\n PerformanceQuestionsDataProps,\n QuestionsVariantData,\n ContentVariantData,\n PerformanceFilterOption,\n PerformanceFilterConfig,\n PerformanceQuestionsPeriod,\n PerformanceQuestionsRequest,\n PerformanceQuestionsStudentResponse,\n PerformanceQuestionsDefaultResponse,\n} from './components/PerformanceQuestionsData/PerformanceQuestionsData';\n\n// PerformanceRanking Components\nexport { PerformanceRanking } from './components/PerformanceRanking/PerformanceRanking';\nexport type {\n PerformanceRankingProps,\n PerformanceRankingItem,\n PerformanceRankingData,\n GroupedBy,\n} from './components/PerformanceRanking/PerformanceRanking';\n\n// PerformanceReportModal Components\nexport {\n PerformanceReportModal,\n PerformanceReportModalVariant,\n} from './components/PerformanceReportModal/PerformanceReportModal';\nexport type {\n PerformanceReportModalProps,\n UserPerformanceRequest,\n UserPerformanceQuestionStats,\n UserPerformanceMaterialStats,\n UserPerformanceLesson,\n UserPerformanceStudentData,\n UserPerformanceProfessionalData,\n} from './components/PerformanceReportModal/PerformanceReportModal';\n\n// AccessReportModal Components\nexport {\n AccessReportModal,\n AccessReportModalVariant,\n} from './components/AccessReportModal/AccessReportModal';\nexport type {\n AccessReportModalProps,\n AccessReportStudentData,\n AccessReportProfessionalData,\n AccessReportTimePercentage,\n AccessReportUser,\n AccessReportByPlatform,\n} from './components/AccessReportModal/AccessReportModal';\n\n// DownloadModal Components\nexport { default as DownloadModal } from './components/DownloadModal/DownloadModal';\nexport { DOWNLOAD_FORMAT } from './enums/DownloadFormat';\nexport { FILTER_CATEGORY, FILTER_GROUP } from './enums/FilterEnums';\nexport type {\n DownloadModalProps,\n DownloadFormat,\n} from './components/DownloadModal/DownloadModal';\n\n// PrintableUsersTable Component\nexport { default as PrintableUsersTable } from './components/PrintableUsersTable/PrintableUsersTable';\nexport type { PrintableUsersTableProps } from './components/PrintableUsersTable/PrintableUsersTable';\n\n// Cookie and Domain Utils\nexport { getCookie, setCookie, removeCookie } from './utils/cookieUtils';\nexport type { CookieOptions } from './utils/cookieUtils';\nexport { resolveRootHostname } from './utils/domainUtils';\n\n// Report Export Utils\nexport { downloadExcel } from './utils/exportExcel';\nexport { printAsPdf } from './utils/exportPdf';\n\n// Report Export Types\nexport type { ExcelCell, SheetConfig } from './utils/exportExcel';\n\n// SimulatedPerformance Component\nexport {\n useSimulatedPerformance,\n SimulatedPerformanceView,\n SCORE_TYPE_OPTIONS,\n SimulatedViewTab,\n} from './components/SimulatedPerformance';\nexport type {\n UseSimulatedPerformanceOptions,\n UseSimulatedPerformanceReturn,\n SimulatedPerformanceViewProps,\n} from './components/SimulatedPerformance';\n\n// Profile Aggregation Utils\nexport {\n getAggregationTypeByProfile,\n shouldUseAggregatedOverview,\n} from './utils/profileAggregation';\n\n// Aggregated Overview Hook\nexport { useAggregatedOverview } from './components/SimulatedStudentsOverview';\nexport type {\n OverviewAggregationType,\n ClassOverviewItem,\n MunicipalityOverviewItem,\n StudentsOnlyOverviewData,\n ClassesOverviewData,\n MunicipalitiesOverviewData,\n AggregatedOverviewData,\n AggregatedOverviewParams,\n UseAggregatedOverviewState,\n UseAggregatedOverviewReturn,\n} from './components/SimulatedStudentsOverview';\n// Simulations Component (teacher-facing list + nested detail modal)\nexport {\n SimulationsPage,\n SimulationsDetailModal,\n} from './components/SimulationsPage';\nexport type {\n SimulationsPageProps,\n SimulationsDetailModalProps,\n} from './components/SimulationsPage';\nexport { createUseSimulations } from './hooks/useSimulations';\nexport type { UseSimulationsReturn } from './hooks/useSimulations';\nexport type {\n SimulationsStudentItem,\n SimulationsStudentsPage,\n SimulationsStudentsResponse,\n SimulationsStudentsFilters,\n StudentSimulationItem,\n SimulationsListData,\n SimulationsListResponse,\n SimulationsListFilters,\n SimulationQuestionStatus,\n SimulationDetailOption,\n SimulationDetailQuestion,\n SimulationDetailData,\n SimulationDetailResponse,\n NoteData,\n NoteResponse,\n} from './types/simulations';\n\n// ComparatorChart Components\nexport {\n // Base chart components\n Legend as ComparatorLegend,\n PercentageScale,\n ChartArea,\n BarChartRow,\n // Content components\n KnowledgeAreasContent,\n CurricularComponentsContent,\n CompetenciesContent,\n NationalAverageCard,\n NationalAveragesContent,\n // UI components\n ComparatorEmptyState,\n ComparatorLoadingState,\n ComparatorSelectTypeStep,\n ComparatorSelectItemsStep,\n ComparatorTabContent,\n // Main view\n ComparatorView,\n} from './components/ComparatorChart';\nexport type {\n LegendProps as ComparatorLegendProps,\n LegendItem as ComparatorLegendItem,\n ChartAreaProps,\n BarChartRowProps,\n BarChartValue,\n KnowledgeAreasContentProps,\n CurricularComponentsContentProps,\n CompetenciesContentProps,\n NationalAverageCardProps,\n NationalAveragesContentProps,\n ComparatorEmptyStateProps,\n ComparatorSelectTypeStepProps,\n ComparatorSelectItemsStepProps,\n ComparatorTabContentProps,\n ComparatorViewProps,\n} from './components/ComparatorChart';\n\n// Comparator Types\nexport {\n ComparatorTabValue,\n DEFAULT_COMPARATOR_LABELS,\n DEFAULT_COMPARATOR_TABS,\n COMPARATOR_CHART_COLORS,\n} from './types/comparator';\nexport type {\n ComparisonType,\n ComparatorTabType,\n ComparisonItem,\n KnowledgeAreaData,\n CurricularComponentData,\n CompetencyData,\n NationalAverageData,\n ComparatorData,\n ComparatorApiClient,\n ComparatorStoreState,\n UseComparatorReturn,\n ComparatorLabels,\n ComparatorTab,\n} from './types/comparator';\n\n// Comparator Hook\nexport {\n createUseComparator,\n createComparatorHook,\n} from './hooks/useComparator';\nexport type { UseComparatorConfig } from './hooks/useComparator';\n\n// Comparator Store\nexport {\n createComparatorStore,\n useComparatorStore,\n} from './store/comparatorStore';\nexport type { CreateComparatorStoreConfig } from './store/comparatorStore';\n\n// User Store\nexport { createUserStore } from './store/userStore';\nexport type {\n CreateUserStoreConfig,\n UserStoreApiClient,\n UserStoreState,\n} from './store/userStore';\n\n// User Types\nexport type {\n User as UserData,\n UserInfos,\n Profile,\n Institution,\n School as UserSchool,\n SchoolYear as UserSchoolYear,\n Class as UserClass,\n UserInstitution,\n Subject as UserSubject,\n SubTeacherTopicClass,\n MyDataResponse,\n UpdateMyDataRequest,\n UserTelemetryData,\n StudentDetailsResponse,\n} from './types/user';\n\n// Exam Types\nexport {\n ExamStatus,\n ExamDisplayStatus,\n mapExamStatusToDisplay,\n} from './types/examsHistory';\nexport type {\n ExamFilterOption,\n ExamApiFilterOptions,\n ExamSubject,\n ExamBreakdownItem,\n ExamHistoryResponse,\n ExamTableItem,\n ExamsHistoryApiResponse,\n ExamHistoryFilters,\n ExamPagination,\n} from './types/examsHistory';\n\nexport { ExamDraftType, ExamActivityCategory } from './types/examDrafts';\nexport type {\n ExamDraftFilters,\n ExamModelResponse,\n ExamModelTableItem,\n ExamModelsApiResponse,\n ExamModelFilters,\n ExamModelsPagination,\n} from './types/examDrafts';\n\n// Exam Hooks Factories\nexport {\n createUseExamsHistory,\n createExamsHistoryHook,\n transformExamToTableItem,\n handleExamFetchError,\n extractExamFilterOptions,\n DEFAULT_EXAMS_PAGINATION,\n DEFAULT_EXAM_FILTER_OPTIONS,\n} from './hooks/useExamsHistory';\nexport type {\n UseExamsHistoryState,\n UseExamsHistoryReturn,\n} from './hooks/useExamsHistory';\n\n// NOTE: useExamDrafts and useExamModels removed - use createUseActivityDrafts/createUseActivityModels with { activityCategory: 'PROVA' }\n\n// Exam Page Layout Component\nexport { ExamPageLayout, ExamTab } from './components/ExamPageLayout';\nexport type { ExamPageLayoutProps } from './components/ExamPageLayout';\n\n// Exam Table Configs\nexport {\n examsTableColumns,\n getExamStatusBadgeAction,\n createExamDraftsModelsTableColumns,\n} from './components/ExamPageLayout';\nexport type { ExamTableCallbacks } from './components/ExamPageLayout';\n\n// Answer Sheet Preview Components\nexport {\n AnswerSheetPreview,\n AnswerSheetsBatchPreview,\n AnswerSheetCard,\n CardContainer as AnswerSheetCardContainer,\n PageContainer as AnswerSheetPageContainer,\n PrintStyles as AnswerSheetPrintStyles,\n} from './components/ExamPageLayout';\nexport type {\n AnswerSheetPreviewProps,\n AnswerSheetsBatchPreviewProps,\n AnswerSheetData,\n AnswerSheetCardProps,\n} from './components/ExamPageLayout';\n\n// Exam Filter Helpers\nexport {\n EXAM_STATUS_OPTIONS,\n EXAM_FILTER_CATEGORY,\n EXAM_FILTER_GROUP,\n createExamDraftsModelsFiltersConfig,\n createExamHistoryFiltersConfig,\n} from './utils/examFilterHelpers';\n\n// Exam Details Types\nexport {\n StudentAnswerStatus,\n StudentAnswerDisplayStatus,\n} from './types/examDetails';\nexport type {\n ExamStudentResult,\n ExamStudentTableItem,\n ExamStats,\n ExamDetailsData,\n ExamDetailsPagination,\n ExamDetailsFilters,\n} from './types/examDetails';\n\n// Exam Details Hook Factory\nexport {\n createUseExamDetails,\n createExamDetailsHook,\n transformStudent,\n mapBackendStatusToFrontend,\n handleExamDetailsFetchError,\n DEFAULT_EXAM_DETAILS_PAGINATION,\n} from './hooks/useExamDetails';\nexport type {\n UseExamDetailsState,\n UseExamDetailsReturn,\n} from './hooks/useExamDetails';\n\n// Exam Details Layout Components\nexport {\n ExamDetailsHeader,\n ExamStatsCards,\n formatQuestions,\n ExamStudentsTable,\n createExamStudentsTableColumns,\n getExamStudentStatusBadgeAction,\n getExamStudentStatusDisplayText,\n ExamDetailsPage,\n} from './components/ExamDetailsLayout';\nexport type {\n ExamDetailsHeaderProps,\n ExamStatsCardsProps,\n ExamStudentsTableProps,\n ExamDetailsPageProps,\n} from './components/ExamDetailsLayout';\n","import { HTMLAttributes, ReactNode } from 'react';\nimport { Bell } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for variant and action class combinations\n */\nconst VARIANT_ACTION_CLASSES = {\n solid: {\n error: 'bg-error-background text-error-700 focus-visible:outline-none',\n warning: 'bg-warning text-warning-800 focus-visible:outline-none',\n success: 'bg-success text-success-800 focus-visible:outline-none',\n info: 'bg-info text-info-800 focus-visible:outline-none',\n muted: 'bg-background-muted text-background-800 focus-visible:outline-none',\n },\n outlined: {\n error:\n 'bg-error text-error-700 border border-error-300 focus-visible:outline-none',\n warning:\n 'bg-warning text-warning-800 border border-warning-300 focus-visible:outline-none',\n success:\n 'bg-success text-success-800 border border-success-300 focus-visible:outline-none',\n info: 'bg-info text-info-800 border border-info-300 focus-visible:outline-none',\n muted:\n 'bg-background-muted text-background-800 border border-border-300 focus-visible:outline-none',\n },\n exams: {\n exam1: 'bg-exam-1 text-info-700 focus-visible:outline-none',\n exam2: 'bg-exam-2 text-typography-1 focus-visible:outline-none',\n exam3: 'bg-exam-3 text-typography-2 focus-visible:outline-none',\n exam4: 'bg-exam-4 text-success-700 focus-visible:outline-none',\n },\n examsOutlined: {\n exam1:\n 'bg-exam-1 text-info-700 border border-info-700 focus-visible:outline-none',\n exam2:\n 'bg-exam-2 text-typography-1 border border-typography-1 focus-visible:outline-none',\n exam3:\n 'bg-exam-3 text-typography-2 border border-typography-2 focus-visible:outline-none',\n exam4:\n 'bg-exam-4 text-success-700 border border-success-700 focus-visible:outline-none',\n },\n resultStatus: {\n negative: 'bg-error text-error-800 focus-visible:outline-none',\n positive: 'bg-success text-success-800 focus-visible:outline-none',\n },\n notification: 'text-primary',\n} as const;\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n small: 'text-2xs px-2 py-1',\n medium: 'text-xs px-2 py-1',\n large: 'text-sm px-2 py-1',\n} as const;\n\nconst SIZE_CLASSES_ICON = {\n small: 'size-3',\n medium: 'size-3.5',\n large: 'size-4',\n} as const;\n\n/**\n * Badge component props interface\n */\ntype BadgeProps = {\n /** Content to be displayed inside the badge */\n children?: ReactNode;\n /** Ícone à direita do texto */\n iconRight?: ReactNode;\n /** Ícone à esquerda do texto */\n iconLeft?: ReactNode;\n /** Size of the badge */\n size?: 'small' | 'medium' | 'large';\n /** Visual variant of the badge */\n variant?:\n | 'solid'\n | 'outlined'\n | 'exams'\n | 'examsOutlined'\n | 'resultStatus'\n | 'notification';\n /** Action type of the badge */\n action?:\n | 'error'\n | 'warning'\n | 'success'\n | 'info'\n | 'muted'\n | 'exam1'\n | 'exam2'\n | 'exam3'\n | 'exam4'\n | 'positive'\n | 'negative';\n /** Additional CSS classes to apply */\n className?: string;\n notificationActive?: boolean;\n} & HTMLAttributes<HTMLDivElement>;\n\n/**\n * Badge component for Analytica Ensino platforms\n *\n * A flexible button component with multiple variants, sizes and actions.\n *\n * @param children - The content to display inside the badge\n * @param size - The size variant (extra-small, small, medium, large, extra-large)\n * @param variant - The visual style variant (solid, outline, link)\n * @param action - The action type (primary, positive, negative)\n * @param className - Additional CSS classes\n * @param props - All other standard div HTML attributes\n * @returns A styled badge element\n *\n * @example\n * ```tsx\n * <Badge variant=\"solid\" action=\"info\" size=\"medium\">\n * Information\n * </Badge>\n * ```\n */\nconst Badge = ({\n children,\n iconLeft,\n iconRight,\n size = 'medium',\n variant = 'solid',\n action = 'error',\n className = '',\n notificationActive = false,\n ...props\n}: BadgeProps) => {\n // Get classes from lookup tables\n const sizeClasses = SIZE_CLASSES[size];\n const sizeClassesIcon = SIZE_CLASSES_ICON[size];\n const variantActionMap = VARIANT_ACTION_CLASSES[variant] || {};\n const variantClasses =\n typeof variantActionMap === 'string'\n ? variantActionMap\n : ((variantActionMap as Record<string, string>)[action] ??\n (variantActionMap as Record<string, string>).muted ??\n '');\n\n const baseClasses =\n 'inline-flex items-center justify-center rounded-xs font-normal gap-1 relative';\n\n const baseClassesIcon = 'flex items-center';\n if (variant === 'notification') {\n return (\n <div\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n {...props}\n >\n <Bell size={24} className=\"text-current\" aria-hidden=\"true\" />\n\n {notificationActive && (\n <span\n data-testid=\"notification-dot\"\n className=\"absolute top-[5px] right-[10px] block h-2 w-2 rounded-full bg-indicator-error ring-2 ring-white\"\n />\n )}\n </div>\n );\n }\n return (\n <div\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n {...props}\n >\n {iconLeft && (\n <span className={cn(baseClassesIcon, sizeClassesIcon)}>{iconLeft}</span>\n )}\n {children}\n {iconRight && (\n <span className={cn(baseClassesIcon, sizeClassesIcon)}>\n {iconRight}\n </span>\n )}\n </div>\n );\n};\n\nexport default Badge;\n","import { ReactNode } from 'react';\nimport katex from 'katex';\n\nexport interface KatexMathProps {\n /** LaTeX source to render */\n math: string;\n /** Render as centered display math (block) instead of inline */\n displayMode?: boolean;\n /** Called with the thrown error when KaTeX fails to parse `math` */\n renderError?: (error: unknown) => ReactNode;\n}\n\n/**\n * Renders a single LaTeX expression with KaTeX, calling `katex.renderToString`\n * directly instead of going through `react-katex`.\n *\n * Why not `react-katex`: when bundlers (Vite/esbuild dev optimizer, Rollup)\n * bundle `react-katex` they inline their OWN copy of KaTeX whose function\n * registry ends up broken — symbols render but `\\`-commands (`\\frac`, `\\cdot`,\n * `\\left`, ...) fail with a parse error. Importing `katex` directly here uses\n * the shared, correctly-bundled KaTeX (the same one `rehype-katex` uses), so\n * every command renders. See HtmlMathRenderer for the surrounding pipeline.\n */\nexport const KatexMath = ({\n math,\n displayMode = false,\n renderError,\n}: KatexMathProps) => {\n let html: string;\n try {\n html = katex.renderToString(math, {\n displayMode,\n throwOnError: true,\n });\n } catch (error_) {\n return <>{renderError ? renderError(error_) : null}</>;\n }\n\n const Tag = displayMode ? 'div' : 'span';\n return (\n <Tag\n data-testid=\"react-katex\"\n // KaTeX output is sanitized markup it generates itself from the parsed\n // LaTeX; there is no untrusted HTML passthrough here.\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n};\n\nexport default KatexMath;\n","import { CSSProperties, forwardRef, memo, ReactNode, Ref } from 'react';\nimport 'katex/dist/katex.min.css';\nimport { KatexMath } from './KatexMath';\nimport { cn } from '../../utils/utils';\nimport MarkdownMathRenderer from '../MarkdownMathRenderer/MarkdownMathRenderer';\nimport {\n isLikelyMarkdown,\n processHtmlWithMath,\n sanitizeHtmlForDisplay,\n} from './utils';\n\nexport interface HtmlMathRendererProps {\n /** HTML content to render, may contain LaTeX math expressions */\n content: string;\n /** Additional CSS class names */\n className?: string;\n /** Inline styles */\n style?: CSSProperties;\n /** Whether to sanitize HTML before rendering (default: true) */\n sanitize?: boolean;\n /** Custom error renderer for math errors */\n renderMathError?: (latex: string) => ReactNode;\n /** Test ID for testing */\n testId?: string;\n /** Whether to render as inline element (span) instead of block (div). Use when inside labels or other phrasing content. */\n inline?: boolean;\n}\n\n/**\n * HtmlMathRenderer - Renders HTML content with LaTeX math expressions\n *\n * Supports multiple LaTeX formats:\n * - Display mode: $$...$$ (centered block)\n * - Inline mode: $...$ (inline with text)\n * - LaTeX tags: <latex>...</latex>\n * - Editor spans: <span class=\"math-formula\" data-latex=\"...\">\n * - Legacy spans: <span class=\"math-expression\" data-math=\"...\">\n * - LaTeX environments: \\begin{...}...\\end{...}\n *\n * @example\n * ```tsx\n * <HtmlMathRenderer\n * content=\"<p>A fórmula é: $$x = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}$$</p>\"\n * />\n * ```\n */\nconst HtmlMathRenderer = forwardRef<HTMLElement, HtmlMathRendererProps>(\n (\n {\n content,\n className,\n style,\n sanitize = true,\n renderMathError,\n testId,\n inline = false,\n },\n ref\n ) => {\n // AI-generated questions/resolutions arrive as Markdown + LaTeX. The HTML\n // pipeline below would render their `**`/`####`/`*` tokens literally and\n // collapse line breaks, so route that content to the Markdown renderer.\n // Inline usage stays on the HTML path to keep phrasing-content validity\n // (Markdown emits block elements: <p>, <ul>, <h4>, ...).\n //\n // Note: `renderMathError` is intentionally not forwarded here. The Markdown\n // path renders math via rehype-katex, which already degrades gracefully on\n // invalid LaTeX (KaTeX's built-in red error output) rather than throwing.\n // `renderMathError` is an HTML-path-only customization and is currently\n // unused by any consumer; honoring it on the Markdown path would require a\n // bespoke rehype plugin for no practical gain.\n if (!inline && content && isLikelyMarkdown(content)) {\n return (\n <MarkdownMathRenderer\n ref={ref as Ref<HTMLDivElement>}\n content={content}\n className={className}\n style={style}\n testId={testId}\n />\n );\n }\n\n const defaultErrorRenderer = (latex: string) => (\n <span className=\"text-error-600 text-sm\">Math Error: {latex}</span>\n );\n\n const errorRenderer = renderMathError || defaultErrorRenderer;\n\n const renderContent = () => {\n if (!content) return null;\n\n const processedContent = sanitize\n ? sanitizeHtmlForDisplay(content)\n : content;\n\n const parts = processHtmlWithMath(processedContent);\n\n // If all parts are text (or empty), render as plain HTML. Use the\n // joined parts (not the raw `processedContent`) so post-split fixes\n // applied inside `processHtmlWithMath` — like decoding `\\$` escapes\n // to literal `$` — actually reach the rendered output.\n if (parts.every((part) => part.type === 'text')) {\n const joinedHtml = parts.map((part) => part.content).join('');\n // Use span for inline mode to allow valid nesting in labels\n const Element = inline ? 'span' : 'div';\n return (\n <Element\n dangerouslySetInnerHTML={{\n __html: joinedHtml || processedContent,\n }}\n />\n );\n }\n\n // Generate stable keys based on content\n const getPartKey = (part: (typeof parts)[0], idx: number) => {\n const contentHash = (part.latex || part.content).slice(0, 20);\n return `${part.type}-${idx}-${contentHash}`;\n };\n\n return (\n <>\n {parts.map((part, index) => {\n const key = getPartKey(part, index);\n if (part.type === 'math' && part.latex) {\n return (\n <KatexMath\n key={key}\n math={part.latex}\n renderError={() => errorRenderer(part.latex!)}\n />\n );\n } else if (part.type === 'block-math' && part.latex) {\n // When inline mode, render inline to avoid block-level elements inside span\n if (inline) {\n return (\n <KatexMath\n key={key}\n math={part.latex}\n renderError={() => errorRenderer(part.latex!)}\n />\n );\n }\n return (\n <div key={key} className=\"my-2.5 text-center\">\n <KatexMath\n math={part.latex}\n displayMode\n renderError={() => errorRenderer(part.latex!)}\n />\n </div>\n );\n } else {\n return (\n <span\n key={key}\n dangerouslySetInnerHTML={{ __html: part.content }}\n />\n );\n }\n })}\n </>\n );\n };\n\n const sharedClassName = cn(\n // Base styles\n 'leading-relaxed',\n // Paragraph styles\n '[&_p]:mb-0',\n // Hide the KaTeX MathML accessibility layer visually (still readable\n // to screen readers). Tailwind preflight overrides the KaTeX default\n // `position: absolute; clip:...` rule, so the MathML layer ends up\n // duplicating every formula as raw text next to the visual render.\n '[&_.katex-mathml]:sr-only',\n // Table styles (only relevant for block mode, but harmless for inline)\n '[&_table]:border-collapse [&_table]:w-full [&_table]:my-2.5 [&_table]:table-auto',\n '[&_table_td]:border [&_table_td]:border-border-200 [&_table_td]:p-2 [&_table_td]:min-w-[50px] [&_table_td]:align-top',\n '[&_table_th]:border [&_table_th]:border-border-200 [&_table_th]:p-2 [&_table_th]:min-w-[50px] [&_table_th]:align-top [&_table_th]:bg-background-50 [&_table_th]:font-semibold',\n '[&_table_tr:nth-child(even)]:bg-background-50/50',\n '[&_table_tr:hover]:bg-background-100/50',\n // Image styles\n '[&_img]:max-w-full [&_img]:h-auto [&_img]:rounded-md [&_img]:my-2',\n // Link styles\n '[&_a]:text-primary-500 [&_a]:underline [&_a:hover]:text-primary-600',\n // Text formatting styles\n '[&_b]:font-bold [&_strong]:font-bold',\n '[&_i]:italic [&_em]:italic',\n '[&_u]:underline',\n className\n );\n\n if (inline) {\n return (\n <span\n ref={ref as Ref<HTMLSpanElement>}\n className={sharedClassName}\n style={style}\n data-testid={testId}\n >\n {renderContent()}\n </span>\n );\n }\n\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={sharedClassName}\n style={style}\n data-testid={testId}\n >\n {renderContent()}\n </div>\n );\n }\n);\n\nHtmlMathRenderer.displayName = 'HtmlMathRenderer';\n\nexport default memo(HtmlMathRenderer);\n","import { CSSProperties, forwardRef, memo } from 'react';\nimport 'katex/dist/katex.min.css';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { cn } from '../../utils/utils';\nimport { looksLikeLatex } from '../HtmlMathRenderer/utils';\n\nexport interface MarkdownMathRendererProps {\n /** Markdown content, may contain LaTeX math expressions ($...$ / $$...$$) */\n content: string;\n /** Additional CSS class names */\n className?: string;\n /** Inline styles */\n style?: CSSProperties;\n /** Test ID for testing */\n testId?: string;\n}\n\n/**\n * Strips zero-width / invisible characters that occasionally leak into\n * AI-generated content and break KaTeX parsing.\n */\nconst stripInvisibleChars = (str: string): string =>\n str.replaceAll(/[\\u200B-\\u200D\\uFEFF]/g, '');\n\n/**\n * Escapes the `$` of inline `$...$` spans that do NOT look like real math, so\n * `remark-math` leaves them as literal text. Without this, currency prose like\n * \"R$ 15,00 ... R$ 42,00\" gets paired up and rendered as gibberish math.\n *\n * Reuses the exact `looksLikeLatex` heuristic the HTML renderer applies to\n * single-`$` spans, so both renderers agree on what is math vs currency.\n * Display math (`$$...$$`) is intentionally left untouched (handled below).\n */\nexport const protectCurrencyInlineMath = (markdown: string): string =>\n markdown.replaceAll(\n /(?<!\\\\)\\$(?!\\$)([^\\n$]+?)(?<!\\\\)\\$(?!\\$)/g,\n (match, inner: string) =>\n looksLikeLatex(inner) ? match : match.replaceAll('$', String.raw`\\$`)\n );\n\n/**\n * `remark-math` only renders a `$$...$$` block as centered display math when\n * the delimiters sit on their own lines (\"math flow\"). AI content usually puts\n * the whole equation on a single line (`$$x = y$$`), which would otherwise be\n * rendered inline. Reflow single-line `$$...$$` into block form so equations\n * stay centered, matching how the HTML renderer treats `$$`.\n */\nexport const reflowDisplayMath = (markdown: string): string =>\n markdown.replaceAll(\n /(?<!\\$)\\$\\$(?!\\$)([^\\n]+?)\\$\\$(?!\\$)/g,\n (_match, inner: string) => `\\n\\n$$\\n${inner.trim()}\\n$$\\n\\n`\n );\n\n/**\n * Runs `transform` over the markdown while shielding fenced code blocks and\n * inline code spans: each is stashed behind a placeholder, the transform runs\n * on the rest, then the originals are restored before the markdown reaches\n * react-markdown. Without this, the currency / display-math passes would\n * rewrite literal `$`/`$$` that authors put inside code samples (e.g. a fenced\n * block containing `price = $value`). The placeholder is purely transient (it\n * never reaches the markdown parser) and contains no `$`, so the passes ignore\n * it.\n */\nconst withProtectedCode = (\n markdown: string,\n transform: (input: string) => string\n): string => {\n const stash: string[] = [];\n const tokenized = markdown.replaceAll(\n /```[\\s\\S]*?```|`[^`\\n]*`/g,\n (segment) => {\n const token = `__CODE_SEG_${stash.length}__`;\n stash.push(segment);\n return token;\n }\n );\n return transform(tokenized).replaceAll(\n /__CODE_SEG_(\\d+)__/g,\n (_match, index: string) => stash[Number(index)]\n );\n};\n\nconst preprocessMarkdown = (content: string): string =>\n withProtectedCode(stripInvisibleChars(content), (safe) =>\n reflowDisplayMath(protectCurrencyInlineMath(safe))\n );\n\n/**\n * MarkdownMathRenderer - Renders Markdown content with embedded LaTeX math.\n *\n * Used for AI-generated questions and resolutions, which arrive as Markdown\n * (`**bold**`, `#### headings`, `* lists`, paragraphs) mixed with LaTeX\n * (`$...$` inline, `$$...$$` display). Built on `react-markdown` with\n * `remark-gfm` (tables/lists), `remark-math` + `rehype-katex` (math).\n *\n * SECURITY: raw HTML is intentionally NOT enabled (no `rehype-raw`). This\n * renderer only receives content classified as Markdown (no HTML tags) by\n * `isLikelyMarkdown`; HTML content keeps flowing through `HtmlMathRenderer`,\n * which sanitizes it. Adding raw-HTML support here would reintroduce an XSS\n * vector and requires a dedicated sanitization pipeline + security review.\n */\nconst MarkdownMathRenderer = forwardRef<\n HTMLDivElement,\n MarkdownMathRendererProps\n>(({ content, className, style, testId }, ref) => {\n const sharedClassName = cn(\n 'leading-relaxed',\n // Paragraph spacing\n '[&_p]:my-2 [&_p:first-child]:mt-0 [&_p:last-child]:mb-0',\n // Headings\n '[&_h1]:text-xl [&_h1]:font-bold [&_h1]:mt-3 [&_h1]:mb-2',\n '[&_h2]:text-lg [&_h2]:font-bold [&_h2]:mt-3 [&_h2]:mb-2',\n '[&_h3]:text-base [&_h3]:font-semibold [&_h3]:mt-2.5 [&_h3]:mb-1.5',\n '[&_h4]:text-base [&_h4]:font-semibold [&_h4]:mt-2.5 [&_h4]:mb-1.5',\n '[&_h5]:font-semibold [&_h6]:font-semibold',\n // Lists\n '[&_ul]:list-disc [&_ul]:pl-5 [&_ul]:my-2',\n '[&_ol]:list-decimal [&_ol]:pl-5 [&_ol]:my-2',\n '[&_li]:my-1 [&_li>ul]:my-1 [&_li>ol]:my-1',\n // Text formatting\n '[&_b]:font-bold [&_strong]:font-bold',\n '[&_i]:italic [&_em]:italic',\n '[&_u]:underline',\n '[&_blockquote]:border-l-4 [&_blockquote]:border-border-200 [&_blockquote]:pl-3 [&_blockquote]:text-text-700',\n '[&_code]:rounded [&_code]:bg-background-100 [&_code]:px-1 [&_code]:py-0.5 [&_code]:text-sm',\n // Hide the KaTeX MathML accessibility layer visually (still readable to\n // screen readers). Tailwind preflight overrides KaTeX's default clip\n // rule, so without this the MathML layer duplicates every formula as\n // raw text next to the visual render.\n '[&_.katex-mathml]:sr-only',\n // Display math spacing\n '[&_.katex-display]:my-2.5',\n // Tables (GFM)\n '[&_table]:border-collapse [&_table]:w-full [&_table]:my-2.5 [&_table]:table-auto',\n '[&_table_td]:border [&_table_td]:border-border-200 [&_table_td]:p-2 [&_table_td]:min-w-[50px] [&_table_td]:align-top',\n '[&_table_th]:border [&_table_th]:border-border-200 [&_table_th]:p-2 [&_table_th]:min-w-[50px] [&_table_th]:align-top [&_table_th]:bg-background-50 [&_table_th]:font-semibold',\n // Images and links\n '[&_img]:max-w-full [&_img]:h-auto [&_img]:rounded-md [&_img]:my-2',\n '[&_a]:text-primary-500 [&_a]:underline [&_a:hover]:text-primary-600',\n className\n );\n\n return (\n <div\n ref={ref}\n className={sharedClassName}\n style={style}\n data-testid={testId}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n >\n {preprocessMarkdown(content)}\n </ReactMarkdown>\n </div>\n );\n});\n\nMarkdownMathRenderer.displayName = 'MarkdownMathRenderer';\n\nexport default memo(MarkdownMathRenderer);\n","/**\n * Utilities for processing HTML content with LaTeX math expressions\n */\n\nexport interface MathPart {\n type: 'text' | 'math' | 'block-math';\n content: string;\n latex?: string;\n}\n\n/**\n * Generates a random ID for placeholder uniqueness\n * Uses crypto.randomUUID() (Web Crypto API - available in all modern browsers)\n */\nconst generateSecureRandomId = (): string => {\n return crypto.randomUUID();\n};\n\n/**\n * Cleans LaTeX string from invisible characters and decodes HTML entities\n * that the editor saved in place of math operators.\n *\n * Why decode here: KaTeX is a LaTeX parser, not an HTML parser. If the\n * source has `&lt;`/`&gt;` (because the editor HTML-escaped them on save)\n * KaTeX throws \"Expected 'EOF', got '&'\". `&lt;`/`&gt;` map to the\n * equivalent `\\lt`/`\\gt` commands. `&amp;` decodes back to a bare `&` \\u2014\n * NOT `\\&` \\u2014 because in LaTeX `&` is the alignment character (used by\n * `\\begin{align}`, matrices, etc.); rewriting it to `\\&` would break\n * alignment and stop already-escaped `\\&` from round-tripping.\n */\nexport const cleanLatex = (str: string): string => {\n return str\n .replaceAll(/[\\u200B-\\u200D\\uFEFF]/g, '')\n .replaceAll(/&amp;lt;|&lt;/gi, String.raw`\\lt `)\n .replaceAll(/&amp;gt;|&gt;/gi, String.raw`\\gt `)\n .replaceAll(/&amp;amp;|&amp;/gi, '&')\n .trim();\n};\n\n/**\n * Heuristic that flags a string as \"likely real LaTeX math\" vs prose.\n * Used to reject `$...$` blocks that wrap regular text \\u2014 typically\n * happens when authors type `$` as a currency symbol and the renderer\n * pairs unrelated occurrences as math delimiters, sending Portuguese\n * prose to KaTeX (which then renders each letter as a math variable).\n *\n * Approach:\n * - Backslash commands / sub-super / grouping braces \\u2192 definitely math.\n * - Otherwise, treat it as PROSE only when it contains 2+ real words\n * (runs of 3+ letters). A sentence like \"15,00 pelo custo fixo\" has\n * many such words; genuine math \\u2014 `x = 1`, `a + b`, `1 < 2`, `f0`,\n * even a lone `abc` \\u2014 does not. This keeps normal spaced equations\n * rendering while still rejecting currency-`$` prose.\n */\nexport const looksLikeLatex = (str: string): boolean => {\n if (/[\\\\^_{}]/.test(str)) return true;\n const words = str.match(/[a-zA-Z]{3,}/g);\n if (words && words.length >= 2) return false;\n return true;\n};\n\n/**\n * HTML element names the backoffice RichEditor emits. Kept as a Set (instead\n * of a long regex alternation) so the tag-detection regex below stays simple\n * and cheap to reason about.\n */\nconst HTML_TAG_NAMES = new Set([\n 'p',\n 'div',\n 'span',\n 'br',\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 's',\n 'ul',\n 'ol',\n 'li',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'a',\n 'img',\n 'table',\n 'thead',\n 'tbody',\n 'tfoot',\n 'tr',\n 'td',\n 'th',\n 'blockquote',\n 'pre',\n 'code',\n 'sub',\n 'sup',\n 'font',\n 'latex',\n]);\n\n/**\n * True when `content` contains a real HTML element tag (open or close) whose\n * name is one the editor produces. A single generic regex captures any\n * `<tag`/`</tag` candidate; membership is then checked against the Set, which\n * keeps the regex trivial and avoids a giant alternation.\n */\nconst containsHtmlTag = (content: string): boolean => {\n for (const match of content.matchAll(/<\\/?([a-z][a-z0-9]*)/gi)) {\n if (HTML_TAG_NAMES.has(match[1].toLowerCase())) return true;\n }\n return false;\n};\n\n/**\n * Heuristic that decides whether `content` is Markdown (as opposed to the\n * HTML the backoffice RichEditor produces). AI-generated questions and\n * resolutions arrive as Markdown + LaTeX (`**bold**`, `#### heading`,\n * `* lists`, `$...$`, `$$...$$`), whereas the editor stores HTML (`<p>`,\n * `<b>`, `<span class=\"math-formula\" data-latex=\"...\">`). The two sources are\n * cleanly separable, so we bias toward the proven HTML path:\n *\n * - If any real HTML element tag is present we return `false` and let\n * `HtmlMathRenderer` handle it exactly as before (math-formula spans,\n * currency heuristic, katex-error recovery, sanitization).\n * - Otherwise we return `true` only when an unmistakable Markdown marker is\n * present (ATX heading, bold, bullet/ordered list, GFM table, or a paragraph\n * break), which is what breaks today: Markdown rendered as HTML shows the raw\n * `**`/`####`/`*` tokens and collapses line breaks.\n *\n * Regex note: line-anchored signals use the `m` flag with `^` and restrict\n * horizontal whitespace to `[ \\t]` (never `\\s`, which also matches `\\n`). This\n * keeps each quantifier on a single line and avoids the super-linear\n * backtracking that `(?:^|\\n)\\s*…\\s+` can trigger across newlines.\n */\nexport const isLikelyMarkdown = (content: string): boolean => {\n if (!content) return false;\n\n // Presence of real HTML element tags => treat as HTML (RichEditor output).\n if (containsHtmlTag(content)) return false;\n\n const MARKDOWN_SIGNALS = [\n /^#{1,6}[ \\t]+\\S/m, // ATX heading (#, ##, ... ######)\n /\\*\\*[^*\\n]+\\*\\*/, // bold\n /__[^_\\n]+__/, // bold (underscore)\n /^[ \\t]*[-*+][ \\t]+\\S/m, // bullet list\n /^[ \\t]*\\d+\\.[ \\t]+\\S/m, // ordered list\n /\\|[ \\t]*:?-+:?[ \\t]*\\|/, // GFM table delimiter row (|---|---|)\n /\\n\\n/, // paragraph break (only reached when no HTML tag is present)\n ];\n return MARKDOWN_SIGNALS.some((pattern) => pattern.test(content));\n};\n\n/**\n * Recovers usable LaTeX source from `<span class=\"katex-error\">` wrappers\n * that previous editor cycles persisted into the database. The error's\n * `title` attribute carries the original LaTeX after \"at position N: \".\n * Replaces each wrapper with `$LATEX$` so downstream patterns can render\n * it cleanly via KaTeX.\n *\n * No-op outside browser contexts (no `document`).\n */\nconst recoverFromKatexErrorSpans = (htmlContent: string): string => {\n if (\n typeof document === 'undefined' ||\n !/class=\"[^\"]*katex-error/i.test(htmlContent)\n ) {\n return htmlContent;\n }\n\n const tempContainer = document.createElement('div');\n tempContainer.innerHTML = htmlContent;\n\n const sanitizeRecoveredLatex = (raw: string): string =>\n raw\n // Strip combining marks KaTeX puts in error titles at the error pos\n .replaceAll(/[\\u0300-\\u036F]/g, '')\n // Drop truncated tag markers leftover from broken serialization.\n // Done while literal `<`/`>` are still present (before they get\n // mapped to LaTeX commands below).\n .replaceAll(/<\\/?[a-zA-Z][a-zA-Z0-9]*\\s*>?$/g, '')\n // Map comparison operators to equivalent LaTeX commands. We match\n // both the entity forms AND the literal `<`/`>` characters: the\n // `title` attribute is entity-decoded by the DOM when read, so we\n // often get literal `<`/`>`. Mapping them to `\\lt`/`\\gt` also avoids\n // re-encoding to `&lt;`/`&gt;` on DOM serialization (which would make\n // `looksLikeLatex` reject the recovered block as non-math).\n // `&amp;` decodes to a bare `&` (the LaTeX alignment character), not\n // `\\&`, so `\\begin{align}` environments survive recovery.\n .replaceAll(/&amp;lt;|&lt;|</gi, String.raw`\\lt `)\n .replaceAll(/&amp;gt;|&gt;|>/gi, String.raw`\\gt `)\n .replaceAll(/&amp;amp;|&amp;/gi, '&')\n .trim();\n\n Array.from(tempContainer.querySelectorAll('.katex-error')).forEach(\n (errorNode) => {\n if (!tempContainer.contains(errorNode)) return;\n\n const title = errorNode.getAttribute('title') || '';\n // Note: no `\\s*` before the capture group — `\\s*(.+)` would let\n // whitespace be split ambiguously between the two, causing\n // super-linear backtracking (ReDoS). The capture is trimmed by\n // sanitizeRecoveredLatex below instead.\n const positionMatch = /at position\\s+\\d+:(.+)$/.exec(title);\n let recovered = positionMatch ? positionMatch[1] : '';\n\n if (!recovered) {\n // Fallback: collect from inner <annotation> elements, skipping the\n // visual `katex-html` layer to avoid duplicating Unicode glyphs.\n const parts: string[] = [];\n const walk = (n: Node) => {\n if (n.nodeType === Node.TEXT_NODE) {\n parts.push(n.textContent || '');\n return;\n }\n if (n.nodeType !== Node.ELEMENT_NODE) return;\n const el = n as Element;\n if (el.tagName.toLowerCase() === 'annotation') {\n parts.push(el.textContent || '');\n return;\n }\n if (el.classList.contains('katex-html')) return;\n Array.from(el.childNodes).forEach(walk);\n };\n Array.from(errorNode.childNodes).forEach(walk);\n recovered = parts.join(' ');\n }\n\n recovered = sanitizeRecoveredLatex(recovered);\n if (recovered) {\n errorNode.replaceWith(document.createTextNode(`$${recovered}$`));\n } else {\n errorNode.remove();\n }\n }\n );\n\n return tempContainer.innerHTML;\n};\n\n/**\n * Decodes `\\$` escape sequences to literal `$` characters. Applied only to\n * text fragments outside math blocks \\u2014 the `(?<!\\\\)` lookbehind in the\n * `$...$` matcher already skipped these, but the `\\` is still in the output\n * unless we decode it. Without this, currency strings like `R\\$ 130,00`\n * render with a visible backslash.\n */\nconst decodeDollarEscapes = (text: string): string =>\n text.replaceAll(String.raw`\\$`, '$');\n\n/**\n * Dangerous attributes that should be removed for XSS protection\n */\nconst DANGEROUS_ATTRIBUTES = new Set([\n 'contenteditable',\n 'srcdoc',\n 'formaction',\n 'xlink:href',\n]);\n\n/**\n * Dangerous URI schemes that should be removed from href/src attributes\n */\nconst DANGEROUS_URI_PATTERN = /^\\s*(javascript|vbscript|data):/i;\n\n/**\n * Sanitizes HTML content for safe display\n * Removes event handlers, dangerous attributes, script/style tags, and javascript: URIs\n */\nexport const sanitizeHtmlForDisplay = (htmlContent: string): string => {\n if (!htmlContent) return htmlContent;\n\n // Create a temporary div to parse HTML\n if (typeof document === 'undefined') {\n // Server-side: use regex-based sanitization as fallback\n let sanitized = htmlContent;\n // Remove script tags\n sanitized = sanitized.replaceAll(\n /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n ''\n );\n // Remove style tags\n sanitized = sanitized.replaceAll(\n /<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>/gi,\n ''\n );\n // Remove on* event handlers (split into separate patterns to avoid ReDoS)\n sanitized = sanitized.replaceAll(/ on[a-z]+=\"[^\"]*\"/gi, '');\n sanitized = sanitized.replaceAll(/ on[a-z]+='[^']*'/gi, '');\n sanitized = sanitized.replaceAll(/ on[a-z]+=[^\\s>\"']+/gi, '');\n // Remove dangerous URI schemes (javascript, vbscript, data) - matching client-side DANGEROUS_URI_PATTERN\n sanitized = sanitized.replaceAll(\n / href=\"(?:javascript|vbscript|data):[^\"]*\"/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / href='(?:javascript|vbscript|data):[^']*'/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / src=\"(?:javascript|vbscript|data):[^\"]*\"/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / src='(?:javascript|vbscript|data):[^']*'/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / action=\"(?:javascript|vbscript|data):[^\"]*\"/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / action='(?:javascript|vbscript|data):[^']*'/gi,\n ''\n );\n return sanitized;\n }\n\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = htmlContent;\n\n // Remove script and style tags entirely\n const dangerousTags = tempDiv.querySelectorAll(\n 'script, style, iframe, object, embed'\n );\n dangerousTags.forEach((element) => element.remove());\n\n // Process all elements\n const allElements = tempDiv.querySelectorAll('*');\n allElements.forEach((element) => {\n // Get all attribute names\n const attributeNames = element.getAttributeNames();\n\n attributeNames.forEach((attrName) => {\n const lowerAttrName = attrName.toLowerCase();\n\n // Remove all on* event handler attributes (onclick, onerror, onload, etc.)\n if (lowerAttrName.startsWith('on')) {\n element.removeAttribute(attrName);\n return;\n }\n\n // Remove dangerous attributes\n if (DANGEROUS_ATTRIBUTES.has(lowerAttrName)) {\n element.removeAttribute(attrName);\n return;\n }\n\n // Check href, src, and action for dangerous URIs\n if (\n lowerAttrName === 'href' ||\n lowerAttrName === 'src' ||\n lowerAttrName === 'action'\n ) {\n const value = element.getAttribute(attrName);\n if (value && DANGEROUS_URI_PATTERN.test(value)) {\n element.removeAttribute(attrName);\n }\n }\n });\n });\n\n return tempDiv.innerHTML;\n};\n\n/**\n * Processes HTML content and extracts math expressions\n * Returns an array of parts (text and math) for rendering\n */\nexport const processHtmlWithMath = (htmlContent: string): MathPart[] => {\n if (!htmlContent) return [];\n\n // Pre-pass: recover original LaTeX from any `katex-error` wrappers that\n // older editor saves left in the content. This turns persisted error HTML\n // into clean `$LATEX$` strings so the steps below can render them.\n let processedContent = recoverFromKatexErrorSpans(htmlContent);\n const parts: MathPart[] = [];\n\n // Generate unique sentinel per call to avoid collision with content\n const sentinel = `__MATH_${generateSecureRandomId()}_`;\n\n // Step 1: Handle math-formula spans (from the editor)\n const mathFormulaPattern =\n /<span[^>]*class=\"math-formula\"[^>]*data-latex=\"([^\"]*)\"[^>]*>[\\s\\S]*?<\\/span>/g;\n processedContent = processedContent.replaceAll(\n mathFormulaPattern,\n (match, latex) => {\n const isDisplayMode = match.includes('data-display-mode=\"true\"');\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: isDisplayMode ? 'block-math' : 'math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 2: Handle wrapped math expressions (from math modal - legacy)\n const wrappedMathPattern =\n /<span[^>]*class=\"math-expression\"[^>]*data-math=\"([^\"]*)\"[^>]*>.*?<\\/span>/g;\n processedContent = processedContent.replaceAll(\n wrappedMathPattern,\n (match, latex) => {\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 3: Handle raw $$...$$ expressions (display mode) - BEFORE single $\n const doubleDollarPattern = /(?<!\\\\)\\$\\$([\\s\\S]+?)\\$\\$/g;\n processedContent = processedContent.replaceAll(\n doubleDollarPattern,\n (match, latex) => {\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'block-math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 4: Handle single $...$ expressions for inline math.\n // Skip matches whose content doesn't look like LaTeX — those are usually\n // currency `$` symbols pairing up across prose (e.g. `R$ 15,00 ... R$ 42,00`)\n // and sending Portuguese text to KaTeX produces gibberish output.\n const singleDollarPattern = /(?<!\\\\)\\$([\\s\\S]+?)\\$/g;\n processedContent = processedContent.replaceAll(\n singleDollarPattern,\n (match, latex) => {\n if (!looksLikeLatex(latex)) return match;\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 5: Handle <latex>...</latex> tags for inline math\n const latexTagPattern =\n /(?:<latex>|&lt;latex&gt;)([\\s\\S]*?)(?:<\\/latex>|&lt;\\/latex&gt;)/g;\n processedContent = processedContent.replaceAll(\n latexTagPattern,\n (match, latex) => {\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 6: Handle standalone LaTeX environments (align, equation, pmatrix, etc.)\n const latexEnvPattern = /\\\\begin\\{([^}]+)\\}([\\s\\S]*?)\\\\end\\{\\1\\}/g;\n processedContent = processedContent.replaceAll(latexEnvPattern, (match) => {\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'block-math',\n content: match,\n latex: cleanLatex(match),\n });\n return placeholder;\n });\n\n // Step 7: Split remaining content by placeholders\n const finalParts: MathPart[] = [];\n let currentIndex = 0;\n // Escape sentinel for regex (though it should be safe alphanumeric)\n const escapedSentinel = sentinel.replaceAll(\n /[.*+?^${}()|[\\]\\\\]/g,\n String.raw`\\$&`\n );\n const placeholderPattern = new RegExp(\n String.raw`${escapedSentinel}(\\d+)__`,\n 'g'\n );\n let match;\n\n while ((match = placeholderPattern.exec(processedContent)) !== null) {\n // Add text before math\n if (match.index > currentIndex) {\n finalParts.push({\n type: 'text',\n content: decodeDollarEscapes(\n processedContent.slice(currentIndex, match.index)\n ),\n });\n }\n\n // Add math expression\n const mathIndex = Number.parseInt(match[1], 10);\n if (parts[mathIndex]) {\n finalParts.push(parts[mathIndex]);\n }\n\n currentIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (currentIndex < processedContent.length) {\n finalParts.push({\n type: 'text',\n content: decodeDollarEscapes(processedContent.slice(currentIndex)),\n });\n }\n\n return finalParts;\n};\n\n/**\n * Checks if content contains any math expressions\n */\nexport const containsMath = (content: string): boolean => {\n if (!content) return false;\n\n // Check for various math patterns\n const patterns = [\n /\\$\\$[\\s\\S]+?\\$\\$/, // Display mode $$...$$\n /(?<!\\\\)\\$[\\s\\S]+?\\$/, // Inline mode $...$\n /<span[^>]*class=\"math-formula\"/, // Editor spans\n /<span[^>]*class=\"math-expression\"/, // Legacy spans\n /<latex>|&lt;latex&gt;/, // LaTeX tags\n /\\\\begin\\{[^}]+\\}/, // LaTeX environments\n ];\n\n return patterns.some((pattern) => pattern.test(content));\n};\n\n/**\n * Extracts plain text from HTML content (removes all tags and LaTeX notation)\n */\nexport const stripHtml = (htmlContent: string): string => {\n if (!htmlContent) return '';\n\n let content = htmlContent;\n\n // Remove math-formula spans (keep nothing as the LaTeX is in data attribute)\n content = content.replaceAll(\n /<span[^>]*class=\"math-formula\"[^>]*>[\\s\\S]*?<\\/span>/g,\n ''\n );\n\n // Remove math-expression spans (legacy)\n content = content.replaceAll(\n /<span[^>]*class=\"math-expression\"[^>]*>[\\s\\S]*?<\\/span>/g,\n ''\n );\n\n // Remove $$...$$ block math\n content = content.replaceAll(/\\$\\$[\\s\\S]+?\\$\\$/g, '');\n\n // Remove $...$ inline math\n content = content.replaceAll(/\\$[^$]+\\$/g, '');\n\n // Remove <latex>...</latex> tags\n content = content.replaceAll(\n /(?:<latex>|&lt;latex&gt;)[\\s\\S]*?(?:<\\/latex>|&lt;\\/latex&gt;)/g,\n ''\n );\n\n // Remove LaTeX environments like \\begin{...}...\\end{...}\n // Using non-greedy match without backreference to avoid ReDoS vulnerability\n content = content.replaceAll(\n /\\\\begin\\{[a-zA-Z*]+\\}[\\s\\S]*?\\\\end\\{[a-zA-Z*]+\\}/g,\n ''\n );\n\n // Remove HTML tags\n if (typeof document === 'undefined') {\n // Server-side: use regex (excluding both < and > prevents quadratic backtracking)\n return content.replaceAll(/<[^<>]*>/g, '').trim();\n }\n\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = content;\n return (tempDiv.textContent || tempDiv.innerText || '').trim();\n};\n","import {\n InputHTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n} from 'react';\nimport Text from '../Text/Text';\nimport { Check, Minus } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * CheckBox size variants\n */\ntype CheckBoxSize = 'small' | 'medium' | 'large';\n\n/**\n * CheckBox visual state\n */\ntype CheckBoxState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n checkbox: 'w-4 h-4', // 16px x 16px\n textSize: 'sm' as const,\n spacing: 'gap-1.5', // 6px\n borderWidth: 'border-2',\n iconSize: 14, // pixels for Phosphor icons\n labelHeight: 'h-[21px]',\n },\n medium: {\n checkbox: 'w-5 h-5', // 20px x 20px\n textSize: 'md' as const,\n spacing: 'gap-2', // 8px\n borderWidth: 'border-2',\n iconSize: 16, // pixels for Phosphor icons\n labelHeight: 'h-6',\n },\n large: {\n checkbox: 'w-6 h-6', // 24px x 24px\n textSize: 'lg' as const,\n spacing: 'gap-2', // 8px\n borderWidth: 'border-[3px]', // 3px border\n iconSize: 20, // pixels for Phosphor icons\n labelHeight: 'h-[27px]',\n },\n} as const;\n\n/**\n * Base checkbox styling classes using design system colors\n */\nconst BASE_CHECKBOX_CLASSES =\n 'rounded border cursor-pointer transition-all duration-200 flex items-center justify-center focus:outline-none';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n unchecked: 'border-border-400 bg-background hover:border-border-500',\n checked:\n 'border-primary-950 bg-primary-950 text-text hover:border-primary-800 hover:bg-primary-800',\n },\n hovered: {\n unchecked: 'border-border-500 bg-background',\n checked: 'border-primary-800 bg-primary-800 text-text',\n },\n focused: {\n unchecked:\n 'border-indicator-info bg-background ring-2 ring-indicator-info/20',\n checked:\n 'border-indicator-info bg-primary-950 text-text ring-2 ring-indicator-info/20',\n },\n invalid: {\n unchecked: 'border-error-700 bg-background hover:border-error-600',\n checked: 'border-error-700 bg-primary-950 text-text',\n },\n disabled: {\n unchecked: 'border-border-400 bg-background cursor-not-allowed opacity-40',\n checked:\n 'border-primary-600 bg-primary-600 text-text cursor-not-allowed opacity-40',\n },\n} as const;\n\n/**\n * CheckBox component props interface\n */\nexport type CheckBoxProps = {\n /** Label text to display next to the checkbox */\n label?: ReactNode;\n /** Size variant of the checkbox */\n size?: CheckBoxSize;\n /** Visual state of the checkbox */\n state?: CheckBoxState;\n /** Indeterminate state for partial selections */\n indeterminate?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperText?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'>;\n\n/**\n * CheckBox component for Analytica Ensino platforms\n *\n * A checkbox component with essential states, sizes and themes.\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic checkbox\n * <CheckBox label=\"Option\" />\n *\n * // Small size\n * <CheckBox size=\"small\" label=\"Small option\" />\n *\n * // Invalid state\n * <CheckBox state=\"invalid\" label=\"Required field\" />\n *\n * // Disabled state\n * <CheckBox disabled label=\"Disabled option\" />\n * ```\n */\nconst CheckBox = forwardRef<HTMLInputElement, CheckBoxProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n indeterminate = false,\n errorMessage,\n helperText,\n className = '',\n labelClassName = '',\n checked: checkedProp,\n disabled,\n id,\n onChange,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `checkbox-${generatedId}`;\n\n // Handle controlled vs uncontrolled behavior\n const [internalChecked, setInternalChecked] = useState(false);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalChecked(event.target.checked);\n }\n onChange?.(event);\n };\n\n // Determine current state based on props\n const currentState = disabled ? 'disabled' : state;\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Determine checkbox visual variant\n const checkVariant = checked || indeterminate ? 'checked' : 'unchecked';\n\n // Get styling classes\n const stylingClasses = STATE_CLASSES[currentState][checkVariant];\n\n // Special border width handling for focused/hovered states and large size\n const borderWidthClass =\n state === 'focused' || (state === 'hovered' && size === 'large')\n ? 'border-[3px]'\n : sizeClasses.borderWidth;\n\n // Get final checkbox classes\n const checkboxClasses = cn(\n BASE_CHECKBOX_CLASSES,\n sizeClasses.checkbox,\n borderWidthClass,\n stylingClasses,\n className\n );\n\n // Render appropriate icon based on state\n const renderIcon = () => {\n if (indeterminate) {\n return (\n <Minus\n size={sizeClasses.iconSize}\n weight=\"bold\"\n color=\"currentColor\"\n />\n );\n }\n\n if (checked) {\n return (\n <Check\n size={sizeClasses.iconSize}\n weight=\"bold\"\n color=\"currentColor\"\n />\n );\n }\n\n return null;\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.spacing,\n disabled ? 'opacity-40' : ''\n )}\n >\n {/* Hidden native input for accessibility and form submission */}\n <input\n ref={ref}\n type=\"checkbox\"\n id={inputId}\n checked={checked}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...props}\n />\n\n {/* Custom styled checkbox */}\n <label htmlFor={inputId} className={checkboxClasses}>\n {/* Show appropriate icon based on state */}\n {renderIcon()}\n </label>\n\n {/* Label text */}\n {label && (\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.labelHeight\n )}\n >\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"normal\"\n className={cn(\n 'cursor-pointer select-none leading-[150%] flex items-center font-roboto',\n labelClassName\n )}\n >\n {label}\n </Text>\n </div>\n )}\n </div>\n\n {/* Error message */}\n {errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5\"\n color=\"text-error-600\"\n >\n {errorMessage}\n </Text>\n )}\n\n {/* Helper text */}\n {helperText && !errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5\"\n color=\"text-text-500\"\n >\n {helperText}\n </Text>\n )}\n </div>\n );\n }\n);\n\nCheckBox.displayName = 'CheckBox';\n\nexport default CheckBox;\n","import { HTMLAttributes } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Divider component props interface\n */\ntype DividerProps = {\n /** Orientation of the divider */\n orientation?: 'horizontal' | 'vertical';\n /** Additional CSS classes to apply */\n className?: string;\n} & HTMLAttributes<HTMLHRElement>;\n\n/**\n * Divider component for Analytica Ensino platforms\n *\n * A simple divider component that creates a visual separation between content sections.\n * Can be used both horizontally and vertically.\n *\n * @param orientation - The orientation of the divider (horizontal or vertical)\n * @param className - Additional CSS classes\n * @param props - All other standard hr HTML attributes\n * @returns A styled divider element\n *\n * @example\n * ```tsx\n * <Divider orientation=\"horizontal\" />\n * <Divider orientation=\"vertical\" className=\"h-8\" />\n * ```\n */\nconst Divider = ({\n orientation = 'horizontal',\n className = '',\n ...props\n}: DividerProps) => {\n const baseClasses = 'bg-border-200 border-0';\n\n const orientationClasses = {\n horizontal: 'w-full h-px',\n vertical: 'h-full w-px',\n };\n\n return (\n <hr\n className={cn(baseClasses, orientationClasses[orientation], className)}\n aria-orientation={orientation}\n {...props}\n />\n );\n};\n\nexport default Divider;\n","import {\n InputHTMLAttributes,\n HTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n useEffect,\n useRef,\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n} from 'react';\nimport { create, StoreApi, useStore } from 'zustand';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Radio size variants\n */\ntype RadioSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * Radio visual state\n */\ntype RadioState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n radio: 'w-5 h-5',\n textSize: 'sm' as const,\n spacing: 'gap-1.5',\n borderWidth: 'border-2',\n dotSize: 'w-2.5 h-2.5',\n labelHeight: 'h-5',\n },\n medium: {\n radio: 'w-6 h-6',\n textSize: 'md' as const,\n spacing: 'gap-2',\n borderWidth: 'border-2',\n dotSize: 'w-3 h-3',\n labelHeight: 'h-6',\n },\n large: {\n radio: 'w-7 h-7',\n textSize: 'lg' as const,\n spacing: 'gap-2',\n borderWidth: 'border-2',\n dotSize: 'w-3.5 h-3.5',\n labelHeight: 'h-7',\n },\n extraLarge: {\n radio: 'w-8 h-8',\n textSize: 'xl' as const,\n spacing: 'gap-3',\n borderWidth: 'border-2',\n dotSize: 'w-4 h-4',\n labelHeight: 'h-8',\n },\n} as const;\n\n/**\n * Focused state maintains the same sizes as default state\n * Only adds wrapper styling, does not change radio/dot sizes\n */\n\n/**\n * Base radio styling classes using design system colors\n */\nconst BASE_RADIO_CLASSES =\n 'rounded-full border cursor-pointer transition-all duration-200 flex items-center justify-center focus:outline-none';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n unchecked: 'border-border-400 bg-background hover:border-border-500',\n checked: 'border-primary-950 bg-background hover:border-primary-800',\n },\n hovered: {\n unchecked: 'border-border-500 bg-background',\n checked: 'border-info-700 bg-background',\n },\n focused: {\n unchecked: 'border-border-400 bg-background',\n checked: 'border-primary-950 bg-background',\n },\n invalid: {\n unchecked: 'border-border-400 bg-background',\n checked: 'border-primary-950 bg-background',\n },\n disabled: {\n unchecked: 'border-border-400 bg-background cursor-not-allowed',\n checked: 'border-primary-950 bg-background cursor-not-allowed',\n },\n} as const;\n\n/**\n * Dot styling classes for the inner dot when checked\n */\nconst DOT_CLASSES = {\n default: 'bg-primary-950',\n hovered: 'bg-info-700',\n focused: 'bg-primary-950',\n invalid: 'bg-primary-950',\n disabled: 'bg-primary-950',\n} as const;\n\n/**\n * Radio component props interface\n */\nexport type RadioProps = {\n /** Label text to display next to the radio */\n label?: ReactNode;\n /** Size variant of the radio */\n size?: RadioSize;\n /** Visual state of the radio */\n state?: RadioState;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperText?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Radio group name */\n name?: string;\n /** Radio value */\n value?: string;\n /** Default checked state for uncontrolled radios */\n defaultChecked?: boolean;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type' | 'defaultChecked'\n>;\n\n/**\n * Radio component for Analytica Ensino platforms\n *\n * A radio button component with essential states, sizes and themes.\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic radio\n * <Radio name=\"option\" value=\"1\" label=\"Option 1\" />\n *\n * // Small size\n * <Radio size=\"small\" name=\"option\" value=\"2\" label=\"Small option\" />\n *\n * // Invalid state\n * <Radio state=\"invalid\" name=\"option\" value=\"3\" label=\"Required field\" />\n *\n * // Disabled state\n * <Radio disabled name=\"option\" value=\"4\" label=\"Disabled option\" />\n *\n * // Default checked (uncontrolled)\n * <Radio defaultChecked name=\"option\" value=\"5\" label=\"Initially checked\" />\n * ```\n */\nconst Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n errorMessage,\n helperText,\n className = '',\n labelClassName = '',\n checked: checkedProp,\n defaultChecked = false,\n disabled,\n id,\n name,\n value,\n onChange,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `radio-${generatedId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Handle controlled vs uncontrolled behavior\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newChecked = event.target.checked;\n\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n\n // Prevent automatic scroll when input changes\n if (event.target) {\n event.target.blur();\n }\n\n onChange?.(event);\n };\n\n // Determine current state based on props\n const currentState = disabled ? 'disabled' : state;\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Focused state maintains original sizes, only adds wrapper\n const actualRadioSize = sizeClasses.radio;\n const actualDotSize = sizeClasses.dotSize;\n\n // Determine radio visual variant\n const radioVariant = checked ? 'checked' : 'unchecked';\n\n // Get styling classes\n const stylingClasses = STATE_CLASSES[currentState][radioVariant];\n\n // Border width logic - consistent across all states and sizes\n const getBorderWidth = () => {\n if (currentState === 'focused') {\n return 'border-2';\n }\n return sizeClasses.borderWidth;\n };\n\n const borderWidthClass = getBorderWidth();\n\n // Get final radio classes\n const radioClasses = cn(\n BASE_RADIO_CLASSES,\n actualRadioSize,\n borderWidthClass,\n stylingClasses,\n className\n );\n\n // Get dot classes\n const dotClasses = cn(\n actualDotSize,\n 'rounded-full',\n DOT_CLASSES[currentState],\n 'transition-all duration-200'\n );\n\n // Determine if wrapper is needed only for focused or invalid states\n const isWrapperNeeded =\n currentState === 'focused' || currentState === 'invalid';\n const wrapperBorderColor =\n currentState === 'focused'\n ? 'border-indicator-info'\n : 'border-indicator-error';\n\n // Determine text color based on state and checked status\n const getTextColor = () => {\n if (currentState === 'disabled') {\n return checked ? 'text-text-900' : 'text-text-600';\n }\n\n if (currentState === 'focused') {\n return 'text-text-900';\n }\n\n return checked ? 'text-text-900' : 'text-text-600';\n };\n\n // Determine cursor class based on disabled state\n const getCursorClass = () => {\n return currentState === 'disabled'\n ? 'cursor-not-allowed'\n : 'cursor-pointer';\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n 'flex flex-row items-center',\n isWrapperNeeded\n ? cn('p-1 border-2', wrapperBorderColor, 'rounded-lg gap-1.5')\n : sizeClasses.spacing,\n disabled ? 'opacity-40' : ''\n )}\n >\n {/* Hidden native input for accessibility and form submission */}\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"radio\"\n id={inputId}\n checked={checked}\n disabled={disabled}\n name={name}\n value={value}\n onChange={handleChange}\n className=\"sr-only\"\n style={{\n position: 'absolute',\n left: '-9999px',\n visibility: 'hidden',\n }}\n {...props}\n />\n\n {/* Custom styled radio */}\n <button\n type=\"button\"\n className={radioClasses}\n disabled={disabled}\n aria-pressed={checked}\n onClick={(e) => {\n // Prevent scroll when radio is clicked\n e.preventDefault();\n if (!disabled) {\n // Simulate click on hidden input\n if (inputRef.current) {\n inputRef.current.click();\n // Remove focus to prevent scroll behavior\n inputRef.current.blur();\n }\n }\n }}\n onKeyDown={(e) => {\n // Handle keyboard activation (Enter or Space)\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n if (inputRef.current) {\n inputRef.current.click();\n inputRef.current.blur();\n }\n }\n }}\n >\n {/* Show dot when checked */}\n {checked && <div className={dotClasses} />}\n </button>\n\n {/* Label text */}\n {label && (\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.labelHeight,\n 'flex-1 min-w-0'\n )}\n >\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"normal\"\n className={cn(\n getCursorClass(),\n 'select-none leading-normal flex items-center font-roboto truncate',\n labelClassName\n )}\n color={getTextColor()}\n >\n {label}\n </Text>\n </div>\n )}\n </div>\n\n {/* Error message */}\n {errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5 truncate\"\n color=\"text-error-600\"\n >\n {errorMessage}\n </Text>\n )}\n\n {/* Helper text */}\n {helperText && !errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5 truncate\"\n color=\"text-text-500\"\n >\n {helperText}\n </Text>\n )}\n </div>\n );\n }\n);\n\nRadio.displayName = 'Radio';\n\n/**\n * RadioGroup store interface\n */\ninterface RadioGroupStore {\n value: string;\n setValue: (value: string) => void;\n onValueChange?: (value: string) => void;\n disabled: boolean;\n name: string;\n}\n\ntype RadioGroupStoreApi = StoreApi<RadioGroupStore>;\n\n/**\n * Create a new RadioGroup store\n */\nconst createRadioGroupStore = (\n name: string,\n defaultValue: string,\n disabled: boolean,\n onValueChange?: (value: string) => void\n): RadioGroupStoreApi =>\n create<RadioGroupStore>((set, get) => ({\n value: defaultValue,\n setValue: (value) => {\n if (!get().disabled) {\n set({ value });\n get().onValueChange?.(value);\n }\n },\n onValueChange,\n disabled,\n name,\n }));\n\n/**\n * Hook to access RadioGroup store\n */\nexport const useRadioGroupStore = (externalStore?: RadioGroupStoreApi) => {\n if (!externalStore) {\n throw new Error('RadioGroupItem must be used within a RadioGroup');\n }\n return externalStore;\n};\n\n/**\n * Inject store into RadioGroupItem children\n */\nconst injectStore = (\n children: ReactNode,\n store: RadioGroupStoreApi\n): ReactNode =>\n Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n const typedChild = child as ReactElement<any>;\n const shouldInject = typedChild.type === RadioGroupItem;\n return cloneElement(typedChild, {\n ...(shouldInject ? { store } : {}),\n ...(typedChild.props.children\n ? { children: injectStore(typedChild.props.children, store) }\n : {}),\n });\n });\n\n/**\n * RadioGroup component props interface\n */\nexport type RadioGroupProps = {\n /** Current selected value */\n value?: string;\n /** Default selected value for uncontrolled usage */\n defaultValue?: string;\n /** Callback when selection changes */\n onValueChange?: (value: string) => void;\n /** Group name for all radios */\n name?: string;\n /** Disabled state for the entire group */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Children components */\n children: ReactNode;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'>;\n\n/**\n * RadioGroup component for flexible radio group composition\n *\n * Uses Zustand for state management with automatic store injection.\n * Allows complete control over layout and styling by composing with RadioGroupItem.\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"option1\" onValueChange={setValue}>\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option1\" id=\"r1\" />\n * <label htmlFor=\"r1\">Option 1</label>\n * </div>\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option2\" id=\"r2\" />\n * <label htmlFor=\"r2\">Option 2</label>\n * </div>\n * </RadioGroup>\n * ```\n */\nconst RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n value: propValue,\n defaultValue = '',\n onValueChange,\n name: propName,\n disabled = false,\n className = '',\n children,\n ...props\n },\n ref\n ) => {\n // Generate unique name if not provided\n const generatedId = useId();\n const name = propName || `radio-group-${generatedId}`;\n\n // Create store reference\n const storeRef = useRef<RadioGroupStoreApi>(null);\n storeRef.current ??= createRadioGroupStore(\n name,\n defaultValue,\n disabled,\n onValueChange\n );\n const store = storeRef.current;\n\n // Get store actions\n const { setValue } = useStore(store, (s) => s);\n\n // Call onValueChange with initial value\n useEffect(() => {\n const currentValue = store.getState().value;\n if (currentValue && onValueChange) {\n onValueChange(currentValue);\n }\n }, []); // Empty dependency array for mount only\n\n // Handle controlled value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setValue(propValue);\n }\n }, [propValue, setValue]);\n\n // Update disabled state\n useEffect(() => {\n store.setState({ disabled });\n }, [disabled, store]);\n\n return (\n <div\n ref={ref}\n className={className}\n role=\"radiogroup\"\n aria-label={name}\n {...props}\n >\n {injectStore(children, store)}\n </div>\n );\n }\n);\n\nRadioGroup.displayName = 'RadioGroup';\n\n/**\n * RadioGroupItem component props interface\n */\nexport type RadioGroupItemProps = {\n /** Value for this radio item */\n value: string;\n /** Optional label rendered next to the radio (parity with CheckBox/Radio APIs) */\n label?: ReactNode;\n /** CSS classes applied to the label */\n labelClassName?: string;\n /** Store reference (automatically injected by RadioGroup) */\n store?: RadioGroupStoreApi;\n /** Disabled state for this specific item */\n disabled?: boolean;\n /** Size variant */\n size?: RadioSize;\n /** Visual state */\n state?: RadioState;\n /** Additional CSS classes */\n className?: string;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'name' | 'value' | 'checked' | 'onChange' | 'size'\n>;\n\n/**\n * RadioGroupItem component for use within RadioGroup\n *\n * A radio button that works within RadioGroup context.\n * Accepts a `label` prop for the common case (parity with CheckBox/Radio).\n * When `label` is omitted, renders just the input for custom composition.\n *\n * @example\n * ```tsx\n * // With label (recommended)\n * <RadioGroup defaultValue=\"option1\">\n * <RadioGroupItem value=\"option1\" label=\"Option 1\" />\n * <RadioGroupItem value=\"option2\" label=\"Option 2\" />\n * </RadioGroup>\n *\n * // Without label - manual composition\n * <RadioGroup defaultValue=\"option1\">\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option1\" id=\"r1\" />\n * <label htmlFor=\"r1\">Custom layout</label>\n * </div>\n * </RadioGroup>\n * ```\n */\nconst RadioGroupItem = forwardRef<HTMLInputElement, RadioGroupItemProps>(\n (\n {\n value,\n label,\n labelClassName,\n store: externalStore,\n disabled: itemDisabled,\n size = 'medium',\n state = 'default',\n className = '',\n id,\n ...props\n },\n ref\n ) => {\n // Get store and state\n const store = useRadioGroupStore(externalStore);\n const {\n value: groupValue,\n setValue,\n disabled: groupDisabled,\n name,\n } = useStore(store);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `radio-item-${generatedId}`;\n\n // Determine states\n const isChecked = groupValue === value;\n const isDisabled = groupDisabled || itemDisabled;\n const currentState = isDisabled ? 'disabled' : state;\n\n // Use standard Radio component for consistency and simplicity\n return (\n <Radio\n ref={ref}\n id={inputId}\n name={name}\n value={value}\n checked={isChecked}\n disabled={isDisabled}\n size={size}\n state={currentState}\n className={className}\n label={label}\n labelClassName={labelClassName}\n onChange={(e) => {\n if (e.target.checked && !isDisabled) {\n setValue(value);\n }\n }}\n {...props}\n />\n );\n }\n);\n\nRadioGroupItem.displayName = 'RadioGroupItem';\n\nexport default Radio;\nexport { RadioGroup, RadioGroupItem };\n","import { ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Progress bar size variants\n */\ntype ProgressBarSize = 'small' | 'medium';\n\n/**\n * Progress bar color variants\n */\ntype ProgressBarVariant = 'blue' | 'green';\n\n/**\n * Progress bar layout variants\n */\ntype ProgressBarLayout = 'default' | 'stacked' | 'compact';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n container: 'h-1', // 4px height (h-1 = 4px in Tailwind)\n bar: 'h-1', // 4px height for the fill bar\n spacing: 'gap-2', // 8px gap between label and progress bar\n layout: 'flex-col', // vertical layout for small\n borderRadius: 'rounded-full', // 9999px border radius\n },\n medium: {\n container: 'h-2', // 8px height (h-2 = 8px in Tailwind)\n bar: 'h-2', // 8px height for the fill bar\n spacing: 'gap-2', // 8px gap between progress bar and label\n layout: 'flex-row items-center', // horizontal layout for medium\n borderRadius: 'rounded-lg', // 8px border radius\n },\n} as const;\n\n/**\n * Color configurations using design system colors\n */\nconst VARIANT_CLASSES = {\n blue: {\n background: 'bg-background-300', // Background track color (#D5D4D4)\n fill: 'bg-primary-700', // Blue for activity progress (#2271C4)\n },\n green: {\n background: 'bg-background-300', // Background track color (#D5D4D4)\n fill: 'bg-success-200', // Green for performance (#84D3A2)\n },\n} as const;\n\n/**\n * Type for size classes\n */\ntype SizeClassType = (typeof SIZE_CLASSES)[keyof typeof SIZE_CLASSES];\n\n/**\n * Type for variant classes\n */\ntype VariantClassType = (typeof VARIANT_CLASSES)[keyof typeof VARIANT_CLASSES];\n\n/**\n * Common props shared across all layout components\n */\ninterface BaseLayoutProps {\n className: string;\n label: ReactNode;\n showPercentage: boolean;\n showHitCount: boolean;\n labelClassName: string;\n percentageClassName: string;\n clampedValue: number;\n max: number;\n percentage: number;\n variantClasses: VariantClassType;\n}\n\n/**\n * Dimensions configuration for layouts\n */\ninterface LayoutDimensions {\n width: string;\n height: string;\n}\n\n/**\n * Props for StackedLayout component\n */\ninterface StackedLayoutProps extends BaseLayoutProps {\n dimensions: LayoutDimensions;\n}\n\n/**\n * Props for CompactLayout component\n */\ninterface CompactLayoutProps extends BaseLayoutProps {\n dimensions: LayoutDimensions;\n}\n\n/**\n * Props for DefaultLayout component\n */\ninterface DefaultLayoutProps {\n className: string;\n size: ProgressBarSize;\n sizeClasses: SizeClassType;\n variantClasses: VariantClassType;\n label: ReactNode;\n showPercentage: boolean;\n labelClassName: string;\n percentageClassName: string;\n clampedValue: number;\n max: number;\n percentage: number;\n}\n\n/**\n * ProgressBar component props interface\n */\nexport type ProgressBarProps = {\n /** Progress value between 0 and 100 */\n value: number;\n /** Maximum value (defaults to 100) */\n max?: number;\n /** Size variant of the progress bar */\n size?: ProgressBarSize;\n /** Color variant of the progress bar */\n variant?: ProgressBarVariant;\n /** Layout variant of the progress bar */\n layout?: ProgressBarLayout;\n /** Optional label to display */\n label?: ReactNode;\n /** Show percentage text */\n showPercentage?: boolean;\n /**\n * Show hit count (e.g., \"28 de 30\") instead of percentage\n *\n * PRIORITY: When both showHitCount and showPercentage are true,\n * showHitCount takes precedence (stacked and compact layouts only).\n * Default layout does not support showHitCount.\n */\n showHitCount?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Percentage text CSS classes */\n percentageClassName?: string;\n /** Custom width for stacked layout (defaults to w-[380px]) */\n stackedWidth?: string;\n /** Custom height for stacked layout (defaults to h-[35px]) */\n stackedHeight?: string;\n /** Custom width for compact layout (defaults to w-[131px]) */\n compactWidth?: string;\n /** Custom height for compact layout (defaults to h-[24px]) */\n compactHeight?: string;\n};\n\n/**\n * Helper function to calculate safe progress values\n */\nconst calculateProgressValues = (value: number, max: number) => {\n const safeValue = isNaN(value) ? 0 : value;\n const clampedValue = Math.max(0, Math.min(safeValue, max));\n const percentage = max === 0 ? 0 : (clampedValue / max) * 100;\n\n return { clampedValue, percentage };\n};\n\n/**\n * Helper function to determine if header content should be shown\n */\nconst shouldShowHeader = (\n label: ReactNode,\n showPercentage: boolean,\n showHitCount: boolean\n): boolean => {\n return !!(label || showPercentage || showHitCount);\n};\n\n/**\n * Centralized function to determine display priority and content\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n * 3. label (lowest priority) - displays custom label\n *\n * @param showHitCount - Whether to show hit count format\n * @param showPercentage - Whether to show percentage format\n * @param label - Custom label to display\n * @param clampedValue - Current progress value\n * @param max - Maximum progress value\n * @param percentage - Calculated percentage value\n * @returns Object with content type and formatted content\n */\nconst getDisplayPriority = (\n showHitCount: boolean,\n showPercentage: boolean,\n label: ReactNode,\n clampedValue: number,\n max: number,\n percentage: number\n) => {\n if (showHitCount) {\n return {\n type: 'hitCount' as const,\n content: `${Math.round(clampedValue)} de ${max}`,\n hasMetrics: true,\n };\n }\n\n if (showPercentage) {\n return {\n type: 'percentage' as const,\n content: `${Math.round(percentage)}%`,\n hasMetrics: true,\n };\n }\n\n return {\n type: 'label' as const,\n content: label,\n hasMetrics: false,\n };\n};\n\n/**\n * Parameters for compact layout configuration\n */\ninterface CompactLayoutConfigParams {\n showPercentage: boolean;\n showHitCount: boolean;\n percentage: number;\n clampedValue: number;\n max: number;\n label: ReactNode;\n percentageClassName: string;\n labelClassName: string;\n}\n\n/**\n * Helper function to get compact layout configuration\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n * 3. label (lowest priority) - displays custom label\n *\n * When both showHitCount and showPercentage are true, showHitCount takes precedence.\n */\nconst getCompactLayoutConfig = ({\n showPercentage,\n showHitCount,\n percentage,\n clampedValue,\n max,\n label,\n percentageClassName,\n labelClassName,\n}: CompactLayoutConfigParams) => {\n // Use centralized priority logic for consistency\n const displayPriority = getDisplayPriority(\n showHitCount,\n showPercentage,\n label,\n clampedValue,\n max,\n percentage\n );\n\n return {\n color: displayPriority.hasMetrics ? 'text-primary-600' : 'text-primary-700',\n className: displayPriority.hasMetrics\n ? percentageClassName\n : labelClassName,\n content: displayPriority.content,\n };\n};\n\n/**\n * Helper function to get default layout display configuration\n *\n * PRIORITY ORDER for default layout (showHitCount is not supported):\n * 1. showPercentage (when enabled, takes precedence over label)\n * 2. label (shown only when showPercentage is false)\n *\n * Note: Default layout does not support showHitCount feature.\n */\nconst getDefaultLayoutDisplayConfig = (\n size: ProgressBarSize,\n label: ReactNode,\n showPercentage: boolean\n) => ({\n showHeader: size === 'small' && !!(label || showPercentage),\n showPercentage: size === 'medium' && showPercentage,\n showLabel: size === 'medium' && !!label && !showPercentage, // Only show label when percentage is not shown\n});\n\n/**\n * Helper function to render hit count or percentage display for stacked layout\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n *\n * When both showHitCount and showPercentage are true, showHitCount takes precedence.\n */\nconst renderStackedHitCountDisplay = (\n showHitCount: boolean,\n showPercentage: boolean,\n clampedValue: number,\n max: number,\n percentage: number,\n percentageClassName: string\n): ReactNode => {\n if (!showHitCount && !showPercentage) return null;\n\n // Use centralized priority logic for consistency\n const displayPriority = getDisplayPriority(\n showHitCount,\n showPercentage,\n null, // label is not relevant for stacked layout metrics display\n clampedValue,\n max,\n percentage\n );\n\n return (\n <div\n className={cn(\n 'text-xs font-medium leading-[14px] text-right',\n percentageClassName\n )}\n >\n {displayPriority.type === 'hitCount' ? (\n <>\n <span className=\"text-success-200\">{Math.round(clampedValue)}</span>\n <span className=\"text-text-600\"> de {max}</span>\n </>\n ) : (\n <Text size=\"xs\" weight=\"medium\" className=\"text-success-200\">\n {Math.round(percentage)}%\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * Base progress bar component with common rendering logic\n */\nconst ProgressBarBase = ({\n clampedValue,\n max,\n percentage,\n label,\n variantClasses,\n containerClassName,\n fillClassName,\n}: {\n clampedValue: number;\n max: number;\n percentage: number;\n label: ReactNode;\n variantClasses: VariantClassType;\n containerClassName: string;\n fillClassName: string;\n}) => (\n <div\n className={cn(\n containerClassName,\n variantClasses.background,\n 'overflow-hidden relative'\n )}\n >\n <progress\n value={clampedValue}\n max={max}\n aria-label={\n typeof label === 'string'\n ? `${label}: ${Math.round(percentage)}% complete`\n : `Progress: ${Math.round(percentage)}% of ${max}`\n }\n className=\"absolute inset-0 w-full h-full opacity-0\"\n />\n <div\n className={cn(\n fillClassName,\n variantClasses.fill,\n 'transition-all duration-300 ease-out'\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n);\n\n/**\n * Stacked layout component\n */\nconst StackedLayout = ({\n className,\n label,\n showPercentage,\n showHitCount,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n variantClasses,\n dimensions,\n}: StackedLayoutProps) => (\n <div\n className={cn(\n 'flex flex-col items-start gap-2',\n dimensions.width,\n dimensions.height,\n className\n )}\n >\n {shouldShowHeader(label, showPercentage, showHitCount) && (\n <div className=\"flex flex-row justify-between items-center w-full h-[19px]\">\n {label && (\n <Text\n as=\"div\"\n size=\"md\"\n weight=\"medium\"\n className={cn('text-text-600 leading-[19px]', labelClassName)}\n >\n {label}\n </Text>\n )}\n\n {renderStackedHitCountDisplay(\n showHitCount,\n showPercentage,\n clampedValue,\n max,\n percentage,\n percentageClassName\n )}\n </div>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName=\"w-full h-2 rounded-lg\"\n fillClassName=\"h-2 rounded-lg shadow-hard-shadow-3\"\n />\n </div>\n);\n\n/**\n * Compact layout component\n */\nconst CompactLayout = ({\n className,\n label,\n showPercentage,\n showHitCount,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n variantClasses,\n dimensions,\n}: CompactLayoutProps) => {\n const {\n color,\n className: compactClassName,\n content,\n } = getCompactLayoutConfig({\n showPercentage,\n showHitCount,\n percentage,\n clampedValue,\n max,\n label,\n percentageClassName,\n labelClassName,\n });\n\n return (\n <div\n className={cn(\n 'flex flex-col items-start gap-1',\n dimensions.width,\n dimensions.height,\n className\n )}\n >\n {shouldShowHeader(label, showPercentage, showHitCount) && (\n <Text\n as=\"div\"\n size=\"sm\"\n weight=\"medium\"\n color={color}\n className={cn('leading-4 w-full', compactClassName)}\n >\n {content}\n </Text>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName=\"w-full h-1 rounded-full\"\n fillClassName=\"h-1 rounded-full\"\n />\n </div>\n );\n};\n\n/**\n * Default layout component\n */\nconst DefaultLayout = ({\n className,\n size,\n sizeClasses,\n variantClasses,\n label,\n showPercentage,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n}: DefaultLayoutProps) => {\n const gapClass = size === 'medium' ? 'gap-2' : sizeClasses.spacing;\n const progressBarClass = size === 'medium' ? 'flex-grow' : 'w-full';\n const displayConfig = getDefaultLayoutDisplayConfig(\n size,\n label,\n showPercentage\n );\n\n return (\n <div className={cn('flex', sizeClasses.layout, gapClass, className)}>\n {displayConfig.showHeader && (\n <div className=\"flex flex-row items-center justify-between w-full\">\n {label && (\n <Text\n as=\"div\"\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center',\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n </div>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName={cn(\n progressBarClass,\n sizeClasses.container,\n sizeClasses.borderRadius\n )}\n fillClassName={cn(\n sizeClasses.bar,\n sizeClasses.borderRadius,\n 'shadow-hard-shadow-3'\n )}\n />\n\n {displayConfig.showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none',\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n\n {displayConfig.showLabel && (\n <Text\n as=\"div\"\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * ProgressBar component for Analytica Ensino platforms\n *\n * A progress bar component with size and color variants designed for tracking\n * activity progress (blue) and performance metrics (green).\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * CONTENT DISPLAY PRIORITY (Consistent across all layouts):\n * 1. showHitCount (highest) - \"X de Y\" format (stacked/compact only)\n * 2. showPercentage - \"X%\" format\n * 3. label (lowest) - Custom label text\n *\n * When multiple display options are enabled, higher priority options take precedence.\n *\n * @example\n * ```tsx\n * // Basic progress bar\n * <ProgressBar value={65} />\n *\n * // Activity progress (blue)\n * <ProgressBar variant=\"blue\" value={45} label=\"Progress\" showPercentage />\n *\n * // Performance metrics (green)\n * <ProgressBar variant=\"green\" size=\"medium\" value={85} label=\"Performance\" />\n *\n * // Small size with custom max value\n * <ProgressBar size=\"small\" value={3} max={5} showPercentage />\n *\n * // Stacked layout with fixed width and hit count\n * <ProgressBar layout=\"stacked\" variant=\"green\" value={28} max={30} label=\"Fáceis\" showHitCount />\n *\n * // Compact layout for small cards\n * <ProgressBar layout=\"compact\" variant=\"blue\" value={70} label=\"Questão 08\" />\n * ```\n */\nconst ProgressBar = ({\n value,\n max = 100,\n size = 'medium',\n variant = 'blue',\n layout = 'default',\n label,\n showPercentage = false,\n showHitCount = false,\n className = '',\n labelClassName = '',\n percentageClassName = '',\n stackedWidth,\n stackedHeight,\n compactWidth,\n compactHeight,\n}: ProgressBarProps) => {\n const { clampedValue, percentage } = calculateProgressValues(value, max);\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_CLASSES[variant];\n\n if (layout === 'stacked') {\n return (\n <StackedLayout\n className={className}\n label={label}\n showPercentage={showPercentage}\n showHitCount={showHitCount}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n variantClasses={variantClasses}\n dimensions={{\n width: stackedWidth ?? 'w-[380px]',\n height: stackedHeight ?? 'h-[35px]',\n }}\n />\n );\n }\n\n if (layout === 'compact') {\n return (\n <CompactLayout\n className={className}\n label={label}\n showPercentage={showPercentage}\n showHitCount={showHitCount}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n variantClasses={variantClasses}\n dimensions={{\n width: compactWidth ?? 'w-[131px]',\n height: compactHeight ?? 'h-[24px]',\n }}\n />\n );\n }\n\n return (\n <DefaultLayout\n className={className}\n size={size}\n sizeClasses={sizeClasses}\n variantClasses={variantClasses}\n label={label}\n showPercentage={showPercentage}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n />\n );\n};\n\nexport default ProgressBar;\n","import {\n forwardRef,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n useId,\n useState,\n useEffect,\n} from 'react';\nimport { CardBase } from '../Card/Card';\nimport { CaretRight } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\ninterface CardAccordationProps extends HTMLAttributes<HTMLDivElement> {\n trigger: ReactNode;\n children: ReactNode;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: (isExpanded: boolean) => void;\n value?: string;\n disabled?: boolean;\n /** Additional class for the trigger button */\n triggerClassName?: string;\n /** Additional class for the content wrapper */\n contentClassName?: string;\n}\n\nconst CardAccordation = forwardRef<HTMLDivElement, CardAccordationProps>(\n (\n {\n trigger,\n children,\n className,\n defaultExpanded = false,\n expanded: controlledExpanded,\n onToggleExpanded,\n value,\n disabled = false,\n triggerClassName,\n contentClassName,\n ...props\n },\n ref\n ) => {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const generatedId = useId();\n\n // Use value as ID base for better semantics, fallback to generated ID\n const contentId = value ? `accordion-content-${value}` : generatedId;\n const headerId = value\n ? `accordion-header-${value}`\n : `${generatedId}-header`;\n\n // Determine if component is controlled\n const isControlled = controlledExpanded !== undefined;\n const isExpanded = isControlled ? controlledExpanded : internalExpanded;\n\n // Sync internal state when controlled value changes\n useEffect(() => {\n if (isControlled) {\n setInternalExpanded(controlledExpanded);\n }\n }, [isControlled, controlledExpanded]);\n\n const handleToggle = () => {\n if (disabled) return;\n\n const newExpanded = !isExpanded;\n\n if (!isControlled) {\n setInternalExpanded(newExpanded);\n }\n\n onToggleExpanded?.(newExpanded);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleToggle();\n }\n };\n\n return (\n <CardBase\n ref={ref}\n layout=\"vertical\"\n padding=\"none\"\n minHeight=\"none\"\n className={cn('overflow-hidden', className)}\n {...props}\n >\n {/* Clickable header */}\n <button\n id={headerId}\n type=\"button\"\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n className={cn(\n 'w-full cursor-pointer not-aria-expanded:rounded-xl aria-expanded:rounded-t-xl flex items-center justify-between gap-3 text-left transition-colors duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-950 focus-visible:ring-inset pl-2 pr-10',\n disabled && 'cursor-not-allowed text-text-400',\n triggerClassName\n )}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n aria-disabled={disabled}\n data-value={value}\n >\n {trigger}\n\n <CaretRight\n size={20}\n className={cn(\n 'transition-transform duration-200 flex-shrink-0',\n disabled ? 'text-gray-400' : 'text-text-700',\n isExpanded ? 'rotate-90' : 'rotate-0'\n )}\n data-testid=\"accordion-caret\"\n />\n </button>\n\n {/* Expandable content */}\n <section\n id={contentId}\n aria-labelledby={headerId}\n aria-hidden={!isExpanded}\n className={cn(\n 'transition-all duration-300 ease-in-out overflow-hidden',\n isExpanded ? 'opacity-100' : 'max-h-0 opacity-0'\n )}\n data-testid=\"accordion-content\"\n data-value={value}\n >\n <div className={cn('p-4 pt-0', contentClassName)}>{children}</div>\n </section>\n </CardBase>\n );\n }\n);\n\nCardAccordation.displayName = 'CardAccordation';\n\nexport { CardAccordation };\nexport type { CardAccordationProps };\n","import {\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactNode,\n useState,\n useRef,\n MouseEvent,\n ChangeEvent,\n KeyboardEvent,\n Ref,\n useEffect,\n} from 'react';\nimport Button from '../Button/Button';\nimport Badge from '../Badge/Badge';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport {\n CaretRight,\n ChatCircleText,\n CheckCircle,\n Clock,\n DotsThreeVertical,\n Play,\n SpeakerHigh,\n SpeakerLow,\n SpeakerSimpleX,\n XCircle,\n} from 'phosphor-react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport IconRender from '../IconRender/IconRender';\n\n// Componente base reutilizável para todos os cards\ninterface CardBaseProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n variant?: 'default' | 'compact' | 'minimal';\n layout?: 'horizontal' | 'vertical';\n padding?: 'none' | 'small' | 'medium' | 'large';\n minHeight?: 'none' | 'small' | 'medium' | 'large';\n cursor?: 'default' | 'pointer';\n}\n\nconst CARD_BASE_CLASSES = {\n default: 'w-full bg-background border border-border-50 rounded-xl',\n compact: 'w-full bg-background border border-border-50 rounded-lg',\n minimal: 'w-full bg-background border border-border-100 rounded-md',\n};\n\nconst CARD_PADDING_CLASSES = {\n none: '',\n small: 'p-2',\n medium: 'p-4',\n large: 'p-6',\n};\n\nconst CARD_MIN_HEIGHT_CLASSES = {\n none: '',\n small: 'min-h-16',\n medium: 'min-h-20',\n large: 'min-h-24',\n};\n\nconst CARD_LAYOUT_CLASSES = {\n horizontal: 'flex flex-row',\n vertical: 'flex flex-col',\n};\n\nconst CARD_CURSOR_CLASSES = {\n default: '',\n pointer: 'cursor-pointer',\n};\n\nconst CardBase = forwardRef<HTMLDivElement, CardBaseProps>(\n (\n {\n children,\n variant = 'default',\n layout = 'horizontal',\n padding = 'medium',\n minHeight = 'medium',\n cursor = 'default',\n className = '',\n onClick,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const baseClasses = CARD_BASE_CLASSES[variant];\n const paddingClasses = CARD_PADDING_CLASSES[padding];\n const minHeightClasses = CARD_MIN_HEIGHT_CLASSES[minHeight];\n const layoutClasses = CARD_LAYOUT_CLASSES[layout];\n const cursorClasses = CARD_CURSOR_CLASSES[cursor];\n\n // Make cards with onClick focusable and keyboard accessible\n const isInteractive = !!onClick;\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (isInteractive && ['Enter', ' '].includes(e.key)) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).click();\n }\n onKeyDown?.(e);\n };\n\n /*\n * Note: Using div with role=\"button\" instead of native <button> element.\n * Rationale:\n * - Card is a complex container component with multiple child elements\n * - Native button has layout/styling constraints incompatible with card design\n * - Full WCAG/ARIA compliance implemented: role, tabIndex, keyboard support\n */\n return (\n <div\n ref={ref}\n className={cn(\n baseClasses,\n paddingClasses,\n minHeightClasses,\n layoutClasses,\n cursorClasses,\n className\n )}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n tabIndex={isInteractive ? 0 : undefined}\n role={isInteractive ? 'button' : undefined}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\ninterface CardActivitiesResultsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n title: string;\n subTitle: string;\n header: string;\n description?: string;\n extended?: boolean;\n action?: 'warning' | 'success' | 'error' | 'info';\n}\n\nconst ACTION_CARD_CLASSES = {\n warning: 'bg-warning-background',\n success: 'bg-success-200',\n error: 'bg-error-100',\n info: 'bg-info-background',\n};\n\nconst ACTION_ICON_CLASSES = {\n warning: 'bg-warning-300 text-text',\n success: 'bg-indicator-positive text-text-950',\n error: 'bg-indicator-negative text-text',\n info: 'bg-info-500 text-text',\n};\n\nconst ACTION_SUBTITLE_CLASSES = {\n warning: 'text-warning-600',\n success: 'text-success-700',\n error: 'text-error-700',\n info: 'text-info-700',\n};\n\nconst ACTION_HEADER_CLASSES = {\n warning: 'text-warning-300',\n success: 'text-success-300',\n error: 'text-error-300',\n info: 'text-info-300',\n};\n\nconst CardActivitiesResults = forwardRef<\n HTMLDivElement,\n CardActivitiesResultsProps\n>(\n (\n {\n icon,\n title,\n subTitle,\n header,\n extended = false,\n action = 'success',\n description,\n className,\n ...props\n },\n ref\n ) => {\n const actionCardClasses = ACTION_CARD_CLASSES[action];\n const actionIconClasses = ACTION_ICON_CLASSES[action];\n const actionSubTitleClasses = ACTION_SUBTITLE_CLASSES[action];\n const actionHeaderClasses = ACTION_HEADER_CLASSES[action];\n\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full flex flex-col rounded-xl',\n extended && 'border border-border-50 bg-background',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'flex flex-col gap-1 items-center justify-center p-4',\n actionCardClasses,\n extended ? 'rounded-t-xl' : 'rounded-xl'\n )}\n >\n <span\n className={cn(\n 'size-7.5 rounded-full flex items-center justify-center',\n actionIconClasses\n )}\n >\n {icon}\n </span>\n\n <Text\n size=\"2xs\"\n weight=\"medium\"\n className=\"text-text-800 uppercase truncate\"\n >\n {title}\n </Text>\n\n <p\n className={cn('text-lg font-bold truncate', actionSubTitleClasses)}\n >\n {subTitle}\n </p>\n </div>\n\n {extended && (\n <div className=\"flex flex-col items-center gap-2.5 pb-9.5 pt-2.5\">\n <p\n className={cn(\n 'text-2xs font-medium uppercase truncate',\n actionHeaderClasses\n )}\n >\n {header}\n </p>\n <Badge size=\"large\" action=\"info\">\n {description}\n </Badge>\n </div>\n )}\n </div>\n );\n }\n);\n\ninterface CardQuestionProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n state?: 'done' | 'undone' | 'pending';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardQuestions = forwardRef<HTMLDivElement, CardQuestionProps>(\n (\n {\n header,\n state = 'undone',\n className,\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const getStateConfig = () => {\n switch (state) {\n case 'done':\n return {\n label: 'Realizado',\n buttonLabel: 'Ver Resultado',\n badgeAction: 'success' as const,\n };\n case 'pending':\n return {\n label: 'Aguardando correção',\n buttonLabel: 'Ver Resultado',\n badgeAction: 'info' as const,\n };\n default:\n return {\n label: 'Não Realizado',\n buttonLabel: 'Responder',\n badgeAction: 'error' as const,\n };\n }\n };\n\n const { label, buttonLabel, badgeAction } = getStateConfig();\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('justify-between gap-4', className)}\n {...props}\n >\n <section className=\"flex flex-col gap-1 flex-1 min-w-0\">\n <p className=\"font-bold text-xs text-text-950 truncate\">{header}</p>\n\n <div className=\"flex flex-row gap-6 items-center\">\n <Badge size=\"medium\" variant=\"solid\" action={badgeAction}>\n {label}\n </Badge>\n </div>\n </section>\n\n <span className=\"flex-shrink-0\">\n <Button\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit\"\n >\n {buttonLabel}\n </Button>\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardProgressProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subhead?: string;\n initialDate?: string;\n endDate?: string;\n progress?: number;\n direction?: 'horizontal' | 'vertical';\n icon: ReactNode;\n color?: string;\n progressVariant?: 'blue' | 'green';\n showDates?: boolean;\n}\n\nconst CardProgress = forwardRef<HTMLDivElement, CardProgressProps>(\n (\n {\n header,\n subhead,\n initialDate,\n endDate,\n progress = 0,\n direction = 'horizontal',\n icon,\n color = '#B7DFFF',\n progressVariant = 'blue',\n showDates = true,\n className,\n ...props\n },\n ref\n ) => {\n const isHorizontal = direction === 'horizontal';\n const contentComponent = {\n horizontal: (\n <>\n {showDates && (\n <div className=\"flex flex-row gap-6 items-center\">\n {initialDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Início</p>\n <p className=\"text-text-600\">{initialDate}</p>\n </span>\n )}\n {endDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Fim</p>\n <p className=\"text-text-600\">{endDate}</p>\n </span>\n )}\n </div>\n )}\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n </span>\n </>\n ),\n vertical: <p className=\"text-sm text-text-800\">{subhead}</p>,\n };\n\n return (\n <CardBase\n ref={ref}\n layout={isHorizontal ? 'horizontal' : 'vertical'}\n padding=\"none\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn(isHorizontal ? 'h-20' : '', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-6 text-text-950',\n isHorizontal\n ? 'min-w-[80px] min-h-[80px] rounded-l-xl'\n : 'min-h-[50px] w-full rounded-t-xl',\n !color.startsWith('#') ? `${color}` : ''\n )}\n style={color.startsWith('#') ? { backgroundColor: color } : undefined}\n data-testid=\"icon-container\"\n >\n {icon}\n </div>\n\n <div\n className={cn(\n 'p-4 flex flex-col justify-between w-full h-full',\n !isHorizontal && 'gap-4'\n )}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950 truncate\">\n {header}\n </Text>\n {contentComponent[direction]}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTopicProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subHead?: string[];\n progress: number;\n showPercentage?: boolean;\n progressVariant?: 'blue' | 'green';\n}\n\nconst CardTopic = forwardRef<HTMLDivElement, CardTopicProps>(\n (\n {\n header,\n subHead,\n progress,\n showPercentage = false,\n progressVariant = 'blue',\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"vertical\"\n padding=\"small\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn('justify-center gap-2 py-2 px-4', className)}\n {...props}\n >\n {subHead && (\n <span className=\"text-text-600 text-2xs flex flex-row gap-1\">\n {subHead.map((text, index) => (\n <Fragment key={`${text} - ${index}`}>\n <p>{text}</p>\n {index < subHead.length - 1 && <p>•</p>}\n </Fragment>\n ))}\n </span>\n )}\n\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n )}\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardPerformanceProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n description?: string;\n progress?: number;\n labelProgress?: string;\n actionVariant?: 'button' | 'caret';\n progressVariant?: 'blue' | 'green';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardPerformance = forwardRef<HTMLDivElement, CardPerformanceProps>(\n (\n {\n header,\n progress,\n description = 'Sem dados ainda! Você ainda não fez um questionário neste assunto.',\n actionVariant = 'button',\n progressVariant = 'blue',\n labelProgress = '',\n className = '',\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const hasProgress = progress !== undefined;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n actionVariant == 'caret' ? 'cursor-pointer' : '',\n className\n )}\n onClick={() => actionVariant == 'caret' && onClickButton?.(valueButton)}\n {...props}\n >\n <div className=\"w-full flex flex-col justify-between gap-2\">\n <div className=\"flex flex-row justify-between items-center gap-2\">\n <p className=\"text-lg font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n {actionVariant === 'button' && (\n <Button\n variant=\"outline\"\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit flex-shrink-0\"\n >\n Ver Aula\n </Button>\n )}\n </div>\n\n <div className=\"w-full\">\n {hasProgress ? (\n <ProgressBar\n value={progress}\n label={`${progress}% ${labelProgress}`}\n variant={progressVariant}\n />\n ) : (\n <p className=\"text-xs text-text-600 truncate\">{description}</p>\n )}\n </div>\n </div>\n\n {actionVariant == 'caret' && (\n <CaretRight\n className=\"size-4.5 text-text-800 cursor-pointer\"\n data-testid=\"caret-icon\"\n />\n )}\n </CardBase>\n );\n }\n);\n\ninterface CardResultsProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n icon: string;\n correct_answers: number;\n incorrect_answers: number;\n direction?: 'row' | 'col';\n color?: string;\n}\n\nconst CardResults = forwardRef<HTMLDivElement, CardResultsProps>(\n (\n {\n header,\n correct_answers,\n incorrect_answers,\n icon,\n direction = 'col',\n color = '#B7DFFF',\n className,\n ...props\n },\n ref\n ) => {\n const isRow = direction == 'row';\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"none\"\n minHeight=\"medium\"\n className={cn('items-stretch cursor-pointer pr-4', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-8 text-text-950 min-w-20 max-w-20 min-h-full rounded-l-xl'\n )}\n style={{\n backgroundColor: color,\n }}\n >\n <IconRender iconName={icon} color=\"currentColor\" size={20} />\n </div>\n\n <div className=\"w-full flex flex-row justify-between items-center\">\n <div\n className={cn(\n 'p-4 flex flex-wrap justify-between w-full h-full',\n isRow ? 'flex-row items-center gap-2' : 'flex-col'\n )}\n >\n <p className=\"text-sm font-bold text-text-950 flex-1\">{header}</p>\n <span className=\"flex flex-wrap flex-row gap-1 items-center\">\n <Badge\n action=\"success\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<CheckCircle />}\n >\n {correct_answers} Corretas\n </Badge>\n\n <Badge\n action=\"error\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<XCircle />}\n >\n {incorrect_answers} Incorretas\n </Badge>\n </span>\n </div>\n\n <CaretRight className=\"min-w-6 min-h-6 text-text-800\" />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardStatusProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n status?: 'correct' | 'incorrect' | 'unanswered' | 'pending';\n label?: string;\n}\n\nconst CardStatus = forwardRef<HTMLDivElement, CardStatusProps>(\n ({ header, className, status, label, ...props }, ref) => {\n const getLabelBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return 'Correta';\n case 'incorrect':\n return 'Incorreta';\n case 'unanswered':\n return 'Em branco';\n case 'pending':\n return 'Avaliação pendente';\n default:\n return 'Em branco';\n }\n };\n\n const getIconBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return <CheckCircle />;\n case 'incorrect':\n return <XCircle />;\n case 'pending':\n return <Clock />;\n default:\n return <XCircle />;\n }\n };\n\n const getActionBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return 'success';\n case 'incorrect':\n return 'error';\n case 'pending':\n return 'info';\n default:\n return 'info';\n }\n };\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('items-center cursor-pointer', className)}\n {...props}\n >\n <div className=\"flex justify-between w-full h-full flex-row items-center gap-2\">\n <p className=\"text-sm font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n <span className=\"flex flex-row gap-1 items-center flex-shrink-0\">\n {status && (\n <Badge\n action={getActionBadge(status)}\n variant=\"solid\"\n size=\"medium\"\n iconLeft={getIconBadge(status)}\n >\n {getLabelBadge(status)}\n </Badge>\n )}\n {label && <p className=\"text-sm text-text-800\">{label}</p>}\n </span>\n <CaretRight className=\"min-w-6 min-h-6 text-text-800 cursor-pointer flex-shrink-0 ml-2\" />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSettingsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n header: string;\n}\n\nconst CardSettings = forwardRef<HTMLDivElement, CardSettingsProps>(\n ({ header, className, icon, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"small\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <span className=\"[&>svg]:size-6\">{icon}</span>\n\n <p className=\"w-full text-sm truncate\">{header}</p>\n\n <CaretRight size={24} className=\"cursor-pointer\" />\n </CardBase>\n );\n }\n);\n\ninterface CardSupportProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n direction?: 'row' | 'col';\n children: ReactNode;\n}\n\nconst CardSupport = forwardRef<HTMLDivElement, CardSupportProps>(\n ({ header, className, direction = 'col', children, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'w-full flex',\n direction == 'col' ? 'flex-col' : 'flex-row items-center'\n )}\n >\n <span className=\"w-full min-w-0\">\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n </span>\n <span className=\"flex flex-row gap-1\">{children}</span>\n </div>\n\n <CaretRight className=\"text-text-800 cursor-pointer\" size={24} />\n </CardBase>\n );\n }\n);\n\ninterface CardForumProps<T = unknown> extends HTMLAttributes<HTMLDivElement> {\n title: string;\n content: string;\n comments: number;\n date: string;\n hour: string;\n onClickComments?: (value?: T) => void;\n valueComments?: T;\n onClickProfile?: (profile?: T) => void;\n valueProfile?: T;\n}\n\nconst CardForum = forwardRef<HTMLDivElement, CardForumProps>(\n (\n {\n title,\n content,\n comments,\n onClickComments,\n valueComments,\n onClickProfile,\n valueProfile,\n className = '',\n date,\n hour,\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n variant=\"minimal\"\n className={cn('w-auto h-auto gap-3', className)}\n {...props}\n >\n <button\n type=\"button\"\n aria-label=\"Ver perfil\"\n onClick={() => onClickProfile?.(valueProfile)}\n className=\"min-w-8 h-8 rounded-full bg-background-950\"\n />\n\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n <div className=\"flex flex-row gap-1 items-center flex-wrap\">\n <p className=\"text-xs font-semibold text-primary-700 truncate\">\n {title}\n </p>\n <p className=\"text-xs text-text-600\">\n • {date} • {hour}\n </p>\n </div>\n\n <p className=\"text-text-950 text-sm line-clamp-2 truncate\">\n {content}\n </p>\n\n <button\n type=\"button\"\n aria-label=\"Ver comentários\"\n onClick={() => onClickComments?.(valueComments)}\n className=\"text-text-600 flex flex-row gap-2 items-center\"\n >\n <ChatCircleText aria-hidden=\"true\" size={16} />\n <p className=\"text-xs\">{comments} respostas</p>\n </button>\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardAudioProps extends HTMLAttributes<HTMLDivElement> {\n src?: string;\n title?: string;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onAudioTimeUpdate?: (currentTime: number, duration: number) => void;\n loop?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n tracks?: Array<{\n kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\n src: string;\n srcLang: string;\n label: string;\n default?: boolean;\n }>;\n}\n\nconst CardAudio = forwardRef<HTMLDivElement, CardAudioProps>(\n (\n {\n src,\n title,\n onPlay,\n onPause,\n onEnded,\n onAudioTimeUpdate,\n loop = false,\n preload = 'metadata',\n tracks,\n className,\n ...props\n },\n ref\n ) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [showVolumeControl, setShowVolumeControl] = useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = useState(false);\n const [playbackRate, setPlaybackRate] = useState(1);\n const audioRef = useRef<HTMLAudioElement>(null);\n const volumeControlRef = useRef<HTMLDivElement>(null);\n const speedMenuRef = useRef<HTMLDivElement>(null);\n\n const formatTime = (time: number) => {\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const handlePlayPause = () => {\n if (isPlaying) {\n audioRef.current?.pause();\n setIsPlaying(false);\n onPause?.();\n } else {\n audioRef.current?.play();\n setIsPlaying(true);\n onPlay?.();\n }\n };\n\n const handleTimeUpdate = () => {\n const current = audioRef.current?.currentTime ?? 0;\n const total = audioRef.current?.duration ?? 0;\n\n setCurrentTime(current);\n setDuration(total);\n onAudioTimeUpdate?.(current, total);\n };\n\n const handleLoadedMetadata = () => {\n setDuration(audioRef.current?.duration ?? 0);\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n setCurrentTime(0);\n onEnded?.();\n };\n\n const handleProgressClick = (e: MouseEvent<HTMLButtonElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const width = rect.width;\n const percentage = clickX / width;\n const newTime = percentage * duration;\n\n if (audioRef.current) {\n audioRef.current.currentTime = newTime;\n }\n setCurrentTime(newTime);\n };\n\n const handleVolumeChange = (e: ChangeEvent<HTMLInputElement>) => {\n const newVolume = parseFloat(e.target.value);\n setVolume(newVolume);\n if (audioRef.current) {\n audioRef.current.volume = newVolume;\n }\n };\n\n const toggleVolumeControl = () => {\n setShowVolumeControl(!showVolumeControl);\n setShowSpeedMenu(false);\n };\n\n const toggleSpeedMenu = () => {\n setShowSpeedMenu(!showSpeedMenu);\n setShowVolumeControl(false);\n };\n\n const handleSpeedChange = (speed: number) => {\n setPlaybackRate(speed);\n if (audioRef.current) {\n audioRef.current.playbackRate = speed;\n }\n setShowSpeedMenu(false);\n };\n\n const getVolumeIcon = () => {\n if (volume === 0) {\n return <SpeakerSimpleX size={24} />;\n }\n if (volume < 0.5) {\n return <SpeakerLow size={24} />;\n }\n return <SpeakerHigh size={24} />;\n };\n\n useEffect(() => {\n const handleClickOutside = (event: Event) => {\n if (\n volumeControlRef.current &&\n !volumeControlRef.current.contains(event.target as Node)\n ) {\n setShowVolumeControl(false);\n }\n if (\n speedMenuRef.current &&\n !speedMenuRef.current.contains(event.target as Node)\n ) {\n setShowSpeedMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, []);\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n 'flex flex-row w-auto h-14 items-center gap-2',\n className\n )}\n {...props}\n >\n {/* Audio element */}\n <audio\n ref={audioRef}\n src={src}\n loop={loop}\n preload={preload}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"audio-element\"\n aria-label={title}\n >\n {tracks ? (\n tracks.map((track) => (\n <track\n key={track.src}\n kind={track.kind}\n src={track.src}\n srcLang={track.srcLang}\n label={track.label}\n default={track.default}\n />\n ))\n ) : (\n <track\n kind=\"captions\"\n src=\"data:text/vtt;base64,\"\n srcLang=\"pt\"\n label=\"Sem legendas disponíveis\"\n />\n )}\n </audio>\n\n {/* Play/Pause Button */}\n <button\n type=\"button\"\n onClick={handlePlayPause}\n disabled={!src}\n className=\"cursor-pointer text-text-950 hover:text-primary-600 disabled:text-text-400 disabled:cursor-not-allowed\"\n aria-label={isPlaying ? 'Pausar' : 'Reproduzir'}\n >\n {isPlaying ? (\n <div className=\"w-6 h-6 flex items-center justify-center\">\n <div className=\"flex gap-0.5\">\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n </div>\n </div>\n ) : (\n <Play size={24} />\n )}\n </button>\n\n {/* Current Time */}\n <p className=\"text-text-800 text-md font-medium min-w-[2.5rem]\">\n {formatTime(currentTime)}\n </p>\n\n {/* Progress Bar */}\n <div className=\"flex-1 relative\" data-testid=\"progress-bar\">\n <button\n type=\"button\"\n className=\"w-full h-2 bg-border-100 rounded-full cursor-pointer\"\n onClick={handleProgressClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.currentTarget.click();\n }\n }}\n aria-label=\"Barra de progresso do áudio\"\n >\n <div\n className=\"h-full bg-primary-600 rounded-full transition-all duration-100\"\n style={{\n width:\n duration > 0 ? `${(currentTime / duration) * 100}%` : '0%',\n }}\n />\n </button>\n </div>\n\n {/* Duration */}\n <p className=\"text-text-800 text-md font-medium min-w-[2.5rem]\">\n {formatTime(duration)}\n </p>\n\n {/* Volume Control */}\n <div className=\"relative h-6\" ref={volumeControlRef}>\n <button\n type=\"button\"\n onClick={toggleVolumeControl}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Controle de volume\"\n >\n <div className=\"w-6 h-6 flex items-center justify-center\">\n {getVolumeIcon()}\n </div>\n </button>\n\n {showVolumeControl && (\n <button\n type=\"button\"\n className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg focus:outline-none focus:ring-2 focus:ring-primary-500\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setShowVolumeControl(false);\n }\n }}\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.1\"\n value={volume}\n onChange={handleVolumeChange}\n onKeyDown={(e) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowRight') {\n e.preventDefault();\n const newVolume = Math.min(\n 1,\n Math.round((volume + 0.1) * 10) / 10\n );\n setVolume(newVolume);\n if (audioRef.current) audioRef.current.volume = newVolume;\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowLeft') {\n e.preventDefault();\n const newVolume = Math.max(\n 0,\n Math.round((volume - 0.1) * 10) / 10\n );\n setVolume(newVolume);\n if (audioRef.current) audioRef.current.volume = newVolume;\n }\n }}\n className=\"w-20 h-2 bg-border-100 rounded-lg appearance-none cursor-pointer\"\n style={{\n background: `linear-gradient(to right, #3b82f6 0%, #3b82f6 ${volume * 100}%, #e5e7eb ${volume * 100}%, #e5e7eb 100%)`,\n }}\n aria-label=\"Volume\"\n aria-valuenow={Math.round(volume * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </button>\n )}\n </div>\n\n {/* Menu Button */}\n <div className=\"relative h-6\" ref={speedMenuRef}>\n <button\n type=\"button\"\n onClick={toggleSpeedMenu}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Opções de velocidade\"\n >\n <DotsThreeVertical size={24} />\n </button>\n\n {showSpeedMenu && (\n <div className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg min-w-24 z-10\">\n <div className=\"flex flex-col gap-1\">\n {[\n { speed: 1, label: '1x' },\n { speed: 1.5, label: '1.5x' },\n { speed: 2, label: '2x' },\n ].map(({ speed, label }) => (\n <button\n key={speed}\n type=\"button\"\n onClick={() => handleSpeedChange(speed)}\n className={cn(\n 'px-3 py-1 text-sm text-left rounded hover:bg-border-50 transition-colors',\n playbackRate === speed\n ? 'bg-primary-950 text-secondary-100 font-medium'\n : 'text-text-950'\n )}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n duration?: string;\n info: string;\n backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';\n /**\n * Renders the card in a non-interactive \"coming soon\" state: greyed out,\n * not clickable, with an \"Em breve\" badge next to the title.\n */\n comingSoon?: boolean;\n /** Disables interaction (greyed out, not clickable) without a badge. */\n disabled?: boolean;\n}\n\nconst SIMULADO_BACKGROUND_CLASSES = {\n enem: 'bg-exam-1',\n prova: 'bg-exam-2',\n simuladao: 'bg-exam-3',\n vestibular: 'bg-exam-4',\n};\n\nconst CardSimulado = forwardRef<HTMLDivElement, CardSimuladoProps>(\n (\n {\n title,\n duration,\n info,\n backgroundColor,\n comingSoon = false,\n disabled = false,\n className,\n onClick,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const backgroundClass = SIMULADO_BACKGROUND_CLASSES[backgroundColor];\n const isInteractive = !comingSoon && !disabled;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor={isInteractive ? 'pointer' : 'default'}\n aria-disabled={isInteractive ? undefined : true}\n // Only forward handlers when interactive: CardBase derives tabIndex,\n // role=\"button\" and Enter/Space activation from the presence of onClick,\n // so a disabled/coming-soon card must not receive them.\n onClick={isInteractive ? onClick : undefined}\n onKeyDown={isInteractive ? onKeyDown : undefined}\n className={cn(\n backgroundClass,\n isInteractive\n ? 'hover:shadow-soft-shadow-2 transition-shadow duration-200'\n : 'opacity-60 pointer-events-none',\n className\n )}\n {...props}\n >\n <div className=\"flex justify-between items-center w-full gap-4\">\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n {comingSoon ? (\n <div className=\"flex items-center gap-2 min-w-0\">\n <Text\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 truncate\"\n >\n {title}\n </Text>\n <Badge\n size=\"small\"\n variant=\"solid\"\n action=\"info\"\n className=\"flex-shrink-0\"\n data-testid=\"badge-em-breve\"\n >\n Em breve\n </Badge>\n </div>\n ) : (\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950 truncate\">\n {title}\n </Text>\n )}\n\n <div className=\"flex items-center gap-4 text-text-700\">\n {duration && (\n <div className=\"flex items-center gap-1\">\n <Clock size={16} className=\"flex-shrink-0\" />\n <Text size=\"sm\">{duration}</Text>\n </div>\n )}\n\n <Text size=\"sm\" className=\"truncate\">\n {info}\n </Text>\n </div>\n </div>\n\n {isInteractive && (\n <CaretRight\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n />\n )}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTestProps extends Omit<HTMLAttributes<HTMLElement>, 'onSelect'> {\n title: string;\n duration?: string;\n questionsCount?: number;\n additionalInfo?: string;\n selected?: boolean;\n onSelect?: (selected: boolean) => void;\n}\n\nconst CardTest = forwardRef<HTMLElement, CardTestProps>(\n (\n {\n title,\n duration,\n questionsCount,\n additionalInfo,\n selected = false,\n onSelect,\n className = '',\n ...props\n },\n ref\n ) => {\n const handleClick = () => {\n if (onSelect) {\n onSelect(!selected);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if ((event.key === 'Enter' || event.key === ' ') && onSelect) {\n event.preventDefault();\n onSelect(!selected);\n }\n };\n\n const isSelectable = !!onSelect;\n const getQuestionsText = (count: number) => {\n const singular = count === 1 ? 'questão' : 'questões';\n return `${count} ${singular}`;\n };\n\n const displayInfo = questionsCount\n ? getQuestionsText(questionsCount)\n : additionalInfo || '';\n const baseClasses =\n 'flex flex-row items-center p-4 gap-2 w-full max-w-full bg-background shadow-soft-shadow-1 rounded-xl isolate border-0 text-left';\n const interactiveClasses = isSelectable\n ? 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-offset-2'\n : '';\n const selectedClasses = selected\n ? 'ring-2 ring-primary-950 ring-offset-2'\n : '';\n\n if (isSelectable) {\n return (\n <button\n ref={ref as Ref<HTMLButtonElement>}\n type=\"button\"\n className={cn(\n `${baseClasses} ${interactiveClasses} ${selectedClasses} ${className}`.trim()\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n aria-pressed={selected}\n {...(props as HTMLAttributes<HTMLButtonElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <Clock size={16} className=\"text-text-700\" />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </button>\n );\n }\n\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={cn(`${baseClasses} ${className}`.trim())}\n {...(props as HTMLAttributes<HTMLDivElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <Clock size={16} className=\"text-text-700\" />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate min-w-0\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </div>\n );\n }\n);\n\ninterface SimulationItem {\n id: string;\n title: string;\n type: 'enem' | 'prova' | 'simulado' | 'vestibular';\n info: string;\n}\n\ninterface SimulationHistoryData {\n date: string;\n simulations: SimulationItem[];\n}\n\ninterface CardSimulationHistoryProps extends HTMLAttributes<HTMLDivElement> {\n data: SimulationHistoryData[];\n onSimulationClick?: (simulation: SimulationItem) => void;\n}\n\nconst SIMULATION_TYPE_STYLES = {\n enem: {\n background: 'bg-exam-1',\n badge: 'exam1' as const,\n text: 'Enem',\n },\n prova: {\n background: 'bg-exam-2',\n badge: 'exam2' as const,\n text: 'Prova',\n },\n simulado: {\n background: 'bg-exam-3',\n badge: 'exam3' as const,\n text: 'Simuladão',\n },\n vestibular: {\n background: 'bg-exam-4',\n badge: 'exam4' as const,\n text: 'Vestibular',\n },\n};\n\nconst CardSimulationHistory = forwardRef<\n HTMLDivElement,\n CardSimulationHistoryProps\n>(({ data, onSimulationClick, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('w-full max-w-[992px] h-auto', className)}\n {...props}\n >\n {/* Content */}\n <div className=\"flex flex-col gap-0\">\n {data.map((section, sectionIndex) => (\n <div key={section.date} className=\"flex flex-col\">\n {/* Seção com data */}\n <div\n className={cn(\n 'flex flex-row justify-center items-start px-4 py-6 gap-2 w-full bg-background',\n sectionIndex === 0 ? 'rounded-t-3xl' : ''\n )}\n >\n <Text\n size=\"xs\"\n weight=\"bold\"\n className=\"text-text-800 w-11 flex-shrink-0\"\n >\n {section.date}\n </Text>\n\n <div className=\"flex flex-col gap-2 flex-1\">\n {section.simulations.map((simulation) => {\n const typeStyles = SIMULATION_TYPE_STYLES[simulation.type];\n\n return (\n <CardBase\n key={simulation.id}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor=\"pointer\"\n className={cn(\n `${typeStyles.background} rounded-xl hover:shadow-soft-shadow-2 \n transition-shadow duration-200 h-auto min-h-[61px]`\n )}\n onClick={() => onSimulationClick?.(simulation)}\n >\n <div className=\"flex justify-between items-center w-full gap-2\">\n <div className=\"flex flex-wrap flex-col justify-between sm:flex-row gap-2 flex-1 min-w-0\">\n <Text\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 truncate\"\n >\n {simulation.title}\n </Text>\n\n <div className=\"flex items-center gap-2\">\n <Badge\n variant=\"examsOutlined\"\n action={typeStyles.badge}\n size=\"medium\"\n >\n {typeStyles.text}\n </Badge>\n\n <Text size=\"sm\" className=\"text-text-800 truncate\">\n {simulation.info}\n </Text>\n </div>\n </div>\n\n <CaretRight\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n />\n </div>\n </CardBase>\n );\n })}\n </div>\n </div>\n </div>\n ))}\n\n {/* Footer rounded */}\n {data.length > 0 && (\n <div className=\"w-full h-6 bg-background rounded-b-3xl\" />\n )}\n </div>\n </div>\n );\n});\n\n// ======================================================================\n// CardEssayHistory — histórico de redações agrupado por data\n// ======================================================================\n\nexport enum EssayStatus {\n DRAFT = 'DRAFT',\n SUBMITTED = 'SUBMITTED',\n CORRECTING = 'CORRECTING',\n CORRECTED = 'CORRECTED',\n ERROR = 'ERROR',\n}\n\nexport enum EssayReviewStatus {\n PENDING = 'PENDING',\n APPROVED = 'APPROVED',\n MODIFIED = 'MODIFIED',\n}\n\nexport interface EssayHistoryItem {\n id: string;\n /** Título exibido. Se null/undefined, o componente cai no `fallbackTitle` */\n title: string | null;\n /** Título fallback (ex: título do tema) quando `title` está vazio */\n fallbackTitle?: string;\n status: EssayStatus;\n /** Nota total (0..maxScore). null quando ainda não pontuou */\n totalScore: number | null;\n /** Status da revisão do professor */\n reviewStatus?: EssayReviewStatus | null;\n}\n\nexport interface EssayHistoryData {\n /** Label da data do grupo (ex: \"12 Fev\") */\n date: string;\n essays: EssayHistoryItem[];\n}\n\ninterface CardEssayHistoryProps extends HTMLAttributes<HTMLDivElement> {\n data: EssayHistoryData[];\n /** Nota máxima pra compor o label \"X de {maxScore}\". Default: 1000 */\n maxScore?: number;\n /** Callback ao clicar num item clicável (CORRECTED com score, ou ERROR) */\n onEssayClick?: (essay: EssayHistoryItem) => void;\n}\n\ntype EssayVisualState = {\n background: string;\n text: string;\n clickable: boolean;\n};\n\nconst resolveEssayVisualState = (\n essay: EssayHistoryItem,\n maxScore: number\n): EssayVisualState => {\n // If essay has a score, show it (regardless of status - covers professor review cases)\n if (essay.totalScore != null) {\n return {\n background: 'bg-subject-12',\n text: `${essay.totalScore} de ${maxScore}`,\n clickable: true,\n };\n }\n if (essay.status === EssayStatus.ERROR) {\n return {\n background: 'bg-tertiary-100',\n text: 'Erro na correção',\n clickable: true,\n };\n }\n if (\n essay.status === EssayStatus.CORRECTING ||\n essay.status === EssayStatus.SUBMITTED\n ) {\n return {\n background: 'bg-secondary-200',\n text: 'Gerando resultado...',\n clickable: false,\n };\n }\n if (essay.status === EssayStatus.DRAFT) {\n return {\n background: 'bg-secondary-200',\n text: 'Rascunho',\n clickable: false,\n };\n }\n return {\n background: 'bg-secondary-200',\n text: 'Sem nota ainda',\n clickable: false,\n };\n};\n\ntype ReviewBadgeConfig = {\n label: string;\n action: 'success' | 'info';\n} | null;\n\nconst resolveReviewBadge = (essay: EssayHistoryItem): ReviewBadgeConfig => {\n if (\n essay.reviewStatus === EssayReviewStatus.APPROVED ||\n essay.reviewStatus === EssayReviewStatus.MODIFIED\n ) {\n return { label: 'Revisado', action: 'success' };\n }\n\n if (\n essay.status === EssayStatus.CORRECTED &&\n essay.reviewStatus === EssayReviewStatus.PENDING\n ) {\n return { label: 'Corrigido por IA', action: 'info' };\n }\n\n return null;\n};\n\nconst CardEssayHistory = forwardRef<HTMLDivElement, CardEssayHistoryProps>(\n ({ data, maxScore = 1000, onEssayClick, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('w-full max-w-248 bg-background rounded-3xl', className)}\n {...props}\n >\n <div className=\"flex flex-col\">\n {data.map((section, sectionIndex) => (\n <div\n key={`${section.date}-${sectionIndex}`}\n className=\"flex flex-row items-start px-4 py-6 gap-2 w-full\"\n >\n <Text\n size=\"xs\"\n weight=\"bold\"\n className=\"text-text-800 w-11 shrink-0 pt-3\"\n >\n {section.date}\n </Text>\n\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n {section.essays.map((essay) => {\n const visual = resolveEssayVisualState(essay, maxScore);\n const isClickable = visual.clickable && !!onEssayClick;\n const label =\n essay.title ?? essay.fallbackTitle ?? 'Sem título';\n const reviewBadge = resolveReviewBadge(essay);\n\n return (\n <button\n key={essay.id}\n type=\"button\"\n disabled={!isClickable}\n onClick={() => isClickable && onEssayClick?.(essay)}\n aria-label={`${label} — ${visual.text}`}\n className={cn(\n visual.background,\n 'rounded-xl p-4 flex flex-row items-center justify-between gap-2 w-full transition-shadow duration-200',\n isClickable\n ? 'cursor-pointer hover:shadow-soft-shadow-2'\n : 'cursor-default'\n )}\n >\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 truncate text-left\"\n >\n {label}\n </Text>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n {reviewBadge && (\n <Badge\n variant=\"solid\"\n action={reviewBadge.action}\n size=\"small\"\n >\n {reviewBadge.label}\n </Badge>\n )}\n <Text\n size=\"sm\"\n className=\"text-text-800 whitespace-nowrap\"\n >\n {visual.text}\n </Text>\n {isClickable && (\n <CaretRight\n size={20}\n className=\"text-text-800 shrink-0\"\n />\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n }\n);\n\nexport {\n CardBase,\n CardActivitiesResults,\n CardQuestions,\n CardProgress,\n CardTopic,\n CardPerformance,\n CardResults,\n CardStatus,\n CardSettings,\n CardSupport,\n CardForum,\n CardAudio,\n CardSimulado,\n CardTest,\n CardSimulationHistory,\n CardEssayHistory,\n};\n","import { cloneElement, ComponentType, JSX, ReactElement } from 'react';\nimport * as PhosphorIcons from '@phosphor-icons/react';\nimport { ChatPT } from '../../assets/icons/subjects/ChatPT';\nimport { ChatEN } from '../../assets/icons/subjects/ChatEN';\nimport { ChatES } from '../../assets/icons/subjects/ChatES';\nimport { BookOpenText } from '../../assets/icons/subjects/BookOpenText';\nimport { Microscope } from '../../assets/icons/subjects/Microscope';\nimport { HeadCircuit } from '../../assets/icons/subjects/HeadCircuit';\n\ntype PhosphorIconName = keyof typeof PhosphorIcons;\ntype PhosphorIconComponent = ComponentType<{\n size?: number;\n color?: string;\n weight?: 'thin' | 'light' | 'regular' | 'bold' | 'fill' | 'duotone';\n}>;\ntype CustomIconComponent = ComponentType<{\n size: number;\n color: string;\n}>;\n\n// Custom icons act as a fallback when Phosphor doesn't expose the name —\n// Chat_* have no Phosphor equivalent, and the others stay as a safety net\n// in case future Phosphor versions rename or remove them.\nconst CUSTOM_ICONS: Record<string, CustomIconComponent> = {\n Chat_PT: ChatPT,\n Chat_EN: ChatEN,\n Chat_ES: ChatES,\n BookOpenText,\n Microscope,\n HeadCircuit,\n};\n\nexport interface IconRenderProps {\n /**\n * The name of the icon to render\n */\n iconName: string | ReactElement;\n /**\n * The color of the icon\n * @default '#000000'\n */\n color?: string;\n /**\n * The size of the icon in pixels\n * @default 24\n */\n size?: number;\n /**\n * The weight/style of the icon (for Phosphor icons)\n * @default 'regular'\n */\n weight?: 'thin' | 'light' | 'regular' | 'bold' | 'fill' | 'duotone';\n}\n\n/**\n * Dynamic icon component that renders icons based on name\n * Supports Phosphor icons and custom Chat icons (ChatPT, ChatEN, ChatES)\n *\n * @param iconName - The name of the icon to render\n * @param color - The color of the icon\n * @param size - The size of the icon in pixels\n * @param weight - The weight/style of the icon (for Phosphor icons)\n * @returns JSX element with the corresponding icon\n */\nexport const IconRender = ({\n iconName,\n color = '#000000',\n size = 24,\n weight = 'regular',\n}: IconRenderProps): JSX.Element => {\n // Guard against undefined/null iconName\n if (!iconName) {\n const FallbackIcon = PhosphorIcons.QuestionIcon as PhosphorIconComponent;\n return <FallbackIcon size={size} color={color} weight={weight} />;\n }\n\n if (typeof iconName === 'string') {\n // @phosphor-icons/react v2 exports canonical names with an `Icon` suffix\n // (the bare name is deprecated). Backend keeps sending the bare name.\n const PhosphorIcon = PhosphorIcons[\n `${iconName}Icon` as PhosphorIconName\n ] as PhosphorIconComponent | undefined;\n if (PhosphorIcon) {\n return <PhosphorIcon size={size} color={color} weight={weight} />;\n }\n\n const CustomIcon = CUSTOM_ICONS[iconName];\n if (CustomIcon) {\n return <CustomIcon size={size} color={color} />;\n }\n\n const Fallback = PhosphorIcons.QuestionIcon as PhosphorIconComponent;\n return <Fallback size={size} color={color} weight={weight} />;\n } else {\n // Clone the ReactElement with icon props, casting to avoid TypeScript errors\n return cloneElement(iconName, {\n size,\n color: 'currentColor',\n } as Partial<{\n size: number;\n color: string;\n }>);\n }\n};\n\nexport default IconRender;\n","export const ChatPT = ({ size, color }: { size: number; color: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M27 6H5.00004C4.4696 6 3.9609 6.21071 3.58582 6.58579C3.21075 6.96086 3.00004 7.46957 3.00004 8V28C2.99773 28.3814 3.10562 28.7553 3.31074 29.0768C3.51585 29.3984 3.80947 29.6538 4.15629 29.8125C4.42057 29.9356 4.7085 29.9995 5.00004 30C5.46954 29.9989 5.92347 29.8315 6.28129 29.5275L6.29254 29.5187L10.375 26H27C27.5305 26 28.0392 25.7893 28.4142 25.4142C28.7893 25.0391 29 24.5304 29 24V8C29 7.46957 28.7893 6.96086 28.4142 6.58579C28.0392 6.21071 27.5305 6 27 6ZM27 24H10C9.75992 24.0001 9.52787 24.0866 9.34629 24.2437L5.00004 28V8H27V24Z\"\n fill={color}\n />\n <path\n d=\"M21.1758 12V20.5312H19.7168V12H21.1758ZM23.8535 12V13.1719H17.0625V12H23.8535Z\"\n fill={color}\n />\n <path\n d=\"M13.2402 17.3496H11.0195V16.1836H13.2402C13.627 16.1836 13.9395 16.1211 14.1777 15.9961C14.416 15.8711 14.5898 15.6992 14.6992 15.4805C14.8125 15.2578 14.8691 15.0039 14.8691 14.7188C14.8691 14.4492 14.8125 14.1973 14.6992 13.9629C14.5898 13.7246 14.416 13.5332 14.1777 13.3887C13.9395 13.2441 13.627 13.1719 13.2402 13.1719H11.4707V20.5312H10V12H13.2402C13.9004 12 14.4609 12.1172 14.9219 12.3516C15.3867 12.582 15.7402 12.9023 15.9824 13.3125C16.2246 13.7188 16.3457 14.1836 16.3457 14.707C16.3457 15.2578 16.2246 15.7305 15.9824 16.125C15.7402 16.5195 15.3867 16.8223 14.9219 17.0332C14.4609 17.2441 13.9004 17.3496 13.2402 17.3496Z\"\n fill={color}\n />\n </svg>\n);\n","export const ChatEN = ({ size, color }: { size: number; color: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M27 6H5.00004C4.4696 6 3.9609 6.21071 3.58582 6.58579C3.21075 6.96086 3.00004 7.46957 3.00004 8V28C2.99773 28.3814 3.10562 28.7553 3.31074 29.0768C3.51585 29.3984 3.80947 29.6538 4.15629 29.8125C4.42057 29.9356 4.7085 29.9995 5.00004 30C5.46954 29.9989 5.92347 29.8315 6.28129 29.5275L6.29254 29.5187L10.375 26H27C27.5305 26 28.0392 25.7893 28.4142 25.4142C28.7893 25.0391 29 24.5304 29 24V8C29 7.46957 28.7893 6.96086 28.4142 6.58579C28.0392 6.21071 27.5305 6 27 6ZM27 24H10C9.75992 24.0001 9.52787 24.0866 9.34629 24.2437L5.00004 28V8H27V24Z\"\n fill={color}\n />\n <path\n d=\"M22.5488 12V20.5312H21.0781L17.252 14.4199V20.5312H15.7812V12H17.252L21.0898 18.123V12H22.5488Z\"\n fill={color}\n />\n <path\n d=\"M14.584 19.3652V20.5312H10.0547V19.3652H14.584ZM10.4707 12V20.5312H9V12H10.4707ZM13.9922 15.5625V16.7109H10.0547V15.5625H13.9922ZM14.5547 12V13.1719H10.0547V12H14.5547Z\"\n fill={color}\n />\n </svg>\n);\n","export const ChatES = ({ size, color }: { size: number; color: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M27 6H5.00004C4.4696 6 3.9609 6.21071 3.58582 6.58579C3.21075 6.96086 3.00004 7.46957 3.00004 8V28C2.99773 28.3814 3.10562 28.7553 3.31074 29.0768C3.51585 29.3984 3.80947 29.6538 4.15629 29.8125C4.42057 29.9356 4.7085 29.9995 5.00004 30C5.46954 29.9989 5.92347 29.8315 6.28129 29.5275L6.29254 29.5187L10.375 26H27C27.5305 26 28.0392 25.7893 28.4142 25.4142C28.7893 25.0391 29 24.5304 29 24V8C29 7.46957 28.7893 6.96086 28.4142 6.58579C28.0392 6.21071 27.5305 6 27 6ZM27 24H10C9.75992 24.0001 9.52787 24.0866 9.34629 24.2437L5.00004 28V8H27V24Z\"\n fill={color}\n />\n <path\n d=\"M21.1426 17.8027C21.1426 17.627 21.1152 17.4707 21.0605 17.334C21.0098 17.1973 20.918 17.0723 20.7852 16.959C20.6523 16.8457 20.4648 16.7363 20.2227 16.6309C19.9844 16.5215 19.6797 16.4102 19.3086 16.2969C18.9023 16.1719 18.5273 16.0332 18.1836 15.8809C17.8438 15.7246 17.5469 15.5449 17.293 15.3418C17.0391 15.1348 16.8418 14.8984 16.7012 14.6328C16.5605 14.3633 16.4902 14.0527 16.4902 13.7012C16.4902 13.3535 16.5625 13.0371 16.707 12.752C16.8555 12.4668 17.0645 12.2207 17.334 12.0137C17.6074 11.8027 17.9297 11.6406 18.3008 11.5273C18.6719 11.4102 19.082 11.3516 19.5312 11.3516C20.1641 11.3516 20.709 11.4688 21.166 11.7031C21.627 11.9375 21.9805 12.252 22.2266 12.6465C22.4766 13.041 22.6016 13.4766 22.6016 13.9531H21.1426C21.1426 13.6719 21.082 13.4238 20.9609 13.209C20.8438 12.9902 20.6641 12.8184 20.4219 12.6934C20.1836 12.5684 19.8809 12.5059 19.5137 12.5059C19.166 12.5059 18.877 12.5586 18.6465 12.6641C18.416 12.7695 18.2441 12.9121 18.1309 13.0918C18.0176 13.2715 17.9609 13.4746 17.9609 13.7012C17.9609 13.8613 17.998 14.0078 18.0723 14.1406C18.1465 14.2695 18.2598 14.3906 18.4121 14.5039C18.5645 14.6133 18.7559 14.7168 18.9863 14.8145C19.2168 14.9121 19.4883 15.0059 19.8008 15.0957C20.2734 15.2363 20.6855 15.3926 21.0371 15.5645C21.3887 15.7324 21.6816 15.9238 21.916 16.1387C22.1504 16.3535 22.3262 16.5977 22.4434 16.8711C22.5605 17.1406 22.6191 17.4473 22.6191 17.791C22.6191 18.1504 22.5469 18.4746 22.4023 18.7637C22.2578 19.0488 22.0508 19.293 21.7812 19.4961C21.5156 19.6953 21.1953 19.8496 20.8203 19.959C20.4492 20.0645 20.0352 20.1172 19.5781 20.1172C19.168 20.1172 18.7637 20.0625 18.3652 19.9531C17.9707 19.8438 17.6113 19.6777 17.2871 19.4551C16.9629 19.2285 16.7051 18.9473 16.5137 18.6113C16.3223 18.2715 16.2266 17.875 16.2266 17.4219H17.6973C17.6973 17.6992 17.7441 17.9355 17.8379 18.1309C17.9355 18.3262 18.0703 18.4863 18.2422 18.6113C18.4141 18.7324 18.6133 18.8223 18.8398 18.8809C19.0703 18.9395 19.3164 18.9688 19.5781 18.9688C19.9219 18.9688 20.209 18.9199 20.4395 18.8223C20.6738 18.7246 20.8496 18.5879 20.9668 18.4121C21.084 18.2363 21.1426 18.0332 21.1426 17.8027Z\"\n fill={color}\n />\n <path\n d=\"M15.4512 18.834V20H10.9219V18.834H15.4512ZM11.3379 11.4688V20H9.86719V11.4688H11.3379ZM14.8594 15.0312V16.1797H10.9219V15.0312H14.8594ZM15.4219 11.4688V12.6406H10.9219V11.4688H15.4219Z\"\n fill={color}\n />\n </svg>\n);\n","export const BookOpenText = ({\n size,\n color,\n}: {\n size: number;\n color: string;\n}) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M29 6H20C19.2238 6 18.4582 6.18073 17.7639 6.52786C17.0697 6.875 16.4657 7.37902 16 8C15.5343 7.37902 14.9303 6.875 14.2361 6.52786C13.5418 6.18073 12.7762 6 12 6H3C2.73478 6 2.48043 6.10536 2.29289 6.29289C2.10536 6.48043 2 6.73478 2 7V25C2 25.2652 2.10536 25.5196 2.29289 25.7071C2.48043 25.8946 2.73478 26 3 26H12C12.7956 26 13.5587 26.3161 14.1213 26.8787C14.6839 27.4413 15 28.2044 15 29C15 29.2652 15.1054 29.5196 15.2929 29.7071C15.4804 29.8946 15.7348 30 16 30C16.2652 30 16.5196 29.8946 16.7071 29.7071C16.8946 29.5196 17 29.2652 17 29C17 28.2044 17.3161 27.4413 17.8787 26.8787C18.4413 26.3161 19.2044 26 20 26H29C29.2652 26 29.5196 25.8946 29.7071 25.7071C29.8946 25.5196 30 25.2652 30 25V7C30 6.73478 29.8946 6.48043 29.7071 6.29289C29.5196 6.10536 29.2652 6 29 6ZM12 24H4V8H12C12.7956 8 13.5587 8.31607 14.1213 8.87868C14.6839 9.44129 15 10.2044 15 11V25C14.1353 24.3493 13.0821 23.9983 12 24ZM28 24H20C18.9179 23.9983 17.8647 24.3493 17 25V11C17 10.2044 17.3161 9.44129 17.8787 8.87868C18.4413 8.31607 19.2044 8 20 8H28V24ZM20 11H25C25.2652 11 25.5196 11.1054 25.7071 11.2929C25.8946 11.4804 26 11.7348 26 12C26 12.2652 25.8946 12.5196 25.7071 12.7071C25.5196 12.8946 25.2652 13 25 13H20C19.7348 13 19.4804 12.8946 19.2929 12.7071C19.1054 12.5196 19 12.2652 19 12C19 11.7348 19.1054 11.4804 19.2929 11.2929C19.4804 11.1054 19.7348 11 20 11ZM26 16C26 16.2652 25.8946 16.5196 25.7071 16.7071C25.5196 16.8946 25.2652 17 25 17H20C19.7348 17 19.4804 16.8946 19.2929 16.7071C19.1054 16.5196 19 16.2652 19 16C19 15.7348 19.1054 15.4804 19.2929 15.2929C19.4804 15.1054 19.7348 15 20 15H25C25.2652 15 25.5196 15.1054 25.7071 15.2929C25.8946 15.4804 26 15.7348 26 16ZM26 20C26 20.2652 25.8946 20.5196 25.7071 20.7071C25.5196 20.8946 25.2652 21 25 21H20C19.7348 21 19.4804 20.8946 19.2929 20.7071C19.1054 20.5196 19 20.2652 19 20C19 19.7348 19.1054 19.4804 19.2929 19.2929C19.4804 19.1054 19.7348 19 20 19H25C25.2652 19 25.5196 19.1054 25.7071 19.2929C25.8946 19.4804 26 19.7348 26 20Z\"\n fill={color}\n />\n </svg>\n);\n","export const Microscope = ({\n size,\n color,\n}: {\n size: number;\n color: string;\n}) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M28 26H25.4925C26.7637 24.4552 27.5898 22.5932 27.882 20.6142C28.1743 18.6351 27.9216 16.6138 27.1511 14.7676C26.3806 12.9213 25.1215 11.32 23.5092 10.1358C21.8968 8.95153 19.9922 8.22913 18 8.04625V4C18 3.46957 17.7893 2.96086 17.4142 2.58579C17.0391 2.21071 16.5304 2 16 2H10C9.46957 2 8.96086 2.21071 8.58579 2.58579C8.21071 2.96086 8 3.46957 8 4V17C8 17.5304 8.21071 18.0391 8.58579 18.4142C8.96086 18.7893 9.46957 19 10 19H16C16.5304 19 17.0391 18.7893 17.4142 18.4142C17.7893 18.0391 18 17.5304 18 17V10.0575C19.7643 10.2552 21.4306 10.9703 22.7895 12.1128C24.1483 13.2553 25.1389 14.7742 25.6366 16.4783C26.1343 18.1824 26.1169 19.9957 25.5866 21.69C25.0563 23.3842 24.0368 24.8838 22.6562 26H4C3.73478 26 3.48043 26.1054 3.29289 26.2929C3.10536 26.4804 3 26.7348 3 27C3 27.2652 3.10536 27.5196 3.29289 27.7071C3.48043 27.8946 3.73478 28 4 28H28C28.2652 28 28.5196 27.8946 28.7071 27.7071C28.8946 27.5196 29 27.2652 29 27C29 26.7348 28.8946 26.4804 28.7071 26.2929C28.5196 26.1054 28.2652 26 28 26ZM16 17H10V4H16V17ZM9 23C8.73478 23 8.48043 22.8946 8.29289 22.7071C8.10536 22.5196 8 22.2652 8 22C8 21.7348 8.10536 21.4804 8.29289 21.2929C8.48043 21.1054 8.73478 21 9 21H17C17.2652 21 17.5196 21.1054 17.7071 21.2929C17.8946 21.4804 18 21.7348 18 22C18 22.2652 17.8946 22.5196 17.7071 22.7071C17.5196 22.8946 17.2652 23 17 23H9Z\"\n fill={color}\n />\n </svg>\n);\n","export const HeadCircuit = ({\n size,\n color,\n}: {\n size: number;\n color: string;\n}) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M24.0625 21.4338C25.327 20.3715 26.3372 19.0392 27.0187 17.5348C27.7001 16.0304 28.0354 14.3924 28 12.7413C27.875 7.02751 23.2987 2.31626 17.595 2.01626C16.1233 1.93616 14.6506 2.15261 13.2642 2.65277C11.8778 3.15293 10.6061 3.92659 9.52453 4.92781C8.44297 5.92903 7.57365 7.13739 6.96819 8.48112C6.36272 9.82485 6.03347 11.2766 5.99997 12.75L3.19372 18.1475C3.18247 18.17 3.17122 18.1925 3.16122 18.215C2.96003 18.6839 2.94569 19.212 3.12114 19.6912C3.29659 20.1704 3.64855 20.5644 4.10497 20.7925L4.13622 20.8063L6.99997 22.1175V26C6.99997 26.5304 7.21068 27.0392 7.58576 27.4142C7.96083 27.7893 8.46954 28 8.99997 28H15C15.2652 28 15.5195 27.8947 15.7071 27.7071C15.8946 27.5196 16 27.2652 16 27C16 26.7348 15.8946 26.4804 15.7071 26.2929C15.5195 26.1054 15.2652 26 15 26H8.99997V21.4763C9.00011 21.2846 8.94517 21.0969 8.84168 20.9356C8.73818 20.7742 8.5905 20.646 8.41622 20.5663L4.99997 19L7.88372 13.4575C7.95889 13.3166 7.99878 13.1597 7.99997 13C7.99968 10.9604 8.69216 8.98124 9.96395 7.38674C11.2357 5.79224 13.0114 4.677 15 4.22376V6.17251C14.3328 6.4084 13.7704 6.87258 13.4123 7.48299C13.0543 8.0934 12.9235 8.81075 13.0432 9.50824C13.1628 10.2057 13.5252 10.8385 14.0663 11.2946C14.6074 11.7508 15.2923 12.0009 16 12.0009C16.7077 12.0009 17.3926 11.7508 17.9336 11.2946C18.4747 10.8385 18.8371 10.2057 18.9568 9.50824C19.0764 8.81075 18.9457 8.0934 18.5876 7.48299C18.2295 6.87258 17.6672 6.4084 17 6.17251V4.00001C17.1625 4.00001 17.325 4.00001 17.4875 4.01251C19.2608 4.11409 20.9649 4.73627 22.3864 5.80124C23.808 6.86621 24.8841 8.32669 25.48 10H23C22.8533 9.99995 22.7084 10.0322 22.5755 10.0944C22.4426 10.1566 22.3251 10.2473 22.2312 10.36L19.0425 14.1875C18.3774 13.9397 17.6462 13.9351 16.9781 14.1744C16.3099 14.4138 15.748 14.8817 15.3916 15.4954C15.0352 16.1092 14.9073 16.8292 15.0306 17.5281C15.1538 18.227 15.5203 18.8598 16.0652 19.3146C16.61 19.7694 17.2981 20.0168 18.0078 20.0132C18.7175 20.0095 19.4031 19.755 19.9432 19.2947C20.4834 18.8343 20.8433 18.1977 20.9594 17.4976C21.0754 16.7974 20.9402 16.0788 20.5775 15.4688L23.4687 12H25.9425C25.9725 12.26 25.9908 12.5225 25.9975 12.7875C26.0286 14.2198 25.7187 15.639 25.0931 16.9278C24.4676 18.2167 23.5445 19.3383 22.4 20.2C22.2589 20.3057 22.1484 20.4469 22.0794 20.6091C22.0105 20.7713 21.9857 20.9489 22.0075 21.1238L23.0075 29.1238C23.0379 29.3653 23.1554 29.5874 23.3379 29.7485C23.5203 29.9095 23.7553 29.9985 23.9987 29.9988C24.0405 29.9988 24.0822 29.9962 24.1237 29.9913C24.2541 29.975 24.3799 29.9333 24.4942 29.8684C24.6084 29.8035 24.7087 29.7168 24.7893 29.6131C24.87 29.5094 24.9295 29.3909 24.9643 29.2643C24.9992 29.1376 25.0087 29.0054 24.9925 28.875L24.0625 21.4338ZM16 10C15.8022 10 15.6088 9.94136 15.4444 9.83148C15.28 9.7216 15.1518 9.56542 15.0761 9.38269C15.0004 9.19997 14.9806 8.9989 15.0192 8.80492C15.0578 8.61094 15.153 8.43275 15.2929 8.2929C15.4327 8.15305 15.6109 8.05781 15.8049 8.01922C15.9989 7.98064 16.1999 8.00044 16.3827 8.07613C16.5654 8.15182 16.7216 8.27999 16.8314 8.44444C16.9413 8.60889 17 8.80223 17 9.00001C17 9.26523 16.8946 9.51958 16.7071 9.70712C16.5195 9.89465 16.2652 10 16 10ZM18 18C17.8022 18 17.6088 17.9414 17.4444 17.8315C17.28 17.7216 17.1518 17.5654 17.0761 17.3827C17.0004 17.2 16.9806 16.9989 17.0192 16.8049C17.0578 16.6109 17.153 16.4328 17.2929 16.2929C17.4327 16.153 17.6109 16.0578 17.8049 16.0192C17.9989 15.9806 18.1999 16.0004 18.3827 16.0761C18.5654 16.1518 18.7216 16.28 18.8314 16.4444C18.9413 16.6089 19 16.8022 19 17C19 17.2652 18.8946 17.5196 18.7071 17.7071C18.5195 17.8947 18.2652 18 18 18Z\"\n fill={color}\n />\n </svg>\n);\n","import {\n Children,\n cloneElement,\n forwardRef,\n HTMLAttributes,\n isValidElement,\n ReactElement,\n ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { create, StoreApi } from 'zustand';\nimport { CardAccordationProps } from './Accordation';\n\ninterface AccordionGroupStore {\n type: 'single' | 'multiple';\n value: string | string[];\n collapsible: boolean;\n setValue: (value: string | string[]) => void;\n isItemExpanded: (itemValue: string) => boolean;\n}\n\ntype AccordionGroupStoreApi = StoreApi<AccordionGroupStore>;\n\nfunction createAccordionGroupStore(\n type: 'single' | 'multiple',\n initialValue: string | string[],\n collapsible: boolean\n): AccordionGroupStoreApi {\n return create<AccordionGroupStore>((set, get) => ({\n type,\n value: initialValue,\n collapsible,\n setValue: (value) => set({ value }),\n isItemExpanded: (itemValue: string): boolean => {\n const state = get();\n if (state.type === 'single') {\n return state.value === itemValue;\n } else {\n return Array.isArray(state.value) && state.value.includes(itemValue);\n }\n },\n }));\n}\n\ninterface AccordionGroupProps extends HTMLAttributes<HTMLDivElement> {\n type?: 'single' | 'multiple';\n defaultValue?: string | string[];\n value?: string | string[];\n onValueChange?: (value: string | string[]) => void;\n collapsible?: boolean;\n children: ReactNode;\n}\n\n// Helper function to inject store only to CardAccordation components\nconst injectStore = (\n children: ReactNode,\n store: AccordionGroupStoreApi,\n indexRef: { current: number },\n onItemToggle: (itemValue: string, isExpanded: boolean) => void\n): ReactNode => {\n return Children.map(children, (child) => {\n if (!isValidElement(child)) {\n return child;\n }\n\n const typedChild = child as ReactElement<\n CardAccordationProps & {\n children?: ReactNode;\n }\n >;\n\n // Check component displayName\n const displayName = (typedChild.type as unknown as { displayName?: string })\n ?.displayName;\n\n // Stop recursion at nested AccordionGroup - it manages its own children\n if (displayName === 'AccordionGroup') {\n return child;\n }\n\n let newProps: Partial<{\n children: ReactNode;\n value: string;\n expanded: boolean;\n onToggleExpanded: (isExpanded: boolean) => void;\n }> = {};\n\n if (displayName === 'CardAccordation') {\n // Generate value if not provided\n const itemValue =\n typedChild.props.value || `accordion-item-${indexRef.current++}`;\n\n // Get expanded state from store\n const storeState = store.getState();\n const expanded = storeState.isItemExpanded(itemValue);\n\n newProps.value = itemValue;\n newProps.expanded = expanded;\n newProps.onToggleExpanded = (isExpanded: boolean) => {\n onItemToggle(itemValue, isExpanded);\n typedChild.props.onToggleExpanded?.(isExpanded);\n };\n }\n\n // Recursively process children\n if (typedChild.props.children) {\n const processedChildren = injectStore(\n typedChild.props.children,\n store,\n indexRef,\n onItemToggle\n );\n\n // If it's a CardAccordation, add children to newProps\n if (displayName === 'CardAccordation') {\n newProps.children = processedChildren;\n } else if (processedChildren !== typedChild.props.children) {\n // For other elements, only clone if children changed\n return cloneElement(typedChild, { children: processedChildren });\n }\n }\n\n // Only clone if we have props to inject (only for CardAccordation)\n if (Object.keys(newProps).length > 0) {\n return cloneElement(typedChild, newProps);\n }\n\n return child;\n });\n};\n\nconst AccordionGroup = forwardRef<HTMLDivElement, AccordionGroupProps>(\n (\n {\n type = 'single',\n defaultValue,\n value: controlledValue,\n onValueChange,\n collapsible = true,\n children,\n className,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = useState<string | string[]>(\n defaultValue || (type === 'single' ? '' : [])\n );\n\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n // Create store only once using useRef\n const storeRef = useRef<AccordionGroupStoreApi | null>(null);\n if (storeRef.current) {\n // Update store configuration when props change\n storeRef.current.setState((prev) => {\n const nextState: Partial<AccordionGroupStore> = {};\n if (prev.type !== type) {\n nextState.type = type;\n }\n if (prev.collapsible !== collapsible) {\n nextState.collapsible = collapsible;\n }\n return nextState;\n });\n } else {\n // Create store on first render\n storeRef.current = createAccordionGroupStore(\n type,\n currentValue,\n collapsible\n );\n }\n const store = storeRef.current;\n\n // Sync store value when currentValue changes\n useEffect(() => {\n store.setState({ value: currentValue });\n }, [currentValue, store]);\n\n // Normalize internal value when type changes (uncontrolled mode)\n useEffect(() => {\n if (!isControlled) {\n setInternalValue((prev) => {\n if (type === 'single') {\n if (Array.isArray(prev)) {\n return prev[0] ?? '';\n }\n return typeof prev === 'string' ? prev : '';\n }\n if (Array.isArray(prev)) {\n return prev;\n }\n return prev ? [prev] : [];\n });\n }\n }, [isControlled, type]);\n\n const handleItemToggle = (itemValue: string, isExpanded: boolean) => {\n const storeState = store.getState();\n let newValue: string | string[];\n\n if (type === 'single') {\n // Single mode: only one item can be open at a time\n if (isExpanded) {\n newValue = itemValue;\n } else {\n // If collapsible, allow closing the current item\n newValue = collapsible ? '' : (storeState.value as string);\n }\n } else {\n // Multiple mode: multiple items can be open\n const currentArray = Array.isArray(storeState.value)\n ? storeState.value\n : [];\n\n if (isExpanded) {\n newValue = [...currentArray, itemValue];\n } else {\n newValue = currentArray.filter((v) => v !== itemValue);\n }\n }\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n store.setState({ value: newValue });\n onValueChange?.(newValue);\n };\n\n // Use ref to track index across recursive calls\n const indexRef = { current: 0 };\n const enhancedChildren = injectStore(\n children,\n store,\n indexRef,\n handleItemToggle\n );\n\n return (\n <div ref={ref} className={className} {...props}>\n {enhancedChildren}\n </div>\n );\n }\n);\n\nAccordionGroup.displayName = 'AccordionGroup';\n\nexport { AccordionGroup };\n","import { Star, Medal, WarningCircle, Info } from 'phosphor-react';\nimport type { Icon } from 'phosphor-react';\nimport Text from '../../Text/Text';\nimport { cn } from '../../../utils/utils';\n\n/**\n * Available variants for the StatCard component\n */\nexport type StatVariant = 'score' | 'correct' | 'incorrect' | 'blank';\n\n/**\n * Configuration for each stat card variant\n */\nexport const variantConfig: Record<\n StatVariant,\n {\n bg: string;\n text: string;\n iconBg: string;\n iconColor: string;\n IconComponent: Icon;\n }\n> = {\n score: {\n bg: 'bg-warning-background',\n text: 'text-warning-600',\n iconBg: 'bg-warning-300',\n iconColor: 'text-white',\n IconComponent: Star,\n },\n correct: {\n bg: 'bg-success-200',\n text: 'text-success-700',\n iconBg: 'bg-indicator-positive',\n iconColor: 'text-text-950',\n IconComponent: Medal,\n },\n incorrect: {\n bg: 'bg-error-100',\n text: 'text-error-700',\n iconBg: 'bg-indicator-negative',\n iconColor: 'text-white',\n IconComponent: WarningCircle,\n },\n blank: {\n bg: 'bg-info',\n text: 'text-info-800',\n iconBg: 'bg-indicator-info',\n iconColor: 'text-white',\n IconComponent: Info,\n },\n};\n\n/**\n * Props for the StatCard component\n */\nexport interface StatCardProps {\n /** Label text displayed above the value */\n label: string;\n /** Value to display (can be string or number) */\n value: string | number;\n /** Visual variant determining colors and icon */\n variant: StatVariant;\n /** Optional additional className */\n className?: string;\n}\n\n/**\n * StatCard component for displaying statistics with an icon\n *\n * Used in activity correction and performance modals to show\n * score, correct answers count, and incorrect answers count.\n *\n * @example\n * ```tsx\n * <StatCard label=\"NOTA\" value=\"8.5\" variant=\"score\" />\n * <StatCard label=\"CORRETAS\" value={10} variant=\"correct\" />\n * <StatCard label=\"INCORRETAS\" value={2} variant=\"incorrect\" />\n * ```\n */\nexport const StatCard = ({\n label,\n value,\n variant,\n className,\n}: StatCardProps) => {\n const config = variantConfig[variant];\n const IconComponent = config.IconComponent;\n\n return (\n <div\n className={cn(\n 'border border-border-50 rounded-xl py-4 px-3 flex flex-col items-center justify-center gap-1',\n config.bg,\n className\n )}\n >\n <div\n className={cn(\n 'w-[30px] h-[30px] rounded-2xl flex items-center justify-center',\n config.iconBg\n )}\n >\n <IconComponent\n size={16}\n className={config.iconColor}\n weight=\"regular\"\n />\n </div>\n <Text\n className={cn('text-2xs font-bold uppercase text-center', config.text)}\n >\n {label}\n </Text>\n <Text className={cn('text-xl font-bold', config.text)}>{value}</Text>\n </div>\n );\n};\n\nexport default StatCard;\n","/**\n * Question status enum for student activity correction\n * Maps from ANSWER_STATUS to a simpler status for UI display\n */\nexport const QUESTION_STATUS = {\n CORRETA: 'CORRETA',\n INCORRETA: 'INCORRETA',\n EM_BRANCO: 'EM_BRANCO',\n /** Reserved for future use - pending teacher evaluation for essay questions */\n PENDENTE: 'PENDENTE',\n} as const;\n\nexport type QuestionStatus =\n (typeof QUESTION_STATUS)[keyof typeof QUESTION_STATUS];\n","import { StatusBadgeConfig } from '@/types/activityDetails';\nimport {\n ANSWER_STATUS,\n QUESTION_TYPE,\n} from '../../components/Quiz/useQuizStore';\nimport { QUESTION_STATUS, type QuestionStatus } from './constants';\nimport type { CorrectionQuestionData } from './types';\n\n/**\n * Returns whether the answer is correct, incorrect, or null based on the answer status.\n * @param answerStatus - Answer status from ANSWER_STATUS enum\n * @returns Returns true for correct, false for incorrect, or null if undefined.\n */\nexport const getIsCorrect = (answerStatus: ANSWER_STATUS): boolean | null => {\n if (answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) return true;\n if (answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA) return false;\n return null;\n};\n\n/**\n * Map ANSWER_STATUS from Quiz to QUESTION_STATUS for correction modal\n * @param answerStatus - Answer status from QuestionResult\n * @returns QuestionStatus for UI display\n */\nexport const mapAnswerStatusToQuestionStatus = (\n answerStatus: ANSWER_STATUS\n): QuestionStatus => {\n switch (answerStatus) {\n case ANSWER_STATUS.RESPOSTA_CORRETA:\n return QUESTION_STATUS.CORRETA;\n case ANSWER_STATUS.RESPOSTA_INCORRETA:\n return QUESTION_STATUS.INCORRETA;\n case ANSWER_STATUS.NAO_RESPONDIDO:\n return QUESTION_STATUS.EM_BRANCO;\n case ANSWER_STATUS.PENDENTE_AVALIACAO:\n return QUESTION_STATUS.PENDENTE;\n default:\n return QUESTION_STATUS.EM_BRANCO;\n }\n};\n\n/**\n * Get question status badge configuration\n * @param status - Question status\n * @returns Badge configuration with label and colors\n */\nexport const getQuestionStatusBadgeConfig = (status: QuestionStatus) => {\n const configs: Partial<Record<QuestionStatus, StatusBadgeConfig>> = {\n [QUESTION_STATUS.CORRETA]: {\n label: 'Correta',\n bgColor: 'bg-success-background',\n textColor: 'text-success-800',\n },\n [QUESTION_STATUS.INCORRETA]: {\n label: 'Incorreta',\n bgColor: 'bg-error-background',\n textColor: 'text-error-800',\n },\n [QUESTION_STATUS.EM_BRANCO]: {\n label: 'Em branco',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n },\n [QUESTION_STATUS.PENDENTE]: {\n label: 'Pendente',\n bgColor: 'bg-warning-background',\n textColor: 'text-warning-800',\n },\n };\n\n const defaultConfig = {\n label: 'Sem categoria',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n };\n\n return configs[status] ?? defaultConfig;\n};\n\n/**\n * Check if question can be auto-validated based on options\n * All question types can be auto-validated except DISSERTATIVA (essay questions)\n * @param questionData - Correction question data\n * @returns true if can auto-validate, false otherwise\n */\nexport const canAutoValidate = (\n questionData: CorrectionQuestionData\n): boolean => {\n const { result } = questionData;\n\n // Only dissertative questions require manual evaluation\n if (result.questionType === QUESTION_TYPE.DISSERTATIVA) {\n return false;\n }\n\n return true;\n};\n\ntype Option = {\n id: string;\n option: string;\n isCorrect: boolean;\n};\n\n/**\n * Type predicate to check if an option has isCorrect defined\n */\nconst hasIsCorrect = (op: {\n id: string;\n option: string;\n isCorrect?: boolean | null;\n}): op is Option => {\n return op.isCorrect != null;\n};\n\n/**\n * Validate alternativa (single choice) question\n * Must select exactly one correct option\n */\nconst validateAlternativa = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n if (selected.size !== 1) return ANSWER_STATUS.RESPOSTA_INCORRETA;\n\n const [selectedId] = selected;\n return options.find((o) => o.id === selectedId)?.isCorrect\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate multipla escolha (multiple choice) question\n * Each option must match its correct state: selected if correct, not selected if incorrect\n */\nconst validateMultiplaEscolha = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n const allMatch = options.every((op) => selected.has(op.id) === op.isCorrect);\n\n return allMatch\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate verdadeiro/falso (true/false) question\n * Each statement is evaluated individually: if statement is true, must be selected;\n * if statement is false, must not be selected\n */\nconst validateVerdadeiroFalso = validateMultiplaEscolha;\n\nconst validators: Partial<\n Record<QUESTION_TYPE, (s: Set<string>, o: Option[]) => ANSWER_STATUS>\n> = {\n [QUESTION_TYPE.ALTERNATIVA]: validateAlternativa,\n [QUESTION_TYPE.MULTIPLA_ESCOLHA]: validateMultiplaEscolha,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: validateVerdadeiroFalso,\n};\n\n/**\n * Auto-validate question based on selected options vs correct options\n * @param questionData - Correction question data\n * @returns ANSWER_STATUS if can determine, null otherwise\n */\nexport const autoValidateQuestion = (\n questionData: CorrectionQuestionData\n): ANSWER_STATUS | null => {\n const { result } = questionData;\n\n if (!canAutoValidate(questionData) || !result.options) return null;\n\n // Filter options to only include those with isCorrect defined\n const validOptions = result.options.filter(hasIsCorrect);\n if (validOptions.length === 0) return null;\n\n const selected = new Set(\n result.selectedOptions?.map((o) => o.optionId) ?? []\n );\n\n if (selected.size === 0) return ANSWER_STATUS.NAO_RESPONDIDO;\n\n const validator = validators[result.questionType];\n if (!validator) return null;\n\n return validator(selected, validOptions);\n};\n\n/**\n * Get question status from CorrectionQuestionData\n * Maps the result's answerStatus to QuestionStatus\n * If status is PENDENTE_AVALIACAO but can auto-validate, calculates status automatically\n * @param questionData - Correction question data\n * @returns QuestionStatus for UI display\n */\nexport const getQuestionStatusFromData = (\n questionData: CorrectionQuestionData\n): QuestionStatus => {\n const { result } = questionData;\n\n // If pending evaluation, try to auto-validate\n if (\n result.answerStatus === ANSWER_STATUS.PENDENTE_AVALIACAO &&\n canAutoValidate(questionData)\n ) {\n const autoValidatedStatus = autoValidateQuestion(questionData);\n if (autoValidatedStatus !== null) {\n return mapAnswerStatusToQuestionStatus(autoValidatedStatus);\n }\n }\n\n return mapAnswerStatusToQuestionStatus(result.answerStatus);\n};\n","import { CheckCircle, XCircle } from 'phosphor-react';\nimport Badge from '../Badge/Badge';\nimport { RadioGroup, RadioGroupItem } from '../Radio/Radio';\nimport { forwardRef, HTMLAttributes, useId, useState } from 'react';\nimport { cn } from '../../utils/utils';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\nimport { QuizVariant } from '../Quiz/Quiz.types';\nimport { OptionStatus } from '../../enums/Options';\n\n/**\n * Interface para definir uma alternativa\n */\nexport interface Alternative {\n value: string;\n label: string;\n status?: OptionStatus;\n disabled?: boolean;\n description?: string;\n}\n\n/**\n * Props do componente AlternativesList\n */\nexport interface AlternativesListProps {\n /** Lista de alternativas */\n alternatives: Alternative[];\n /** Nome do grupo de radio */\n name?: string;\n /** Valor selecionado por padrão */\n defaultValue?: string;\n /** Valor controlado */\n value?: string;\n /** Callback quando uma alternativa é selecionada */\n onValueChange?: (value: string) => void;\n /** Se o componente está desabilitado */\n disabled?: boolean;\n /** Layout das alternativas */\n layout?: 'default' | 'compact' | 'detailed';\n /** Classes CSS adicionais */\n className?: string;\n /** Modo de exibição: interativo (com radios funcionais) ou readonly (apenas visual) */\n mode?: 'interactive' | 'readonly';\n /** Valor selecionado pelo usuário (apenas para modo readonly) */\n selectedValue?: string;\n}\n\n/**\n * Componente reutilizável para exibir lista de alternativas com RadioGroup\n *\n * Suporta dois modos:\n * - `interactive`: Permite interação com radios (padrão)\n * - `readonly`: Apenas exibição visual dos estados\n *\n * @example\n * ```tsx\n * // Modo interativo (padrão)\n * <AlternativesList\n * mode=\"interactive\"\n * alternatives={[\n * { value: \"a\", label: \"Alternativa A\", status: \"correct\" },\n * { value: \"b\", label: \"Alternativa B\", status: \"incorrect\" },\n * { value: \"c\", label: \"Alternativa C\" }\n * ]}\n * defaultValue=\"a\"\n * onValueChange={(value) => console.log(value)}\n * />\n *\n * // Modo readonly - mostra seleção do usuário\n * <AlternativesList\n * mode=\"readonly\"\n * selectedValue=\"b\" // O que o usuário selecionou\n * alternatives={[\n * { value: \"a\", label: \"Resposta A\", status: \"correct\" }, // Mostra como correta\n * { value: \"b\", label: \"Resposta B\" }, // Mostra radio selecionado + badge incorreto\n * { value: \"c\", label: \"Resposta C\" }\n * ]}\n * />\n * ```\n */\nconst AlternativesList = ({\n alternatives,\n name,\n defaultValue,\n value,\n onValueChange,\n disabled = false,\n layout = 'default',\n className = '',\n mode = QuizVariant.INTERACTIVE,\n selectedValue,\n}: AlternativesListProps) => {\n // Gerar um ID único para garantir que cada instância tenha seu próprio grupo\n const uniqueId = useId();\n const groupName = name || `alternatives-${uniqueId}`;\n const [actualValue, setActualValue] = useState(value);\n // No modo readonly, não precisamos de interação\n const isReadonly = mode === 'readonly';\n const getStatusStyles = (\n status?: Alternative['status'],\n isReadonly?: boolean\n ) => {\n const hoverClass = isReadonly ? '' : 'hover:bg-background-50';\n\n switch (status) {\n case OptionStatus.CORRECT:\n return 'bg-success-background border-success-300';\n case OptionStatus.INCORRECT:\n return 'bg-error-background border-error-300';\n default:\n return `bg-background border-border-100 ${hoverClass}`;\n }\n };\n\n const getStatusBadge = (status?: Alternative['status']) => {\n switch (status) {\n case OptionStatus.CORRECT:\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircle />}>\n Resposta correta\n </Badge>\n );\n case OptionStatus.INCORRECT:\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircle />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n };\n\n const getLayoutClasses = () => {\n switch (layout) {\n case 'compact':\n return 'gap-2';\n case 'detailed':\n return 'gap-4';\n default:\n return 'gap-3.5';\n }\n };\n\n // Componente para renderizar alternativa no modo readonly\n const renderReadonlyAlternative = (alternative: Alternative) => {\n const alternativeId = alternative.value;\n const isUserSelected = selectedValue === alternative.value;\n const isCorrectAnswer = alternative.status === OptionStatus.CORRECT;\n\n // Determinar o status da alternativa para visualização\n let displayStatus: Alternative['status'] = undefined;\n if (isUserSelected && !isCorrectAnswer) {\n // Usuário selecionou alternativa incorreta\n displayStatus = OptionStatus.INCORRECT;\n } else if (isCorrectAnswer) {\n // Alternativa correta (independente se foi selecionada ou não)\n displayStatus = OptionStatus.CORRECT;\n }\n\n const statusStyles = getStatusStyles(displayStatus, true);\n const statusBadge = getStatusBadge(displayStatus);\n\n // Radio visual - apenas mostra selecionado se o usuário escolheu esta alternativa\n const renderRadio = () => {\n const radioClasses = `w-6 h-6 rounded-full border-2 cursor-default transition-all duration-200 flex items-center justify-center ${\n isUserSelected\n ? 'border-primary-950 bg-background'\n : 'border-border-400 bg-background'\n }`;\n\n const dotClasses =\n 'w-3 h-3 rounded-full bg-primary-950 transition-all duration-200';\n\n return (\n <div className={radioClasses}>\n {isUserSelected && <div className={dotClasses} />}\n </div>\n );\n };\n\n if (layout === 'detailed') {\n return (\n <div\n key={alternativeId}\n className={cn(\n 'border-2 rounded-lg p-4 w-full',\n statusStyles,\n alternative.disabled ? 'opacity-50' : ''\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1\">\n <div className=\"mt-1\">{renderRadio()}</div>\n <div className=\"flex-1\">\n <HtmlMathRenderer\n content={alternative.label}\n className={cn(\n 'block font-medium',\n selectedValue === alternative.value || statusBadge\n ? 'text-text-950'\n : 'text-text-600'\n )}\n />\n {alternative.description && (\n <p className=\"text-sm text-text-600 mt-1\">\n {alternative.description}\n </p>\n )}\n </div>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={alternativeId}\n className={cn(\n 'flex flex-row justify-between items-start gap-2 p-2 rounded-lg w-full',\n statusStyles,\n alternative.disabled ? 'opacity-50' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n {renderRadio()}\n <HtmlMathRenderer\n content={alternative.label}\n className={cn(\n 'flex-1',\n selectedValue === alternative.value || statusBadge\n ? 'text-text-950'\n : 'text-text-600'\n )}\n />\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n );\n };\n\n // Se for modo readonly, renderizar sem RadioGroup\n if (isReadonly) {\n return (\n <div\n className={cn('flex flex-col', getLayoutClasses(), 'w-full', className)}\n >\n {alternatives.map((alternative) =>\n renderReadonlyAlternative(alternative)\n )}\n </div>\n );\n }\n\n return (\n <RadioGroup\n name={groupName}\n defaultValue={defaultValue}\n value={value}\n onValueChange={(value) => {\n setActualValue(value);\n onValueChange?.(value);\n }}\n disabled={disabled}\n className={cn('flex flex-col', getLayoutClasses(), className)}\n >\n {alternatives.map((alternative, index) => {\n const alternativeId = alternative.value || `alt-${index}`;\n const statusStyles = getStatusStyles(alternative.status, false);\n const statusBadge = getStatusBadge(alternative.status);\n\n if (layout === 'detailed') {\n return (\n <div\n key={alternativeId}\n className={cn(\n 'border-2 rounded-lg p-4 transition-all',\n statusStyles,\n alternative.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1\">\n <RadioGroupItem\n value={alternative.value}\n id={alternativeId}\n disabled={alternative.disabled}\n className=\"mt-1\"\n />\n <div className=\"flex-1\">\n <label\n htmlFor={alternativeId}\n className={cn(\n 'block font-medium',\n actualValue === alternative.value\n ? 'text-text-950'\n : 'text-text-600',\n alternative.disabled\n ? 'cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n <HtmlMathRenderer content={alternative.label} inline />\n </label>\n {alternative.description && (\n <p className=\"text-sm text-text-600 mt-1\">\n {alternative.description}\n </p>\n )}\n </div>\n </div>\n {statusBadge && (\n <div className=\"flex-shrink-0\">{statusBadge}</div>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={alternativeId}\n className={cn(\n 'flex flex-row justify-between gap-2 items-start p-2 rounded-lg transition-all',\n statusStyles,\n alternative.disabled ? 'opacity-50 cursor-not-allowed' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n <RadioGroupItem\n value={alternative.value}\n id={alternativeId}\n disabled={alternative.disabled}\n />\n <label\n htmlFor={alternativeId}\n className={cn(\n 'flex-1',\n actualValue === alternative.value\n ? 'text-text-950'\n : 'text-text-600',\n alternative.disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n <HtmlMathRenderer content={alternative.label} inline />\n </label>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n );\n })}\n </RadioGroup>\n );\n};\n\ninterface HeaderAlternativeProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n subTitle: string;\n content: string;\n}\n\nconst HeaderAlternative = forwardRef<HTMLDivElement, HeaderAlternativeProps>(\n ({ className, title, subTitle, content, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-background p-4 flex flex-col gap-4 rounded-xl',\n className\n )}\n {...props}\n >\n <span className=\"flex flex-col\">\n <p className=\"text-text-950 font-bold text-lg\">{title}</p>\n <p className=\"text-text-700 text-sm \">{subTitle}</p>\n </span>\n\n <HtmlMathRenderer content={content} className=\"text-text-950 text-md\" />\n </div>\n );\n }\n);\n\nexport { AlternativesList, HeaderAlternative };\n","import { useCallback, useMemo } from 'react';\nimport type { BaseApiClient } from '../types/api';\nimport type {\n SimulationsStudentsResponse,\n SimulationsStudentsPage,\n SimulationsStudentsFilters,\n SimulationsListResponse,\n SimulationsListData,\n SimulationsListFilters,\n SimulationDetailResponse,\n SimulationDetailData,\n NoteResponse,\n NoteData,\n} from '../types/simulations';\n\nconst BASE_URL = '/performance/simulations';\n\n/** Encode a value before interpolating it into a request path segment. */\nconst segment = (value: string) => encodeURIComponent(value);\n\n/**\n * Hook return type for the teacher-facing Simulations feature.\n *\n * The hook exposes imperative fetchers (rather than holding everything in\n * state) because the UI loads data lazily across three nested levels:\n * students list -> a student's simulations -> a simulation's questions.\n */\nexport interface UseSimulationsReturn {\n fetchStudents: (\n filters?: SimulationsStudentsFilters\n ) => Promise<SimulationsStudentsPage>;\n fetchStudentSimulations: (\n userInstitutionId: string,\n filters?: SimulationsListFilters\n ) => Promise<SimulationsListData>;\n fetchSimulationDetail: (\n userInstitutionId: string,\n simulationId: string\n ) => Promise<SimulationDetailData>;\n fetchNote: (\n userInstitutionId: string,\n simulationId: string\n ) => Promise<NoteData | null>;\n saveNote: (\n userInstitutionId: string,\n simulationId: string,\n note: string\n ) => Promise<NoteData | null>;\n}\n\n/**\n * Factory that binds an API client to the Simulations hook.\n *\n * @example\n * ```tsx\n * const useSimulations = createUseSimulations(api);\n * const { fetchStudents } = useSimulations();\n * ```\n */\nexport const createUseSimulations =\n (apiClient: BaseApiClient) => (): UseSimulationsReturn => {\n const fetchStudents = useCallback(\n async (\n filters: SimulationsStudentsFilters = {}\n ): Promise<SimulationsStudentsPage> => {\n const { page = 1, limit = 20, search, classIds } = filters;\n const response = await apiClient.get<SimulationsStudentsResponse>(\n `${BASE_URL}/students`,\n { params: { page, limit, search, classIds } }\n );\n return response.data.data.students;\n },\n []\n );\n\n const fetchStudentSimulations = useCallback(\n async (\n userInstitutionId: string,\n filters: SimulationsListFilters = {}\n ): Promise<SimulationsListData> => {\n const { page = 1, limit = 20 } = filters;\n const response = await apiClient.get<SimulationsListResponse>(\n `${BASE_URL}/students/${segment(userInstitutionId)}`,\n { params: { page, limit } }\n );\n return response.data.data;\n },\n []\n );\n\n const fetchSimulationDetail = useCallback(\n async (\n userInstitutionId: string,\n simulationId: string\n ): Promise<SimulationDetailData> => {\n const response = await apiClient.get<SimulationDetailResponse>(\n `${BASE_URL}/students/${segment(userInstitutionId)}/${segment(simulationId)}`\n );\n return response.data.data;\n },\n []\n );\n\n const fetchNote = useCallback(\n async (\n userInstitutionId: string,\n simulationId: string\n ): Promise<NoteData | null> => {\n const response = await apiClient.get<NoteResponse>(\n `${BASE_URL}/students/${segment(userInstitutionId)}/${segment(simulationId)}/note`\n );\n return response.data.data;\n },\n []\n );\n\n const saveNote = useCallback(\n async (\n userInstitutionId: string,\n simulationId: string,\n note: string\n ): Promise<NoteData | null> => {\n const response = await apiClient.post<NoteResponse>(\n `${BASE_URL}/students/${segment(userInstitutionId)}/${segment(simulationId)}/note`,\n { note }\n );\n return response.data.data;\n },\n []\n );\n\n return useMemo(\n () => ({\n fetchStudents,\n fetchStudentSimulations,\n fetchSimulationDetail,\n fetchNote,\n saveNote,\n }),\n [\n fetchStudents,\n fetchStudentSimulations,\n fetchSimulationDetail,\n fetchNote,\n saveNote,\n ]\n );\n };\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { UserCircle } from 'phosphor-react';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport TextArea from '../TextArea/TextArea';\nimport { CardAccordation } from '../Accordation';\nimport { SkeletonCard } from '../Skeleton/Skeleton';\nimport { StatCard } from '../shared/StatCard';\nimport { AlternativesList } from '../Alternative/Alternative';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\nimport { OptionStatus } from '../../enums/Options';\nimport {\n getQuestionStatusBadgeConfig,\n QUESTION_STATUS,\n type QuestionStatus,\n} from '../../utils/studentActivityCorrection';\nimport { cn } from '../../utils/utils';\nimport type { BaseApiClient } from '../../types/api';\nimport { createUseSimulations } from '../../hooks/useSimulations';\nimport type {\n SimulationsListData,\n SimulationDetailData,\n SimulationDetailQuestion,\n StudentSimulationItem,\n NoteData,\n} from '../../types/simulations';\n\nexport interface SimulationsDetailModalProps {\n /** API client used to fetch the student's simulations */\n readonly api: BaseApiClient;\n readonly isOpen: boolean;\n readonly onClose: () => void;\n /** The student whose simulations are shown (null closes the modal) */\n readonly student: { userInstitutionId: string; name: string } | null;\n}\n\ninterface DetailState {\n loading: boolean;\n error: string | null;\n data: SimulationDetailData | null;\n}\n\ninterface NoteState {\n loading: boolean;\n data: NoteData | null;\n}\n\n/** Map the simulation question status to the shared correction status. */\nconst QUESTION_STATUS_MAP: Record<\n SimulationDetailQuestion['status'],\n QuestionStatus\n> = {\n CORRECT: QUESTION_STATUS.CORRETA,\n INCORRECT: QUESTION_STATUS.INCORRETA,\n BLANK: QUESTION_STATUS.EM_BRANCO,\n};\n\n// ---------------------------------------------------------------------------\n// Level 2 — Question (reuses the shared alternatives renderer + status badge)\n// ---------------------------------------------------------------------------\n\nfunction QuestionItem({\n question,\n index,\n}: {\n readonly question: SimulationDetailQuestion;\n readonly index: number;\n}) {\n const badge = getQuestionStatusBadgeConfig(\n QUESTION_STATUS_MAP[question.status]\n );\n\n const alternatives = question.options.map((option) => {\n let status: OptionStatus;\n if (option.isCorrect) {\n status = OptionStatus.CORRECT;\n } else if (option.isSelected) {\n status = OptionStatus.INCORRECT;\n } else {\n status = OptionStatus.NEUTRAL;\n }\n return { label: option.option, value: option.id, status };\n });\n\n return (\n <CardAccordation\n value={question.questionId}\n trigger={\n <div className=\"flex flex-1 items-center justify-between gap-3 py-3\">\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Questão {index + 1}\n </Text>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n badge.bgColor,\n badge.textColor\n )}\n >\n {badge.label}\n </span>\n </div>\n }\n contentClassName=\"px-3 pb-3\"\n >\n <div className=\"flex flex-col gap-3\">\n <HtmlMathRenderer\n content={question.statement}\n className=\"text-sm text-text-800\"\n />\n <CardAccordation\n value={`${question.questionId}-options`}\n trigger={\n <div className=\"flex-1 py-2\">\n <Text size=\"sm\" weight=\"medium\" className=\"text-text-950\">\n Alternativas\n </Text>\n </div>\n }\n contentClassName=\"px-3 pb-3\"\n >\n <AlternativesList\n mode=\"readonly\"\n layout=\"compact\"\n name={`question-${question.questionId}`}\n alternatives={alternatives}\n selectedValue={question.selectedOptionId ?? ''}\n />\n </CardAccordation>\n </div>\n </CardAccordation>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Note (\"Observação\")\n// ---------------------------------------------------------------------------\n\nfunction NoteRow({\n note,\n loading,\n onSave,\n}: {\n readonly note: NoteData | null;\n readonly loading: boolean;\n readonly onSave: (text: string) => Promise<void>;\n}) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const startEditing = () => {\n setDraft(note?.note ?? '');\n setError(null);\n setEditing(true);\n };\n\n const handleSave = async () => {\n if (!draft.trim()) return;\n setSaving(true);\n setError(null);\n try {\n await onSave(draft.trim());\n setEditing(false);\n } catch {\n // Keep the editing UI open (draft preserved) and surface the failure.\n setError('Erro ao salvar a observação. Tente novamente.');\n } finally {\n setSaving(false);\n }\n };\n\n if (loading) {\n return <SkeletonCard className=\"h-14\" />;\n }\n\n if (editing) {\n return (\n <div className=\"flex flex-col gap-2 rounded-xl border border-border-200 p-3\">\n <TextArea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n placeholder=\"Escreva uma observação para este simulado\"\n rows={3}\n />\n {error && (\n <Text size=\"sm\" className=\"text-error-600\">\n {error}\n </Text>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={() => setEditing(false)}\n >\n Cancelar\n </Button>\n <Button\n variant=\"solid\"\n size=\"small\"\n onClick={handleSave}\n disabled={saving || !draft.trim()}\n >\n Salvar\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center justify-between gap-3 rounded-xl border border-border-200 p-3\">\n <div className=\"flex min-w-0 flex-col\">\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Observação\n </Text>\n {note?.note && (\n <Text size=\"sm\" className=\"truncate text-text-700\">\n {note.note}\n </Text>\n )}\n </div>\n <Button variant=\"solid\" size=\"small\" onClick={startEditing}>\n {note?.note ? 'Editar' : 'Incluir'}\n </Button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Level 1 — Simulation\n// ---------------------------------------------------------------------------\n\nfunction SimulationItem({\n simulation,\n index,\n expanded,\n onToggle,\n detail,\n note,\n onSaveNote,\n}: {\n readonly simulation: StudentSimulationItem;\n readonly index: number;\n readonly expanded: boolean;\n readonly onToggle: () => void;\n readonly detail: DetailState | undefined;\n readonly note: NoteState | undefined;\n readonly onSaveNote: (text: string) => Promise<void>;\n}) {\n return (\n <CardAccordation\n value={simulation.id}\n expanded={expanded}\n onToggleExpanded={onToggle}\n trigger={\n <div className=\"flex-1 py-4\">\n <Text weight=\"bold\" className=\"text-text-950\">\n Simulado {index + 1}\n </Text>\n </div>\n }\n contentClassName=\"px-3 pb-4\"\n >\n {detail?.loading && <SkeletonCard className=\"h-40\" />}\n {detail?.error && (\n <Text size=\"sm\" className=\"text-error-600\">\n {detail.error}\n </Text>\n )}\n {detail?.data && (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex gap-3\">\n <StatCard\n label=\"Nº de questões corretas\"\n value={detail.data.counts.correct}\n variant=\"correct\"\n className=\"flex-1\"\n />\n <StatCard\n label=\"Nº de questões incorretas\"\n value={detail.data.counts.incorrect}\n variant=\"incorrect\"\n className=\"flex-1\"\n />\n <StatCard\n label=\"Nº de questões em branco\"\n value={detail.data.counts.blank}\n variant=\"blank\"\n className=\"flex-1\"\n />\n </div>\n\n <NoteRow\n note={note?.data ?? null}\n loading={note?.loading ?? false}\n onSave={onSaveNote}\n />\n\n <div className=\"flex flex-col gap-2\">\n <Text weight=\"bold\" className=\"text-text-950\">\n Respostas\n </Text>\n {detail.data.questions.map((question, qIndex) => (\n <QuestionItem\n key={question.questionId}\n question={question}\n index={qIndex}\n />\n ))}\n </div>\n </div>\n )}\n </CardAccordation>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Modal\n// ---------------------------------------------------------------------------\n\n/**\n * Modal that shows a single student's answered simulations as a nested\n * accordion (simulation -> question -> options), lazily loading each\n * simulation's detail when it is expanded. Reuses the shared StatCard and\n * AlternativesList components so the detail matches the activity correction UI.\n */\nexport function SimulationsDetailModal({\n api,\n isOpen,\n onClose,\n student,\n}: SimulationsDetailModalProps) {\n const useSimulations = useMemo(() => createUseSimulations(api), [api]);\n const {\n fetchStudentSimulations,\n fetchSimulationDetail,\n fetchNote,\n saveNote,\n } = useSimulations();\n\n const [list, setList] = useState<SimulationsListData | null>(null);\n const [listLoading, setListLoading] = useState(false);\n const [listError, setListError] = useState<string | null>(null);\n const [expandedId, setExpandedId] = useState<string | null>(null);\n const [details, setDetails] = useState<Record<string, DetailState>>({});\n const [notes, setNotes] = useState<Record<string, NoteState>>({});\n\n // Guards async state updates against the modal unmounting mid-request.\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Bumped on every new session (open / student change) so in-flight responses\n // from a previous student are ignored instead of writing into the new one.\n const requestEpochRef = useRef(0);\n useEffect(() => {\n requestEpochRef.current += 1;\n }, [isOpen, student?.userInstitutionId]);\n\n const isStaleResponse = useCallback(\n (epoch: number) => !mountedRef.current || requestEpochRef.current !== epoch,\n []\n );\n\n useEffect(() => {\n if (!isOpen || !student) return;\n\n setList(null);\n setExpandedId(null);\n setDetails({});\n setNotes({});\n setListLoading(true);\n setListError(null);\n\n let active = true;\n fetchStudentSimulations(student.userInstitutionId)\n .then((data) => {\n if (active) setList(data);\n })\n .catch(() => {\n if (active) setListError('Erro ao carregar os simulados do estudante');\n })\n .finally(() => {\n if (active) setListLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [isOpen, student, fetchStudentSimulations]);\n\n const handleToggle = useCallback(\n (simulationId: string) => {\n if (!student) return;\n const requestEpoch = requestEpochRef.current;\n const next = expandedId === simulationId ? null : simulationId;\n setExpandedId(next);\n\n if (next && !details[simulationId]) {\n setDetails((prev) => ({\n ...prev,\n [simulationId]: { loading: true, error: null, data: null },\n }));\n fetchSimulationDetail(student.userInstitutionId, simulationId)\n .then((data) => {\n if (isStaleResponse(requestEpoch)) return;\n setDetails((prev) => ({\n ...prev,\n [simulationId]: { loading: false, error: null, data },\n }));\n })\n .catch(() => {\n if (isStaleResponse(requestEpoch)) return;\n setDetails((prev) => ({\n ...prev,\n [simulationId]: {\n loading: false,\n error: 'Erro ao carregar o simulado',\n data: null,\n },\n }));\n });\n\n setNotes((prev) => ({\n ...prev,\n [simulationId]: { loading: true, data: null },\n }));\n fetchNote(student.userInstitutionId, simulationId)\n .then((data) => {\n if (isStaleResponse(requestEpoch)) return;\n setNotes((prev) => ({\n ...prev,\n [simulationId]: { loading: false, data },\n }));\n })\n .catch(() => {\n if (isStaleResponse(requestEpoch)) return;\n setNotes((prev) => ({\n ...prev,\n [simulationId]: { loading: false, data: null },\n }));\n });\n }\n },\n [\n student,\n expandedId,\n details,\n fetchSimulationDetail,\n fetchNote,\n isStaleResponse,\n ]\n );\n\n const makeSaveNote = useCallback(\n (simulationId: string) => async (text: string) => {\n if (!student) return;\n const requestEpoch = requestEpochRef.current;\n const saved = await saveNote(\n student.userInstitutionId,\n simulationId,\n text\n );\n if (isStaleResponse(requestEpoch)) return;\n setNotes((prev) => ({\n ...prev,\n [simulationId]: { loading: false, data: saved },\n }));\n },\n [student, saveNote, isStaleResponse]\n );\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title=\"Simulados\" size=\"xl\">\n {student && (\n <div className=\"flex max-h-[70vh] flex-col gap-4 overflow-y-auto pr-1\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"flex items-center gap-2\">\n <UserCircle size={24} weight=\"fill\" className=\"text-info-700\" />\n <Text weight=\"bold\" className=\"text-text-950\">\n {student.name}\n </Text>\n </span>\n <Text size=\"sm\" className=\"text-info-700\">\n {list?.student.simulationsAnswered ?? 0} simulados respondidos\n </Text>\n </div>\n\n {listLoading && <SkeletonCard className=\"h-20\" />}\n {listError && (\n <Text size=\"sm\" className=\"text-error-600\">\n {listError}\n </Text>\n )}\n {list?.simulations.data.length === 0 && !listLoading && (\n <Text size=\"sm\" className=\"text-text-600\">\n Este estudante ainda não respondeu nenhum simulado.\n </Text>\n )}\n\n {list && (\n <div className=\"flex flex-col gap-3\">\n {list.simulations.data.map((simulation, index) => (\n <SimulationItem\n key={simulation.id}\n simulation={simulation}\n index={index}\n expanded={expandedId === simulation.id}\n onToggle={() => handleToggle(simulation.id)}\n detail={details[simulation.id]}\n note={notes[simulation.id]}\n onSaveNote={makeSaveNote(simulation.id)}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </Modal>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;AALA,iBACA;AADA;AAAA;AAAA;AAAA,kBAAsC;AACtC,4BAAwB;AAAA;AAAA;;;ACDxB,IA2HIA,qBA/CE,MAwDC;AApIP;AAAA;AAAA;AACA;AA0HI,IAAAA,sBAAA;AA/CJ,IAAM,OAAO,CAA8B;AAAA,MACzC;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA,YAAY;AAAA,MACZ,GAAG;AAAA,IACL,MAAoB;AAClB,UAAI;AACJ,UAAI;AAGJ,YAAM,eAAe;AAAA,QACnB,OAAO;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAEA,oBAAc,aAAa,IAAI,KAAK,aAAa;AAGjD,YAAM,iBAAiB;AAAA,QACrB,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,QACX,OAAO;AAAA,MACT;AAEA,sBAAgB,eAAe,MAAM,KAAK,eAAe;AAEzD,YAAM,cAAc;AACpB,YAAM,YAAY,MAAO;AAEzB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,aAAa,aAAa,eAAe,OAAO,SAAS;AAAA,UACtE,GAAG;AAAA,UAEH;AAAA;AAAA,MACH;AAAA,IAEJ;AAEA,IAAO,eAAQ;AAAA;AAAA;;;ACpIf,kBA6GQC,qBAvGF,wBAoCA,cAgDA,QAgEC;AA1JP;AAAA;AAAA;AAAA,mBAA4D;AAC5D;AA4GQ,IAAAA,sBAAA;AAvGR,IAAM,yBAAyB;AAAA,MAC7B,OAAO;AAAA,QACL,SACE;AAAA,QACF,WACE;AAAA,QACF,UACE;AAAA,QACF,UACE;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,UACE;AAAA,QACF,UACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,SACE;AAAA,QACF,WACE;AAAA,QACF,UACE;AAAA,QACF,UACE;AAAA,MACJ;AAAA,IACF;AAKA,IAAM,eAAe;AAAA,MACnB,eAAe;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,eAAe;AAAA,IACjB;AA0CA,IAAM,aAAS;AAAA,MACb,CACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ;AAAA,QACA,OAAO;AAAA,QACP,GAAG;AAAA,MACL,GACA,QACG;AAEH,YAAI,YAAY,OAAO;AACrB,iBACE;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACC,GAAG;AAAA,cAEH;AAAA,4BACC,6CAAC,UAAK,WAAU,0BAA0B,oBAAS;AAAA,gBAEpD;AAAA,gBACA,aACC,6CAAC,UAAK,WAAU,0BAA0B,qBAAU;AAAA;AAAA;AAAA,UAExD;AAAA,QAEJ;AAGA,cAAM,cAAc,aAAa,IAAI;AACrC,cAAM,iBAAiB,uBAAuB,OAAO,EAAE,MAAM;AAE7D,cAAM,cACJ;AAEF,eACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAW,GAAG,aAAa,gBAAgB,aAAa,SAAS;AAAA,YACjE;AAAA,YACA;AAAA,YACC,GAAG;AAAA,YAEH;AAAA,0BAAY,6CAAC,UAAK,WAAU,0BAA0B,oBAAS;AAAA,cAC/D;AAAA,cACA,aACC,6CAAC,UAAK,WAAU,0BAA0B,qBAAU;AAAA;AAAA;AAAA,QAExD;AAAA,MAEJ;AAAA,IACF;AAEA,WAAO,cAAc;AAErB,IAAO,iBAAQ;AAAA;AAAA;;;AC1Jf,IAYa,cAYP,oBA4BA,kBAYA,kBAuBO,mBAuBA;AA9Gb;AAAA;AAAA;AAYO,IAAM,eAAe,CAAC,QAAyB;AACpD,YAAM,eACJ;AACF,aAAO,aAAa,KAAK,GAAG;AAAA,IAC9B;AAQA,IAAM,qBAAqB,CACzB,SAC+C;AAC/C,UAAI,SAAS,WAAY,QAAO;AAEhC,YAAM,oBACJ,SAAS,iBACR,KAAK,SAAS,cAAc,KAC3B,gCAAgC,KAAK,IAAI;AAE7C,UAAI,kBAAmB,QAAO;AAE9B,YAAM,kBACJ,SAAS,0BACR,KAAK,SAAS,uBAAuB,KACpC,yCAAyC,KAAK,IAAI;AAEtD,UAAI,gBAAiB,QAAO;AAE5B,aAAO;AAAA,IACT;AAQA,IAAM,mBAAmB,CAAC,aAAoC;AAC5D,YAAM,WAAW,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;AACtD,aAAO,YAAY;AAAA,IACrB;AASA,IAAM,mBAAmB,CACvB,UACA,iBACkB;AAClB,YAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAChD,YAAM,CAAC,OAAO,MAAM,IAAI;AAExB,UAAI,UAAU,WAAW,OAAQ,QAAO;AACxC,UAAI,UAAU,YAAY,OAAQ,QAAO;AACzC,UAAI,UAAU,UAAU,OAAQ,QAAO;AAEvC,YAAM,IAAI,aAAa,IAAI,GAAG;AAC9B,UAAI,EAAG,QAAO;AAEd,aAAO;AAAA,IACT;AAQO,IAAM,oBAAoB,CAAC,QAA+B;AAC/D,UAAI;AACF,cAAM,IAAI,IAAI,IAAI,GAAG;AACrB,cAAM,WAAW,mBAAmB,EAAE,SAAS,YAAY,CAAC;AAE5D,YAAI,CAAC,SAAU,QAAO;AAEtB,YAAI,aAAa,YAAY;AAC3B,iBAAO,iBAAiB,EAAE,QAAQ;AAAA,QACpC;AAEA,eAAO,iBAAiB,EAAE,UAAU,EAAE,YAAY;AAAA,MACpD,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAQO,IAAM,qBAAqB,CAAC,YAA4B;AAC7D,aAAO,0CAA0C,OAAO;AAAA,IAC1D;AAAA;AAAA;;;AChHA,IAAAC,eACAC,wBA6NgBC,qBAjNVC,eAoFA,OAsQC;AAvWP;AAAA;AAAA;AAAA,IAAAH,gBAA4C;AAC5C,IAAAC,yBAAkB;AAClB;AACA;AACA;AA0NgB,IAAAC,sBAAA;AAjNhB,IAAMC,gBAAe;AAAA,MACnB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AA8EA,IAAM,QAAQ,CAAC;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB;AAAA,MACA,kBAAkB;AAAA,MAClB,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,IACrB,MAAkB;AAChB,YAAM,cAAU,qBAAM;AAGtB,mCAAU,MAAM;AACd,YAAI,CAAC,UAAU,CAAC,cAAe;AAE/B,cAAM,eAAe,CAAC,UAAoC;AACxD,cAAI,MAAM,QAAQ,UAAU;AAC1B,oBAAQ;AAAA,UACV;AAAA,QACF;AAEA,iBAAS,iBAAiB,WAAW,YAAY;AACjD,eAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,MACnE,GAAG,CAAC,QAAQ,eAAe,OAAO,CAAC;AAGnC,mCAAU,MAAM;AACd,YAAI,CAAC,OAAQ;AAGb,cAAM,iBACJ,OAAO,aAAa,SAAS,gBAAgB;AAG/C,cAAM,mBAAmB,SAAS,KAAK,MAAM;AAC7C,cAAM,uBAAuB,SAAS,KAAK,MAAM;AAGjD,iBAAS,KAAK,MAAM,WAAW;AAG/B,YAAI,iBAAiB,GAAG;AACtB,mBAAS,KAAK,MAAM,eAAe,GAAG,cAAc;AAGpD,gBAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,kBAAQ,KAAK;AACb,kBAAQ,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA,iBAIb,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAMzB,mBAAS,KAAK,YAAY,OAAO;AAAA,QACnC;AAEA,eAAO,MAAM;AAEX,mBAAS,KAAK,MAAM,WAAW;AAC/B,mBAAS,KAAK,MAAM,eAAe;AAGnC,gBAAM,UAAU,SAAS,eAAe,yBAAyB;AACjE,cAAI,SAAS;AACX,oBAAQ,OAAO;AAAA,UACjB;AAAA,QACF;AAAA,MACF,GAAG,CAAC,MAAM,CAAC;AAEX,UAAI,CAAC,OAAQ,QAAO;AAEpB,YAAM,cAAcA,cAAa,IAAI;AACrC,YAAM,cACJ;AAEF,YAAM,qBAAqB;AAC3B,YAAM,eAAe;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAGA,YAAM,eAAe,CAAC,SACpB,gBAAgB,KAAK,IAAI,IAAI,OAAO,WAAW,IAAI;AAGrD,YAAM,oBAAoB,MAAM;AAC9B,YAAI,YAAY;AACd,iBAAO,KAAK,aAAa,UAAU,GAAG,UAAU,qBAAqB;AAAA,QACvE;AAAA,MACF;AAGA,UAAI,YAAY,YAAY;AAC1B,eACE,6CAAC,SAAI,WAAU,8HACb;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,YACX,mBAAiB;AAAA,YACjB,cAAW;AAAA,YACX,MAAI;AAAA,YAGJ;AAAA,2DAAC,SAAI,WAAU,6BACZ,WAAC,mBACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,cAAW;AAAA,kBAEX,uDAAC,4BAAE,MAAM,IAAI;AAAA;AAAA,cACf,GAEJ;AAAA,cAGA,8CAAC,SAAI,WAAU,6EAEZ;AAAA,yBACC,6CAAC,SAAI,WAAU,uBACb;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,KAAK,YAAY;AAAA,oBACjB,WAAU;AAAA;AAAA,gBACZ,GACF;AAAA,gBAIF;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI;AAAA,oBACJ,WAAU;AAAA,oBAET;AAAA;AAAA,gBACH;AAAA,gBAGC,eACC,6CAAC,OAAE,WAAU,yEACV,uBACH;AAAA,gBAID,cACC,8CAAC,SAAI,WAAU,UACX;AAAA,yBAAM;AACN,0BAAM,aAAa,aAAa,UAAU;AAC1C,0BAAM,OAAO,aAAa,UAAU;AACpC,wBAAI,CAAC,KAAM,QAAO;AAClB,0BAAM,KAAK,kBAAkB,UAAU;AACvC,wBAAI,CAAC,IAAI;AACP,6BACE;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,QAAO;AAAA,0BACP,MAAK;AAAA,0BACL,WAAU;AAAA,0BACV,SAAS;AAAA,0BAER,yBAAe;AAAA;AAAA,sBAClB;AAAA,oBAEJ;AACA,2BACE;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAK,mBAAmB,EAAE;AAAA,wBAC1B,WAAU;AAAA,wBACV,iBAAe;AAAA,wBACf,OAAM;AAAA,wBACN,OAAM;AAAA;AAAA,oBACR;AAAA,kBAEJ,GAAG;AAAA,kBACF,CAAC,aAAa,aAAa,UAAU,CAAC,KACrC;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,QAAO;AAAA,sBACP,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS;AAAA,sBAER,yBAAe;AAAA;AAAA,kBAClB;AAAA,mBAEJ;AAAA,iBAEJ;AAAA;AAAA;AAAA,QACF,GACF;AAAA,MAEJ;AAGA,aACE,6CAAC,SAAI,WAAU,8HACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,mBAAiB;AAAA,UACjB,cAAW;AAAA,UACX,MAAI;AAAA,UAGJ;AAAA,0DAAC,SAAI,WAAU,+CACb;AAAA,2DAAC,QAAG,IAAI,SAAS,WAAU,uCACxB,iBACH;AAAA,cACC,CAAC,mBACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,cAAW;AAAA,kBAEX,uDAAC,4BAAE,MAAM,IAAI;AAAA;AAAA,cACf;AAAA,eAEJ;AAAA,YAGC,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,kBAAkB,SAAS,MAAM,KAC/B;AAAA,oBACJ;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA,YAID,UACC,6CAAC,SAAI,WAAU,oCAAoC,kBAAO;AAAA;AAAA;AAAA,MAE9D,GACF;AAAA,IAEJ;AAEA,IAAO,gBAAQ;AAAA;AAAA;;;ACvWf,IAAAC,gBAYAC,wBA0OUC,sBAzNJC,eAsBA,uBAMAC,gBA+EA,UA0KC;AAlTP;AAAA;AAAA;AAAA,IAAAJ,iBAWO;AACP,IAAAC,yBAA8B;AAC9B;AACA;AAwOU,IAAAC,uBAAA;AAzNV,IAAMC,gBAAe;AAAA,MACnB,OAAO;AAAA,QACL,UAAU;AAAA;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,QACN,UAAU;AAAA;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MACA,YAAY;AAAA,QACV,UAAU;AAAA;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,IACF;AAKA,IAAM,wBACJ;AAKF,IAAMC,iBAAgB;AAAA,MACpB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,IACF;AAqDA,IAAM,eAAW;AAAA,MACf,CACE;AAAA,QACE;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,qBAAqB;AAAA,QACrB;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,GAAG;AAAA,MACL,GACA,QACG;AAEH,cAAM,kBAAc,sBAAM;AAC1B,cAAM,UAAU,MAAM,YAAY,WAAW;AAG7C,cAAM,kBAAc,uBAA4B,IAAI;AAGpD,gDAAoB,KAAK,MAAM,YAAY,OAA8B;AAGzE,cAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAGhD,cAAM,gBAAgB,OAAO,UAAU,WAAW,MAAM,SAAS;AACjE,cAAM,cAAc,aAAa,iBAAiB,YAAY;AAG9D,sCAAU,MAAM;AACd,cAAI,cAAc,YAAY,SAAS;AACrC,kBAAM,WAAW,YAAY;AAC7B,qBAAS,MAAM,SAAS;AACxB,qBAAS,MAAM,SAAS,GAAG,KAAK,IAAI,SAAS,cAAc,SAAS,CAAC;AAAA,UACvE;AAAA,QACF,GAAG,CAAC,YAAY,WAAW,KAAK,CAAC;AAGjC,cAAM,eAAe,CAAC,UAA4C;AAChE,qBAAW,KAAK;AAAA,QAClB;AAGA,cAAM,cAAc,CAAC,UAA2C;AAC9D,uBAAa,IAAI;AACjB,gBAAM,UAAU,KAAK;AAAA,QACvB;AAGA,cAAM,aAAa,CAAC,UAA2C;AAC7D,uBAAa,KAAK;AAClB,gBAAM,SAAS,KAAK;AAAA,QACtB;AAGA,YAAI,eAAe,WAAW,aAAa;AAG3C,YACE,aACA,iBAAiB,aACjB,iBAAiB,YACjB;AACA,yBAAe;AAAA,QACjB;AAGA,cAAM,cAAcD,cAAa,IAAI;AAGrC,cAAM,eAAeC,eAAc,YAAY;AAG/C,cAAM,gBAAgB,aAClB,2BACA,YAAY;AAGhB,cAAM,gBACJ,YAAY,SAAS,MAAM,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC,KACjE;AAGF,cAAM,kBAAkB;AAAA,UACtB;AAAA,UACA,aAAa,gBAAgB,YAAY;AAAA,UACzC;AAAA,UACA,aAAa;AAAA,UACb,aAAa;AAAA,UACb,aAAa;AAAA,UACb;AAAA,QACF;AAEA,eACE,+CAAC,SAAI,WAAW,iBAEb;AAAA,mBACC;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,SAAS;AAAA,cACT,MAAM,YAAY;AAAA,cAClB,QAAO;AAAA,cACP,OAAM;AAAA,cACN,WAAW,GAAG,UAAU,cAAc;AAAA,cAErC;AAAA;AAAA,gBAAO;AAAA,gBACP,YAAY,8CAAC,UAAK,WAAU,wBAAuB,eAAC;AAAA;AAAA;AAAA,UACvD;AAAA,UAIF;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,IAAI;AAAA,cACJ;AAAA,cACA,UAAU;AAAA,cACV,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,WAAW;AAAA,cACX;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACC,GAAG;AAAA;AAAA,UACN;AAAA,UAGC,gBACC,+CAAC,OAAE,WAAU,+DACX;AAAA,0DAAC,wCAAc,MAAM,IAAI;AAAA,YAAE;AAAA,YAAE;AAAA,aAC/B;AAAA,UAID,CAAC,gBAAgB,sBAAsB,aACtC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,WAAW,UAAU,cAAc,2BAA2B,eAAe;AAAA,cAE5E;AAAA;AAAA,gBAAc;AAAA,gBAAE;AAAA,gBAAU;AAAA;AAAA;AAAA,UAC7B;AAAA,UAED,CAAC,gBACA,iBACA,EAAE,sBAAsB,cACtB,8CAAC,gBAAK,MAAK,MAAK,QAAO,UAAS,WAAU,wBACvC,yBACH;AAAA,WAEN;AAAA,MAEJ;AAAA,IACF;AAEA,aAAS,cAAc;AAEvB,IAAO,mBAAQ;AAAA;AAAA;;;AClTf;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,iBAA+C;AAC/C,IAAAC,0BAA2B;;;ACA3B;AA4BM;AAZC,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;;;ADpCA;AACA;;;AEJA,IAAAC,iBAOO;;;ACPP,IAAAC,gBAWO;AACP;AACA,IAAAC,yBAAmC;;;ACbnC;AA6CQ,IAAAC,sBAAA;AAVR,IAAM,iBAAiB,CAAC,EAAE,OAAO,OAAO,YAAY,MAA2B;AAC7E,QAAM,eAAe,SAAS;AAC9B,QAAM,qBACJ,eACA;AAEF,SACE,8CAAC,SAAI,WAAU,+GAEb;AAAA,iDAAC,SAAI,WAAU,+DACb;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,WAAU;AAAA;AAAA,IACZ,GACF;AAAA,IAGA,8CAAC,SAAI,WAAU,qEAEb;AAAA,mDAAC,SAAI,WAAU,gGAEb;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,WAAU;AAAA,UAET;AAAA;AAAA,MACH,GACF;AAAA,MAGA,6CAAC,SAAI,WAAU,+DAEb,uDAAC,gBAAK,WAAU,qGACb,8BACH,GACF;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,IAAO,yBAAQ;;;AC5Ef;AACA;AAgHY,IAAAC,sBAAA;AAnCZ,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,OAAO;AACT,MAAuB;AACrB,QAAM,eAAe,SAAS;AAC9B,QAAM,qBACJ,eAAe;AAEjB,QAAM,iBACJ,SAAS,YACL,oDACA;AAEN,QAAM,uBACJ,SAAS,YACL,kDACA;AAEN,QAAM,qBAAqB,SAAS,YAAY,YAAY;AAE5D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,0DAA0D,kBAAkB;AAAA,MAGtF;AAAA,iBACC,6CAAC,SAAI,WAAU,gEACZ,iBAAO,UAAU,WAChB;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,WAAU;AAAA;AAAA,QACZ,IAEA,6CAAC,SAAI,WAAU,wDACZ,iBACH,GAEJ;AAAA,QAIF,8CAAC,SAAI,WAAU,8DAEb;AAAA,uDAAC,gBAAK,IAAG,MAAK,WAAW,gBACtB,wBACH;AAAA,UAGA,6CAAC,gBAAK,WAAW,sBAAuB,8BAAmB;AAAA,WAC7D;AAAA,QAGC,cAAc,iBACb;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,WAAU;AAAA,YAET;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,qBAAQ;;;AC3Jf,IAAAC,gBAA0D;AAC1D;AA+DY,IAAAC,sBAAA;AApDZ,IAAM,6BAA6B;AAAA,EACjC,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,2BAA2B;AAAA,EAC/B,MAAM;AAAA,EACN,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AACX;AAEA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,iBAAiB,2BAA2B,SAAS;AAC3D,UAAM,eAAe,yBAAyB,OAAO;AACrD,UAAM,eAAe,gBAAgB,OAAO;AAE5C,UAAM,QAAuB;AAAA,MAC3B,OAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,MAClD,QAAQ,OAAO,WAAW,WAAW,GAAG,MAAM,OAAO;AAAA,IACvD;AAGA,QAAI,YAAY,UAAU,QAAQ,GAAG;AACnC,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW,GAAG,iBAAiB,cAAc,SAAS;AAAA,UACrD,GAAG;AAAA,UAEH,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,UACjC;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,GAAG,cAAc,cAAc;AAAA,cAC1C,OAAO,UAAU,QAAQ,IAAI,EAAE,OAAO,MAAM,IAAI;AAAA;AAAA,YAF3C;AAAA,UAGP,CACD;AAAA;AAAA,MACH;AAAA,IAEJ;AAGA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,cAAc,gBAAgB,SAAS;AAAA,QACrD;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAGA,IAAM,mBAAe;AAAA,EACnB,CAAC,OAAO,QAAQ,6CAAC,YAAS,KAAU,SAAQ,QAAQ,GAAG,OAAO;AAChE;AAEA,IAAM,qBAAiB,0BAGrB,CAAC,OAAO,QAAQ,6CAAC,YAAS,KAAU,SAAQ,YAAY,GAAG,OAAO,CAAE;AAEtE,IAAM,wBAAoB,0BAGxB,CAAC,OAAO,QAAQ,6CAAC,YAAS,KAAU,SAAQ,eAAe,GAAG,OAAO,CAAE;AAEzE,IAAM,sBAAkB,0BAGtB,CAAC,OAAO,QAAQ,6CAAC,YAAS,KAAU,SAAQ,WAAW,GAAG,OAAO,CAAE;AAWrE,IAAM,mBAAe;AAAA,EACnB,CACE;AAAA,IACE,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,wDAAC,SAAI,WAAU,8BACZ;AAAA,0BAAc,6CAAC,kBAAe,OAAO,IAAI,QAAQ,IAAI;AAAA,YAEtD,8CAAC,SAAI,WAAU,oBACZ;AAAA,2BAAa,6CAAC,gBAAa,OAAM,OAAM,QAAQ,IAAI;AAAA,cAEnD,mBAAmB,6CAAC,gBAAa,OAAc,SAAQ,SAAQ;AAAA,eAClE;AAAA,aACF;AAAA,UAEC,eACC,8CAAC,SAAI,WAAU,mCACb;AAAA,yDAAC,qBAAkB,OAAO,IAAI,QAAQ,IAAI;AAAA,YAC1C,6CAAC,qBAAkB,OAAO,IAAI,QAAQ,IAAI;AAAA,aAC5C;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAWA,IAAM,mBAAe;AAAA,EACnB,CACE;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE,6CAAC,SAAI,KAAU,WAAW,GAAG,aAAa,SAAS,GAAI,GAAG,OACvD,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,UACjC,8CAAC,SAAgB,WAAU,kCACxB;AAAA,oBAAc,6CAAC,kBAAe,OAAO,IAAI,QAAQ,IAAI;AAAA,MAEtD,8CAAC,SAAI,WAAU,oBACZ;AAAA,qBAAa,6CAAC,gBAAa,OAAM,OAAM,QAAQ,IAAI;AAAA,QAEnD,mBACC,6CAAC,gBAAa,OAAc,SAAQ,SAAQ;AAAA,SAEhD;AAAA,SATQ,KAUV,CACD,GACH;AAAA,EAEJ;AACF;AASA,IAAM,oBAAgB;AAAA,EACpB,CACE,EAAE,OAAO,GAAG,UAAU,GAAG,aAAa,MAAM,YAAY,IAAI,GAAG,MAAM,GACrE,QACG;AACH,WACE,8CAAC,SAAI,KAAU,WAAW,GAAG,UAAU,SAAS,GAAI,GAAG,OACpD;AAAA,oBACC,6CAAC,SAAI,WAAU,uBACZ,gBAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,UACnC;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,GAAG,MAAM,OAAO;AAAA,UACvB,QAAQ;AAAA;AAAA,QAFH;AAAA,MAGP,CACD,GACH;AAAA,MAGF,6CAAC,SAAI,WAAU,aACZ,gBAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,aAChC,6CAAC,SAAmB,WAAU,kBAC3B,gBAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAACC,IAAG,aACnC;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,GAAG,MAAM,OAAO;AAAA,UACvB,QAAQ;AAAA;AAAA,QAFH;AAAA,MAGP,CACD,KAPO,QAQV,CACD,GACH;AAAA,OACF;AAAA,EAEJ;AACF;;;ACnPA,4BAAiD;AACjD;AAyGM,IAAAC,sBAAA;AA/CN,IAAM,kBAAkB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,sBAAsB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,EACtC;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,MAA4B;AAC1B,QAAM,YAAY,eAAe,IAAI,KAAK,cAAc,KAAK,eAAe;AAC5E,QAAM,UACJ,eAAe,IAAI,IAAI,KAAK,IAAI,cAAc,cAAc,UAAU;AAExE,QAAM,iBAAiB,MAAM;AAC3B,QAAI,cAAc,GAAG;AACnB,mBAAa,cAAc,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,cAAc,YAAY;AAC5B,mBAAa,cAAc,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,2BAA2B,CAAC,MAAsC;AACtE,QAAI,sBAAsB;AACxB,2BAAqB,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,cAAc,gBAAgB;AACpC,QAAM,aAAa,gBAAgB;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAGJ;AAAA,sDAAC,UAAK,WAAU,oDACb;AAAA;AAAA,UAAU;AAAA,UAAI;AAAA,UAAQ;AAAA,UAAK;AAAA,UAAW;AAAA,UAAE;AAAA,WAC3C;AAAA,QAGA,8CAAC,SAAI,WAAU,6FAEZ;AAAA,kCACC,8CAAC,SAAI,WAAU,YACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,WAAU;AAAA,gBACV,cAAW;AAAA,gBAEV,8BAAoB,IAAI,CAAC,WACxB,8CAAC,YAAoB,OAAO,QACzB;AAAA;AAAA,kBAAO;AAAA,qBADG,MAEb,CACD;AAAA;AAAA,YACH;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,QAAO;AAAA,gBACP,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UAIF,8CAAC,UAAK,WAAU,oDAAmD;AAAA;AAAA,YACzD;AAAA,YAAY;AAAA,YAAK;AAAA,aAC3B;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAW;AAAA,gBACT;AAAA,gBACA,cACI,kCACA;AAAA,cACN;AAAA,cACA,cAAW;AAAA,cAEX;AAAA,6DAAC,mCAAU,MAAM,IAAI,QAAO,QAAO,WAAU,oBAAmB;AAAA,gBAChE,6CAAC,UAAK,WAAU,uDAAsD,sBAEtE;AAAA;AAAA;AAAA,UACF;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAW;AAAA,gBACT;AAAA,gBACA,aACI,kCACA;AAAA,cACN;AAAA,cACA,cAAW;AAAA,cAEX;AAAA,6DAAC,UAAK,WAAU,uDAAsD,wBAEtE;AAAA,gBACA,6CAAC,oCAAW,MAAM,IAAI,QAAO,QAAO,WAAU,oBAAmB;AAAA;AAAA;AAAA,UACnE;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,gBAAgB,cAAc;AAE9B,IAAO,0BAAQ;;;AJqBT,IAAAC,sBAAA;AAhJC,SAAS,aACd,MACA,UAA+B,CAAC,GAChC;AACA,QAAM,EAAE,cAAc,MAAM,IAAI;AAGhC,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,eAAe,WAAW,WAAW,QAAW;AACnD,aAAO,EAAE,QAAQ,MAAM,WAAW,KAAK;AAAA,IACzC;AAEA,UAAM,SAAS,IAAI,gBAAgB,WAAW,SAAS,MAAM;AAC7D,UAAM,SAAS,OAAO,IAAI,QAAQ;AAClC,UAAM,OAAO,OAAO,IAAI,MAAM;AAE9B,QAAI,UAAU,SAAS,SAAS,SAAS,SAAS,SAAS;AACzD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,WAAW,KAAK,YAAY;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,MAAM,WAAW,KAAK;AAAA,EACzC;AAEA,QAAM,eAAe,gBAAgB;AACrC,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAClC,aAAa;AAAA,EACf;AACA,QAAM,CAAC,eAAe,gBAAgB,QAAI;AAAA,IACxC,aAAa;AAAA,EACf;AAGA,+BAAU,MAAM;AACd,QAAI,CAAC,eAAe,WAAW,WAAW,OAAW;AAErD,UAAM,MAAM,IAAI,IAAI,WAAW,SAAS,IAAI;AAC5C,UAAM,SAAS,IAAI;AAEnB,QAAI,cAAc,eAAe;AAC/B,aAAO,IAAI,UAAU,UAAU;AAC/B,aAAO,IAAI,QAAQ,cAAc,YAAY,CAAC;AAAA,IAChD,OAAO;AACL,aAAO,OAAO,QAAQ;AACtB,aAAO,OAAO,MAAM;AAAA,IACtB;AAGA,eAAW,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAAA,EACxD,GAAG,CAAC,YAAY,eAAe,WAAW,CAAC;AAE3C,QAAM,aAAa,CAAC,WAAmB;AACrC,QAAI,eAAe,QAAQ;AACzB,UAAI,kBAAkB,OAAO;AAC3B,yBAAiB,MAAM;AAAA,MACzB,WAAW,kBAAkB,QAAQ;AACnC,sBAAc,IAAI;AAClB,yBAAiB,IAAI;AAAA,MACvB;AAAA,IACF,OAAO;AACL,oBAAc,MAAM;AACpB,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,iBAAa,uBAAQ,MAAM;AAC/B,QAAI,CAAC,cAAc,CAAC,eAAe;AACjC,aAAO;AAAA,IACT;AAEA,WAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9B,YAAM,SAAS,EAAE,UAAqB;AACtC,YAAM,SAAS,EAAE,UAAqB;AAEtC,UAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAC5D,cAAM,aAAa,OAAO,cAAc,MAAM;AAC9C,eAAO,kBAAkB,QAAQ,aAAa,CAAC;AAAA,MACjD;AAEA,UAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAC5D,eAAO,kBAAkB,QAAQ,SAAS,SAAS,SAAS;AAAA,MAC9D;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,YAAY,aAAa,CAAC;AAEpC,SAAO,EAAE,YAAY,YAAY,eAAe,WAAW;AAC7D;AA4BA,IAAM,uBAAuB,CAAC,aAAwB;AACpD,SAAO,uBAAS,IAAI,UAAU,CAAC,UAAU;AACvC,YACE,8BAAe,KAAK,MACnB,MAAM,SAAS,gBAAgB,MAAM,SAAS,cAC/C;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAKA,IAAM,2BAA2B,CAC/B,QACA,cACA,uBACG;AACH,MAAI,OAAO,WAAW;AACpB,WAAO,OAAO;AAAA,EAChB;AAEA,MAAI,OAAO,OAAO;AAChB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,OAAO,OAAO,SAAS;AAAA,QACvB,aAAa,OAAO,eAAe;AAAA;AAAA,IACrC;AAAA,EAEJ;AAEA,SACE,8CAAC,SAAI,WAAU,eACb;AAAA,iDAAC,OAAE,WAAU,4CACV,iBAAO,SAAS,cACnB;AAAA,IACA,6CAAC,OAAE,WAAU,yBACV,iBAAO,eAAe,oBACzB;AAAA,KACF;AAEJ;AAKA,IAAM,uBAAuB,CAC3B,QACA,cACA,uBACG;AACH,MAAI,QAAQ,WAAW;AACrB,WAAO,OAAO;AAAA,EAChB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ,SAAS;AAAA,MACxB,aAAa,QAAQ,eAAe;AAAA,MACpC,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ;AAAA,MACvB,eAAe,QAAQ;AAAA,MACvB,cAAc,QAAQ;AAAA;AAAA,EACxB;AAEJ;AAKA,IAAM,qBAAqB,CACzB,SACA,UACA,WACA,UACA,cACA,eACG;AACH,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY,aAAa;AAAA,MAC3B;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YACC,GAAG;AAAA,YAEH,+BAAqB,QAAQ;AAAA;AAAA,QAChC;AAAA,QACA,6CAAC,SAAI,WAAU,4BAA4B,wBAAa;AAAA;AAAA;AAAA,EAC1D;AAEJ;AAEA,IAAM,YAAQ;AAAA,EACZ,CACE;AAAA,IACE,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,6BAAmD;AAAA,MACvD,OAAO;AAAA,MACP,aACE;AAAA,IACJ;AAEA,UAAM,oBAAsC;AAAA,MAC1C,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAEA,UAAM,2BACJ,uBAAuB;AACzB,UAAM,kBAAkB,cAAc;AAGtC,QAAI,aAAa;AACf,YAAM,iBAAiB,cAAc,aACnC,6CAAC,iBAAc,MAAM,GAAG,SAAS,GAAG,YAAY,OAAO;AAEzD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,oBAAoB;AACtB,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA,2BAA2B,SAAS;AAAA,QACpC,2BAA2B,eAAe;AAAA,MAC5C;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,WAAW;AACb,YAAM,eAAe;AAAA,QACnB;AAAA,QACA,kBAAkB,SAAS;AAAA,QAC3B,kBAAkB,eAAe;AAAA,MACnC;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,YAAY,aAAa;AAAA,QAC3B;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAW;AAAA,cACT,YAAY,aAAa;AAAA,cACzB,YAAY,aAAa;AAAA,cACzB;AAAA,cACA;AAAA,YACF;AAAA,YACC,GAAG;AAAA,YAGH;AAAA,eAAC,uBAAS,QAAQ,QAAQ,EAAE;AAAA,gBAC3B,CAAC,cAAU,8BAAe,KAAK,KAAK,MAAM,SAAS;AAAA,cACrD,KAAK,6CAAC,aAAQ,WAAU,WAAU,sBAAQ;AAAA,cACzC;AAAA;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;AAEpB,IAAM,kBAAc,0BAGlB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,+BAA+B,SAAS;AAAA,IACrD,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAM1B,IAAM,gBAAY;AAAA,EAChB,CAAC,EAAE,WAAW,UAAU,WAAW,GAAG,MAAM,GAAG,QAC7C;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,YAAY,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,UAAU,cAAc;AAMxB,IAAM,kBAAc;AAAA,EAClB,CAAC,EAAE,UAAU,WAAW,WAAW,GAAG,MAAM,GAAG,QAC7C;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,YAAY,aAAa;AAAA,QACzB;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,YAAY,cAAc;AAE1B,IAAM,qBAAqB;AAAA,EACzB,SAAS;AAAA,IACP,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,YAAY;AAAA,EACd;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,YAAY;AAAA,EACd;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,YAAY;AAAA,EACd;AAAA,EACA,UAAU;AAAA,IACR,SACE;AAAA,IACF,mBACE;AAAA,IACF,YAAY;AAAA,EACd;AACF;AAOA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,UAAU,aAAa,KAAK;AAAA,UAC5B,UAAU,cAAc,CAAC,YAAY,KAAK;AAAA,UAC1C,mBAAmB,KAAK,EAAE,OAAO;AAAA,UACjC;AAAA,QACF;AAAA,QACA,iBAAe,UAAU;AAAA,QACxB,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;AAWvB,IAAM,gBAAY;AAAA,EAChB,CACE;AAAA,IACE;AAAA,IACA,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,MAAM;AACxB,UAAI,YAAY,QAAQ;AACtB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACR,GAAG;AAAA,QAEJ,wDAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,UACA,YACC,8CAAC,SAAI,WAAU,iBACZ;AAAA,8BAAkB,SACjB,6CAAC,kCAAQ,MAAM,IAAI,QAAO,QAAO,WAAU,iBAAgB;AAAA,YAE5D,kBAAkB,UACjB,6CAAC,oCAAU,MAAM,IAAI,QAAO,QAAO,WAAU,iBAAgB;AAAA,aAEjE;AAAA,WAEJ;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,UAAU,cAAc;AAExB,IAAM,gBAAY,0BAGhB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,mBAAe,0BAGnB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,aAAa,cAAc;AAK3B,IAAO,gBAAQ;;;AKjlBf,IAAAC,gBAA0D;;;ACKnD,IAAM,sBAAsB,CACjC,MACA,SACY;AACZ,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,CAAC,QAAQ,CAAC,KAAM,QAAO,SAAS;AACpC,MAAI,KAAK,WAAW,KAAK,OAAQ,QAAO;AAExC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAG,QAAO;AAAA,EAClC;AACA,SAAO;AACT;AAKO,IAAM,oBAAoB,CAC/B,UACA,kBACY;AACZ,MAAI,CAAC,SAAS,aAAa,SAAS,UAAU,WAAW,GAAG;AAC1D,WAAO;AAAA,EACT;AACA,SAAO,SAAS,UAAU,MAAM,CAAC,WAAW;AAC1C,UAAM,SAAS,cAAc,KAAK,CAAC,MAAM,EAAE,QAAQ,MAAM;AACzD,WAAO,QAAQ,eAAe,OAAO,YAAY,SAAS;AAAA,EAC5D,CAAC;AACH;AAKO,IAAM,uBAAuB,CAClC,MACA,QACA,kBACY;AACZ,QAAM,YAAY,cAAc,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG;AAChE,QAAM,oBAAoB,WAAW,eAAe,CAAC;AACrD,QAAM,iBAAiB,KAAK,OAAO,aAAa;AAChD,SAAO,kBAAkB,SAAS,OAAO,cAAc,CAAC;AAC1D;AAKO,IAAM,eAAe,CAC1B,UACA,mBACW;AACX,QAAM,aAAa,eAChB,QAAQ,CAAC,UAAU,MAAM,SAAS,CAAC,CAAC,EACpC,IAAI,CAAC,MAAM,EAAE,EAAE;AAClB,QAAM,uBAAuB,WAAW;AAAA,IAAO,CAAC,OAC9C,SAAS,aAAa,SAAS,EAAE;AAAA,EACnC,EAAE;AACF,QAAM,eAAe,WAAW;AAChC,SAAO,GAAG,oBAAoB,OAAO,YAAY,IAC/C,yBAAyB,IAAI,gBAAgB,cAC/C;AACF;AAMO,IAAM,6BAA6B,CACxC,OACA,YACA,wBACkB;AAClB,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK;AACvD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,oBAAoB,QAAQ;AAC9C,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMO,IAAM,0CAA0C,CACrD,UACA,kBACW;AACX,MAAI,CAAC,UAAU,aAAa,SAAS,UAAU,WAAW,GAAG;AAC3D,WAAO,UAAU,SAAS,CAAC;AAAA,EAC7B;AAGA,QAAM,YAAY,kBAAkB,UAAU,aAAa;AAG3D,MAAI,CAAC,WAAW;AACd,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UACH,SAAS,cAIF,CAAC;AAEX,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,UAAU,SAAS,CAAC;AAAA,EAC7B;AAEA,QAAM,iBAAiB,QAAQ,IAAI,CAAC,MAAM;AACxC,UAAM,YAAY,cAAc,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;AAC3D,QAAI,CAAC,WAAW,aAAa,QAAQ;AACnC,aAAO,CAAC;AAAA,IACV;AACA,WAAO,UAAU;AAAA,EACnB,CAAC;AAED,MAAI,eAAe,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,GAAG;AAClD,WAAO,CAAC;AAAA,EACV;AAGA,QAAM,iBAAiB,SAAS,SAAS,CAAC,GAAG;AAAA,IAAO,CAAC,SACnD,QAAQ,MAAM,CAAC,WAAW,qBAAqB,MAAM,QAAQ,aAAa,CAAC;AAAA,EAC7E;AAEA,SAAO;AACT;;;AD1IA,IAAM,6BAA6B,CACjC,YACA,gBACmB;AACnB,MAAI,UAAU;AAEd,QAAM,SAAS,WAAW,IAAI,CAAC,WAAW,OAAO;AAAA,IAC/C,GAAG;AAAA,IACH,YAAY,UAAU,WAAW,IAAI,CAAC,QAAQ,MAAM;AAClD,YAAM,UAAU,YAAY,CAAC,GAAG,WAAW,CAAC;AAC5C,YAAM,YAAY,SAAS,SAAS,CAAC;AACrC,YAAM,WAAW,OAAO,SAAS,CAAC;AAElC,UAAI,UAAU,WAAW,SAAS,QAAQ;AACxC,kBAAU;AAAA,MACZ;AAEA,UAAI,SAAS,QAAQ,OAAO,OAAO,SAAS,aAAa,QAAQ;AAC/D,cAAM,eAAe,IAAI,IAAI,SAAS,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAC5D,cAAM,cAAc,QAAQ,YAAY;AAAA,UAAO,CAAC,OAC9C,aAAa,IAAI,EAAE;AAAA,QACrB;AACA,YAAI,YAAY,WAAW,QAAQ,YAAY,QAAQ;AACrD,oBAAU;AAAA,QACZ;AACA,eAAO,EAAE,GAAG,QAAQ,YAAY;AAAA,MAClC;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,EAAE;AAEF,SAAO,UAAU,SAAS;AAC5B;AAqCO,IAAM,iBAAiB,CAC5B,gBACA,UAAiC,CAAC,MACT;AACzB,QAAM,EAAE,cAAc,MAAM,IAAI;AAGhC,QAAM,sBAAkB,2BAAY,MAAsB;AACxD,QAAI,CAAC,eAAe,WAAW,WAAW,QAAW;AACnD,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,IAAI,gBAAgB,WAAW,OAAO,SAAS,MAAM;AACpE,UAAM,sBAAsB,eAAe,IAAI,CAAC,YAAY;AAAA,MAC1D,GAAG;AAAA,MACH,YAAY,OAAO,WAAW,IAAI,CAAC,aAAa;AAC9C,cAAM,WAAW,OAAO,IAAI,UAAU,SAAS,GAAG,EAAE;AACpD,cAAM,cAAc,WAAW,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,IAAI,CAAC;AACtE,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,EAAE;AAEF,WAAO;AAAA,EACT,GAAG,CAAC,gBAAgB,WAAW,CAAC;AAEhC,QAAM,CAAC,eAAe,gBAAgB,QACpC,wBAAyB,eAAe;AAI1C,QAAM,oBAAgB,uBAAQ,MAAM;AAClC,UAAM,UAAoC,CAAC;AAE3C,eAAW,UAAU,eAAe;AAClC,iBAAW,YAAY,OAAO,YAAY;AACxC,YAAI,SAAS,eAAe,SAAS,YAAY,SAAS,GAAG;AAC3D,kBAAQ,SAAS,GAAG,IAAI,SAAS;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,mBAAmB,OAAO,KAAK,aAAa,EAAE,SAAS;AAI7D,QAAM,yBAAqB,uBAAQ,MAAM;AACvC,UAAM,gBAAgB,cAAc,QAAQ,CAAC,WAAW,OAAO,UAAU;AAEzE,QAAI,QAAQ;AACZ,eAAW,YAAY,eAAe;AACpC,UAAI,CAAC,SAAS,eAAe,SAAS,YAAY,WAAW,EAAG;AAEhE,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAEA,YAAM,iBACJ,eAAe,WAAW,KAC1B,SAAS,YAAY,WAAW,KAChC,SAAS,YAAY,CAAC,MAAM,eAAe,CAAC,GAAG;AAEjD,UAAI,CAAC,gBAAgB;AACnB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,CAAC;AAKlB,QAAM,oBAAgB,2BAAY,CAAC,YAA4B;AAC7D,qBAAiB,OAAO;AAAA,EAC1B,GAAG,CAAC,CAAC;AAKL,QAAM,mBAAe,2BAAY,MAAM;AACrC,QAAI,CAAC,eAAe,WAAW,WAAW,QAAW;AACnD;AAAA,IACF;AAEA,UAAM,MAAM,IAAI,IAAI,WAAW,OAAO,SAAS,IAAI;AACnD,UAAM,SAAS,IAAI;AAGnB,eAAW,UAAU,eAAe;AAClC,iBAAW,YAAY,OAAO,YAAY;AACxC,cAAM,WAAW,UAAU,SAAS,GAAG;AAEvC,YAAI,SAAS,eAAe,SAAS,YAAY,SAAS,GAAG;AAC3D,iBAAO,IAAI,UAAU,SAAS,YAAY,KAAK,GAAG,CAAC;AAAA,QACrD,OAAO;AACL,iBAAO,OAAO,QAAQ;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAGA,eAAW,OAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAAA,EAC/D,GAAG,CAAC,eAAe,WAAW,CAAC;AAK/B,QAAM,mBAAe,2BAAY,MAAM;AACrC,UAAM,iBAAiB,cAAc,IAAI,CAAC,YAAY;AAAA,MACpD,GAAG;AAAA,MACH,YAAY,OAAO,WAAW,IAAI,CAAC,cAAc;AAAA,QAC/C,GAAG;AAAA,QACH,aAAa,CAAC;AAAA,MAChB,EAAE;AAAA,IACJ,EAAE;AAEF,qBAAiB,cAAc;AAG/B,QAAI,eAAe,WAAW,WAAW,QAAW;AAClD,YAAM,MAAM,IAAI,IAAI,WAAW,OAAO,SAAS,IAAI;AACnD,YAAM,SAAS,IAAI;AAEnB,iBAAW,UAAU,eAAe;AAClC,mBAAW,YAAY,OAAO,YAAY;AACxC,iBAAO,OAAO,UAAU,SAAS,GAAG,EAAE;AAAA,QACxC;AAAA,MACF;AAEA,iBAAW,OAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,eAAe,WAAW,CAAC;AAG/B,+BAAU,MAAM;AACd;AAAA,MAAiB,CAAC,SAChB,2BAA2B,gBAAgB,IAAI;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAGnB,+BAAU,MAAM;AACd,QAAI,CAAC,eAAe,WAAW,WAAW,QAAW;AACnD;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM;AAC3B,uBAAiB,gBAAgB,CAAC;AAAA,IACpC;AAEA,eAAW,OAAO,iBAAiB,YAAY,cAAc;AAC7D,WAAO,MACL,WAAW,OAAO,oBAAoB,YAAY,cAAc;AAAA,EACpE,GAAG,CAAC,aAAa,eAAe,CAAC;AAEjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AE7PA,IAAAC,yBAAmC;AACnC,IAAAC,iBAWO;;;ACZP,IAAAC,yBAA0C;AAC1C,IAAAC,gBAiBO;AACP,uBAA6B;AAC7B,IAAAC,kBAA2C;AAC3C;AACA;AACA;AACA;;;ACxBA,IAAAC,yBAA0B;AAC1B,IAAAC,gBAAoC;;;ACDpC,IAAAC,gBAA4D;AAC5D;AAoGM,IAAAC,uBAAA;AA1CN,IAAM,sBAAkB;AAAA,EACtB,CACE,EAAE,MAAM,OAAO,WAAW,OAAO,YAAY,IAAI,UAAU,GAAG,MAAM,GACpE,QACG;AAEH,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,eAAe,WACjB,CAAC,oBAAoB,UAAU,iBAAiB,aAAa,IAC7D,CAAC;AAEL,UAAM,aAAa,CAAC,GAAG,aAAa,GAAG,YAAY,EAAE,KAAK,GAAG;AAE7D,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAW,GAAG,YAAY,SAAS;AAAA,QACnC;AAAA,QACA,gBAAc;AAAA,QACb,GAAG;AAAA,QAEH;AAAA,kBACC,8CAAC,UAAK,WAAU,4CACb,gBACH;AAAA,UAEF,8CAAC,UAAM,iBAAM;AAAA;AAAA;AAAA,IACf;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;AAE9B,IAAO,0BAAQ;;;AC1Hf,IAAAC,gBAAmC;;;ACAnC,qBAAuB;AACvB,wBAAqD;;;AC+B9C,IAAM,YAAY,CAAC,SAAgC;AACxD,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,GAAG,mBAAmB,IAAI,CAAC;AAC1C,QAAM,QAAQ,SAAS,OACpB,MAAM,IAAI,EACV,KAAK,CAAC,UAAU,MAAM,WAAW,MAAM,CAAC;AAC3C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,mBAAmB,MAAM,MAAM,OAAO,MAAM,CAAC;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,IAAM,YAAY,CACvB,MACA,OACA,UAAyB,CAAC,MACjB;AACT,MAAI,OAAO,aAAa,aAAa;AACnC;AAAA,EACF;AACA,QAAM,QAAQ,CAAC,GAAG,mBAAmB,IAAI,CAAC,IAAI,mBAAmB,KAAK,CAAC,EAAE;AACzE,QAAM,KAAK,QAAQ,QAAQ,QAAQ,GAAG,EAAE;AACxC,MAAI,QAAQ,WAAW,QAAW;AAChC,UAAM,KAAK,WAAW,QAAQ,MAAM,EAAE;AAAA,EACxC;AACA,MAAI,QAAQ,QAAQ;AAClB,UAAM,KAAK,UAAU,QAAQ,MAAM,EAAE;AAAA,EACvC;AACA,QAAM,KAAK,YAAY,QAAQ,YAAY,KAAK,EAAE;AAClD,MAAI,QAAQ,QAAQ;AAClB,UAAM,KAAK,QAAQ;AAAA,EACrB;AACA,WAAS,SAAS,MAAM,KAAK,IAAI;AACnC;AAQO,IAAM,eAAe,CAC1B,MACA,UAAkD,CAAC,MAC1C;AACT,YAAU,MAAM,IAAI,EAAE,GAAG,SAAS,QAAQ,EAAE,CAAC;AAC/C;;;ACxEO,IAAM,sBAAsB,CAAC,aAAoC;AACtE,MAAI,aAAa,aAAa;AAC5B,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,4BAA4B,KAAK,QAAQ;AACxD,QAAM,SAAS,SAAS,SAAS,GAAG;AACpC,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,SAAS,MAAM,GAAG;AAGhC,QAAM,QAAQ,MAAM;AAAA,IAClB,CAAC,UAAU,UAAU,SAAS,MAAM,WAAW,MAAM;AAAA,EACvD;AAGA,MAAI,MAAM,UAAU,KAAK,MAAM,GAAG,EAAE,MAAM,SAAS,MAAM,GAAG,EAAE,MAAM,MAAM;AACxE,QAAI,MAAM,WAAW,GAAG;AAEtB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG;AAErC,WAAO,SAAS,CAAC,KAAK,WAAW,MAAM,IAAI,OAAO,IAAI,KAAK;AAAA,EAC7D;AAGA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG;AACrC,WAAO,SAAS,CAAC,KAAK,WAAW,MAAM,IAAI,OAAO,IAAI,KAAK;AAAA,EAC7D;AAGA,SAAO;AACT;;;ACtDA,IAAM,sBAAsB,KAAK,KAAK,KAAK;AAQ3C,IAAM,eAAe,MACnB,oBAAoB,WAAW,SAAS,QAAQ,KAAK;AASvD,IAAM,mBAAmB,CAAC,SAAgC;AACxD,MAAI;AACF,WAAO,WAAW,aAAa,QAAQ,IAAI;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASA,IAAM,kBAAkB,CAAC,QAAsC;AAC7D,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,EACT;AACA,MAAI;AACF,SAAK,MAAM,GAAG;AACd,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUO,IAAM,qBAAmC;AAAA,EAC9C,SAAS,CAAC,SAAgC;AACxC,QAAI,OAAO,aAAa,aAAa;AACnC,aAAO;AAAA,IACT;AAEA,WACE,gBAAgB,UAAU,IAAI,CAAC,KAC/B,gBAAgB,iBAAiB,IAAI,CAAC;AAAA,EAE1C;AAAA,EACA,SAAS,CAAC,MAAc,UAAwB;AAC9C,QAAI,OAAO,aAAa,aAAa;AACnC;AAAA,IACF;AACA,cAAU,MAAM,OAAO;AAAA,MACrB,QAAQ,aAAa;AAAA,MACrB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,WAAW,SAAS,aAAa;AAAA,IAC3C,CAAC;AACD,QAAI;AACF,iBAAW,aAAa,QAAQ,MAAM,KAAK;AAAA,IAC7C,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EACA,YAAY,CAAC,SAAuB;AAClC,QAAI,OAAO,aAAa,aAAa;AACnC;AAAA,IACF;AACA,iBAAa,MAAM,EAAE,QAAQ,aAAa,GAAG,MAAM,IAAI,CAAC;AACxD,QAAI;AACF,iBAAW,aAAa,WAAW,IAAI;AAAA,IACzC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;AHpCA,IAAM,iBAAyC;AAAA,EAC7C,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,mBAAmB;AACrB;AAOA,IAAM,mBAAmB,CAAC,kBAA8C;AACtE,MAAI,CAAC,cAAe,QAAO;AAC3B,SAAO,eAAe,aAAa,KAAK;AAC1C;AAKA,IAAM,kBAAkB,CAAC,SAA6B;AACpD,QAAM,cAAc,SAAS;AAC7B,QAAM,gBAAgB,YAAY,QAAQ;AAE1C,MAAI,SAAS,QAAQ;AACnB,gBAAY,QAAQ,QAAQ,iBAAiB,aAAa;AAC1D,WAAO;AAAA,EACT,WAAW,SAAS,SAAS;AAC3B,QAAI,eAAe;AACjB,kBAAY,QAAQ,QAAQ;AAAA,IAC9B;AACA,WAAO;AAAA,EACT,WAAW,SAAS,UAAU;AAC5B,UAAM,eAAe,OAAO;AAAA,MAC1B;AAAA,IACF,EAAE;AACF,QAAI,cAAc;AAChB,kBAAY,QAAQ,QAAQ,iBAAiB,aAAa;AAC1D,aAAO;AAAA,IACT,WAAW,eAAe;AACxB,kBAAY,QAAQ,QAAQ;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAKA,IAAM,oBAAoB,MAAM;AAC9B,QAAM,cAAc,SAAS;AAC7B,QAAM,eACJ,YAAY,QAAQ,SACpB,SAAS,cAAc,oBAAoB,GAAG,aAAa,SAAS;AAEtE,MAAI,gBAAgB,CAAC,YAAY,QAAQ,eAAe;AACtD,gBAAY,QAAQ,gBAAgB;AAAA,EACtC;AACF;AAKO,IAAM,oBAAgB,uBAAmB;AAAA,MAC9C;AAAA,QACE;AAAA,MACE,CAAC,KAAK,SAAS;AAAA;AAAA,QAEb,WAAW;AAAA,QACX,QAAQ;AAAA;AAAA,QAGR,YAAY,CAAC,SAAoB;AAC/B,gBAAM,SAAS,gBAAgB,IAAI;AACnC,cAAI,EAAE,OAAO,CAAC;AAAA,QAChB;AAAA,QAEA,aAAa,MAAM;AACjB,gBAAM,EAAE,WAAW,WAAW,IAAI,IAAI;AACtC,cAAI;AAEJ,cAAI,cAAc,SAAS;AACzB,sBAAU;AAAA,UACZ,WAAW,cAAc,QAAQ;AAC/B,sBAAU;AAAA,UACZ,OAAO;AAEL,sBAAU;AAAA,UACZ;AAEA,cAAI,EAAE,WAAW,QAAQ,CAAC;AAC1B,qBAAW,OAAO;AAAA,QACpB;AAAA,QAEA,UAAU,CAAC,SAAoB;AAC7B,gBAAM,EAAE,WAAW,IAAI,IAAI;AAC3B,cAAI,EAAE,WAAW,KAAK,CAAC;AACvB,qBAAW,IAAI;AAAA,QACjB;AAAA,QAEA,oBAAoB,CAAC,UAAyB;AAC5C,gBAAM,cAAc,SAAS;AAE7B,cAAI,OAAO;AAET,wBAAY,QAAQ,gBAAgB;AAGpC,kBAAM,EAAE,WAAW,WAAW,IAAI,IAAI;AACtC,gBAAI,cAAc,WAAW,cAAc,UAAU;AACnD,0BAAY,QAAQ,QAAQ;AAAA,YAC9B;AAEA,uBAAW,SAAS;AAAA,UACtB;AAAA,QACF;AAAA,QAEA,sBAAsB,MAAM;AAC1B,gBAAM,cAAc,SAAS;AAG7B,iBAAO,YAAY,QAAQ;AAC3B,iBAAO,YAAY,QAAQ;AAG3B,4BAAkB;AAGlB,gBAAM,EAAE,WAAW,WAAW,IAAI,IAAI;AACtC,qBAAW,SAAS;AAAA,QACtB;AAAA,QAEA,iBAAiB,MAAM;AACrB,gBAAM,EAAE,WAAW,WAAW,IAAI,IAAI;AAGtC,4BAAkB;AAGlB,qBAAW,SAAS;AAAA,QACtB;AAAA,QAEA,yBAAyB,MAAM;AAC7B,gBAAM,EAAE,WAAW,WAAW,IAAI,IAAI;AAEtC,cAAI,cAAc,UAAU;AAC1B,uBAAW,QAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA;AAAA;AAAA,QAEN,aAAS,qCAAkB,MAAM,kBAAkB;AAAA,QACnD,YAAY,CAAC,WAAW;AAAA,UACtB,WAAW,MAAM;AAAA,QACnB;AAAA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AACF;;;ADrNO,IAAM,WAAW,MAAM;AAC5B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAGlB,QAAM,eAAW,uBAAQ,MAAM;AAC7B,QAAI,OAAO,aAAa,aAAa;AACnC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OACE,SAAS,cAAc,oBAAoB,GAAG,aAAa,SAAS,KACpE;AAAA,MACF,SACE,SAAS,cAAc,kBAAkB,GAAG,aAAa,MAAM,KAC/D;AAAA,MACF,MACE,SACG,cAAc,8BAA8B,GAC3C,aAAa,MAAM,KAAK;AAAA,MAC9B,UACE,SACG,cAAc,wBAAwB,GACrC,aAAa,SAAS,KAAK;AAAA,MACjC,cACE,SACG,cAAc,4BAA4B,GACzC,aAAa,SAAS,KAAK;AAAA,MACjC,YACE,SACG,cAAc,0BAA0B,GACvC,aAAa,SAAS,KAAK;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,+BAAU,MAAM;AAEd,oBAAgB;AAGhB,UAAM,aAAa,OAAO,WAAW,8BAA8B;AAEnE,eAAW,iBAAiB,UAAU,uBAAuB;AAE7D,WAAO,MAAM;AACX,iBAAW,oBAAoB,UAAU,uBAAuB;AAAA,IAClE;AAAA,EACF,GAAG,CAAC,iBAAiB,uBAAuB,CAAC;AAE7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AFtDY,IAAAC,uBAAA;AAhBL,IAAM,cAAc,CAAC;AAAA,EAC1B,UAAU;AAAA,EACV;AACF,MAAwB;AACtB,QAAM,EAAE,WAAW,SAAS,IAAI,SAAS;AACzC,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAoB,SAAS;AAG/D,+BAAU,MAAM;AACd,iBAAa,SAAS;AAAA,EACxB,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,eAAe;AAAA,IACnB;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM,8CAAC,8BAAI,MAAM,IAAI;AAAA,IACvB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM,8CAAC,+BAAK,MAAM,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,OAAM;AAAA,UAEN;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,MAAK;AAAA;AAAA,UACP;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,kBAA6B;AACtD,QAAI,YAAY,aAAa;AAC3B,mBAAa,aAAa;AAAA,IAC5B,OAAO;AACL,eAAS,aAAa;AAAA,IACxB;AAEA,QAAI,UAAU;AACZ,eAAS,aAAa;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,eAAe,YAAY,cAAc,YAAY;AAE3D,SACE,8CAAC,SAAI,WAAU,qCACZ,uBAAa,IAAI,CAAC,SACjB;AAAA,IAAC;AAAA;AAAA,MAEC,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,UAAU,iBAAiB,KAAK;AAAA,MAChC,SAAS,MAAM,kBAAkB,KAAK,EAAE;AAAA,MACxC,WAAU;AAAA;AAAA,IALL,KAAK;AAAA,EAMZ,CACD,GACH;AAEJ;;;AD8HI,IAAAC,uBAAA;AA5KG,SAAS,sBAAwC;AACtD,aAAO,wBAAsB,CAAC,SAAS;AAAA,IACrC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAKN,SAAS,CAAC,SAAS,IAAI,CAAC,UAAW,MAAM,SAAS,OAAO,QAAQ,EAAE,KAAK,CAAE;AAAA,EAC5E,EAAE;AACJ;AAEO,IAAM,mBAAmB,CAAC,kBAAqC;AACpE,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,cAAc,CAClB,UACA,UACc;AACd,SAAO,uBAAS,IAAI,UAAU,CAAC,UAAU;AACvC,YAAI,8BAAe,KAAK,GAAG;AACzB,YAAM,aAAa;AAMnB,YAAM,cACJ,WAAW,KACX;AAGF,YAAM,UAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,WAGC,CAAC;AAEN,UAAI,QAAQ,SAAS,WAAW,GAAG;AACjC,iBAAS,QAAQ;AAAA,MACnB;AAEA,UAAI,WAAW,MAAM,UAAU;AAC7B,iBAAS,WAAW,YAAY,WAAW,MAAM,UAAU,KAAK;AAAA,MAClE;AAEA,iBAAO,4BAAa,YAAY,QAAQ;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAQA,IAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA,MAAM;AAAA,EACN;AACF,MAAyB;AACvB,QAAM,eAAW,sBAAgC,IAAI;AACrD,WAAS,YAAY,oBAAoB;AACzC,QAAM,QAAQ,SAAS;AACvB,QAAM,EAAE,MAAM,SAAS,aAAa,QAAI,0BAAS,OAAO,CAAC,MAAM,CAAC;AAEhE,QAAM,UAAU,CAAC,YAAqB;AACpC,iBAAa,OAAO;AAAA,EACtB;AAEA,QAAM,cAAU,sBAA8B,IAAI;AAElD,QAAM,2BAA2B,CAAC,UAAoC;AACpE,UAAM,cAAc,QAAQ,SAAS,cAAc,eAAe;AAClE,QAAI,aAAa;AACf,YAAM,eAAe;AAErB,YAAM,QAAQ,MAAM;AAAA,QAClB,YAAY;AAAA,UACV;AAAA,QACF;AAAA,MACF,EAAE,OAAO,CAAC,OAA0B,cAAc,WAAW;AAE7D,UAAI,MAAM,WAAW,EAAG;AAExB,YAAM,cAAc,SAAS;AAC7B,YAAM,eAAe,MAAM,QAAQ,WAAW;AAE9C,UAAI;AACJ,UAAI,MAAM,QAAQ,aAAa;AAC7B,oBAAY,iBAAiB,KAAK,KAAK,eAAe,KAAK,MAAM;AAAA,MACnE,OAAO;AAEL,oBACE,iBAAiB,KACb,MAAM,SAAS,KACd,eAAe,IAAI,MAAM,UAAU,MAAM;AAAA,MAClD;AAEA,YAAM,SAAS,GAAG,MAAM;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,UAAoC;AACzD,QAAI,MAAM,QAAQ,UAAU;AAC1B,cAAQ,KAAK;AAAA,IACf,WAAW,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AAC/D,+BAAyB,KAAK;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,qBAAqB,CAAC,UAAiB;AAC3C,UAAM,SAAS,MAAM;AAErB,QAAI,QAAQ,SAAS,SAAS,MAAM,GAAG;AACrC;AAAA,IACF;AAEA,QACE,kBAAkB,WAClB,OAAO,QAAQ,gCAAgC,GAC/C;AACA;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,EACf;AAEA,+BAAU,MAAM;AACd,QAAI,MAAM;AACR,eAAS,iBAAiB,eAAe,kBAAkB;AAC3D,eAAS,iBAAiB,WAAW,aAAa;AAAA,IACpD;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,kBAAkB;AAC9D,eAAS,oBAAoB,WAAW,aAAa;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,+BAAU,MAAM;AACd,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,+BAAU,MAAM;AACd,QAAI,aAAa,QAAW;AAC1B,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,8CAAC,SAAI,WAAU,YAAW,KAAK,SAC5B,sBAAY,UAAU,KAAK,GAC9B;AAEJ;AAGA,IAAM,0BAAsB,0BAM1B,CAAC,EAAE,WAAW,UAAU,SAAS,OAAO,eAAe,GAAG,MAAM,GAAG,QAAQ;AAC3E,QAAM,QAAQ,iBAAiB,aAAa;AAE5C,QAAM,WAAO,0BAAS,OAAO,CAAC,MAAM,EAAE,IAAI;AAC1C,QAAM,aAAa,MAAM,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC;AAEvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,SAAS,CAAC,MAAM;AACd,UAAE,gBAAgB;AAClB,mBAAW;AACX,kBAAU,CAAC;AAAA,MACb;AAAA,MACA,iBAAe;AAAA,MACf,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AACD,oBAAoB,cAAc;AAElC,IAAM,oBAAoB;AAAA,EACxB,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,IAAM,eAAe;AAAA,EACnB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,IAAM,gBAAgB;AAAA,EACpB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AACP;AAEA,IAAM,8BAA8B;AAAA,EAClC,MAAM;AAAA,EACN,SAAS;AACX;AAEA,IAAM,gBAAY,0BAMhB,CAAC,EAAE,WAAW,OAAO,OAAO,QAAQ,GAAG,MAAM,GAAG,QAAQ;AACxD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,kBAAkB,QAAQ,SAAS,IAAI,SAAS;AAAA,MAC7D,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AACD,UAAU,cAAc;AAExB,IAAM,0BAAsB;AAAA,EAY1B,CACE;AAAA,IACE;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,IACT;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,QAAQ,iBAAiB,aAAa;AAC5C,UAAM,WAAO,0BAAS,OAAO,CAAC,MAAM,EAAE,IAAI;AAC1C,UAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,IAAI;AAC/C,UAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAS,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;AACxE,UAAM,iBAAa,sBAAuB,IAAI;AAE9C,iCAAU,MAAM;AACd,UAAI,MAAM;AACR,qBAAa,IAAI;AAAA,MACnB,OAAO;AACL,cAAM,QAAQ,WAAW,MAAM,aAAa,KAAK,GAAG,GAAG;AACvD,eAAO,MAAM,aAAa,KAAK;AAAA,MACjC;AAAA,IACF,GAAG,CAAC,IAAI,CAAC;AAET,uCAAgB,MAAM;AACpB,UAAI,UAAU,QAAQ,YAAY,SAAS;AACzC,cAAM,OAAO,WAAW,QAAQ,sBAAsB;AACtD,YAAI,MAAM,KAAK,SAAS;AACxB,YAAI,OAAO,KAAK;AAGhB,YAAI,SAAS,QAAQ;AACnB,iBAAO,KAAK,OAAO;AACnB,gBAAM,KAAK;AAAA,QACb,WAAW,SAAS,SAAS;AAC3B,iBAAO,KAAK,QAAQ;AACpB,gBAAM,KAAK;AAAA,QACb,OAAO;AAEL,cAAI,UAAU,OAAO;AACnB,mBAAO,KAAK;AAAA,UACd,WAAW,UAAU,UAAU;AAC7B,mBAAO,KAAK,OAAO,KAAK,QAAQ;AAAA,UAClC;AAEA,cAAI,SAAS,OAAO;AAClB,kBAAM,KAAK,MAAM;AAAA,UACnB;AAAA,QACF;AAEA;AAAA,UAAkB,CAAC,SACjB,KAAK,QAAQ,OAAO,KAAK,SAAS,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,GAAG,CAAC,QAAQ,MAAM,YAAY,OAAO,MAAM,UAAU,CAAC;AAEtD,QAAI,CAAC,UAAW,QAAO;AAEvB,UAAM,qBAAqB,MAAM;AAC/B,UAAI,QAAQ;AACV,eAAO;AAAA,MACT;AACA,YAAM,WAAW,aAAa,IAAI;AAClC,YAAM,aAAa,cAAc,KAAK;AAEtC,aAAO,YAAY,QAAQ,IAAI,UAAU;AAAA,IAC3C;AAEA,UAAM,sBAAsB,MAAM;AAChC,UAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,YAAM,YAA2B;AAAA,QAC/B,KAAK,eAAe;AAAA,MACtB;AAEA,UAAI,UAAU,OAAO;AACnB,kBAAU,QAAQ,OAAO,aAAa,eAAe;AAAA,MACvD,WAAW,UAAU,UAAU;AAC7B,kBAAU,OAAO,eAAe;AAChC,kBAAU,YAAY;AAAA,MACxB,OAAO;AACL,kBAAU,OAAO,eAAe;AAAA,MAClC;AAEA,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,4BAA4B,OAAO;AAE1D,UAAM,UACJ;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,SAAS,aAAa;AAAA,QAC3B,MAAK;AAAA,QACL,yBAAsB;AAAA,QACtB,WAAW;AAAA;AAAA,UAET,OAAO,oCAAoC,oCAAoC;AAAA,UAC/E,mBAAmB,CAAC;AAAA,UACpB,cAAc;AAAA,UACd,SAAS;AAAA;AAAA,QAEX,OAAO;AAAA,UACL,GAAI,SACA,oBAAoB,IACpB;AAAA,YACE,WAAW,SAAS,WAAW,aAAa;AAAA,YAC5C,cAAc,SAAS,QAAQ,aAAa;AAAA,YAC5C,YAAY,SAAS,UAAU,aAAa;AAAA,YAC5C,aAAa,SAAS,SAAS,aAAa;AAAA,UAC9C;AAAA,QACN;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAGF,QAAI,UAAU,OAAO,aAAa,aAAa;AAC7C,iBAAO,+BAAa,SAAS,SAAS,IAAI;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AACF;AACA,oBAAoB,cAAc;AAElC,IAAM,uBAAmB;AAAA,EAavB,CACE;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,QAAQ,iBAAiB,aAAa;AAC5C,UAAM,cAAU,0BAAS,OAAO,CAAC,MAAM,EAAE,OAAO;AAChD,UAAM,cAAc,kBAAkB,IAAI;AAE1C,UAAM,cAAc,CAClB,MACG;AACH,UAAI,UAAU;AACZ,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB;AAAA,MACF;AACA,UAAI,EAAE,SAAS,SAAS;AACtB,kBAAU,CAA+B;AAAA,MAC3C,WAAW,EAAE,SAAS,WAAW;AAE/B,cAAM,WAAW;AACjB,YAAI,SAAS,QAAQ,WAAW,SAAS,QAAQ,KAAK;AACpD,UAAC,EAAE,cAA8B,MAAM;AAAA,QACzC;AAEA,cAAM,YAAY,QAAQ;AAAA,MAC5B;AACA,UAAI,CAAC,cAAc;AACjB,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM;AAC9B,UAAI,YAAY,WAAW;AACzB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,MAAM;AAC5B,aAAO,YAAY,YAAY,EAAE,gBAAgB,UAAU,IAAI,CAAC;AAAA,IAClE;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACJ,GAAG,gBAAgB;AAAA,QACpB,iBAAe;AAAA,QACf,WAAW;AAAA;AAAA,aAEN,kBAAkB,CAAC;AAAA,YACpB,WAAW;AAAA,YACX,SAAS;AAAA,YAET,WACI,qCACA,+IACN;AAAA;AAAA,QAEF,SAAS;AAAA,QACT,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,cAAE,gBAAgB;AAClB,wBAAY,CAAC;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,WAAW,KAAK;AAAA,QACzB,GAAG;AAAA,QAEH;AAAA;AAAA,UACD,8CAAC,SAAI,WAAU,UAAU,UAAS;AAAA,UACjC;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,iBAAiB,cAAc;AAE/B,IAAM,4BAAwB,0BAG5B,CAAC,EAAE,WAAW,OAAO,QAAQ,GAAG,MAAM,GAAG,QACzC;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,2BAA2B,SAAS;AAAA,IACjD,GAAG;AAAA;AACN,CACD;AACD,sBAAsB,cAAc;AAGpC,IAAM,yBAAqB,0BAGzB,CAAC,EAAE,WAAW,SAAS,OAAO,eAAe,GAAG,MAAM,GAAG,QAAQ;AACjE,QAAM,QAAQ,iBAAiB,aAAa;AAC5C,QAAM,WAAO,0BAAS,OAAO,CAAC,MAAM,EAAE,IAAI;AAC1C,QAAM,aAAa,MAAM,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC;AAEvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,MAAM;AACd,UAAE,gBAAgB;AAClB,mBAAW;AACX,kBAAU,CAAC;AAAA,MACb;AAAA,MACA,iBAAe;AAAA,MACd,GAAG;AAAA,MAEJ,wDAAC,UAAK,WAAU,uEACd,wDAAC,+BAAK,WAAU,oBAAmB,MAAM,IAAI,GAC/C;AAAA;AAAA,EACF;AAEJ,CAAC;AACD,mBAAmB,cAAc;AAEjC,IAAM,wBAAoB,0BAQxB,CAAC,EAAE,WAAW,MAAM,OAAO,UAAU,OAAO,QAAQ,GAAG,MAAM,GAAG,QAAQ;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,kBAAe;AAAA,MACf,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,WAAU,wGACb,qBACC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA;AAAA,QACZ,IAEA,8CAAC,+BAAK,MAAM,IAAI,WAAU,oBAAmB,GAEjD;AAAA,QACA,+CAAC,SAAI,WAAU,yBACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,OAAM;AAAA,cACN,WAAU;AAAA,cAET;AAAA;AAAA,UACH;AAAA,UACA,8CAAC,gBAAK,MAAK,MAAK,OAAM,iBAAgB,WAAU,YAC7C,iBACH;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AACD,kBAAkB,cAAc;AAEhC,IAAM,sBAAkB;AAAA,EAStB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,GAAG;AAAA,EACL,GACA,QACG;AACH,QAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,gBAAgB;AACpD,aAAO;AAAA,IACT;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,kBAAe;AAAA,QACf,WAAW,GAAG,oCAAoC,SAAS;AAAA,QAC1D,GAAG;AAAA,QAEJ;AAAA,wDAAC,UAAK,WAAU,aAAY;AAAA,UAC5B,+CAAC,SAAI,WAAU,kBACZ;AAAA,0BACC,8CAAC,gBAAK,MAAK,MAAK,OAAM,iBACnB,sBACH;AAAA,aAGA,iBAAiB,mBACjB,+CAAC,UAAK,WAAU,oCACb;AAAA,+BACC,8CAAC,gBAAK,MAAK,MAAK,OAAM,iBACnB,yBACH;AAAA,cAED,iBAAiB,kBAChB,8CAAC,gBAAK,MAAK,MAAK,OAAM,iBAAgB,oBAEtC;AAAA,cAED,kBACC,8CAAC,gBAAK,MAAK,MAAK,OAAM,iBACnB,0BACH;AAAA,eAEJ;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,gBAAgB,cAAc;AAE9B,IAAM,qBAAqB,CAAC;AAAA,EAC1B,OAAO;AAAA,EACP,GAAG;AACL,MAAqE;AACnE,QAAM,EAAE,WAAW,SAAS,IAAI,SAAS;AACzC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS,KAAK;AAC9D,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAoB,SAAS;AAEvE,QAAM,uBAAmB,sBAAgC,IAAI;AAC7D,mBAAiB,YAAY,oBAAoB;AACjD,QAAM,QAAQ,iBAAiB,iBAAiB;AAChD,QAAM,cAAU,0BAAS,OAAO,CAAC,MAAM,EAAE,OAAO;AAEhD,QAAM,cAAc,CAAC,MAAkC;AACrD,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,wBAAoB,IAAI;AAAA,EAC1B;AAEA,QAAM,aAAa,MAAM;AACvB,aAAS,aAAa;AACtB,wBAAoB,KAAK;AACzB,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,eAAe,MAAM;AACzB,qBAAiB,SAAS;AAC1B,wBAAoB,KAAK;AACzB,YAAQ,KAAK;AAAA,EACf;AAEA,SACE,gFACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,cAAc;AAAA,QACd;AAAA,QACA,UACE;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,QAAO;AAAA,YACP,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YAEN;AAAA,cAAC;AAAA;AAAA,gBACC,GAAE;AAAA,gBACF,MAAK;AAAA;AAAA,YACP;AAAA;AAAA,QACF;AAAA,QAEF,WAAW,8CAAC,qCAAW;AAAA,QACvB,SAAS;AAAA,QACT,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,cAAE,gBAAgB;AAClB,gCAAoB,IAAI;AAAA,UAC1B;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ,wDAAC,gBAAK,MAAK,MAAK,OAAM,iBAAgB,0BAEtC;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAM;AAAA,QACN,MAAK;AAAA,QACL,QACE,+CAAC,SAAI,WAAU,cACb;AAAA,wDAAC,kBAAO,SAAQ,WAAU,SAAS,cAAc,sBAEjD;AAAA,UACA,8CAAC,kBAAO,SAAQ,SAAQ,SAAS,YAAY,oBAE7C;AAAA,WACF;AAAA,QAGF,yDAAC,SAAI,WAAU,iBACb;AAAA,wDAAC,OAAE,WAAU,yBAAwB,6BAAe;AAAA,UACpD,8CAAC,eAAY,SAAQ,aAAY,UAAU,kBAAkB;AAAA,WAC/D;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AACA,mBAAmB,cAAc;AAEjC,IAAM,yBAAqB,0BAGzB,CAAC,EAAE,WAAW,UAAU,OAAO,QAAQ,GAAG,MAAM,GAAG,QAAQ;AAC3D,SACE,8CAAC,SAAI,KAAU,WAAW,GAAG,qBAAqB,SAAS,GAAI,GAAG,OAC/D,UACH;AAEJ,CAAC;AACD,mBAAmB,cAAc;AAEjC,IAAM,oBAAoB,CAAC;AAAA,EACzB;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,MAGM;AACJ,QAAM,QAAQ,iBAAiB,aAAa;AAC5C,QAAM,cAAU,0BAAS,OAAO,CAAC,MAAM,EAAE,OAAO;AAEhD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,WAAW,GAAG,UAAU,SAAS;AAAA,MACjC;AAAA,MACA,SAAS,CAAC,MAAM;AACd,gBAAQ,KAAK;AACb,kBAAU,CAAC;AAAA,MACb;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,WAAU,0BACd,wDAAC,kCAAQ,WAAU,gBAAe,GACpC;AAAA,QACA,8CAAC,gBAAK,OAAM,WAAU,kBAAI;AAAA;AAAA;AAAA,EAC5B;AAEJ;AACA,kBAAkB,cAAc;AAGhC,IAAO,uBAAQ;;;ADhgBP,IAAAC,uBAAA;AA7OR,IAAM,gBAAgB,CAAC,SAAmB,UAA4B;AACpE,MAAI,CAAC,SAAS,MAAM,SAAS,EAAG,QAAO,CAAC;AAExC,SAAO,QAAQ;AAAA,IAAO,CAAC,WACrB,OAAO,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC;AAAA,EACnD;AACF;AAKA,IAAM,mBAAmB,CACvB,OACA,KAIA,aACG;AACH,MAAI,CAAC,SAAU;AAEf,MAAI,OAAO,aAAa,OAAO,IAAI,SAAS;AAC1C,QAAI,QAAQ,QAAQ;AACpB,UAAM,QAAQ,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC;AAClD,WAAO,eAAe,OAAO,UAAU;AAAA,MACrC,UAAU;AAAA,MACV,OAAO,IAAI;AAAA,IACb,CAAC;AACD,aAAS,KAAiD;AAAA,EAC5D,OAAO;AAEL,UAAM,QAAQ;AAAA,MACZ,QAAQ,EAAE,MAAM;AAAA,MAChB,eAAe,EAAE,MAAM;AAAA,IACzB;AACA,aAAS,KAAK;AAAA,EAChB;AACF;AAEA,IAAM,aAAS;AAAA,EACb,CACE;AAAA,IACE,UAAU,CAAC;AAAA,IACX;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,WAAW;AAAA,IACX,aAAa;AAAA,IACb,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,KAAK;AACtD,UAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,UAAM,sBAAkB,uBAAO,KAAK;AACpC,UAAM,oBAAgB,uBAAO,oBAAoB,CAAC,EAAE;AACpD,UAAM,kBAAc,uBAAuB,IAAI;AAC/C,UAAM,iBAAa,uBAAyB,IAAI;AAChD,UAAM,oBAAgB,uBAA6C,IAAI;AAEvE,kCAAU,MAAM;AACd,aAAO,MAAM;AACX,YAAI,cAAc,QAAS,cAAa,cAAc,OAAO;AAAA,MAC/D;AAAA,IACF,GAAG,CAAC,CAAC;AAGL,UAAM,sBAAkB,wBAAQ,MAAM;AACpC,UAAI,CAAC,QAAQ,QAAQ;AACnB,eAAO,CAAC;AAAA,MACV;AACA,YAAM,WAAW,cAAc,SAAU,SAAoB,EAAE;AAC/D,aAAO;AAAA,IACT,GAAG,CAAC,SAAS,KAAK,CAAC;AAGnB,UAAM,eACJ,CAAC,eACA,2BACE,gBAAgB,SAAS,OAAO,KAAK,EAAE,SAAS;AAGrD,UAAM,mBAAmB,CAAC,SAAkB;AAC1C,sBAAgB,IAAI;AACpB,oBAAc,SAAS,EAAE,KAAK,CAAC;AAC/B,yBAAmB,IAAI;AAAA,IACzB;AAGA,kCAAU,MAAM;AAEd,UAAI,gBAAgB,SAAS;AAC3B,wBAAgB,UAAU;AAC1B;AAAA,MACF;AAEA,UAAI,YAAY;AACd,yBAAiB,KAAK;AACtB;AAAA,MACF;AAEA,YAAM,aAAa,QAAQ,SAAS,OAAO,KAAK,EAAE,SAAS,CAAC;AAC5D,uBAAiB,UAAU;AAAA,IAC7B,GAAG,CAAC,OAAO,YAAY,kBAAkB,aAAa,CAAC;AAGvD,UAAM,qBAAqB,CAAC,WAAmB;AAC7C,sBAAgB,UAAU;AAC1B,oBAAc,IAAI;AAClB,iBAAW,MAAM;AACjB,uBAAiB,KAAK;AAGtB,uBAAiB,QAAQ,KAAK,QAAQ;AAAA,IACxC;AAGA,kCAAU,MAAM;AACd,YAAM,qBAAqB,CAAC,UAAiC;AAC3D,YACE,YAAY,WACZ,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GAClD;AACA,2BAAiB,KAAK;AAAA,QACxB;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,iBAAS,iBAAiB,SAAS,kBAAkB;AAAA,MACvD;AAEA,aAAO,MAAM;AACX,iBAAS,oBAAoB,SAAS,kBAAkB;AAAA,MAC1D;AAAA,IACF,GAAG,CAAC,cAAc,eAAe,gBAAgB,CAAC;AAGlD,UAAM,kBAAc,sBAAM;AAC1B,UAAM,UAAU,MAAM,UAAU,WAAW;AAC3C,UAAM,aAAa,GAAG,OAAO;AAG7B,UAAM,cAAc,MAAM;AACxB,UAAI,cAAc,SAAS;AACzB,qBAAa,cAAc,OAAO;AAClC,sBAAc,UAAU;AAAA,MAC1B;AACA,UAAI,SAAS;AACX,gBAAQ;AAAA,MACV,OAAO;AACL,yBAAiB,IAAI,KAAK,QAAQ;AAAA,MACpC;AAAA,IACF;AAGA,UAAM,mBAAmB,CAAC,MAAkB;AAC1C,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,kBAAY;AAAA,IACd;AAGA,UAAM,wBAAwB,CAAC,MAAkB;AAC/C,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,iBAAW,MAAM;AACf,mBAAW,SAAS,MAAM;AAAA,MAC5B,GAAG,CAAC;AAAA,IACN;AAGA,UAAM,oBAAoB,CAAC,MAAqC;AAC9D,oBAAc,KAAK;AACnB,iBAAW,CAAC;AACZ,UAAI,aAAa,GAAG;AAClB,YAAI,cAAc,QAAS,cAAa,cAAc,OAAO;AAC7D,cAAMC,SAAQ,EAAE,OAAO;AACvB,sBAAc,UAAU,WAAW,MAAM;AACvC,qBAAWA,MAAK;AAAA,QAClB,GAAG,UAAU;AAAA,MACf,OAAO;AACL,mBAAW,EAAE,OAAO,KAAK;AAAA,MAC3B;AAAA,IACF;AAGA,UAAM,gBAAgB,CAAC,MAAuC;AAE5D,sBAAgB,CAAC;AACjB,UAAI,EAAE,iBAAkB;AAExB,UAAI,EAAE,QAAQ,SAAS;AACrB,UAAE,eAAe;AAGjB,YAAI,gBAAgB,gBAAgB,SAAS,GAAG;AAC9C,6BAAmB,gBAAgB,CAAC,CAAC;AAAA,QACvC,WAAW,OAAO;AAEhB,qBAAW,OAAO,KAAK,CAAC;AACxB,wBAAc,IAAI;AAClB,2BAAiB,KAAK;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,uBAAuB,CAACC,WAAoBC,cAAuB;AACvE,UAAID,UAAU,QAAO;AACrB,UAAIC,UAAU,QAAO;AACrB,aAAO;AAAA,IACT;AAGA,UAAM,WAAW,OAAO,SAAS,EAAE,EAAE,SAAS;AAC9C,UAAM,kBAAkB,YAAY,CAAC,YAAY,CAAC;AAClD,UAAM,iBAAiB,CAAC,YAAY,CAAC,YAAY,CAAC;AAElD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAW,gCAAgC,kBAAkB;AAAA,QAG7D;AAAA,yDAAC,SAAI,WAAU,8BAEb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,CAAC,SAAS;AAEb,sBAAI,KAAK;AACP,wBAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA;AAErC,sBAAC,IAA6C,UAAU;AAAA,kBAC5D;AAEA,6BAAW,UAAU;AAAA,gBACvB;AAAA,gBACA,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,WAAW,6NAA6N,qBAAqB,UAAU,QAAQ,CAAC,IAAI,SAAS;AAAA,gBAC7R;AAAA,gBACA,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,iBAAe,eAAe,SAAS;AAAA,gBACvC,iBAAe,QAAQ,SAAS,IAAI,YAAY;AAAA,gBAChD,iBAAe,eAAe,aAAa;AAAA,gBAC3C,qBAAkB;AAAA,gBAClB,MAAM,QAAQ,SAAS,IAAI,aAAa;AAAA,gBACvC,GAAG;AAAA;AAAA,YACN;AAAA,YAGC,mBACC,8CAAC,SAAI,WAAU,uDACb;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,aAAa;AAAA,gBACb,cAAW;AAAA,gBAEX,wDAAC,UAAK,WAAU,gGACd,wDAAC,4BAAE,GACL;AAAA;AAAA,YACF,GACF;AAAA,YAID,kBACC,8CAAC,SAAI,WAAU,uDACb;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,aAAa;AAAA,gBACb,cAAW;AAAA,gBAEX,wDAAC,UAAK,WAAU,gGACd,wDAAC,0CAAgB,GACnB;AAAA;AAAA,YACF,GACF;AAAA,aAEJ;AAAA,UAGC,gBACC,8CAAC,wBAAa,MAAM,cAAc,cAAc,iBAC9C;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,WAAU;AAAA,cACV,OAAO,EAAE,WAAW,kBAAkB;AAAA,cACtC,OAAM;AAAA,cAEL,0BAAgB,SAAS,IACxB,gBAAgB,IAAI,CAAC,WACnB;AAAA,gBAAC;AAAA;AAAA,kBAEC,SAAS,MAAM,mBAAmB,MAAM;AAAA,kBACxC,WAAU;AAAA,kBAET;AAAA;AAAA,gBAJI;AAAA,cAKP,CACD,IAED,8CAAC,SAAI,WAAU,qCACZ,yBACH;AAAA;AAAA,UAEJ,GACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;AAErB,IAAO,iBAAQ;;;ASnaf;;;ACAA,IAAAC,iBAAqD;;;ACWrD;;;ACVA,IAAAC,yBAAqB;AACrB;AAoJM,IAAAC,uBAAA;AA/IN,IAAMC,0BAAyB;AAAA,EAC7B,OAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,OACE;AAAA,IACF,SACE;AAAA,IACF,SACE;AAAA,IACF,MAAM;AAAA,IACN,OACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,eAAe;AAAA,IACb,OACE;AAAA,IACF,OACE;AAAA,IACF,OACE;AAAA,IACF,OACE;AAAA,EACJ;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA,cAAc;AAChB;AAKA,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,oBAAoB;AAAA,EACxB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AA4DA,IAAM,QAAQ,CAAC;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,GAAG;AACL,MAAkB;AAEhB,QAAM,cAAcA,cAAa,IAAI;AACrC,QAAM,kBAAkB,kBAAkB,IAAI;AAC9C,QAAM,mBAAmBD,wBAAuB,OAAO,KAAK,CAAC;AAC7D,QAAM,iBACJ,OAAO,qBAAqB,WACxB,mBACE,iBAA4C,MAAM,KACnD,iBAA4C,SAC7C;AAEN,QAAM,cACJ;AAEF,QAAM,kBAAkB;AACxB,MAAI,YAAY,gBAAgB;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,aAAa,gBAAgB,aAAa,SAAS;AAAA,QAChE,GAAG;AAAA,QAEJ;AAAA,wDAAC,+BAAK,MAAM,IAAI,WAAU,gBAAe,eAAY,QAAO;AAAA,UAE3D,sBACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,gBAAgB,aAAa,SAAS;AAAA,MAChE,GAAG;AAAA,MAEH;AAAA,oBACC,8CAAC,UAAK,WAAW,GAAG,iBAAiB,eAAe,GAAI,oBAAS;AAAA,QAElE;AAAA,QACA,aACC,8CAAC,UAAK,WAAW,GAAG,iBAAiB,eAAe,GACjD,qBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,gBAAQ;;;ACtLf,mBAAkB;AAkCP,IAAAE,uBAAA;AAZJ,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA,cAAc;AAAA,EACd;AACF,MAAsB;AACpB,MAAI;AACJ,MAAI;AACF,WAAO,aAAAC,QAAM,eAAe,MAAM;AAAA,MAChC;AAAA,MACA,cAAc;AAAA,IAChB,CAAC;AAAA,EACH,SAAS,QAAQ;AACf,WAAO,+EAAG,wBAAc,YAAY,MAAM,IAAI,MAAK;AAAA,EACrD;AAEA,QAAM,MAAM,cAAc,QAAQ;AAClC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MAGZ,yBAAyB,EAAE,QAAQ,KAAK;AAAA;AAAA,EAC1C;AAEJ;;;AC/CA,IAAAC,iBAAgE;AAChE,IAAAC,oBAAO;AAEP;;;ACHA,IAAAC,iBAAgD;AAChD,uBAAO;AACP,4BAA0B;AAC1B,wBAAsB;AACtB,yBAAuB;AACvB,0BAAwB;AACxB;;;ACQA,IAAM,yBAAyB,MAAc;AAC3C,SAAO,OAAO,WAAW;AAC3B;AAcO,IAAM,aAAa,CAAC,QAAwB;AACjD,SAAO,IACJ,WAAW,0BAA0B,EAAE,EACvC,WAAW,mBAAmB,OAAO,SAAS,EAC9C,WAAW,mBAAmB,OAAO,SAAS,EAC9C,WAAW,qBAAqB,GAAG,EACnC,KAAK;AACV;AAiBO,IAAM,iBAAiB,CAAC,QAAyB;AACtD,MAAI,WAAW,KAAK,GAAG,EAAG,QAAO;AACjC,QAAM,QAAQ,IAAI,MAAM,eAAe;AACvC,MAAI,SAAS,MAAM,UAAU,EAAG,QAAO;AACvC,SAAO;AACT;AAOA,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAQD,IAAM,kBAAkB,CAAC,YAA6B;AACpD,aAAW,SAAS,QAAQ,SAAS,wBAAwB,GAAG;AAC9D,QAAI,eAAe,IAAI,MAAM,CAAC,EAAE,YAAY,CAAC,EAAG,QAAO;AAAA,EACzD;AACA,SAAO;AACT;AAuBO,IAAM,mBAAmB,CAAC,YAA6B;AAC5D,MAAI,CAAC,QAAS,QAAO;AAGrB,MAAI,gBAAgB,OAAO,EAAG,QAAO;AAErC,QAAM,mBAAmB;AAAA,IACvB;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACF;AACA,SAAO,iBAAiB,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC;AACjE;AAWA,IAAM,6BAA6B,CAAC,gBAAgC;AAClE,MACE,OAAO,aAAa,eACpB,CAAC,2BAA2B,KAAK,WAAW,GAC5C;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,SAAS,cAAc,KAAK;AAClD,gBAAc,YAAY;AAE1B,QAAM,yBAAyB,CAAC,QAC9B,IAEG,WAAW,oBAAoB,EAAE,EAIjC,WAAW,mCAAmC,EAAE,EAShD,WAAW,qBAAqB,OAAO,SAAS,EAChD,WAAW,qBAAqB,OAAO,SAAS,EAChD,WAAW,qBAAqB,GAAG,EACnC,KAAK;AAEV,QAAM,KAAK,cAAc,iBAAiB,cAAc,CAAC,EAAE;AAAA,IACzD,CAAC,cAAc;AACb,UAAI,CAAC,cAAc,SAAS,SAAS,EAAG;AAExC,YAAM,QAAQ,UAAU,aAAa,OAAO,KAAK;AAKjD,YAAM,gBAAgB,0BAA0B,KAAK,KAAK;AAC1D,UAAI,YAAY,gBAAgB,cAAc,CAAC,IAAI;AAEnD,UAAI,CAAC,WAAW;AAGd,cAAM,QAAkB,CAAC;AACzB,cAAM,OAAO,CAAC,MAAY;AACxB,cAAI,EAAE,aAAa,KAAK,WAAW;AACjC,kBAAM,KAAK,EAAE,eAAe,EAAE;AAC9B;AAAA,UACF;AACA,cAAI,EAAE,aAAa,KAAK,aAAc;AACtC,gBAAM,KAAK;AACX,cAAI,GAAG,QAAQ,YAAY,MAAM,cAAc;AAC7C,kBAAM,KAAK,GAAG,eAAe,EAAE;AAC/B;AAAA,UACF;AACA,cAAI,GAAG,UAAU,SAAS,YAAY,EAAG;AACzC,gBAAM,KAAK,GAAG,UAAU,EAAE,QAAQ,IAAI;AAAA,QACxC;AACA,cAAM,KAAK,UAAU,UAAU,EAAE,QAAQ,IAAI;AAC7C,oBAAY,MAAM,KAAK,GAAG;AAAA,MAC5B;AAEA,kBAAY,uBAAuB,SAAS;AAC5C,UAAI,WAAW;AACb,kBAAU,YAAY,SAAS,eAAe,IAAI,SAAS,GAAG,CAAC;AAAA,MACjE,OAAO;AACL,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,cAAc;AACvB;AASA,IAAM,sBAAsB,CAAC,SAC3B,KAAK,WAAW,OAAO,SAAS,GAAG;AAKrC,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKD,IAAM,wBAAwB;AAMvB,IAAM,yBAAyB,CAAC,gBAAgC;AACrE,MAAI,CAAC,YAAa,QAAO;AAGzB,MAAI,OAAO,aAAa,aAAa;AAEnC,QAAI,YAAY;AAEhB,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAEA,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAEA,gBAAY,UAAU,WAAW,uBAAuB,EAAE;AAC1D,gBAAY,UAAU,WAAW,uBAAuB,EAAE;AAC1D,gBAAY,UAAU,WAAW,yBAAyB,EAAE;AAE5D,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AACA,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AACA,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AACA,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AACA,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AACA,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAGpB,QAAM,gBAAgB,QAAQ;AAAA,IAC5B;AAAA,EACF;AACA,gBAAc,QAAQ,CAAC,YAAY,QAAQ,OAAO,CAAC;AAGnD,QAAM,cAAc,QAAQ,iBAAiB,GAAG;AAChD,cAAY,QAAQ,CAAC,YAAY;AAE/B,UAAM,iBAAiB,QAAQ,kBAAkB;AAEjD,mBAAe,QAAQ,CAAC,aAAa;AACnC,YAAM,gBAAgB,SAAS,YAAY;AAG3C,UAAI,cAAc,WAAW,IAAI,GAAG;AAClC,gBAAQ,gBAAgB,QAAQ;AAChC;AAAA,MACF;AAGA,UAAI,qBAAqB,IAAI,aAAa,GAAG;AAC3C,gBAAQ,gBAAgB,QAAQ;AAChC;AAAA,MACF;AAGA,UACE,kBAAkB,UAClB,kBAAkB,SAClB,kBAAkB,UAClB;AACA,cAAM,QAAQ,QAAQ,aAAa,QAAQ;AAC3C,YAAI,SAAS,sBAAsB,KAAK,KAAK,GAAG;AAC9C,kBAAQ,gBAAgB,QAAQ;AAAA,QAClC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,QAAQ;AACjB;AAMO,IAAM,sBAAsB,CAAC,gBAAoC;AACtE,MAAI,CAAC,YAAa,QAAO,CAAC;AAK1B,MAAI,mBAAmB,2BAA2B,WAAW;AAC7D,QAAM,QAAoB,CAAC;AAG3B,QAAM,WAAW,UAAU,uBAAuB,CAAC;AAGnD,QAAM,qBACJ;AACF,qBAAmB,iBAAiB;AAAA,IAClC;AAAA,IACA,CAACC,QAAO,UAAU;AAChB,YAAM,gBAAgBA,OAAM,SAAS,0BAA0B;AAC/D,YAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,MAAM;AAC9C,YAAM,KAAK;AAAA,QACT,MAAM,gBAAgB,eAAe;AAAA,QACrC,SAASA;AAAA,QACT,OAAO,WAAW,KAAK;AAAA,MACzB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,qBACJ;AACF,qBAAmB,iBAAiB;AAAA,IAClC;AAAA,IACA,CAACA,QAAO,UAAU;AAChB,YAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,MAAM;AAC9C,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAASA;AAAA,QACT,OAAO,WAAW,KAAK;AAAA,MACzB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,sBAAsB;AAC5B,qBAAmB,iBAAiB;AAAA,IAClC;AAAA,IACA,CAACA,QAAO,UAAU;AAChB,YAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,MAAM;AAC9C,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAASA;AAAA,QACT,OAAO,WAAW,KAAK;AAAA,MACzB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAMA,QAAM,sBAAsB;AAC5B,qBAAmB,iBAAiB;AAAA,IAClC;AAAA,IACA,CAACA,QAAO,UAAU;AAChB,UAAI,CAAC,eAAe,KAAK,EAAG,QAAOA;AACnC,YAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,MAAM;AAC9C,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAASA;AAAA,QACT,OAAO,WAAW,KAAK;AAAA,MACzB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,kBACJ;AACF,qBAAmB,iBAAiB;AAAA,IAClC;AAAA,IACA,CAACA,QAAO,UAAU;AAChB,YAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,MAAM;AAC9C,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAASA;AAAA,QACT,OAAO,WAAW,KAAK;AAAA,MACzB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,kBAAkB;AACxB,qBAAmB,iBAAiB,WAAW,iBAAiB,CAACA,WAAU;AACzE,UAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,MAAM;AAC9C,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAASA;AAAA,MACT,OAAO,WAAWA,MAAK;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AAGD,QAAM,aAAyB,CAAC;AAChC,MAAI,eAAe;AAEnB,QAAM,kBAAkB,SAAS;AAAA,IAC/B;AAAA,IACA,OAAO;AAAA,EACT;AACA,QAAM,qBAAqB,IAAI;AAAA,IAC7B,OAAO,MAAM,eAAe;AAAA,IAC5B;AAAA,EACF;AACA,MAAI;AAEJ,UAAQ,QAAQ,mBAAmB,KAAK,gBAAgB,OAAO,MAAM;AAEnE,QAAI,MAAM,QAAQ,cAAc;AAC9B,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,SAAS;AAAA,UACP,iBAAiB,MAAM,cAAc,MAAM,KAAK;AAAA,QAClD;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM,YAAY,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAC9C,QAAI,MAAM,SAAS,GAAG;AACpB,iBAAW,KAAK,MAAM,SAAS,CAAC;AAAA,IAClC;AAEA,mBAAe,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,EACxC;AAGA,MAAI,eAAe,iBAAiB,QAAQ;AAC1C,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,SAAS,oBAAoB,iBAAiB,MAAM,YAAY,CAAC;AAAA,IACnE,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ADlXM,IAAAC,uBAAA;AAhIN,IAAM,sBAAsB,CAAC,QAC3B,IAAI,WAAW,0BAA0B,EAAE;AAWtC,IAAM,4BAA4B,CAAC,aACxC,SAAS;AAAA,EACP;AAAA,EACA,CAAC,OAAO,UACN,eAAe,KAAK,IAAI,QAAQ,MAAM,WAAW,KAAK,OAAO,OAAO;AACxE;AASK,IAAM,oBAAoB,CAAC,aAChC,SAAS;AAAA,EACP;AAAA,EACA,CAAC,QAAQ,UAAkB;AAAA;AAAA;AAAA,EAAW,MAAM,KAAK,CAAC;AAAA;AAAA;AAAA;AACpD;AAYF,IAAM,oBAAoB,CACxB,UACA,cACW;AACX,QAAM,QAAkB,CAAC;AACzB,QAAM,YAAY,SAAS;AAAA,IACzB;AAAA,IACA,CAACC,aAAY;AACX,YAAM,QAAQ,cAAc,MAAM,MAAM;AACxC,YAAM,KAAKA,QAAO;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,UAAU,SAAS,EAAE;AAAA,IAC1B;AAAA,IACA,CAAC,QAAQ,UAAkB,MAAM,OAAO,KAAK,CAAC;AAAA,EAChD;AACF;AAEA,IAAM,qBAAqB,CAAC,YAC1B;AAAA,EAAkB,oBAAoB,OAAO;AAAA,EAAG,CAAC,SAC/C,kBAAkB,0BAA0B,IAAI,CAAC;AACnD;AAgBF,IAAM,2BAAuB,2BAG3B,CAAC,EAAE,SAAS,WAAW,OAAO,OAAO,GAAG,QAAQ;AAChD,QAAM,kBAAkB;AAAA,IACtB;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,eAAa;AAAA,MAEb;AAAA,QAAC,sBAAAC;AAAA,QAAA;AAAA,UACC,eAAe,CAAC,kBAAAC,SAAW,mBAAAC,OAAU;AAAA,UACrC,eAAe,CAAC,oBAAAC,OAAW;AAAA,UAE1B,6BAAmB,OAAO;AAAA;AAAA,MAC7B;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,qBAAqB,cAAc;AAEnC,IAAO,mCAAQ,qBAAK,oBAAoB;;;AD3FhC,IAAAC,uBAAA;AA3BR,IAAM,uBAAmB;AAAA,EACvB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,GACA,QACG;AAaH,QAAI,CAAC,UAAU,WAAW,iBAAiB,OAAO,GAAG;AACnD,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,UAAM,uBAAuB,CAAC,UAC5B,+CAAC,UAAK,WAAU,0BAAyB;AAAA;AAAA,MAAa;AAAA,OAAM;AAG9D,UAAM,gBAAgB,mBAAmB;AAEzC,UAAM,gBAAgB,MAAM;AAC1B,UAAI,CAAC,QAAS,QAAO;AAErB,YAAM,mBAAmB,WACrB,uBAAuB,OAAO,IAC9B;AAEJ,YAAM,QAAQ,oBAAoB,gBAAgB;AAMlD,UAAI,MAAM,MAAM,CAAC,SAAS,KAAK,SAAS,MAAM,GAAG;AAC/C,cAAM,aAAa,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE,KAAK,EAAE;AAE5D,cAAMC,WAAU,SAAS,SAAS;AAClC,eACE;AAAA,UAACA;AAAA,UAAA;AAAA,YACC,yBAAyB;AAAA,cACvB,QAAQ,cAAc;AAAA,YACxB;AAAA;AAAA,QACF;AAAA,MAEJ;AAGA,YAAM,aAAa,CAAC,MAAyB,QAAgB;AAC3D,cAAM,eAAe,KAAK,SAAS,KAAK,SAAS,MAAM,GAAG,EAAE;AAC5D,eAAO,GAAG,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW;AAAA,MAC3C;AAEA,aACE,+EACG,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,cAAM,MAAM,WAAW,MAAM,KAAK;AAClC,YAAI,KAAK,SAAS,UAAU,KAAK,OAAO;AACtC,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,KAAK;AAAA,cACX,aAAa,MAAM,cAAc,KAAK,KAAM;AAAA;AAAA,YAFvC;AAAA,UAGP;AAAA,QAEJ,WAAW,KAAK,SAAS,gBAAgB,KAAK,OAAO;AAEnD,cAAI,QAAQ;AACV,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAM,KAAK;AAAA,gBACX,aAAa,MAAM,cAAc,KAAK,KAAM;AAAA;AAAA,cAFvC;AAAA,YAGP;AAAA,UAEJ;AACA,iBACE,8CAAC,SAAc,WAAU,sBACvB;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,aAAW;AAAA,cACX,aAAa,MAAM,cAAc,KAAK,KAAM;AAAA;AAAA,UAC9C,KALQ,GAMV;AAAA,QAEJ,OAAO;AACL,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,yBAAyB,EAAE,QAAQ,KAAK,QAAQ;AAAA;AAAA,YAD3C;AAAA,UAEP;AAAA,QAEJ;AAAA,MACF,CAAC,GACH;AAAA,IAEJ;AAEA,UAAM,kBAAkB;AAAA;AAAA,MAEtB;AAAA;AAAA,MAEA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,eAAa;AAAA,UAEZ,wBAAc;AAAA;AAAA,MACjB;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,eAAa;AAAA,QAEZ,wBAAc;AAAA;AAAA,IACjB;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;AAE/B,IAAO,+BAAQ,qBAAK,gBAAgB;;;AG7NpC,IAAAC,iBAOO;AACP;AACA,IAAAC,yBAA6B;AAC7B;AA6LU,IAAAC,uBAAA;AA9KV,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,IACL,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA;AAAA,IACT,aAAa;AAAA;AAAA,IACb,UAAU;AAAA;AAAA,IACV,aAAa;AAAA,EACf;AACF;AAKA,IAAM,wBACJ;AAKF,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,SACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAAA,IACX,SACE;AAAA,EACJ;AACF;AA8CA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,kBAAc,sBAAM;AAC1B,UAAM,UAAU,MAAM,YAAY,WAAW;AAG7C,UAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,KAAK;AAC5D,UAAM,eAAe,gBAAgB;AACrC,UAAM,UAAU,eAAe,cAAc;AAG7C,UAAM,eAAe,CAAC,UAAyC;AAC7D,UAAI,CAAC,cAAc;AACjB,2BAAmB,MAAM,OAAO,OAAO;AAAA,MACzC;AACA,iBAAW,KAAK;AAAA,IAClB;AAGA,UAAM,eAAe,WAAW,aAAa;AAG7C,UAAM,cAAcA,cAAa,IAAI;AAGrC,UAAM,eAAe,WAAW,gBAAgB,YAAY;AAG5D,UAAM,iBAAiB,cAAc,YAAY,EAAE,YAAY;AAG/D,UAAM,mBACJ,UAAU,aAAc,UAAU,aAAa,SAAS,UACpD,iBACA,YAAY;AAGlB,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,aAAa,MAAM;AACvB,UAAI,eAAe;AACjB,eACE;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,YAAY;AAAA,YAClB,QAAO;AAAA,YACP,OAAM;AAAA;AAAA,QACR;AAAA,MAEJ;AAEA,UAAI,SAAS;AACX,eACE;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,YAAY;AAAA,YAClB,QAAO;AAAA,YACP,OAAM;AAAA;AAAA,QACR;AAAA,MAEJ;AAEA,aAAO;AAAA,IACT;AAEA,WACE,+CAAC,SAAI,WAAU,iBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,YAAY;AAAA,YACZ,WAAW,eAAe;AAAA,UAC5B;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,MAAK;AAAA,gBACL,IAAI;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV,WAAU;AAAA,gBACT,GAAG;AAAA;AAAA,YACN;AAAA,YAGA,8CAAC,WAAM,SAAS,SAAS,WAAW,iBAEjC,qBAAW,GACd;AAAA,YAGC,SACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,YAAY;AAAA,gBACd;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAG;AAAA,oBACH,SAAS;AAAA,oBACT,MAAM,YAAY;AAAA,oBAClB,QAAO;AAAA,oBACP,WAAW;AAAA,sBACT;AAAA,sBACA;AAAA,oBACF;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MAEJ;AAAA,MAGC,gBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UAEL;AAAA;AAAA,MACH;AAAA,MAID,cAAc,CAAC,gBACd;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UAEL;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;AC5Sf;AA0CI,IAAAC,uBAAA;AAbJ,IAAM,UAAU,CAAC;AAAA,EACf,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,GAAG;AACL,MAAoB;AAClB,QAAM,cAAc;AAEpB,QAAM,qBAAqB;AAAA,IACzB,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,aAAa,mBAAmB,WAAW,GAAG,SAAS;AAAA,MACrE,oBAAkB;AAAA,MACjB,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAO,kBAAQ;;;ACnDf,IAAAC,iBAcO;AACP,IAAAC,kBAA2C;AAC3C;AACA;AAgRQ,IAAAC,uBAAA;AAjQR,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF;AAUA,IAAM,qBACJ;AAKF,IAAMC,iBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF;AAKA,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AACZ;AAwDA,IAAM,YAAQ;AAAA,EACZ,CACE;AAAA,IACE;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,kBAAc,sBAAM;AAC1B,UAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,UAAM,eAAW,uBAAyB,IAAI;AAG9C,UAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,cAAc;AACrE,UAAM,eAAe,gBAAgB;AACrC,UAAM,UAAU,eAAe,cAAc;AAG7C,UAAM,eAAe,CAAC,UAAyC;AAC7D,YAAM,aAAa,MAAM,OAAO;AAEhC,UAAI,CAAC,cAAc;AACjB,2BAAmB,UAAU;AAAA,MAC/B;AAGA,UAAI,MAAM,QAAQ;AAChB,cAAM,OAAO,KAAK;AAAA,MACpB;AAEA,iBAAW,KAAK;AAAA,IAClB;AAGA,UAAM,eAAe,WAAW,aAAa;AAG7C,UAAM,cAAcD,cAAa,IAAI;AAGrC,UAAM,kBAAkB,YAAY;AACpC,UAAM,gBAAgB,YAAY;AAGlC,UAAM,eAAe,UAAU,YAAY;AAG3C,UAAM,iBAAiBC,eAAc,YAAY,EAAE,YAAY;AAG/D,UAAM,iBAAiB,MAAM;AAC3B,UAAI,iBAAiB,WAAW;AAC9B,eAAO;AAAA,MACT;AACA,aAAO,YAAY;AAAA,IACrB;AAEA,UAAM,mBAAmB,eAAe;AAGxC,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA,YAAY,YAAY;AAAA,MACxB;AAAA,IACF;AAGA,UAAM,kBACJ,iBAAiB,aAAa,iBAAiB;AACjD,UAAM,qBACJ,iBAAiB,YACb,0BACA;AAGN,UAAM,eAAe,MAAM;AACzB,UAAI,iBAAiB,YAAY;AAC/B,eAAO,UAAU,kBAAkB;AAAA,MACrC;AAEA,UAAI,iBAAiB,WAAW;AAC9B,eAAO;AAAA,MACT;AAEA,aAAO,UAAU,kBAAkB;AAAA,IACrC;AAGA,UAAM,iBAAiB,MAAM;AAC3B,aAAO,iBAAiB,aACpB,uBACA;AAAA,IACN;AAEA,WACE,+CAAC,SAAI,WAAU,iBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,kBACI,GAAG,gBAAgB,oBAAoB,oBAAoB,IAC3D,YAAY;AAAA,YAChB,WAAW,eAAe;AAAA,UAC5B;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,CAAC,SAAS;AACb,2BAAS,UAAU;AACnB,sBAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,2BAC9B,IAAK,KAAI,UAAU;AAAA,gBAC9B;AAAA,gBACA,MAAK;AAAA,gBACL,IAAI;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN,YAAY;AAAA,gBACd;AAAA,gBACC,GAAG;AAAA;AAAA,YACN;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW;AAAA,gBACX;AAAA,gBACA,gBAAc;AAAA,gBACd,SAAS,CAAC,MAAM;AAEd,oBAAE,eAAe;AACjB,sBAAI,CAAC,UAAU;AAEb,wBAAI,SAAS,SAAS;AACpB,+BAAS,QAAQ,MAAM;AAEvB,+BAAS,QAAQ,KAAK;AAAA,oBACxB;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA,WAAW,CAAC,MAAM;AAEhB,uBAAK,EAAE,QAAQ,WAAW,EAAE,QAAQ,QAAQ,CAAC,UAAU;AACrD,sBAAE,eAAe;AACjB,wBAAI,SAAS,SAAS;AACpB,+BAAS,QAAQ,MAAM;AACvB,+BAAS,QAAQ,KAAK;AAAA,oBACxB;AAAA,kBACF;AAAA,gBACF;AAAA,gBAGC,qBAAW,8CAAC,SAAI,WAAW,YAAY;AAAA;AAAA,YAC1C;AAAA,YAGC,SACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,YAAY;AAAA,kBACZ;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAG;AAAA,oBACH,SAAS;AAAA,oBACT,MAAM,YAAY;AAAA,oBAClB,QAAO;AAAA,oBACP,WAAW;AAAA,sBACT,eAAe;AAAA,sBACf;AAAA,sBACA;AAAA,oBACF;AAAA,oBACA,OAAO,aAAa;AAAA,oBAEnB;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MAEJ;AAAA,MAGC,gBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UAEL;AAAA;AAAA,MACH;AAAA,MAID,cAAc,CAAC,gBACd;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAU;AAAA,UACV,OAAM;AAAA,UAEL;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;AAkBpB,IAAM,wBAAwB,CAC5B,MACA,cACA,UACA,sBAEA,wBAAwB,CAAC,KAAK,SAAS;AAAA,EACrC,OAAO;AAAA,EACP,UAAU,CAAC,UAAU;AACnB,QAAI,CAAC,IAAI,EAAE,UAAU;AACnB,UAAI,EAAE,MAAM,CAAC;AACb,UAAI,EAAE,gBAAgB,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE;AAKG,IAAM,qBAAqB,CAAC,kBAAuC;AACxE,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,SAAO;AACT;AAKA,IAAMC,eAAc,CAClB,UACA,UAEA,wBAAS,IAAI,UAAU,CAAC,UAAU;AAChC,MAAI,KAAC,+BAAe,KAAK,EAAG,QAAO;AAEnC,QAAM,aAAa;AACnB,QAAM,eAAe,WAAW,SAAS;AACzC,aAAO,6BAAa,YAAY;AAAA,IAC9B,GAAI,eAAe,EAAE,MAAM,IAAI,CAAC;AAAA,IAChC,GAAI,WAAW,MAAM,WACjB,EAAE,UAAUA,aAAY,WAAW,MAAM,UAAU,KAAK,EAAE,IAC1D,CAAC;AAAA,EACP,CAAC;AACH,CAAC;AA0CH,IAAM,iBAAa;AAAA,EACjB,CACE;AAAA,IACE,OAAO;AAAA,IACP,eAAe;AAAA,IACf;AAAA,IACA,MAAM;AAAA,IACN,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,kBAAc,sBAAM;AAC1B,UAAM,OAAO,YAAY,eAAe,WAAW;AAGnD,UAAM,eAAW,uBAA2B,IAAI;AAChD,aAAS,YAAY;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,QAAQ,SAAS;AAGvB,UAAM,EAAE,SAAS,QAAI,0BAAS,OAAO,CAAC,MAAM,CAAC;AAG7C,kCAAU,MAAM;AACd,YAAM,eAAe,MAAM,SAAS,EAAE;AACtC,UAAI,gBAAgB,eAAe;AACjC,sBAAc,YAAY;AAAA,MAC5B;AAAA,IACF,GAAG,CAAC,CAAC;AAGL,kCAAU,MAAM;AACd,UAAI,cAAc,QAAW;AAC3B,iBAAS,SAAS;AAAA,MACpB;AAAA,IACF,GAAG,CAAC,WAAW,QAAQ,CAAC;AAGxB,kCAAU,MAAM;AACd,YAAM,SAAS,EAAE,SAAS,CAAC;AAAA,IAC7B,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL,cAAY;AAAA,QACX,GAAG;AAAA,QAEH,UAAAA,aAAY,UAAU,KAAK;AAAA;AAAA,IAC9B;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;AAmDzB,IAAM,qBAAiB;AAAA,EACrB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AAEH,UAAM,QAAQ,mBAAmB,aAAa;AAC9C,UAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,QAAI,0BAAS,KAAK;AAGlB,UAAM,kBAAc,sBAAM;AAC1B,UAAM,UAAU,MAAM,cAAc,WAAW;AAG/C,UAAM,YAAY,eAAe;AACjC,UAAM,aAAa,iBAAiB;AACpC,UAAM,eAAe,aAAa,aAAa;AAG/C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,CAAC,MAAM;AACf,cAAI,EAAE,OAAO,WAAW,CAAC,YAAY;AACnC,qBAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;;;AClrB7B;AACA;AAgVQ,IAAAC,uBAAA;AA5TR,IAAMC,gBAAe;AAAA,EACnB,OAAO;AAAA,IACL,WAAW;AAAA;AAAA,IACX,KAAK;AAAA;AAAA,IACL,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,cAAc;AAAA;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA;AAAA,IACX,KAAK;AAAA;AAAA,IACL,SAAS;AAAA;AAAA,IACT,QAAQ;AAAA;AAAA,IACR,cAAc;AAAA;AAAA,EAChB;AACF;AAKA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,IACJ,YAAY;AAAA;AAAA,IACZ,MAAM;AAAA;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA;AAAA,IACZ,MAAM;AAAA;AAAA,EACR;AACF;AAgHA,IAAM,0BAA0B,CAAC,OAAe,QAAgB;AAC9D,QAAM,YAAY,MAAM,KAAK,IAAI,IAAI;AACrC,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,CAAC;AACzD,QAAM,aAAa,QAAQ,IAAI,IAAK,eAAe,MAAO;AAE1D,SAAO,EAAE,cAAc,WAAW;AACpC;AAKA,IAAM,mBAAmB,CACvB,OACA,gBACA,iBACY;AACZ,SAAO,CAAC,EAAE,SAAS,kBAAkB;AACvC;AAkBA,IAAM,qBAAqB,CACzB,cACA,gBACA,OACA,cACA,KACA,eACG;AACH,MAAI,cAAc;AAChB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,GAAG,KAAK,MAAM,YAAY,CAAC,OAAO,GAAG;AAAA,MAC9C,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,GAAG,KAAK,MAAM,UAAU,CAAC;AAAA,MAClC,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;AA0BA,IAAM,yBAAyB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAiC;AAE/B,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,gBAAgB,aAAa,qBAAqB;AAAA,IACzD,WAAW,gBAAgB,aACvB,sBACA;AAAA,IACJ,SAAS,gBAAgB;AAAA,EAC3B;AACF;AAWA,IAAM,gCAAgC,CACpC,MACA,OACA,oBACI;AAAA,EACJ,YAAY,SAAS,WAAW,CAAC,EAAE,SAAS;AAAA,EAC5C,gBAAgB,SAAS,YAAY;AAAA,EACrC,WAAW,SAAS,YAAY,CAAC,CAAC,SAAS,CAAC;AAAA;AAC9C;AAWA,IAAM,+BAA+B,CACnC,cACA,gBACA,cACA,KACA,YACA,wBACc;AACd,MAAI,CAAC,gBAAgB,CAAC,eAAgB,QAAO;AAG7C,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC,0BAAgB,SAAS,aACxB,gFACE;AAAA,sDAAC,UAAK,WAAU,oBAAoB,eAAK,MAAM,YAAY,GAAE;AAAA,QAC7D,+CAAC,UAAK,WAAU,iBAAgB;AAAA;AAAA,UAAK;AAAA,WAAI;AAAA,SAC3C,IAEA,+CAAC,gBAAK,MAAK,MAAK,QAAO,UAAS,WAAU,oBACvC;AAAA,aAAK,MAAM,UAAU;AAAA,QAAE;AAAA,SAC1B;AAAA;AAAA,EAEJ;AAEJ;AAKA,IAAM,kBAAkB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MASE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA,eAAe;AAAA,MACf;AAAA,IACF;AAAA,IAEA;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP;AAAA,UACA,cACE,OAAO,UAAU,WACb,GAAG,KAAK,KAAK,KAAK,MAAM,UAAU,CAAC,eACnC,aAAa,KAAK,MAAM,UAAU,CAAC,QAAQ,GAAG;AAAA,UAEpD,WAAU;AAAA;AAAA,MACZ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,eAAe;AAAA,YACf;AAAA,UACF;AAAA,UACA,OAAO,EAAE,OAAO,GAAG,UAAU,IAAI;AAAA;AAAA,MACnC;AAAA;AAAA;AACF;AAMF,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,IACF;AAAA,IAEC;AAAA,uBAAiB,OAAO,gBAAgB,YAAY,KACnD,+CAAC,SAAI,WAAU,8DACZ;AAAA,iBACC;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAW,GAAG,gCAAgC,cAAc;AAAA,YAE3D;AAAA;AAAA,QACH;AAAA,QAGD;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,SACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,oBAAmB;AAAA,UACnB,eAAc;AAAA;AAAA,MAChB;AAAA;AAAA;AACF;AAMF,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,QAAM;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX;AAAA,EACF,IAAI,uBAAuB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MAEC;AAAA,yBAAiB,OAAO,gBAAgB,YAAY,KACnD;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAO;AAAA,YACP;AAAA,YACA,WAAW,GAAG,oBAAoB,gBAAgB;AAAA,YAEjD;AAAA;AAAA,QACH;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,oBAAmB;AAAA,YACnB,eAAc;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACF;AAEJ;AAKA,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AACxB,QAAM,WAAW,SAAS,WAAW,UAAU,YAAY;AAC3D,QAAM,mBAAmB,SAAS,WAAW,cAAc;AAC3D,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,QAAQ,YAAY,QAAQ,UAAU,SAAS,GAC/D;AAAA,kBAAc,cACb,+CAAC,SAAI,WAAU,qDACZ;AAAA,eACC;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MAGD,kBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAEC;AAAA,iBAAK,MAAM,UAAU;AAAA,YAAE;AAAA;AAAA;AAAA,MAC1B;AAAA,OAEJ;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAoB;AAAA,UAClB;AAAA,UACA,YAAY;AAAA,UACZ,YAAY;AAAA,QACd;AAAA,QACA,eAAe;AAAA,UACb,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEC,cAAc,kBACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,QAAO;AAAA,QACP,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC;AAAA,eAAK,MAAM,UAAU;AAAA,UAAE;AAAA;AAAA;AAAA,IAC1B;AAAA,IAGD,cAAc,aACb;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,MAAK;AAAA,QACL,QAAO;AAAA,QACP,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;AAsCA,IAAM,cAAc,CAAC;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwB;AACtB,QAAM,EAAE,cAAc,WAAW,IAAI,wBAAwB,OAAO,GAAG;AACvE,QAAM,cAAcA,cAAa,IAAI;AACrC,QAAM,iBAAiB,gBAAgB,OAAO;AAE9C,MAAI,WAAW,WAAW;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,UACV,OAAO,gBAAgB;AAAA,UACvB,QAAQ,iBAAiB;AAAA,QAC3B;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,WAAW,WAAW;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,UACV,OAAO,gBAAgB;AAAA,UACvB,QAAQ,iBAAiB;AAAA,QAC3B;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,sBAAQ;;;ACzuBf,IAAAC,iBAQO;;;ACRP,IAAAC,iBAYO;AACP;AAGA,IAAAC,0BAWO;AACP;AACA;;;AC7BA,IAAAC,iBAA+D;AAC/D,oBAA+B;;;ACA7B,IAAAC,uBAAA;AADK,IAAM,SAAS,CAAC,EAAE,MAAM,MAAM,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA;AAAA;AACF;;;ACnBA,IAAAC,uBAAA;AADK,IAAM,SAAS,CAAC,EAAE,MAAM,MAAM,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA;AAAA;AACF;;;ACnBA,IAAAC,uBAAA;AADK,IAAM,SAAS,CAAC,EAAE,MAAM,MAAM,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM;AAAA;AAAA,MACR;AAAA;AAAA;AACF;;;ACNE,IAAAC,uBAAA;AAdG,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AACF,MAIE;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAM;AAAA;AAAA,IACR;AAAA;AACF;;;ACJE,IAAAC,uBAAA;AAdG,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AACF,MAIE;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAM;AAAA;AAAA,IACR;AAAA;AACF;;;ACJE,IAAAC,uBAAA;AAdG,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AACF,MAIE;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAM;AAAA;AAAA,IACR;AAAA;AACF;;;ANuDS,IAAAC,uBAAA;AAlDX,IAAM,eAAoD;AAAA,EACxD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AACF;AAkCO,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX,MAAoC;AAElC,MAAI,CAAC,UAAU;AACb,UAAM,eAA6B;AACnC,WAAO,8CAAC,gBAAa,MAAY,OAAc,QAAgB;AAAA,EACjE;AAEA,MAAI,OAAO,aAAa,UAAU;AAGhC,UAAM,eAAe,cACnB,GAAG,QAAQ,MACb;AACA,QAAI,cAAc;AAChB,aAAO,8CAAC,gBAAa,MAAY,OAAc,QAAgB;AAAA,IACjE;AAEA,UAAM,aAAa,aAAa,QAAQ;AACxC,QAAI,YAAY;AACd,aAAO,8CAAC,cAAW,MAAY,OAAc;AAAA,IAC/C;AAEA,UAAM,WAAyB;AAC/B,WAAO,8CAAC,YAAS,MAAY,OAAc,QAAgB;AAAA,EAC7D,OAAO;AAEL,eAAO,6BAAa,UAAU;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA,IACT,CAGE;AAAA,EACJ;AACF;AAEA,IAAO,qBAAQ;;;ADOT,IAAAC,uBAAA;AAtEN,IAAM,oBAAoB;AAAA,EACxB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEA,IAAM,uBAAuB;AAAA,EAC3B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,0BAA0B;AAAA,EAC9B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,sBAAsB;AAAA,EAC1B,YAAY;AAAA,EACZ,UAAU;AACZ;AAEA,IAAM,sBAAsB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AACX;AAEA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,kBAAkB,OAAO;AAC7C,UAAM,iBAAiB,qBAAqB,OAAO;AACnD,UAAM,mBAAmB,wBAAwB,SAAS;AAC1D,UAAM,gBAAgB,oBAAoB,MAAM;AAChD,UAAM,gBAAgB,oBAAoB,MAAM;AAGhD,UAAM,gBAAgB,CAAC,CAAC;AACxB,UAAM,gBAAgB,CAAC,MAAqC;AAC1D,UAAI,iBAAiB,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG;AACnD,UAAE,eAAe;AACjB,QAAC,EAAE,cAA8B,MAAM;AAAA,MACzC;AACA,kBAAY,CAAC;AAAA,IACf;AASA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,UAAU,gBAAgB,IAAI;AAAA,QAC9B,MAAM,gBAAgB,WAAW;AAAA,QAChC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAYA,IAAM,sBAAsB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,sBAAsB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,0BAA0B;AAAA,EAC9B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,wBAAwB;AAAA,EAC5B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,4BAAwB;AAAA,EAI5B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,oBAAoB,oBAAoB,MAAM;AACpD,UAAM,oBAAoB,oBAAoB,MAAM;AACpD,UAAM,wBAAwB,wBAAwB,MAAM;AAC5D,UAAM,sBAAsB,sBAAsB,MAAM;AAExD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,WAAW,iBAAiB;AAAA,cAC9B;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA;AAAA,oBACF;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,WAAU;AAAA,oBAET;AAAA;AAAA,gBACH;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,GAAG,8BAA8B,qBAAqB;AAAA,oBAEhE;AAAA;AAAA,gBACH;AAAA;AAAA;AAAA,UACF;AAAA,UAEC,YACC,+CAAC,SAAI,WAAU,oDACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,YACA,8CAAC,iBAAM,MAAK,SAAQ,QAAO,QACxB,uBACH;AAAA,aACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AASA,IAAM,oBAAgB;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,iBAAiB,MAAM;AAC3B,cAAQ,OAAO;AAAA,QACb,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,YACb,aAAa;AAAA,UACf;AAAA,QACF,KAAK;AACH,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,YACb,aAAa;AAAA,UACf;AAAA,QACF;AACE,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,aAAa;AAAA,YACb,aAAa;AAAA,UACf;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,aAAa,YAAY,IAAI,eAAe;AAE3D,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW,GAAG,yBAAyB,SAAS;AAAA,QAC/C,GAAG;AAAA,QAEJ;AAAA,yDAAC,aAAQ,WAAU,sCACjB;AAAA,0DAAC,OAAE,WAAU,4CAA4C,kBAAO;AAAA,YAEhE,8CAAC,SAAI,WAAU,oCACb,wDAAC,iBAAM,MAAK,UAAS,SAAQ,SAAQ,QAAQ,aAC1C,iBACH,GACF;AAAA,aACF;AAAA,UAEA,8CAAC,UAAK,WAAU,iBACd;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,gBAAgB,WAAW;AAAA,cAC1C,WAAU;AAAA,cAET;AAAA;AAAA,UACH,GACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAeA,IAAM,mBAAe;AAAA,EACnB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,eAAe,cAAc;AACnC,UAAM,mBAAmB;AAAA,MACvB,YACE,gFACG;AAAA,qBACC,+CAAC,SAAI,WAAU,oCACZ;AAAA,yBACC,+CAAC,UAAK,WAAU,6CACd;AAAA,0DAAC,OAAE,WAAU,+BAA8B,uBAAM;AAAA,YACjD,8CAAC,OAAE,WAAU,iBAAiB,uBAAY;AAAA,aAC5C;AAAA,UAED,WACC,+CAAC,UAAK,WAAU,6CACd;AAAA,0DAAC,OAAE,WAAU,+BAA8B,iBAAG;AAAA,YAC9C,8CAAC,OAAE,WAAU,iBAAiB,mBAAQ;AAAA,aACxC;AAAA,WAEJ;AAAA,QAEF,+CAAC,UAAK,WAAU,gDACd;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO;AAAA,cACP,SAAS;AAAA,cACT,eAAY;AAAA;AAAA,UACd;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,WAAW;AAAA,gBACT;AAAA,cACF;AAAA,cAEC;AAAA,qBAAK,MAAM,QAAQ;AAAA,gBAAE;AAAA;AAAA;AAAA,UACxB;AAAA,WACF;AAAA,SACF;AAAA,MAEF,UAAU,8CAAC,OAAE,WAAU,yBAAyB,mBAAQ;AAAA,IAC1D;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ,eAAe,eAAe;AAAA,QACtC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,QAAO;AAAA,QACP,WAAW,GAAG,eAAe,SAAS,IAAI,SAAS;AAAA,QAClD,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,eACI,2CACA;AAAA,gBACJ,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,KAAK,KAAK;AAAA,cACxC;AAAA,cACA,OAAO,MAAM,WAAW,GAAG,IAAI,EAAE,iBAAiB,MAAM,IAAI;AAAA,cAC5D,eAAY;AAAA,cAEX;AAAA;AAAA,UACH;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,CAAC,gBAAgB;AAAA,cACnB;AAAA,cAEA;AAAA,8DAAC,gBAAK,MAAK,MAAK,QAAO,QAAO,WAAU,0BACrC,kBACH;AAAA,gBACC,iBAAiB,SAAS;AAAA;AAAA;AAAA,UAC7B;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAUA,IAAM,gBAAY;AAAA,EAChB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,QAAO;AAAA,QACP,WAAW,GAAG,mCAAmC,SAAS;AAAA,QACzD,GAAG;AAAA,QAEH;AAAA,qBACC,8CAAC,UAAK,WAAU,8CACb,kBAAQ,IAAI,CAAC,MAAM,UAClB,+CAAC,2BACC;AAAA,0DAAC,OAAG,gBAAK;AAAA,YACR,QAAQ,QAAQ,SAAS,KAAK,8CAAC,OAAE,oBAAC;AAAA,eAFtB,GAAG,IAAI,MAAM,KAAK,EAGjC,CACD,GACH;AAAA,UAGF,8CAAC,OAAE,WAAU,4CAA4C,kBAAO;AAAA,UAEhE,+CAAC,UAAK,WAAU,gDACd;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,eAAY;AAAA;AAAA,YACd;AAAA,YACC,kBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,WAAW;AAAA,kBACT;AAAA,gBACF;AAAA,gBAEC;AAAA,uBAAK,MAAM,QAAQ;AAAA,kBAAE;AAAA;AAAA;AAAA,YACxB;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAaA,IAAM,sBAAkB;AAAA,EACtB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,aAAa;AAEjC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW;AAAA,UACT,iBAAiB,UAAU,mBAAmB;AAAA,UAC9C;AAAA,QACF;AAAA,QACA,SAAS,MAAM,iBAAiB,WAAW,gBAAgB,WAAW;AAAA,QACrE,GAAG;AAAA,QAEJ;AAAA,yDAAC,SAAI,WAAU,8CACb;AAAA,2DAAC,SAAI,WAAU,oDACb;AAAA,4DAAC,OAAE,WAAU,2DACV,kBACH;AAAA,cACC,kBAAkB,YACjB;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM,gBAAgB,WAAW;AAAA,kBAC1C,WAAU;AAAA,kBACX;AAAA;AAAA,cAED;AAAA,eAEJ;AAAA,YAEA,8CAAC,SAAI,WAAU,UACZ,wBACC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,OAAO,GAAG,QAAQ,KAAK,aAAa;AAAA,gBACpC,SAAS;AAAA;AAAA,YACX,IAEA,8CAAC,OAAE,WAAU,kCAAkC,uBAAY,GAE/D;AAAA,aACF;AAAA,UAEC,iBAAiB,WAChB;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAWA,IAAM,kBAAc;AAAA,EAClB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,QAAQ,aAAa;AAE3B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW,GAAG,qCAAqC,SAAS;AAAA,QAC3D,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,cACF;AAAA,cACA,OAAO;AAAA,gBACL,iBAAiB;AAAA,cACnB;AAAA,cAEA,wDAAC,sBAAW,UAAU,MAAM,OAAM,gBAAe,MAAM,IAAI;AAAA;AAAA,UAC7D;AAAA,UAEA,+CAAC,SAAI,WAAU,qDACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,QAAQ,gCAAgC;AAAA,gBAC1C;AAAA,gBAEA;AAAA,gEAAC,OAAE,WAAU,0CAA0C,kBAAO;AAAA,kBAC9D,+CAAC,UAAK,WAAU,8CACd;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,QAAO;AAAA,wBACP,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,UAAU,8CAAC,uCAAY;AAAA,wBAEtB;AAAA;AAAA,0BAAgB;AAAA;AAAA;AAAA,oBACnB;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,QAAO;AAAA,wBACP,SAAQ;AAAA,wBACR,MAAK;AAAA,wBACL,UAAU,8CAAC,mCAAQ;AAAA,wBAElB;AAAA;AAAA,0BAAkB;AAAA;AAAA;AAAA,oBACrB;AAAA,qBACF;AAAA;AAAA;AAAA,YACF;AAAA,YAEA,8CAAC,sCAAW,WAAU,iCAAgC;AAAA,aACxD;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAQA,IAAM,iBAAa;AAAA,EACjB,CAAC,EAAE,QAAQ,WAAW,QAAQ,OAAO,GAAG,MAAM,GAAG,QAAQ;AACvD,UAAM,gBAAgB,CAACC,YAAsC;AAC3D,cAAQA,SAAQ;AAAA,QACd,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAEA,UAAM,eAAe,CAACA,YAAsC;AAC1D,cAAQA,SAAQ;AAAA,QACd,KAAK;AACH,iBAAO,8CAAC,uCAAY;AAAA,QACtB,KAAK;AACH,iBAAO,8CAAC,mCAAQ;AAAA,QAClB,KAAK;AACH,iBAAO,8CAAC,iCAAM;AAAA,QAChB;AACE,iBAAO,8CAAC,mCAAQ;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,iBAAiB,CAACA,YAAsC;AAC5D,cAAQA,SAAQ;AAAA,QACd,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW,GAAG,+BAA+B,SAAS;AAAA,QACrD,GAAG;AAAA,QAEJ,yDAAC,SAAI,WAAU,kEACb;AAAA,wDAAC,OAAE,WAAU,2DACV,kBACH;AAAA,UACA,+CAAC,UAAK,WAAU,kDACb;AAAA,sBACC;AAAA,cAAC;AAAA;AAAA,gBACC,QAAQ,eAAe,MAAM;AAAA,gBAC7B,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,UAAU,aAAa,MAAM;AAAA,gBAE5B,wBAAc,MAAM;AAAA;AAAA,YACvB;AAAA,YAED,SAAS,8CAAC,OAAE,WAAU,yBAAyB,iBAAM;AAAA,aACxD;AAAA,UACA,8CAAC,sCAAW,WAAU,mEAAkE;AAAA,WAC1F;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAOA,IAAM,mBAAe;AAAA,EACnB,CAAC,EAAE,QAAQ,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AAC9C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,wDAAC,UAAK,WAAU,kBAAkB,gBAAK;AAAA,UAEvC,8CAAC,OAAE,WAAU,2BAA2B,kBAAO;AAAA,UAE/C,8CAAC,sCAAW,MAAM,IAAI,WAAU,kBAAiB;AAAA;AAAA;AAAA,IACnD;AAAA,EAEJ;AACF;AAQA,IAAM,kBAAc;AAAA,EAClB,CAAC,EAAE,QAAQ,WAAW,YAAY,OAAO,UAAU,GAAG,MAAM,GAAG,QAAQ;AACrE,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,aAAa,QAAQ,aAAa;AAAA,cACpC;AAAA,cAEA;AAAA,8DAAC,UAAK,WAAU,kBACd,wDAAC,OAAE,WAAU,4CAA4C,kBAAO,GAClE;AAAA,gBACA,8CAAC,UAAK,WAAU,uBAAuB,UAAS;AAAA;AAAA;AAAA,UAClD;AAAA,UAEA,8CAAC,sCAAW,WAAU,gCAA+B,MAAM,IAAI;AAAA;AAAA;AAAA,IACjE;AAAA,EAEJ;AACF;AAcA,IAAM,gBAAY;AAAA,EAChB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,SAAQ;AAAA,QACR,WAAW,GAAG,uBAAuB,SAAS;AAAA,QAC7C,GAAG;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,MAAM,iBAAiB,YAAY;AAAA,cAC5C,WAAU;AAAA;AAAA,UACZ;AAAA,UAEA,+CAAC,SAAI,WAAU,sCACb;AAAA,2DAAC,SAAI,WAAU,8CACb;AAAA,4DAAC,OAAE,WAAU,mDACV,iBACH;AAAA,cACA,+CAAC,OAAE,WAAU,yBAAwB;AAAA;AAAA,gBAChC;AAAA,gBAAK;AAAA,gBAAI;AAAA,iBACd;AAAA,eACF;AAAA,YAEA,8CAAC,OAAE,WAAU,+CACV,mBACH;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,SAAS,MAAM,kBAAkB,aAAa;AAAA,gBAC9C,WAAU;AAAA,gBAEV;AAAA,gEAAC,0CAAe,eAAY,QAAO,MAAM,IAAI;AAAA,kBAC7C,+CAAC,OAAE,WAAU,WAAW;AAAA;AAAA,oBAAS;AAAA,qBAAU;AAAA;AAAA;AAAA,YAC7C;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAoBA,IAAM,gBAAY;AAAA,EAChB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,UAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,CAAC;AAChD,UAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,CAAC;AAC1C,UAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,CAAC;AACtC,UAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,KAAK;AAChE,UAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AACxD,UAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,CAAC;AAClD,UAAM,eAAW,uBAAyB,IAAI;AAC9C,UAAM,uBAAmB,uBAAuB,IAAI;AACpD,UAAM,mBAAe,uBAAuB,IAAI;AAEhD,UAAM,aAAa,CAAC,SAAiB;AACnC,YAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AACpC,YAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AACpC,aAAO,GAAG,OAAO,IAAI,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IAC1D;AAEA,UAAM,kBAAkB,MAAM;AAC5B,UAAI,WAAW;AACb,iBAAS,SAAS,MAAM;AACxB,qBAAa,KAAK;AAClB,kBAAU;AAAA,MACZ,OAAO;AACL,iBAAS,SAAS,KAAK;AACvB,qBAAa,IAAI;AACjB,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,mBAAmB,MAAM;AAC7B,YAAM,UAAU,SAAS,SAAS,eAAe;AACjD,YAAM,QAAQ,SAAS,SAAS,YAAY;AAE5C,qBAAe,OAAO;AACtB,kBAAY,KAAK;AACjB,0BAAoB,SAAS,KAAK;AAAA,IACpC;AAEA,UAAM,uBAAuB,MAAM;AACjC,kBAAY,SAAS,SAAS,YAAY,CAAC;AAAA,IAC7C;AAEA,UAAM,cAAc,MAAM;AACxB,mBAAa,KAAK;AAClB,qBAAe,CAAC;AAChB,gBAAU;AAAA,IACZ;AAEA,UAAM,sBAAsB,CAAC,MAAqC;AAChE,YAAM,OAAO,EAAE,cAAc,sBAAsB;AACnD,YAAM,SAAS,EAAE,UAAU,KAAK;AAChC,YAAM,QAAQ,KAAK;AACnB,YAAM,aAAa,SAAS;AAC5B,YAAM,UAAU,aAAa;AAE7B,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,cAAc;AAAA,MACjC;AACA,qBAAe,OAAO;AAAA,IACxB;AAEA,UAAM,qBAAqB,CAAC,MAAqC;AAC/D,YAAM,YAAY,WAAW,EAAE,OAAO,KAAK;AAC3C,gBAAU,SAAS;AACnB,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,SAAS;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,sBAAsB,MAAM;AAChC,2BAAqB,CAAC,iBAAiB;AACvC,uBAAiB,KAAK;AAAA,IACxB;AAEA,UAAM,kBAAkB,MAAM;AAC5B,uBAAiB,CAAC,aAAa;AAC/B,2BAAqB,KAAK;AAAA,IAC5B;AAEA,UAAM,oBAAoB,CAAC,UAAkB;AAC3C,sBAAgB,KAAK;AACrB,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,eAAe;AAAA,MAClC;AACA,uBAAiB,KAAK;AAAA,IACxB;AAEA,UAAM,gBAAgB,MAAM;AAC1B,UAAI,WAAW,GAAG;AAChB,eAAO,8CAAC,0CAAe,MAAM,IAAI;AAAA,MACnC;AACA,UAAI,SAAS,KAAK;AAChB,eAAO,8CAAC,sCAAW,MAAM,IAAI;AAAA,MAC/B;AACA,aAAO,8CAAC,uCAAY,MAAM,IAAI;AAAA,IAChC;AAEA,kCAAU,MAAM;AACd,YAAM,qBAAqB,CAAC,UAAiB;AAC3C,YACE,iBAAiB,WACjB,CAAC,iBAAiB,QAAQ,SAAS,MAAM,MAAc,GACvD;AACA,+BAAqB,KAAK;AAAA,QAC5B;AACA,YACE,aAAa,WACb,CAAC,aAAa,QAAQ,SAAS,MAAM,MAAc,GACnD;AACA,2BAAiB,KAAK;AAAA,QACxB;AAAA,MACF;AAEA,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,aAAO,MAAM;AACX,iBAAS,oBAAoB,aAAa,kBAAkB;AAAA,MAC9D;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAGJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA,cAAc;AAAA,cACd,kBAAkB;AAAA,cAClB,SAAS;AAAA,cACT,eAAY;AAAA,cACZ,cAAY;AAAA,cAEX,mBACC,OAAO,IAAI,CAAC,UACV;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAM,MAAM;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,SAAS,MAAM;AAAA,kBACf,OAAO,MAAM;AAAA,kBACb,SAAS,MAAM;AAAA;AAAA,gBALV,MAAM;AAAA,cAMb,CACD,IAED;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,KAAI;AAAA,kBACJ,SAAQ;AAAA,kBACR,OAAM;AAAA;AAAA,cACR;AAAA;AAAA,UAEJ;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,CAAC;AAAA,cACX,WAAU;AAAA,cACV,cAAY,YAAY,WAAW;AAAA,cAElC,sBACC,8CAAC,SAAI,WAAU,4CACb,yDAAC,SAAI,WAAU,gBACb;AAAA,8DAAC,SAAI,WAAU,iCAAgC;AAAA,gBAC/C,8CAAC,SAAI,WAAU,iCAAgC;AAAA,iBACjD,GACF,IAEA,8CAAC,gCAAK,MAAM,IAAI;AAAA;AAAA,UAEpB;AAAA,UAGA,8CAAC,OAAE,WAAU,oDACV,qBAAW,WAAW,GACzB;AAAA,UAGA,8CAAC,SAAI,WAAU,mBAAkB,eAAY,gBAC3C;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS;AAAA,cACT,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,oBAAE,eAAe;AACjB,oBAAE,cAAc,MAAM;AAAA,gBACxB;AAAA,cACF;AAAA,cACA,cAAW;AAAA,cAEX;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,OACE,WAAW,IAAI,GAAI,cAAc,WAAY,GAAG,MAAM;AAAA,kBAC1D;AAAA;AAAA,cACF;AAAA;AAAA,UACF,GACF;AAAA,UAGA,8CAAC,OAAE,WAAU,oDACV,qBAAW,QAAQ,GACtB;AAAA,UAGA,+CAAC,SAAI,WAAU,gBAAe,KAAK,kBACjC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBACV,cAAW;AAAA,gBAEX,wDAAC,SAAI,WAAU,4CACZ,wBAAc,GACjB;AAAA;AAAA,YACF;AAAA,YAEC,qBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,WAAW,CAAC,MAAM;AAChB,sBAAI,EAAE,QAAQ,UAAU;AACtB,yCAAqB,KAAK;AAAA,kBAC5B;AAAA,gBACF;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAI;AAAA,oBACJ,KAAI;AAAA,oBACJ,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,WAAW,CAAC,MAAM;AAChB,0BAAI,EAAE,QAAQ,aAAa,EAAE,QAAQ,cAAc;AACjD,0BAAE,eAAe;AACjB,8BAAM,YAAY,KAAK;AAAA,0BACrB;AAAA,0BACA,KAAK,OAAO,SAAS,OAAO,EAAE,IAAI;AAAA,wBACpC;AACA,kCAAU,SAAS;AACnB,4BAAI,SAAS,QAAS,UAAS,QAAQ,SAAS;AAAA,sBAClD,WAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,aAAa;AACzD,0BAAE,eAAe;AACjB,8BAAM,YAAY,KAAK;AAAA,0BACrB;AAAA,0BACA,KAAK,OAAO,SAAS,OAAO,EAAE,IAAI;AAAA,wBACpC;AACA,kCAAU,SAAS;AACnB,4BAAI,SAAS,QAAS,UAAS,QAAQ,SAAS;AAAA,sBAClD;AAAA,oBACF;AAAA,oBACA,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,YAAY,iDAAiD,SAAS,GAAG,cAAc,SAAS,GAAG;AAAA,oBACrG;AAAA,oBACA,cAAW;AAAA,oBACX,iBAAe,KAAK,MAAM,SAAS,GAAG;AAAA,oBACtC,iBAAe;AAAA,oBACf,iBAAe;AAAA;AAAA,gBACjB;AAAA;AAAA,YACF;AAAA,aAEJ;AAAA,UAGA,+CAAC,SAAI,WAAU,gBAAe,KAAK,cACjC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBACV,cAAW;AAAA,gBAEX,wDAAC,6CAAkB,MAAM,IAAI;AAAA;AAAA,YAC/B;AAAA,YAEC,iBACC,8CAAC,SAAI,WAAU,mHACb,wDAAC,SAAI,WAAU,uBACZ;AAAA,cACC,EAAE,OAAO,GAAG,OAAO,KAAK;AAAA,cACxB,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,cAC5B,EAAE,OAAO,GAAG,OAAO,KAAK;AAAA,YAC1B,EAAE,IAAI,CAAC,EAAE,OAAO,MAAM,MACpB;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,MAAM,kBAAkB,KAAK;AAAA,gBACtC,WAAW;AAAA,kBACT;AAAA,kBACA,iBAAiB,QACb,kDACA;AAAA,gBACN;AAAA,gBAEC;AAAA;AAAA,cAVI;AAAA,YAWP,CACD,GACH,GACF;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAgBA,IAAM,8BAA8B;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AACd;AAEA,IAAM,mBAAe;AAAA,EACnB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,kBAAkB,4BAA4B,eAAe;AACnE,UAAM,gBAAgB,CAAC,cAAc,CAAC;AAEtC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,QAAQ,gBAAgB,YAAY;AAAA,QACpC,iBAAe,gBAAgB,SAAY;AAAA,QAI3C,SAAS,gBAAgB,UAAU;AAAA,QACnC,WAAW,gBAAgB,YAAY;AAAA,QACvC,WAAW;AAAA,UACT;AAAA,UACA,gBACI,8DACA;AAAA,UACJ;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ,yDAAC,SAAI,WAAU,kDACb;AAAA,yDAAC,SAAI,WAAU,sCACZ;AAAA,yBACC,+CAAC,SAAI,WAAU,mCACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,WAAU;AAAA,kBAET;AAAA;AAAA,cACH;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,QAAO;AAAA,kBACP,WAAU;AAAA,kBACV,eAAY;AAAA,kBACb;AAAA;AAAA,cAED;AAAA,eACF,IAEA,8CAAC,gBAAK,MAAK,MAAK,QAAO,QAAO,WAAU,0BACrC,iBACH;AAAA,YAGF,+CAAC,SAAI,WAAU,yCACZ;AAAA,0BACC,+CAAC,SAAI,WAAU,2BACb;AAAA,8DAAC,iCAAM,MAAM,IAAI,WAAU,iBAAgB;AAAA,gBAC3C,8CAAC,gBAAK,MAAK,MAAM,oBAAS;AAAA,iBAC5B;AAAA,cAGF,8CAAC,gBAAK,MAAK,MAAK,WAAU,YACvB,gBACH;AAAA,eACF;AAAA,aACF;AAAA,UAEC,iBACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd;AAAA,WAEJ;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAWA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,cAAc,MAAM;AACxB,UAAI,UAAU;AACZ,iBAAS,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,gBAAgB,CAAC,UAAsC;AAC3D,WAAK,MAAM,QAAQ,WAAW,MAAM,QAAQ,QAAQ,UAAU;AAC5D,cAAM,eAAe;AACrB,iBAAS,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,CAAC;AACvB,UAAM,mBAAmB,CAAC,UAAkB;AAC1C,YAAM,WAAW,UAAU,IAAI,eAAY;AAC3C,aAAO,GAAG,KAAK,IAAI,QAAQ;AAAA,IAC7B;AAEA,UAAM,cAAc,iBAChB,iBAAiB,cAAc,IAC/B,kBAAkB;AACtB,UAAM,cACJ;AACF,UAAM,qBAAqB,eACvB,8FACA;AACJ,UAAM,kBAAkB,WACpB,0CACA;AAEJ,QAAI,cAAc;AAChB,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,WAAW;AAAA,YACT,GAAG,WAAW,IAAI,kBAAkB,IAAI,eAAe,IAAI,SAAS,GAAG,KAAK;AAAA,UAC9E;AAAA,UACA,SAAS;AAAA,UACT,WAAW;AAAA,UACX,gBAAc;AAAA,UACb,GAAI;AAAA,UAEL,yDAAC,SAAI,WAAU,kFACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA,YAEA,+CAAC,SAAI,WAAU,sDACZ;AAAA,0BACC,+CAAC,SAAI,WAAU,kDACb;AAAA,8DAAC,iCAAM,MAAM,IAAI,WAAU,iBAAgB;AAAA,gBAC3C;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBAET;AAAA;AAAA,gBACH;AAAA,iBACF;AAAA,cAGF;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBAET;AAAA;AAAA,cACH;AAAA,eACF;AAAA,aACF;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,GAAG,WAAW,IAAI,SAAS,GAAG,KAAK,CAAC;AAAA,QACjD,GAAI;AAAA,QAEL,yDAAC,SAAI,WAAU,kFACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,WAAU;AAAA,cAET;AAAA;AAAA,UACH;AAAA,UAEA,+CAAC,SAAI,WAAU,sDACZ;AAAA,wBACC,+CAAC,SAAI,WAAU,kDACb;AAAA,4DAAC,iCAAM,MAAM,IAAI,WAAU,iBAAgB;AAAA,cAC3C;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBAET;AAAA;AAAA,cACH;AAAA,eACF;AAAA,YAGF;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA,aACF;AAAA,WACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAmBA,IAAM,yBAAyB;AAAA,EAC7B,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;AAEA,IAAM,4BAAwB,2BAG5B,CAAC,EAAE,MAAM,mBAAmB,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACrD,GAAG;AAAA,MAGJ,yDAAC,SAAI,WAAU,uBACZ;AAAA,aAAK,IAAI,CAAC,SAAS,iBAClB,8CAAC,SAAuB,WAAU,iBAEhC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,iBAAiB,IAAI,kBAAkB;AAAA,YACzC;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,WAAU;AAAA,kBAET,kBAAQ;AAAA;AAAA,cACX;AAAA,cAEA,8CAAC,SAAI,WAAU,8BACZ,kBAAQ,YAAY,IAAI,CAAC,eAAe;AACvC,sBAAM,aAAa,uBAAuB,WAAW,IAAI;AAEzD,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,QAAO;AAAA,oBACP,SAAQ;AAAA,oBACR,WAAU;AAAA,oBACV,QAAO;AAAA,oBACP,WAAW;AAAA,sBACT,GAAG,WAAW,UAAU;AAAA;AAAA,oBAE1B;AAAA,oBACA,SAAS,MAAM,oBAAoB,UAAU;AAAA,oBAE7C,yDAAC,SAAI,WAAU,kDACb;AAAA,qEAAC,SAAI,WAAU,4EACb;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAK;AAAA,4BACL,QAAO;AAAA,4BACP,WAAU;AAAA,4BAET,qBAAW;AAAA;AAAA,wBACd;AAAA,wBAEA,+CAAC,SAAI,WAAU,2BACb;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,SAAQ;AAAA,8BACR,QAAQ,WAAW;AAAA,8BACnB,MAAK;AAAA,8BAEJ,qBAAW;AAAA;AAAA,0BACd;AAAA,0BAEA,8CAAC,gBAAK,MAAK,MAAK,WAAU,0BACvB,qBAAW,MACd;AAAA,2BACF;AAAA,yBACF;AAAA,sBAEA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAM;AAAA,0BACN,WAAU;AAAA,0BACV,eAAY;AAAA;AAAA,sBACd;AAAA,uBACF;AAAA;AAAA,kBAzCK,WAAW;AAAA,gBA0ClB;AAAA,cAEJ,CAAC,GACH;AAAA;AAAA;AAAA,QACF,KApEQ,QAAQ,IAqElB,CACD;AAAA,QAGA,KAAK,SAAS,KACb,8CAAC,SAAI,WAAU,0CAAyC;AAAA,SAE5D;AAAA;AAAA,EACF;AAEJ,CAAC;AAqDD,IAAM,0BAA0B,CAC9B,OACA,aACqB;AAErB,MAAI,MAAM,cAAc,MAAM;AAC5B,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAM,GAAG,MAAM,UAAU,OAAO,QAAQ;AAAA,MACxC,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,MAAM,WAAW,qBAAmB;AACtC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AACA,MACE,MAAM,WAAW,iCACjB,MAAM,WAAW,6BACjB;AACA,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,MAAM,WAAW,qBAAmB;AACtC,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,WAAW;AAAA,EACb;AACF;AAOA,IAAM,qBAAqB,CAAC,UAA+C;AACzE,MACE,MAAM,iBAAiB,6BACvB,MAAM,iBAAiB,2BACvB;AACA,WAAO,EAAE,OAAO,YAAY,QAAQ,UAAU;AAAA,EAChD;AAEA,MACE,MAAM,WAAW,+BACjB,MAAM,iBAAiB,yBACvB;AACA,WAAO,EAAE,OAAO,oBAAoB,QAAQ,OAAO;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,IAAM,uBAAmB;AAAA,EACvB,CAAC,EAAE,MAAM,WAAW,KAAM,cAAc,WAAW,GAAG,MAAM,GAAG,QAAQ;AACrE,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,8CAA8C,SAAS;AAAA,QACpE,GAAG;AAAA,QAEJ,wDAAC,SAAI,WAAU,iBACZ,eAAK,IAAI,CAAC,SAAS,iBAClB;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,WAAU;AAAA,kBAET,kBAAQ;AAAA;AAAA,cACX;AAAA,cAEA,8CAAC,SAAI,WAAU,sCACZ,kBAAQ,OAAO,IAAI,CAAC,UAAU;AAC7B,sBAAM,SAAS,wBAAwB,OAAO,QAAQ;AACtD,sBAAM,cAAc,OAAO,aAAa,CAAC,CAAC;AAC1C,sBAAM,QACJ,MAAM,SAAS,MAAM,iBAAiB;AACxC,sBAAM,cAAc,mBAAmB,KAAK;AAE5C,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,UAAU,CAAC;AAAA,oBACX,SAAS,MAAM,eAAe,eAAe,KAAK;AAAA,oBAClD,cAAY,GAAG,KAAK,WAAM,OAAO,IAAI;AAAA,oBACrC,WAAW;AAAA,sBACT,OAAO;AAAA,sBACP;AAAA,sBACA,cACI,8CACA;AAAA,oBACN;AAAA,oBAEA;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,QAAO;AAAA,0BACP,WAAU;AAAA,0BAET;AAAA;AAAA,sBACH;AAAA,sBAEA,+CAAC,SAAI,WAAU,oCACZ;AAAA,uCACC;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,QAAQ,YAAY;AAAA,4BACpB,MAAK;AAAA,4BAEJ,sBAAY;AAAA;AAAA,wBACf;AAAA,wBAEF;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAK;AAAA,4BACL,WAAU;AAAA,4BAET,iBAAO;AAAA;AAAA,wBACV;AAAA,wBACC,eACC;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAM;AAAA,4BACN,WAAU;AAAA;AAAA,wBACZ;AAAA,yBAEJ;AAAA;AAAA;AAAA,kBA3CK,MAAM;AAAA,gBA4Cb;AAAA,cAEJ,CAAC,GACH;AAAA;AAAA;AAAA,UApEK,GAAG,QAAQ,IAAI,IAAI,YAAY;AAAA,QAqEtC,CACD,GACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;;;ADrzDA,IAAAC,0BAA2B;AAC3B;AAoFQ,IAAAC,uBAAA;AApER,IAAM,sBAAkB;AAAA,EACtB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAS,eAAe;AACxE,UAAM,kBAAc,sBAAM;AAG1B,UAAM,YAAY,QAAQ,qBAAqB,KAAK,KAAK;AACzD,UAAM,WAAW,QACb,oBAAoB,KAAK,KACzB,GAAG,WAAW;AAGlB,UAAM,eAAe,uBAAuB;AAC5C,UAAM,aAAa,eAAe,qBAAqB;AAGvD,kCAAU,MAAM;AACd,UAAI,cAAc;AAChB,4BAAoB,kBAAkB;AAAA,MACxC;AAAA,IACF,GAAG,CAAC,cAAc,kBAAkB,CAAC;AAErC,UAAM,eAAe,MAAM;AACzB,UAAI,SAAU;AAEd,YAAM,cAAc,CAAC;AAErB,UAAI,CAAC,cAAc;AACjB,4BAAoB,WAAW;AAAA,MACjC;AAEA,yBAAmB,WAAW;AAAA,IAChC;AAEA,UAAM,gBAAgB,CAAC,UAA4C;AACjE,UAAI,SAAU;AAEd,UAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,cAAM,eAAe;AACrB,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAW,GAAG,mBAAmB,SAAS;AAAA,QACzC,GAAG;AAAA,QAGJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAW;AAAA,cACX;AAAA,cACA,WAAW;AAAA,gBACT;AAAA,gBACA,YAAY;AAAA,gBACZ;AAAA,cACF;AAAA,cACA,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,cAAY;AAAA,cAEX;AAAA;AAAA,gBAED;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM;AAAA,oBACN,WAAW;AAAA,sBACT;AAAA,sBACA,WAAW,kBAAkB;AAAA,sBAC7B,aAAa,cAAc;AAAA,oBAC7B;AAAA,oBACA,eAAY;AAAA;AAAA,gBACd;AAAA;AAAA;AAAA,UACF;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,mBAAiB;AAAA,cACjB,eAAa,CAAC;AAAA,cACd,WAAW;AAAA,gBACT;AAAA,gBACA,aAAa,gBAAgB;AAAA,cAC/B;AAAA,cACA,eAAY;AAAA,cACZ,cAAY;AAAA,cAEZ,wDAAC,SAAI,WAAW,GAAG,YAAY,gBAAgB,GAAI,UAAS;AAAA;AAAA,UAC9D;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;;;AS/I9B,IAAAC,iBAWO;AACP,IAAAC,kBAAiC;AAuO3B,IAAAC,uBAAA;AA1NN,SAAS,0BACP,MACA,cACA,aACwB;AACxB,aAAO,wBAA4B,CAAC,KAAK,SAAS;AAAA,IAChD;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,IAClC,gBAAgB,CAAC,cAA+B;AAC9C,YAAM,QAAQ,IAAI;AAClB,UAAI,MAAM,SAAS,UAAU;AAC3B,eAAO,MAAM,UAAU;AAAA,MACzB,OAAO;AACL,eAAO,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,SAAS,SAAS;AAAA,MACrE;AAAA,IACF;AAAA,EACF,EAAE;AACJ;AAYA,IAAMC,eAAc,CAClB,UACA,OACA,UACA,iBACc;AACd,SAAO,wBAAS,IAAI,UAAU,CAAC,UAAU;AACvC,QAAI,KAAC,+BAAe,KAAK,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,aAAa;AAOnB,UAAM,cAAe,WAAW,MAC5B;AAGJ,QAAI,gBAAgB,kBAAkB;AACpC,aAAO;AAAA,IACT;AAEA,QAAI,WAKC,CAAC;AAEN,QAAI,gBAAgB,mBAAmB;AAErC,YAAM,YACJ,WAAW,MAAM,SAAS,kBAAkB,SAAS,SAAS;AAGhE,YAAM,aAAa,MAAM,SAAS;AAClC,YAAM,WAAW,WAAW,eAAe,SAAS;AAEpD,eAAS,QAAQ;AACjB,eAAS,WAAW;AACpB,eAAS,mBAAmB,CAAC,eAAwB;AACnD,qBAAa,WAAW,UAAU;AAClC,mBAAW,MAAM,mBAAmB,UAAU;AAAA,MAChD;AAAA,IACF;AAGA,QAAI,WAAW,MAAM,UAAU;AAC7B,YAAM,oBAAoBA;AAAA,QACxB,WAAW,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAGA,UAAI,gBAAgB,mBAAmB;AACrC,iBAAS,WAAW;AAAA,MACtB,WAAW,sBAAsB,WAAW,MAAM,UAAU;AAE1D,mBAAO,6BAAa,YAAY,EAAE,UAAU,kBAAkB,CAAC;AAAA,MACjE;AAAA,IACF;AAGA,QAAI,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AACpC,iBAAO,6BAAa,YAAY,QAAQ;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,qBAAiB;AAAA,EACrB,CACE;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,eAAe,gBAAgB,QAAI;AAAA,MACxC,iBAAiB,SAAS,WAAW,KAAK,CAAC;AAAA,IAC7C;AAEA,UAAM,eAAe,oBAAoB;AACzC,UAAM,eAAe,eAAe,kBAAkB;AAGtD,UAAM,eAAW,uBAAsC,IAAI;AAC3D,QAAI,SAAS,SAAS;AAEpB,eAAS,QAAQ,SAAS,CAAC,SAAS;AAClC,cAAM,YAA0C,CAAC;AACjD,YAAI,KAAK,SAAS,MAAM;AACtB,oBAAU,OAAO;AAAA,QACnB;AACA,YAAI,KAAK,gBAAgB,aAAa;AACpC,oBAAU,cAAc;AAAA,QAC1B;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AAEL,eAAS,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,SAAS;AAGvB,kCAAU,MAAM;AACd,YAAM,SAAS,EAAE,OAAO,aAAa,CAAC;AAAA,IACxC,GAAG,CAAC,cAAc,KAAK,CAAC;AAGxB,kCAAU,MAAM;AACd,UAAI,CAAC,cAAc;AACjB,yBAAiB,CAAC,SAAS;AACzB,cAAI,SAAS,UAAU;AACrB,gBAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,qBAAO,KAAK,CAAC,KAAK;AAAA,YACpB;AACA,mBAAO,OAAO,SAAS,WAAW,OAAO;AAAA,UAC3C;AACA,cAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,mBAAO;AAAA,UACT;AACA,iBAAO,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF,GAAG,CAAC,cAAc,IAAI,CAAC;AAEvB,UAAM,mBAAmB,CAAC,WAAmB,eAAwB;AACnE,YAAM,aAAa,MAAM,SAAS;AAClC,UAAI;AAEJ,UAAI,SAAS,UAAU;AAErB,YAAI,YAAY;AACd,qBAAW;AAAA,QACb,OAAO;AAEL,qBAAW,cAAc,KAAM,WAAW;AAAA,QAC5C;AAAA,MACF,OAAO;AAEL,cAAM,eAAe,MAAM,QAAQ,WAAW,KAAK,IAC/C,WAAW,QACX,CAAC;AAEL,YAAI,YAAY;AACd,qBAAW,CAAC,GAAG,cAAc,SAAS;AAAA,QACxC,OAAO;AACL,qBAAW,aAAa,OAAO,CAAC,MAAM,MAAM,SAAS;AAAA,QACvD;AAAA,MACF;AAEA,UAAI,CAAC,cAAc;AACjB,yBAAiB,QAAQ;AAAA,MAC3B;AACA,YAAM,SAAS,EAAE,OAAO,SAAS,CAAC;AAClC,sBAAgB,QAAQ;AAAA,IAC1B;AAGA,UAAM,WAAW,EAAE,SAAS,EAAE;AAC9B,UAAM,mBAAmBA;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WACE,8CAAC,SAAI,KAAU,WAAuB,GAAG,OACtC,4BACH;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;;;AC1P7B,IAAAC,0BAAiD;AAEjD;AACA;AAuFI,IAAAC,uBAAA;AA7EG,IAAM,gBAST;AAAA,EACF,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AACF;AA6BO,IAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,QAAM,SAAS,cAAc,OAAO;AACpC,QAAM,gBAAgB,OAAO;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,OAAO;AAAA,YACT;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,WAAW,OAAO;AAAA,gBAClB,QAAO;AAAA;AAAA,YACT;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,4CAA4C,OAAO,IAAI;AAAA,YAEpE;AAAA;AAAA,QACH;AAAA,QACA,8CAAC,gBAAK,WAAW,GAAG,qBAAqB,OAAO,IAAI,GAAI,iBAAM;AAAA;AAAA;AAAA,EAChE;AAEJ;;;ACjHO,IAAM,kBAAkB;AAAA,EAC7B,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA;AAAA,EAEX,UAAU;AACZ;;;ACoCO,IAAM,+BAA+B,CAAC,WAA2B;AACtE,QAAM,UAA8D;AAAA,IAClE,CAAC,gBAAgB,OAAO,GAAG;AAAA,MACzB,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA,CAAC,gBAAgB,SAAS,GAAG;AAAA,MAC3B,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA,CAAC,gBAAgB,SAAS,GAAG;AAAA,MAC3B,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,IACA,CAAC,gBAAgB,QAAQ,GAAG;AAAA,MAC1B,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAEA,SAAO,QAAQ,MAAM,KAAK;AAC5B;AA0CA,IAAM,sBAAsB,CAC1B,UACA,YACkB;AAClB,MAAI,SAAS,SAAS,EAAG;AAEzB,QAAM,CAAC,UAAU,IAAI;AACrB,SAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU,GAAG;AAGnD;AAMA,IAAM,0BAA0B,CAC9B,UACA,YACkB;AAClB,QAAM,WAAW,QAAQ,MAAM,CAAC,OAAO,SAAS,IAAI,GAAG,EAAE,MAAM,GAAG,SAAS;AAE3E,SAAO;AAGT;AAOA,IAAM,0BAA0B;AAEhC,IAAM,aAEF;AAAA,EACF,gCAA0B,GAAG;AAAA,EAC7B,0CAA+B,GAAG;AAAA,EAClC,0CAA+B,GAAG;AACpC;;;AC/JA,IAAAC,0BAAqC;AAGrC,IAAAC,iBAA4D;AAC5D;AAiH4D,IAAAC,uBAAA;AAtC5D,IAAM,mBAAmB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ;AAAA,EACA;AACF,MAA6B;AAE3B,QAAM,eAAW,sBAAM;AACvB,QAAM,YAAY,QAAQ,gBAAgB,QAAQ;AAClD,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,KAAK;AAEpD,QAAM,aAAa,SAAS;AAC5B,QAAM,kBAAkB,CACtB,QACAC,gBACG;AACH,UAAM,aAAaA,cAAa,KAAK;AAErC,YAAQ,QAAQ;AAAA,MACd;AACE,eAAO;AAAA,MACT;AACE,eAAO;AAAA,MACT;AACE,eAAO,mCAAmC,UAAU;AAAA,IACxD;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,WAAmC;AACzD,YAAQ,QAAQ;AAAA,MACd;AACE,eACE,8CAAC,iBAAM,SAAQ,SAAQ,QAAO,WAAU,UAAU,8CAAC,uCAAY,GAAI,8BAEnE;AAAA,MAEJ;AACE,eACE,8CAAC,iBAAM,SAAQ,SAAQ,QAAO,SAAQ,UAAU,8CAAC,mCAAQ,GAAI,gCAE7D;AAAA,MAEJ;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAGA,QAAM,4BAA4B,CAAC,gBAA6B;AAC9D,UAAM,gBAAgB,YAAY;AAClC,UAAM,iBAAiB,kBAAkB,YAAY;AACrD,UAAM,kBAAkB,YAAY;AAGpC,QAAI,gBAAuC;AAC3C,QAAI,kBAAkB,CAAC,iBAAiB;AAEtC;AAAA,IACF,WAAW,iBAAiB;AAE1B;AAAA,IACF;AAEA,UAAM,eAAe,gBAAgB,eAAe,IAAI;AACxD,UAAM,cAAc,eAAe,aAAa;AAGhD,UAAM,cAAc,MAAM;AACxB,YAAM,eAAe,6GACnB,iBACI,qCACA,iCACN;AAEA,YAAM,aACJ;AAEF,aACE,8CAAC,SAAI,WAAW,cACb,4BAAkB,8CAAC,SAAI,WAAW,YAAY,GACjD;AAAA,IAEJ;AAEA,QAAI,WAAW,YAAY;AACzB,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,YAAY,WAAW,eAAe;AAAA,UACxC;AAAA,UAEA,yDAAC,SAAI,WAAU,0CACb;AAAA,2DAAC,SAAI,WAAU,iCACb;AAAA,4DAAC,SAAI,WAAU,QAAQ,sBAAY,GAAE;AAAA,cACrC,+CAAC,SAAI,WAAU,UACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,YAAY;AAAA,oBACrB,WAAW;AAAA,sBACT;AAAA,sBACA,kBAAkB,YAAY,SAAS,cACnC,kBACA;AAAA,oBACN;AAAA;AAAA,gBACF;AAAA,gBACC,YAAY,eACX,8CAAC,OAAE,WAAU,8BACV,sBAAY,aACf;AAAA,iBAEJ;AAAA,eACF;AAAA,YACC,eAAe,8CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA,aAC9D;AAAA;AAAA,QA5BK;AAAA,MA6BP;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,YAAY,WAAW,eAAe;AAAA,QACxC;AAAA,QAEA;AAAA,yDAAC,SAAI,WAAU,kCACZ;AAAA,wBAAY;AAAA,YACb;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,YAAY;AAAA,gBACrB,WAAW;AAAA,kBACT;AAAA,kBACA,kBAAkB,YAAY,SAAS,cACnC,kBACA;AAAA,gBACN;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UACC,eAAe,8CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA;AAAA;AAAA,MAnBvD;AAAA,IAoBP;AAAA,EAEJ;AAGA,MAAI,YAAY;AACd,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,iBAAiB,iBAAiB,GAAG,UAAU,SAAS;AAAA,QAErE,uBAAa;AAAA,UAAI,CAAC,gBACjB,0BAA0B,WAAW;AAAA,QACvC;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,eAAe,CAACC,WAAU;AACxB,uBAAeA,MAAK;AACpB,wBAAgBA,MAAK;AAAA,MACvB;AAAA,MACA;AAAA,MACA,WAAW,GAAG,iBAAiB,iBAAiB,GAAG,SAAS;AAAA,MAE3D,uBAAa,IAAI,CAAC,aAAa,UAAU;AACxC,cAAM,gBAAgB,YAAY,SAAS,OAAO,KAAK;AACvD,cAAM,eAAe,gBAAgB,YAAY,QAAQ,KAAK;AAC9D,cAAM,cAAc,eAAe,YAAY,MAAM;AAErD,YAAI,WAAW,YAAY;AACzB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,YAAY,WACR,kCACA;AAAA,cACN;AAAA,cAEA,yDAAC,SAAI,WAAU,0CACb;AAAA,+DAAC,SAAI,WAAU,iCACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,YAAY;AAAA,sBACnB,IAAI;AAAA,sBACJ,UAAU,YAAY;AAAA,sBACtB,WAAU;AAAA;AAAA,kBACZ;AAAA,kBACA,+CAAC,SAAI,WAAU,UACb;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,WAAW;AAAA,0BACT;AAAA,0BACA,gBAAgB,YAAY,QACxB,kBACA;AAAA,0BACJ,YAAY,WACR,uBACA;AAAA,wBACN;AAAA,wBAEA,wDAAC,4BAAiB,SAAS,YAAY,OAAO,QAAM,MAAC;AAAA;AAAA,oBACvD;AAAA,oBACC,YAAY,eACX,8CAAC,OAAE,WAAU,8BACV,sBAAY,aACf;AAAA,qBAEJ;AAAA,mBACF;AAAA,gBACC,eACC,8CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA,iBAEhD;AAAA;AAAA,YA1CK;AAAA,UA2CP;AAAA,QAEJ;AAEA,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA,YAAY,WAAW,kCAAkC;AAAA,YAC3D;AAAA,YAEA;AAAA,6DAAC,SAAI,WAAU,kCACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,YAAY;AAAA,oBACnB,IAAI;AAAA,oBACJ,UAAU,YAAY;AAAA;AAAA,gBACxB;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS;AAAA,oBACT,WAAW;AAAA,sBACT;AAAA,sBACA,gBAAgB,YAAY,QACxB,kBACA;AAAA,sBACJ,YAAY,WAAW,uBAAuB;AAAA,oBAChD;AAAA,oBAEA,wDAAC,4BAAiB,SAAS,YAAY,OAAO,QAAM,MAAC;AAAA;AAAA,gBACvD;AAAA,iBACF;AAAA,cACC,eAAe,8CAAC,SAAI,WAAU,iBAAiB,uBAAY;AAAA;AAAA;AAAA,UA1BvD;AAAA,QA2BP;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAQA,IAAM,wBAAoB;AAAA,EACxB,CAAC,EAAE,WAAW,OAAO,UAAU,SAAS,GAAG,MAAM,GAAG,QAAQ;AAC1D,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,yDAAC,UAAK,WAAU,iBACd;AAAA,0DAAC,OAAE,WAAU,mCAAmC,iBAAM;AAAA,YACtD,8CAAC,OAAE,WAAU,0BAA0B,oBAAS;AAAA,aAClD;AAAA,UAEA,8CAAC,4BAAiB,SAAkB,WAAU,yBAAwB;AAAA;AAAA;AAAA,IACxE;AAAA,EAEJ;AACF;;;AvBgfA;;;AwBh3BA,IAAAC,iBAAqC;AAerC,IAAM,WAAW;AAGjB,IAAM,UAAU,CAAC,UAAkB,mBAAmB,KAAK;AAyCpD,IAAM,uBACX,CAAC,cAA6B,MAA4B;AACxD,QAAM,oBAAgB;AAAA,IACpB,OACE,UAAsC,CAAC,MACF;AACrC,YAAM,EAAE,OAAO,GAAG,QAAQ,IAAI,QAAQ,SAAS,IAAI;AACnD,YAAM,WAAW,MAAM,UAAU;AAAA,QAC/B,GAAG,QAAQ;AAAA,QACX,EAAE,QAAQ,EAAE,MAAM,OAAO,QAAQ,SAAS,EAAE;AAAA,MAC9C;AACA,aAAO,SAAS,KAAK,KAAK;AAAA,IAC5B;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,8BAA0B;AAAA,IAC9B,OACE,mBACA,UAAkC,CAAC,MACF;AACjC,YAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI;AACjC,YAAM,WAAW,MAAM,UAAU;AAAA,QAC/B,GAAG,QAAQ,aAAa,QAAQ,iBAAiB,CAAC;AAAA,QAClD,EAAE,QAAQ,EAAE,MAAM,MAAM,EAAE;AAAA,MAC5B;AACA,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,4BAAwB;AAAA,IAC5B,OACE,mBACA,iBACkC;AAClC,YAAM,WAAW,MAAM,UAAU;AAAA,QAC/B,GAAG,QAAQ,aAAa,QAAQ,iBAAiB,CAAC,IAAI,QAAQ,YAAY,CAAC;AAAA,MAC7E;AACA,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gBAAY;AAAA,IAChB,OACE,mBACA,iBAC6B;AAC7B,YAAM,WAAW,MAAM,UAAU;AAAA,QAC/B,GAAG,QAAQ,aAAa,QAAQ,iBAAiB,CAAC,IAAI,QAAQ,YAAY,CAAC;AAAA,MAC7E;AACA,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,eAAW;AAAA,IACf,OACE,mBACA,cACA,SAC6B;AAC7B,YAAM,WAAW,MAAM,UAAU;AAAA,QAC/B,GAAG,QAAQ,aAAa,QAAQ,iBAAiB,CAAC,IAAI,QAAQ,YAAY,CAAC;AAAA,QAC3E,EAAE,KAAK;AAAA,MACT;AACA,aAAO,SAAS,KAAK;AAAA,IACvB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,aAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AzB4ZI,IAAAC,uBAAA;AA9gBC,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,uBAAuB;AACzB,MAOM;AACJ,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAiB,EAAE;AAG7D,QAAM,4BAAwB,uBAAO,kBAAkB;AACvD,QAAM,4BAAwB,uBAAyB,UAAU;AAEjE,QAAM,8BAA0B,uBAAe,EAAE;AAGjD,gCAAU,MAAM;AACd,0BAAsB,UAAU;AAAA,EAClC,GAAG,CAAC,kBAAkB,CAAC;AAKvB,QAAM,kCAA8B,wBAAQ,MAAM;AAEhD,QAAI,sBAAsB;AACxB,aAAO;AAAA,IACT;AAEA,WAAO,WAAW,IAAI,CAAC,aAAa;AAElC,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAGA,UACE,cAAc,WAAW,MACxB,CAAC,SAAS,eAAe,SAAS,YAAY,WAAW,IAC1D;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,aAAa,CAAC,cAAc,CAAC,EAAE,EAAE;AAAA,QACnC;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,YAAY,oBAAoB,CAAC;AAIrC,gCAAU,MAAM;AAEd,UAAM,oBAAoB,eAAe,sBAAsB;AAC/D,0BAAsB,UAAU;AAGhC,UAAM,0BAA0B,4BAA4B;AAAA,MAC1D,CAAC,KAAK,UAAU;AACd,cAAM,cAAc,WAAW,KAAK;AACpC,eAAO,CAAC,oBAAoB,IAAI,aAAa,YAAY,WAAW;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,CAAC,yBAAyB;AAE5B,UAAI,mBAAmB;AACrB,gCAAwB,UAAU;AAAA,MACpC;AACA;AAAA,IACF;AAGA,UAAM,yBAAyB,KAAK;AAAA,MAClC,4BAA4B,IAAI,CAAC,MAAM,EAAE,WAAW;AAAA,IACtD;AAGA,QAAI,wBAAwB,YAAY,wBAAwB;AAC9D,8BAAwB,UAAU;AAClC,4BAAsB,QAAQ,2BAA2B;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,6BAA6B,UAAU,CAAC;AAE5C,QAAM,uBAAuB,CAAC,aAAqB,WAAmB;AACpE,UAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AAC7D,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO,SAAS,aAAa,SAAS,MAAM,KAAK;AAAA,EACnD;AAEA,QAAM,iCAAiC,CAAC,gBAAwB;AAC9D,UAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AAC7D,QAAI,CAAC,SAAU,QAAO;AAGtB,UAAM,iBAAiB,kBAAkB,WAAW;AACpD,UAAM,gBAAgB,eAAe,QAAQ,CAAC,UAAU,MAAM,SAAS,CAAC,CAAC;AACzE,UAAM,kBAAkB,cAAc,IAAI,CAAC,SAAS,KAAK,EAAE;AAG3D,WAAO,gBAAgB;AAAA,MAAK,CAAC,WAC3B,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,8BAA8B,CAAC,gBAAwB;AAC3D,UAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AAC7D,QAAI,CAAC,SAAU,QAAO;AAGtB,UAAM,iBAAiB,kBAAkB,WAAW;AACpD,UAAM,gBAAgB,eAAe,QAAQ,CAAC,UAAU,MAAM,SAAS,CAAC,CAAC;AAGzE,QAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,UAAM,kBAAkB,cAAc,IAAI,CAAC,SAAS,KAAK,EAAE;AAG3D,WAAO,gBAAgB;AAAA,MAAM,CAAC,WAC5B,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC;AAAA,EACF;AAGA,QAAM,qBAAqB,CACzB,KACA,iBACe;AACf,UAAM,eAA2B,CAAC;AAClC,eAAW,iBAAiB,KAAK;AAC/B,iBAAW,QAAQ,cAAc;AAC/B,qBAAa,KAAK,CAAC,GAAG,eAAe,IAAI,CAAC;AAAA,MAC5C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,CAAC,QAAgC;AACjD,WAAO,IAAI,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAe;AAAA,EAC1D;AAGA,QAAM,2BAA2B,CAC/B,YACG;AACH,WAAO,QAAQ,IAAI,CAAC,MAAM;AACxB,YAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;AACxD,UAAI,CAAC,WAAW,aAAa,QAAQ;AACnC,eAAO,CAAC;AAAA,MACV;AACA,aAAO,UAAU;AAAA,IACnB,CAAC;AAAA,EACH;AAGA,QAAM,4BAA4B,CAChC,QACA,YACG;AACH,UAAM,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG;AACvD,WAAO,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,GAAG,QAAQ;AAAA,EAC5D;AAGA,QAAM,+BAA+B,CACnC,SACA,aACG;AACH,UAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,QAAQ,CAAC,EAAE,GAAG;AAChE,UAAM,WACJ,UAAU,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,CAAC,GAAG,QAAQ,SAAS,CAAC;AAExE,UAAM,aAAuB,CAAC,QAAQ;AAEtC,aAAS,MAAM,GAAG,MAAM,QAAQ,QAAQ,OAAO;AAC7C,YAAM,IAAI,QAAQ,GAAG;AACrB,YAAM,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG;AAClD,YAAM,MACJ,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,GAAG,CAAC,GAAG,QAAQ,SAAS,GAAG;AACvE,iBAAW,KAAK,IAAI,GAAG,GAAG;AAAA,IAC5B;AACA,WAAO,WAAW,KAAK,GAAG;AAAA,EAC5B;AAGA,QAAM,qBAAqB,CACzB,UACA,SACA,UACA,eACG;AACH,UAAM,iBAAiB,UAAU,SAAS,CAAC,GAAG;AAAA,MAAO,CAAC,SACpD,QAAQ,MAAM,CAAC,GAAG,QAAQ,KAAK,EAAE,aAAa,MAAM,SAAS,GAAG,CAAC;AAAA,IACnE;AAEA,QAAI,cAAc,WAAW,EAAG;AAEhC,QAAI,aAAiC;AAErC,QAAI,QAAQ,WAAW,GAAG;AACxB,mBAAa,0BAA0B,QAAQ,CAAC,GAAG,SAAS,CAAC,CAAC;AAAA,IAChE,WAAW,QAAQ,SAAS,GAAG;AAC7B,mBAAa,6BAA6B,SAAS,QAAQ;AAAA,IAC7D;AAEA,UAAM,MAAM,cAAc;AAC1B,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,iBAAW,GAAG,IAAI,aAAa,EAAE,YAAY,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;AAAA,IACzE;AACA,eAAW,GAAG,EAAE,MAAM,KAAK,GAAG,aAAa;AAAA,EAC7C;AAGA,QAAM,0BAA0B,CAAC,gBAAwB;AACvD,UAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AAE7D,QAAI,CAAC,UAAU,aAAa,SAAS,UAAU,WAAW,GAAG;AAC3D,aAAO,CAAC,EAAE,OAAO,UAAU,SAAS,CAAC,EAAE,CAAC;AAAA,IAC1C;AAGA,UAAM,YAAY,SAAS,UAAU,MAAM,CAAC,WAAW;AACrD,YAAM,SAAS,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,MAAM;AACtD,aAAO,QAAQ,eAAe,OAAO,YAAY,SAAS;AAAA,IAC5D,CAAC;AAGD,QAAI,CAAC,WAAW;AACd,aAAO,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,IACvB;AAEA,UAAM,UACH,SAAS,cAIF,CAAC;AAEX,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO,CAAC,EAAE,OAAO,UAAU,SAAS,CAAC,EAAE,CAAC;AAAA,IAC1C;AAEA,UAAM,iBAAiB,yBAAyB,OAAO;AAEvD,QAAI,eAAe,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,GAAG;AAClD,aAAO,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,IACvB;AAEA,UAAM,eAAe,UAAU,cAAc;AAC7C,UAAM,aACJ,CAAC;AAEH,eAAW,YAAY,cAAc;AACnC,yBAAmB,UAAU,SAAS,UAAU,UAAU;AAAA,IAC5D;AAEA,UAAM,eAAe,OAAO,OAAO,UAAU,EAAE;AAAA,MAC7C,CAAC,MAAM,EAAE,MAAM;AAAA,IACjB;AAEA,WAAO,aAAa,SAAS,eAAe,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,EAC5D;AAEA,QAAM,wBAAoB,wBAAQ,MAAM;AACtC,UAAMC,qBAGF,CAAC;AAEL,eAAW,YAAY,YAAY;AACjC,YAAM,iBAAiB,wBAAwB,SAAS,GAAG;AAC3D,MAAAA,mBAAkB,SAAS,GAAG,IAAI;AAAA,IACpC;AAEA,WAAOA;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,oBAAoB,CAAC,gBAAwB;AACjD,WAAO,kBAAkB,WAAW,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,EACzD;AAGA,QAAMC,gBAAe,CAAC,aAAqC;AACzD,UAAM,iBAAiB,kBAAkB,SAAS,GAAG;AACrD,WAAO,aAAmB,UAAU,cAAc;AAAA,EACpD;AAGA,QAAMC,qBAAoB,CAAC,aAAsC;AAC/D,WAAO,kBAAwB,UAAU,UAAU;AAAA,EACrD;AAGA,QAAMC,8BAA6B,CAAC,UAAyC;AAC3E,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACAD;AAAA,IACF;AACA,QAAI,aAAa,MAAM;AACrB,uBAAiB,QAAQ;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,yBAAyB,CAAC,gBAAkC;AAChE,WAAO,WACJ,OAAO,CAAC,QAAQ,IAAI,WAAW,SAAS,WAAW,CAAC,EACpD,IAAI,CAAC,QAAQ,IAAI,GAAG;AAAA,EACzB;AAGA,QAAM,oBAAoB,CACxB,aACA,gBACA,qBACa;AACb,WACE,YAAY,OACR;AAAA,MACA,CAAC,SAAS,KAAK,eAAe,aAAa,MAAM;AAAA,IACnD,EACC,IAAI,CAAC,SAAS,KAAK,EAAE,KAAK,CAAC;AAAA,EAElC;AAGA,QAAM,2BAA2B,CAC/B,gBACA,aACA,kBACA,oBACG;AACH,UAAM,cAAc,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,cAAc;AACnE,QAAI,CAAC,aAAa,WAAY;AAE9B,UAAM,iBAAiB,YAAY,WAAW;AAAA,MAC5C,CAAC,MAAM,EAAE,QAAQ;AAAA,IACnB;AACA,QAAI,CAAC,eAAgB;AAErB,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,cAAc,SAAS,GAAG;AAC5B,sBAAgB,cAAc,IAAI;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,qBAAqB,CACzB,aACA,qBACG;AACH,UAAM,iBAAiB,WACpB,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW,GAChC,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,gBAAgB;AACtD,QAAI,CAAC,eAAgB,QAAO,CAAC;AAE7B,UAAM,kBAA4C,CAAC;AACnD,UAAM,sBAAsB,uBAAuB,WAAW;AAE9D,eAAW,kBAAkB,qBAAqB;AAChD;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAGA,QAAM,4BAA4B,CAChC,mBACA,kBACA,aACA,YACqB;AACrB,UAAM,iBACJ,YAAY,aAAa,OAAO,CAAC,OAAO,CAAC,QAAQ,SAAS,EAAE,CAAC,KAAK,CAAC;AAErE,sBAAkB,gBAAgB,IAAI;AAAA,MACpC,GAAG;AAAA,MACH,aAAa;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAGA,QAAM,wBAAwB,CAC5B,gBACA,SACA,sBACqB;AACrB,QAAI,SAAS;AACb,eAAW,UAAU,SAAS;AAC5B,eAAS,wBAAwB,gBAAgB,QAAQ,MAAM;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,0BAA0B,CAC9B,aACA,kBACA,sBACqB;AACrB,UAAM,kBAAkB,mBAAmB,aAAa,gBAAgB;AACxE,QAAI,oBAAoB,CAAC,GAAG,iBAAiB;AAE7C,eAAW,CAAC,gBAAgB,OAAO,KAAK,OAAO,QAAQ,eAAe,GAAG;AACvE,YAAM,mBAAmB,kBAAkB;AAAA,QACzC,CAAC,MAAM,EAAE,QAAQ;AAAA,MACnB;AAEA,UAAI,qBAAqB,IAAI;AAC3B,cAAM,cAAc,kBAAkB,gBAAgB;AACtD,4BAAoB;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,4BAAoB;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,CAAC,gBAAwB;AACnD,UAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AAC7D,QAAI,CAAC,SAAU;AAGf,UAAM,iBAAiB,kBAAkB,WAAW;AACpD,UAAM,gBAAgB,eAAe,QAAQ,CAAC,UAAU,MAAM,SAAS,CAAC,CAAC;AACzE,UAAM,kBAAkB,cAAc,IAAI,CAAC,SAAS,KAAK,EAAE;AAG3D,UAAM,wBAAwB,gBAAgB;AAAA,MAAO,CAAC,WACpD,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC,EAAE;AAKF,UAAM,sBACJ,0BAA0B,gBAAgB;AAE5C,UAAM,eAAe,sBACjB,SAAS,aAAa,OAAO,CAAC,OAAO,CAAC,gBAAgB,SAAS,EAAE,CAAC,KAClE,CAAC,IACD;AAAA,MACE,GAAI,SAAS,eAAe,CAAC;AAAA,MAC7B,GAAG,gBAAgB;AAAA,QACjB,CAAC,OAAO,CAAC,SAAS,aAAa,SAAS,EAAE;AAAA,MAC5C;AAAA,IACF;AAEJ,QAAI,oBAAoB,WAAW;AAAA,MAAI,CAAC,MACtC,EAAE,QAAQ,cAAc,EAAE,GAAG,GAAG,aAAa,aAAa,IAAI;AAAA,IAChE;AAGA,QAAI,qBAAqB;AACvB,iBAAW,UAAU,iBAAiB;AACpC,4BAAoB;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,uBAAmB,iBAAiB;AAAA,EACtC;AAEA,QAAM,aAAa,CAAC,aAAqB,WAAmB;AAC1D,UAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AAC7D,QAAI,CAAC,SAAU;AACf,UAAM,sBAAsB,SAAS,aAAa,SAAS,MAAM;AACjE,UAAM,eAAe,sBACjB,SAAS,aAAa,OAAO,CAAC,OAAO,OAAO,MAAM,IAClD,CAAC,GAAI,SAAS,eAAe,CAAC,GAAI,MAAM;AAE5C,QAAI,oBAAoB,WAAW;AAAA,MAAI,CAAC,MACtC,EAAE,QAAQ,cAAc,EAAE,GAAG,GAAG,aAAa,aAAa,IAAI;AAAA,IAChE;AAGA,QAAI,qBAAqB;AACvB,0BAAoB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,uBAAmB,iBAAiB;AAAA,EACtC;AAGA,QAAM,qBAAqB,CAAC,MAAY,gBAAwB;AAE9D,UAAM,WAAW,GAAG,WAAW,IAAI,KAAK,EAAE;AAE1C,WACE,+CAAC,SAAkB,WAAU,gCAC3B;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,SAAS,qBAAqB,aAAa,KAAK,EAAE;AAAA,UAClD,UAAU,MAAM,WAAW,aAAa,KAAK,EAAE;AAAA;AAAA,MACjD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UAET,eAAK;AAAA;AAAA,MACR;AAAA,SAXQ,KAAK,EAYf;AAAA,EAEJ;AAGA,QAAM,uBAAuB,CAC3B,gBACA,KACA,gBAEA;AAAA,IAAC;AAAA;AAAA,MAEC,WAAU;AAAA,MAET;AAAA,wBAAgB,kBAAkB,eAAe,cAChD,8CAAC,gBAAK,MAAK,MAAK,WAAU,QAAO,QAAO,YACrC,yBAAe,YAClB;AAAA,QAED,eAAe,OAAO;AAAA,UAAI,CAAC,SAC1B,mBAAmB,MAAM,WAAW;AAAA,QACtC;AAAA;AAAA;AAAA,IAVK,eAAe,cAAc,SAAS,GAAG;AAAA,EAWhD;AAIF,QAAM,yBAAyB,CAC7B,UACA,cACG;AACH,UAAM,cAAc,4BAA4B,SAAS,GAAG;AAC5D,UAAM,eAAe,+BAA+B,SAAS,GAAG;AAEhE,WACE,+CAAC,SAAI,WAAU,gDACb;AAAA,qDAAC,SAAI,WAAU,2BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,CAAC;AAAA,YACX,eAAe,gBAAgB,CAAC;AAAA,YAChC,UAAU,MAAM,oBAAoB,SAAS,GAAG;AAAA;AAAA,QAClD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAW,GAAG,iBAAiB,CAAC,aAAa,YAAY;AAAA,YAExD,mBAAS;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,OACE,kBAAkB,SAAS,OAAO,cAClC,8CAAC,iBAAM,SAAQ,SAAQ,QAAO,QAC3B,UAAAD,cAAa,QAAQ,GACxB;AAAA,OAEJ;AAAA,EAEJ;AAGA,QAAM,0BAA0B,CAAC,aAA6B;AAC5D,UAAM,iBAAiB,kBAAkB,SAAS,GAAG;AACrD,UAAM,WAAW,eAAe,QAAQ,CAAC,UAAU,MAAM,SAAS,CAAC,CAAC;AAEpE,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,SAAS,CAAC;AAE7B,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAEV;AAAA,wDAAC,gBAAK,MAAK,MAAK,QAAO,QAAO,WAAU,iBACrC,mBAAS,OACZ;AAAA,UACA,8CAAC,gBAAK,MAAK,MAAK,WAAU,iBACvB,qBAAW,MACd;AAAA;AAAA;AAAA,MARK,SAAS;AAAA,IAShB;AAAA,EAEJ;AAGA,QAAM,0BAA0B,CAAC,aAA6B;AAE5D,UAAM,YAAYC,mBAAkB,QAAQ;AAC5C,UAAM,iBAAiB,SAAS,OAAO,WAAW;AAElD,QAAI,kBAAkB,CAAC,qBAAqB,CAAC,gBAAgB;AAC3D,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,kBAAkB,SAAS,GAAG;AACrD,UAAM,WAAW,eAAe,QAAQ,CAAC,UAAU,MAAM,SAAS,CAAC,CAAC;AACpE,UAAM,0BAA0B,SAAS,WAAW;AAGpD,QAAI,qBAAqB,2BAA2B,WAAW;AAC7D,aACE,+CAAC,SACE;AAAA,gCAAwB,QAAQ;AAAA,QAChC,eAAe,8CAAC,mBAAQ;AAAA,WAFjB,SAAS,GAGnB;AAAA,IAEJ;AAEA,UAAM,aAAa,eAAe;AAAA,MAChC,CAAC,UAAU,CAAC,MAAM,SAAS,MAAM,MAAM,WAAW;AAAA,IACpD;AAEA,WACE,+CAAC,SACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,UAAU,CAAC;AAAA,UACX,WAAW;AAAA,YACT;AAAA,YACA,kBAAkB,SAAS,OAAO;AAAA,UACpC;AAAA,UACA,SAAS,uBAAuB,UAAU,SAAS;AAAA,UAEnD,wDAAC,SAAI,WAAU,4BACZ,wBAAc,YACb,8CAAC,SAAI,WAAU,aACb,wDAAC,gBAAK,MAAK,MAAK,WAAU,6BAA4B,uBAEtD,GACF,IAEA,eAAe;AAAA,YAAI,CAAC,gBAAgB,QAClC,qBAAqB,gBAAgB,KAAK,SAAS,GAAG;AAAA,UACxD,GAEJ;AAAA;AAAA,MACF;AAAA,MACC,kBAAkB,SAAS,OAAO,eAAe,8CAAC,mBAAQ;AAAA,SAxBnD,SAAS,GAyBnB;AAAA,EAEJ;AAGA,gCAAU,MAAM;AACd,QAAI,CAAC,cAAe;AAEpB,UAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,QAAQ,aAAa;AAC/D,QAAI,CAAC,SAAU;AAGf,UAAM,YAAYA,mBAAkB,QAAQ;AAG5C,QAAI,CAAC,WAAW;AAEd,iBAAW,MAAM;AACf,yBAAiB,EAAE;AAAA,MACrB,GAAG,CAAC;AAAA,IACN;AAAA,EACF,GAAG,CAAC,YAAY,aAAa,CAAC;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAW;AAAA,MACX,OAAO;AAAA,MACP,eAAeC;AAAA,MAEd,qBAAW,IAAI,uBAAuB;AAAA;AAAA,EACzC;AAEJ;;;ADruBA;AA8HQ,IAAAC,uBAAA;AAxCD,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa;AACf,MAAwB;AACtB,QAAM,uBAAuB,CAC3B,aACA,sBACG;AACH,UAAM,aAAa,CAAC,GAAG,aAAa;AACpC,eAAW,WAAW,IAAI;AAAA,MACxB,GAAG,WAAW,WAAW;AAAA,MACzB,YAAY;AAAA,IACd;AACA,oBAAgB,UAAU;AAAA,EAC5B;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ;AACR,YAAQ;AAAA,EACV;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ;AAAA,EACV;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QACE,+CAAC,SAAI,WAAU,iCACb;AAAA,sDAAC,kBAAO,SAAQ,WAAU,SAAS,aAChC,sBACH;AAAA,QACA,8CAAC,kBAAO,SAAS,aAAc,sBAAW;AAAA,SAC5C;AAAA,MAGF,wDAAC,SAAI,WAAU,uBACZ,wBAAc,IAAI,CAAC,QAAQ,UAC1B,+CAAC,SAAqB,WAAU,uBAE9B;AAAA,uDAAC,SAAI,WAAU,uEACZ;AAAA,iBAAO,qCACN;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAO;AAAA,cACP,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAM;AAAA,cACN,WAAU;AAAA,cAEV;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAE;AAAA,oBACF,QAAO;AAAA,oBACP,aAAY;AAAA,oBACZ,eAAc;AAAA,oBACd,gBAAe;AAAA;AAAA,gBACjB;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAE;AAAA,oBACF,QAAO;AAAA,oBACP,aAAY;AAAA,oBACZ,eAAc;AAAA,oBACd,gBAAe;AAAA;AAAA,gBACjB;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAE;AAAA,oBACF,QAAO;AAAA,oBACP,aAAY;AAAA,oBACZ,eAAc;AAAA,oBACd,gBAAe;AAAA;AAAA,gBACjB;AAAA;AAAA;AAAA,UACF;AAAA,UAED,OAAO,mCACN;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,QAAO;AAAA,cACP,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAM;AAAA,cACN,WAAU;AAAA,cAEV;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAE;AAAA,oBACF,QAAO;AAAA,oBACP,aAAY;AAAA,oBACZ,eAAc;AAAA,oBACd,gBAAe;AAAA;AAAA,gBACjB;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAE;AAAA,oBACF,QAAO;AAAA,oBACP,aAAY;AAAA,oBACZ,eAAc;AAAA,oBACd,gBAAe;AAAA;AAAA,gBACjB;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAE;AAAA,oBACF,QAAO;AAAA,oBACP,aAAY;AAAA,oBACZ,eAAc;AAAA,oBACd,gBAAe;AAAA;AAAA,gBACjB;AAAA;AAAA;AAAA,UACF;AAAA,UAEF,8CAAC,UAAM,iBAAO,OAAM;AAAA,WACtB;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,OAAO;AAAA,YACnB,oBAAoB,CAAC,sBACnB,qBAAqB,OAAO,iBAAiB;AAAA;AAAA,QAEjD;AAAA,WA5EQ,OAAO,GA6EjB,CACD,GACH;AAAA;AAAA,EACF;AAEJ;;;AjBzMA;AACA,IAAAC,0BAAuB;AACvB;AAyaQ,IAAAC,uBAAA;AA7MD,SAAS,cAAiD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,iBAAiB,CAAC;AAAA,EAClB,mBAAmB,CAAC;AAAA,EACpB,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AAExB,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,EAAE;AACjD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,EAAE;AAG/C,QAAM,gBAAgB,aAAa,MAAM,EAAE,aAAa,KAAK,CAAC;AAC9D,QAAM,aAAa,kBACf,gBACA;AAAA,IACE,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,YAAY,MAAM;AAAA,IAAC;AAAA,EACrB;AAEJ,QAAM,EAAE,YAAY,YAAY,eAAe,WAAW,IAAI;AAG9D,QAAM,kBAAkB,eAAe,gBAAgB,EAAE,aAAa,KAAK,CAAC;AAG5E,QAAM,2BAAuB;AAAA,IAC3B,OAAO;AAAA,MACL,eAAe,CAAC;AAAA,MAChB,eAAe,CAAC;AAAA,MAChB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,eAAe,MAAM;AAAA,MAAC;AAAA,MACtB,cAAc,MAAM;AAAA,MAAC;AAAA,MACrB,cAAc,MAAM;AAAA,MAAC;AAAA,IACvB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,gBAAgB,kBAAkB;AAEvD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM;AAAA,IACJ,sBAAsB;AAAA,IACtB,sBAAsB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,IACtC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,CAAC;AAChD,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,mBAAmB;AAGpE,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,KAAK;AAGhE,QAAM,qBAAiB,wBAAQ,MAAmB;AAChD,UAAM,SAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,aAAa;AAC/B,aAAO,SAAS;AAAA,IAClB;AAEA,QAAI,eAAe;AACjB,aAAO,OAAO,QAAQ,aAAa;AAAA,IACrC;AAEA,QAAI,mBAAmB,cAAc,eAAe;AAClD,aAAO,SAAS;AAChB,aAAO,YAAY;AAAA,IACrB;AAEA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAID,gCAAU,MAAM;AACd,qBAAiB,cAAc;AAAA,EACjC,GAAG,CAAC,cAAc,CAAC;AAGnB,QAAM,yBAAqB,4BAAY,CAAC,UAAkB;AACxD,mBAAe,KAAK;AACpB,mBAAe,CAAC;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAoB,4BAAY,CAAC,MAAqC;AAC1E,kBAAc,EAAE,OAAO,KAAK;AAAA,EAC9B,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAoB,4BAAY,MAAM;AAC1C,iBAAa;AACb,yBAAqB,KAAK;AAC1B,mBAAe,CAAC;AAAA,EAClB,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,uBAAmB,4BAAY,CAAC,SAAiB;AACrD,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,+BAA2B,4BAAY,CAAC,UAAkB;AAC9D,oBAAgB,KAAK;AACrB,mBAAe,CAAC;AAAA,EAClB,GAAG,CAAC,CAAC;AAGL,QAAM,6BAAyB;AAAA,IAC7B,CAAC,KAAQ,UAAkB;AACzB,UAAI,kBAAkB,YAAY;AAChC,mBAAW,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,UAAU;AAAA,EAC7B;AAGA,QAAM,4BAAwB;AAAA,IAC5B,MACE,oBACA,CAAC,kBACD,eAAe,UACf,eAAe;AAAA,IACjB,CAAC,kBAAkB,gBAAgB,YAAY,UAAU;AAAA,EAC3D;AAGA,QAAM,uBACJ,cACA,KAAK;AAAA,KACF,eACE,wBAAwB,WAAW,SAAS,KAAK,WAClD;AAAA,EACJ;AACF,QAAM,uBACJ,eAAe,wBAAwB,WAAW,SAAS,KAAK;AAGlE,QAAM,kBAAc,wBAAQ,MAAM;AAChC,QAAI,CAAC,uBAAuB;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,cAAc,KAAK;AAClC,WAAO,WAAW,MAAM,OAAO,QAAQ,YAAY;AAAA,EACrD,GAAG,CAAC,uBAAuB,YAAY,aAAa,YAAY,CAAC;AAGjE,QAAM,UAAU,KAAK,WAAW;AAGhC,QAAM,cAAc;AACpB,QAAM,qBACJ,CAAC,WAAW,KAAK,WAAW,KAAK,YAAY,KAAK,MAAM;AAC1D,QAAM,YAAY,CAAC,WAAW,KAAK,WAAW,KAAK,YAAY,KAAK,MAAM;AAG1E,QAAM,YAAY,gBAAgB,kBAChC,+CAAC,SAAI,WAAU,2BAEZ;AAAA,qBACC;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAAS,MAAM,qBAAqB,IAAI;AAAA,QAExC;AAAA,wDAAC,kCAAO,MAAM,IAAI;AAAA,UAAE;AAAA,UAEnB,qBAAqB,KACpB,8CAAC,UAAK,WAAU,mEACb,8BACH;AAAA;AAAA;AAAA,IAEJ;AAAA,IAID,gBACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,2BAA2B,wBAAwB;AAAA,QAEjE;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA,YACV,UAAU;AAAA,YACV,SAAS,MAAM;AACb,4BAAc,EAAE;AAChB,iCAAmB,EAAE;AAAA,YACvB;AAAA,YACA,SAAS,CAAC;AAAA,YACV,aAAa;AAAA,YACb,YAAY;AAAA;AAAA,QACd;AAAA;AAAA,IACF;AAAA,KAEJ;AAIF,QAAM,iBAAiB,iBAAiB,aACtC,+CAAC,SAAI,WAAU,iFAEZ;AAAA,qBAAiB,8CAAC,SAAK,yBAAc;AAAA,IAGrC,YAAY,8CAAC,SAAI,WAAU,uBAAuB,oBAAS;AAAA,KAC9D;AAGF,QAAM,QACJ,8CAAC,SAAI,WAAU,0BACb;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAGA;AAAA,sDAAC,WACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,YAAY,eAAe,sBAAsB;AAAA,YAEzD,kBAAQ,IAAI,CAAC,QAAQ,UACpB;AAAA,cAAC;AAAA;AAAA,gBAEC,UAAU,mBAAmB,OAAO;AAAA,gBACpC,eACE,mBAAmB,eAAe,OAAO,MACrC,gBACA;AAAA,gBAEN,QAAQ,MACN,mBAAmB,OAAO,YAAY,WAAW,OAAO,GAAG;AAAA,gBAE7D,WAAW,OAAO;AAAA,gBAClB,OAAO,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI;AAAA,gBAE/C,iBAAO;AAAA;AAAA,cAbH,UAAU,OAAO,GAAG,IAAI,KAAK;AAAA,YAcpC,CACD;AAAA;AAAA,QACH,GACF;AAAA,QAGA,8CAAC,aACE,oBACC,8CAAC,YACC,wDAAC,aAAU,SAAS,QAAQ,QAAQ,WAAU,oBAC5C,wDAAC,UAAK,WAAU,yBAAwB,2BAAa,GACvD,GACF,IAEA,YAAY,IAAI,CAAC,KAAK,aAAa;AAEjC,gBAAM,iBAAiB,yBAClB,cAAc,KAAK,eAAe,WACnC;AAEJ,gBAAM,cAAc,UACf,MAAM;AACL,kBAAM,WAAW,IAAI,MAAM;AAC3B,gBAAI,aAAa,QAAQ,aAAa,QAAW;AAC/C,qBAAO,OAAO,cAAc;AAAA,YAC9B;AACA,gBAAI,OAAO,aAAa,UAAU;AAChC,qBAAO,KAAK,UAAU,QAAQ;AAAA,YAChC;AACA,mBAAO,OAAO,QAAQ;AAAA,UACxB,GAAG,IACH,OAAO,cAAc;AACzB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,SACE,YAAY,eAAe,sBAAsB;AAAA,cAEnD,WAAW;AAAA,cACX,SAAS,MAAM,uBAAuB,KAAK,cAAc;AAAA,cAExD,kBAAQ,IAAI,CAAC,QAAQ,cAAc;AAClC,sBAAM,QAAQ,IAAI,OAAO,GAAG;AAE5B,oBAAI,iBAAiB;AAErB,oBAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,sBACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,OAAO,UAAU,UACjB;AAEA,qCAAiB,OAAO,KAAK;AAAA,kBAC/B,WAAW,OAAO,UAAU,UAAU;AAEpC,qCAAiB,KAAK,UAAU,KAAK;AAAA,kBACvC,WAAW,OAAO,UAAU,YAAY;AAEtC,qCAAiB;AAAA,kBACnB,WAAW,OAAO,UAAU,UAAU;AAEpC,qCAAiB,OAAO,KAAK;AAAA,kBAC/B;AAAA,gBAEF;AAEA,sBAAM,UAAU,OAAO,SACnB,OAAO,OAAO,OAAO,KAAK,cAAc,IACxC;AAEJ,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,WAAW,OAAO;AAAA,oBAClB,OAAO;AAAA,sBACL,WAAW,OAAO;AAAA,oBACpB;AAAA,oBAEC;AAAA;AAAA,kBANI,QAAQ,cAAc,IAAI,SAAS;AAAA,gBAO1C;AAAA,cAEJ,CAAC;AAAA;AAAA,YAjDI;AAAA,UAkDP;AAAA,QAEJ,CAAC,GAEL;AAAA;AAAA;AAAA,EACF,GACF;AAGF,QAAM,aAAa,oBAAoB,CAAC,WACtC,8CAAC,SAAI,WAAU,oBACb;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,sBAAsB;AAAA,MACtB;AAAA;AAAA,EACF,GACF;AAIF,MAAI,UAAU;AACZ,WACE,gFACG;AAAA,eAAS;AAAA,QACR,UAAU,iBAAiB,YAAY;AAAA,QACvC;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MAEA,iBACC;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,SAAS,MAAM,qBAAqB,KAAK;AAAA,UACzC;AAAA,UACA,iBAAiB;AAAA,UACjB,SAAS;AAAA,UACT,SAAS;AAAA;AAAA,MACX;AAAA,OAEJ;AAAA,EAEJ;AAGA,QAAM,mBAAmB,sBAAsB;AAC/C,SACE,+CAAC,SAAI,WAAW,kBACb;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IAGA,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,qBAAqB,KAAK;AAAA,QACzC;AAAA,QACA,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,SAAS;AAAA;AAAA,IACX;AAAA,KAEJ;AAEJ;AAEA,IAAO,wBAAQ;;;A4CzqBf,IAAAC,iBAAkE;AAClE,IAAAC,0BAA2B;AAC3B;AACA;AACA;AACA;AAYA;AAyEU,IAAAC,uBAAA;AAzCV,IAAM,sBAGF;AAAA,EACF,SAAS,gBAAgB;AAAA,EACzB,WAAW,gBAAgB;AAAA,EAC3B,OAAO,gBAAgB;AACzB;AAMA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,QAAM,QAAQ;AAAA,IACZ,oBAAoB,SAAS,MAAM;AAAA,EACrC;AAEA,QAAM,eAAe,SAAS,QAAQ,IAAI,CAAC,WAAW;AACpD,QAAI;AACJ,QAAI,OAAO,WAAW;AACpB;AAAA,IACF,WAAW,OAAO,YAAY;AAC5B;AAAA,IACF,OAAO;AACL;AAAA,IACF;AACA,WAAO,EAAE,OAAO,OAAO,QAAQ,OAAO,OAAO,IAAI,OAAO;AAAA,EAC1D,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,SAAS;AAAA,MAChB,SACE,+CAAC,SAAI,WAAU,uDACb;AAAA,uDAAC,gBAAK,MAAK,MAAK,QAAO,QAAO,WAAU,iBAAgB;AAAA;AAAA,UAC7C,QAAQ;AAAA,WACnB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,YAEC,gBAAM;AAAA;AAAA,QACT;AAAA,SACF;AAAA,MAEF,kBAAiB;AAAA,MAEjB,yDAAC,SAAI,WAAU,uBACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,SAAS;AAAA,YAClB,WAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,GAAG,SAAS,UAAU;AAAA,YAC7B,SACE,8CAAC,SAAI,WAAU,eACb,wDAAC,gBAAK,MAAK,MAAK,QAAO,UAAS,WAAU,iBAAgB,0BAE1D,GACF;AAAA,YAEF,kBAAiB;AAAA,YAEjB;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,MAAM,YAAY,SAAS,UAAU;AAAA,gBACrC;AAAA,gBACA,eAAe,SAAS,oBAAoB;AAAA;AAAA,YAC9C;AAAA;AAAA,QACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAMA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAwB,IAAI;AAEtD,QAAM,eAAe,MAAM;AACzB,aAAS,MAAM,QAAQ,EAAE;AACzB,aAAS,IAAI;AACb,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,MAAM,KAAK,EAAG;AACnB,cAAU,IAAI;AACd,aAAS,IAAI;AACb,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,CAAC;AACzB,iBAAW,KAAK;AAAA,IAClB,QAAQ;AAEN,eAAS,qDAA+C;AAAA,IAC1D,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WAAO,8CAAC,gBAAa,WAAU,QAAO;AAAA,EACxC;AAEA,MAAI,SAAS;AACX,WACE,+CAAC,SAAI,WAAU,+DACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,aAAY;AAAA,UACZ,MAAM;AAAA;AAAA,MACR;AAAA,MACC,SACC,8CAAC,gBAAK,MAAK,MAAK,WAAU,kBACvB,iBACH;AAAA,MAEF,+CAAC,SAAI,WAAU,0BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,WAAW,KAAK;AAAA,YAChC;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,UAAU,CAAC,MAAM,KAAK;AAAA,YACjC;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,+CAAC,SAAI,WAAU,mFACb;AAAA,mDAAC,SAAI,WAAU,yBACb;AAAA,oDAAC,gBAAK,MAAK,MAAK,QAAO,QAAO,WAAU,iBAAgB,8BAExD;AAAA,MACC,MAAM,QACL,8CAAC,gBAAK,MAAK,MAAK,WAAU,0BACvB,eAAK,MACR;AAAA,OAEJ;AAAA,IACA,8CAAC,kBAAO,SAAQ,SAAQ,MAAK,SAAQ,SAAS,cAC3C,gBAAM,OAAO,WAAW,WAC3B;AAAA,KACF;AAEJ;AAMA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,WAAW;AAAA,MAClB;AAAA,MACA,kBAAkB;AAAA,MAClB,SACE,8CAAC,SAAI,WAAU,eACb,yDAAC,gBAAK,QAAO,QAAO,WAAU,iBAAgB;AAAA;AAAA,QAClC,QAAQ;AAAA,SACpB,GACF;AAAA,MAEF,kBAAiB;AAAA,MAEhB;AAAA,gBAAQ,WAAW,8CAAC,gBAAa,WAAU,QAAO;AAAA,QAClD,QAAQ,SACP,8CAAC,gBAAK,MAAK,MAAK,WAAU,kBACvB,iBAAO,OACV;AAAA,QAED,QAAQ,QACP,+CAAC,SAAI,WAAU,uBACb;AAAA,yDAAC,SAAI,WAAU,cACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,OAAO,KAAK,OAAO;AAAA,gBAC1B,SAAQ;AAAA,gBACR,WAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,OAAO,KAAK,OAAO;AAAA,gBAC1B,SAAQ;AAAA,gBACR,WAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,OAAO,KAAK,OAAO;AAAA,gBAC1B,SAAQ;AAAA,gBACR,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,MAAM,QAAQ;AAAA,cACpB,SAAS,MAAM,WAAW;AAAA,cAC1B,QAAQ;AAAA;AAAA,UACV;AAAA,UAEA,+CAAC,SAAI,WAAU,uBACb;AAAA,0DAAC,gBAAK,QAAO,QAAO,WAAU,iBAAgB,uBAE9C;AAAA,YACC,OAAO,KAAK,UAAU,IAAI,CAAC,UAAU,WACpC;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA,OAAO;AAAA;AAAA,cAFF,SAAS;AAAA,YAGhB,CACD;AAAA,aACH;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAYO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,qBAAiB,wBAAQ,MAAM,qBAAqB,GAAG,GAAG,CAAC,GAAG,CAAC;AACrE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AAEnB,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAqC,IAAI;AACjE,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,KAAK;AACpD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAwB,IAAI;AAC9D,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAwB,IAAI;AAChE,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAsC,CAAC,CAAC;AACtE,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAoC,CAAC,CAAC;AAGhE,QAAM,iBAAa,uBAAO,IAAI;AAC9B,gCAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,CAAC;AAIL,QAAM,sBAAkB,uBAAO,CAAC;AAChC,gCAAU,MAAM;AACd,oBAAgB,WAAW;AAAA,EAC7B,GAAG,CAAC,QAAQ,SAAS,iBAAiB,CAAC;AAEvC,QAAM,sBAAkB;AAAA,IACtB,CAAC,UAAkB,CAAC,WAAW,WAAW,gBAAgB,YAAY;AAAA,IACtE,CAAC;AAAA,EACH;AAEA,gCAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,QAAS;AAEzB,YAAQ,IAAI;AACZ,kBAAc,IAAI;AAClB,eAAW,CAAC,CAAC;AACb,aAAS,CAAC,CAAC;AACX,mBAAe,IAAI;AACnB,iBAAa,IAAI;AAEjB,QAAI,SAAS;AACb,4BAAwB,QAAQ,iBAAiB,EAC9C,KAAK,CAAC,SAAS;AACd,UAAI,OAAQ,SAAQ,IAAI;AAAA,IAC1B,CAAC,EACA,MAAM,MAAM;AACX,UAAI,OAAQ,cAAa,4CAA4C;AAAA,IACvE,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,OAAQ,gBAAe,KAAK;AAAA,IAClC,CAAC;AAEH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,uBAAuB,CAAC;AAE7C,QAAM,mBAAe;AAAA,IACnB,CAAC,iBAAyB;AACxB,UAAI,CAAC,QAAS;AACd,YAAM,eAAe,gBAAgB;AACrC,YAAM,OAAO,eAAe,eAAe,OAAO;AAClD,oBAAc,IAAI;AAElB,UAAI,QAAQ,CAAC,QAAQ,YAAY,GAAG;AAClC,mBAAW,CAAC,UAAU;AAAA,UACpB,GAAG;AAAA,UACH,CAAC,YAAY,GAAG,EAAE,SAAS,MAAM,OAAO,MAAM,MAAM,KAAK;AAAA,QAC3D,EAAE;AACF,8BAAsB,QAAQ,mBAAmB,YAAY,EAC1D,KAAK,CAAC,SAAS;AACd,cAAI,gBAAgB,YAAY,EAAG;AACnC,qBAAW,CAAC,UAAU;AAAA,YACpB,GAAG;AAAA,YACH,CAAC,YAAY,GAAG,EAAE,SAAS,OAAO,OAAO,MAAM,KAAK;AAAA,UACtD,EAAE;AAAA,QACJ,CAAC,EACA,MAAM,MAAM;AACX,cAAI,gBAAgB,YAAY,EAAG;AACnC,qBAAW,CAAC,UAAU;AAAA,YACpB,GAAG;AAAA,YACH,CAAC,YAAY,GAAG;AAAA,cACd,SAAS;AAAA,cACT,OAAO;AAAA,cACP,MAAM;AAAA,YACR;AAAA,UACF,EAAE;AAAA,QACJ,CAAC;AAEH,iBAAS,CAAC,UAAU;AAAA,UAClB,GAAG;AAAA,UACH,CAAC,YAAY,GAAG,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,QAC9C,EAAE;AACF,kBAAU,QAAQ,mBAAmB,YAAY,EAC9C,KAAK,CAAC,SAAS;AACd,cAAI,gBAAgB,YAAY,EAAG;AACnC,mBAAS,CAAC,UAAU;AAAA,YAClB,GAAG;AAAA,YACH,CAAC,YAAY,GAAG,EAAE,SAAS,OAAO,KAAK;AAAA,UACzC,EAAE;AAAA,QACJ,CAAC,EACA,MAAM,MAAM;AACX,cAAI,gBAAgB,YAAY,EAAG;AACnC,mBAAS,CAAC,UAAU;AAAA,YAClB,GAAG;AAAA,YACH,CAAC,YAAY,GAAG,EAAE,SAAS,OAAO,MAAM,KAAK;AAAA,UAC/C,EAAE;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,iBAAyB,OAAO,SAAiB;AAChD,UAAI,CAAC,QAAS;AACd,YAAM,eAAe,gBAAgB;AACrC,YAAM,QAAQ,MAAM;AAAA,QAClB,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACA,UAAI,gBAAgB,YAAY,EAAG;AACnC,eAAS,CAAC,UAAU;AAAA,QAClB,GAAG;AAAA,QACH,CAAC,YAAY,GAAG,EAAE,SAAS,OAAO,MAAM,MAAM;AAAA,MAChD,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,SAAS,UAAU,eAAe;AAAA,EACrC;AAEA,SACE,8CAAC,iBAAM,QAAgB,SAAkB,OAAM,aAAY,MAAK,MAC7D,qBACC,+CAAC,SAAI,WAAU,yDACb;AAAA,mDAAC,SAAI,WAAU,2CACb;AAAA,qDAAC,UAAK,WAAU,2BACd;AAAA,sDAAC,sCAAW,MAAM,IAAI,QAAO,QAAO,WAAU,iBAAgB;AAAA,QAC9D,8CAAC,gBAAK,QAAO,QAAO,WAAU,iBAC3B,kBAAQ,MACX;AAAA,SACF;AAAA,MACA,+CAAC,gBAAK,MAAK,MAAK,WAAU,iBACvB;AAAA,cAAM,QAAQ,uBAAuB;AAAA,QAAE;AAAA,SAC1C;AAAA,OACF;AAAA,IAEC,eAAe,8CAAC,gBAAa,WAAU,QAAO;AAAA,IAC9C,aACC,8CAAC,gBAAK,MAAK,MAAK,WAAU,kBACvB,qBACH;AAAA,IAED,MAAM,YAAY,KAAK,WAAW,KAAK,CAAC,eACvC,8CAAC,gBAAK,MAAK,MAAK,WAAU,iBAAgB,oEAE1C;AAAA,IAGD,QACC,8CAAC,SAAI,WAAU,uBACZ,eAAK,YAAY,KAAK,IAAI,CAAC,YAAY,UACtC;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA,UAAU,eAAe,WAAW;AAAA,QACpC,UAAU,MAAM,aAAa,WAAW,EAAE;AAAA,QAC1C,QAAQ,QAAQ,WAAW,EAAE;AAAA,QAC7B,MAAM,MAAM,WAAW,EAAE;AAAA,QACzB,YAAY,aAAa,WAAW,EAAE;AAAA;AAAA,MAPjC,WAAW;AAAA,IAQlB,CACD,GACH;AAAA,KAEJ,GAEJ;AAEJ;;;A9C/cU,IAAAC,uBAAA;AA9CV,IAAM,gBAAgB;AAOf,SAAS,gBAAgB,EAAE,KAAK,cAAc,GAAyB;AAC5E,QAAM,qBAAiB,wBAAQ,MAAM,qBAAqB,GAAG,GAAG,CAAC,GAAG,CAAC;AACrE,QAAM,EAAE,cAAc,IAAI,eAAe;AAEzC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAmC,CAAC,CAAC;AACrE,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,CAAC;AACpC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,QAAI,yBAGtB,IAAI;AAEd,QAAM,yBAAqB;AAAA,IACzB,CAAC,WAAwB;AACvB,iBAAW,IAAI;AACf,oBAAc;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO,QAAQ,KAAK,KAAK;AAAA,MACnC,CAAC,EACE,KAAK,CAAC,WAAW;AAChB,oBAAY,OAAO,IAAI;AACvB,iBAAS,OAAO,KAAK;AAAA,MACvB,CAAC,EACA,MAAM,MAAM;AACX,oBAAY,CAAC,CAAC;AACd,iBAAS,CAAC;AAAA,MACZ,CAAC,EACA,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,IACpC;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,cAAU;AAAA,IACd,MAAM;AAAA,MACJ;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC,QAAQ,QACf,+CAAC,UAAK,WAAU,2BACd;AAAA,wDAAC,sCAAW,MAAM,IAAI,QAAO,QAAO,WAAU,iBAAgB;AAAA,UAC9D,8CAAC,gBAAK,MAAK,MAAK,WAAU,iBACvB,cAAI,MACP;AAAA,WACF;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC,QAAQ,QACf,8CAAC,gBAAK,MAAK,MAAK,WAAU,iBACvB,cAAI,SAAS,KAChB;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC,QAAQ,QACf,8CAAC,gBAAK,MAAK,MAAK,WAAU,iBACvB,cAAI,kBACP;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC,QAAQ,QACf,8CAAC,SAAI,WAAU,oBACb;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MACP,YAAY;AAAA,cACV,mBAAmB,IAAI;AAAA,cACvB,MAAM,IAAI;AAAA,YACZ,CAAC;AAAA,YAEJ;AAAA;AAAA,QAED,GACF;AAAA,MAEJ;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SACE,+CAAC,iBAAc,gBAAe,kBAC5B;AAAA,mDAAC,SAAI,WAAU,4BACb;AAAA,oDAAC,gBAAK,MAAK,OAAM,QAAO,QAAO,WAAU,iBAAgB,uBAEzD;AAAA,MACA,8CAAC,gBAAK,MAAK,MAAK,WAAU,iBAAgB,kFAE1C;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA,SAAQ;AAAA,QACR,cAAY;AAAA,QACZ,kBAAgB;AAAA,QAChB,QAAO;AAAA,QACP,mBAAkB;AAAA,QAClB,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,UAChB,WAAW;AAAA,UACX,qBAAqB,CAAC,IAAI,IAAI,EAAE;AAAA,UAChC,qBAAqB;AAAA,UACrB,YAAY;AAAA,QACd;AAAA,QACA,qBAAqB,EAAE,OAAO,cAAc;AAAA;AAAA,IAC9C;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ,aAAa;AAAA,QACrB,SAAS,MAAM,YAAY,IAAI;AAAA,QAC/B,SAAS;AAAA;AAAA,IACX;AAAA,KACF;AAEJ;","names":["import_jsx_runtime","import_jsx_runtime","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","STATE_CLASSES","import_react","import_phosphor_react","import_react","import_react","import_phosphor_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","_","import_jsx_runtime","import_jsx_runtime","import_react","import_phosphor_react","import_react","import_phosphor_react","import_react","import_zustand","import_phosphor_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","value","disabled","readOnly","import_react","import_phosphor_react","import_jsx_runtime","VARIANT_ACTION_CLASSES","SIZE_CLASSES","import_jsx_runtime","katex","import_react","import_katex_min","import_react","match","import_jsx_runtime","segment","ReactMarkdown","remarkGfm","remarkMath","rehypeKatex","import_jsx_runtime","Element","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","import_jsx_runtime","import_react","import_zustand","import_jsx_runtime","SIZE_CLASSES","STATE_CLASSES","injectStore","import_jsx_runtime","SIZE_CLASSES","import_react","import_react","import_phosphor_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","status","import_phosphor_react","import_jsx_runtime","import_react","import_zustand","import_jsx_runtime","injectStore","import_phosphor_react","import_jsx_runtime","import_phosphor_react","import_react","import_jsx_runtime","isReadonly","value","import_react","import_jsx_runtime","formattedItemsMap","getBadgeText","isCategoryEnabled","handleAccordionValueChange","import_jsx_runtime","import_phosphor_react","import_jsx_runtime","import_react","import_phosphor_react","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/utils/utils.ts","../../src/components/Text/Text.tsx","../../src/components/Button/Button.tsx","../../src/components/Modal/utils/videoUtils.ts","../../src/components/Modal/Modal.tsx","../../src/components/TextArea/TextArea.tsx","../../src/components/SimulationsPage/index.ts","../../src/components/SimulationsPage/SimulationsPage.tsx","../../src/components/PageContainer/PageContainer.tsx","../../src/components/TableProvider/TableProvider.tsx","../../src/components/Table/Table.tsx","../../src/components/NoSearchResult/NoSearchResult.tsx","../../src/components/EmptyState/EmptyState.tsx","../../src/components/Skeleton/Skeleton.tsx","../../src/components/Table/TablePagination.tsx","../../src/components/Filter/useTableFilter.ts","../../src/components/CheckBoxGroup/CheckBoxGroup.helpers.ts","../../src/components/Search/Search.tsx","../../src/components/DropdownMenu/DropdownMenu.tsx","../../src/components/ThemeToggle/ThemeToggle.tsx","../../src/components/SelectionButton/SelectionButton.tsx","../../src/hooks/useTheme.ts","../../src/store/themeStore.ts","../../src/utils/cookieUtils.ts","../../src/utils/domainUtils.ts","../../src/store/themeStorage.ts","../../src/components/Filter/FilterModal.tsx","../../src/components/CheckBoxGroup/CheckBoxGroup.tsx","../../src/index.ts","../../src/components/Badge/Badge.tsx","../../src/components/HtmlMathRenderer/KatexMath.tsx","../../src/components/HtmlMathRenderer/HtmlMathRenderer.tsx","../../src/components/MarkdownMathRenderer/MarkdownMathRenderer.tsx","../../src/components/HtmlMathRenderer/utils.ts","../../src/components/CheckBox/CheckBox.tsx","../../src/components/Divider/Divider.tsx","../../src/components/Radio/Radio.tsx","../../src/components/ProgressBar/ProgressBar.tsx","../../src/components/Accordation/Accordation.tsx","../../src/components/Card/Card.tsx","../../src/components/IconRender/IconRender.tsx","../../src/assets/icons/subjects/ChatPT.tsx","../../src/assets/icons/subjects/ChatEN.tsx","../../src/assets/icons/subjects/ChatES.tsx","../../src/assets/icons/subjects/BookOpenText.tsx","../../src/assets/icons/subjects/Microscope.tsx","../../src/assets/icons/subjects/HeadCircuit.tsx","../../src/components/Accordation/AccordionGroup.tsx","../../src/components/shared/StatCard/StatCard.tsx","../../src/utils/studentActivityCorrection/constants.ts","../../src/utils/studentActivityCorrection/utils.ts","../../src/components/Alternative/Alternative.tsx","../../src/components/SimulatedFilters/hooks.ts","../../src/hooks/useSimulations.ts","../../src/components/SimulationsPage/SimulationsDetailModal.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport { syncDropdownState } from './dropdown';\nexport {\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n areFiltersEqual,\n} from './activityFilters';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './questionTypeUtils';\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n formatActivityDateToBrazilian,\n} from './activityDetailsUtils';\n\n/**\n * Format a number as a rounded percentage string\n * @param value - Number to format (0-100)\n * @returns Formatted string with % suffix (e.g., \"72%\")\n */\nexport function formatPercentageRounded(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nexport { formatScore } from './formatScore';\n\n/**\n * Convert hex color to rgba with opacity for background\n * @param hex - Hex color (e.g., \"#4B0082\")\n * @param opacity - Opacity value (0-1)\n * @returns rgba string\n */\nexport function hexToRgba(hex: string, opacity: number): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return `rgba(107, 114, 128, ${opacity})`; // fallback gray\n const r = Number.parseInt(result[1], 16);\n const g = Number.parseInt(result[2], 16);\n const b = Number.parseInt(result[3], 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n}\n\n/**\n * Maps Tailwind bg-* class to CSS variable\n * @param bgClass - Tailwind background class (e.g., \"bg-error-600\")\n * @returns CSS variable string (e.g., \"var(--color-error-600)\")\n */\nexport function bgClassToCssVar(bgClass: string): string {\n return `var(--color-${bgClass.replace('bg-', '')})`;\n}\n\n/**\n * Converts polar coordinates to Cartesian for SVG arc path calculations.\n * Angles are in degrees, with 0° at the top (12 o'clock position).\n * @param cx - Center X coordinate\n * @param cy - Center Y coordinate\n * @param r - Radius\n * @param angleDeg - Angle in degrees\n * @returns Cartesian coordinates { x, y }\n */\nexport function polarToCartesian(\n cx: number,\n cy: number,\n r: number,\n angleDeg: number\n): { x: number; y: number } {\n const rad = ((angleDeg - 90) * Math.PI) / 180;\n return { x: cx + r * Math.cos(rad), y: cy + r * Math.sin(rad) };\n}\n\n/**\n * Generates an SVG filled arc (pie slice) path string.\n * @param cx - Center X coordinate\n * @param cy - Center Y coordinate\n * @param r - Radius\n * @param startAngle - Start angle in degrees\n * @param endAngle - End angle in degrees\n * @returns SVG path string for the arc\n */\nexport function describeArc(\n cx: number,\n cy: number,\n r: number,\n startAngle: number,\n endAngle: number\n): string {\n const span = endAngle - startAngle;\n\n // For full circle (or near-full), use two arcs to avoid SVG arc degeneracy\n if (span >= 359.99) {\n const midAngle = startAngle + 180;\n const s = polarToCartesian(cx, cy, r, startAngle);\n const m = polarToCartesian(cx, cy, r, midAngle);\n return `M ${cx} ${cy} L ${s.x} ${s.y} A ${r} ${r} 0 1 1 ${m.x} ${m.y} A ${r} ${r} 0 1 1 ${s.x} ${s.y} Z`;\n }\n\n const s = polarToCartesian(cx, cy, r, endAngle);\n const e = polarToCartesian(cx, cy, r, startAngle);\n const largeArc = span > 180 ? 1 : 0;\n return `M ${cx} ${cy} L ${s.x} ${s.y} A ${r} ${r} 0 ${largeArc} 0 ${e.x} ${e.y} Z`;\n}\n\n/**\n * Retorna a cor hexadecimal com opacidade 0.3 (4d) se não estiver em dark mode.\n * Se estiver em dark mode, retorna a cor original.\n *\n * @param hexColor - Cor hexadecimal (ex: \"#0066b8\" ou \"0066b8\")\n * @param isDark - booleano indicando se está em dark mode\n * @returns string - cor hexadecimal com opacidade se necessário\n */\nexport function getSubjectColorWithOpacity(\n hexColor: string | undefined,\n isDark: boolean\n): string | undefined {\n if (!hexColor) return undefined;\n // Remove o '#' se existir\n let color = hexColor.replace(/^#/, '').toLowerCase();\n\n if (isDark) {\n // Se está em dark mode, sempre remove opacidade se existir\n if (color.length === 8) {\n color = color.slice(0, 6);\n }\n return `#${color}`;\n } else {\n // Se não está em dark mode (light mode)\n let resultColor: string;\n if (color.length === 6) {\n // Adiciona opacidade 0.3 (4D) para cores de 6 dígitos\n resultColor = `#${color}4d`;\n } else if (color.length === 8) {\n // Já tem opacidade, retorna como está\n resultColor = `#${color}`;\n } else {\n // Para outros tamanhos (3, 4, 5 dígitos), retorna como está\n resultColor = `#${color}`;\n }\n return resultColor;\n }\n}\n","import { ComponentPropsWithRef, ElementType, ReactNode } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Base text component props\n */\ntype BaseTextProps = {\n /** Content to be displayed */\n children?: ReactNode;\n /** Text size variant */\n size?:\n | '2xs'\n | 'xs'\n | 'sm'\n | 'md'\n | 'lg'\n | 'xl'\n | '2xl'\n | '3xl'\n | '4xl'\n | '5xl'\n | '6xl';\n /** Font weight variant */\n weight?:\n | 'hairline'\n | 'light'\n | 'normal'\n | 'medium'\n | 'semibold'\n | 'bold'\n | 'extrabold'\n | 'black';\n /** Color variant - white for light backgrounds, black for dark backgrounds */\n color?: string;\n /** Additional CSS classes to apply */\n className?: string;\n};\n\n/**\n * Polymorphic text component props that ensures type safety based on the 'as' prop\n */\ntype TextProps<T extends ElementType = 'p'> = BaseTextProps & {\n /** HTML tag to render */\n as?: T;\n} & Omit<ComponentPropsWithRef<T>, keyof BaseTextProps>;\n\n/**\n * Text component for Analytica Ensino platforms\n *\n * A flexible polymorphic text component with multiple sizes, weights, and colors.\n * Automatically adapts to dark and light themes with full type safety.\n *\n * @param children - The content to display\n * @param size - The text size variant (2xs, xs, sm, md, lg, xl, 2xl, 3xl, 4xl, 5xl, 6xl)\n * @param weight - The font weight variant (hairline, light, normal, medium, semibold, bold, extrabold, black)\n * @param color - The color variant - adapts to theme\n * @param as - The HTML tag to render - determines allowed attributes via TypeScript\n * @param className - Additional CSS classes\n * @param props - HTML attributes valid for the chosen tag only\n * @returns A styled text element with type-safe attributes\n *\n * @example\n * ```tsx\n * <Text size=\"lg\" weight=\"bold\" color=\"text-info-800\">\n * This is a large, bold text\n * </Text>\n *\n * <Text as=\"a\" href=\"/link\" target=\"_blank\">\n * Link with type-safe anchor attributes\n * </Text>\n *\n * <Text as=\"button\" onClick={handleClick} disabled>\n * Button with type-safe button attributes\n * </Text>\n * ```\n */\nconst Text = <T extends ElementType = 'p'>({\n children,\n size = 'md',\n weight = 'normal',\n color = 'text-text-950',\n as,\n className = '',\n ...props\n}: TextProps<T>) => {\n let sizeClasses: string;\n let weightClasses: string;\n\n // Text size classes mapping\n const sizeClassMap = {\n '2xs': 'text-2xs',\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-md',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n '3xl': 'text-3xl',\n '4xl': 'text-4xl',\n '5xl': 'text-5xl',\n '6xl': 'text-6xl',\n } as const;\n\n sizeClasses = sizeClassMap[size] ?? sizeClassMap.md;\n\n // Font weight classes mapping\n const weightClassMap = {\n hairline: 'font-hairline',\n light: 'font-light',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n extrabold: 'font-extrabold',\n black: 'font-black',\n } as const;\n\n weightClasses = weightClassMap[weight] ?? weightClassMap.normal;\n\n const baseClasses = 'font-primary';\n const Component = as ?? ('p' as ElementType);\n\n return (\n <Component\n className={cn(baseClasses, sizeClasses, weightClasses, color, className)}\n {...props}\n >\n {children}\n </Component>\n );\n};\n\nexport default Text;\n","import { ButtonHTMLAttributes, ReactNode, forwardRef } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for variant and action class combinations\n */\nconst VARIANT_ACTION_CLASSES = {\n solid: {\n primary:\n 'bg-primary-950 text-text border border-primary-950 hover:bg-primary-800 hover:border-primary-800 focus-visible:outline-none focus-visible:bg-primary-950 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-primary-700 active:border-primary-700 disabled:bg-primary-500 disabled:border-primary-500 disabled:opacity-40 disabled:cursor-not-allowed',\n secondary:\n 'bg-text-950 text-text border border-text-800 hover:bg-text-800 hover:border-text-950 focus-visible:outline-none focus-visible:bg-text-900 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-text-700 active:border-text-700 disabled:bg-text-500 disabled:border-text-500 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-success-500 text-text border border-success-500 hover:bg-success-600 hover:border-success-600 focus-visible:outline-none focus-visible:bg-success-500 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-success-700 active:border-success-700 disabled:bg-success-500 disabled:border-success-500 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-error-500 text-text border border-error-500 hover:bg-error-600 hover:border-error-600 focus-visible:outline-none focus-visible:bg-error-500 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:bg-error-700 active:border-error-700 disabled:bg-error-500 disabled:border-error-500 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n outline: {\n primary:\n 'bg-transparent text-primary-950 border border-primary-950 hover:bg-background-50 hover:text-primary-400 hover:border-primary-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-primary-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-primary-700 active:border-primary-700 disabled:opacity-40 disabled:cursor-not-allowed',\n secondary:\n 'bg-transparent text-text-950 border border-text-800 hover:bg-background-50 hover:text-text-700 hover:border-text-700 focus-visible:border-0 focus-visible:outline-none focus-visible:text-text-900 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-text-700 active:border-text-700 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-transparent text-success-500 border border-success-300 hover:bg-background-50 hover:text-success-400 hover:border-success-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-success-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-success-700 active:border-success-700 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-transparent text-error-500 border border-error-300 hover:bg-background-50 hover:text-error-400 hover:border-error-400 focus-visible:border-0 focus-visible:outline-none focus-visible:text-error-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-error-700 active:border-error-700 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n link: {\n primary:\n 'bg-transparent text-primary-950 hover:text-primary-400 focus-visible:outline-none focus-visible:text-primary-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-primary-700 disabled:opacity-40 disabled:cursor-not-allowed',\n secondary:\n 'bg-transparent text-text-950 hover:text-text-800 focus-visible:outline-none focus-visible:text-text-900 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-text-700 disabled:opacity-40 disabled:cursor-not-allowed',\n positive:\n 'bg-transparent text-success-500 hover:text-success-400 focus-visible:outline-none focus-visible:text-success-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-success-700 disabled:opacity-40 disabled:cursor-not-allowed',\n negative:\n 'bg-transparent text-error-500 hover:text-error-400 focus-visible:outline-none focus-visible:text-error-600 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-indicator-info active:text-error-700 disabled:opacity-40 disabled:cursor-not-allowed',\n },\n} as const;\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n 'extra-small': 'text-xs px-3.5 py-2',\n small: 'text-sm px-4 py-2.5',\n medium: 'text-md px-5 py-2.5',\n large: 'text-lg px-6 py-3',\n 'extra-large': 'text-lg px-7 py-3.5',\n} as const;\n\n/**\n * Button component props interface\n */\ntype ButtonProps = {\n /** Content to be displayed inside the button */\n children: ReactNode;\n /** Ícone à esquerda do texto */\n iconLeft?: ReactNode;\n /** Ícone à direita do texto */\n iconRight?: ReactNode;\n /** Size of the button */\n size?: 'extra-small' | 'small' | 'medium' | 'large' | 'extra-large';\n /** Visual variant of the button. Use 'raw' for no default styling */\n variant?: 'solid' | 'outline' | 'link' | 'raw';\n /** Action type of the button */\n action?: 'primary' | 'secondary' | 'positive' | 'negative';\n /** Additional CSS classes to apply */\n className?: string;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * Button component for Analytica Ensino platforms\n *\n * A flexible button component with multiple variants, sizes and actions.\n *\n * @param children - The content to display inside the button\n * @param size - The size variant (extra-small, small, medium, large, extra-large)\n * @param variant - The visual style variant (solid, outline, link)\n * @param action - The action type (primary, secondary, positive, negative)\n * @param className - Additional CSS classes\n * @param props - All other standard button HTML attributes\n * @returns A styled button element\n *\n * @example\n * ```tsx\n * <Button variant=\"solid\" action=\"primary\" size=\"medium\" onClick={() => console.log('clicked')}>\n * Click me\n * </Button>\n * ```\n */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n iconLeft,\n iconRight,\n size = 'medium',\n variant = 'solid',\n action = 'primary',\n className = '',\n disabled,\n type = 'button',\n ...props\n },\n ref\n ) => {\n // Raw variant: no default styling, only className\n if (variant === 'raw') {\n return (\n <button\n ref={ref}\n className={className}\n disabled={disabled}\n type={type}\n {...props}\n >\n {iconLeft && (\n <span className=\"mr-2 flex items-center\">{iconLeft}</span>\n )}\n {children}\n {iconRight && (\n <span className=\"ml-2 flex items-center\">{iconRight}</span>\n )}\n </button>\n );\n }\n\n // Get classes from lookup tables\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_ACTION_CLASSES[variant][action];\n\n const baseClasses =\n 'inline-flex items-center justify-center rounded-full cursor-pointer font-medium';\n\n return (\n <button\n ref={ref}\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n disabled={disabled}\n type={type}\n {...props}\n >\n {iconLeft && <span className=\"mr-2 flex items-center\">{iconLeft}</span>}\n {children}\n {iconRight && (\n <span className=\"ml-2 flex items-center\">{iconRight}</span>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport default Button;\n","/**\n * Video utilities for Modal component\n *\n * Utilities to handle YouTube video embedding and URL detection\n */\n\n/**\n * Check if a given URL is a YouTube URL\n *\n * @param url - The URL to check\n * @returns true if the URL is from YouTube, false otherwise\n */\nexport const isYouTubeUrl = (url: string): boolean => {\n const youtubeRegex =\n /^(https?:\\/\\/)?((www|m|music)\\.)?(youtube\\.com|youtu\\.be|youtube-nocookie\\.com)\\/.+/i;\n return youtubeRegex.test(url);\n};\n\n/**\n * Validate if hostname is a legitimate YouTube host\n *\n * @param host - The hostname to validate\n * @returns The type of YouTube host or null if invalid\n */\nconst isValidYouTubeHost = (\n host: string\n): 'youtu.be' | 'youtube' | 'nocookie' | null => {\n if (host === 'youtu.be') return 'youtu.be';\n\n const isValidYouTubeCom =\n host === 'youtube.com' ||\n (host.endsWith('.youtube.com') &&\n /^(www|m|music)\\.youtube\\.com$/.test(host));\n\n if (isValidYouTubeCom) return 'youtube';\n\n const isValidNoCookie =\n host === 'youtube-nocookie.com' ||\n (host.endsWith('.youtube-nocookie.com') &&\n /^(www|m|music)\\.youtube-nocookie\\.com$/.test(host));\n\n if (isValidNoCookie) return 'nocookie';\n\n return null;\n};\n\n/**\n * Extract video ID from youtu.be path\n *\n * @param pathname - The URL pathname\n * @returns The video ID or null\n */\nconst extractYoutuBeId = (pathname: string): string | null => {\n const firstSeg = pathname.split('/').filter(Boolean)[0];\n return firstSeg || null;\n};\n\n/**\n * Extract video ID from YouTube or nocookie domains\n *\n * @param pathname - The URL pathname\n * @param searchParams - The URL search parameters\n * @returns The video ID or null\n */\nconst extractYouTubeId = (\n pathname: string,\n searchParams: URLSearchParams\n): string | null => {\n const parts = pathname.split('/').filter(Boolean);\n const [first, second] = parts;\n\n if (first === 'embed' && second) return second;\n if (first === 'shorts' && second) return second;\n if (first === 'live' && second) return second;\n\n const v = searchParams.get('v');\n if (v) return v;\n\n return null;\n};\n\n/**\n * Extract YouTube video ID from URL\n *\n * @param url - The YouTube URL\n * @returns The video ID if found, null otherwise\n */\nexport const getYouTubeVideoId = (url: string): string | null => {\n try {\n const u = new URL(url);\n const hostType = isValidYouTubeHost(u.hostname.toLowerCase());\n\n if (!hostType) return null;\n\n if (hostType === 'youtu.be') {\n return extractYoutuBeId(u.pathname);\n }\n\n return extractYouTubeId(u.pathname, u.searchParams);\n } catch {\n return null;\n }\n};\n\n/**\n * Generate YouTube embed URL for iframe\n *\n * @param videoId - The YouTube video ID\n * @returns The embed URL for the video\n */\nexport const getYouTubeEmbedUrl = (videoId: string): string => {\n return `https://www.youtube-nocookie.com/embed/${videoId}?autoplay=0&rel=0&modestbranding=1`;\n};\n","import { ReactNode, useEffect, useId } from 'react';\nimport { X } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\nimport Button from '../Button/Button';\nimport {\n isYouTubeUrl,\n getYouTubeVideoId,\n getYouTubeEmbedUrl,\n} from './utils/videoUtils';\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n xs: 'max-w-[360px]',\n sm: 'max-w-[420px]',\n md: 'max-w-[510px]',\n lg: 'max-w-[640px]',\n xl: 'max-w-[970px]',\n} as const;\n\n/**\n * Modal component props interface\n */\ntype ModalProps = {\n contentClassName?: string;\n /** Whether the modal is open */\n isOpen: boolean;\n /** Function to close the modal */\n onClose: () => void;\n /**\n * Modal title. Aceita string OU ReactNode pra permitir elementos inline\n * (ex: botão de voltar + label). Como é renderizado dentro de <h2>,\n * quando ReactNode use APENAS phrasing content (`<span>`, `<button>`,\n * ícones) — nunca `<div>` ou `<p>`.\n */\n title: ReactNode;\n /** Modal description/content */\n children?: ReactNode;\n /** Size of the modal */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Additional CSS classes for the modal content */\n className?: string;\n /** Whether pressing Escape should close the modal */\n closeOnEscape?: boolean;\n /** Footer content (typically buttons) */\n footer?: ReactNode;\n /** Hide the close button */\n hideCloseButton?: boolean;\n /** Modal variant */\n variant?: 'default' | 'activity';\n /** Description for activity variant */\n description?: string;\n /** Image URL for activity variant */\n image?: string;\n /** Alt text for activity image (leave empty for decorative images) */\n imageAlt?: string;\n /** Action link for activity variant */\n actionLink?: string;\n /** Action button label for activity variant */\n actionLabel?: string;\n};\n\n/**\n * Modal component for Analytica Ensino platforms\n *\n * A flexible modal component with multiple size variants and customizable behavior.\n *\n * @param isOpen - Whether the modal is currently open\n * @param onClose - Callback function called when the modal should be closed\n * @param title - The title displayed at the top of the modal\n * @param children - The main content of the modal\n * @param size - The size variant (xs, sm, md, lg, xl)\n * @param className - Additional CSS classes for the modal content\n * @param closeOnEscape - Whether pressing Escape closes the modal (default: true)\n * @param footer - Footer content, typically action buttons\n * @param hideCloseButton - Whether to hide the X close button (default: false)\n * @returns A modal overlay with content\n *\n * @example\n * ```tsx\n * <Modal\n * isOpen={isModalOpen}\n * onClose={() => setIsModalOpen(false)}\n * title=\"Invite your team\"\n * size=\"md\"\n * footer={\n * <div className=\"flex gap-3\">\n * <Button variant=\"outline\" onClick={() => setIsModalOpen(false)}>Cancel</Button>\n * <Button variant=\"solid\" onClick={handleExplore}>Explore</Button>\n * </div>\n * }\n * >\n * Elevate user interactions with our versatile modals.\n * </Modal>\n * ```\n */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n children,\n size = 'md',\n className = '',\n closeOnEscape = true,\n footer,\n hideCloseButton = false,\n variant = 'default',\n description,\n image,\n imageAlt,\n actionLink,\n actionLabel,\n contentClassName = '',\n}: ModalProps) => {\n const titleId = useId();\n\n // Handle escape key\n useEffect(() => {\n if (!isOpen || !closeOnEscape) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, closeOnEscape, onClose]);\n\n // Handle body scroll lock and scrollbar shift fix\n useEffect(() => {\n if (!isOpen) return;\n\n // Calculate scrollbar width before hiding overflow\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n // Save original styles\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n // Apply scroll lock\n document.body.style.overflow = 'hidden';\n\n // Fix scrollbar shift: add padding to compensate for lost scrollbar\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n\n // Create overlay to cover the padding area with backdrop color\n const overlay = document.createElement('div');\n overlay.id = 'modal-scrollbar-overlay';\n overlay.style.cssText = `\n position: fixed;\n top: 0;\n right: 0;\n width: ${scrollbarWidth}px;\n height: 100vh;\n background-color: rgb(0 0 0 / 0.6);\n z-index: 40;\n pointer-events: none;\n `;\n document.body.appendChild(overlay);\n }\n\n return () => {\n // Restore original styles\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n\n // Remove overlay\n const overlay = document.getElementById('modal-scrollbar-overlay');\n if (overlay) {\n overlay.remove();\n }\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const sizeClasses = SIZE_CLASSES[size];\n const baseClasses =\n 'bg-secondary-50 rounded-3xl shadow-hard-shadow-2 border border-border-100 w-full mx-4 max-h-[calc(100dvh-2rem)] flex flex-col overflow-hidden';\n // Reset dialog default styles to prevent positioning issues\n const dialogResetClasses = 'p-0 m-0 border-none outline-none static';\n const modalClasses = cn(\n baseClasses,\n sizeClasses,\n dialogResetClasses,\n className\n );\n\n // Normalize URLs missing protocol\n const normalizeUrl = (href: string) =>\n /^https?:\\/\\//i.test(href) ? href : `https://${href}`;\n\n // Handle action link click\n const handleActionClick = () => {\n if (actionLink) {\n window.open(normalizeUrl(actionLink), '_blank', 'noopener,noreferrer');\n }\n };\n\n // Activity variant rendering\n if (variant === 'activity') {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs border-none p-0 m-0 w-full cursor-default\">\n <dialog\n className={modalClasses}\n aria-labelledby={titleId}\n aria-modal=\"true\"\n open\n >\n {/* Header simples com X */}\n <div className=\"flex justify-end p-6 pb-0\">\n {!hideCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-text-500 hover:text-text-700 hover:bg-background-50 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indicator-info focus:ring-offset-2\"\n aria-label=\"Fechar modal\"\n >\n <X size={18} />\n </button>\n )}\n </div>\n\n {/* Conteúdo centralizado */}\n <div className=\"flex flex-col items-center px-6 pb-6 gap-5 flex-1 min-h-0 overflow-y-auto\">\n {/* Imagem ilustrativa */}\n {image && (\n <div className=\"flex justify-center\">\n <img\n src={image}\n alt={imageAlt ?? ''}\n className=\"w-[122px] h-[122px] object-contain\"\n />\n </div>\n )}\n\n {/* Título */}\n <h2\n id={titleId}\n className=\"text-lg font-semibold text-text-950 text-center\"\n >\n {title}\n </h2>\n\n {/* Descrição */}\n {description && (\n <p className=\"text-sm font-normal text-text-400 text-center max-w-md leading-[21px]\">\n {description}\n </p>\n )}\n\n {/* Ação: Botão ou Vídeo Embedado */}\n {actionLink && (\n <div className=\"w-full\">\n {(() => {\n const normalized = normalizeUrl(actionLink);\n const isYT = isYouTubeUrl(normalized);\n if (!isYT) return null;\n const id = getYouTubeVideoId(normalized);\n if (!id) {\n return (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"large\"\n className=\"w-full\"\n onClick={handleActionClick}\n >\n {actionLabel || 'Iniciar Atividade'}\n </Button>\n );\n }\n return (\n <iframe\n src={getYouTubeEmbedUrl(id)}\n className=\"w-full aspect-video rounded-lg\"\n allowFullScreen\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n title=\"Vídeo YouTube\"\n />\n );\n })()}\n {!isYouTubeUrl(normalizeUrl(actionLink)) && (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"large\"\n className=\"w-full\"\n onClick={handleActionClick}\n >\n {actionLabel || 'Iniciar Atividade'}\n </Button>\n )}\n </div>\n )}\n </div>\n </dialog>\n </div>\n );\n }\n\n // Default variant rendering\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-xs border-none p-0 m-0 w-full cursor-default\">\n <dialog\n className={modalClasses}\n aria-labelledby={titleId}\n aria-modal=\"true\"\n open\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-6\">\n <h2 id={titleId} className=\"text-lg font-semibold text-text-950\">\n {title}\n </h2>\n {!hideCloseButton && (\n <button\n onClick={onClose}\n className=\"p-1 text-text-500 hover:text-text-700 hover:bg-background-50 rounded-md transition-colors focus:outline-none focus:ring-2 focus:ring-indicator-info focus:ring-offset-2\"\n aria-label=\"Fechar modal\"\n >\n <X size={18} />\n </button>\n )}\n </div>\n\n {/* Content */}\n {children && (\n <div\n className={cn(\n 'px-6 pb-6 flex-1 min-h-0 overflow-y-auto',\n contentClassName\n )}\n >\n <div\n className={cn(\n 'text-text-500 font-normal text-sm leading-6',\n contentClassName?.includes('flex') &&\n 'flex flex-col flex-1 min-h-0'\n )}\n >\n {children}\n </div>\n </div>\n )}\n\n {/* Footer */}\n {footer && (\n <div className=\"flex justify-end gap-3 px-6 pb-6\">{footer}</div>\n )}\n </dialog>\n </div>\n );\n};\n\nexport default Modal;\n","import {\n TextareaHTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n useEffect,\n useRef,\n useImperativeHandle,\n ChangeEvent,\n FocusEvent,\n} from 'react';\nimport { WarningCircle } from 'phosphor-react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * TextArea size variants\n */\ntype TextAreaSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * TextArea visual state\n */\ntype TextAreaState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations with exact pixel specifications\n */\nconst SIZE_CLASSES = {\n small: {\n textarea: 'h-24 text-sm', // 96px height, 14px font\n textSize: 'sm' as const,\n },\n medium: {\n textarea: 'h-24 text-base', // 96px height, 16px font\n textSize: 'md' as const,\n },\n large: {\n textarea: 'h-24 text-lg', // 96px height, 18px font\n textSize: 'lg' as const,\n },\n extraLarge: {\n textarea: 'h-24 text-xl', // 96px height, 20px font\n textSize: 'xl' as const,\n },\n} as const;\n\n/**\n * Base textarea styling classes using design system colors\n */\nconst BASE_TEXTAREA_CLASSES =\n 'w-full box-border p-3 bg-background border border-solid rounded-[4px] resize-none focus:outline-none font-roboto font-normal leading-[150%] placeholder:text-text-600 transition-all duration-200';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n base: 'border-border-300 bg-background text-text-600',\n hover: 'hover:border-border-400',\n focus: 'focus:border-border-500',\n },\n hovered: {\n base: 'border-border-400 bg-background text-text-600',\n hover: '',\n focus: 'focus:border-border-500',\n },\n focused: {\n base: 'border-2 border-primary-950 bg-background text-text-900',\n hover: '',\n focus: '',\n },\n invalid: {\n base: 'border-2 border-red-700 bg-white text-gray-800',\n hover: 'hover:border-red-700',\n focus: 'focus:border-red-700',\n },\n disabled: {\n base: 'border-border-300 bg-background text-text-600 cursor-not-allowed opacity-40',\n hover: '',\n focus: '',\n },\n} as const;\n\n/**\n * TextArea component props interface\n */\nexport type TextAreaProps = {\n /** Label text to display above the textarea */\n label?: ReactNode;\n /** Size variant of the textarea */\n size?: TextAreaSize;\n /** Visual state of the textarea */\n state?: TextAreaState;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Show character count when maxLength is provided */\n showCharacterCount?: boolean;\n /** Enable auto-resize based on content */\n autoResize?: boolean;\n /** Minimum height when autoResize is enabled (default: 96px) */\n minHeight?: number;\n} & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>;\n\n/**\n * TextArea component for Analytica Ensino platforms\n *\n * A textarea component with essential states, sizes and themes.\n * Uses exact design specifications with 288px width, 96px height, and specific\n * color values. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic textarea\n * <TextArea label=\"Description\" placeholder=\"Enter description...\" />\n *\n * // Small size\n * <TextArea size=\"small\" label=\"Comment\" />\n *\n * // Invalid state\n * <TextArea state=\"invalid\" label=\"Required field\" errorMessage=\"This field is required\" />\n *\n * // Disabled state\n * <TextArea disabled label=\"Read-only field\" />\n *\n * // Auto-resize textarea\n * <TextArea autoResize minHeight={200} placeholder=\"Grows with content...\" />\n * ```\n */\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n errorMessage,\n helperMessage,\n className = '',\n labelClassName = '',\n disabled,\n id,\n onChange,\n placeholder,\n required,\n showCharacterCount = false,\n maxLength,\n value,\n autoResize = false,\n minHeight = 96,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `textarea-${generatedId}`;\n\n // Internal ref for auto-resize\n const internalRef = useRef<HTMLTextAreaElement>(null);\n\n // Expose ref to parent\n useImperativeHandle(ref, () => internalRef.current as HTMLTextAreaElement);\n\n // Internal state for focus tracking\n const [isFocused, setIsFocused] = useState(false);\n\n // Calculate current character count\n const currentLength = typeof value === 'string' ? value.length : 0;\n const isNearLimit = maxLength && currentLength >= maxLength * 0.8;\n\n // Auto-resize effect\n useEffect(() => {\n if (autoResize && internalRef.current) {\n const textarea = internalRef.current;\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.max(textarea.scrollHeight, minHeight)}px`;\n }\n }, [autoResize, minHeight, value]);\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(event);\n };\n\n // Handle focus events\n const handleFocus = (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n props.onFocus?.(event);\n };\n\n // Handle blur events\n const handleBlur = (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n props.onBlur?.(event);\n };\n\n // Determine current state based on props and focus\n let currentState = disabled ? 'disabled' : state;\n\n // Override state based on focus\n if (\n isFocused &&\n currentState !== 'invalid' &&\n currentState !== 'disabled'\n ) {\n currentState = 'focused';\n }\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Get styling classes\n const stateClasses = STATE_CLASSES[currentState];\n\n // Get height classes based on autoResize\n const heightClasses = autoResize\n ? 'h-auto overflow-hidden'\n : sizeClasses.textarea;\n\n // Get font size from size classes (extract only the text size)\n const fontSizeClass =\n sizeClasses.textarea.split(' ').find((c) => c.startsWith('text-')) ??\n 'text-base';\n\n // Get final textarea classes\n const textareaClasses = cn(\n BASE_TEXTAREA_CLASSES,\n autoResize ? fontSizeClass : sizeClasses.textarea,\n heightClasses,\n stateClasses.base,\n stateClasses.hover,\n stateClasses.focus,\n className\n );\n\n return (\n <div className={`flex flex-col`}>\n {/* Label */}\n {label && (\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"medium\"\n color=\"text-text-950\"\n className={cn('mb-1.5', labelClassName)}\n >\n {label}{' '}\n {required && <span className=\"text-indicator-error\">*</span>}\n </Text>\n )}\n\n {/* Textarea */}\n <textarea\n ref={internalRef}\n id={inputId}\n disabled={disabled}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className={textareaClasses}\n placeholder={placeholder}\n required={required}\n maxLength={maxLength}\n value={value}\n {...props}\n />\n\n {/* Error message */}\n {errorMessage && (\n <p className=\"flex gap-1 items-center text-sm text-indicator-error mt-1.5\">\n <WarningCircle size={16} /> {errorMessage}\n </p>\n )}\n\n {/* Helper text or Character count */}\n {!errorMessage && showCharacterCount && maxLength && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className={`mt-1.5 ${isNearLimit ? 'text-indicator-warning' : 'text-text-500'}`}\n >\n {currentLength}/{maxLength} caracteres\n </Text>\n )}\n {!errorMessage &&\n helperMessage &&\n !(showCharacterCount && maxLength) && (\n <Text size=\"sm\" weight=\"normal\" className=\"mt-1.5 text-text-500\">\n {helperMessage}\n </Text>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea';\n\nexport default TextArea;\n","export { SimulationsPage } from './SimulationsPage';\nexport type { SimulationsPageProps } from './SimulationsPage';\nexport { SimulationsDetailModal } from './SimulationsDetailModal';\nexport type { SimulationsDetailModalProps } from './SimulationsDetailModal';\n","import { useCallback, useMemo, useState } from 'react';\nimport { UserCircle } from 'phosphor-react';\nimport { PageContainer } from '../PageContainer/PageContainer';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport { TableProvider } from '../TableProvider';\nimport type { ColumnConfig, TableParams } from '../TableProvider';\nimport type { FilterConfig } from '../Filter/useTableFilter';\nimport { useUserAccessData } from '../SimulatedFilters/hooks';\nimport type { BaseApiClient } from '../../types/api';\nimport { createUseSimulations } from '../../hooks/useSimulations';\nimport type { SimulationsStudentItem } from '../../types/simulations';\nimport { SimulationsDetailModal } from './SimulationsDetailModal';\n\nexport interface SimulationsPageProps {\n /** API client used to fetch students and simulations */\n readonly api: BaseApiClient;\n /** Image shown when a search returns no results */\n readonly noSearchImage?: string;\n}\n\nconst DEFAULT_LIMIT = 10;\n\n/**\n * Teacher-facing simulations page: a paginated list of students with how many\n * simulations each answered, plus a \"Ver simulados\" action that opens a nested\n * detail modal.\n */\nexport function SimulationsPage({ api, noSearchImage }: SimulationsPageProps) {\n const useSimulations = useMemo(() => createUseSimulations(api), [api]);\n const { fetchStudents } = useSimulations();\n const { classes } = useUserAccessData(api);\n\n const [students, setStudents] = useState<SimulationsStudentItem[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [selected, setSelected] = useState<{\n userInstitutionId: string;\n name: string;\n } | null>(null);\n\n // Build a single-category \"Turma\" filter so the TableProvider's native filter\n // modal handles multi-selection. The category key is `classIds`, so the\n // selected ids surface in TableParams as `params.classIds`.\n const initialFilters = useMemo<FilterConfig[]>(\n () => [\n {\n key: 'turma',\n label: 'Turma',\n categories: [\n {\n key: 'classIds',\n label: 'Turma',\n selectedIds: [],\n itens: classes.map((c) => ({ id: c.id, name: c.name })),\n },\n ],\n },\n ],\n [classes]\n );\n\n const handleParamsChange = useCallback(\n (params: TableParams) => {\n const classIds = Array.isArray(params.classIds)\n ? (params.classIds as string[])\n : undefined;\n setLoading(true);\n fetchStudents({\n page: params.page,\n limit: params.limit,\n search: params.search?.trim() || undefined,\n classIds: classIds?.length ? classIds : undefined,\n })\n .then((result) => {\n setStudents(result.data);\n setTotal(result.total);\n })\n .catch(() => {\n setStudents([]);\n setTotal(0);\n })\n .finally(() => setLoading(false));\n },\n [fetchStudents]\n );\n\n const columns = useMemo<ColumnConfig<SimulationsStudentItem>[]>(\n () => [\n {\n key: 'name',\n label: 'Estudante',\n render: (_value, row) => (\n <span className=\"flex items-center gap-2\">\n <UserCircle size={24} weight=\"fill\" className=\"text-info-700\" />\n <Text size=\"sm\" className=\"text-text-950\">\n {row.name}\n </Text>\n </span>\n ),\n },\n {\n key: 'class',\n label: 'Turma',\n render: (_value, row) => (\n <Text size=\"sm\" className=\"text-text-900\">\n {row.class ?? '-'}\n </Text>\n ),\n },\n {\n key: 'simulationsCount',\n label: 'Simulados',\n render: (_value, row) => (\n <Text size=\"sm\" className=\"text-text-900\">\n {row.simulationsCount}\n </Text>\n ),\n },\n {\n key: 'actions',\n label: '',\n render: (_value, row) => (\n <div className=\"flex justify-end\">\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={() =>\n setSelected({\n userInstitutionId: row.userInstitutionId,\n name: row.name,\n })\n }\n >\n Ver simulados\n </Button>\n </div>\n ),\n },\n ],\n []\n );\n\n return (\n <PageContainer innerClassName=\"max-w-[1150px]\">\n <div className=\"mb-4 flex flex-col gap-1\">\n <Text size=\"2xl\" weight=\"bold\" className=\"text-text-950\">\n Simulados\n </Text>\n <Text size=\"sm\" className=\"text-text-600\">\n Veja o resultado de todos os simulados realizados por cada estudante\n </Text>\n </div>\n\n <TableProvider<SimulationsStudentItem>\n data={students}\n headers={columns}\n loading={loading}\n variant=\"borderless\"\n enableSearch\n enableFilters\n enablePagination\n initialFilters={initialFilters}\n rowKey=\"userInstitutionId\"\n searchPlaceholder=\"Buscar estudante\"\n onParamsChange={handleParamsChange}\n paginationConfig={{\n itemLabel: 'estudantes',\n itemsPerPageOptions: [10, 20, 50],\n defaultItemsPerPage: DEFAULT_LIMIT,\n totalItems: total,\n }}\n noSearchResultState={{ image: noSearchImage }}\n />\n\n <SimulationsDetailModal\n api={api}\n isOpen={selected !== null}\n onClose={() => setSelected(null)}\n student={selected}\n />\n </PageContainer>\n );\n}\n","import { ReactNode } from 'react';\nimport { cn } from '../../utils/utils';\n\nexport interface PageContainerProps {\n /** Conteudo da pagina renderizado dentro do container interno */\n children: ReactNode;\n /** Classes CSS adicionais aplicadas ao container externo (wrapper full-width) */\n className?: string;\n /**\n * Classes CSS adicionais aplicadas ao container interno (limita a largura).\n * Use para sobrescrever a `max-w-[1000px]` padrao em projetos que precisam\n * de uma largura diferente. Ex.: `innerClassName=\"max-w-[1150px]\"`.\n * Tailwind-merge resolve o conflito mantendo apenas o ultimo `max-w-*`.\n */\n innerClassName?: string;\n}\n\nexport function PageContainer({\n children,\n className,\n innerClassName,\n}: Readonly<PageContainerProps>) {\n return (\n <div\n className={cn(\n 'flex flex-col w-full min-h-full items-center pb-5 relative',\n className\n )}\n >\n <div\n className={cn(\n 'flex flex-col w-full max-w-[1000px] lg:px-0 px-4',\n innerClassName\n )}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport default PageContainer;\n","import {\n useState,\n useEffect,\n useMemo,\n useCallback,\n ReactNode,\n ChangeEvent,\n} from 'react';\nimport Table, {\n TableBody,\n TableHead,\n TableRow,\n TableCell,\n useTableSort,\n TablePagination,\n} from '../Table/Table';\nimport { useTableFilter, FilterConfig } from '../Filter/useTableFilter';\nimport Search from '../Search/Search';\nimport { FilterModal } from '../Filter/FilterModal';\nimport Button from '../Button/Button';\nimport { Funnel } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Column configuration with flexible rendering options\n */\nexport interface ColumnConfig<T = Record<string, unknown>> {\n /** Column key (must match data object key) */\n key: string;\n /** Column label - can be string or JSX */\n label: string | ReactNode;\n /** Enable sorting for this column */\n sortable?: boolean;\n /** Custom render function for cell content */\n render?: (value: unknown, row: T, index: number) => ReactNode;\n /** Column width */\n width?: string;\n /** Additional CSS classes */\n className?: string;\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * Combined parameters sent via onParamsChange\n */\nexport interface TableParams {\n /** Current page number */\n page: number;\n /** Items per page */\n limit: number;\n /** Search query */\n search?: string;\n /** Active filters (dynamic keys based on filter configs) */\n [key: string]: unknown;\n /** Sort column */\n sortBy?: string;\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Pagination configuration\n */\nexport interface PaginationConfig {\n /** Label for items (e.g., \"atividades\") */\n itemLabel?: string;\n /** Items per page options */\n itemsPerPageOptions?: number[];\n /** Default items per page */\n defaultItemsPerPage?: number;\n /** Total items (for displaying pagination info) */\n totalItems?: number;\n /** Total pages (if known from backend) */\n totalPages?: number;\n}\n\n/**\n * Empty state configuration\n */\nexport interface EmptyStateConfig {\n /** Custom component to render when table is empty (no data and no search active) */\n component?: ReactNode;\n /** Image to display in empty state (path from project) */\n image?: string;\n /** Title text for empty state */\n title?: string;\n /** Description text for empty state */\n description?: string;\n /** Button text for empty state action (optional) */\n buttonText?: string;\n /** Icon to display on button (optional) */\n buttonIcon?: ReactNode;\n /** Callback when empty state button is clicked */\n onButtonClick?: () => void;\n /** Button variant (solid, outline, or link) */\n buttonVariant?: 'solid' | 'outline' | 'link';\n /** Button action color (primary, positive, or negative) */\n buttonAction?: 'primary' | 'positive' | 'negative';\n}\n\n/**\n * Loading state configuration\n */\nexport interface LoadingStateConfig {\n /** Custom component to render when table is loading */\n component?: ReactNode;\n}\n\n/**\n * No search result state configuration\n */\nexport interface NoSearchResultConfig {\n /** Custom component to render when search returns no results */\n component?: ReactNode;\n /** Title for no search result state */\n title?: string;\n /** Description for no search result state */\n description?: string;\n /** Image to display in no search result state */\n image?: string;\n}\n\n/**\n * Table components exposed via render prop\n */\nexport interface TableComponents {\n /** Search and filter controls */\n controls: ReactNode;\n /** Table with data */\n table: ReactNode;\n /** Pagination controls */\n pagination: ReactNode;\n}\n\n/**\n * TableProvider Props\n */\nexport interface TableProviderProps<T = Record<string, unknown>> {\n /** Data to display in the table */\n readonly data: T[];\n /** Column configurations */\n readonly headers: ColumnConfig<T>[];\n /** Loading state */\n readonly loading?: boolean;\n /** Table variant */\n readonly variant?: 'default' | 'borderless';\n\n /** Enable search functionality */\n readonly enableSearch?: boolean;\n /** Enable filters functionality */\n readonly enableFilters?: boolean;\n /** Enable table sorting */\n readonly enableTableSort?: boolean;\n /** Enable pagination */\n readonly enablePagination?: boolean;\n /** Enable row click functionality */\n readonly enableRowClick?: boolean;\n\n /** Initial filter configurations */\n readonly initialFilters?: FilterConfig[];\n /** Pagination configuration */\n readonly paginationConfig?: PaginationConfig;\n /** Search placeholder text */\n readonly searchPlaceholder?: string;\n /** Additional CSS classes for the search container */\n readonly searchContainerClassName?: string;\n /** Empty state configuration (when table is empty with no search) */\n readonly emptyState?: EmptyStateConfig;\n /** Loading state configuration (when table is loading) */\n readonly loadingState?: LoadingStateConfig;\n /** No search result state configuration (when search returns no results) */\n readonly noSearchResultState?: NoSearchResultConfig;\n /** Key field name to use for unique row identification (recommended for better performance) */\n readonly rowKey?: keyof T;\n\n /** Callback when any parameter changes */\n readonly onParamsChange?: (params: TableParams) => void;\n /** Callback when row is clicked */\n readonly onRowClick?: (row: T, index: number) => void;\n\n /**\n * Content to display in the header area (e.g., action buttons)\n * Rendered above the search/filter controls\n */\n readonly headerContent?: ReactNode;\n\n /**\n * Additional CSS classes for the container wrapper\n */\n readonly containerClassName?: string;\n\n /**\n * Render prop for custom layout control\n * When provided, gives full control over component positioning\n * @param components - Table components (controls, table, pagination)\n * @returns Custom layout JSX\n *\n * @example\n * ```tsx\n * <TableProvider {...props}>\n * {({ controls, table, pagination }) => (\n * <>\n * <div className=\"mb-4\">{controls}</div>\n * <div className=\"bg-white p-6\">\n * {table}\n * {pagination}\n * </div>\n * </>\n * )}\n * </TableProvider>\n * ```\n */\n readonly children?: (components: TableComponents) => ReactNode;\n}\n\n/**\n * TableProvider - Self-contained table component with search, filters, sorting, and pagination\n *\n * @example\n * ```tsx\n * <TableProvider\n * data={activities}\n * headers={[\n * { key: 'title', label: 'Título', sortable: true },\n * { key: 'status', label: 'Status', render: (value) => <Badge>{value}</Badge> }\n * ]}\n * loading={loading}\n * variant=\"borderless\"\n * enableSearch\n * enableFilters\n * enableTableSort\n * enablePagination\n * enableRowClick\n * initialFilters={filterConfigs}\n * paginationConfig={{ itemLabel: 'atividades' }}\n * onParamsChange={handleParamsChange}\n * onRowClick={handleRowClick}\n * />\n * ```\n */\nexport function TableProvider<T extends Record<string, unknown>>({\n data,\n headers,\n loading = false,\n variant = 'default',\n enableSearch = false,\n enableFilters = false,\n enableTableSort = false,\n enablePagination = false,\n enableRowClick = false,\n initialFilters = [],\n paginationConfig = {},\n searchPlaceholder = 'Buscar...',\n searchContainerClassName,\n emptyState,\n loadingState,\n noSearchResultState,\n rowKey,\n onParamsChange,\n onRowClick,\n headerContent,\n containerClassName,\n children,\n}: TableProviderProps<T>) {\n // Search state\n const [searchQuery, setSearchQuery] = useState('');\n const [inputValue, setInputValue] = useState('');\n\n // Sorting state - always call hook (React Rules of Hooks)\n const sortResultRaw = useTableSort(data, { syncWithUrl: true });\n const sortResult = enableTableSort\n ? sortResultRaw\n : {\n sortedData: data,\n sortColumn: null,\n sortDirection: null,\n handleSort: () => {},\n };\n\n const { sortedData, sortColumn, sortDirection, handleSort } = sortResult;\n\n // Filter state - always call hook (React Rules of Hooks)\n const filterResultRaw = useTableFilter(initialFilters, { syncWithUrl: true });\n\n // Memoize disabled filter result to prevent recreating object on every render\n const disabledFilterResult = useMemo(\n () => ({\n filterConfigs: [],\n activeFilters: {},\n hasActiveFilters: false,\n activeFiltersCount: 0,\n updateFilters: () => {},\n applyFilters: () => {},\n clearFilters: () => {},\n }),\n []\n );\n\n const filterResult = enableFilters ? filterResultRaw : disabledFilterResult;\n\n const {\n filterConfigs,\n activeFilters,\n activeFiltersCount,\n updateFilters,\n applyFilters,\n clearFilters,\n } = filterResult;\n\n // Pagination state (only if enabled)\n const {\n defaultItemsPerPage = 10,\n itemsPerPageOptions = [10, 20, 50, 100],\n itemLabel = 'itens',\n totalItems,\n totalPages,\n } = paginationConfig;\n\n const [currentPage, setCurrentPage] = useState(1);\n const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);\n\n // Filter modal state\n const [isFilterModalOpen, setIsFilterModalOpen] = useState(false);\n\n // Combine all parameters\n const combinedParams = useMemo((): TableParams => {\n const params: TableParams = {\n page: currentPage,\n limit: itemsPerPage,\n };\n\n if (enableSearch && searchQuery) {\n params.search = searchQuery;\n }\n\n if (enableFilters) {\n Object.assign(params, activeFilters);\n }\n\n if (enableTableSort && sortColumn && sortDirection) {\n params.sortBy = sortColumn;\n params.sortOrder = sortDirection;\n }\n\n return params;\n }, [\n currentPage,\n itemsPerPage,\n searchQuery,\n activeFilters,\n sortColumn,\n sortDirection,\n enableSearch,\n enableFilters,\n enableTableSort,\n ]);\n\n // Notify parent when parameters change\n // Note: onParamsChange is omitted from dependencies intentionally to prevent infinite loops\n useEffect(() => {\n onParamsChange?.(combinedParams);\n }, [combinedParams]);\n\n // Handle search changes\n const handleSearchChange = useCallback((value: string) => {\n setSearchQuery(value);\n setCurrentPage(1); // Reset to first page on search\n }, []);\n\n const handleInputChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n }, []);\n\n // Handle filter apply\n const handleFilterApply = useCallback(() => {\n applyFilters();\n setIsFilterModalOpen(false);\n setCurrentPage(1); // Reset to first page on filter\n }, [applyFilters]);\n\n // Handle pagination change\n const handlePageChange = useCallback((page: number) => {\n setCurrentPage(page);\n }, []);\n\n const handleItemsPerPageChange = useCallback((items: number) => {\n setItemsPerPage(items);\n setCurrentPage(1); // Reset to first page when changing items per page\n }, []);\n\n // Handle row click\n const handleRowClickInternal = useCallback(\n (row: T, index: number) => {\n if (enableRowClick && onRowClick) {\n onRowClick(row, index);\n }\n },\n [enableRowClick, onRowClick]\n );\n\n // Detect if pagination should be managed internally\n const useInternalPagination = useMemo(\n () =>\n enablePagination &&\n !onParamsChange &&\n totalItems === undefined &&\n totalPages === undefined,\n [enablePagination, onParamsChange, totalItems, totalPages]\n );\n\n // Calculate total pages from data if not provided\n const calculatedTotalPages =\n totalPages ??\n Math.ceil(\n (totalItems ??\n (useInternalPagination ? sortedData.length : data.length)) /\n itemsPerPage\n );\n const calculatedTotalItems =\n totalItems ?? (useInternalPagination ? sortedData.length : data.length);\n\n // Apply pagination to data when managed internally\n const displayData = useMemo(() => {\n if (!useInternalPagination) {\n return sortedData;\n }\n\n const start = (currentPage - 1) * itemsPerPage;\n return sortedData.slice(start, start + itemsPerPage);\n }, [useInternalPagination, sortedData, currentPage, itemsPerPage]);\n\n // Empty state check\n const isEmpty = data.length === 0;\n\n // Calculate state control booleans - Table is responsible for rendering, TableProvider controls WHEN\n const showLoading = loading;\n const showNoSearchResult =\n !loading && data.length === 0 && searchQuery.trim() !== '';\n const showEmpty = !loading && data.length === 0 && searchQuery.trim() === '';\n\n // Extract components for render prop pattern\n const controls = (enableSearch || enableFilters) && (\n <div className=\"flex items-center gap-4\">\n {/* Filter Button */}\n {enableFilters && (\n <Button\n variant=\"outline\"\n size=\"medium\"\n onClick={() => setIsFilterModalOpen(true)}\n >\n <Funnel size={20} />\n Filtros\n {activeFiltersCount > 0 && (\n <span className=\"ml-2 rounded-full bg-primary-500 px-2 py-0.5 text-xs text-white\">\n {activeFiltersCount}\n </span>\n )}\n </Button>\n )}\n\n {/* Search */}\n {enableSearch && (\n <div\n className={cn('flex-1 flex justify-end', searchContainerClassName)}\n >\n <Search\n value={inputValue}\n onChange={handleInputChange}\n onSearch={handleSearchChange}\n onClear={() => {\n setInputValue('');\n handleSearchChange('');\n }}\n options={[]}\n placeholder={searchPlaceholder}\n debounceMs={300}\n />\n </div>\n )}\n </div>\n );\n\n // Header with content and controls\n const headerSection = (headerContent || controls) && (\n <div className=\"flex flex-col lg:flex-row items-stretch lg:items-center justify-between gap-4\">\n {/* Header Content (e.g., action buttons) */}\n {headerContent && <div>{headerContent}</div>}\n\n {/* Controls (search and filters) */}\n {controls && <div className=\"flex-1 lg:flex-none\">{controls}</div>}\n </div>\n );\n\n const table = (\n <div className=\"w-full overflow-x-auto\">\n <Table\n variant={variant}\n showLoading={showLoading}\n loadingState={loadingState}\n showNoSearchResult={showNoSearchResult}\n noSearchResultState={noSearchResultState}\n showEmpty={showEmpty}\n emptyState={emptyState}\n >\n {/* Table Header */}\n <thead>\n <TableRow\n variant={variant === 'borderless' ? 'defaultBorderless' : 'default'}\n >\n {headers.map((header, index) => (\n <TableHead\n key={`header-${header.key}-${index}`}\n sortable={enableTableSort && header.sortable}\n sortDirection={\n enableTableSort && sortColumn === header.key\n ? sortDirection\n : null\n }\n onSort={() =>\n enableTableSort && header.sortable && handleSort(header.key)\n }\n className={header.className}\n style={header.width ? { width: header.width } : undefined}\n >\n {header.label}\n </TableHead>\n ))}\n </TableRow>\n </thead>\n\n {/* Table Body */}\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={headers.length} className=\"text-center py-8\">\n <span className=\"text-text-400 text-sm\">Carregando...</span>\n </TableCell>\n </TableRow>\n ) : (\n displayData.map((row, rowIndex) => {\n // Calculate effective index for row click and keys\n const effectiveIndex = useInternalPagination\n ? (currentPage - 1) * itemsPerPage + rowIndex\n : rowIndex;\n\n const rowKeyValue = rowKey\n ? (() => {\n const keyValue = row[rowKey];\n if (keyValue === null || keyValue === undefined) {\n return `row-${effectiveIndex}`;\n }\n if (typeof keyValue === 'object') {\n return JSON.stringify(keyValue);\n }\n return String(keyValue);\n })()\n : `row-${effectiveIndex}`;\n return (\n <TableRow\n key={rowKeyValue}\n variant={\n variant === 'borderless' ? 'defaultBorderless' : 'default'\n }\n clickable={enableRowClick}\n onClick={() => handleRowClickInternal(row, effectiveIndex)}\n >\n {headers.map((header, cellIndex) => {\n const value = row[header.key];\n\n let defaultContent = '';\n\n if (value !== null && value !== undefined) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n // Only convert primitives directly to string\n defaultContent = String(value);\n } else if (typeof value === 'object') {\n // Serialize objects and arrays with JSON\n defaultContent = JSON.stringify(value);\n } else if (typeof value === 'function') {\n // Handle functions - don't expose function code\n defaultContent = '[Function]';\n } else if (typeof value === 'symbol') {\n // Handle symbols\n defaultContent = String(value);\n }\n // All possible types covered - no else needed\n }\n\n const content = header.render\n ? header.render(value, row, effectiveIndex)\n : defaultContent;\n\n return (\n <TableCell\n key={`cell-${effectiveIndex}-${cellIndex}`}\n className={header.className}\n style={{\n textAlign: header.align,\n }}\n >\n {content}\n </TableCell>\n );\n })}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n );\n\n const pagination = enablePagination && !isEmpty && (\n <div className=\"flex justify-end\">\n <TablePagination\n currentPage={currentPage}\n totalPages={calculatedTotalPages}\n totalItems={calculatedTotalItems}\n itemsPerPage={itemsPerPage}\n itemsPerPageOptions={itemsPerPageOptions}\n onPageChange={handlePageChange}\n onItemsPerPageChange={handleItemsPerPageChange}\n itemLabel={itemLabel}\n />\n </div>\n );\n\n // If children prop provided, use render props pattern\n if (children) {\n return (\n <>\n {children({\n controls: headerSection || controls || null,\n table,\n pagination,\n })}\n {/* Filter Modal */}\n {enableFilters && (\n <FilterModal\n isOpen={isFilterModalOpen}\n onClose={() => setIsFilterModalOpen(false)}\n filterConfigs={filterConfigs}\n onFiltersChange={updateFilters}\n onApply={handleFilterApply}\n onClear={clearFilters}\n />\n )}\n </>\n );\n }\n\n // Default layout (backward compatible)\n const wrapperClassName = containerClassName || 'w-full space-y-4';\n return (\n <div className={wrapperClassName}>\n {headerSection}\n {table}\n {pagination}\n\n {/* Filter Modal */}\n {enableFilters && (\n <FilterModal\n isOpen={isFilterModalOpen}\n onClose={() => setIsFilterModalOpen(false)}\n filterConfigs={filterConfigs}\n onFiltersChange={updateFilters}\n onApply={handleFilterApply}\n onClear={clearFilters}\n />\n )}\n </div>\n );\n}\n\nexport default TableProvider;\n","import React, {\n forwardRef,\n HTMLAttributes,\n TdHTMLAttributes,\n ThHTMLAttributes,\n useState,\n useMemo,\n useEffect,\n Children,\n isValidElement,\n ReactNode,\n} from 'react';\nimport { cn } from '../../utils/utils';\nimport { CaretUp, CaretDown } from 'phosphor-react';\nimport NoSearchResult from '../NoSearchResult/NoSearchResult';\nimport EmptyState from '../EmptyState/EmptyState';\nimport { SkeletonTable } from '../Skeleton/Skeleton';\nimport type {\n EmptyStateConfig,\n LoadingStateConfig,\n NoSearchResultConfig,\n} from '../TableProvider/TableProvider';\n\ntype TableVariant = 'default' | 'borderless';\ntype TableRowState = 'default' | 'selected' | 'invalid' | 'disabled';\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface UseTableSortOptions {\n /** Se true, sincroniza o estado de ordenação com os parâmetros da URL */\n syncWithUrl?: boolean;\n}\n\n/**\n * Hook para gerenciar ordenação de dados da tabela\n *\n * @param data - Array de dados a serem ordenados\n * @param options - Opções de configuração do hook\n * @returns Objeto com dados ordenados, coluna/direção atual e função de sort\n *\n * @example\n * ```tsx\n * const activities = [\n * { id: 1, name: 'Task A', date: '2024-01-01' },\n * { id: 2, name: 'Task B', date: '2024-01-02' },\n * ];\n *\n * // Sem sincronização com URL\n * const { sortedData, sortColumn, sortDirection, handleSort } = useTableSort(activities);\n *\n * // Com sincronização com URL\n * const { sortedData, sortColumn, sortDirection, handleSort } = useTableSort(activities, { syncWithUrl: true });\n *\n * <TableHead\n * sortDirection={sortColumn === 'name' ? sortDirection : null}\n * onSort={() => handleSort('name')}\n * >\n * Name\n * </TableHead>\n * ```\n */\nexport function useTableSort<T extends Record<string, unknown>>(\n data: T[],\n options: UseTableSortOptions = {}\n) {\n const { syncWithUrl = false } = options;\n\n // Inicializar estado a partir da URL se syncWithUrl estiver habilitado\n const getInitialState = () => {\n if (!syncWithUrl || globalThis.window === undefined) {\n return { column: null, direction: null };\n }\n\n const params = new URLSearchParams(globalThis.location.search);\n const sortBy = params.get('sortBy');\n const sort = params.get('sort');\n\n if (sortBy && sort && (sort === 'ASC' || sort === 'DESC')) {\n return {\n column: sortBy,\n direction: sort.toLowerCase() as SortDirection,\n };\n }\n\n return { column: null, direction: null };\n };\n\n const initialState = getInitialState();\n const [sortColumn, setSortColumn] = useState<string | null>(\n initialState.column\n );\n const [sortDirection, setSortDirection] = useState<SortDirection>(\n initialState.direction\n );\n\n // Atualizar URL quando o estado de ordenação mudar\n useEffect(() => {\n if (!syncWithUrl || globalThis.window === undefined) return;\n\n const url = new URL(globalThis.location.href);\n const params = url.searchParams;\n\n if (sortColumn && sortDirection) {\n params.set('sortBy', sortColumn);\n params.set('sort', sortDirection.toUpperCase());\n } else {\n params.delete('sortBy');\n params.delete('sort');\n }\n\n // Atualizar URL sem recarregar a página\n globalThis.history.replaceState({}, '', url.toString());\n }, [sortColumn, sortDirection, syncWithUrl]);\n\n const handleSort = (column: string) => {\n if (sortColumn === column) {\n if (sortDirection === 'asc') {\n setSortDirection('desc');\n } else if (sortDirection === 'desc') {\n setSortColumn(null);\n setSortDirection(null);\n }\n } else {\n setSortColumn(column);\n setSortDirection('asc');\n }\n };\n\n const sortedData = useMemo(() => {\n if (!sortColumn || !sortDirection) {\n return data;\n }\n\n return [...data].sort((a, b) => {\n const aValue = a[sortColumn as keyof T];\n const bValue = b[sortColumn as keyof T];\n\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n const comparison = aValue.localeCompare(bValue);\n return sortDirection === 'asc' ? comparison : -comparison;\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return sortDirection === 'asc' ? aValue - bValue : bValue - aValue;\n }\n\n return 0;\n });\n }, [data, sortColumn, sortDirection]);\n\n return { sortedData, sortColumn, sortDirection, handleSort };\n}\n\ninterface TableProps extends HTMLAttributes<HTMLTableElement> {\n variant?: TableVariant;\n\n /** Show loading state (controlled by TableProvider) */\n showLoading?: boolean;\n /** Loading state configuration */\n loadingState?: LoadingStateConfig;\n\n /** Show no search result state (controlled by TableProvider) */\n showNoSearchResult?: boolean;\n /** No search result state configuration */\n noSearchResultState?: NoSearchResultConfig;\n\n /** Show empty state (controlled by TableProvider) */\n showEmpty?: boolean;\n /** Empty state configuration */\n emptyState?: EmptyStateConfig;\n}\n\ninterface TableRowProps extends HTMLAttributes<HTMLTableRowElement> {\n state?: TableRowState;\n}\n\n/**\n * Renders the table header and caption from children\n */\nconst renderHeaderElements = (children: ReactNode) => {\n return Children.map(children, (child) => {\n if (\n isValidElement(child) &&\n (child.type === TableCaption || child.type === TableHeader)\n ) {\n return child;\n }\n return null;\n });\n};\n\n/**\n * Gets no search result content based on configuration\n */\nconst getNoSearchResultContent = (\n config: NoSearchResultConfig,\n defaultTitle: string,\n defaultDescription: string\n) => {\n if (config.component) {\n return config.component;\n }\n\n if (config.image) {\n return (\n <NoSearchResult\n image={config.image}\n title={config.title || defaultTitle}\n description={config.description || defaultDescription}\n />\n );\n }\n\n return (\n <div className=\"text-center\">\n <p className=\"text-text-600 text-lg font-semibold mb-2\">\n {config.title || defaultTitle}\n </p>\n <p className=\"text-text-500 text-sm\">\n {config.description || defaultDescription}\n </p>\n </div>\n );\n};\n\n/**\n * Gets empty state content based on configuration\n */\nconst getEmptyStateContent = (\n config: EmptyStateConfig | undefined,\n defaultTitle: string,\n defaultDescription: string\n) => {\n if (config?.component) {\n return config.component;\n }\n\n return (\n <EmptyState\n image={config?.image}\n title={config?.title || defaultTitle}\n description={config?.description || defaultDescription}\n buttonText={config?.buttonText}\n buttonIcon={config?.buttonIcon}\n onButtonClick={config?.onButtonClick}\n buttonVariant={config?.buttonVariant}\n buttonAction={config?.buttonAction}\n />\n );\n};\n\n/**\n * Renders table wrapper with header and state content\n */\nconst renderTableWrapper = (\n variant: TableVariant,\n tableRef: React.Ref<HTMLTableElement>,\n className: string | undefined,\n children: ReactNode,\n stateContent: ReactNode,\n tableProps: HTMLAttributes<HTMLTableElement>\n) => {\n return (\n <div\n className={cn(\n 'relative w-full overflow-x-auto',\n variant === 'default' && 'border border-border-200 rounded-xl'\n )}\n >\n <table\n ref={tableRef}\n className={cn(\n 'analytica-table w-full caption-bottom text-sm border-separate border-spacing-0',\n className\n )}\n {...tableProps}\n >\n {renderHeaderElements(children)}\n </table>\n <div className=\"py-8 flex justify-center\">{stateContent}</div>\n </div>\n );\n};\n\nconst Table = forwardRef<HTMLTableElement, TableProps>(\n (\n {\n variant = 'default',\n className,\n children,\n showLoading = false,\n loadingState,\n showNoSearchResult = false,\n noSearchResultState,\n showEmpty = false,\n emptyState,\n ...props\n },\n ref\n ) => {\n // Default configurations\n const defaultNoSearchResultState: NoSearchResultConfig = {\n title: 'Nenhum resultado encontrado',\n description:\n 'Não encontramos nenhum resultado com esse nome. Tente revisar a busca ou usar outra palavra-chave.',\n };\n\n const defaultEmptyState: EmptyStateConfig = {\n title: 'Nenhum dado disponível',\n description: 'Não há dados para exibir no momento.',\n };\n\n const finalNoSearchResultState =\n noSearchResultState || defaultNoSearchResultState;\n const finalEmptyState = emptyState || defaultEmptyState;\n\n // Render Loading State FIRST (highest priority)\n if (showLoading) {\n const loadingContent = loadingState?.component || (\n <SkeletonTable rows={5} columns={4} showHeader={false} />\n );\n return renderTableWrapper(\n variant,\n ref,\n className,\n children,\n loadingContent,\n props\n );\n }\n\n // Render NoSearchResult outside table\n if (showNoSearchResult) {\n const noSearchContent = getNoSearchResultContent(\n finalNoSearchResultState,\n defaultNoSearchResultState.title || '',\n defaultNoSearchResultState.description || ''\n );\n return renderTableWrapper(\n variant,\n ref,\n className,\n children,\n noSearchContent,\n props\n );\n }\n\n // Render Empty State outside table (same pattern as NoSearchResult)\n if (showEmpty) {\n const emptyContent = getEmptyStateContent(\n finalEmptyState,\n defaultEmptyState.title || 'Nenhum dado disponível',\n defaultEmptyState.description || 'Não há dados para exibir no momento.'\n );\n return renderTableWrapper(\n variant,\n ref,\n className,\n children,\n emptyContent,\n props\n );\n }\n\n return (\n <div\n className={cn(\n 'relative w-full overflow-x-auto',\n variant === 'default' && 'border border-border-200 rounded-xl'\n )}\n >\n <table\n ref={ref}\n className={cn(\n variant === 'default' && 'analytica-table',\n variant === 'default' && 'border-separate border-spacing-0',\n 'w-full caption-bottom text-sm',\n className\n )}\n {...props}\n >\n {/* Render fallback caption only if no TableCaption provided */}\n {!Children.toArray(children).some(\n (child) => isValidElement(child) && child.type === TableCaption\n ) && <caption className=\"sr-only\">My Table</caption>}\n {children}\n </table>\n </div>\n );\n }\n);\n\nTable.displayName = 'Table';\n\nconst TableHeader = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn('[&_tr:first-child]:border-0', className)}\n {...props}\n />\n));\nTableHeader.displayName = 'TableHeader';\n\ninterface TableBodyProps extends HTMLAttributes<HTMLTableSectionElement> {\n variant?: TableVariant;\n}\n\nconst TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, variant = 'default', ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\n '[&_tr:last-child]:border-border-200',\n variant === 'default' && 'border-t border-border-200',\n className\n )}\n {...props}\n />\n )\n);\nTableBody.displayName = 'TableBody';\n\ninterface TableFooterProps extends HTMLAttributes<HTMLTableSectionElement> {\n variant?: TableVariant;\n}\n\nconst TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ variant = 'default', className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'bg-background-50 font-medium [&>tr]:last:border-b-0 px-6 py-3.5',\n variant === 'default' && 'border-t border-border-200',\n className\n )}\n {...props}\n />\n )\n);\nTableFooter.displayName = 'TableFooter';\n\nconst VARIANT_STATES_ROW = {\n default: {\n default: 'border border-border-200',\n defaultBorderless: 'border-b border-border-200',\n borderless: '',\n },\n selected: {\n default: 'border-b-2 border-indicator-primary',\n defaultBorderless: 'border-b border-indicator-primary',\n borderless: 'bg-indicator-primary/10',\n },\n invalid: {\n default: 'border-b-2 border-indicator-error',\n defaultBorderless: 'border-b border-indicator-error',\n borderless: 'bg-indicator-error/10',\n },\n disabled: {\n default:\n 'border-b border-border-100 bg-background-50 opacity-50 cursor-not-allowed',\n defaultBorderless:\n 'border-b border-border-100 bg-background-50 opacity-50 cursor-not-allowed',\n borderless: 'bg-background-50 opacity-50 cursor-not-allowed',\n },\n} as const;\n\ninterface TableRowPropsExtended extends TableRowProps {\n variant?: TableVariant | 'defaultBorderless';\n clickable?: boolean;\n}\n\nconst TableRow = forwardRef<HTMLTableRowElement, TableRowPropsExtended>(\n (\n {\n variant = 'default',\n state = 'default',\n clickable = false,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <tr\n ref={ref}\n className={cn(\n 'transition-colors',\n state === 'disabled' ? '' : 'hover:bg-muted/50',\n state === 'disabled' || !clickable ? '' : 'cursor-pointer',\n VARIANT_STATES_ROW[state][variant],\n className\n )}\n aria-disabled={state === 'disabled'}\n {...props}\n />\n );\n }\n);\nTableRow.displayName = 'TableRow';\n\ninterface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {\n /** Enable sorting on this column (default: true) */\n sortable?: boolean;\n /** Current sort direction for this column */\n sortDirection?: SortDirection;\n /** Callback when column header is clicked */\n onSort?: () => void;\n}\n\nconst TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(\n (\n {\n className,\n sortable = true,\n sortDirection = null,\n onSort,\n children,\n ...props\n },\n ref\n ) => {\n const handleClick = () => {\n if (sortable && onSort) {\n onSort();\n }\n };\n\n return (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-6 py-3.5 text-left align-middle font-bold text-base text-text-800 tracking-[0.2px] leading-none [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px] whitespace-nowrap',\n sortable && 'cursor-pointer select-none hover:bg-muted/30',\n className\n )}\n onClick={handleClick}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n {children}\n {sortable && (\n <div className=\"flex flex-col\">\n {sortDirection === 'asc' && (\n <CaretUp size={16} weight=\"fill\" className=\"text-text-800\" />\n )}\n {sortDirection === 'desc' && (\n <CaretDown size={16} weight=\"fill\" className=\"text-text-800\" />\n )}\n </div>\n )}\n </div>\n </th>\n );\n }\n);\nTableHead.displayName = 'TableHead';\n\nconst TableCell = forwardRef<\n HTMLTableCellElement,\n TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px] text-base font-normal text-text-800 leading-[150%] tracking-normal px-6 py-3.5 whitespace-nowrap',\n className\n )}\n {...props}\n />\n));\nTableCell.displayName = 'TableCell';\n\nconst TableCaption = forwardRef<\n HTMLTableCaptionElement,\n HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\n 'border-t border-border-200 text-sm text-text-800 px-6 py-3.5',\n className\n )}\n {...props}\n />\n));\nTableCaption.displayName = 'TableCaption';\n\nexport { default as TablePagination } from './TablePagination';\nexport type { TablePaginationProps } from './TablePagination';\n\nexport default Table;\nexport {\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","import Text from '../Text/Text';\n\nexport interface NoSearchResultProps {\n /**\n * Image source for the illustration\n */\n image: string;\n /**\n * Title text to display\n * @default \"Nenhum resultado encontrado\"\n */\n title?: string;\n /**\n * Description text to display below the title\n * @default \"Não encontramos nenhum resultado com esse nome. Tente revisar a busca ou usar outra palavra-chave.\"\n */\n description?: string;\n}\n\n/**\n * Component displayed when no search results are found\n * Shows an illustration with customizable title and description in horizontal layout\n *\n * @example\n * ```tsx\n * import { NoSearchResult } from 'analytica-frontend-lib';\n * import noSearchImage from './assets/no-search.png';\n *\n * <NoSearchResult\n * image={noSearchImage}\n * title=\"Nenhum resultado encontrado\"\n * description=\"Tente usar outros filtros\"\n * />\n * ```\n */\nconst NoSearchResult = ({ image, title, description }: NoSearchResultProps) => {\n const displayTitle = title || 'Nenhum resultado encontrado';\n const displayDescription =\n description ||\n 'Não encontramos nenhum resultado com esse nome. Tente revisar a busca ou usar outra palavra-chave.';\n\n return (\n <div className=\"flex flex-col lg:flex-row justify-center items-center gap-6 lg:gap-8 w-full max-w-4xl min-h-96 px-4 lg:px-0\">\n {/* Illustration */}\n <div className=\"w-48 h-48 lg:w-72 lg:h-72 flex-shrink-0 relative max-w-full\">\n <img\n src={image}\n alt=\"No search results\"\n className=\"w-full h-full object-contain\"\n />\n </div>\n\n {/* Text Content */}\n <div className=\"flex flex-col items-center lg:items-start w-full max-w-md min-w-0\">\n {/* Header Container */}\n <div className=\"flex flex-row justify-center lg:justify-between items-end px-6 pt-6 pb-4 w-full rounded-t-xl\">\n {/* Title */}\n <Text\n as=\"h2\"\n className=\"text-text-950 font-semibold text-xl lg:text-3xl leading-tight w-full flex items-center justify-center lg:justify-start text-center lg:text-left\"\n >\n {displayTitle}\n </Text>\n </div>\n\n {/* Description Container */}\n <div className=\"flex flex-row justify-center items-center px-6 gap-2 w-full\">\n {/* Description */}\n <Text className=\"text-text-600 font-normal text-base lg:text-lg leading-relaxed w-full text-center lg:text-justify\">\n {displayDescription}\n </Text>\n </div>\n </div>\n </div>\n );\n};\n\nexport default NoSearchResult;\n","import { type ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\n\nexport interface EmptyStateProps {\n /**\n * Image source for the illustration (optional)\n * Can be a string (URL) or a ReactNode (component)\n */\n image?: string | ReactNode;\n /**\n * Title text to display\n * @default \"Nenhum dado disponível\"\n */\n title?: string;\n /**\n * Description text to display below the title\n * @default \"Não há dados para exibir no momento.\"\n */\n description?: string;\n /**\n * Button text (optional - if not provided, button won't be displayed)\n */\n buttonText?: string;\n /**\n * Icon to display on the left side of the button\n */\n buttonIcon?: ReactNode;\n /**\n * Callback function when button is clicked\n */\n onButtonClick?: () => void;\n /**\n * Button variant\n * @default \"solid\"\n */\n buttonVariant?: 'solid' | 'outline' | 'link';\n /**\n * Button action color\n * @default \"primary\"\n */\n buttonAction?: 'primary' | 'positive' | 'negative';\n /**\n * Text size variant\n * @default \"large\"\n */\n size?: 'compact' | 'large';\n}\n\n/**\n * Component displayed when there is no data to show (empty state)\n * Shows an illustration with customizable title, description, and optional button in horizontal layout\n *\n * @example\n * ```tsx\n * import { EmptyState } from 'analytica-frontend-lib';\n * import activityImage from './assets/activity.png';\n * import { Plus } from 'phosphor-react';\n *\n * // Large variant (default) - for main page empty states\n * <EmptyState\n * image={activityImage}\n * title=\"Incentive sua turma ao aprendizado\"\n * description=\"Crie uma nova atividade e ajude seus alunos a colocarem o conteúdo em prática!\"\n * buttonText=\"Criar atividade\"\n * buttonIcon={<Plus size={18} />}\n * buttonVariant=\"outline\"\n * onButtonClick={handleCreateActivity}\n * />\n *\n * // Compact variant - for inline/contextual empty states\n * <EmptyState\n * image={activityImage}\n * title=\"Nenhum resultado encontrado\"\n * description=\"Utilize o filtro ao lado para encontrar questões.\"\n * size=\"compact\"\n * />\n * ```\n */\nconst EmptyState = ({\n image,\n title,\n description,\n buttonText,\n buttonIcon,\n onButtonClick,\n buttonVariant = 'solid',\n buttonAction = 'primary',\n size = 'large',\n}: EmptyStateProps) => {\n const displayTitle = title || 'Nenhum dado disponível';\n const displayDescription =\n description || 'Não há dados para exibir no momento.';\n\n const titleClassName =\n size === 'compact'\n ? 'text-text-600 text-sm font-semibold text-center'\n : 'text-text-950 text-3xl font-semibold text-center';\n\n const descriptionClassName =\n size === 'compact'\n ? 'text-text-600 text-sm font-normal text-center'\n : 'text-text-600 text-[18px] font-normal text-center';\n\n const containerMinHeight = size === 'compact' ? 'min-h-0' : 'min-h-[705px]';\n\n return (\n <div\n className={`flex flex-col justify-center items-center gap-6 w-full ${containerMinHeight} bg-background rounded-xl p-6`}\n >\n {/* Illustration */}\n {image && (\n <div className=\"max-w-[170px] max-h-[150px] flex items-center justify-center\">\n {typeof image === 'string' ? (\n <img\n src={image}\n alt={displayTitle}\n className=\"w-full h-full max-w-[170px] max-h-[150px]\"\n />\n ) : (\n <div className=\"w-[170px] h-[150px] flex items-center justify-center\">\n {image}\n </div>\n )}\n </div>\n )}\n\n {/* Text Content Container */}\n <div className=\"flex flex-col items-center gap-4 w-full max-w-[600px] px-6\">\n {/* Title */}\n <Text as=\"h2\" className={titleClassName}>\n {displayTitle}\n </Text>\n\n {/* Description */}\n <Text className={descriptionClassName}>{displayDescription}</Text>\n </div>\n\n {/* Button */}\n {buttonText && onButtonClick && (\n <Button\n variant={buttonVariant}\n action={buttonAction}\n size=\"large\"\n onClick={onButtonClick}\n iconLeft={buttonIcon}\n className=\"rounded-full px-5 py-2.5\"\n >\n {buttonText}\n </Button>\n )}\n </div>\n );\n};\n\nexport default EmptyState;\n","import { forwardRef, HTMLAttributes, CSSProperties } from 'react';\nimport { cn } from '../../utils/utils';\n\ninterface SkeletonProps extends HTMLAttributes<HTMLDivElement> {\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded';\n width?: string | number;\n height?: string | number;\n animation?: 'pulse' | 'none';\n lines?: number;\n spacing?: 'none' | 'small' | 'medium' | 'large';\n}\n\nconst SKELETON_ANIMATION_CLASSES = {\n pulse: 'animate-pulse',\n none: '',\n};\n\nconst SKELETON_VARIANT_CLASSES = {\n text: 'h-4 bg-background-200 rounded',\n circular: 'bg-background-200 rounded-full',\n rectangular: 'bg-background-200',\n rounded: 'bg-background-200 rounded-lg',\n};\n\nconst SPACING_CLASSES = {\n none: '',\n small: 'space-y-1',\n medium: 'space-y-2',\n large: 'space-y-3',\n};\n\nconst Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n (\n {\n variant = 'text',\n width,\n height,\n animation = 'pulse',\n lines = 1,\n spacing = 'none',\n className = '',\n children,\n ...props\n },\n ref\n ) => {\n const animationClass = SKELETON_ANIMATION_CLASSES[animation];\n const variantClass = SKELETON_VARIANT_CLASSES[variant];\n const spacingClass = SPACING_CLASSES[spacing];\n\n const style: CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n };\n\n // Se for múltiplas linhas de texto\n if (variant === 'text' && lines > 1) {\n return (\n <div\n ref={ref}\n className={cn('flex flex-col', spacingClass, className)}\n {...props}\n >\n {Array.from({ length: lines }, (_, index) => (\n <div\n key={index}\n className={cn(variantClass, animationClass)}\n style={index === lines - 1 ? { width: '60%' } : undefined}\n />\n ))}\n </div>\n );\n }\n\n // Se for um único elemento\n return (\n <div\n ref={ref}\n className={cn(variantClass, animationClass, className)}\n style={style}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\n// Componentes específicos para casos comuns\nconst SkeletonText = forwardRef<HTMLDivElement, Omit<SkeletonProps, 'variant'>>(\n (props, ref) => <Skeleton ref={ref} variant=\"text\" {...props} />\n);\n\nconst SkeletonCircle = forwardRef<\n HTMLDivElement,\n Omit<SkeletonProps, 'variant'>\n>((props, ref) => <Skeleton ref={ref} variant=\"circular\" {...props} />);\n\nconst SkeletonRectangle = forwardRef<\n HTMLDivElement,\n Omit<SkeletonProps, 'variant'>\n>((props, ref) => <Skeleton ref={ref} variant=\"rectangular\" {...props} />);\n\nconst SkeletonRounded = forwardRef<\n HTMLDivElement,\n Omit<SkeletonProps, 'variant'>\n>((props, ref) => <Skeleton ref={ref} variant=\"rounded\" {...props} />);\n\n// Componente para card skeleton\ninterface SkeletonCardProps extends HTMLAttributes<HTMLDivElement> {\n showAvatar?: boolean;\n showTitle?: boolean;\n showDescription?: boolean;\n showActions?: boolean;\n lines?: number;\n}\n\nconst SkeletonCard = forwardRef<HTMLDivElement, SkeletonCardProps>(\n (\n {\n showAvatar = true,\n showTitle = true,\n showDescription = true,\n showActions = true,\n lines = 2,\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full p-4 bg-background border border-border-200 rounded-lg',\n className\n )}\n {...props}\n >\n <div className=\"flex items-start space-x-3\">\n {showAvatar && <SkeletonCircle width={40} height={40} />}\n\n <div className=\"flex-1 space-y-2\">\n {showTitle && <SkeletonText width=\"60%\" height={20} />}\n\n {showDescription && <SkeletonText lines={lines} spacing=\"small\" />}\n </div>\n </div>\n\n {showActions && (\n <div className=\"flex justify-end space-x-2 mt-4\">\n <SkeletonRectangle width={80} height={32} />\n <SkeletonRectangle width={80} height={32} />\n </div>\n )}\n </div>\n );\n }\n);\n\n// Componente para lista skeleton\ninterface SkeletonListProps extends HTMLAttributes<HTMLDivElement> {\n items?: number;\n showAvatar?: boolean;\n showTitle?: boolean;\n showDescription?: boolean;\n lines?: number;\n}\n\nconst SkeletonList = forwardRef<HTMLDivElement, SkeletonListProps>(\n (\n {\n items = 3,\n showAvatar = true,\n showTitle = true,\n showDescription = true,\n lines = 1,\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <div ref={ref} className={cn('space-y-3', className)} {...props}>\n {Array.from({ length: items }, (_, index) => (\n <div key={index} className=\"flex items-start space-x-3 p-3\">\n {showAvatar && <SkeletonCircle width={32} height={32} />}\n\n <div className=\"flex-1 space-y-2\">\n {showTitle && <SkeletonText width=\"40%\" height={16} />}\n\n {showDescription && (\n <SkeletonText lines={lines} spacing=\"small\" />\n )}\n </div>\n </div>\n ))}\n </div>\n );\n }\n);\n\n// Componente para tabela skeleton\ninterface SkeletonTableProps extends HTMLAttributes<HTMLDivElement> {\n rows?: number;\n columns?: number;\n showHeader?: boolean;\n}\n\nconst SkeletonTable = forwardRef<HTMLDivElement, SkeletonTableProps>(\n (\n { rows = 5, columns = 4, showHeader = true, className = '', ...props },\n ref\n ) => {\n return (\n <div ref={ref} className={cn('w-full', className)} {...props}>\n {showHeader && (\n <div className=\"flex space-x-2 mb-3\">\n {Array.from({ length: columns }, (_, index) => (\n <SkeletonText\n key={index}\n width={`${100 / columns}%`}\n height={20}\n />\n ))}\n </div>\n )}\n\n <div className=\"space-y-2\">\n {Array.from({ length: rows }, (_, rowIndex) => (\n <div key={rowIndex} className=\"flex space-x-2\">\n {Array.from({ length: columns }, (_, colIndex) => (\n <SkeletonText\n key={colIndex}\n width={`${100 / columns}%`}\n height={16}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n }\n);\n\nexport {\n Skeleton,\n SkeletonText,\n SkeletonCircle,\n SkeletonRectangle,\n SkeletonRounded,\n SkeletonCard,\n SkeletonList,\n SkeletonTable,\n};\n","import { HTMLAttributes, ChangeEvent } from 'react';\nimport { CaretLeft, CaretRight, CaretDown } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\nexport interface TablePaginationProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Total number of items\n */\n totalItems: number;\n /**\n * Current page (1-based)\n */\n currentPage: number;\n /**\n * Total number of pages\n */\n totalPages: number;\n /**\n * Items per page\n */\n itemsPerPage: number;\n /**\n * Available options for items per page\n * @default [10, 20, 50, 100]\n */\n itemsPerPageOptions?: number[];\n /**\n * Callback when page changes\n */\n onPageChange: (page: number) => void;\n /**\n * Callback when items per page changes\n */\n onItemsPerPageChange?: (itemsPerPage: number) => void;\n /**\n * Customizable label for items (e.g., \"escolas\", \"alunos\", \"atividades\")\n * @default \"itens\"\n */\n itemLabel?: string;\n}\n\n/**\n * Table pagination component with navigation controls and items per page selector\n *\n * @example\n * ```tsx\n * import { TablePagination } from 'analytica-frontend-lib';\n *\n * <TablePagination\n * totalItems={1000}\n * currentPage={1}\n * totalPages={10}\n * itemsPerPage={10}\n * itemsPerPageOptions={[10, 20, 50, 100]}\n * onPageChange={(page) => setCurrentPage(page)}\n * onItemsPerPageChange={(items) => setItemsPerPage(items)}\n * itemLabel=\"escolas\"\n * />\n * ```\n */\nconst TablePagination = ({\n totalItems,\n currentPage,\n totalPages,\n itemsPerPage,\n itemsPerPageOptions = [10, 20, 50, 100],\n onPageChange,\n onItemsPerPageChange,\n itemLabel = 'itens',\n className,\n ...props\n}: TablePaginationProps) => {\n const startItem = totalItems === 0 ? 0 : (currentPage - 1) * itemsPerPage + 1;\n const endItem =\n totalItems === 0 ? 0 : Math.min(currentPage * itemsPerPage, totalItems);\n\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handleItemsPerPageChange = (e: ChangeEvent<HTMLSelectElement>) => {\n if (onItemsPerPageChange) {\n onItemsPerPageChange(Number(e.target.value));\n }\n };\n\n const isFirstPage = currentPage === 1;\n const isLastPage = currentPage === totalPages;\n\n return (\n <div\n className={cn(\n 'flex flex-col sm:flex-row items-center gap-3 sm:gap-4 w-full bg-background-50 rounded-xl p-4',\n 'sm:justify-between',\n className\n )}\n {...props}\n >\n {/* Items count - isolado à esquerda no desktop */}\n <span className=\"font-normal text-xs leading-[14px] text-text-800\">\n {startItem} - {endItem} de {totalItems} {itemLabel}\n </span>\n\n {/* Grupo direita: selector + page info + botões */}\n <div className=\"flex flex-wrap sm:flex-nowrap items-center gap-2 sm:gap-4 justify-center sm:justify-start\">\n {/* Items per page selector */}\n {onItemsPerPageChange && (\n <div className=\"relative\">\n <select\n value={itemsPerPage}\n onChange={handleItemsPerPageChange}\n className=\"w-24 h-9 py-0 px-3 pr-8 bg-background border border-border-300 rounded appearance-none cursor-pointer font-normal text-sm leading-[21px] text-text-900\"\n aria-label=\"Items por página\"\n >\n {itemsPerPageOptions.map((option) => (\n <option key={option} value={option}>\n {option} itens\n </option>\n ))}\n </select>\n <CaretDown\n size={14}\n weight=\"regular\"\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-background-600 pointer-events-none\"\n />\n </div>\n )}\n\n {/* Page info */}\n <span className=\"font-normal text-xs leading-[14px] text-text-950\">\n Página {currentPage} de {totalPages}\n </span>\n\n {/* Previous button */}\n <button\n onClick={handlePrevious}\n disabled={isFirstPage}\n className={cn(\n 'flex flex-row justify-center items-center py-2 px-4 gap-2 rounded-3xl transition-all',\n isFirstPage\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-primary-950/10 cursor-pointer'\n )}\n aria-label=\"Página anterior\"\n >\n <CaretLeft size={12} weight=\"bold\" className=\"text-primary-950\" />\n <span className=\"font-medium text-xs leading-[14px] text-primary-950\">\n Anterior\n </span>\n </button>\n\n {/* Next button */}\n <button\n onClick={handleNext}\n disabled={isLastPage}\n className={cn(\n 'flex flex-row justify-center items-center py-2 px-4 gap-2 rounded-3xl transition-all',\n isLastPage\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-primary-950/10 cursor-pointer'\n )}\n aria-label=\"Próxima página\"\n >\n <span className=\"font-medium text-xs leading-[14px] text-primary-950\">\n Próxima\n </span>\n <CaretRight size={12} weight=\"bold\" className=\"text-primary-950\" />\n </button>\n </div>\n </div>\n );\n};\n\nTablePagination.displayName = 'TablePagination';\n\nexport default TablePagination;\n","import { useEffect, useState, useCallback, useMemo } from 'react';\nimport type { CategoryConfig } from '../CheckBoxGroup/CheckBoxGroup';\nimport { calculateFormattedItemsForAutoSelection } from '../CheckBoxGroup/CheckBoxGroup.helpers';\n\nexport type FilterConfig = {\n key: string;\n label: string;\n categories: CategoryConfig[];\n};\n\n/**\n * Merge new filter configs with previous state, preserving user selections\n */\nconst mergeConfigsWithSelections = (\n newConfigs: FilterConfig[],\n prevConfigs: FilterConfig[]\n): FilterConfig[] => {\n let changed = false;\n\n const result = newConfigs.map((newConfig, i) => ({\n ...newConfig,\n categories: newConfig.categories.map((newCat, j) => {\n const prevCat = prevConfigs[i]?.categories[j];\n const prevItems = prevCat?.itens ?? [];\n const newItems = newCat.itens ?? [];\n\n if (prevItems.length !== newItems.length) {\n changed = true;\n }\n\n if (prevCat?.key === newCat.key && prevCat?.selectedIds?.length) {\n const availableIds = new Set(newItems.map((item) => item.id));\n const selectedIds = prevCat.selectedIds.filter((id) =>\n availableIds.has(id)\n );\n if (selectedIds.length !== prevCat.selectedIds.length) {\n changed = true;\n }\n return { ...newCat, selectedIds };\n }\n return newCat;\n }),\n }));\n\n return changed ? result : prevConfigs;\n};\n\nexport type UseTableFilterOptions = {\n syncWithUrl?: boolean;\n};\n\nexport type UseTableFilterReturn = {\n filterConfigs: FilterConfig[];\n activeFilters: Record<string, string[]>;\n hasActiveFilters: boolean;\n activeFiltersCount: number;\n updateFilters: (configs: FilterConfig[]) => void;\n applyFilters: () => void;\n clearFilters: () => void;\n};\n\n/**\n * Hook for managing table filters with URL synchronization\n *\n * @param initialConfigs - Initial filter configurations\n * @param options - Hook options including URL sync\n * @returns Filter state and management functions\n *\n * @example\n * ```tsx\n * const { filterConfigs, activeFilters, updateFilters, applyFilters } = useTableFilter(\n * [\n * {\n * key: 'academic',\n * label: 'Dados Acadêmicos',\n * categories: [...]\n * }\n * ],\n * { syncWithUrl: true }\n * );\n * ```\n */\nexport const useTableFilter = (\n initialConfigs: FilterConfig[],\n options: UseTableFilterOptions = {}\n): UseTableFilterReturn => {\n const { syncWithUrl = false } = options;\n\n // Get initial state from URL if syncWithUrl is enabled\n const getInitialState = useCallback((): FilterConfig[] => {\n if (!syncWithUrl || globalThis.window === undefined) {\n return initialConfigs;\n }\n\n const params = new URLSearchParams(globalThis.window.location.search);\n const configsWithUrlState = initialConfigs.map((config) => ({\n ...config,\n categories: config.categories.map((category) => {\n const urlValue = params.get(`filter_${category.key}`);\n const selectedIds = urlValue ? urlValue.split(',').filter(Boolean) : [];\n return {\n ...category,\n selectedIds,\n };\n }),\n }));\n\n return configsWithUrlState;\n }, [initialConfigs, syncWithUrl]);\n\n const [filterConfigs, setFilterConfigs] =\n useState<FilterConfig[]>(getInitialState);\n\n // Calculate active filters (only categories with selections)\n // Memoize to prevent creating new object reference on every render\n const activeFilters = useMemo(() => {\n const filters: Record<string, string[]> = {};\n\n for (const config of filterConfigs) {\n for (const category of config.categories) {\n if (category.selectedIds && category.selectedIds.length > 0) {\n filters[category.key] = category.selectedIds;\n }\n }\n }\n\n return filters;\n }, [filterConfigs]);\n\n const hasActiveFilters = Object.keys(activeFilters).length > 0;\n\n // Count only filters that were manually selected by the user,\n // excluding categories that were auto-selected because they have only 1 available item\n const activeFiltersCount = useMemo(() => {\n const allCategories = filterConfigs.flatMap((config) => config.categories);\n\n let count = 0;\n for (const category of allCategories) {\n if (!category.selectedIds || category.selectedIds.length === 0) continue;\n\n const availableItems = calculateFormattedItemsForAutoSelection(\n category,\n allCategories\n );\n\n const isAutoSelected =\n availableItems.length === 1 &&\n category.selectedIds.length === 1 &&\n category.selectedIds[0] === availableItems[0]?.id;\n\n if (!isAutoSelected) {\n count++;\n }\n }\n\n return count;\n }, [filterConfigs]);\n\n /**\n * Update filter configs (temporary state, not applied to URL yet)\n */\n const updateFilters = useCallback((configs: FilterConfig[]) => {\n setFilterConfigs(configs);\n }, []);\n\n /**\n * Apply filters to URL (commit the changes)\n */\n const applyFilters = useCallback(() => {\n if (!syncWithUrl || globalThis.window === undefined) {\n return;\n }\n\n const url = new URL(globalThis.window.location.href);\n const params = url.searchParams;\n\n // Update URL parameters for each category\n for (const config of filterConfigs) {\n for (const category of config.categories) {\n const paramKey = `filter_${category.key}`;\n\n if (category.selectedIds && category.selectedIds.length > 0) {\n params.set(paramKey, category.selectedIds.join(','));\n } else {\n params.delete(paramKey);\n }\n }\n }\n\n // Update URL without page reload\n globalThis.window.history.replaceState({}, '', url.toString());\n }, [filterConfigs, syncWithUrl]);\n\n /**\n * Clear all filters\n */\n const clearFilters = useCallback(() => {\n const clearedConfigs = filterConfigs.map((config) => ({\n ...config,\n categories: config.categories.map((category) => ({\n ...category,\n selectedIds: [],\n })),\n }));\n\n setFilterConfigs(clearedConfigs);\n\n // If syncWithUrl, also clear URL parameters\n if (syncWithUrl && globalThis.window !== undefined) {\n const url = new URL(globalThis.window.location.href);\n const params = url.searchParams;\n\n for (const config of filterConfigs) {\n for (const category of config.categories) {\n params.delete(`filter_${category.key}`);\n }\n }\n\n globalThis.window.history.replaceState({}, '', url.toString());\n }\n }, [filterConfigs, syncWithUrl]);\n\n // Sync filter configs when initialConfigs items change (e.g., async data loaded)\n useEffect(() => {\n setFilterConfigs((prev) =>\n mergeConfigsWithSelections(initialConfigs, prev)\n );\n }, [initialConfigs]);\n\n // Sync with URL on mount and when URL changes externally\n useEffect(() => {\n if (!syncWithUrl || globalThis.window === undefined) {\n return;\n }\n\n const handlePopState = () => {\n setFilterConfigs(getInitialState());\n };\n\n globalThis.window.addEventListener('popstate', handlePopState);\n return () =>\n globalThis.window.removeEventListener('popstate', handlePopState);\n }, [syncWithUrl, getInitialState]);\n\n return {\n filterConfigs,\n activeFilters,\n hasActiveFilters,\n activeFiltersCount,\n updateFilters,\n applyFilters,\n clearFilters,\n };\n};\n","import type { CategoryConfig, Item } from './CheckBoxGroup';\n\n/**\n * Helper function to efficiently compare selectedIds arrays\n */\nexport const areSelectedIdsEqual = (\n ids1?: string[],\n ids2?: string[]\n): boolean => {\n if (ids1 === ids2) return true;\n if (!ids1 || !ids2) return ids1 === ids2;\n if (ids1.length !== ids2.length) return false;\n\n for (let i = 0; i < ids1.length; i++) {\n if (ids1[i] !== ids2[i]) return false;\n }\n return true;\n};\n\n/**\n * Helper function to check if category is enabled based on dependencies\n */\nexport const isCategoryEnabled = (\n category: CategoryConfig,\n allCategories: CategoryConfig[]\n): boolean => {\n if (!category.dependsOn || category.dependsOn.length === 0) {\n return true;\n }\n return category.dependsOn.every((depKey) => {\n const depCat = allCategories.find((c) => c.key === depKey);\n return depCat?.selectedIds && depCat.selectedIds.length > 0;\n });\n};\n\n/**\n * Helper function to check if an item matches a filter\n */\nexport const isItemMatchingFilter = (\n item: Item,\n filter: { key: string; internalField: string },\n allCategories: CategoryConfig[]\n): boolean => {\n const parentCat = allCategories.find((c) => c.key === filter.key);\n const parentSelectedIds = parentCat?.selectedIds || [];\n const itemFieldValue = item[filter.internalField];\n return parentSelectedIds.includes(String(itemFieldValue));\n};\n\n/**\n * Helper function to get badge text for category\n */\nexport const getBadgeText = (\n category: CategoryConfig,\n formattedItems: { groupLabel?: string; itens: Item[] }[]\n): string => {\n const visibleIds = formattedItems\n .flatMap((group) => group.itens || [])\n .map((i) => i.id);\n const selectedVisibleCount = visibleIds.filter((id) =>\n category.selectedIds?.includes(id)\n ).length;\n const totalVisible = visibleIds.length;\n return `${selectedVisibleCount} de ${totalVisible} ${\n selectedVisibleCount === 1 ? 'selecionado' : 'selecionados'\n }`;\n};\n\n/**\n * Helper function to handle accordion value change logic\n * Returns the new accordion value or null if should not change\n */\nexport const handleAccordionValueChange = (\n value: string | string[] | undefined,\n categories: CategoryConfig[],\n isCategoryEnabledFn: (category: CategoryConfig) => boolean\n): string | null => {\n if (typeof value !== 'string') {\n if (!value) {\n return '';\n }\n return null; // Don't change for array values\n }\n\n if (!value) {\n return '';\n }\n\n // Prevent opening disabled categories\n const category = categories.find((c) => c.key === value);\n if (!category) {\n return null; // Category not found, don't change\n }\n\n const isEnabled = isCategoryEnabledFn(category);\n if (!isEnabled) {\n return null; // Don't allow opening disabled accordions\n }\n\n return value;\n};\n\n/**\n * Helper function to calculate filtered items for auto-selection\n * This function determines which items are visible/filtered for a category\n */\nexport const calculateFormattedItemsForAutoSelection = (\n category: CategoryConfig,\n allCategories: CategoryConfig[]\n): Item[] => {\n if (!category?.dependsOn || category.dependsOn.length === 0) {\n return category?.itens || [];\n }\n\n // Check if category is enabled based on dependencies\n const isEnabled = isCategoryEnabled(category, allCategories);\n\n // If category is disabled, return empty items array\n if (!isEnabled) {\n return [];\n }\n\n const filters =\n (category.filteredBy as {\n key: string;\n internalField: string;\n label?: string;\n }[]) || [];\n\n if (filters.length === 0) {\n return category?.itens || [];\n }\n\n const selectedIdsArr = filters.map((f) => {\n const parentCat = allCategories.find((c) => c.key === f.key);\n if (!parentCat?.selectedIds?.length) {\n return [];\n }\n return parentCat.selectedIds;\n });\n\n if (selectedIdsArr.some((arr) => arr.length === 0)) {\n return [];\n }\n\n // Filter items based on selected parent IDs\n const filteredItems = (category.itens || []).filter((item) =>\n filters.every((filter) => isItemMatchingFilter(item, filter, allCategories))\n );\n\n return filteredItems;\n};\n","import { X, MagnifyingGlass } from 'phosphor-react';\nimport {\n InputHTMLAttributes,\n forwardRef,\n useState,\n useId,\n useMemo,\n useEffect,\n useRef,\n ChangeEvent,\n MouseEvent,\n KeyboardEvent,\n} from 'react';\nimport DropdownMenu, {\n DropdownMenuContent,\n DropdownMenuItem,\n createDropdownStore,\n} from '../DropdownMenu/DropdownMenu';\n\n/**\n * Search component props interface\n */\ntype SearchProps = {\n /** List of options to show in dropdown */\n options: string[];\n /** Callback when an option is selected from dropdown */\n onSelect?: (value: string) => void;\n /** Callback when search input changes */\n onSearch?: (query: string) => void;\n /** Control dropdown visibility externally */\n showDropdown?: boolean;\n /** Callback when dropdown open state changes */\n onDropdownChange?: (open: boolean) => void;\n /** Maximum height of dropdown in pixels */\n dropdownMaxHeight?: number;\n /** Text to show when no results are found */\n noResultsText?: string;\n /** Debounce delay in ms for onSearch. Default 0 (no debounce). */\n debounceMs?: number;\n /** Additional CSS classes to apply to the input */\n className?: string;\n /** Additional CSS classes to apply to the container */\n containerClassName?: string;\n /** Callback when clear button is clicked */\n onClear?: () => void;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'onSelect'>;\n\n/**\n * Search component for Analytica Ensino platforms\n *\n * A specialized search input component with dropdown suggestions.\n * Features filtering, keyboard navigation, and customizable options.\n *\n * @param options - Array of search options to display in dropdown\n * @param onSelect - Callback when an option is selected\n * @param onSearch - Callback when search query changes\n * @param placeholder - Placeholder text for the input\n * @param noResultsText - Text to show when no results are found\n * @param dropdownMaxHeight - Maximum height of dropdown in pixels\n * @param className - Additional CSS classes for the input\n * @param containerClassName - Additional CSS classes for the container\n * @param props - All other standard input HTML attributes\n * @returns A styled search input with dropdown functionality\n *\n * @example\n * ```tsx\n * // Basic search\n * <Search\n * options={['Filosofia', 'Física', 'Matemática']}\n * placeholder=\"Buscar matéria...\"\n * onSelect={(value) => console.log('Selected:', value)}\n * />\n *\n * // With custom filtering\n * <Search\n * options={materias}\n * onSearch={(query) => setFilteredMaterias(filterMaterias(query))}\n * noResultsText=\"Nenhum resultado encontrado\"\n * />\n * ```\n */\n\n/**\n * Filter options based on search query\n */\nconst filterOptions = (options: string[], query: string): string[] => {\n if (!query || query.length < 1) return [];\n\n return options.filter((option) =>\n option.toLowerCase().includes(query.toLowerCase())\n );\n};\n\n/**\n * Updates input value and creates appropriate change event\n */\nconst updateInputValue = (\n value: string,\n ref:\n | { current: HTMLInputElement | null }\n | ((instance: HTMLInputElement | null) => void)\n | null,\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void\n) => {\n if (!onChange) return;\n\n if (ref && 'current' in ref && ref.current) {\n ref.current.value = value;\n const event = new Event('input', { bubbles: true });\n Object.defineProperty(event, 'target', {\n writable: false,\n value: ref.current,\n });\n onChange(event as unknown as ChangeEvent<HTMLInputElement>);\n } else {\n // Fallback for cases where ref is not available\n const event = {\n target: { value },\n currentTarget: { value },\n } as ChangeEvent<HTMLInputElement>;\n onChange(event);\n }\n};\n\nconst Search = forwardRef<HTMLInputElement, SearchProps>(\n (\n {\n options = [],\n onSelect,\n onSearch,\n showDropdown: controlledShowDropdown,\n onDropdownChange,\n dropdownMaxHeight = 240,\n noResultsText = 'Nenhum resultado encontrado',\n className = '',\n containerClassName = '',\n disabled,\n readOnly,\n id,\n onClear,\n value,\n onChange,\n placeholder = 'Buscar...',\n onKeyDown: userOnKeyDown,\n debounceMs = 0,\n ...props\n },\n ref\n ) => {\n // Dropdown state and logic\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [forceClose, setForceClose] = useState(false);\n const justSelectedRef = useRef(false);\n const dropdownStore = useRef(createDropdownStore()).current;\n const dropdownRef = useRef<HTMLDivElement>(null);\n const inputElRef = useRef<HTMLInputElement>(null);\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n };\n }, []);\n\n // Filter options based on input value\n const filteredOptions = useMemo(() => {\n if (!options.length) {\n return [];\n }\n const filtered = filterOptions(options, (value as string) || '');\n return filtered;\n }, [options, value]);\n\n // Control dropdown visibility\n const showDropdown =\n !forceClose &&\n (controlledShowDropdown ??\n (dropdownOpen && value && String(value).length > 0));\n\n // Helper to keep all consumers in sync\n const setOpenAndNotify = (open: boolean) => {\n setDropdownOpen(open);\n dropdownStore.setState({ open });\n onDropdownChange?.(open);\n };\n\n // Handle dropdown visibility changes\n useEffect(() => {\n // Don't reopen dropdown if we just selected an option\n if (justSelectedRef.current) {\n justSelectedRef.current = false;\n return;\n }\n // Respect forceClose even if value is non-empty\n if (forceClose) {\n setOpenAndNotify(false);\n return;\n }\n\n const shouldShow = Boolean(value && String(value).length > 0);\n setOpenAndNotify(shouldShow);\n }, [value, forceClose, onDropdownChange, dropdownStore]);\n\n // Handle option selection\n const handleSelectOption = (option: string) => {\n justSelectedRef.current = true; // Prevent immediate dropdown reopen\n setForceClose(true); // Force dropdown to close immediately\n onSelect?.(option);\n setOpenAndNotify(false);\n\n // Update input value if onChange is provided\n updateInputValue(option, ref, onChange);\n };\n\n // Handle click outside dropdown\n useEffect(() => {\n const handleClickOutside = (event: globalThis.MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setOpenAndNotify(false);\n }\n };\n\n if (showDropdown) {\n document.addEventListener('click', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('click', handleClickOutside);\n };\n }, [showDropdown, dropdownStore, onDropdownChange]);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `search-${generatedId}`;\n const dropdownId = `${inputId}-dropdown`;\n\n // Handle clear button\n const handleClear = () => {\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n debounceTimer.current = null;\n }\n if (onClear) {\n onClear();\n } else {\n updateInputValue('', ref, onChange);\n }\n };\n\n // Handle clear button click - mantém foco no input\n const handleClearClick = (e: MouseEvent) => {\n e.preventDefault(); // Evita que o input perca foco\n e.stopPropagation(); // Para propagação do evento\n handleClear();\n };\n\n // Handle search icon click - focus on input\n const handleSearchIconClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setTimeout(() => {\n inputElRef.current?.focus();\n }, 0);\n };\n\n // Handle input change\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setForceClose(false); // Allow dropdown to open when user types\n onChange?.(e);\n if (debounceMs > 0) {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n const value = e.target.value;\n debounceTimer.current = setTimeout(() => {\n onSearch?.(value);\n }, debounceMs);\n } else {\n onSearch?.(e.target.value);\n }\n };\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n // Let consumer run first; if they prevent default, skip our logic\n userOnKeyDown?.(e);\n if (e.defaultPrevented) return;\n\n if (e.key === 'Enter') {\n e.preventDefault();\n\n // If dropdown is open and there are filtered options, select the first one\n if (showDropdown && filteredOptions.length > 0) {\n handleSelectOption(filteredOptions[0]);\n } else if (value) {\n // If no dropdown or no options, execute search\n onSearch?.(String(value));\n setForceClose(true);\n setOpenAndNotify(false);\n }\n }\n };\n\n // Helper function for input state classes\n const getInputStateClasses = (disabled?: boolean, readOnly?: boolean) => {\n if (disabled) return 'cursor-not-allowed opacity-40';\n if (readOnly) return 'cursor-default focus:outline-none !text-text-900';\n return 'hover:border-border-400';\n };\n\n // Determine which icon to show\n const hasValue = String(value ?? '').length > 0;\n const showClearButton = hasValue && !disabled && !readOnly;\n const showSearchIcon = !hasValue && !disabled && !readOnly;\n\n return (\n <div\n ref={dropdownRef}\n className={`w-full max-w-lg md:w-[488px] ${containerClassName}`}\n >\n {/* Search Input Container */}\n <div className=\"relative flex items-center\">\n {/* Search Input Field */}\n <input\n ref={(node) => {\n // Forward to parent\n if (ref) {\n if (typeof ref === 'function') ref(node);\n else\n (ref as { current: HTMLInputElement | null }).current = node;\n }\n // Keep our own handle\n inputElRef.current = node;\n }}\n id={inputId}\n type=\"text\"\n className={`w-full py-0 px-4 pr-10 font-normal text-text-900 focus:outline-primary-950 border rounded-full bg-background focus:bg-primary-50 border-border-300 focus:border-2 focus:border-primary-950 h-10 placeholder:text-text-600 ${getInputStateClasses(disabled, readOnly)} ${className}`}\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n aria-expanded={showDropdown ? 'true' : undefined}\n aria-haspopup={options.length > 0 ? 'listbox' : undefined}\n aria-controls={showDropdown ? dropdownId : undefined}\n aria-autocomplete=\"list\"\n role={options.length > 0 ? 'combobox' : undefined}\n {...props}\n />\n\n {/* Right Icon - Clear Button */}\n {showClearButton && (\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2\">\n <button\n type=\"button\"\n className=\"p-0 border-0 bg-transparent cursor-pointer\"\n onMouseDown={handleClearClick}\n aria-label=\"Limpar busca\"\n >\n <span className=\"w-6 h-6 text-text-800 flex items-center justify-center hover:text-text-600 transition-colors\">\n <X />\n </span>\n </button>\n </div>\n )}\n\n {/* Right Icon - Search Icon */}\n {showSearchIcon && (\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2\">\n <button\n type=\"button\"\n className=\"p-0 border-0 bg-transparent cursor-pointer\"\n onMouseDown={handleSearchIconClick}\n aria-label=\"Buscar\"\n >\n <span className=\"w-6 h-6 text-text-800 flex items-center justify-center hover:text-text-600 transition-colors\">\n <MagnifyingGlass />\n </span>\n </button>\n </div>\n )}\n </div>\n\n {/* Search Dropdown */}\n {showDropdown && (\n <DropdownMenu open={showDropdown} onOpenChange={setDropdownOpen}>\n <DropdownMenuContent\n id={dropdownId}\n className=\"w-full mt-1\"\n style={{ maxHeight: dropdownMaxHeight }}\n align=\"start\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => (\n <DropdownMenuItem\n key={option}\n onClick={() => handleSelectOption(option)}\n className=\"text-text-700 text-base leading-6 cursor-pointer\"\n >\n {option}\n </DropdownMenuItem>\n ))\n ) : (\n <div className=\"px-3 py-3 text-text-700 text-base\">\n {noResultsText}\n </div>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n }\n);\n\nSearch.displayName = 'Search';\n\nexport default Search;\n","import { CaretRight, SignOut, User } from 'phosphor-react';\nimport {\n forwardRef,\n ReactNode,\n ButtonHTMLAttributes,\n useEffect,\n useLayoutEffect,\n useRef,\n HTMLAttributes,\n MouseEvent,\n KeyboardEvent,\n isValidElement,\n Children,\n cloneElement,\n ReactElement,\n useState,\n RefObject,\n CSSProperties,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { create, StoreApi, useStore } from 'zustand';\nimport Button from '../Button/Button';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport Modal from '../Modal/Modal';\nimport { ThemeToggle } from '../ThemeToggle/ThemeToggle';\nimport type { ThemeMode } from '@/hooks/useTheme';\nimport { useTheme } from '../../hooks/useTheme';\n\ninterface DropdownStore {\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\ntype DropdownStoreApi = StoreApi<DropdownStore>;\n\nexport function createDropdownStore(): DropdownStoreApi {\n return create<DropdownStore>((set) => ({\n open: false,\n // Bail out when the value didn't change. Skipping `set` here prevents\n // zustand from creating a new state object, which in turn keeps\n // `useStore(store, (s) => s)` subscribers from re-rendering on no-op\n // syncs (e.g. the `useEffect [propOpen]` controlled-mode bridge).\n setOpen: (open) => set((state) => (state.open === open ? state : { open })),\n }));\n}\n\nexport const useDropdownStore = (externalStore?: DropdownStoreApi) => {\n if (!externalStore) {\n throw new Error(\n 'Component must be used within a DropdownMenu (store is missing)'\n );\n }\n\n return externalStore;\n};\n\nconst injectStore = (\n children: ReactNode,\n store: DropdownStoreApi\n): ReactNode => {\n return Children.map(children, (child) => {\n if (isValidElement(child)) {\n const typedChild = child as ReactElement<{\n store?: DropdownStoreApi;\n children?: ReactNode;\n }>;\n\n // Aqui tu checa o displayName do componente\n const displayName = (\n typedChild.type as unknown as { displayName: string }\n ).displayName;\n\n // Lista de componentes que devem receber o store\n const allowed = [\n 'DropdownMenuTrigger',\n 'DropdownContent',\n 'DropdownMenuContent',\n 'DropdownMenuSeparator',\n 'DropdownMenuItem',\n 'MenuLabel',\n 'ProfileMenuTrigger',\n 'ProfileMenuHeader',\n 'ProfileMenuFooter',\n 'ProfileToggleTheme',\n ];\n\n let newProps: Partial<{\n store: DropdownStoreApi;\n children: ReactNode;\n }> = {};\n\n if (allowed.includes(displayName)) {\n newProps.store = store;\n }\n\n if (typedChild.props.children) {\n newProps.children = injectStore(typedChild.props.children, store);\n }\n\n return cloneElement(typedChild, newProps);\n }\n\n return child;\n });\n};\n\ninterface DropdownMenuProps {\n children: ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nconst DropdownMenu = ({\n children,\n open: propOpen,\n onOpenChange,\n}: DropdownMenuProps) => {\n const storeRef = useRef<DropdownStoreApi | null>(null);\n storeRef.current ??= createDropdownStore();\n const store = storeRef.current;\n const { open, setOpen: storeSetOpen } = useStore(store, (s) => s);\n\n const setOpen = (newOpen: boolean) => {\n storeSetOpen(newOpen);\n };\n\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n const handleArrowDownOrArrowUp = (event: globalThis.KeyboardEvent) => {\n const menuContent = menuRef.current?.querySelector('[role=\"menu\"]');\n if (menuContent) {\n event.preventDefault();\n\n const items = Array.from(\n menuContent.querySelectorAll(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n )\n ).filter((el): el is HTMLElement => el instanceof HTMLElement);\n\n if (items.length === 0) return;\n\n const focusedItem = document.activeElement as HTMLElement;\n const currentIndex = items.indexOf(focusedItem);\n\n let nextIndex;\n if (event.key === 'ArrowDown') {\n nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % items.length;\n } else {\n // ArrowUp\n nextIndex =\n currentIndex === -1\n ? items.length - 1\n : (currentIndex - 1 + items.length) % items.length;\n }\n\n items[nextIndex]?.focus();\n }\n };\n\n const handleDownkey = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false);\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n handleArrowDownOrArrowUp(event);\n }\n };\n\n const handleClickOutside = (event: Event) => {\n const target = event.target as Node;\n\n if (menuRef.current?.contains(target)) {\n return;\n }\n\n if (\n target instanceof Element &&\n target.closest('[data-dropdown-content=\"true\"]')\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n useEffect(() => {\n if (open) {\n document.addEventListener('pointerdown', handleClickOutside);\n document.addEventListener('keydown', handleDownkey);\n }\n\n return () => {\n document.removeEventListener('pointerdown', handleClickOutside);\n document.removeEventListener('keydown', handleDownkey);\n };\n }, [open]);\n\n useEffect(() => {\n onOpenChange?.(open);\n }, [open, onOpenChange]);\n\n useEffect(() => {\n if (propOpen !== undefined) {\n setOpen(propOpen);\n }\n }, [propOpen]);\n\n return (\n <div className=\"relative\" ref={menuRef}>\n {injectStore(children, store)}\n </div>\n );\n};\n\n// Componentes genéricos do DropdownMenu\nconst DropdownMenuTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n }\n>(({ className, children, onClick, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n className={cn(\n 'appearance-none bg-transparent border-none p-0',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n});\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger';\n\nconst ITEM_SIZE_CLASSES = {\n small: 'text-sm',\n medium: 'text-md',\n} as const;\n\nconst SIDE_CLASSES = {\n top: 'bottom-full',\n right: 'top-full',\n bottom: 'top-full',\n left: 'top-full',\n};\n\nconst ALIGN_CLASSES = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n};\n\nconst MENUCONTENT_VARIANT_CLASSES = {\n menu: 'p-1',\n profile: 'p-6',\n};\n\nconst MenuLabel = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n inset?: boolean;\n store?: DropdownStoreApi;\n }\n>(({ className, inset, store: _store, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('text-sm w-full', inset ? 'pl-8' : '', className)}\n {...props}\n />\n );\n});\nMenuLabel.displayName = 'MenuLabel';\n\nconst DropdownMenuContent = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n align?: 'start' | 'center' | 'end';\n side?: 'top' | 'right' | 'bottom' | 'left';\n variant?: 'menu' | 'profile';\n sideOffset?: number;\n store?: DropdownStoreApi;\n portal?: boolean;\n triggerRef?: RefObject<HTMLElement | null>;\n }\n>(\n (\n {\n className,\n align = 'start',\n side = 'bottom',\n variant = 'menu',\n sideOffset = 4,\n children,\n store: externalStore,\n portal = false,\n triggerRef,\n ...props\n },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const [isVisible, setIsVisible] = useState(open);\n const [portalPosition, setPortalPosition] = useState({ top: 0, left: 0 });\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (open) {\n setIsVisible(true);\n } else {\n const timer = setTimeout(() => setIsVisible(false), 200);\n return () => clearTimeout(timer);\n }\n }, [open]);\n\n useLayoutEffect(() => {\n if (portal && open && triggerRef?.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n let top = rect.bottom + sideOffset;\n let left = rect.left;\n\n // Handle horizontal sides (left/right)\n if (side === 'left') {\n left = rect.left - sideOffset;\n top = rect.top;\n } else if (side === 'right') {\n left = rect.right + sideOffset;\n top = rect.top;\n } else {\n // Handle vertical sides (top/bottom)\n if (align === 'end') {\n left = rect.right;\n } else if (align === 'center') {\n left = rect.left + rect.width / 2;\n }\n\n if (side === 'top') {\n top = rect.top - sideOffset;\n }\n }\n\n setPortalPosition((prev) =>\n prev.top === top && prev.left === left ? prev : { top, left }\n );\n }\n }, [portal, open, triggerRef, align, side, sideOffset]);\n\n if (!isVisible) return null;\n\n const getPositionClasses = () => {\n if (portal) {\n return 'fixed';\n }\n const vertical = SIDE_CLASSES[side];\n const horizontal = ALIGN_CLASSES[align];\n\n return `absolute ${vertical} ${horizontal}`;\n };\n\n const getPortalAlignStyle = () => {\n if (!portal) return {};\n\n const baseStyle: CSSProperties = {\n top: portalPosition.top,\n };\n\n if (align === 'end') {\n baseStyle.right = window.innerWidth - portalPosition.left;\n } else if (align === 'center') {\n baseStyle.left = portalPosition.left;\n baseStyle.transform = 'translateX(-50%)';\n } else {\n baseStyle.left = portalPosition.left;\n }\n\n return baseStyle;\n };\n\n const variantClasses = MENUCONTENT_VARIANT_CLASSES[variant];\n\n const content = (\n <div\n ref={portal ? contentRef : ref}\n role=\"menu\"\n data-dropdown-content=\"true\"\n className={`\n bg-background z-50 min-w-[210px] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md border-border-100\n ${open ? 'animate-in fade-in-0 zoom-in-95' : 'animate-out fade-out-0 zoom-out-95'}\n ${getPositionClasses()}\n ${variantClasses}\n ${className}\n `}\n style={{\n ...(portal\n ? getPortalAlignStyle()\n : {\n marginTop: side === 'bottom' ? sideOffset : undefined,\n marginBottom: side === 'top' ? sideOffset : undefined,\n marginLeft: side === 'right' ? sideOffset : undefined,\n marginRight: side === 'left' ? sideOffset : undefined,\n }),\n }}\n {...props}\n >\n {children}\n </div>\n );\n\n if (portal && typeof document !== 'undefined') {\n return createPortal(content, document.body);\n }\n\n return content;\n }\n);\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n\nconst DropdownMenuItem = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n inset?: boolean;\n size?: 'small' | 'medium';\n iconLeft?: ReactNode;\n iconRight?: ReactNode;\n disabled?: boolean;\n variant?: 'profile' | 'menu';\n store?: DropdownStoreApi;\n preventClose?: boolean;\n }\n>(\n (\n {\n className,\n size = 'small',\n children,\n iconRight,\n iconLeft,\n disabled = false,\n onClick,\n variant = 'menu',\n store: externalStore,\n preventClose = false,\n ...props\n },\n ref\n ) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n const sizeClasses = ITEM_SIZE_CLASSES[size];\n\n const handleClick = (\n e: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>\n ) => {\n if (disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (e.type === 'click') {\n onClick?.(e as MouseEvent<HTMLDivElement>);\n } else if (e.type === 'keydown') {\n // For keyboard events, trigger click if Enter or Space was pressed\n const keyEvent = e as KeyboardEvent<HTMLDivElement>;\n if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {\n (e.currentTarget as HTMLElement).click();\n }\n // honor any user-provided key handler\n props.onKeyDown?.(keyEvent);\n }\n if (!preventClose) {\n setOpen(false);\n }\n };\n\n const getVariantClasses = () => {\n if (variant === 'profile') {\n return 'relative flex flex-row justify-between select-none items-center gap-2 rounded-sm p-4 text-sm outline-none transition-colors [&>svg]:size-6 [&>svg]:shrink-0';\n }\n return 'relative flex select-none items-center gap-2 rounded-sm p-3 text-sm outline-none transition-colors [&>svg]:size-4 [&>svg]:shrink-0';\n };\n\n const getVariantProps = () => {\n return variant === 'profile' ? { 'data-variant': 'profile' } : {};\n };\n\n return (\n <div\n ref={ref}\n role=\"menuitem\"\n {...getVariantProps()}\n aria-disabled={disabled}\n className={`\n focus-visible:bg-background-50\n ${getVariantClasses()}\n ${sizeClasses}\n ${className}\n ${\n disabled\n ? 'cursor-not-allowed text-text-400'\n : 'cursor-pointer hover:bg-background-50 text-text-700 focus:bg-accent focus:text-accent-foreground hover:bg-accent hover:text-accent-foreground'\n }\n `}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n handleClick(e);\n }\n }}\n tabIndex={disabled ? -1 : 0}\n {...props}\n >\n {iconLeft}\n <div className=\"w-full\">{children}</div>\n {iconRight}\n </div>\n );\n }\n);\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n\nconst DropdownMenuSeparator = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }\n>(({ className, store: _store, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('my-1 h-px bg-border-200', className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\n\n// Componentes específicos do ProfileMenu\nconst ProfileMenuTrigger = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & { store?: DropdownStoreApi }\n>(({ className, onClick, store: externalStore, ...props }, ref) => {\n const store = useDropdownStore(externalStore);\n const open = useStore(store, (s) => s.open);\n const toggleOpen = () => store.setState({ open: !open });\n\n return (\n <button\n ref={ref}\n className={cn(\n 'rounded-lg size-10 bg-primary-50 flex items-center justify-center cursor-pointer',\n className\n )}\n onClick={(e) => {\n e.stopPropagation();\n toggleOpen();\n onClick?.(e);\n }}\n aria-expanded={open}\n {...props}\n >\n <span className=\"size-6 rounded-full bg-primary-100 flex items-center justify-center\">\n <User className=\"text-primary-950\" size={18} />\n </span>\n </button>\n );\n});\nProfileMenuTrigger.displayName = 'ProfileMenuTrigger';\n\nconst ProfileMenuHeader = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n name: string;\n email: string;\n photoUrl?: string | null;\n store?: DropdownStoreApi;\n }\n>(({ className, name, email, photoUrl, store: _store, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuHeader\"\n className={cn(\n 'flex flex-row gap-4 items-center min-w-[280px]',\n className\n )}\n {...props}\n >\n <span className=\"w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center overflow-hidden flex-shrink-0\">\n {photoUrl ? (\n <img\n src={photoUrl}\n alt=\"Foto de perfil\"\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <User size={34} className=\"text-primary-800\" />\n )}\n </span>\n <div className=\"flex flex-col min-w-0\">\n <Text\n size=\"xl\"\n weight=\"bold\"\n color=\"text-text-950\"\n className=\"truncate\"\n >\n {name}\n </Text>\n <Text size=\"md\" color=\"text-text-600\" className=\"truncate\">\n {email}\n </Text>\n </div>\n </div>\n );\n});\nProfileMenuHeader.displayName = 'ProfileMenuHeader';\n\nconst ProfileMenuInfo = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & {\n schoolName: string;\n classYearName: string;\n schoolYearName: string;\n store?: DropdownStoreApi;\n }\n>(\n (\n {\n className,\n schoolName,\n classYearName,\n schoolYearName,\n store: _store,\n ...props\n },\n ref\n ) => {\n if (!schoolName && !classYearName && !schoolYearName) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n data-component=\"ProfileMenuInfo\"\n className={cn('flex flex-row gap-4 items-center', className)}\n {...props}\n >\n <span className=\"w-16 h-16\" />\n <div className=\"flex flex-col \">\n {schoolName && (\n <Text size=\"md\" color=\"text-text-600\">\n {schoolName}\n </Text>\n )}\n\n {(classYearName || schoolYearName) && (\n <span className=\"flex flex-row items-center gap-2\">\n {classYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n {classYearName}\n </Text>\n )}\n {classYearName && schoolYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n ●\n </Text>\n )}\n {schoolYearName && (\n <Text size=\"md\" color=\"text-text-600\">\n {schoolYearName}\n </Text>\n )}\n </span>\n )}\n </div>\n </div>\n );\n }\n);\nProfileMenuInfo.displayName = 'ProfileMenuInfo';\n\nconst ProfileToggleTheme = ({\n store: externalStore,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }) => {\n const { themeMode, setTheme } = useTheme();\n const [modalThemeToggle, setModalThemeToggle] = useState(false);\n const [selectedTheme, setSelectedTheme] = useState<ThemeMode>(themeMode);\n\n const internalStoreRef = useRef<DropdownStoreApi | null>(null);\n internalStoreRef.current ??= createDropdownStore();\n const store = externalStore ?? internalStoreRef.current;\n const setOpen = useStore(store, (s) => s.setOpen);\n\n const handleClick = (e: MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setModalThemeToggle(true);\n };\n\n const handleSave = () => {\n setTheme(selectedTheme);\n setModalThemeToggle(false);\n setOpen(false); // Close dropdown after saving\n };\n\n const handleCancel = () => {\n setSelectedTheme(themeMode); // Reset to current theme\n setModalThemeToggle(false);\n setOpen(false); // Close dropdown after canceling\n };\n\n return (\n <>\n <DropdownMenuItem\n variant=\"profile\"\n preventClose={true}\n store={store}\n iconLeft={\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 2.75C15.085 2.75276 17.5637 3.78054 19.3916 5.6084C21.2195 7.43628 22.2473 9.915 22.25 12.5C22.25 14.4284 21.6778 16.3136 20.6064 17.917C19.5352 19.5201 18.0128 20.7699 16.2314 21.5078C14.4499 22.2458 12.489 22.4387 10.5977 22.0625C8.70642 21.6863 6.96899 20.758 5.60547 19.3945C4.24197 18.031 3.31374 16.2936 2.9375 14.4023C2.56129 12.511 2.75423 10.5501 3.49219 8.76855C4.23012 6.98718 5.47982 5.46483 7.08301 4.39355C8.68639 3.32221 10.5716 2.75 12.5 2.75ZM11.75 4.28516C9.70145 4.47452 7.7973 5.42115 6.41016 6.94043C5.02299 8.4599 4.25247 10.4426 4.25 12.5C4.25247 14.5574 5.02299 16.5401 6.41016 18.0596C7.7973 19.5789 9.70145 20.5255 11.75 20.7148V4.28516Z\"\n fill=\"currentColor\"\n />\n </svg>\n }\n iconRight={<CaretRight />}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n setModalThemeToggle(true);\n }\n }}\n {...props}\n >\n <Text size=\"md\" color=\"text-text-700\">\n Aparência\n </Text>\n </DropdownMenuItem>\n\n <Modal\n isOpen={modalThemeToggle}\n onClose={handleCancel}\n title=\"Aparência\"\n size=\"md\"\n footer={\n <div className=\"flex gap-3\">\n <Button variant=\"outline\" onClick={handleCancel}>\n Cancelar\n </Button>\n <Button variant=\"solid\" onClick={handleSave}>\n Salvar\n </Button>\n </div>\n }\n >\n <div className=\"flex flex-col\">\n <p className=\"text-sm text-text-500\">Escolha o tema:</p>\n <ThemeToggle variant=\"with-save\" onToggle={setSelectedTheme} />\n </div>\n </Modal>\n </>\n );\n};\nProfileToggleTheme.displayName = 'ProfileToggleTheme';\n\nconst ProfileMenuSection = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement> & { store?: DropdownStoreApi }\n>(({ className, children, store: _store, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('flex flex-col p-2', className)} {...props}>\n {children}\n </div>\n );\n});\nProfileMenuSection.displayName = 'ProfileMenuSection';\n\nconst ProfileMenuFooter = ({\n className,\n disabled = false,\n onClick,\n store: externalStore,\n ...props\n}: HTMLAttributes<HTMLButtonElement> & {\n disabled?: boolean;\n store?: DropdownStoreApi;\n}) => {\n const store = useDropdownStore(externalStore);\n const setOpen = useStore(store, (s) => s.setOpen);\n\n return (\n <Button\n variant=\"outline\"\n className={cn('w-full', className)}\n disabled={disabled}\n onClick={(e) => {\n setOpen(false);\n onClick?.(e);\n }}\n {...props}\n >\n <span className=\"mr-2 flex items-center\">\n <SignOut className=\"text-inherit\" />\n </span>\n <Text color=\"inherit\">Sair</Text>\n </Button>\n );\n};\nProfileMenuFooter.displayName = 'ProfileMenuFooter';\n\n// Exportações\nexport default DropdownMenu;\nexport {\n // Componentes genéricos\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n MenuLabel,\n DropdownMenuSeparator,\n\n // Componentes específicos do ProfileMenu\n ProfileMenuTrigger,\n ProfileMenuHeader,\n ProfileMenuSection,\n ProfileMenuFooter,\n ProfileToggleTheme,\n ProfileMenuInfo,\n};\n","import { Moon, Sun } from 'phosphor-react';\nimport { useState, useEffect } from 'react';\nimport SelectionButton from '../SelectionButton/SelectionButton';\nimport type { ThemeMode } from '@/hooks/useTheme';\nimport { useTheme } from '../../hooks/useTheme';\n\ninterface ThemeToggleProps {\n variant?: 'default' | 'with-save';\n onToggle?: (theme: ThemeMode) => void;\n}\n\nexport const ThemeToggle = ({\n variant = 'default',\n onToggle,\n}: ThemeToggleProps) => {\n const { themeMode, setTheme } = useTheme();\n const [tempTheme, setTempTheme] = useState<ThemeMode>(themeMode);\n\n // Update temp theme when themeMode changes externally\n useEffect(() => {\n setTempTheme(themeMode);\n }, [themeMode]);\n\n const problemTypes = [\n {\n id: 'light' as ThemeMode,\n title: 'Claro',\n icon: <Sun size={24} />,\n },\n {\n id: 'dark' as ThemeMode,\n title: 'Escuro',\n icon: <Moon size={24} />,\n },\n {\n id: 'system' as ThemeMode,\n title: 'Sistema',\n icon: (\n <svg\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 2.75C15.085 2.75276 17.5637 3.78054 19.3916 5.6084C21.2195 7.43628 22.2473 9.915 22.25 12.5C22.25 14.4284 21.6778 16.3136 20.6064 17.917C19.5352 19.5201 18.0128 20.7699 16.2314 21.5078C14.4499 22.2458 12.489 22.4387 10.5977 22.0625C8.70642 21.6863 6.96899 20.758 5.60547 19.3945C4.24197 18.031 3.31374 16.2936 2.9375 14.4023C2.56129 12.511 2.75423 10.5501 3.49219 8.76855C4.23012 6.98718 5.47982 5.46483 7.08301 4.39355C8.68639 3.32221 10.5716 2.75 12.5 2.75ZM11.75 4.28516C9.70145 4.47452 7.7973 5.42115 6.41016 6.94043C5.02299 8.4599 4.25247 10.4426 4.25 12.5C4.25247 14.5574 5.02299 16.5401 6.41016 18.0596C7.7973 19.5789 9.70145 20.5255 11.75 20.7148V4.28516Z\"\n fill=\"#525252\"\n />\n </svg>\n ),\n },\n ];\n\n const handleThemeSelect = (selectedTheme: ThemeMode) => {\n if (variant === 'with-save') {\n setTempTheme(selectedTheme);\n } else {\n setTheme(selectedTheme);\n }\n\n if (onToggle) {\n onToggle(selectedTheme);\n }\n };\n\n const currentTheme = variant === 'with-save' ? tempTheme : themeMode;\n\n return (\n <div className=\"flex flex-row gap-2 sm:gap-4 py-2\">\n {problemTypes.map((type) => (\n <SelectionButton\n key={type.id}\n icon={type.icon}\n label={type.title}\n selected={currentTheme === type.id}\n onClick={() => handleThemeSelect(type.id)}\n className=\"w-full p-2 sm:p-4\"\n />\n ))}\n </div>\n );\n};\n","import { ButtonHTMLAttributes, ReactNode, forwardRef } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * SelectionButton component props interface\n */\ntype SelectionButtonProps = {\n /** Ícone a ser exibido no botão (opcional) */\n icon?: ReactNode;\n /** Texto/label a ser exibido ao lado do ícone */\n label: ReactNode;\n /** Estado de seleção do botão */\n selected?: boolean;\n /** Additional CSS classes to apply */\n className?: string;\n} & ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * SelectionButton component for Analytica Ensino platforms\n *\n * Um botão com ícone e texto para ações e navegação com estado de seleção.\n * Ideal para filtros, tags, categorias, seleção de tipos, etc.\n * Suporta forwardRef para acesso programático ao elemento DOM.\n *\n * @param icon - O ícone a ser exibido no botão\n * @param label - O texto/label a ser exibido\n * @param selected - Estado de seleção do botão\n * @param className - Classes CSS adicionais\n * @param props - Todos os outros atributos HTML padrão de button\n * @returns Um elemento button estilizado\n *\n * @example\n * ```tsx\n * <SelectionButton\n * icon={<TagIcon />}\n * label=\"Categoria\"\n * selected={false}\n * onClick={() => handleSelection()}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Usando ref para foco programático\n * const buttonRef = useRef<HTMLButtonElement>(null);\n *\n * const handleFocus = () => {\n * buttonRef.current?.focus();\n * };\n *\n * <SelectionButton\n * ref={buttonRef}\n * icon={<TagIcon />}\n * label=\"Categoria\"\n * selected={isSelected}\n * onClick={() => setSelected(!isSelected)}\n * />\n * ```\n */\nconst SelectionButton = forwardRef<HTMLButtonElement, SelectionButtonProps>(\n (\n { icon, label, selected = false, className = '', disabled, ...props },\n ref\n ) => {\n // Classes base para todos os estados\n const baseClasses = [\n 'inline-flex',\n 'items-center',\n 'justify-start',\n 'gap-2',\n 'p-4',\n 'rounded-xl',\n 'cursor-pointer',\n 'border',\n 'border-border-50',\n 'bg-background',\n 'text-sm',\n 'text-text-700',\n 'font-bold',\n 'shadow-soft-shadow-1',\n 'hover:bg-background-100',\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-indicator-info',\n 'focus-visible:ring-offset-0',\n 'focus-visible:shadow-none',\n 'active:ring-2',\n 'active:ring-primary-950',\n 'active:ring-offset-0',\n 'active:shadow-none',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n ];\n\n const stateClasses = selected\n ? ['ring-primary-950', 'ring-2', 'ring-offset-0', 'shadow-none']\n : [];\n\n const allClasses = [...baseClasses, ...stateClasses].join(' ');\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(allClasses, className)}\n disabled={disabled}\n aria-pressed={selected}\n {...props}\n >\n {icon && (\n <span className=\"flex items-center justify-center w-6 h-6\">\n {icon}\n </span>\n )}\n <span>{label}</span>\n </button>\n );\n }\n);\n\nSelectionButton.displayName = 'SelectionButton';\n\nexport default SelectionButton;\n","import { useEffect, useMemo } from 'react';\nimport { useThemeStore, ThemeMode } from '../store/themeStore';\n\nexport type { ThemeMode };\n\n/**\n * Hook para gerenciar temas e branding institucional\n * Este hook permite alternar entre temas light, dark e automático baseado nas preferências do sistema\n * e fornece acesso aos dados de branding lidos diretamente das meta tags HTML\n * Utiliza Zustand para persistir o estado de tema entre múltiplos arquivos e sessões\n */\nexport const useTheme = () => {\n const {\n themeMode,\n isDark,\n toggleTheme,\n setTheme,\n initializeTheme,\n handleSystemThemeChange,\n } = useThemeStore();\n\n // Read branding data from meta tags\n const branding = useMemo(() => {\n if (typeof document === 'undefined') {\n return {\n theme: null,\n favicon: null,\n icon: null,\n mainLogo: null,\n internalLogo: null,\n loginImage: null,\n };\n }\n\n return {\n theme:\n document.querySelector('meta[name=\"theme\"]')?.getAttribute('content') ??\n null,\n favicon:\n document.querySelector('link[rel=\"icon\"]')?.getAttribute('href') ??\n null,\n icon:\n document\n .querySelector('link[rel=\"apple-touch-icon\"]')\n ?.getAttribute('href') ?? null,\n mainLogo:\n document\n .querySelector('meta[name=\"main-logo\"]')\n ?.getAttribute('content') ?? null,\n internalLogo:\n document\n .querySelector('meta[name=\"internal-logo\"]')\n ?.getAttribute('content') ?? null,\n loginImage:\n document\n .querySelector('meta[name=\"login-image\"]')\n ?.getAttribute('content') ?? null,\n };\n }, []);\n\n useEffect(() => {\n // Initialize theme on first render\n initializeTheme();\n\n // Listener para mudanças nas preferências do sistema (apenas quando mode é 'system')\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n mediaQuery.addEventListener('change', handleSystemThemeChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleSystemThemeChange);\n };\n }, [initializeTheme, handleSystemThemeChange]);\n\n return {\n themeMode,\n isDark,\n toggleTheme,\n setTheme,\n branding,\n };\n};\n","import { create } from 'zustand';\nimport { createJSONStorage, devtools, persist } from 'zustand/middleware';\nimport { themeCookieStorage } from './themeStorage';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\n/**\n * Theme store state interface\n */\nexport interface ThemeState {\n /**\n * Current theme mode\n */\n themeMode: ThemeMode;\n /**\n * Whether the current theme is dark\n */\n isDark: boolean;\n}\n\n/**\n * Theme store actions interface\n */\nexport interface ThemeActions {\n /**\n * Apply theme based on the mode selected\n */\n applyTheme: (mode: ThemeMode) => void;\n /**\n * Toggle between themes\n */\n toggleTheme: () => void;\n /**\n * Set a specific theme mode\n */\n setTheme: (mode: ThemeMode) => void;\n /**\n * Set the white-label theme from institution branding\n */\n setWhiteLabelTheme: (theme: string | null) => void;\n /**\n * Clear the white-label theme and revert to default\n */\n clearWhiteLabelTheme: () => void;\n /**\n * Initialize theme on app start\n */\n initializeTheme: () => void;\n /**\n * Handle system theme change\n */\n handleSystemThemeChange: () => void;\n}\n\nexport type ThemeStore = ThemeState & ThemeActions;\n\n/**\n * Mapa de tema light institucional → tema dark correspondente.\n * Adicionar entradas aqui ao introduzir novas instituições.\n */\nconst DARK_THEME_MAP: Record<string, string> = {\n 'base-light': 'base-dark',\n 'enem-parana-light': 'enem-parana-dark',\n 'enem-paraiba-light': 'enem-paraiba-dark',\n 'analytica-light': 'analytica-dark',\n};\n\n/**\n * Resolve o seletor CSS dark concreto com base no tema institucional (light)\n * salvo em `data-original-theme`. Fallback: 'base-dark', que também responde\n * ao seletor legado [data-theme='dark'] preservando compat com apps antigos.\n */\nconst resolveDarkTheme = (originalTheme: string | undefined): string => {\n if (!originalTheme) return 'base-dark';\n return DARK_THEME_MAP[originalTheme] ?? 'base-dark';\n};\n\n/**\n * Apply theme to DOM based on mode\n */\nconst applyThemeToDOM = (mode: ThemeMode): boolean => {\n const htmlElement = document.documentElement;\n const originalTheme = htmlElement.dataset.originalTheme;\n\n if (mode === 'dark') {\n htmlElement.dataset.theme = resolveDarkTheme(originalTheme);\n return true;\n } else if (mode === 'light') {\n if (originalTheme) {\n htmlElement.dataset.theme = originalTheme;\n }\n return false;\n } else if (mode === 'system') {\n const isSystemDark = window.matchMedia(\n '(prefers-color-scheme: dark)'\n ).matches;\n if (isSystemDark) {\n htmlElement.dataset.theme = resolveDarkTheme(originalTheme);\n return true;\n } else if (originalTheme) {\n htmlElement.dataset.theme = originalTheme;\n return false;\n }\n }\n return false;\n};\n\n/**\n * Save original theme from white label (reads from HTML meta tag or data-theme attribute)\n */\nconst saveOriginalTheme = () => {\n const htmlElement = document.documentElement;\n const currentTheme =\n htmlElement.dataset.theme ||\n document.querySelector('meta[name=\"theme\"]')?.getAttribute('content');\n\n if (currentTheme && !htmlElement.dataset.originalTheme) {\n htmlElement.dataset.originalTheme = currentTheme;\n }\n};\n\n/**\n * Theme store using Zustand with persistence\n */\nexport const useThemeStore = create<ThemeStore>()(\n devtools(\n persist(\n (set, get) => ({\n // Initial state\n themeMode: 'system',\n isDark: false,\n\n // Actions\n applyTheme: (mode: ThemeMode) => {\n const isDark = applyThemeToDOM(mode);\n set({ isDark });\n },\n\n toggleTheme: () => {\n const { themeMode, applyTheme } = get();\n let newMode: ThemeMode;\n\n if (themeMode === 'light') {\n newMode = 'dark';\n } else if (themeMode === 'dark') {\n newMode = 'light';\n } else {\n // Se estiver em 'system', vai para 'dark'\n newMode = 'dark';\n }\n\n set({ themeMode: newMode });\n applyTheme(newMode);\n },\n\n setTheme: (mode: ThemeMode) => {\n const { applyTheme } = get();\n set({ themeMode: mode });\n applyTheme(mode);\n },\n\n setWhiteLabelTheme: (theme: string | null) => {\n const htmlElement = document.documentElement;\n\n if (theme) {\n // Set the white-label theme as the original theme\n htmlElement.dataset.originalTheme = theme;\n\n // Apply theme based on current mode\n const { themeMode, applyTheme } = get();\n if (themeMode === 'light' || themeMode === 'system') {\n htmlElement.dataset.theme = theme;\n }\n\n applyTheme(themeMode);\n }\n },\n\n clearWhiteLabelTheme: () => {\n const htmlElement = document.documentElement;\n\n // Remove white-label theme attributes\n delete htmlElement.dataset.originalTheme;\n delete htmlElement.dataset.theme;\n\n // Restore original theme from page metadata\n saveOriginalTheme();\n\n // Re-apply current theme mode to use defaults\n const { themeMode, applyTheme } = get();\n applyTheme(themeMode);\n },\n\n initializeTheme: () => {\n const { themeMode, applyTheme } = get();\n\n // Save original theme from white label\n saveOriginalTheme();\n\n // Apply the current theme mode\n applyTheme(themeMode);\n },\n\n handleSystemThemeChange: () => {\n const { themeMode, applyTheme } = get();\n // Only respond to system changes when in system mode\n if (themeMode === 'system') {\n applyTheme('system');\n }\n },\n }),\n {\n name: 'theme-store', // Storage key (cookie + localStorage)\n // Root-domain cookie so login and app subdomains share the theme\n storage: createJSONStorage(() => themeCookieStorage),\n partialize: (state) => ({\n themeMode: state.themeMode,\n }), // Só persiste o themeMode, não o isDark\n }\n ),\n {\n name: 'theme-store',\n }\n )\n);\n","/**\n * Options for writing a cookie\n */\nexport interface CookieOptions {\n /**\n * Cookie Domain attribute; omitted when undefined (host-only cookie)\n */\n domain?: string;\n /**\n * Cookie Path attribute (default '/')\n */\n path?: string;\n /**\n * Max-Age in seconds\n */\n maxAge?: number;\n /**\n * SameSite attribute (default 'Lax')\n */\n sameSite?: 'Lax' | 'Strict' | 'None';\n /**\n * Adds the Secure attribute when true\n */\n secure?: boolean;\n}\n\n/**\n * Reads a cookie value by name\n *\n * @param name - The cookie name\n * @returns The decoded cookie value, or null when absent or malformed\n */\nexport const getCookie = (name: string): string | null => {\n if (typeof document === 'undefined') {\n return null;\n }\n const prefix = `${encodeURIComponent(name)}=`;\n const match = document.cookie\n .split('; ')\n .find((entry) => entry.startsWith(prefix));\n if (!match) {\n return null;\n }\n try {\n return decodeURIComponent(match.slice(prefix.length));\n } catch {\n return null; // malformed percent-encoding\n }\n};\n\n/**\n * Writes a cookie with the given options\n *\n * @param name - The cookie name\n * @param value - The cookie value (URL-encoded before writing)\n * @param options - Cookie attributes (domain, path, maxAge, sameSite, secure)\n */\nexport const setCookie = (\n name: string,\n value: string,\n options: CookieOptions = {}\n): void => {\n if (typeof document === 'undefined') {\n return;\n }\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\n parts.push(`Path=${options.path ?? '/'}`);\n if (options.maxAge !== undefined) {\n parts.push(`Max-Age=${options.maxAge}`);\n }\n if (options.domain) {\n parts.push(`Domain=${options.domain}`);\n }\n parts.push(`SameSite=${options.sameSite ?? 'Lax'}`);\n if (options.secure) {\n parts.push('Secure');\n }\n document.cookie = parts.join('; ');\n};\n\n/**\n * Removes a cookie by expiring it immediately\n *\n * @param name - The cookie name\n * @param options - Domain and path must match the cookie being removed\n */\nexport const removeCookie = (\n name: string,\n options: Pick<CookieOptions, 'domain' | 'path'> = {}\n): void => {\n setCookie(name, '', { ...options, maxAge: 0 });\n};\n","/**\n * Resolves the root hostname shared by all application subdomains.\n * Mirrors the subdomain rules used by `getRootDomain` (Auth), without\n * protocol or port. Useful for the cookie `Domain` attribute so that a\n * cookie set on a subdomain is visible on the root domain and vice versa.\n *\n * @param hostname - The hostname to resolve (e.g. window.location.hostname)\n * @returns The root hostname, or null for localhost / IP literals\n * (callers should omit the cookie Domain attribute in that case)\n *\n * @example\n * ```typescript\n * resolveRootHostname('aluno.analiticaensino.com.br'); // 'analiticaensino.com.br'\n * resolveRootHostname('aluno.hml.analiticaensino.com.br'); // 'hml.analiticaensino.com.br'\n * resolveRootHostname('sub.example.com'); // 'example.com'\n * resolveRootHostname('localhost'); // null\n * resolveRootHostname('127.0.0.1'); // null\n * ```\n */\nexport const resolveRootHostname = (hostname: string): string | null => {\n if (hostname === 'localhost') {\n return null;\n }\n\n // IP literals: no subdomain logic applies\n const isIPv4 = /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(hostname);\n const isIPv6 = hostname.includes(':'); // simple check is sufficient here\n if (isIPv4 || isIPv6) {\n return null;\n }\n\n const parts = hostname.split('.');\n // Label-based detection: matches 'hml' and 'hml-*' labels (e.g. hml-aluno)\n // without false positives on substrings like 'html'\n const isHml = parts.some(\n (label) => label === 'hml' || label.startsWith('hml-')\n );\n\n // Handle Brazilian .com.br domains and similar patterns\n if (parts.length >= 3 && parts.at(-2) === 'com' && parts.at(-1) === 'br') {\n if (parts.length === 3) {\n // Already at root level for .com.br (e.g., analiticaensino.com.br)\n return hostname;\n }\n // For domains like aluno.analiticaensino.com.br, return analiticaensino.com.br\n const base = parts.slice(-3).join('.');\n // If in hml environment, resolve to hml.base (e.g., hml.analiticaensino.com.br)\n return isHml && !base.startsWith('hml.') ? `hml.${base}` : base;\n }\n\n // Only treat as subdomain if there are 3+ parts (e.g., subdomain.example.com)\n if (parts.length > 2) {\n const base = parts.slice(-2).join('.');\n return isHml && !base.startsWith('hml.') ? `hml.${base}` : base;\n }\n\n // For 2-part domains (example.com) or single domains, return as-is\n return hostname;\n};\n","import type { StateStorage } from 'zustand/middleware';\nimport { getCookie, setCookie, removeCookie } from '../utils/cookieUtils';\nimport { resolveRootHostname } from '../utils/domainUtils';\n\nconst ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\n\n/**\n * Resolves the cookie Domain attribute for the current location.\n * Returns undefined on localhost / IP literals so the cookie stays host-only.\n *\n * @returns The root domain for the cookie, or undefined\n */\nconst cookieDomain = (): string | undefined =>\n resolveRootHostname(globalThis.location.hostname) ?? undefined;\n\n/**\n * Reads a value from localStorage without throwing\n * (storage can be disabled in privacy mode or sandboxed iframes)\n *\n * @param name - The storage key\n * @returns The stored value, or null when absent or unavailable\n */\nconst readLocalStorage = (name: string): string | null => {\n try {\n return globalThis.localStorage.getItem(name);\n } catch {\n return null;\n }\n};\n\n/**\n * Returns the value only when it contains valid JSON, null otherwise\n * (guards against corrupted persisted values)\n *\n * @param raw - The raw persisted value, or null when absent\n * @returns The same value when it is valid JSON, or null\n */\nconst validJsonOrNull = (raw: string | null): string | null => {\n if (raw === null) {\n return null;\n }\n try {\n JSON.parse(raw);\n return raw;\n } catch {\n return null;\n }\n};\n\n/**\n * Zustand StateStorage that persists theme state in a cookie scoped to the\n * root domain, so the login app (root domain) and the profile apps\n * (subdomains) all share the chosen theme. Reads fall back to localStorage\n * for users that persisted the theme before the cookie storage existed, and\n * writes go to both stores for backward compatibility with older library\n * versions that read only localStorage.\n */\nexport const themeCookieStorage: StateStorage = {\n getItem: (name: string): string | null => {\n if (typeof document === 'undefined') {\n return null;\n }\n // A corrupted cookie must not block the localStorage fallback\n return (\n validJsonOrNull(getCookie(name)) ??\n validJsonOrNull(readLocalStorage(name))\n );\n },\n setItem: (name: string, value: string): void => {\n if (typeof document === 'undefined') {\n return;\n }\n setCookie(name, value, {\n domain: cookieDomain(),\n path: '/',\n maxAge: ONE_YEAR_IN_SECONDS,\n sameSite: 'Lax',\n secure: globalThis.location.protocol === 'https:',\n });\n try {\n globalThis.localStorage.setItem(name, value);\n } catch {\n // localStorage unavailable; the cookie is the source of truth\n }\n },\n removeItem: (name: string): void => {\n if (typeof document === 'undefined') {\n return;\n }\n removeCookie(name, { domain: cookieDomain(), path: '/' });\n try {\n globalThis.localStorage.removeItem(name);\n } catch {\n // ignore: nothing to clean up when storage is unavailable\n }\n },\n};\n","import Modal from '../Modal/Modal';\nimport { CheckboxGroup } from '../CheckBoxGroup/CheckBoxGroup';\nimport Button from '../Button/Button';\nimport type { FilterConfig } from './useTableFilter';\nimport { FILTER_GROUP } from '../../enums/FilterEnums';\n\nexport type FilterModalProps = {\n /**\n * Controls modal visibility\n */\n isOpen: boolean;\n\n /**\n * Callback when modal should close\n */\n onClose: () => void;\n\n /**\n * Filter configurations with categories\n */\n filterConfigs: FilterConfig[];\n\n /**\n * Callback when filters change (temporary, before applying)\n */\n onFiltersChange: (configs: FilterConfig[]) => void;\n\n /**\n * Callback when \"Aplicar\" button is clicked\n */\n onApply: () => void;\n\n /**\n * Callback when \"Limpar filtros\" button is clicked\n */\n onClear: () => void;\n\n /**\n * Modal title\n * @default \"Filtros\"\n */\n title?: string;\n\n /**\n * Modal size\n * @default \"md\"\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n /**\n * Apply button label\n * @default \"Aplicar\"\n */\n applyLabel?: string;\n\n /**\n * Clear button label\n * @default \"Limpar filtros\"\n */\n clearLabel?: string;\n};\n\n/**\n * FilterModal component - A modal for table filtering with CheckboxGroup\n *\n * Integrates Modal, CheckboxGroup, and Button components to create a\n * complete filtering interface. Works with useTableFilter hook for URL synchronization.\n *\n * @example\n * ```tsx\n * const { filterConfigs, updateFilters, applyFilters, clearFilters } = useTableFilter(\n * initialConfigs,\n * { syncWithUrl: true }\n * );\n *\n * <FilterModal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * filterConfigs={filterConfigs}\n * onFiltersChange={updateFilters}\n * onApply={() => {\n * applyFilters();\n * setIsOpen(false);\n * }}\n * onClear={clearFilters}\n * />\n * ```\n */\nexport const FilterModal = ({\n isOpen,\n onClose,\n filterConfigs,\n onFiltersChange,\n onApply,\n onClear,\n title = 'Filtros',\n size = 'md',\n applyLabel = 'Aplicar',\n clearLabel = 'Limpar filtros',\n}: FilterModalProps) => {\n const handleCategoryChange = (\n configIndex: number,\n updatedCategories: (typeof filterConfigs)[0]['categories']\n ) => {\n const newConfigs = [...filterConfigs];\n newConfigs[configIndex] = {\n ...newConfigs[configIndex],\n categories: updatedCategories,\n };\n onFiltersChange(newConfigs);\n };\n\n const handleApply = () => {\n onApply();\n onClose();\n };\n\n const handleClear = () => {\n onClear();\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n size={size}\n footer={\n <div className=\"flex gap-3 justify-end w-full\">\n <Button variant=\"outline\" onClick={handleClear}>\n {clearLabel}\n </Button>\n <Button onClick={handleApply}>{applyLabel}</Button>\n </div>\n }\n >\n <div className=\"flex flex-col gap-6\">\n {filterConfigs.map((config, index) => (\n <div key={config.key} className=\"flex flex-col gap-4\">\n {/* Section Header */}\n <div className=\"flex items-center gap-2 text-text-400 text-sm font-medium uppercase\">\n {config.key === FILTER_GROUP.ACADEMIC && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-text-400\"\n >\n <path\n d=\"M8 2L2 5.33333L8 8.66667L14 5.33333L8 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 10.6667L8 14L14 10.6667\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 8L8 11.3333L14 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n {config.key === FILTER_GROUP.CONTENT && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"text-text-400\"\n >\n <path\n d=\"M3.33333 2H12.6667C13.403 2 14 2.59695 14 3.33333V12.6667C14 13.403 13.403 14 12.6667 14H3.33333C2.59695 14 2 13.403 2 12.6667V3.33333C2 2.59695 2.59695 2 3.33333 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 6H14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 2V14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n <span>{config.label}</span>\n </div>\n\n {/* CheckboxGroup */}\n <CheckboxGroup\n categories={config.categories}\n onCategoriesChange={(updatedCategories) =>\n handleCategoryChange(index, updatedCategories)\n }\n />\n </div>\n ))}\n </div>\n </Modal>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n AccordionGroup,\n Badge,\n CardAccordation,\n CheckBox,\n cn,\n Text,\n Divider,\n} from '../../';\nimport {\n areSelectedIdsEqual,\n isCategoryEnabled as isCategoryEnabledHelper,\n getBadgeText as getBadgeTextHelper,\n handleAccordionValueChange as handleAccordionValueChangeHelper,\n calculateFormattedItemsForAutoSelection,\n} from './CheckBoxGroup.helpers';\n\nexport type Item = {\n id: string;\n name: string;\n [key: string]: unknown;\n};\n\nexport type CategoryConfig = {\n key: string;\n label: string;\n selectedIds?: string[];\n dependsOn?: string[];\n itens?: Item[];\n filteredBy?: { key: string; internalField: string }[];\n};\n\nexport const CheckboxGroup = ({\n categories,\n onCategoriesChange,\n compactSingleItem = true,\n showDivider = true,\n showSingleItem = false,\n disableAutoSelection = false,\n}: {\n categories: CategoryConfig[];\n onCategoriesChange: (categories: CategoryConfig[]) => void;\n compactSingleItem?: boolean;\n showDivider?: boolean;\n showSingleItem?: boolean;\n disableAutoSelection?: boolean;\n}) => {\n const [openAccordion, setOpenAccordion] = useState<string>('');\n\n // Refs to prevent infinite loops and track auto-selection state\n const onCategoriesChangeRef = useRef(onCategoriesChange);\n const previousCategoriesRef = useRef<CategoryConfig[]>(categories);\n // Track which categories have had auto-selection applied (by stringified selectedIds)\n const appliedAutoSelectionRef = useRef<string>('');\n\n // Update ref when onCategoriesChange changes\n useEffect(() => {\n onCategoriesChangeRef.current = onCategoriesChange;\n }, [onCategoriesChange]);\n\n // Use helper function for comparing selectedIds arrays\n\n // Auto-seleciona categorias com apenas um item (considerando itens filtrados)\n const categoriesWithAutoSelection = useMemo(() => {\n // Se auto-seleção está desabilitada, retorna as categorias sem modificação\n if (disableAutoSelection) {\n return categories;\n }\n\n return categories.map((category) => {\n // Get filtered/visible items for this category\n const filteredItems = calculateFormattedItemsForAutoSelection(\n category,\n categories\n );\n\n // Se tem apenas um item filtrado/visível e nenhum está selecionado, auto-seleciona\n if (\n filteredItems.length === 1 &&\n (!category.selectedIds || category.selectedIds.length === 0)\n ) {\n return {\n ...category,\n selectedIds: [filteredItems[0].id],\n };\n }\n return category;\n });\n }, [categories, disableAutoSelection]);\n\n // Aplica a auto-seleção se necessário\n // Note: onCategoriesChange should be memoized by the parent component to prevent re-renders\n useEffect(() => {\n // Check if categories have actually changed by comparing with previous reference\n const categoriesChanged = categories !== previousCategoriesRef.current;\n previousCategoriesRef.current = categories;\n\n // Check for auto-selection changes using efficient comparison\n const hasAutoSelectionChanges = categoriesWithAutoSelection.some(\n (cat, index) => {\n const originalCat = categories[index];\n return !areSelectedIdsEqual(cat.selectedIds, originalCat.selectedIds);\n }\n );\n\n if (!hasAutoSelectionChanges) {\n // No auto-selection needed, reset tracking if categories changed\n if (categoriesChanged) {\n appliedAutoSelectionRef.current = '';\n }\n return;\n }\n\n // Create a signature of the auto-selection to prevent duplicate notifications\n const autoSelectionSignature = JSON.stringify(\n categoriesWithAutoSelection.map((c) => c.selectedIds)\n );\n\n // Only notify if this exact auto-selection hasn't been applied yet\n if (appliedAutoSelectionRef.current !== autoSelectionSignature) {\n appliedAutoSelectionRef.current = autoSelectionSignature;\n onCategoriesChangeRef.current(categoriesWithAutoSelection);\n }\n }, [categoriesWithAutoSelection, categories]);\n\n const isCheckBoxIsSelected = (categoryKey: string, itemId: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return false;\n return category.selectedIds?.includes(itemId) || false;\n };\n\n const isMinimalOneCheckBoxIsSelected = (categoryKey: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return false;\n\n // Obtém apenas os itens filtrados (visíveis)\n const formattedItems = getFormattedItems(categoryKey);\n const filteredItems = formattedItems.flatMap((group) => group.itens || []);\n const filteredItemIds = filteredItems.map((item) => item.id);\n\n // Verifica se pelo menos um item filtrado está selecionado\n return filteredItemIds.some((itemId) =>\n category.selectedIds?.includes(itemId)\n );\n };\n\n const areAllFilteredItemsSelected = (categoryKey: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return false;\n\n // Obtém apenas os itens filtrados (visíveis)\n const formattedItems = getFormattedItems(categoryKey);\n const filteredItems = formattedItems.flatMap((group) => group.itens || []);\n\n // Se não há itens filtrados, retorna false\n if (filteredItems.length === 0) return false;\n\n const filteredItemIds = filteredItems.map((item) => item.id);\n\n // Verifica se TODOS os itens filtrados estão selecionados\n return filteredItemIds.every((itemId) =>\n category.selectedIds?.includes(itemId)\n );\n };\n\n // Helper function to create combination of two arrays\n const createCombinations = (\n acc: string[][],\n currentArray: string[]\n ): string[][] => {\n const combinations: string[][] = [];\n for (const existingCombo of acc) {\n for (const item of currentArray) {\n combinations.push([...existingCombo, item]);\n }\n }\n return combinations;\n };\n\n // Helper function to calculate cartesian product of arrays\n const cartesian = (arr: string[][]): string[][] => {\n return arr.reduce(createCombinations, [[]] as string[][]);\n };\n\n // Helper function to get selected IDs for filters\n const getSelectedIdsForFilters = (\n filters: { key: string; internalField: string; label?: string }[]\n ) => {\n return filters.map((f) => {\n const parentCat = categories.find((c) => c.key === f.key);\n if (!parentCat?.selectedIds?.length) {\n return [];\n }\n return parentCat.selectedIds;\n });\n };\n\n // Helper function to generate group label for single filter\n const generateSingleFilterLabel = (\n filter: { key: string; internalField: string },\n comboId: string\n ) => {\n const cat = categories.find((c) => c.key === filter.key);\n return cat?.itens?.find((i) => i.id === comboId)?.name || comboId;\n };\n\n // Helper function to generate group label for multiple filters\n const generateMultipleFiltersLabel = (\n filters: { key: string; internalField: string }[],\n comboIds: string[]\n ) => {\n const firstCat = categories.find((c) => c.key === filters[0].key);\n const firstVal =\n firstCat?.itens?.find((i) => i.id === comboIds[0])?.name || comboIds[0];\n\n const labelParts: string[] = [firstVal];\n\n for (let idx = 1; idx < filters.length; idx++) {\n const f = filters[idx];\n const cat = categories.find((c) => c.key === f.key);\n const val =\n cat?.itens?.find((i) => i.id === comboIds[idx])?.name || comboIds[idx];\n labelParts.push(`(${val})`);\n }\n return labelParts.join(' ');\n };\n\n // Helper function to process combination and add to grouped map\n const processCombination = (\n comboIds: string[],\n filters: { key: string; internalField: string; label?: string }[],\n category: CategoryConfig,\n groupedMap: Record<string, { groupLabel?: string; itens: Item[] }>\n ) => {\n const filteredItems = (category?.itens || []).filter((item) =>\n filters.every((f, idx) => item[f.internalField] === comboIds[idx])\n );\n\n if (filteredItems.length === 0) return;\n\n let groupLabel: string | undefined = undefined;\n\n if (filters.length === 1) {\n groupLabel = generateSingleFilterLabel(filters[0], comboIds[0]);\n } else if (filters.length > 1) {\n groupLabel = generateMultipleFiltersLabel(filters, comboIds);\n }\n\n const key = groupLabel || '';\n if (!groupedMap[key]) {\n groupedMap[key] = groupLabel ? { groupLabel, itens: [] } : { itens: [] };\n }\n groupedMap[key].itens.push(...filteredItems);\n };\n\n // Helper function to calculate formatted items for a category\n const calculateFormattedItems = (categoryKey: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n\n if (!category?.dependsOn || category.dependsOn.length === 0) {\n return [{ itens: category?.itens || [] }];\n }\n\n // Check if category is enabled based on dependencies (inline to avoid stale closure)\n const isEnabled = category.dependsOn.every((depKey) => {\n const depCat = categories.find((c) => c.key === depKey);\n return depCat?.selectedIds && depCat.selectedIds.length > 0;\n });\n\n // If category is disabled, return empty items array to hide all items\n if (!isEnabled) {\n return [{ itens: [] }];\n }\n\n const filters =\n (category.filteredBy as {\n key: string;\n internalField: string;\n label?: string;\n }[]) || [];\n\n if (filters.length === 0) {\n return [{ itens: category?.itens || [] }];\n }\n\n const selectedIdsArr = getSelectedIdsForFilters(filters);\n\n if (selectedIdsArr.some((arr) => arr.length === 0)) {\n return [{ itens: [] }];\n }\n\n const combinations = cartesian(selectedIdsArr);\n const groupedMap: Record<string, { groupLabel?: string; itens: Item[] }> =\n {};\n\n for (const comboIds of combinations) {\n processCombination(comboIds, filters, category, groupedMap);\n }\n\n const groupedItems = Object.values(groupedMap).filter(\n (g) => g.itens.length\n );\n\n return groupedItems.length ? groupedItems : [{ itens: [] }];\n };\n\n const formattedItemsMap = useMemo(() => {\n const formattedItemsMap: Record<\n string,\n { groupLabel?: string; itens: Item[] }[]\n > = {};\n\n for (const category of categories) {\n const formattedItems = calculateFormattedItems(category.key);\n formattedItemsMap[category.key] = formattedItems;\n }\n\n return formattedItemsMap;\n }, [categories]);\n\n const getFormattedItems = (categoryKey: string) => {\n return formattedItemsMap[categoryKey] || [{ itens: [] }];\n };\n\n // Helper function to get badge text for category\n const getBadgeText = (category: CategoryConfig): string => {\n const formattedItems = getFormattedItems(category.key);\n return getBadgeTextHelper(category, formattedItems);\n };\n\n // Helper function to check if category is enabled\n const isCategoryEnabled = (category: CategoryConfig): boolean => {\n return isCategoryEnabledHelper(category, categories);\n };\n\n // Helper function to handle accordion value change\n const handleAccordionValueChange = (value: string | string[] | undefined) => {\n const newValue = handleAccordionValueChangeHelper(\n value,\n categories,\n isCategoryEnabled\n );\n if (newValue !== null) {\n setOpenAccordion(newValue);\n }\n };\n\n const getDependentCategories = (categoryKey: string): string[] => {\n return categories\n .filter((cat) => cat.dependsOn?.includes(categoryKey))\n .map((cat) => cat.key);\n };\n\n // Helper function to find items to remove from dependent category\n const findItemsToRemove = (\n depCategory: CategoryConfig,\n relevantFilter: { key: string; internalField: string },\n deselectedItemId: string\n ): string[] => {\n return (\n depCategory.itens\n ?.filter(\n (item) => item[relevantFilter.internalField] === deselectedItemId\n )\n .map((item) => item.id) || []\n );\n };\n\n // Helper function to process dependent category for deselection\n const processDependentCategory = (\n depCategoryKey: string,\n categoryKey: string,\n deselectedItemId: string,\n itemsToDeselect: Record<string, string[]>\n ) => {\n const depCategory = categories.find((c) => c.key === depCategoryKey);\n if (!depCategory?.filteredBy) return;\n\n const relevantFilter = depCategory.filteredBy.find(\n (f) => f.key === categoryKey\n );\n if (!relevantFilter) return;\n\n const itemsToRemove = findItemsToRemove(\n depCategory,\n relevantFilter,\n deselectedItemId\n );\n if (itemsToRemove.length > 0) {\n itemsToDeselect[depCategoryKey] = itemsToRemove;\n }\n };\n\n const getItemsToDeselect = (\n categoryKey: string,\n deselectedItemId: string\n ) => {\n const deselectedItem = categories\n .find((c) => c.key === categoryKey)\n ?.itens?.find((item) => item.id === deselectedItemId);\n if (!deselectedItem) return {};\n\n const itemsToDeselect: Record<string, string[]> = {};\n const dependentCategories = getDependentCategories(categoryKey);\n\n for (const depCategoryKey of dependentCategories) {\n processDependentCategory(\n depCategoryKey,\n categoryKey,\n deselectedItemId,\n itemsToDeselect\n );\n }\n\n return itemsToDeselect;\n };\n\n // Helper function to update category with new selected IDs\n const updateCategorySelectedIds = (\n updatedCategories: CategoryConfig[],\n depCategoryIndex: number,\n depCategory: CategoryConfig,\n itemIds: string[]\n ): CategoryConfig[] => {\n const newSelectedIds =\n depCategory.selectedIds?.filter((id) => !itemIds.includes(id)) || [];\n\n updatedCategories[depCategoryIndex] = {\n ...depCategory,\n selectedIds: newSelectedIds,\n };\n\n return updatedCategories;\n };\n\n // Helper function to apply recursive cascade deselection\n const applyRecursiveCascade = (\n depCategoryKey: string,\n itemIds: string[],\n updatedCategories: CategoryConfig[]\n ): CategoryConfig[] => {\n let result = updatedCategories;\n for (const itemId of itemIds) {\n result = applyCascadeDeselection(depCategoryKey, itemId, result);\n }\n return result;\n };\n\n const applyCascadeDeselection = (\n categoryKey: string,\n deselectedItemId: string,\n currentCategories: CategoryConfig[]\n ): CategoryConfig[] => {\n const itemsToDeselect = getItemsToDeselect(categoryKey, deselectedItemId);\n let updatedCategories = [...currentCategories];\n\n for (const [depCategoryKey, itemIds] of Object.entries(itemsToDeselect)) {\n const depCategoryIndex = updatedCategories.findIndex(\n (c) => c.key === depCategoryKey\n );\n\n if (depCategoryIndex !== -1) {\n const depCategory = updatedCategories[depCategoryIndex];\n updatedCategories = updateCategorySelectedIds(\n updatedCategories,\n depCategoryIndex,\n depCategory,\n itemIds\n );\n updatedCategories = applyRecursiveCascade(\n depCategoryKey,\n itemIds,\n updatedCategories\n );\n }\n }\n\n return updatedCategories;\n };\n\n const toggleAllInCategory = (categoryKey: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return;\n\n // Obtém apenas os itens filtrados (visíveis)\n const formattedItems = getFormattedItems(categoryKey);\n const filteredItems = formattedItems.flatMap((group) => group.itens || []);\n const filteredItemIds = filteredItems.map((item) => item.id);\n\n // Verifica quantos itens filtrados estão selecionados\n const selectedFilteredCount = filteredItemIds.filter((itemId) =>\n category.selectedIds?.includes(itemId)\n ).length;\n\n // Se NENHUM item filtrado está selecionado OU pelo menos um está selecionado mas não todos,\n // então seleciona todos os itens filtrados\n // Se TODOS os itens filtrados estão selecionados, então deseleciona todos os filtrados\n const allFilteredSelected =\n selectedFilteredCount === filteredItemIds.length;\n\n const newSelection = allFilteredSelected\n ? category.selectedIds?.filter((id) => !filteredItemIds.includes(id)) ||\n []\n : [\n ...(category.selectedIds || []),\n ...filteredItemIds.filter(\n (id) => !category.selectedIds?.includes(id)\n ),\n ];\n\n let updatedCategories = categories.map((c) =>\n c.key === categoryKey ? { ...c, selectedIds: newSelection } : c\n );\n\n // Se está deselecionando, aplica cascata para os itens que foram deselecionados\n if (allFilteredSelected) {\n for (const itemId of filteredItemIds) {\n updatedCategories = applyCascadeDeselection(\n categoryKey,\n itemId,\n updatedCategories\n );\n }\n }\n\n onCategoriesChange(updatedCategories);\n };\n\n const toggleItem = (categoryKey: string, itemId: string) => {\n const category = categories.find((c) => c.key === categoryKey);\n if (!category) return;\n const isCurrentlySelected = category.selectedIds?.includes(itemId);\n const newSelection = isCurrentlySelected\n ? category.selectedIds?.filter((id) => id !== itemId)\n : [...(category.selectedIds || []), itemId];\n\n let updatedCategories = categories.map((c) =>\n c.key === categoryKey ? { ...c, selectedIds: newSelection } : c\n );\n\n // Se está deselecionando, aplica cascata\n if (isCurrentlySelected) {\n updatedCategories = applyCascadeDeselection(\n categoryKey,\n itemId,\n updatedCategories\n );\n }\n\n onCategoriesChange(updatedCategories);\n };\n\n // Helper component to render individual checkbox item\n const renderCheckboxItem = (item: Item, categoryKey: string) => {\n // Generate unique ID by combining category key and item id to avoid conflicts\n const uniqueId = `${categoryKey}-${item.id}`;\n\n return (\n <div key={item.id} className=\"flex items-center gap-3 px-2\">\n <CheckBox\n id={uniqueId}\n checked={isCheckBoxIsSelected(categoryKey, item.id)}\n onChange={() => toggleItem(categoryKey, item.id)}\n />\n <label\n htmlFor={uniqueId}\n className=\"text-sm text-text-950 cursor-pointer select-none\"\n >\n {item.name}\n </label>\n </div>\n );\n };\n\n // Helper component to render formatted group\n const renderFormattedGroup = (\n formattedGroup: { groupLabel?: string; itens: Item[] },\n idx: number,\n categoryKey: string\n ) => (\n <div\n key={formattedGroup.groupLabel || `group-${idx}`}\n className=\"flex flex-col gap-3\"\n >\n {'groupLabel' in formattedGroup && formattedGroup.groupLabel && (\n <Text size=\"sm\" className=\"mt-2\" weight=\"semibold\">\n {formattedGroup.groupLabel}\n </Text>\n )}\n {formattedGroup.itens?.map((item: Item) =>\n renderCheckboxItem(item, categoryKey)\n )}\n </div>\n );\n\n // Helper component to render accordion trigger\n const renderAccordionTrigger = (\n category: CategoryConfig,\n isEnabled: boolean\n ) => {\n const allSelected = areAllFilteredItemsSelected(category.key);\n const someSelected = isMinimalOneCheckBoxIsSelected(category.key);\n\n return (\n <div className=\"flex items-center justify-between w-full p-2\">\n <div className=\"flex items-center gap-3\">\n <CheckBox\n checked={allSelected}\n disabled={!isEnabled}\n indeterminate={someSelected && !allSelected}\n onChange={() => toggleAllInCategory(category.key)}\n />\n <Text\n size=\"sm\"\n weight=\"medium\"\n className={cn('text-text-800', !isEnabled && 'opacity-40')}\n >\n {category.label}\n </Text>\n </div>\n {(openAccordion === category.key || isEnabled) && (\n <Badge variant=\"solid\" action=\"info\">\n {getBadgeText(category)}\n </Badge>\n )}\n </div>\n );\n };\n\n // Helper component to render compact single item view\n const renderCompactSingleItem = (category: CategoryConfig) => {\n const formattedItems = getFormattedItems(category.key);\n const allItems = formattedItems.flatMap((group) => group.itens || []);\n\n if (allItems.length !== 1) {\n return null;\n }\n\n const singleItem = allItems[0];\n\n return (\n <div\n key={category.key}\n className=\"flex items-center justify-between w-full px-3 py-2\"\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-800\">\n {category.label}\n </Text>\n <Text size=\"sm\" className=\"text-text-950\">\n {singleItem.name}\n </Text>\n </div>\n );\n };\n\n // Helper component to render category accordion\n const renderCategoryAccordion = (category: CategoryConfig) => {\n // Check if category is enabled based on dependencies\n const isEnabled = isCategoryEnabled(category);\n const hasOnlyOneItem = category.itens?.length === 1;\n\n if (hasOnlyOneItem && !compactSingleItem && !showSingleItem) {\n return null;\n }\n\n const formattedItems = getFormattedItems(category.key);\n const allItems = formattedItems.flatMap((group) => group.itens || []);\n const hasOnlyOneAvailableItem = allItems.length === 1;\n\n // If compactSingleItem is enabled and there's only one available item, render compact version\n if (compactSingleItem && hasOnlyOneAvailableItem && isEnabled) {\n return (\n <div key={category.key}>\n {renderCompactSingleItem(category)}\n {showDivider && <Divider />}\n </div>\n );\n }\n\n const hasNoItems = formattedItems.every(\n (group) => !group.itens || group.itens.length === 0\n );\n\n return (\n <div key={category.key}>\n <CardAccordation\n value={category.key}\n disabled={!isEnabled}\n className={cn(\n 'bg-transparent border-0',\n openAccordion === category.key && 'bg-background-50 border-none'\n )}\n trigger={renderAccordionTrigger(category, isEnabled)}\n >\n <div className=\"flex flex-col gap-3 pt-2\">\n {hasNoItems && isEnabled ? (\n <div className=\"px-2 py-4\">\n <Text size=\"sm\" className=\"text-text-500 text-center\">\n Sem dados\n </Text>\n </div>\n ) : (\n formattedItems.map((formattedGroup, idx) =>\n renderFormattedGroup(formattedGroup, idx, category.key)\n )\n )}\n </div>\n </CardAccordation>\n {openAccordion !== category.key && showDivider && <Divider />}\n </div>\n );\n };\n\n // Auto-collapse accordion when category becomes disabled\n useEffect(() => {\n if (!openAccordion) return;\n\n const category = categories.find((c) => c.key === openAccordion);\n if (!category) return;\n\n // Check if the open category is now disabled\n const isEnabled = isCategoryEnabled(category);\n\n // If category is disabled, close it\n if (!isEnabled) {\n // Use setTimeout to ensure this runs after any other state updates\n setTimeout(() => {\n setOpenAccordion('');\n }, 0);\n }\n }, [categories, openAccordion]);\n\n return (\n <AccordionGroup\n type=\"single\"\n collapsible\n value={openAccordion}\n onValueChange={handleAccordionValueChange}\n >\n {categories.map(renderCategoryAccordion)}\n </AccordionGroup>\n );\n};\n","// Complete bundle index - includes all components\n// Individual imports still recommended for better tree-shaking\n\n// CSS import\nimport './styles.css';\n\n// Layout Components\nexport { PageContainer } from './components/PageContainer/PageContainer';\nexport type { PageContainerProps } from './components/PageContainer/PageContainer';\n\n// Basic Components\nexport { default as Text } from './components/Text/Text';\nexport { default as Button } from './components/Button/Button';\nexport { default as Badge } from './components/Badge/Badge';\nexport { default as Alert } from './components/Alert/Alert';\nexport { default as LatexRenderer } from './components/LatexRenderer/LatexRenderer';\nexport type { LatexRendererProps } from './components/LatexRenderer/LatexRenderer';\nexport {\n HtmlMathRenderer,\n processHtmlWithMath,\n sanitizeHtmlForDisplay,\n cleanLatex,\n containsMath,\n stripHtml,\n looksLikeLatex,\n isLikelyMarkdown,\n} from './components/HtmlMathRenderer';\nexport type {\n HtmlMathRendererProps,\n MathPart,\n} from './components/HtmlMathRenderer';\nexport {\n MarkdownMathRenderer,\n protectCurrencyInlineMath,\n reflowDisplayMath,\n} from './components/MarkdownMathRenderer';\nexport type { MarkdownMathRendererProps } from './components/MarkdownMathRenderer';\nexport { default as IconButton } from './components/IconButton/IconButton';\nexport { Tooltip } from './components/Tooltip/Tooltip';\nexport type { TooltipProps } from './components/Tooltip/Tooltip';\nexport { TruncatedText } from './components/TruncatedText/TruncatedText';\nexport type {\n TruncatedTextProps,\n TruncatedTextSize,\n TruncatedTextWeight,\n TruncatedTextTooltipPosition,\n} from './components/TruncatedText/TruncatedText';\nexport { default as IconRoundedButton } from './components/IconRoundedButton/IconRoundedButton';\nexport { default as NavButton } from './components/NavButton/NavButton';\nexport { default as SelectionButton } from './components/SelectionButton/SelectionButton';\nexport { default as CheckBox } from './components/CheckBox/CheckBox';\nexport { default as ToggleSwitch } from './components/ToggleSwitch/ToggleSwitch';\nexport type { ToggleSwitchProps } from './components/ToggleSwitch/ToggleSwitch';\nexport { default as ImageUpload } from './components/ImageUpload/ImageUpload';\nexport type { ImageUploadProps } from './components/ImageUpload/ImageUpload';\nexport { default as FileDropzone } from './components/FileDropzone/FileDropzone';\nexport type {\n FileDropzoneProps,\n FileType,\n} from './components/FileDropzone/FileDropzone';\nexport {\n default as CheckboxList,\n CheckboxListItem,\n} from './components/CheckBox/CheckboxList';\n\n// CheckboxGroup Component\nexport {\n CheckboxGroup,\n type CategoryConfig,\n type Item,\n} from './components/CheckBoxGroup/CheckBoxGroup';\nexport { AlertsManager } from './components/AlertManager/AlertsManager';\nexport { useAlertFormStore } from './components/AlertManager/useAlertForm';\nexport { AlertsManagerView } from './components/AlertManagerView/AlertsManagerView';\nexport type {\n AlertViewData,\n RecipientStatus,\n} from './components/AlertManagerView/AlertsManagerView';\nexport type {\n AlertsConfig,\n AlertData,\n RecipientItem,\n} from './components/AlertManager/types';\nexport { AppHeader } from './components/AppHeader/AppHeader';\nexport type {\n AppHeaderProps,\n AppHeaderUser,\n AppHeaderSessionInfo,\n AppHeaderNotifications,\n} from './components/AppHeader/AppHeader';\nexport { AppLayout } from './components/AppLayout/AppLayout';\nexport type {\n AppLayoutProps,\n AppLayoutMenuItem,\n} from './components/AppLayout/AppLayout';\nexport {\n default as Radio,\n RadioGroup,\n RadioGroupItem,\n} from './components/Radio/Radio';\nexport { default as TextArea } from './components/TextArea/TextArea';\nexport { default as Toast } from './components/Toast/Toast';\nexport { default as Toaster } from './components/Toast/utils/Toaster';\nexport { default as Divider } from './components/Divider/Divider';\nexport { default as useToastStore } from './components/Toast/utils/ToastStore';\nexport { default as Input } from './components/Input/Input';\nexport { default as ColorPicker } from './components/ColorPicker/ColorPicker';\nexport type { ColorPickerProps } from './components/ColorPicker/ColorPicker';\nexport { default as Search } from './components/Search/Search';\nexport { default as Chips } from './components/Chips/Chips';\nexport { default as ProgressBar } from './components/ProgressBar/ProgressBar';\nexport { default as ProgressCircle } from './components/ProgressCircle/ProgressCircle';\nexport { default as Stepper } from './components/Stepper/Stepper';\nexport { default as Calendar } from './components/Calendar/Calendar';\nexport { DateTimeInput } from './components/DateTimeInput';\nexport type { DateTimeInputProps } from './components/DateTimeInput';\nexport { default as Modal } from './components/Modal/Modal';\nexport { default as CorrectActivityModal } from './components/CorrectActivityModal/CorrectActivityModal';\nexport type { CorrectActivityModalProps } from './components/CorrectActivityModal/CorrectActivityModal';\nexport {\n QUESTION_STATUS as CORRECTION_QUESTION_STATUS,\n getQuestionStatusBadgeConfig,\n convertApiResponseToCorrectionData,\n} from './utils/studentActivityCorrection';\nexport type {\n QuestionStatus as CorrectionQuestionStatus,\n StudentQuestion,\n StudentActivityCorrectionData,\n QuestionsAnswersByStudentResponse,\n} from './utils/studentActivityCorrection';\n\n// FileAttachment Component\nexport { default as FileAttachment } from './components/FileAttachment/FileAttachment';\nexport {\n generateFileId,\n formatFileSize,\n} from './components/FileAttachment/FileAttachment';\nexport type {\n FileAttachmentProps,\n AttachedFile,\n} from './components/FileAttachment/FileAttachment';\n\nexport { AlertDialog } from './components/AlertDialog/AlertDialog';\nexport { default as LoadingModal } from './components/LoadingModal/loadingModal';\nexport { default as ProgressModal } from './components/ProgressModal/ProgressModal';\nexport type { ProgressModalProps } from './components/ProgressModal/ProgressModal';\nexport { default as ScoreCircle } from './components/ScoreCircle/ScoreCircle';\nexport type {\n ScoreCircleProps,\n ScoreCircleVariant,\n} from './components/ScoreCircle/ScoreCircle';\nexport { default as ImagePreviewCard } from './components/ImagePreviewCard/ImagePreviewCard';\nexport type { ImagePreviewCardProps } from './components/ImagePreviewCard/ImagePreviewCard';\nexport { default as NotificationCard } from './components/NotificationCard/NotificationCard';\nexport { default as CalendarCard } from './components/CalendarCard/CalendarCard';\nexport type { CalendarCardProps } from './components/CalendarCard/CalendarCard';\nexport { ThemeToggle } from './components/ThemeToggle/ThemeToggle';\n\n// Choropleth Map Component\nexport { default as ChoroplethMap } from './components/ChoroplethMap/ChoroplethMap';\nexport type {\n ChoroplethMapProps,\n RegionData,\n MapBounds,\n LegendItem,\n ColorClass,\n} from './components/ChoroplethMap/ChoroplethMap.types';\n\n// Map Data Hook\nexport { createUseMapData } from './hooks/useMapData';\nexport type { UseMapDataReturn } from './hooks/useMapData';\nexport { REPORT_PERIOD, REPORT_MODAL_VARIANT } from './types/common';\nexport type {\n MapFilters as MapDataFilters,\n MapDataRegion,\n MapDataApiResponse,\n MapDataBounds,\n} from './types/mapData';\n\n// Export notification card types\nexport type {\n NotificationItem,\n NotificationGroup,\n} from './components/NotificationCard/NotificationCard';\n\n// Subject Components\nexport {\n SubjectInfo,\n getSubjectInfo,\n getSubjectIcon,\n getSubjectColorClass,\n getSubjectName,\n} from './components/SubjectInfo/SubjectInfo';\nexport type {\n SubjectData,\n IconProps as SubjectIconProps,\n} from './components/SubjectInfo/SubjectInfo';\n\n// Notification Store\nexport {\n createNotificationStore,\n formatTimeAgo,\n} from './store/notificationStore';\nexport { createUseNotificationStore } from './hooks/useNotificationStore';\nexport {\n createUseNotifications,\n createNotificationsHook,\n} from './hooks/useNotifications';\nexport { NotificationEntityType } from './types/notifications';\nexport { questionTypeLabels } from './types/questionTypes';\nexport type {\n Notification,\n NotificationType,\n BackendNotification,\n BackendNotificationsResponse,\n NotificationsResponse,\n FetchNotificationsParams,\n NotificationApiClient,\n} from './types/notifications';\nexport type {\n NotificationState,\n NotificationActions,\n NotificationStore,\n} from './store/notificationStore';\n\n// Activity Filters Data Hook (consolidated hook for all filter data)\nexport {\n createUseActivityFiltersData,\n createActivityFiltersDataHook,\n} from './hooks/useActivityFiltersData';\nexport type {\n UseActivityFiltersDataReturn,\n UseActivityFiltersDataOptions,\n} from './hooks/useActivityFiltersData';\n\n// Questions List Hook\nexport {\n createUseQuestionsList,\n createQuestionsListHook,\n} from './hooks/useQuestionsList';\nexport { CreateActivity } from './components/ActivityCreate/ActivityCreate';\nexport {\n ActivityType,\n ActivityStatus,\n} from './components/ActivityCreate/ActivityCreate';\nexport type {\n ActivityData,\n BackendFiltersFormat,\n ActivityDraftResponse,\n ActivityPreFiltersInput,\n ActivityCreatePayload,\n ActivityCreateResponse,\n School,\n SchoolYear,\n Class,\n Student,\n} from './components/ActivityCreate/ActivityCreate';\n\n// RecommendedLessonCreate Component\nexport { RecommendedLessonCreate } from './components/RecommendedLessonCreate';\nexport type {\n LessonBackendFiltersFormat,\n RecommendedLessonDraftResponse,\n RecommendedLessonData,\n RecommendedLessonPreFiltersInput,\n RecommendedLessonCreatePayload,\n RecommendedLessonCreateResponse,\n} from './components/RecommendedLessonCreate';\nexport type { UseQuestionsListReturn } from './hooks/useQuestionsList';\nexport type {\n Question as QuestionActivity,\n Pagination,\n QuestionsFilterBody,\n QuestionOptionActivity,\n KnowledgeMatrixItemActivity,\n QuestionBankYearActivity,\n PaginationActivity,\n QuestionsListResponseActivity,\n} from './types/questions';\nexport { DIFFICULTY_LEVEL_ENUM, QUESTION_STATUS_ENUM } from './types/questions';\n\n// API Types\nexport type { BaseApiClient } from './types/api';\n\n// Theme Store\nexport { useThemeStore } from './store/themeStore';\nexport type { ThemeStore, ThemeState, ThemeActions } from './store/themeStore';\n\n// Storage Keys\nexport { KEYS, FEATURE_FLAGS_KEYS } from './utils/keys';\n\n// DropdownMenu Components\nexport {\n default as DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n ProfileMenuTrigger,\n ProfileMenuFooter,\n ProfileMenuHeader,\n ProfileMenuInfo,\n ProfileMenuSection,\n MenuLabel,\n DropdownMenuSeparator,\n ProfileToggleTheme,\n} from './components/DropdownMenu/DropdownMenu';\n\nexport {\n default as Table,\n TableHeader,\n TableBody,\n TableRow,\n TableHead,\n TableCell,\n TableFooter,\n TableCaption,\n TablePagination,\n useTableSort,\n} from './components/Table/Table';\nexport type {\n UseTableSortOptions,\n SortDirection,\n} from './components/Table/Table';\n\n// Filter Components\nexport { FilterModal, useTableFilter } from './components/Filter';\nexport type {\n FilterModalProps,\n FilterConfig,\n UseTableFilterOptions,\n UseTableFilterReturn,\n} from './components/Filter';\n\n// SimulatedFilters Components\nexport {\n SimulatedFiltersModal,\n StudentsFilterSection,\n useUserAccessData as useSimulatedUserAccessData,\n useStudentsFilter as useSimulatedStudentsFilter,\n} from './components/SimulatedFilters';\nexport type {\n SimulatedFilters,\n SimulatedFiltersModalProps,\n SchoolItem as SimulatedSchoolItem,\n SchoolYearItem as SimulatedSchoolYearItem,\n ClassItem as SimulatedClassItem,\n StudentFilterItem,\n StudentGroup,\n UserAccessDataApiResponse as SimulatedUserAccessDataApiResponse,\n StudentsFilterApiResponse as SimulatedStudentsFilterApiResponse,\n StudentsFilterParams,\n UseUserAccessDataState,\n UseUserAccessDataReturn,\n UseStudentsFilterState,\n UseStudentsFilterReturn,\n StudentsFilterSectionProps,\n} from './components/SimulatedFilters';\n\n// GeneralOverviewSection Component\nexport {\n GeneralOverviewSection,\n useGeneralOverview,\n} from './components/GeneralOverviewSection';\nexport type {\n AreaKnowledgePerformance,\n EssayPerformance,\n GeneralOverviewData,\n SubjectItem as GeneralOverviewSubjectItem,\n GeneralOverviewParams,\n GeneralOverviewApiResponse,\n UseGeneralOverviewState,\n UseGeneralOverviewReturn,\n GeneralOverviewSectionProps,\n GeneralOverviewLabels,\n} from './components/GeneralOverviewSection';\n\n// AreaKnowledgeSelector Component\nexport {\n AreaKnowledgeSelector,\n ESSAY_AREA_ID,\n} from './components/AreaKnowledgeSelector';\nexport type { AreaKnowledgeSelectorProps } from './components/AreaKnowledgeSelector';\n\n// SimulatedSubjectMenu Component\nexport {\n SimulatedSubjectMenu,\n useSimulatedSubjects,\n} from './components/SimulatedSubjectMenu';\nexport type {\n SimulatedSubjectItem,\n SimulatedSubjectsApiResponse,\n UseSimulatedSubjectsState,\n UseSimulatedSubjectsReturn,\n SimulatedSubjectMenuProps,\n} from './components/SimulatedSubjectMenu';\n\n// SimulatedStudentRanking Component\nexport {\n SimulatedStudentRanking,\n SimulatedRankingCard,\n} from './components/SimulatedStudentRanking';\nexport type {\n RankingVariant,\n SimulatedStudentRankingItem,\n SimulatedStudentRankingProps,\n SimulatedRankingCardProps,\n} from './components/SimulatedStudentRanking';\n\n// PerformanceDistributionChart Component\nexport { PerformanceDistributionChart } from './components/PerformanceDistributionChart';\nexport type {\n SimulatedPerformanceCounters,\n SliceData,\n PerformanceDistributionChartProps,\n} from './components/PerformanceDistributionChart';\n\n// SimulatedStudentDetailsModal Component\nexport {\n SimulatedStudentDetailsModal,\n useSimulatedStudentDetails,\n isStudentSubjectsData,\n isStudentContentsData,\n simulationTypeToActivityFilters,\n SIMULATED_PERFORMANCE_TAG_CONFIG,\n PERFORMANCE_TAG_TO_BADGE_ACTION,\n PerformanceBadgeAction,\n ReportSimulationType,\n} from './components/SimulatedStudentDetailsModal';\nexport type {\n SimulatedPerformanceTag,\n SimulatedPerformanceTagConfig,\n SimulationType,\n StudentDetailsInfo,\n SubjectPerformanceItem,\n StudentContentPerformanceItem,\n StudentSubjectsData,\n StudentContentsData,\n StudentDetailsData,\n ActivityFilters as SimulatedActivityFilters,\n StudentDetailsParams,\n StudentDetailsApiResponse,\n UseSimulatedStudentDetailsState,\n UseSimulatedStudentDetailsReturn,\n SimulatedStudentDetailsModalProps,\n} from './components/SimulatedStudentDetailsModal';\n\n// SimulatedContentsPerformance Hook\nexport { useSimulatedContents } from './components/SimulatedContentsPerformance';\nexport type {\n SimulatedContentItem,\n ContentsPerformanceData,\n SimulatedContentsParams,\n ContentsPerformanceApiResponse,\n UseSimulatedContentsState,\n UseSimulatedContentsReturn,\n} from './components/SimulatedContentsPerformance';\n\n// SimulatedContentDetailsModal Component\nexport {\n SimulatedContentDetailsModal,\n useSimulatedContentDetails,\n} from './components/SimulatedContentDetailsModal';\nexport type {\n ContentDetailsInfo,\n ContentPerformanceCounters,\n ContentStudentItem,\n ContentStudentsPaginated,\n ContentDetailsData,\n ContentDetailsParams,\n ContentDetailsApiResponse,\n UseSimulatedContentDetailsState,\n UseSimulatedContentDetailsReturn,\n SimulatedContentDetailsModalProps,\n} from './components/SimulatedContentDetailsModal';\n\n// EssayCompetencies Components\nexport {\n EssayCompetenciesTable,\n EssayCompetenceDetailsModal,\n useEssayCompetenciesOverview,\n useEssayCompetenceDetails,\n} from './components/EssayCompetencies';\nexport type {\n EssayCompetencyOverviewItem,\n EssayCompetenciesOverviewData,\n EssayCompetenciesOverviewParams,\n EssayCompetenciesOverviewApiResponse,\n EssayCompetenceInfo,\n EssayCompetenceCounters,\n EssayCompetenceStudentItem,\n EssayCompetenceStudentsPaginated,\n EssayCompetenceDetailsData,\n EssayCompetenceDetailsParams,\n EssayCompetenceDetailsApiResponse,\n UseEssayCompetenciesOverviewState,\n UseEssayCompetenciesOverviewReturn,\n UseEssayCompetenceDetailsState,\n UseEssayCompetenceDetailsReturn,\n EssayCompetenciesTableProps,\n EssayCompetenceDetailsModalProps,\n} from './components/EssayCompetencies';\n\n// SimulatedStudentsOverview Hook\nexport { useSimulatedOverview } from './components/SimulatedStudentsOverview';\nexport type {\n SimulatedStudentItem,\n SimulatedStudentsPaginated,\n SimulatedOverviewData,\n SimulatedOverviewParams,\n SimulatedOverviewApiResponse,\n UseSimulatedOverviewState,\n UseSimulatedOverviewReturn,\n} from './components/SimulatedStudentsOverview';\n\n// EssayStudentDetailsModal Component\nexport {\n EssayStudentDetailsModal,\n useEssayStudentDetails,\n} from './components/EssayStudentDetailsModal';\nexport type {\n EssayCompetencyPerformance,\n EssayStudentInfo,\n EssayStudentDetailsData,\n EssayStudentDetailsParams,\n EssayStudentDetailsApiResponse,\n UseEssayStudentDetailsState,\n UseEssayStudentDetailsReturn,\n EssayStudentDetailsLabels,\n EssayStudentDetailsModalProps,\n} from './components/EssayStudentDetailsModal';\n\n// ActivityFilters Component\nexport {\n ActivityFilters,\n ActivityFiltersPopover,\n} from './components/ActivityFilters/ActivityFilters';\nexport type {\n ActivityFiltersProps,\n ActivityFiltersPopoverProps,\n} from './components/ActivityFilters/ActivityFilters';\nexport type {\n ActivityFiltersData,\n Bank,\n BankYear,\n KnowledgeArea,\n KnowledgeItem,\n KnowledgeStructureState,\n} from './types/activityFilters';\n\nexport type { TablePaginationProps } from './components/Table/Table';\n\n// TableProvider Component\nexport { TableProvider } from './components/TableProvider';\nexport type {\n ColumnConfig,\n TableParams,\n PaginationConfig,\n TableProviderProps,\n EmptyStateConfig,\n} from './components/TableProvider';\n\n// Select Components\nexport {\n default as Select,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectItem,\n} from './components/Select/Select';\n\n// SearchSelect Component (Select with search functionality)\nexport { default as SearchSelect } from './components/SearchSelect/SearchSelect';\nexport type {\n SearchSelectProps,\n SearchSelectOption,\n SearchSelectPagination,\n} from './components/SearchSelect/SearchSelect';\n\n// TypeSelector Component (Activity/Exam type switcher)\nexport {\n TypeSelector,\n default as TypeSelectorDefault,\n} from './components/TypeSelector';\nexport type { TypeSelectorProps } from './components/TypeSelector';\nexport {\n type ActivityCategory,\n type ActiveTab,\n type TypeLabels,\n type TypeRoutes,\n type TypeConfig,\n ATIVIDADE_LABELS,\n PROVA_LABELS,\n DEFAULT_STATUS_OPTIONS,\n getTabPath,\n getTabFromPath,\n createActivityCategoryConfig,\n} from './components/TypeSelector';\n\n// Menu Components\nexport {\n default as Menu,\n MenuItem,\n MenuOverflow,\n MenuContent,\n} from './components/Menu/Menu';\n\n// PeriodSelector Component\nexport {\n PeriodSelector,\n Period,\n PERIOD_OPTIONS,\n} from './components/PeriodSelector';\nexport type {\n PeriodTab,\n PeriodValue,\n PeriodSelectorProps,\n} from './components/PeriodSelector';\n\n// Card Components\nexport {\n CardActivitiesResults,\n CardPerformance,\n CardProgress,\n CardQuestions,\n CardResults,\n CardSimulado,\n CardStatus,\n CardTopic,\n CardTest,\n CardSimulationHistory,\n CardAudio,\n CardEssayHistory,\n EssayStatus,\n EssayReviewStatus,\n} from './components/Card/Card';\nexport type {\n EssayHistoryItem,\n EssayHistoryData,\n} from './components/Card/Card';\nexport { StatisticsCard } from './components/StatisticsCard/StatisticsCard';\nexport {\n StudentRanking,\n RankingCard,\n} from './components/StudentRanking/StudentRanking';\nexport type {\n StudentRankingProps,\n StudentRankingItem,\n StudentRankingVariant,\n RankingCardProps,\n} from './components/StudentRanking/StudentRanking';\nexport { QuestionsData } from './components/QuestionsData/QuestionsData';\nexport type {\n QuestionsDataProps,\n QuestionsDataItem,\n} from './components/QuestionsData/QuestionsData';\n\n// Skeleton Components\nexport {\n Skeleton,\n SkeletonText,\n SkeletonCircle,\n SkeletonRectangle,\n SkeletonRounded,\n SkeletonCard,\n SkeletonList,\n SkeletonTable,\n} from './components/Skeleton/Skeleton';\n\n// Media Components\nexport { default as NotFound } from './components/NotFound/NotFound';\nexport { default as RestrictedAccess } from './components/RestrictedAccess/RestrictedAccess';\nexport type { RestrictedAccessProps } from './components/RestrictedAccess/RestrictedAccess';\nexport { default as TokenValidation } from './components/TokenValidation/TokenValidation';\nexport type { TokenValidationProps } from './components/TokenValidation/TokenValidation';\nexport { default as NoSearchResult } from './components/NoSearchResult/NoSearchResult';\nexport type { NoSearchResultProps } from './components/NoSearchResult/NoSearchResult';\nexport { default as EmptyState } from './components/EmptyState/EmptyState';\nexport type { EmptyStateProps } from './components/EmptyState/EmptyState';\nexport { default as VideoPlayer } from './components/VideoPlayer/VideoPlayer';\nexport { default as Whiteboard } from './components/Whiteboard/Whiteboard';\nexport { default as DownloadButton } from './components/DownloadButton/DownloadButton';\n\n// RichEditor - WYSIWYG editor with LaTeX support (requires @tiptap/* dependencies)\nexport { RichEditor } from './components/RichEditor/RichEditor';\nexport { FormulaDialog } from './components/RichEditor/components/FormulaDialog';\nexport { MathNode } from './components/RichEditor/components/MathNode';\nexport {\n processLatexInHtml,\n unprocessLatexInHtml,\n} from './components/RichEditor/components/utils';\nexport type {\n DownloadContent,\n DownloadButtonProps,\n} from './components/DownloadButton/DownloadButton';\n\n// Auth Components\nexport type { AuthContextType } from './components/Auth/Auth';\nexport {\n AuthProvider,\n ProtectedRoute,\n PublicRoute,\n withAuth,\n useAuth,\n useAuthGuard,\n useRouteAuth,\n getRootDomain,\n} from './components/Auth/Auth';\nexport { useTokenInUrl } from './components/Auth/useTokenInUrl';\nexport {\n CardAccordation,\n AccordionGroup,\n} from './components/Accordation/index';\nexport {\n AlternativesList,\n HeaderAlternative,\n} from './components/Alternative/Alternative';\nexport { createZustandAuthAdapter } from './components/Auth/zustandAuthAdapter';\nexport { useUrlAuthentication } from './components/Auth/useUrlAuthentication';\nexport { useApiConfig } from './components/Auth/useApiConfig';\n\n// Quiz Components\nexport { QuizVariant } from './components/Quiz/Quiz.types';\nexport {\n QuizTitle,\n Quiz,\n QuizHeader,\n QuizContent,\n QuizQuestionList,\n QuizFooter,\n} from './components/Quiz/Quiz';\nexport {\n getStatusBadge,\n QuizImageQuestion,\n QuizAlternative,\n QuizMultipleChoice,\n QuizDissertative,\n QuizTrueOrFalse,\n QuizConnectDots,\n} from './components/Quiz/QuizContent';\nexport {\n QuizHeaderResult,\n QuizListResult,\n QuizResultHeaderTitle,\n QuizResultTitle,\n QuizResultPerformance,\n QuizListResultByMateria,\n} from './components/Quiz/QuizResult';\nexport { TeacherFeedbackSection } from './components/Quiz/TeacherFeedbackSection';\nexport type { TeacherFeedbackSectionProps } from './components/Quiz/TeacherFeedbackSection';\nexport { useQuizStore } from './components/Quiz/useQuizStore';\nexport { formatExamInfo } from './components/Quiz/Quiz.utils';\n\n// Quiz Types and Enums\nexport {\n QUESTION_DIFFICULTY,\n QUESTION_TYPE,\n QUESTION_STATUS,\n ANSWER_STATUS,\n SUBTYPE_ENUM,\n QUIZ_TYPE,\n} from './components/Quiz/useQuizStore';\nexport { TrueFalseEnum } from './enums/Quiz';\nexport { SubjectEnum } from './enums/SubjectEnum';\nexport type {\n QuestionResult,\n Question,\n UserAnswerItem,\n QuizState,\n QuizInterface,\n DraftAnswerItem,\n SaveDraftPayload,\n DraftApiClient,\n} from './components/Quiz/useQuizStore';\n\n// Multiple Choice and Icon Components\nexport { MultipleChoiceList } from './components/MultipleChoice/MultipleChoice';\nexport { FillInBlanks } from './components/FillInBlanks/FillInBlanks';\nexport type {\n FillInBlanksProps,\n FillInBlanksOption,\n} from './components/FillInBlanks/FillInBlanks';\nexport { ConnectDots } from './components/ConnectDots/ConnectDots';\nexport type {\n ConnectDotsProps,\n ConnectDotsOption,\n} from './components/ConnectDots/ConnectDots';\nexport { default as IconRender } from './components/IconRender/IconRender';\n\n// Hooks\nexport { useMobile, getDeviceType } from './hooks/useMobile';\nexport type { DeviceType } from './hooks/useMobile';\nexport { useTheme } from './hooks/useTheme';\nexport type { ThemeMode } from './hooks/useTheme';\nexport { useBrandingLogo } from './hooks/useBrandingLogo';\nexport type {\n BrandingLogoVariant,\n UseBrandingLogoOptions,\n} from './hooks/useBrandingLogo';\nexport { BrandingLogo } from './components/BrandingLogo/BrandingLogo';\nexport type { BrandingLogoProps } from './components/BrandingLogo/BrandingLogo';\nexport { UserIcon } from './components/UserIcon/UserIcon';\nexport type { UserIconProps } from './components/UserIcon/UserIcon';\nexport { useDraftAutoSave } from './hooks/useDraftAutoSave';\nexport type {\n ApiClient as DraftApiClientAdapter,\n UseDraftAutoSaveOptions,\n} from './hooks/useDraftAutoSave';\nexport { useCep } from './hooks/useCep';\nexport type { CepData } from './hooks/useCep';\n\n// BreadcrumbMenu Components\nexport { BreadcrumbMenu } from './components/BreadcrumbMenu/BreadcrumbMenu';\nexport type { BreadcrumbMenuProps } from './components/BreadcrumbMenu/BreadcrumbMenu';\nexport { useBreadcrumbBuilder } from './components/BreadcrumbMenu/useBreadcrumbBuilder';\nexport type {\n BreadcrumbBuilderConfig,\n BreadcrumbLevel,\n BreadcrumbLevelWithData,\n BreadcrumbLevelStatic,\n} from './components/BreadcrumbMenu/useBreadcrumbBuilder';\nexport { useUrlParams } from './components/BreadcrumbMenu/useUrlParams';\nexport type { UrlParamsConfig } from './components/BreadcrumbMenu/useUrlParams';\nexport { useBreadcrumb } from './components/BreadcrumbMenu/breadcrumbStore';\nexport type { BreadcrumbItem } from './components/BreadcrumbMenu/breadcrumbStore';\n// Auth Hooks\nexport { useAppInitialization } from './hooks/useAppInitialization';\nexport { useAppContent } from './hooks/useAppContent';\nexport { useInstitutionId, useInstitution } from './hooks/useInstitution';\nexport type { InstitutionData } from './hooks/useInstitution';\nexport { useAuthStore } from './store/authStore';\nexport { useAppStore } from './store/appStore';\nexport { useQuestionFiltersStore } from './store/questionFiltersStore';\nexport type { QuestionFiltersState } from './store/questionFiltersStore';\nexport { useLessonFiltersStore } from './store/lessonFiltersStore';\nexport type { LessonFiltersState } from './store/lessonFiltersStore';\nexport { useModulesStore, DEFAULT_SIMULATIONS } from './store/modulesStore';\nexport type {\n ModulesState,\n ModulesConfig,\n SimulationsConfig,\n SimulationVisibility,\n} from './store/modulesStore';\nexport { useModules } from './hooks/useModules';\nexport type { UseModulesReturn } from './hooks/useModules';\nexport { ModuleProtectedRoute } from './components/ModuleProtectedRoute';\nexport type { ModuleProtectedRouteProps } from './components/ModuleProtectedRoute';\nexport type {\n AuthState,\n SessionInfo,\n AuthTokens,\n User,\n UserProfile,\n} from './store/authStore';\nexport { ActivityCardQuestionBanks } from './components/ActivityCardQuestionBanks/ActivityCardQuestionBanks';\nexport { ActivityCardQuestionPreview } from './components/ActivityCardQuestionPreview/ActivityCardQuestionPreview';\nexport { ActivityListQuestions } from './components/ActivityListQuestions/ActivityListQuestions';\nexport type { ActivityListQuestionsProps } from './components/ActivityListQuestions/ActivityListQuestions';\nexport type {\n ActivityCardQuestionPreviewProps,\n MatchingPairPreview,\n} from './components/ActivityCardQuestionPreview/ActivityCardQuestionPreview';\nexport { ActivityPreview } from './components/ActivityPreview/ActivityPreview';\nexport type {\n ActivityPreviewProps,\n PreviewQuestion,\n} from './components/ActivityPreview/ActivityPreview';\n\nexport { LessonPreview } from './components/LessonPreview/LessonPreview';\nexport type {\n LessonPreviewProps,\n PreviewLesson,\n} from './components/LessonPreview/LessonPreview';\n\nexport {\n QuestionsPdfGenerator,\n QuestionsPdfContent,\n useQuestionsPdfPrint,\n} from './components/QuestionsPdfGenerator';\nexport type { QuestionsPdfGeneratorProps } from './components/QuestionsPdfGenerator';\n// Utils\nexport {\n cn,\n getSubjectColorWithOpacity,\n syncDropdownState,\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n formatScore,\n formatPercentageRounded,\n} from './utils/utils';\nexport { convertActivityFiltersToQuestionsFilter } from './utils/questionFiltersConverter';\nexport {\n MASK_TYPE,\n applyInputMask,\n formatCep,\n formatCnpj,\n formatCpf,\n formatDocument,\n formatPhone,\n maskCepInput,\n maskCnpjInput,\n maskCpfInput,\n maskPhoneInput,\n} from './utils/brazilianFormatters';\nexport { BR_STATES_FULL, UF_LIST } from './utils/brazilianStates';\nexport type { UF } from './utils/brazilianStates';\nexport { default as MaskedInput } from './components/MaskedInput/MaskedInput';\nexport type { MaskedInputProps } from './components/MaskedInput/MaskedInput';\nexport { default as HierarchicalCheckboxGroup } from './components/HierarchicalCheckboxGroup/HierarchicalCheckboxGroup';\nexport type {\n HierarchicalCheckboxGroupItem,\n HierarchicalCheckboxGroupProps,\n HierarchicalCheckboxItem,\n HierarchicalCheckboxItemsLayout,\n} from './components/HierarchicalCheckboxGroup/HierarchicalCheckboxGroup';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './utils/questionTypeUtils';\n// Activity Details Types\nexport {\n STUDENT_ACTIVITY_STATUS,\n ACTIVITY_AVAILABILITY,\n studentActivityStatusSchema,\n} from './types/activityDetails';\n\n// Lesson Availability Types\nexport { LESSON_AVAILABILITY } from './types/lessonAvailability';\nexport type {\n LessonAvailability,\n LessonAvailabilityResult,\n} from './types/lessonAvailability';\n\n// Lesson Availability Utils\nexport {\n checkLessonAvailability,\n isLessonNotYetAvailable,\n isLessonExpired,\n} from './utils/lessonAvailabilityUtils';\n\n// Calendar Activity Utils (timezone-safe date helpers shared by aluno/professor)\nexport {\n getActivityDateKey,\n getCalendarActivityStatus,\n filterActivitiesFromDate,\n} from './utils/calendarActivityUtils';\nexport type { DatedActivity } from './utils/calendarActivityUtils';\n\n// Activity Details Utils\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n formatActivityDateToBrazilian,\n} from './utils/utils';\nexport type {\n StudentActivityStatus,\n ActivityAvailability,\n ActivityStudentData,\n Pagination as ActivityDetailsPagination,\n GeneralStats,\n QuestionStats,\n ActivityMetadata,\n ActivityDetailsData,\n ActivityDetailsQueryParams,\n ActivityStudentTableItem,\n StatusBadgeConfig,\n} from './types/activityDetails';\n\n// Activity Details Component\nexport { ActivityDetails } from './components/ActivityDetails/ActivityDetails';\nexport type { ActivityDetailsProps } from './components/ActivityDetails/ActivityDetails';\nexport { useActivityDetails } from './hooks/useActivityDetails';\nexport type { UseActivityDetailsReturn } from './hooks/useActivityDetails';\n\n// Support Components\nexport {\n Support,\n TicketModal,\n getCategoryIcon,\n supportSchema,\n} from './components/Support';\nexport type {\n SupportProps,\n TicketModalProps,\n SupportFormData,\n} from './components/Support';\n\n// Support Types\nexport {\n SupportStatus,\n SupportCategory,\n getStatusBadgeAction,\n getStatusText,\n getCategoryText,\n mapApiStatusToInternal,\n mapInternalStatusToApi,\n SupportType,\n} from './types/support';\nexport type {\n TicketStatus,\n ProblemType,\n TabType,\n SupportResponse,\n SupportTicket,\n CreateSupportTicketRequest,\n CreateSupportTicketResponse,\n SupportTicketAPI,\n SupportPagination,\n GetSupportTicketsResponse,\n SupportAnswerAPI,\n GetSupportAnswersResponse,\n SubmitSupportAnswerRequest,\n SubmitSupportAnswerResponse,\n SupportApiClient,\n SupportFeatureFlags,\n} from './types/support';\n\n// Zendesk Widget Component\nexport { ZendeskWidget } from './components/ZendeskWidget';\nexport type { ZendeskWidgetProps } from './components/ZendeskWidget';\n\n// Support Feature Flag Hook\nexport { useSupportFeatureFlag } from './hooks/useSupportFeatureFlag';\nexport type {\n UseSupportFeatureFlagConfig,\n UseSupportFeatureFlagReturn,\n} from './hooks/useSupportFeatureFlag';\n\n// SendActivityModal Component\nexport { SendActivityModal } from './components/SendActivityModal';\nexport { useSendActivityModal } from './components/SendActivityModal';\nexport type {\n SendActivityModalProps,\n SendActivityFormData,\n ActivitySubtype,\n StepErrors,\n StepState,\n StepConfig,\n SendActivityModalInitialData,\n} from './components/SendActivityModal';\nexport {\n validateActivityStep,\n validateRecipientStep,\n validateDeadlineStep,\n validateStep,\n isStepValid,\n isFormValid,\n ERROR_MESSAGES,\n} from './components/SendActivityModal';\n\n// ChooseActivityModelModal Component\nexport { ChooseActivityModelModal } from './components/ChooseActivityModelModal';\nexport type { ChooseActivityModelModalProps } from './components/ChooseActivityModelModal';\n\n// SaveActivityModelModal Component\nexport { SaveActivityModelModal } from './components/SaveActivityModelModal';\nexport type { SaveActivityModelModalProps } from './components/SaveActivityModelModal';\n\n// SendLessonModal Component\nexport { SendLessonModal } from './components/SendLessonModal';\nexport { useSendLessonModal } from './components/SendLessonModal';\nexport type {\n SendLessonModalProps,\n SendLessonFormData,\n StepErrors as SendLessonStepErrors,\n StepState as SendLessonStepState,\n StepConfig as SendLessonStepConfig,\n} from './components/SendLessonModal';\n\n// Recommended Lessons / RecommendedClass History Component\nexport {\n RecommendedLessonsHistory,\n RecommendedClassPageTab,\n} from './components/RecommendedLessonsHistory';\nexport type { RecommendedLessonsHistoryProps } from './components/RecommendedLessonsHistory';\n\n// Recommended Lesson Details Component\nexport {\n RecommendedLessonDetails,\n StudentPerformanceModal,\n} from './components/RecommendedLessonDetails';\nexport type {\n RecommendedLessonDetailsProps,\n StudentPerformanceModalProps,\n StudentPerformanceData,\n StudentPerformanceLabels,\n LessonProgress,\n LessonQuestion,\n QuestionAlternative,\n LessonDetailsLabels,\n DisplayStudent,\n} from './components/RecommendedLessonDetails';\n\n// Recommended Lessons Hook Factory\nexport {\n createUseRecommendedLessonsHistory,\n createRecommendedLessonsHistoryHook,\n determineRecommendedClassStatus,\n transformRecommendedClassToTableItem,\n handleRecommendedClassFetchError,\n recommendedClassHistoryApiResponseSchema,\n} from './hooks/useRecommendedLessons';\nexport type {\n UseRecommendedLessonsHistoryState,\n UseRecommendedLessonsHistoryReturn,\n} from './hooks/useRecommendedLessons';\n\n// Recommended Lessons Page Hook Factory\nexport {\n createUseRecommendedLessonsPage,\n createRecommendedLessonsPageHook,\n} from './hooks/useRecommendedLessonsPage';\nexport type {\n UseRecommendedLessonsPageConfig,\n UseRecommendedLessonsPageReturn,\n RecommendedLessonsApiClient,\n RecommendedLessonsUserData,\n RecommendedLessonsPagePaths,\n RecommendedLessonsPageEndpoints,\n RecommendedLessonsPageTexts,\n UserInstitution as RecommendedLessonsUserInstitution,\n SubTeacherTopicClass as RecommendedLessonsSubTeacherTopicClass,\n} from './hooks/useRecommendedLessonsPage';\n\n// Recommended Lesson Details Hook Factory\nexport {\n createUseRecommendedLessonDetails,\n createRecommendedLessonDetailsHook,\n handleLessonDetailsFetchError,\n recommendedClassApiResponseSchema,\n recommendedClassDetailsApiResponseSchema,\n historyApiResponseSchema,\n} from './hooks/useRecommendedLessonDetails';\nexport type {\n UseRecommendedLessonDetailsState,\n UseRecommendedLessonDetailsReturn,\n LessonDetailsApiClient,\n} from './hooks/useRecommendedLessonDetails';\n\n// Recommended Lessons Types\nexport {\n RecommendedClassApiStatus,\n RecommendedClassDisplayStatus,\n RecommendedClassBadgeActionType,\n getRecommendedClassStatusBadgeAction,\n RECOMMENDED_CLASS_FILTER_STATUS_OPTIONS,\n RECOMMENDED_CLASS_STATUS_OPTIONS,\n StudentLessonStatus,\n getStudentStatusBadgeAction,\n isDeadlinePassed,\n deriveStudentStatus,\n formatDaysToComplete,\n RecommendedClassDraftType,\n RECOMMENDED_CLASS_ACTIVITY_STATUS,\n} from './types/recommendedLessons';\nexport type {\n RecommendedClassSubject,\n RecommendedClassCreator,\n RecommendedClassStats,\n RecommendedClassBreakdown,\n RecommendedClassData,\n RecommendedClassHistoryItem,\n RecommendedClassTableItem,\n RecommendedClassHistoryApiResponse,\n RecommendedClassHistoryFilters,\n RecommendedClassHistoryPagination,\n RecommendedClassFilterOption,\n RecommendedClassUserFilterData,\n // Lesson Details API Types\n RecommendedClassDetailStudent,\n RecommendedClassDetailAggregated,\n RecommendedClassDetailContentPerformanceItem,\n RecommendedClassDetailContentPerformance,\n RecommendedClassDetailsData,\n RecommendedClassDetailsApiResponse,\n RecommendedClassLessonSubject,\n RecommendedClassLesson,\n RecommendedClassLessonProgress,\n RecommendedClassLessonsItem,\n RecommendedClassMetadata,\n RecommendedClassApiResponse,\n LessonDetailsData,\n // RecommendedClass Models Types\n RecommendedClassModelResponse,\n RecommendedClassModelTableItem,\n RecommendedClassModelsApiResponse,\n RecommendedClassModelFilters,\n RecommendedClassModelPagination,\n // RecommendedClass Activity Types\n RecommendedClassActivityStatus,\n RecommendedClassActivity,\n RecommendedClassSupUsersActivities,\n RecommendedClassActivities,\n} from './types/recommendedLessons';\n\n// RecommendedClass Models Hook Factory\nexport {\n createUseRecommendedClassModels,\n createRecommendedClassModelsHook,\n transformRecommendedClassModelToTableItem,\n handleRecommendedClassModelFetchError,\n recommendedClassModelsApiResponseSchema,\n DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION,\n} from './hooks/useRecommendedClassModels';\nexport type {\n UseRecommendedClassModelsState,\n UseRecommendedClassModelsReturn,\n} from './hooks/useRecommendedClassModels';\n\n// RecommendedClass Drafts Hook Factory\nexport {\n createUseRecommendedClassDrafts,\n createRecommendedClassDraftsHook,\n handleRecommendedClassDraftFetchError,\n DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION,\n} from './hooks/useRecommendedClassDrafts';\nexport type {\n UseRecommendedClassDraftsState,\n UseRecommendedClassDraftsReturn,\n} from './hooks/useRecommendedClassDrafts';\n\n// RecommendedClass Drafts Tab Component\nexport { RecommendedClassDraftsTab } from './components/RecommendedLessonsHistory/tabs/DraftsTab';\nexport type { RecommendedClassDraftsTabProps } from './components/RecommendedLessonsHistory/tabs/DraftsTab';\n\n// Activities History Component\nexport { ActivitiesHistory } from './components/ActivitiesHistory';\nexport type { ActivitiesHistoryProps } from './components/ActivitiesHistory';\n\n// Activity Page Layout Component\nexport {\n ActivityPageLayout,\n ActivityTab,\n} from './components/ActivityPageLayout';\nexport type { ActivityPageLayoutProps } from './components/ActivityPageLayout';\n\n// Unified History Page Component\nexport { UnifiedHistoryPage } from './components/UnifiedHistoryPage';\nexport type {\n UnifiedHistoryPageProps,\n UserData as UnifiedHistoryPageUserData,\n ApiFilterOptions as UnifiedHistoryPageApiFilterOptions,\n} from './components/UnifiedHistoryPage';\n\n// Unified Draft Model Page Component\nexport { UnifiedDraftModelPage } from './components/UnifiedDraftModelPage';\nexport type {\n UnifiedDraftModelPageProps,\n UserData as UnifiedDraftModelPageUserData,\n} from './components/UnifiedDraftModelPage';\n\n// Activities History Hook Factory\nexport {\n createUseActivitiesHistory,\n createActivitiesHistoryHook,\n transformActivityToTableItem,\n extractActivityFilterOptions,\n DEFAULT_ACTIVITIES_PAGINATION,\n DEFAULT_ACTIVITY_FILTER_OPTIONS,\n} from './hooks/useActivitiesHistory';\nexport type {\n UseActivitiesHistoryOptions,\n UseActivitiesHistoryState,\n UseActivitiesHistoryReturn,\n ActivityApiFilterOptions,\n} from './hooks/useActivitiesHistory';\n\n// Activity Drafts Hook Factory\nexport {\n createUseActivityDrafts,\n createActivityDraftsHook,\n transformDraftToTableItem as transformActivityDraftToTableItem,\n DEFAULT_DRAFTS_PAGINATION,\n} from './hooks/useActivityDrafts';\nexport type {\n UseActivityDraftsOptions,\n UseActivityDraftsState,\n UseActivityDraftsReturn,\n} from './hooks/useActivityDrafts';\n\n// Activity Models Hook Factory\nexport {\n createUseActivityModels,\n createActivityModelsHook,\n transformModelToTableItem,\n DEFAULT_MODELS_PAGINATION,\n} from './hooks/useActivityModels';\n\n// Activity Draft Model Page Hook (shared logic for drafts/models pages)\nexport { useActivityDraftModelPage } from './hooks/useActivityDraftModelPage';\nexport type {\n UseActivityDraftModelPageOptions,\n UseActivityDraftModelPageReturn,\n} from './hooks/useActivityDraftModelPage';\nexport type {\n UseActivityModelsOptions,\n UseActivityModelsState,\n UseActivityModelsReturn,\n} from './hooks/useActivityModels';\n\n// Students Highlight Hook Factory\nexport {\n createUseStudentsHighlight,\n createStudentsHighlightHook,\n calculatePerformancePercentage,\n transformStudentHighlightItem,\n handleStudentsHighlightFetchError,\n studentsHighlightApiResponseSchema,\n PERIOD_TABS,\n} from './hooks/useStudentsHighlight';\nexport type {\n StudentsHighlightPeriod,\n StudentsHighlightType,\n TrendDirection,\n StudentsHighlightFilters,\n StudentHighlightApiItem,\n StudentsHighlightApiResponse,\n StudentHighlightItem,\n UseStudentsHighlightState,\n UseStudentsHighlightReturn,\n} from './hooks/useStudentsHighlight';\n\n// Questions Data Hook Factory\nexport {\n createUseQuestionsData,\n createQuestionsDataHook,\n transformQuestionsData,\n handleQuestionsDataFetchError,\n questionsDataApiResponseSchema,\n} from './hooks/useQuestionsData';\nexport type {\n QuestionsDataPeriod,\n QuestionsDataTrendDirection,\n QuestionsDataFilters,\n QuestionsDataTrend,\n QuestionsDataApiData,\n QuestionsDataApiResponse,\n QuestionsDataHookResult,\n UseQuestionsDataState,\n UseQuestionsDataReturn,\n} from './hooks/useQuestionsData';\n\n// Activities History Types\nexport {\n ActivityApiStatus,\n ActivityDisplayStatus,\n ActivityBadgeActionType,\n ActivityDraftType,\n getActivityStatusBadgeAction,\n mapActivityStatusToDisplay,\n ACTIVITY_FILTER_STATUS_OPTIONS,\n} from './types/activitiesHistory';\nexport type {\n ActivityHistoryResponse,\n ActivityTableItem,\n ActivityPagination,\n ActivitiesHistoryApiResponse,\n ActivityHistoryFilters,\n ActivityDraftFilters,\n ActivityModelResponse,\n ActivityModelTableItem,\n ActivityModelsApiResponse,\n ActivityModelFilters,\n ActivityFilterOption,\n ActivityUserFilterData,\n} from './types/activitiesHistory';\n\n// Subject Mappers\nexport {\n mapSubjectNameToEnum,\n mapSubjectEnumToName,\n} from './utils/subjectMappers';\n\n// Subject Cell Renderer\nexport { renderSubjectCell } from './utils/renderSubjectCell';\nexport { renderTextCell } from './utils/renderTextCell';\n\n// Filter Helpers (robust version with deduplication)\nexport {\n getSchoolOptionsFromUserData,\n getSubjectOptionsFromUserData,\n getSchoolYearOptionsFromUserData,\n getClassOptionsFromUserData,\n buildUserFilterData,\n mergeFilterOptions,\n} from './utils/filterHelpers';\nexport type {\n UserInstitutionData,\n SubTeacherTopicClassData,\n UserFilterSourceData,\n} from './utils/filterHelpers';\n\n// Draft Model Filter Helpers\nexport { createDraftsModelsFiltersConfig } from './utils/draftModelFilterHelpers';\n\n// Pagination Types\nexport type { PaginationData } from './types/pagination';\n\n// Chat Hooks\nexport { useChat, createUseChat, WS_STATES } from './hooks/useChat';\nexport type { UseChatOptions, UseChatReturn } from './hooks/useChat';\nexport { useChatRooms, createUseChatRooms } from './hooks/useChatRooms';\nexport type {\n UseChatRoomsOptions,\n UseChatRoomsReturn,\n} from './hooks/useChatRooms';\n\n// Chat Types\nexport { CHAT_MESSAGE_TYPES, PROFILE_ROLES } from './types/chat';\nexport type {\n ChatMessageType,\n ChatUser,\n AvailableUsers,\n ChatRoom,\n ChatRoomWithDetails,\n ChatMessage,\n ChatParticipant,\n WSUserInfo,\n WSClientMessageType,\n WSServerMessageType,\n WSClientMessage,\n WSServerMessage,\n ChatApiClient,\n AvailableUsersResponse,\n CreateRoomResponse,\n GetRoomsResponse,\n GetRoomDetailsResponse,\n} from './types/chat';\n\n// Chat Component\nexport { Chat, ChatLoading } from './components/Chat';\nexport type { ChatProps } from './components/Chat';\n\n// Chat Utils\nexport {\n getChatWsUrl,\n getChatUserInfo,\n isChatUserInfoValid,\n} from './utils/chatUtils';\nexport type { ChatUserInfo } from './utils/chatUtils';\n\n// Chatbot Hook\nexport { createUseChatbot } from './hooks/useChatbot';\nexport type { UseChatbotReturn } from './hooks/useChatbot';\n\n// Chatbot Types\nexport { CHATBOT_MESSAGE_ROLES } from './types/chatbot';\nexport type {\n ChatbotRole,\n ChatbotMessage as ChatbotMessageData,\n ChatbotConversation,\n ChatbotCurrentContext,\n SendChatbotMessagePayload,\n SendChatbotMessageResult,\n ChatbotUser,\n ChatbotApiClient,\n} from './types/chatbot';\n\n// Chatbot Components\nexport {\n Chatbot,\n ChatbotFab,\n ChatbotPanel,\n ChatbotMessageList,\n ChatbotMessage,\n ChatbotInput,\n ChatbotTypingIndicator,\n ChatbotConversationList,\n ChatbotContentRenderer,\n} from './components/Chatbot';\nexport type {\n ChatbotProps,\n ChatbotFabProps,\n ChatbotPanelProps,\n ChatbotMessageListProps,\n ChatbotMessageProps,\n ChatbotInputProps,\n ChatbotTypingIndicatorProps,\n ChatbotConversationListProps,\n ChatbotContentRendererProps,\n} from './components/Chatbot';\n\n// Accessibility Widget\nexport {\n AccessibilityWidget,\n AccessibilityFab,\n AccessibilityPanel,\n LibrasFab,\n VLibrasLoader,\n ReadingAid,\n ColorBlindFilters,\n TTSController,\n WebSpeechProvider,\n} from './components/AccessibilityWidget';\nexport type {\n AccessibilityWidgetProps,\n AccessibilityFabProps,\n AccessibilityFabPosition,\n AccessibilityFabVerticalAlign,\n AccessibilityPanelProps,\n LibrasFabProps,\n TTSProvider,\n TTSVoice,\n TTSSpeakOptions,\n TTSProviderEvents,\n} from './components/AccessibilityWidget';\n\n// Accessibility Store + Hook\nexport {\n useAccessibilityStore,\n DEFAULT_ACCESSIBILITY_PREFERENCES,\n ColorBlindMode,\n getColorBlindClass,\n getColorBlindFilterId,\n} from './store/accessibilityStore';\nexport type {\n AccessibilityStore,\n AccessibilityState,\n AccessibilityActions,\n AccessibilityPreferences,\n ContrastMode,\n SaturationMode,\n FontSizeLevel,\n SpacingLevel,\n ReadingAid as ReadingAidMode,\n TTSMode,\n TTSStatus,\n} from './store/accessibilityStore';\nexport { useA11yPreferences } from './hooks/useA11yPreferences';\nexport { useA11yKeyboardShortcut } from './hooks/useA11yKeyboardShortcut';\nexport { useTTS } from './hooks/useTTS';\nexport type { UseTTSReturn } from './hooks/useTTS';\n\n// Forum Component\nexport { Forum } from './components/Forum/Forum';\nexport type { ForumProps } from './components/Forum/Forum';\n\n// Forum Hook\nexport { createUseForum } from './hooks/useForum';\nexport type { UseForumReturn } from './hooks/useForum';\n\n// Forum Types\nexport type {\n ForumPostBase,\n ForumTopic,\n ForumReply,\n ForumPagination,\n ForumTopicsResponse,\n ForumTopicDetailResponse,\n ForumApiClient,\n} from './types/forum';\n\n// General Activity Types (calendar, activity list)\nexport {\n ActivityStatus as GeneralActivityStatus,\n ActivityFilter,\n CalendarActivityStatus,\n} from './types/activities';\nexport type {\n Activity,\n CalendarActivity,\n ActivityResponse,\n CalendarActivitiesResponse,\n} from './types/activities';\n\n// Send Activity Hook\nexport { useSendActivity } from './hooks/useSendActivity';\nexport type {\n UseSendActivityConfig,\n UseSendActivityReturn,\n SendActivityCategoriesData,\n CreateActivityPayload,\n StudentPayload,\n ActivityModelItem,\n RecipientItem as SendActivityRecipientItem,\n} from './types/sendActivity';\n\n// Performance Types and Utils\nexport {\n PERFORMANCE_TAG_CONFIG,\n getPerformanceTag,\n getPerformanceTagConfig,\n} from './types/performance';\nexport { PerformanceTag } from './types/performance';\nexport type { PerformanceTagConfig, TimeInterval } from './types/performance';\n\n// Student Performance Details Modal\nexport { StudentPerformanceDetailsModal } from './components/StudentPerformanceDetailsModal';\nexport type {\n StudentPerformanceDetailsModalProps,\n StudentPerformanceDetailsData,\n StudentPerformanceDetailsLabels,\n ActivityProgress,\n} from './components/StudentPerformanceDetailsModal';\n\n// Student Lesson Progress Modal\nexport { StudentLessonProgressModal } from './components/StudentLessonProgressModal';\nexport type {\n StudentLessonProgressModalProps,\n StudentLessonProgressData,\n StudentLessonProgressLabels,\n TopicProgressItem,\n SubtopicProgressItem,\n ContentProgressItem,\n LessonProgressStatus,\n} from './components/StudentLessonProgressModal';\nexport { DEFAULT_LESSON_PROGRESS_LABELS } from './components/StudentLessonProgressModal';\n\n// TimeChart Components\nexport {\n TimeChart,\n TIME_CHART_CATEGORY_KEY,\n STUDENT_CATEGORIES,\n DEFAULT_CATEGORIES,\n calculateHourTicks,\n bgClassToCssVar,\n} from './components/TimeChart/TimeChart';\nexport type {\n TimeChartProps,\n TimeChartData,\n TimeChartCategory,\n TimeChartDayData,\n TimeChartRequest,\n TimeChartStudentPeriodItem,\n TimeChartStudentItemBreakdown,\n TimeChartStudentData,\n TimeChartDefaultPeriodItem,\n TimeChartDefaultItemBreakdown,\n TimeChartDefaultData,\n TimeChartResponse,\n} from './components/TimeChart/TimeChart';\n\n// TimeReport Components\nexport {\n TimeReport,\n TimeCard,\n formatHoursToTime,\n getTrendDirection,\n formatVariation,\n} from './components/TimeReport/TimeReport';\nexport type {\n TimeReportProps,\n TimeCardProps,\n TimeReportTab,\n TimeCardData,\n TimeCardTrend,\n TimeReportPeriod,\n TimeReportRequest,\n TimeMetric,\n TimeReportData,\n TimeReportResponse,\n} from './components/TimeReport/TimeReport';\n\n// PerformanceReport Components\nexport {\n PerformanceReport,\n PerformanceCard,\n} from './components/PerformanceReport/PerformanceReport';\nexport type {\n PerformanceReportProps,\n PerformanceCardProps,\n PerformanceReportTab,\n PerformanceCardData,\n PerformanceReportPeriod,\n PerformanceReportRequest,\n PerformanceStudentData,\n PerformanceDefaultData,\n PerformanceReportResponse,\n} from './components/PerformanceReport/PerformanceReport';\n\n// PerformanceQuestionsData Components\nexport {\n PerformanceQuestionsData,\n PerformanceQuestionsVariant,\n} from './components/PerformanceQuestionsData/PerformanceQuestionsData';\nexport type {\n PerformanceQuestionsDataProps,\n QuestionsVariantData,\n ContentVariantData,\n PerformanceFilterOption,\n PerformanceFilterConfig,\n PerformanceQuestionsPeriod,\n PerformanceQuestionsRequest,\n PerformanceQuestionsStudentResponse,\n PerformanceQuestionsDefaultResponse,\n} from './components/PerformanceQuestionsData/PerformanceQuestionsData';\n\n// PerformanceRanking Components\nexport { PerformanceRanking } from './components/PerformanceRanking/PerformanceRanking';\nexport type {\n PerformanceRankingProps,\n PerformanceRankingItem,\n PerformanceRankingData,\n GroupedBy,\n} from './components/PerformanceRanking/PerformanceRanking';\n\n// PerformanceReportModal Components\nexport {\n PerformanceReportModal,\n PerformanceReportModalVariant,\n} from './components/PerformanceReportModal/PerformanceReportModal';\nexport type {\n PerformanceReportModalProps,\n UserPerformanceRequest,\n UserPerformanceQuestionStats,\n UserPerformanceMaterialStats,\n UserPerformanceLesson,\n UserPerformanceStudentData,\n UserPerformanceProfessionalData,\n} from './components/PerformanceReportModal/PerformanceReportModal';\n\n// AccessReportModal Components\nexport {\n AccessReportModal,\n AccessReportModalVariant,\n} from './components/AccessReportModal/AccessReportModal';\nexport type {\n AccessReportModalProps,\n AccessReportStudentData,\n AccessReportProfessionalData,\n AccessReportTimePercentage,\n AccessReportUser,\n AccessReportByPlatform,\n} from './components/AccessReportModal/AccessReportModal';\n\n// DownloadModal Components\nexport { default as DownloadModal } from './components/DownloadModal/DownloadModal';\nexport { DOWNLOAD_FORMAT } from './enums/DownloadFormat';\nexport { FILTER_CATEGORY, FILTER_GROUP } from './enums/FilterEnums';\nexport type {\n DownloadModalProps,\n DownloadFormat,\n} from './components/DownloadModal/DownloadModal';\n\n// PrintableUsersTable Component\nexport { default as PrintableUsersTable } from './components/PrintableUsersTable/PrintableUsersTable';\nexport type { PrintableUsersTableProps } from './components/PrintableUsersTable/PrintableUsersTable';\n\n// Cookie and Domain Utils\nexport { getCookie, setCookie, removeCookie } from './utils/cookieUtils';\nexport type { CookieOptions } from './utils/cookieUtils';\nexport { resolveRootHostname } from './utils/domainUtils';\n\n// Report Export Utils\nexport { downloadExcel } from './utils/exportExcel';\nexport { printAsPdf } from './utils/exportPdf';\n\n// Report Export Types\nexport type { ExcelCell, SheetConfig } from './utils/exportExcel';\n\n// SimulatedPerformance Component\nexport {\n useSimulatedPerformance,\n SimulatedPerformanceView,\n SCORE_TYPE_OPTIONS,\n SimulatedViewTab,\n} from './components/SimulatedPerformance';\nexport type {\n UseSimulatedPerformanceOptions,\n UseSimulatedPerformanceReturn,\n SimulatedPerformanceViewProps,\n} from './components/SimulatedPerformance';\n\n// Profile Aggregation Utils\nexport {\n getAggregationTypeByProfile,\n shouldUseAggregatedOverview,\n} from './utils/profileAggregation';\n\n// Aggregated Overview Hook\nexport { useAggregatedOverview } from './components/SimulatedStudentsOverview';\nexport type {\n OverviewAggregationType,\n ClassOverviewItem,\n MunicipalityOverviewItem,\n StudentsOnlyOverviewData,\n ClassesOverviewData,\n MunicipalitiesOverviewData,\n AggregatedOverviewData,\n AggregatedOverviewParams,\n UseAggregatedOverviewState,\n UseAggregatedOverviewReturn,\n} from './components/SimulatedStudentsOverview';\n// Simulations Component (teacher-facing list + nested detail modal)\nexport {\n SimulationsPage,\n SimulationsDetailModal,\n} from './components/SimulationsPage';\nexport type {\n SimulationsPageProps,\n SimulationsDetailModalProps,\n} from './components/SimulationsPage';\nexport { createUseSimulations } from './hooks/useSimulations';\nexport type { UseSimulationsReturn } from './hooks/useSimulations';\nexport type {\n SimulationsStudentItem,\n SimulationsStudentsPage,\n SimulationsStudentsResponse,\n SimulationsStudentsFilters,\n StudentSimulationItem,\n SimulationsListData,\n SimulationsListResponse,\n SimulationsListFilters,\n SimulationQuestionStatus,\n SimulationDetailOption,\n SimulationDetailQuestion,\n SimulationDetailData,\n SimulationDetailResponse,\n NoteData,\n NoteResponse,\n} from './types/simulations';\n\n// ComparatorChart Components\nexport {\n // Base chart components\n Legend as ComparatorLegend,\n PercentageScale,\n ChartArea,\n BarChartRow,\n // Content components\n KnowledgeAreasContent,\n CurricularComponentsContent,\n CompetenciesContent,\n NationalAverageCard,\n NationalAveragesContent,\n // UI components\n ComparatorEmptyState,\n ComparatorLoadingState,\n ComparatorSelectTypeStep,\n ComparatorSelectItemsStep,\n ComparatorTabContent,\n // Main view\n ComparatorView,\n} from './components/ComparatorChart';\nexport type {\n LegendProps as ComparatorLegendProps,\n LegendItem as ComparatorLegendItem,\n ChartAreaProps,\n BarChartRowProps,\n BarChartValue,\n KnowledgeAreasContentProps,\n CurricularComponentsContentProps,\n CompetenciesContentProps,\n NationalAverageCardProps,\n NationalAveragesContentProps,\n ComparatorEmptyStateProps,\n ComparatorSelectTypeStepProps,\n ComparatorSelectItemsStepProps,\n ComparatorTabContentProps,\n ComparatorViewProps,\n} from './components/ComparatorChart';\n\n// Comparator Types\nexport {\n ComparatorTabValue,\n DEFAULT_COMPARATOR_LABELS,\n DEFAULT_COMPARATOR_TABS,\n COMPARATOR_CHART_COLORS,\n} from './types/comparator';\nexport type {\n ComparisonType,\n ComparatorTabType,\n ComparisonItem,\n KnowledgeAreaData,\n CurricularComponentData,\n CompetencyData,\n NationalAverageData,\n ComparatorData,\n ComparatorApiClient,\n ComparatorStoreState,\n UseComparatorReturn,\n ComparatorLabels,\n ComparatorTab,\n} from './types/comparator';\n\n// Comparator Hook\nexport {\n createUseComparator,\n createComparatorHook,\n} from './hooks/useComparator';\nexport type { UseComparatorConfig } from './hooks/useComparator';\n\n// Comparator Store\nexport {\n createComparatorStore,\n useComparatorStore,\n} from './store/comparatorStore';\nexport type { CreateComparatorStoreConfig } from './store/comparatorStore';\n\n// User Store\nexport { createUserStore } from './store/userStore';\nexport type {\n CreateUserStoreConfig,\n UserStoreApiClient,\n UserStoreState,\n} from './store/userStore';\n\n// User Types\nexport type {\n User as UserData,\n UserInfos,\n Profile,\n Institution,\n School as UserSchool,\n SchoolYear as UserSchoolYear,\n Class as UserClass,\n UserInstitution,\n Subject as UserSubject,\n SubTeacherTopicClass,\n MyDataResponse,\n UpdateMyDataRequest,\n UserTelemetryData,\n StudentDetailsResponse,\n} from './types/user';\n\n// Exam Types\nexport {\n ExamStatus,\n ExamDisplayStatus,\n mapExamStatusToDisplay,\n} from './types/examsHistory';\nexport type {\n ExamFilterOption,\n ExamApiFilterOptions,\n ExamSubject,\n ExamBreakdownItem,\n ExamHistoryResponse,\n ExamTableItem,\n ExamsHistoryApiResponse,\n ExamHistoryFilters,\n ExamPagination,\n} from './types/examsHistory';\n\nexport { ExamDraftType, ExamActivityCategory } from './types/examDrafts';\nexport type {\n ExamDraftFilters,\n ExamModelResponse,\n ExamModelTableItem,\n ExamModelsApiResponse,\n ExamModelFilters,\n ExamModelsPagination,\n} from './types/examDrafts';\n\n// Exam Hooks Factories\nexport {\n createUseExamsHistory,\n createExamsHistoryHook,\n transformExamToTableItem,\n handleExamFetchError,\n extractExamFilterOptions,\n DEFAULT_EXAMS_PAGINATION,\n DEFAULT_EXAM_FILTER_OPTIONS,\n} from './hooks/useExamsHistory';\nexport type {\n UseExamsHistoryState,\n UseExamsHistoryReturn,\n} from './hooks/useExamsHistory';\n\n// NOTE: useExamDrafts and useExamModels removed - use createUseActivityDrafts/createUseActivityModels with { activityCategory: 'PROVA' }\n\n// Exam Page Layout Component\nexport { ExamPageLayout, ExamTab } from './components/ExamPageLayout';\nexport type { ExamPageLayoutProps } from './components/ExamPageLayout';\n\n// Exam Table Configs\nexport {\n examsTableColumns,\n getExamStatusBadgeAction,\n createExamDraftsModelsTableColumns,\n} from './components/ExamPageLayout';\nexport type { ExamTableCallbacks } from './components/ExamPageLayout';\n\n// Answer Sheet Preview Components\nexport {\n AnswerSheetPreview,\n AnswerSheetsBatchPreview,\n AnswerSheetCard,\n CardContainer as AnswerSheetCardContainer,\n PageContainer as AnswerSheetPageContainer,\n PrintStyles as AnswerSheetPrintStyles,\n} from './components/ExamPageLayout';\nexport type {\n AnswerSheetPreviewProps,\n AnswerSheetsBatchPreviewProps,\n AnswerSheetData,\n AnswerSheetCardProps,\n} from './components/ExamPageLayout';\n\n// Exam Filter Helpers\nexport {\n EXAM_STATUS_OPTIONS,\n EXAM_FILTER_CATEGORY,\n EXAM_FILTER_GROUP,\n createExamDraftsModelsFiltersConfig,\n createExamHistoryFiltersConfig,\n} from './utils/examFilterHelpers';\n\n// Exam Details Types\nexport {\n StudentAnswerStatus,\n StudentAnswerDisplayStatus,\n} from './types/examDetails';\nexport type {\n ExamStudentResult,\n ExamStudentTableItem,\n ExamStats,\n ExamDetailsData,\n ExamDetailsPagination,\n ExamDetailsFilters,\n} from './types/examDetails';\n\n// Exam Details Hook Factory\nexport {\n createUseExamDetails,\n createExamDetailsHook,\n transformStudent,\n mapBackendStatusToFrontend,\n handleExamDetailsFetchError,\n DEFAULT_EXAM_DETAILS_PAGINATION,\n} from './hooks/useExamDetails';\nexport type {\n UseExamDetailsState,\n UseExamDetailsReturn,\n} from './hooks/useExamDetails';\n\n// Exam Details Layout Components\nexport {\n ExamDetailsHeader,\n ExamStatsCards,\n formatQuestions,\n ExamStudentsTable,\n createExamStudentsTableColumns,\n getExamStudentStatusBadgeAction,\n getExamStudentStatusDisplayText,\n ExamDetailsPage,\n} from './components/ExamDetailsLayout';\nexport type {\n ExamDetailsHeaderProps,\n ExamStatsCardsProps,\n ExamStudentsTableProps,\n ExamDetailsPageProps,\n} from './components/ExamDetailsLayout';\n","import { HTMLAttributes, ReactNode } from 'react';\nimport { Bell } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Lookup table for variant and action class combinations\n */\nconst VARIANT_ACTION_CLASSES = {\n solid: {\n error: 'bg-error-background text-error-700 focus-visible:outline-none',\n warning: 'bg-warning text-warning-800 focus-visible:outline-none',\n success: 'bg-success text-success-800 focus-visible:outline-none',\n info: 'bg-info text-info-800 focus-visible:outline-none',\n muted: 'bg-background-muted text-background-800 focus-visible:outline-none',\n },\n outlined: {\n error:\n 'bg-error text-error-700 border border-error-300 focus-visible:outline-none',\n warning:\n 'bg-warning text-warning-800 border border-warning-300 focus-visible:outline-none',\n success:\n 'bg-success text-success-800 border border-success-300 focus-visible:outline-none',\n info: 'bg-info text-info-800 border border-info-300 focus-visible:outline-none',\n muted:\n 'bg-background-muted text-background-800 border border-border-300 focus-visible:outline-none',\n },\n exams: {\n exam1: 'bg-exam-1 text-info-700 focus-visible:outline-none',\n exam2: 'bg-exam-2 text-typography-1 focus-visible:outline-none',\n exam3: 'bg-exam-3 text-typography-2 focus-visible:outline-none',\n exam4: 'bg-exam-4 text-success-700 focus-visible:outline-none',\n },\n examsOutlined: {\n exam1:\n 'bg-exam-1 text-info-700 border border-info-700 focus-visible:outline-none',\n exam2:\n 'bg-exam-2 text-typography-1 border border-typography-1 focus-visible:outline-none',\n exam3:\n 'bg-exam-3 text-typography-2 border border-typography-2 focus-visible:outline-none',\n exam4:\n 'bg-exam-4 text-success-700 border border-success-700 focus-visible:outline-none',\n },\n resultStatus: {\n negative: 'bg-error text-error-800 focus-visible:outline-none',\n positive: 'bg-success text-success-800 focus-visible:outline-none',\n },\n notification: 'text-primary',\n} as const;\n\n/**\n * Lookup table for size classes\n */\nconst SIZE_CLASSES = {\n small: 'text-2xs px-2 py-1',\n medium: 'text-xs px-2 py-1',\n large: 'text-sm px-2 py-1',\n} as const;\n\nconst SIZE_CLASSES_ICON = {\n small: 'size-3',\n medium: 'size-3.5',\n large: 'size-4',\n} as const;\n\n/**\n * Badge component props interface\n */\ntype BadgeProps = {\n /** Content to be displayed inside the badge */\n children?: ReactNode;\n /** Ícone à direita do texto */\n iconRight?: ReactNode;\n /** Ícone à esquerda do texto */\n iconLeft?: ReactNode;\n /** Size of the badge */\n size?: 'small' | 'medium' | 'large';\n /** Visual variant of the badge */\n variant?:\n | 'solid'\n | 'outlined'\n | 'exams'\n | 'examsOutlined'\n | 'resultStatus'\n | 'notification';\n /** Action type of the badge */\n action?:\n | 'error'\n | 'warning'\n | 'success'\n | 'info'\n | 'muted'\n | 'exam1'\n | 'exam2'\n | 'exam3'\n | 'exam4'\n | 'positive'\n | 'negative';\n /** Additional CSS classes to apply */\n className?: string;\n notificationActive?: boolean;\n} & HTMLAttributes<HTMLDivElement>;\n\n/**\n * Badge component for Analytica Ensino platforms\n *\n * A flexible button component with multiple variants, sizes and actions.\n *\n * @param children - The content to display inside the badge\n * @param size - The size variant (extra-small, small, medium, large, extra-large)\n * @param variant - The visual style variant (solid, outline, link)\n * @param action - The action type (primary, positive, negative)\n * @param className - Additional CSS classes\n * @param props - All other standard div HTML attributes\n * @returns A styled badge element\n *\n * @example\n * ```tsx\n * <Badge variant=\"solid\" action=\"info\" size=\"medium\">\n * Information\n * </Badge>\n * ```\n */\nconst Badge = ({\n children,\n iconLeft,\n iconRight,\n size = 'medium',\n variant = 'solid',\n action = 'error',\n className = '',\n notificationActive = false,\n ...props\n}: BadgeProps) => {\n // Get classes from lookup tables\n const sizeClasses = SIZE_CLASSES[size];\n const sizeClassesIcon = SIZE_CLASSES_ICON[size];\n const variantActionMap = VARIANT_ACTION_CLASSES[variant] || {};\n const variantClasses =\n typeof variantActionMap === 'string'\n ? variantActionMap\n : ((variantActionMap as Record<string, string>)[action] ??\n (variantActionMap as Record<string, string>).muted ??\n '');\n\n const baseClasses =\n 'inline-flex items-center justify-center rounded-xs font-normal gap-1 relative';\n\n const baseClassesIcon = 'flex items-center';\n if (variant === 'notification') {\n return (\n <div\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n {...props}\n >\n <Bell size={24} className=\"text-current\" aria-hidden=\"true\" />\n\n {notificationActive && (\n <span\n data-testid=\"notification-dot\"\n className=\"absolute top-[5px] right-[10px] block h-2 w-2 rounded-full bg-indicator-error ring-2 ring-white\"\n />\n )}\n </div>\n );\n }\n return (\n <div\n className={cn(baseClasses, variantClasses, sizeClasses, className)}\n {...props}\n >\n {iconLeft && (\n <span className={cn(baseClassesIcon, sizeClassesIcon)}>{iconLeft}</span>\n )}\n {children}\n {iconRight && (\n <span className={cn(baseClassesIcon, sizeClassesIcon)}>\n {iconRight}\n </span>\n )}\n </div>\n );\n};\n\nexport default Badge;\n","import { ReactNode } from 'react';\nimport katex from 'katex';\n\nexport interface KatexMathProps {\n /** LaTeX source to render */\n math: string;\n /** Render as centered display math (block) instead of inline */\n displayMode?: boolean;\n /** Called with the thrown error when KaTeX fails to parse `math` */\n renderError?: (error: unknown) => ReactNode;\n}\n\n/**\n * Renders a single LaTeX expression with KaTeX, calling `katex.renderToString`\n * directly instead of going through `react-katex`.\n *\n * Why not `react-katex`: when bundlers (Vite/esbuild dev optimizer, Rollup)\n * bundle `react-katex` they inline their OWN copy of KaTeX whose function\n * registry ends up broken — symbols render but `\\`-commands (`\\frac`, `\\cdot`,\n * `\\left`, ...) fail with a parse error. Importing `katex` directly here uses\n * the shared, correctly-bundled KaTeX (the same one `rehype-katex` uses), so\n * every command renders. See HtmlMathRenderer for the surrounding pipeline.\n */\nexport const KatexMath = ({\n math,\n displayMode = false,\n renderError,\n}: KatexMathProps) => {\n let html: string;\n try {\n html = katex.renderToString(math, {\n displayMode,\n throwOnError: true,\n });\n } catch (error_) {\n return <>{renderError ? renderError(error_) : null}</>;\n }\n\n const Tag = displayMode ? 'div' : 'span';\n return (\n <Tag\n data-testid=\"react-katex\"\n // KaTeX output is sanitized markup it generates itself from the parsed\n // LaTeX; there is no untrusted HTML passthrough here.\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n};\n\nexport default KatexMath;\n","import { CSSProperties, forwardRef, memo, ReactNode, Ref } from 'react';\nimport 'katex/dist/katex.min.css';\nimport { KatexMath } from './KatexMath';\nimport { cn } from '../../utils/utils';\nimport MarkdownMathRenderer from '../MarkdownMathRenderer/MarkdownMathRenderer';\nimport {\n isLikelyMarkdown,\n processHtmlWithMath,\n sanitizeHtmlForDisplay,\n} from './utils';\n\nexport interface HtmlMathRendererProps {\n /** HTML content to render, may contain LaTeX math expressions */\n content: string;\n /** Additional CSS class names */\n className?: string;\n /** Inline styles */\n style?: CSSProperties;\n /** Whether to sanitize HTML before rendering (default: true) */\n sanitize?: boolean;\n /** Custom error renderer for math errors */\n renderMathError?: (latex: string) => ReactNode;\n /** Test ID for testing */\n testId?: string;\n /** Whether to render as inline element (span) instead of block (div). Use when inside labels or other phrasing content. */\n inline?: boolean;\n}\n\n/**\n * HtmlMathRenderer - Renders HTML content with LaTeX math expressions\n *\n * Supports multiple LaTeX formats:\n * - Display mode: $$...$$ (centered block)\n * - Inline mode: $...$ (inline with text)\n * - LaTeX tags: <latex>...</latex>\n * - Editor spans: <span class=\"math-formula\" data-latex=\"...\">\n * - Legacy spans: <span class=\"math-expression\" data-math=\"...\">\n * - LaTeX environments: \\begin{...}...\\end{...}\n *\n * @example\n * ```tsx\n * <HtmlMathRenderer\n * content=\"<p>A fórmula é: $$x = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}$$</p>\"\n * />\n * ```\n */\nconst HtmlMathRenderer = forwardRef<HTMLElement, HtmlMathRendererProps>(\n (\n {\n content,\n className,\n style,\n sanitize = true,\n renderMathError,\n testId,\n inline = false,\n },\n ref\n ) => {\n // AI-generated questions/resolutions arrive as Markdown + LaTeX. The HTML\n // pipeline below would render their `**`/`####`/`*` tokens literally and\n // collapse line breaks, so route that content to the Markdown renderer.\n // Inline usage stays on the HTML path to keep phrasing-content validity\n // (Markdown emits block elements: <p>, <ul>, <h4>, ...).\n //\n // Note: `renderMathError` is intentionally not forwarded here. The Markdown\n // path renders math via rehype-katex, which already degrades gracefully on\n // invalid LaTeX (KaTeX's built-in red error output) rather than throwing.\n // `renderMathError` is an HTML-path-only customization and is currently\n // unused by any consumer; honoring it on the Markdown path would require a\n // bespoke rehype plugin for no practical gain.\n if (!inline && content && isLikelyMarkdown(content)) {\n return (\n <MarkdownMathRenderer\n ref={ref as Ref<HTMLDivElement>}\n content={content}\n className={className}\n style={style}\n testId={testId}\n />\n );\n }\n\n const defaultErrorRenderer = (latex: string) => (\n <span className=\"text-error-600 text-sm\">Math Error: {latex}</span>\n );\n\n const errorRenderer = renderMathError || defaultErrorRenderer;\n\n const renderContent = () => {\n if (!content) return null;\n\n const processedContent = sanitize\n ? sanitizeHtmlForDisplay(content)\n : content;\n\n const parts = processHtmlWithMath(processedContent);\n\n // If all parts are text (or empty), render as plain HTML. Use the\n // joined parts (not the raw `processedContent`) so post-split fixes\n // applied inside `processHtmlWithMath` — like decoding `\\$` escapes\n // to literal `$` — actually reach the rendered output.\n if (parts.every((part) => part.type === 'text')) {\n const joinedHtml = parts.map((part) => part.content).join('');\n // Use span for inline mode to allow valid nesting in labels\n const Element = inline ? 'span' : 'div';\n return (\n <Element\n dangerouslySetInnerHTML={{\n __html: joinedHtml || processedContent,\n }}\n />\n );\n }\n\n // Generate stable keys based on content\n const getPartKey = (part: (typeof parts)[0], idx: number) => {\n const contentHash = (part.latex || part.content).slice(0, 20);\n return `${part.type}-${idx}-${contentHash}`;\n };\n\n return (\n <>\n {parts.map((part, index) => {\n const key = getPartKey(part, index);\n if (part.type === 'math' && part.latex) {\n return (\n <KatexMath\n key={key}\n math={part.latex}\n renderError={() => errorRenderer(part.latex!)}\n />\n );\n } else if (part.type === 'block-math' && part.latex) {\n // When inline mode, render inline to avoid block-level elements inside span\n if (inline) {\n return (\n <KatexMath\n key={key}\n math={part.latex}\n renderError={() => errorRenderer(part.latex!)}\n />\n );\n }\n return (\n <div key={key} className=\"my-2.5 text-center\">\n <KatexMath\n math={part.latex}\n displayMode\n renderError={() => errorRenderer(part.latex!)}\n />\n </div>\n );\n } else {\n return (\n <span\n key={key}\n dangerouslySetInnerHTML={{ __html: part.content }}\n />\n );\n }\n })}\n </>\n );\n };\n\n const sharedClassName = cn(\n // Base styles\n 'leading-relaxed',\n // Paragraph styles\n '[&_p]:mb-0',\n // Hide the KaTeX MathML accessibility layer visually (still readable\n // to screen readers). Tailwind preflight overrides the KaTeX default\n // `position: absolute; clip:...` rule, so the MathML layer ends up\n // duplicating every formula as raw text next to the visual render.\n '[&_.katex-mathml]:sr-only',\n // Table styles (only relevant for block mode, but harmless for inline)\n '[&_table]:border-collapse [&_table]:w-full [&_table]:my-2.5 [&_table]:table-auto',\n '[&_table_td]:border [&_table_td]:border-border-200 [&_table_td]:p-2 [&_table_td]:min-w-[50px] [&_table_td]:align-top',\n '[&_table_th]:border [&_table_th]:border-border-200 [&_table_th]:p-2 [&_table_th]:min-w-[50px] [&_table_th]:align-top [&_table_th]:bg-background-50 [&_table_th]:font-semibold',\n '[&_table_tr:nth-child(even)]:bg-background-50/50',\n '[&_table_tr:hover]:bg-background-100/50',\n // Image styles\n '[&_img]:max-w-full [&_img]:h-auto [&_img]:rounded-md [&_img]:my-2',\n // Link styles\n '[&_a]:text-primary-500 [&_a]:underline [&_a:hover]:text-primary-600',\n // Text formatting styles\n '[&_b]:font-bold [&_strong]:font-bold',\n '[&_i]:italic [&_em]:italic',\n '[&_u]:underline',\n className\n );\n\n if (inline) {\n return (\n <span\n ref={ref as Ref<HTMLSpanElement>}\n className={sharedClassName}\n style={style}\n data-testid={testId}\n >\n {renderContent()}\n </span>\n );\n }\n\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={sharedClassName}\n style={style}\n data-testid={testId}\n >\n {renderContent()}\n </div>\n );\n }\n);\n\nHtmlMathRenderer.displayName = 'HtmlMathRenderer';\n\nexport default memo(HtmlMathRenderer);\n","import { CSSProperties, forwardRef, memo } from 'react';\nimport 'katex/dist/katex.min.css';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { cn } from '../../utils/utils';\nimport { looksLikeLatex } from '../HtmlMathRenderer/utils';\n\nexport interface MarkdownMathRendererProps {\n /** Markdown content, may contain LaTeX math expressions ($...$ / $$...$$) */\n content: string;\n /** Additional CSS class names */\n className?: string;\n /** Inline styles */\n style?: CSSProperties;\n /** Test ID for testing */\n testId?: string;\n}\n\n/**\n * Strips zero-width / invisible characters that occasionally leak into\n * AI-generated content and break KaTeX parsing.\n */\nconst stripInvisibleChars = (str: string): string =>\n str.replaceAll(/[\\u200B-\\u200D\\uFEFF]/g, '');\n\n/**\n * Escapes the `$` of inline `$...$` spans that do NOT look like real math, so\n * `remark-math` leaves them as literal text. Without this, currency prose like\n * \"R$ 15,00 ... R$ 42,00\" gets paired up and rendered as gibberish math.\n *\n * Reuses the exact `looksLikeLatex` heuristic the HTML renderer applies to\n * single-`$` spans, so both renderers agree on what is math vs currency.\n * Display math (`$$...$$`) is intentionally left untouched (handled below).\n */\nexport const protectCurrencyInlineMath = (markdown: string): string =>\n markdown.replaceAll(\n /(?<!\\\\)\\$(?!\\$)([^\\n$]+?)(?<!\\\\)\\$(?!\\$)/g,\n (match, inner: string) =>\n looksLikeLatex(inner) ? match : match.replaceAll('$', String.raw`\\$`)\n );\n\n/**\n * `remark-math` only renders a `$$...$$` block as centered display math when\n * the delimiters sit on their own lines (\"math flow\"). AI content usually puts\n * the whole equation on a single line (`$$x = y$$`), which would otherwise be\n * rendered inline. Reflow single-line `$$...$$` into block form so equations\n * stay centered, matching how the HTML renderer treats `$$`.\n */\nexport const reflowDisplayMath = (markdown: string): string =>\n markdown.replaceAll(\n /(?<!\\$)\\$\\$(?!\\$)([^\\n]+?)\\$\\$(?!\\$)/g,\n (_match, inner: string) => `\\n\\n$$\\n${inner.trim()}\\n$$\\n\\n`\n );\n\n/**\n * Runs `transform` over the markdown while shielding fenced code blocks and\n * inline code spans: each is stashed behind a placeholder, the transform runs\n * on the rest, then the originals are restored before the markdown reaches\n * react-markdown. Without this, the currency / display-math passes would\n * rewrite literal `$`/`$$` that authors put inside code samples (e.g. a fenced\n * block containing `price = $value`). The placeholder is purely transient (it\n * never reaches the markdown parser) and contains no `$`, so the passes ignore\n * it.\n */\nconst withProtectedCode = (\n markdown: string,\n transform: (input: string) => string\n): string => {\n const stash: string[] = [];\n const tokenized = markdown.replaceAll(\n /```[\\s\\S]*?```|`[^`\\n]*`/g,\n (segment) => {\n const token = `__CODE_SEG_${stash.length}__`;\n stash.push(segment);\n return token;\n }\n );\n return transform(tokenized).replaceAll(\n /__CODE_SEG_(\\d+)__/g,\n (_match, index: string) => stash[Number(index)]\n );\n};\n\nconst preprocessMarkdown = (content: string): string =>\n withProtectedCode(stripInvisibleChars(content), (safe) =>\n reflowDisplayMath(protectCurrencyInlineMath(safe))\n );\n\n/**\n * MarkdownMathRenderer - Renders Markdown content with embedded LaTeX math.\n *\n * Used for AI-generated questions and resolutions, which arrive as Markdown\n * (`**bold**`, `#### headings`, `* lists`, paragraphs) mixed with LaTeX\n * (`$...$` inline, `$$...$$` display). Built on `react-markdown` with\n * `remark-gfm` (tables/lists), `remark-math` + `rehype-katex` (math).\n *\n * SECURITY: raw HTML is intentionally NOT enabled (no `rehype-raw`). This\n * renderer only receives content classified as Markdown (no HTML tags) by\n * `isLikelyMarkdown`; HTML content keeps flowing through `HtmlMathRenderer`,\n * which sanitizes it. Adding raw-HTML support here would reintroduce an XSS\n * vector and requires a dedicated sanitization pipeline + security review.\n */\nconst MarkdownMathRenderer = forwardRef<\n HTMLDivElement,\n MarkdownMathRendererProps\n>(({ content, className, style, testId }, ref) => {\n const sharedClassName = cn(\n 'leading-relaxed',\n // Paragraph spacing\n '[&_p]:my-2 [&_p:first-child]:mt-0 [&_p:last-child]:mb-0',\n // Headings\n '[&_h1]:text-xl [&_h1]:font-bold [&_h1]:mt-3 [&_h1]:mb-2',\n '[&_h2]:text-lg [&_h2]:font-bold [&_h2]:mt-3 [&_h2]:mb-2',\n '[&_h3]:text-base [&_h3]:font-semibold [&_h3]:mt-2.5 [&_h3]:mb-1.5',\n '[&_h4]:text-base [&_h4]:font-semibold [&_h4]:mt-2.5 [&_h4]:mb-1.5',\n '[&_h5]:font-semibold [&_h6]:font-semibold',\n // Lists\n '[&_ul]:list-disc [&_ul]:pl-5 [&_ul]:my-2',\n '[&_ol]:list-decimal [&_ol]:pl-5 [&_ol]:my-2',\n '[&_li]:my-1 [&_li>ul]:my-1 [&_li>ol]:my-1',\n // Text formatting\n '[&_b]:font-bold [&_strong]:font-bold',\n '[&_i]:italic [&_em]:italic',\n '[&_u]:underline',\n '[&_blockquote]:border-l-4 [&_blockquote]:border-border-200 [&_blockquote]:pl-3 [&_blockquote]:text-text-700',\n '[&_code]:rounded [&_code]:bg-background-100 [&_code]:px-1 [&_code]:py-0.5 [&_code]:text-sm',\n // Hide the KaTeX MathML accessibility layer visually (still readable to\n // screen readers). Tailwind preflight overrides KaTeX's default clip\n // rule, so without this the MathML layer duplicates every formula as\n // raw text next to the visual render.\n '[&_.katex-mathml]:sr-only',\n // Display math spacing\n '[&_.katex-display]:my-2.5',\n // Tables (GFM)\n '[&_table]:border-collapse [&_table]:w-full [&_table]:my-2.5 [&_table]:table-auto',\n '[&_table_td]:border [&_table_td]:border-border-200 [&_table_td]:p-2 [&_table_td]:min-w-[50px] [&_table_td]:align-top',\n '[&_table_th]:border [&_table_th]:border-border-200 [&_table_th]:p-2 [&_table_th]:min-w-[50px] [&_table_th]:align-top [&_table_th]:bg-background-50 [&_table_th]:font-semibold',\n // Images and links\n '[&_img]:max-w-full [&_img]:h-auto [&_img]:rounded-md [&_img]:my-2',\n '[&_a]:text-primary-500 [&_a]:underline [&_a:hover]:text-primary-600',\n className\n );\n\n return (\n <div\n ref={ref}\n className={sharedClassName}\n style={style}\n data-testid={testId}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n >\n {preprocessMarkdown(content)}\n </ReactMarkdown>\n </div>\n );\n});\n\nMarkdownMathRenderer.displayName = 'MarkdownMathRenderer';\n\nexport default memo(MarkdownMathRenderer);\n","/**\n * Utilities for processing HTML content with LaTeX math expressions\n */\n\nexport interface MathPart {\n type: 'text' | 'math' | 'block-math';\n content: string;\n latex?: string;\n}\n\n/**\n * Generates a random ID for placeholder uniqueness\n * Uses crypto.randomUUID() (Web Crypto API - available in all modern browsers)\n */\nconst generateSecureRandomId = (): string => {\n return crypto.randomUUID();\n};\n\n/**\n * Cleans LaTeX string from invisible characters and decodes HTML entities\n * that the editor saved in place of math operators.\n *\n * Why decode here: KaTeX is a LaTeX parser, not an HTML parser. If the\n * source has `&lt;`/`&gt;` (because the editor HTML-escaped them on save)\n * KaTeX throws \"Expected 'EOF', got '&'\". `&lt;`/`&gt;` map to the\n * equivalent `\\lt`/`\\gt` commands. `&amp;` decodes back to a bare `&` \\u2014\n * NOT `\\&` \\u2014 because in LaTeX `&` is the alignment character (used by\n * `\\begin{align}`, matrices, etc.); rewriting it to `\\&` would break\n * alignment and stop already-escaped `\\&` from round-tripping.\n */\nexport const cleanLatex = (str: string): string => {\n return str\n .replaceAll(/[\\u200B-\\u200D\\uFEFF]/g, '')\n .replaceAll(/&amp;lt;|&lt;/gi, String.raw`\\lt `)\n .replaceAll(/&amp;gt;|&gt;/gi, String.raw`\\gt `)\n .replaceAll(/&amp;amp;|&amp;/gi, '&')\n .trim();\n};\n\n/**\n * Heuristic that flags a string as \"likely real LaTeX math\" vs prose.\n * Used to reject `$...$` blocks that wrap regular text \\u2014 typically\n * happens when authors type `$` as a currency symbol and the renderer\n * pairs unrelated occurrences as math delimiters, sending Portuguese\n * prose to KaTeX (which then renders each letter as a math variable).\n *\n * Approach:\n * - Backslash commands / sub-super / grouping braces \\u2192 definitely math.\n * - Otherwise, treat it as PROSE only when it contains 2+ real words\n * (runs of 3+ letters). A sentence like \"15,00 pelo custo fixo\" has\n * many such words; genuine math \\u2014 `x = 1`, `a + b`, `1 < 2`, `f0`,\n * even a lone `abc` \\u2014 does not. This keeps normal spaced equations\n * rendering while still rejecting currency-`$` prose.\n */\nexport const looksLikeLatex = (str: string): boolean => {\n if (/[\\\\^_{}]/.test(str)) return true;\n const words = str.match(/[a-zA-Z]{3,}/g);\n if (words && words.length >= 2) return false;\n return true;\n};\n\n/**\n * HTML element names the backoffice RichEditor emits. Kept as a Set (instead\n * of a long regex alternation) so the tag-detection regex below stays simple\n * and cheap to reason about.\n */\nconst HTML_TAG_NAMES = new Set([\n 'p',\n 'div',\n 'span',\n 'br',\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 's',\n 'ul',\n 'ol',\n 'li',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'a',\n 'img',\n 'table',\n 'thead',\n 'tbody',\n 'tfoot',\n 'tr',\n 'td',\n 'th',\n 'blockquote',\n 'pre',\n 'code',\n 'sub',\n 'sup',\n 'font',\n 'latex',\n]);\n\n/**\n * True when `content` contains a real HTML element tag (open or close) whose\n * name is one the editor produces. A single generic regex captures any\n * `<tag`/`</tag` candidate; membership is then checked against the Set, which\n * keeps the regex trivial and avoids a giant alternation.\n */\nconst containsHtmlTag = (content: string): boolean => {\n for (const match of content.matchAll(/<\\/?([a-z][a-z0-9]*)/gi)) {\n if (HTML_TAG_NAMES.has(match[1].toLowerCase())) return true;\n }\n return false;\n};\n\n/**\n * Heuristic that decides whether `content` is Markdown (as opposed to the\n * HTML the backoffice RichEditor produces). AI-generated questions and\n * resolutions arrive as Markdown + LaTeX (`**bold**`, `#### heading`,\n * `* lists`, `$...$`, `$$...$$`), whereas the editor stores HTML (`<p>`,\n * `<b>`, `<span class=\"math-formula\" data-latex=\"...\">`). The two sources are\n * cleanly separable, so we bias toward the proven HTML path:\n *\n * - If any real HTML element tag is present we return `false` and let\n * `HtmlMathRenderer` handle it exactly as before (math-formula spans,\n * currency heuristic, katex-error recovery, sanitization).\n * - Otherwise we return `true` only when an unmistakable Markdown marker is\n * present (ATX heading, bold, bullet/ordered list, GFM table, or a paragraph\n * break), which is what breaks today: Markdown rendered as HTML shows the raw\n * `**`/`####`/`*` tokens and collapses line breaks.\n *\n * Regex note: line-anchored signals use the `m` flag with `^` and restrict\n * horizontal whitespace to `[ \\t]` (never `\\s`, which also matches `\\n`). This\n * keeps each quantifier on a single line and avoids the super-linear\n * backtracking that `(?:^|\\n)\\s*…\\s+` can trigger across newlines.\n */\nexport const isLikelyMarkdown = (content: string): boolean => {\n if (!content) return false;\n\n // Presence of real HTML element tags => treat as HTML (RichEditor output).\n if (containsHtmlTag(content)) return false;\n\n const MARKDOWN_SIGNALS = [\n /^#{1,6}[ \\t]+\\S/m, // ATX heading (#, ##, ... ######)\n /\\*\\*[^*\\n]+\\*\\*/, // bold\n /__[^_\\n]+__/, // bold (underscore)\n /^[ \\t]*[-*+][ \\t]+\\S/m, // bullet list\n /^[ \\t]*\\d+\\.[ \\t]+\\S/m, // ordered list\n /\\|[ \\t]*:?-+:?[ \\t]*\\|/, // GFM table delimiter row (|---|---|)\n /\\n\\n/, // paragraph break (only reached when no HTML tag is present)\n ];\n return MARKDOWN_SIGNALS.some((pattern) => pattern.test(content));\n};\n\n/**\n * Recovers usable LaTeX source from `<span class=\"katex-error\">` wrappers\n * that previous editor cycles persisted into the database. The error's\n * `title` attribute carries the original LaTeX after \"at position N: \".\n * Replaces each wrapper with `$LATEX$` so downstream patterns can render\n * it cleanly via KaTeX.\n *\n * No-op outside browser contexts (no `document`).\n */\nconst recoverFromKatexErrorSpans = (htmlContent: string): string => {\n if (\n typeof document === 'undefined' ||\n !/class=\"[^\"]*katex-error/i.test(htmlContent)\n ) {\n return htmlContent;\n }\n\n const tempContainer = document.createElement('div');\n tempContainer.innerHTML = htmlContent;\n\n const sanitizeRecoveredLatex = (raw: string): string =>\n raw\n // Strip combining marks KaTeX puts in error titles at the error pos\n .replaceAll(/[\\u0300-\\u036F]/g, '')\n // Drop truncated tag markers leftover from broken serialization.\n // Done while literal `<`/`>` are still present (before they get\n // mapped to LaTeX commands below).\n .replaceAll(/<\\/?[a-zA-Z][a-zA-Z0-9]*\\s*>?$/g, '')\n // Map comparison operators to equivalent LaTeX commands. We match\n // both the entity forms AND the literal `<`/`>` characters: the\n // `title` attribute is entity-decoded by the DOM when read, so we\n // often get literal `<`/`>`. Mapping them to `\\lt`/`\\gt` also avoids\n // re-encoding to `&lt;`/`&gt;` on DOM serialization (which would make\n // `looksLikeLatex` reject the recovered block as non-math).\n // `&amp;` decodes to a bare `&` (the LaTeX alignment character), not\n // `\\&`, so `\\begin{align}` environments survive recovery.\n .replaceAll(/&amp;lt;|&lt;|</gi, String.raw`\\lt `)\n .replaceAll(/&amp;gt;|&gt;|>/gi, String.raw`\\gt `)\n .replaceAll(/&amp;amp;|&amp;/gi, '&')\n .trim();\n\n Array.from(tempContainer.querySelectorAll('.katex-error')).forEach(\n (errorNode) => {\n if (!tempContainer.contains(errorNode)) return;\n\n const title = errorNode.getAttribute('title') || '';\n // Note: no `\\s*` before the capture group — `\\s*(.+)` would let\n // whitespace be split ambiguously between the two, causing\n // super-linear backtracking (ReDoS). The capture is trimmed by\n // sanitizeRecoveredLatex below instead.\n const positionMatch = /at position\\s+\\d+:(.+)$/.exec(title);\n let recovered = positionMatch ? positionMatch[1] : '';\n\n if (!recovered) {\n // Fallback: collect from inner <annotation> elements, skipping the\n // visual `katex-html` layer to avoid duplicating Unicode glyphs.\n const parts: string[] = [];\n const walk = (n: Node) => {\n if (n.nodeType === Node.TEXT_NODE) {\n parts.push(n.textContent || '');\n return;\n }\n if (n.nodeType !== Node.ELEMENT_NODE) return;\n const el = n as Element;\n if (el.tagName.toLowerCase() === 'annotation') {\n parts.push(el.textContent || '');\n return;\n }\n if (el.classList.contains('katex-html')) return;\n Array.from(el.childNodes).forEach(walk);\n };\n Array.from(errorNode.childNodes).forEach(walk);\n recovered = parts.join(' ');\n }\n\n recovered = sanitizeRecoveredLatex(recovered);\n if (recovered) {\n errorNode.replaceWith(document.createTextNode(`$${recovered}$`));\n } else {\n errorNode.remove();\n }\n }\n );\n\n return tempContainer.innerHTML;\n};\n\n/**\n * Decodes `\\$` escape sequences to literal `$` characters. Applied only to\n * text fragments outside math blocks \\u2014 the `(?<!\\\\)` lookbehind in the\n * `$...$` matcher already skipped these, but the `\\` is still in the output\n * unless we decode it. Without this, currency strings like `R\\$ 130,00`\n * render with a visible backslash.\n */\nconst decodeDollarEscapes = (text: string): string =>\n text.replaceAll(String.raw`\\$`, '$');\n\n/**\n * Dangerous attributes that should be removed for XSS protection\n */\nconst DANGEROUS_ATTRIBUTES = new Set([\n 'contenteditable',\n 'srcdoc',\n 'formaction',\n 'xlink:href',\n]);\n\n/**\n * Dangerous URI schemes that should be removed from href/src attributes\n */\nconst DANGEROUS_URI_PATTERN = /^\\s*(javascript|vbscript|data):/i;\n\n/**\n * Sanitizes HTML content for safe display\n * Removes event handlers, dangerous attributes, script/style tags, and javascript: URIs\n */\nexport const sanitizeHtmlForDisplay = (htmlContent: string): string => {\n if (!htmlContent) return htmlContent;\n\n // Create a temporary div to parse HTML\n if (typeof document === 'undefined') {\n // Server-side: use regex-based sanitization as fallback\n let sanitized = htmlContent;\n // Remove script tags\n sanitized = sanitized.replaceAll(\n /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n ''\n );\n // Remove style tags\n sanitized = sanitized.replaceAll(\n /<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>/gi,\n ''\n );\n // Remove on* event handlers (split into separate patterns to avoid ReDoS)\n sanitized = sanitized.replaceAll(/ on[a-z]+=\"[^\"]*\"/gi, '');\n sanitized = sanitized.replaceAll(/ on[a-z]+='[^']*'/gi, '');\n sanitized = sanitized.replaceAll(/ on[a-z]+=[^\\s>\"']+/gi, '');\n // Remove dangerous URI schemes (javascript, vbscript, data) - matching client-side DANGEROUS_URI_PATTERN\n sanitized = sanitized.replaceAll(\n / href=\"(?:javascript|vbscript|data):[^\"]*\"/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / href='(?:javascript|vbscript|data):[^']*'/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / src=\"(?:javascript|vbscript|data):[^\"]*\"/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / src='(?:javascript|vbscript|data):[^']*'/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / action=\"(?:javascript|vbscript|data):[^\"]*\"/gi,\n ''\n );\n sanitized = sanitized.replaceAll(\n / action='(?:javascript|vbscript|data):[^']*'/gi,\n ''\n );\n return sanitized;\n }\n\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = htmlContent;\n\n // Remove script and style tags entirely\n const dangerousTags = tempDiv.querySelectorAll(\n 'script, style, iframe, object, embed'\n );\n dangerousTags.forEach((element) => element.remove());\n\n // Process all elements\n const allElements = tempDiv.querySelectorAll('*');\n allElements.forEach((element) => {\n // Get all attribute names\n const attributeNames = element.getAttributeNames();\n\n attributeNames.forEach((attrName) => {\n const lowerAttrName = attrName.toLowerCase();\n\n // Remove all on* event handler attributes (onclick, onerror, onload, etc.)\n if (lowerAttrName.startsWith('on')) {\n element.removeAttribute(attrName);\n return;\n }\n\n // Remove dangerous attributes\n if (DANGEROUS_ATTRIBUTES.has(lowerAttrName)) {\n element.removeAttribute(attrName);\n return;\n }\n\n // Check href, src, and action for dangerous URIs\n if (\n lowerAttrName === 'href' ||\n lowerAttrName === 'src' ||\n lowerAttrName === 'action'\n ) {\n const value = element.getAttribute(attrName);\n if (value && DANGEROUS_URI_PATTERN.test(value)) {\n element.removeAttribute(attrName);\n }\n }\n });\n });\n\n return tempDiv.innerHTML;\n};\n\n/**\n * Processes HTML content and extracts math expressions\n * Returns an array of parts (text and math) for rendering\n */\nexport const processHtmlWithMath = (htmlContent: string): MathPart[] => {\n if (!htmlContent) return [];\n\n // Pre-pass: recover original LaTeX from any `katex-error` wrappers that\n // older editor saves left in the content. This turns persisted error HTML\n // into clean `$LATEX$` strings so the steps below can render them.\n let processedContent = recoverFromKatexErrorSpans(htmlContent);\n const parts: MathPart[] = [];\n\n // Generate unique sentinel per call to avoid collision with content\n const sentinel = `__MATH_${generateSecureRandomId()}_`;\n\n // Step 1: Handle math-formula spans (from the editor)\n const mathFormulaPattern =\n /<span[^>]*class=\"math-formula\"[^>]*data-latex=\"([^\"]*)\"[^>]*>[\\s\\S]*?<\\/span>/g;\n processedContent = processedContent.replaceAll(\n mathFormulaPattern,\n (match, latex) => {\n const isDisplayMode = match.includes('data-display-mode=\"true\"');\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: isDisplayMode ? 'block-math' : 'math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 2: Handle wrapped math expressions (from math modal - legacy)\n const wrappedMathPattern =\n /<span[^>]*class=\"math-expression\"[^>]*data-math=\"([^\"]*)\"[^>]*>.*?<\\/span>/g;\n processedContent = processedContent.replaceAll(\n wrappedMathPattern,\n (match, latex) => {\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 3: Handle raw $$...$$ expressions (display mode) - BEFORE single $\n const doubleDollarPattern = /(?<!\\\\)\\$\\$([\\s\\S]+?)\\$\\$/g;\n processedContent = processedContent.replaceAll(\n doubleDollarPattern,\n (match, latex) => {\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'block-math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 4: Handle single $...$ expressions for inline math.\n // Skip matches whose content doesn't look like LaTeX — those are usually\n // currency `$` symbols pairing up across prose (e.g. `R$ 15,00 ... R$ 42,00`)\n // and sending Portuguese text to KaTeX produces gibberish output.\n const singleDollarPattern = /(?<!\\\\)\\$([\\s\\S]+?)\\$/g;\n processedContent = processedContent.replaceAll(\n singleDollarPattern,\n (match, latex) => {\n if (!looksLikeLatex(latex)) return match;\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 5: Handle <latex>...</latex> tags for inline math\n const latexTagPattern =\n /(?:<latex>|&lt;latex&gt;)([\\s\\S]*?)(?:<\\/latex>|&lt;\\/latex&gt;)/g;\n processedContent = processedContent.replaceAll(\n latexTagPattern,\n (match, latex) => {\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'math',\n content: match,\n latex: cleanLatex(latex),\n });\n return placeholder;\n }\n );\n\n // Step 6: Handle standalone LaTeX environments (align, equation, pmatrix, etc.)\n const latexEnvPattern = /\\\\begin\\{([^}]+)\\}([\\s\\S]*?)\\\\end\\{\\1\\}/g;\n processedContent = processedContent.replaceAll(latexEnvPattern, (match) => {\n const placeholder = `${sentinel}${parts.length}__`;\n parts.push({\n type: 'block-math',\n content: match,\n latex: cleanLatex(match),\n });\n return placeholder;\n });\n\n // Step 7: Split remaining content by placeholders\n const finalParts: MathPart[] = [];\n let currentIndex = 0;\n // Escape sentinel for regex (though it should be safe alphanumeric)\n const escapedSentinel = sentinel.replaceAll(\n /[.*+?^${}()|[\\]\\\\]/g,\n String.raw`\\$&`\n );\n const placeholderPattern = new RegExp(\n String.raw`${escapedSentinel}(\\d+)__`,\n 'g'\n );\n let match;\n\n while ((match = placeholderPattern.exec(processedContent)) !== null) {\n // Add text before math\n if (match.index > currentIndex) {\n finalParts.push({\n type: 'text',\n content: decodeDollarEscapes(\n processedContent.slice(currentIndex, match.index)\n ),\n });\n }\n\n // Add math expression\n const mathIndex = Number.parseInt(match[1], 10);\n if (parts[mathIndex]) {\n finalParts.push(parts[mathIndex]);\n }\n\n currentIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (currentIndex < processedContent.length) {\n finalParts.push({\n type: 'text',\n content: decodeDollarEscapes(processedContent.slice(currentIndex)),\n });\n }\n\n return finalParts;\n};\n\n/**\n * Checks if content contains any math expressions\n */\nexport const containsMath = (content: string): boolean => {\n if (!content) return false;\n\n // Check for various math patterns\n const patterns = [\n /\\$\\$[\\s\\S]+?\\$\\$/, // Display mode $$...$$\n /(?<!\\\\)\\$[\\s\\S]+?\\$/, // Inline mode $...$\n /<span[^>]*class=\"math-formula\"/, // Editor spans\n /<span[^>]*class=\"math-expression\"/, // Legacy spans\n /<latex>|&lt;latex&gt;/, // LaTeX tags\n /\\\\begin\\{[^}]+\\}/, // LaTeX environments\n ];\n\n return patterns.some((pattern) => pattern.test(content));\n};\n\n/**\n * Extracts plain text from HTML content (removes all tags and LaTeX notation)\n */\nexport const stripHtml = (htmlContent: string): string => {\n if (!htmlContent) return '';\n\n let content = htmlContent;\n\n // Remove math-formula spans (keep nothing as the LaTeX is in data attribute)\n content = content.replaceAll(\n /<span[^>]*class=\"math-formula\"[^>]*>[\\s\\S]*?<\\/span>/g,\n ''\n );\n\n // Remove math-expression spans (legacy)\n content = content.replaceAll(\n /<span[^>]*class=\"math-expression\"[^>]*>[\\s\\S]*?<\\/span>/g,\n ''\n );\n\n // Remove $$...$$ block math\n content = content.replaceAll(/\\$\\$[\\s\\S]+?\\$\\$/g, '');\n\n // Remove $...$ inline math\n content = content.replaceAll(/\\$[^$]+\\$/g, '');\n\n // Remove <latex>...</latex> tags\n content = content.replaceAll(\n /(?:<latex>|&lt;latex&gt;)[\\s\\S]*?(?:<\\/latex>|&lt;\\/latex&gt;)/g,\n ''\n );\n\n // Remove LaTeX environments like \\begin{...}...\\end{...}\n // Using non-greedy match without backreference to avoid ReDoS vulnerability\n content = content.replaceAll(\n /\\\\begin\\{[a-zA-Z*]+\\}[\\s\\S]*?\\\\end\\{[a-zA-Z*]+\\}/g,\n ''\n );\n\n // Remove HTML tags\n if (typeof document === 'undefined') {\n // Server-side: use regex (excluding both < and > prevents quadratic backtracking)\n return content.replaceAll(/<[^<>]*>/g, '').trim();\n }\n\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = content;\n return (tempDiv.textContent || tempDiv.innerText || '').trim();\n};\n","import {\n InputHTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n} from 'react';\nimport Text from '../Text/Text';\nimport { Check, Minus } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\n/**\n * CheckBox size variants\n */\ntype CheckBoxSize = 'small' | 'medium' | 'large';\n\n/**\n * CheckBox visual state\n */\ntype CheckBoxState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n checkbox: 'w-4 h-4', // 16px x 16px\n textSize: 'sm' as const,\n spacing: 'gap-1.5', // 6px\n borderWidth: 'border-2',\n iconSize: 14, // pixels for Phosphor icons\n labelHeight: 'h-[21px]',\n },\n medium: {\n checkbox: 'w-5 h-5', // 20px x 20px\n textSize: 'md' as const,\n spacing: 'gap-2', // 8px\n borderWidth: 'border-2',\n iconSize: 16, // pixels for Phosphor icons\n labelHeight: 'h-6',\n },\n large: {\n checkbox: 'w-6 h-6', // 24px x 24px\n textSize: 'lg' as const,\n spacing: 'gap-2', // 8px\n borderWidth: 'border-[3px]', // 3px border\n iconSize: 20, // pixels for Phosphor icons\n labelHeight: 'h-[27px]',\n },\n} as const;\n\n/**\n * Base checkbox styling classes using design system colors\n */\nconst BASE_CHECKBOX_CLASSES =\n 'rounded border cursor-pointer transition-all duration-200 flex items-center justify-center focus:outline-none';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n unchecked: 'border-border-400 bg-background hover:border-border-500',\n checked:\n 'border-primary-950 bg-primary-950 text-text hover:border-primary-800 hover:bg-primary-800',\n },\n hovered: {\n unchecked: 'border-border-500 bg-background',\n checked: 'border-primary-800 bg-primary-800 text-text',\n },\n focused: {\n unchecked:\n 'border-indicator-info bg-background ring-2 ring-indicator-info/20',\n checked:\n 'border-indicator-info bg-primary-950 text-text ring-2 ring-indicator-info/20',\n },\n invalid: {\n unchecked: 'border-error-700 bg-background hover:border-error-600',\n checked: 'border-error-700 bg-primary-950 text-text',\n },\n disabled: {\n unchecked: 'border-border-400 bg-background cursor-not-allowed opacity-40',\n checked:\n 'border-primary-600 bg-primary-600 text-text cursor-not-allowed opacity-40',\n },\n} as const;\n\n/**\n * CheckBox component props interface\n */\nexport type CheckBoxProps = {\n /** Label text to display next to the checkbox */\n label?: ReactNode;\n /** Size variant of the checkbox */\n size?: CheckBoxSize;\n /** Visual state of the checkbox */\n state?: CheckBoxState;\n /** Indeterminate state for partial selections */\n indeterminate?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperText?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'>;\n\n/**\n * CheckBox component for Analytica Ensino platforms\n *\n * A checkbox component with essential states, sizes and themes.\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic checkbox\n * <CheckBox label=\"Option\" />\n *\n * // Small size\n * <CheckBox size=\"small\" label=\"Small option\" />\n *\n * // Invalid state\n * <CheckBox state=\"invalid\" label=\"Required field\" />\n *\n * // Disabled state\n * <CheckBox disabled label=\"Disabled option\" />\n * ```\n */\nconst CheckBox = forwardRef<HTMLInputElement, CheckBoxProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n indeterminate = false,\n errorMessage,\n helperText,\n className = '',\n labelClassName = '',\n checked: checkedProp,\n disabled,\n id,\n onChange,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `checkbox-${generatedId}`;\n\n // Handle controlled vs uncontrolled behavior\n const [internalChecked, setInternalChecked] = useState(false);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalChecked(event.target.checked);\n }\n onChange?.(event);\n };\n\n // Determine current state based on props\n const currentState = disabled ? 'disabled' : state;\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Determine checkbox visual variant\n const checkVariant = checked || indeterminate ? 'checked' : 'unchecked';\n\n // Get styling classes\n const stylingClasses = STATE_CLASSES[currentState][checkVariant];\n\n // Special border width handling for focused/hovered states and large size\n const borderWidthClass =\n state === 'focused' || (state === 'hovered' && size === 'large')\n ? 'border-[3px]'\n : sizeClasses.borderWidth;\n\n // Get final checkbox classes\n const checkboxClasses = cn(\n BASE_CHECKBOX_CLASSES,\n sizeClasses.checkbox,\n borderWidthClass,\n stylingClasses,\n className\n );\n\n // Render appropriate icon based on state\n const renderIcon = () => {\n if (indeterminate) {\n return (\n <Minus\n size={sizeClasses.iconSize}\n weight=\"bold\"\n color=\"currentColor\"\n />\n );\n }\n\n if (checked) {\n return (\n <Check\n size={sizeClasses.iconSize}\n weight=\"bold\"\n color=\"currentColor\"\n />\n );\n }\n\n return null;\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.spacing,\n disabled ? 'opacity-40' : ''\n )}\n >\n {/* Hidden native input for accessibility and form submission */}\n <input\n ref={ref}\n type=\"checkbox\"\n id={inputId}\n checked={checked}\n disabled={disabled}\n onChange={handleChange}\n className=\"sr-only\"\n {...props}\n />\n\n {/* Custom styled checkbox */}\n <label htmlFor={inputId} className={checkboxClasses}>\n {/* Show appropriate icon based on state */}\n {renderIcon()}\n </label>\n\n {/* Label text */}\n {label && (\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.labelHeight\n )}\n >\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"normal\"\n className={cn(\n 'cursor-pointer select-none leading-[150%] flex items-center font-roboto',\n labelClassName\n )}\n >\n {label}\n </Text>\n </div>\n )}\n </div>\n\n {/* Error message */}\n {errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5\"\n color=\"text-error-600\"\n >\n {errorMessage}\n </Text>\n )}\n\n {/* Helper text */}\n {helperText && !errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5\"\n color=\"text-text-500\"\n >\n {helperText}\n </Text>\n )}\n </div>\n );\n }\n);\n\nCheckBox.displayName = 'CheckBox';\n\nexport default CheckBox;\n","import { HTMLAttributes } from 'react';\nimport { cn } from '../../utils/utils';\n\n/**\n * Divider component props interface\n */\ntype DividerProps = {\n /** Orientation of the divider */\n orientation?: 'horizontal' | 'vertical';\n /** Additional CSS classes to apply */\n className?: string;\n} & HTMLAttributes<HTMLHRElement>;\n\n/**\n * Divider component for Analytica Ensino platforms\n *\n * A simple divider component that creates a visual separation between content sections.\n * Can be used both horizontally and vertically.\n *\n * @param orientation - The orientation of the divider (horizontal or vertical)\n * @param className - Additional CSS classes\n * @param props - All other standard hr HTML attributes\n * @returns A styled divider element\n *\n * @example\n * ```tsx\n * <Divider orientation=\"horizontal\" />\n * <Divider orientation=\"vertical\" className=\"h-8\" />\n * ```\n */\nconst Divider = ({\n orientation = 'horizontal',\n className = '',\n ...props\n}: DividerProps) => {\n const baseClasses = 'bg-border-200 border-0';\n\n const orientationClasses = {\n horizontal: 'w-full h-px',\n vertical: 'h-full w-px',\n };\n\n return (\n <hr\n className={cn(baseClasses, orientationClasses[orientation], className)}\n aria-orientation={orientation}\n {...props}\n />\n );\n};\n\nexport default Divider;\n","import {\n InputHTMLAttributes,\n HTMLAttributes,\n ReactNode,\n forwardRef,\n useState,\n useId,\n ChangeEvent,\n useEffect,\n useRef,\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n} from 'react';\nimport { create, StoreApi, useStore } from 'zustand';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Radio size variants\n */\ntype RadioSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * Radio visual state\n */\ntype RadioState = 'default' | 'hovered' | 'focused' | 'invalid' | 'disabled';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n radio: 'w-5 h-5',\n textSize: 'sm' as const,\n spacing: 'gap-1.5',\n borderWidth: 'border-2',\n dotSize: 'w-2.5 h-2.5',\n labelHeight: 'h-5',\n },\n medium: {\n radio: 'w-6 h-6',\n textSize: 'md' as const,\n spacing: 'gap-2',\n borderWidth: 'border-2',\n dotSize: 'w-3 h-3',\n labelHeight: 'h-6',\n },\n large: {\n radio: 'w-7 h-7',\n textSize: 'lg' as const,\n spacing: 'gap-2',\n borderWidth: 'border-2',\n dotSize: 'w-3.5 h-3.5',\n labelHeight: 'h-7',\n },\n extraLarge: {\n radio: 'w-8 h-8',\n textSize: 'xl' as const,\n spacing: 'gap-3',\n borderWidth: 'border-2',\n dotSize: 'w-4 h-4',\n labelHeight: 'h-8',\n },\n} as const;\n\n/**\n * Focused state maintains the same sizes as default state\n * Only adds wrapper styling, does not change radio/dot sizes\n */\n\n/**\n * Base radio styling classes using design system colors\n */\nconst BASE_RADIO_CLASSES =\n 'rounded-full border cursor-pointer transition-all duration-200 flex items-center justify-center focus:outline-none';\n\n/**\n * State-based styling classes using design system colors from styles.css\n */\nconst STATE_CLASSES = {\n default: {\n unchecked: 'border-border-400 bg-background hover:border-border-500',\n checked: 'border-primary-950 bg-background hover:border-primary-800',\n },\n hovered: {\n unchecked: 'border-border-500 bg-background',\n checked: 'border-info-700 bg-background',\n },\n focused: {\n unchecked: 'border-border-400 bg-background',\n checked: 'border-primary-950 bg-background',\n },\n invalid: {\n unchecked: 'border-border-400 bg-background',\n checked: 'border-primary-950 bg-background',\n },\n disabled: {\n unchecked: 'border-border-400 bg-background cursor-not-allowed',\n checked: 'border-primary-950 bg-background cursor-not-allowed',\n },\n} as const;\n\n/**\n * Dot styling classes for the inner dot when checked\n */\nconst DOT_CLASSES = {\n default: 'bg-primary-950',\n hovered: 'bg-info-700',\n focused: 'bg-primary-950',\n invalid: 'bg-primary-950',\n disabled: 'bg-primary-950',\n} as const;\n\n/**\n * Radio component props interface\n */\nexport type RadioProps = {\n /** Label text to display next to the radio */\n label?: ReactNode;\n /** Size variant of the radio */\n size?: RadioSize;\n /** Visual state of the radio */\n state?: RadioState;\n /** Error message to display */\n errorMessage?: string;\n /** Helper text to display */\n helperText?: string;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Radio group name */\n name?: string;\n /** Radio value */\n value?: string;\n /** Default checked state for uncontrolled radios */\n defaultChecked?: boolean;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type' | 'defaultChecked'\n>;\n\n/**\n * Radio component for Analytica Ensino platforms\n *\n * A radio button component with essential states, sizes and themes.\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * @example\n * ```tsx\n * // Basic radio\n * <Radio name=\"option\" value=\"1\" label=\"Option 1\" />\n *\n * // Small size\n * <Radio size=\"small\" name=\"option\" value=\"2\" label=\"Small option\" />\n *\n * // Invalid state\n * <Radio state=\"invalid\" name=\"option\" value=\"3\" label=\"Required field\" />\n *\n * // Disabled state\n * <Radio disabled name=\"option\" value=\"4\" label=\"Disabled option\" />\n *\n * // Default checked (uncontrolled)\n * <Radio defaultChecked name=\"option\" value=\"5\" label=\"Initially checked\" />\n * ```\n */\nconst Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n label,\n size = 'medium',\n state = 'default',\n errorMessage,\n helperText,\n className = '',\n labelClassName = '',\n checked: checkedProp,\n defaultChecked = false,\n disabled,\n id,\n name,\n value,\n onChange,\n ...props\n },\n ref\n ) => {\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `radio-${generatedId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Handle controlled vs uncontrolled behavior\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\n const isControlled = checkedProp !== undefined;\n const checked = isControlled ? checkedProp : internalChecked;\n\n // Handle change events\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const newChecked = event.target.checked;\n\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n\n // Prevent automatic scroll when input changes\n if (event.target) {\n event.target.blur();\n }\n\n onChange?.(event);\n };\n\n // Determine current state based on props\n const currentState = disabled ? 'disabled' : state;\n\n // Get size classes\n const sizeClasses = SIZE_CLASSES[size];\n\n // Focused state maintains original sizes, only adds wrapper\n const actualRadioSize = sizeClasses.radio;\n const actualDotSize = sizeClasses.dotSize;\n\n // Determine radio visual variant\n const radioVariant = checked ? 'checked' : 'unchecked';\n\n // Get styling classes\n const stylingClasses = STATE_CLASSES[currentState][radioVariant];\n\n // Border width logic - consistent across all states and sizes\n const getBorderWidth = () => {\n if (currentState === 'focused') {\n return 'border-2';\n }\n return sizeClasses.borderWidth;\n };\n\n const borderWidthClass = getBorderWidth();\n\n // Get final radio classes\n const radioClasses = cn(\n BASE_RADIO_CLASSES,\n actualRadioSize,\n borderWidthClass,\n stylingClasses,\n className\n );\n\n // Get dot classes\n const dotClasses = cn(\n actualDotSize,\n 'rounded-full',\n DOT_CLASSES[currentState],\n 'transition-all duration-200'\n );\n\n // Determine if wrapper is needed only for focused or invalid states\n const isWrapperNeeded =\n currentState === 'focused' || currentState === 'invalid';\n const wrapperBorderColor =\n currentState === 'focused'\n ? 'border-indicator-info'\n : 'border-indicator-error';\n\n // Determine text color based on state and checked status\n const getTextColor = () => {\n if (currentState === 'disabled') {\n return checked ? 'text-text-900' : 'text-text-600';\n }\n\n if (currentState === 'focused') {\n return 'text-text-900';\n }\n\n return checked ? 'text-text-900' : 'text-text-600';\n };\n\n // Determine cursor class based on disabled state\n const getCursorClass = () => {\n return currentState === 'disabled'\n ? 'cursor-not-allowed'\n : 'cursor-pointer';\n };\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cn(\n 'flex flex-row items-center',\n isWrapperNeeded\n ? cn('p-1 border-2', wrapperBorderColor, 'rounded-lg gap-1.5')\n : sizeClasses.spacing,\n disabled ? 'opacity-40' : ''\n )}\n >\n {/* Hidden native input for accessibility and form submission */}\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"radio\"\n id={inputId}\n checked={checked}\n disabled={disabled}\n name={name}\n value={value}\n onChange={handleChange}\n className=\"sr-only\"\n style={{\n position: 'absolute',\n left: '-9999px',\n visibility: 'hidden',\n }}\n {...props}\n />\n\n {/* Custom styled radio */}\n <button\n type=\"button\"\n className={radioClasses}\n disabled={disabled}\n aria-pressed={checked}\n onClick={(e) => {\n // Prevent scroll when radio is clicked\n e.preventDefault();\n if (!disabled) {\n // Simulate click on hidden input\n if (inputRef.current) {\n inputRef.current.click();\n // Remove focus to prevent scroll behavior\n inputRef.current.blur();\n }\n }\n }}\n onKeyDown={(e) => {\n // Handle keyboard activation (Enter or Space)\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\n e.preventDefault();\n if (inputRef.current) {\n inputRef.current.click();\n inputRef.current.blur();\n }\n }\n }}\n >\n {/* Show dot when checked */}\n {checked && <div className={dotClasses} />}\n </button>\n\n {/* Label text */}\n {label && (\n <div\n className={cn(\n 'flex flex-row items-center',\n sizeClasses.labelHeight,\n 'flex-1 min-w-0'\n )}\n >\n <Text\n as=\"label\"\n htmlFor={inputId}\n size={sizeClasses.textSize}\n weight=\"normal\"\n className={cn(\n getCursorClass(),\n 'select-none leading-normal flex items-center font-roboto truncate',\n labelClassName\n )}\n color={getTextColor()}\n >\n {label}\n </Text>\n </div>\n )}\n </div>\n\n {/* Error message */}\n {errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5 truncate\"\n color=\"text-error-600\"\n >\n {errorMessage}\n </Text>\n )}\n\n {/* Helper text */}\n {helperText && !errorMessage && (\n <Text\n size=\"sm\"\n weight=\"normal\"\n className=\"mt-1.5 truncate\"\n color=\"text-text-500\"\n >\n {helperText}\n </Text>\n )}\n </div>\n );\n }\n);\n\nRadio.displayName = 'Radio';\n\n/**\n * RadioGroup store interface\n */\ninterface RadioGroupStore {\n value: string;\n setValue: (value: string) => void;\n onValueChange?: (value: string) => void;\n disabled: boolean;\n name: string;\n}\n\ntype RadioGroupStoreApi = StoreApi<RadioGroupStore>;\n\n/**\n * Create a new RadioGroup store\n */\nconst createRadioGroupStore = (\n name: string,\n defaultValue: string,\n disabled: boolean,\n onValueChange?: (value: string) => void\n): RadioGroupStoreApi =>\n create<RadioGroupStore>((set, get) => ({\n value: defaultValue,\n setValue: (value) => {\n if (!get().disabled) {\n set({ value });\n get().onValueChange?.(value);\n }\n },\n onValueChange,\n disabled,\n name,\n }));\n\n/**\n * Hook to access RadioGroup store\n */\nexport const useRadioGroupStore = (externalStore?: RadioGroupStoreApi) => {\n if (!externalStore) {\n throw new Error('RadioGroupItem must be used within a RadioGroup');\n }\n return externalStore;\n};\n\n/**\n * Inject store into RadioGroupItem children\n */\nconst injectStore = (\n children: ReactNode,\n store: RadioGroupStoreApi\n): ReactNode =>\n Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n const typedChild = child as ReactElement<any>;\n const shouldInject = typedChild.type === RadioGroupItem;\n return cloneElement(typedChild, {\n ...(shouldInject ? { store } : {}),\n ...(typedChild.props.children\n ? { children: injectStore(typedChild.props.children, store) }\n : {}),\n });\n });\n\n/**\n * RadioGroup component props interface\n */\nexport type RadioGroupProps = {\n /** Current selected value */\n value?: string;\n /** Default selected value for uncontrolled usage */\n defaultValue?: string;\n /** Callback when selection changes */\n onValueChange?: (value: string) => void;\n /** Group name for all radios */\n name?: string;\n /** Disabled state for the entire group */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Children components */\n children: ReactNode;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'>;\n\n/**\n * RadioGroup component for flexible radio group composition\n *\n * Uses Zustand for state management with automatic store injection.\n * Allows complete control over layout and styling by composing with RadioGroupItem.\n *\n * @example\n * ```tsx\n * <RadioGroup defaultValue=\"option1\" onValueChange={setValue}>\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option1\" id=\"r1\" />\n * <label htmlFor=\"r1\">Option 1</label>\n * </div>\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option2\" id=\"r2\" />\n * <label htmlFor=\"r2\">Option 2</label>\n * </div>\n * </RadioGroup>\n * ```\n */\nconst RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n value: propValue,\n defaultValue = '',\n onValueChange,\n name: propName,\n disabled = false,\n className = '',\n children,\n ...props\n },\n ref\n ) => {\n // Generate unique name if not provided\n const generatedId = useId();\n const name = propName || `radio-group-${generatedId}`;\n\n // Create store reference\n const storeRef = useRef<RadioGroupStoreApi>(null);\n storeRef.current ??= createRadioGroupStore(\n name,\n defaultValue,\n disabled,\n onValueChange\n );\n const store = storeRef.current;\n\n // Get store actions\n const { setValue } = useStore(store, (s) => s);\n\n // Call onValueChange with initial value\n useEffect(() => {\n const currentValue = store.getState().value;\n if (currentValue && onValueChange) {\n onValueChange(currentValue);\n }\n }, []); // Empty dependency array for mount only\n\n // Handle controlled value changes\n useEffect(() => {\n if (propValue !== undefined) {\n setValue(propValue);\n }\n }, [propValue, setValue]);\n\n // Update disabled state\n useEffect(() => {\n store.setState({ disabled });\n }, [disabled, store]);\n\n return (\n <div\n ref={ref}\n className={className}\n role=\"radiogroup\"\n aria-label={name}\n {...props}\n >\n {injectStore(children, store)}\n </div>\n );\n }\n);\n\nRadioGroup.displayName = 'RadioGroup';\n\n/**\n * RadioGroupItem component props interface\n */\nexport type RadioGroupItemProps = {\n /** Value for this radio item */\n value: string;\n /** Optional label rendered next to the radio (parity with CheckBox/Radio APIs) */\n label?: ReactNode;\n /** CSS classes applied to the label */\n labelClassName?: string;\n /** Store reference (automatically injected by RadioGroup) */\n store?: RadioGroupStoreApi;\n /** Disabled state for this specific item */\n disabled?: boolean;\n /** Size variant */\n size?: RadioSize;\n /** Visual state */\n state?: RadioState;\n /** Additional CSS classes */\n className?: string;\n} & Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'name' | 'value' | 'checked' | 'onChange' | 'size'\n>;\n\n/**\n * RadioGroupItem component for use within RadioGroup\n *\n * A radio button that works within RadioGroup context.\n * Accepts a `label` prop for the common case (parity with CheckBox/Radio).\n * When `label` is omitted, renders just the input for custom composition.\n *\n * @example\n * ```tsx\n * // With label (recommended)\n * <RadioGroup defaultValue=\"option1\">\n * <RadioGroupItem value=\"option1\" label=\"Option 1\" />\n * <RadioGroupItem value=\"option2\" label=\"Option 2\" />\n * </RadioGroup>\n *\n * // Without label - manual composition\n * <RadioGroup defaultValue=\"option1\">\n * <div className=\"flex items-center gap-3\">\n * <RadioGroupItem value=\"option1\" id=\"r1\" />\n * <label htmlFor=\"r1\">Custom layout</label>\n * </div>\n * </RadioGroup>\n * ```\n */\nconst RadioGroupItem = forwardRef<HTMLInputElement, RadioGroupItemProps>(\n (\n {\n value,\n label,\n labelClassName,\n store: externalStore,\n disabled: itemDisabled,\n size = 'medium',\n state = 'default',\n className = '',\n id,\n ...props\n },\n ref\n ) => {\n // Get store and state\n const store = useRadioGroupStore(externalStore);\n const {\n value: groupValue,\n setValue,\n disabled: groupDisabled,\n name,\n } = useStore(store);\n\n // Generate unique ID if not provided\n const generatedId = useId();\n const inputId = id ?? `radio-item-${generatedId}`;\n\n // Determine states\n const isChecked = groupValue === value;\n const isDisabled = groupDisabled || itemDisabled;\n const currentState = isDisabled ? 'disabled' : state;\n\n // Use standard Radio component for consistency and simplicity\n return (\n <Radio\n ref={ref}\n id={inputId}\n name={name}\n value={value}\n checked={isChecked}\n disabled={isDisabled}\n size={size}\n state={currentState}\n className={className}\n label={label}\n labelClassName={labelClassName}\n onChange={(e) => {\n if (e.target.checked && !isDisabled) {\n setValue(value);\n }\n }}\n {...props}\n />\n );\n }\n);\n\nRadioGroupItem.displayName = 'RadioGroupItem';\n\nexport default Radio;\nexport { RadioGroup, RadioGroupItem };\n","import { ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Progress bar size variants\n */\ntype ProgressBarSize = 'small' | 'medium';\n\n/**\n * Progress bar color variants\n */\ntype ProgressBarVariant = 'blue' | 'green';\n\n/**\n * Progress bar layout variants\n */\ntype ProgressBarLayout = 'default' | 'stacked' | 'compact';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n container: 'h-1', // 4px height (h-1 = 4px in Tailwind)\n bar: 'h-1', // 4px height for the fill bar\n spacing: 'gap-2', // 8px gap between label and progress bar\n layout: 'flex-col', // vertical layout for small\n borderRadius: 'rounded-full', // 9999px border radius\n },\n medium: {\n container: 'h-2', // 8px height (h-2 = 8px in Tailwind)\n bar: 'h-2', // 8px height for the fill bar\n spacing: 'gap-2', // 8px gap between progress bar and label\n layout: 'flex-row items-center', // horizontal layout for medium\n borderRadius: 'rounded-lg', // 8px border radius\n },\n} as const;\n\n/**\n * Color configurations using design system colors\n */\nconst VARIANT_CLASSES = {\n blue: {\n background: 'bg-background-300', // Background track color (#D5D4D4)\n fill: 'bg-primary-700', // Blue for activity progress (#2271C4)\n },\n green: {\n background: 'bg-background-300', // Background track color (#D5D4D4)\n fill: 'bg-success-200', // Green for performance (#84D3A2)\n },\n} as const;\n\n/**\n * Type for size classes\n */\ntype SizeClassType = (typeof SIZE_CLASSES)[keyof typeof SIZE_CLASSES];\n\n/**\n * Type for variant classes\n */\ntype VariantClassType = (typeof VARIANT_CLASSES)[keyof typeof VARIANT_CLASSES];\n\n/**\n * Common props shared across all layout components\n */\ninterface BaseLayoutProps {\n className: string;\n label: ReactNode;\n showPercentage: boolean;\n showHitCount: boolean;\n labelClassName: string;\n percentageClassName: string;\n clampedValue: number;\n max: number;\n percentage: number;\n variantClasses: VariantClassType;\n}\n\n/**\n * Dimensions configuration for layouts\n */\ninterface LayoutDimensions {\n width: string;\n height: string;\n}\n\n/**\n * Props for StackedLayout component\n */\ninterface StackedLayoutProps extends BaseLayoutProps {\n dimensions: LayoutDimensions;\n}\n\n/**\n * Props for CompactLayout component\n */\ninterface CompactLayoutProps extends BaseLayoutProps {\n dimensions: LayoutDimensions;\n}\n\n/**\n * Props for DefaultLayout component\n */\ninterface DefaultLayoutProps {\n className: string;\n size: ProgressBarSize;\n sizeClasses: SizeClassType;\n variantClasses: VariantClassType;\n label: ReactNode;\n showPercentage: boolean;\n labelClassName: string;\n percentageClassName: string;\n clampedValue: number;\n max: number;\n percentage: number;\n}\n\n/**\n * ProgressBar component props interface\n */\nexport type ProgressBarProps = {\n /** Progress value between 0 and 100 */\n value: number;\n /** Maximum value (defaults to 100) */\n max?: number;\n /** Size variant of the progress bar */\n size?: ProgressBarSize;\n /** Color variant of the progress bar */\n variant?: ProgressBarVariant;\n /** Layout variant of the progress bar */\n layout?: ProgressBarLayout;\n /** Optional label to display */\n label?: ReactNode;\n /** Show percentage text */\n showPercentage?: boolean;\n /**\n * Show hit count (e.g., \"28 de 30\") instead of percentage\n *\n * PRIORITY: When both showHitCount and showPercentage are true,\n * showHitCount takes precedence (stacked and compact layouts only).\n * Default layout does not support showHitCount.\n */\n showHitCount?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Percentage text CSS classes */\n percentageClassName?: string;\n /** Custom width for stacked layout (defaults to w-[380px]) */\n stackedWidth?: string;\n /** Custom height for stacked layout (defaults to h-[35px]) */\n stackedHeight?: string;\n /** Custom width for compact layout (defaults to w-[131px]) */\n compactWidth?: string;\n /** Custom height for compact layout (defaults to h-[24px]) */\n compactHeight?: string;\n};\n\n/**\n * Helper function to calculate safe progress values\n */\nconst calculateProgressValues = (value: number, max: number) => {\n const safeValue = isNaN(value) ? 0 : value;\n const clampedValue = Math.max(0, Math.min(safeValue, max));\n const percentage = max === 0 ? 0 : (clampedValue / max) * 100;\n\n return { clampedValue, percentage };\n};\n\n/**\n * Helper function to determine if header content should be shown\n */\nconst shouldShowHeader = (\n label: ReactNode,\n showPercentage: boolean,\n showHitCount: boolean\n): boolean => {\n return !!(label || showPercentage || showHitCount);\n};\n\n/**\n * Centralized function to determine display priority and content\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n * 3. label (lowest priority) - displays custom label\n *\n * @param showHitCount - Whether to show hit count format\n * @param showPercentage - Whether to show percentage format\n * @param label - Custom label to display\n * @param clampedValue - Current progress value\n * @param max - Maximum progress value\n * @param percentage - Calculated percentage value\n * @returns Object with content type and formatted content\n */\nconst getDisplayPriority = (\n showHitCount: boolean,\n showPercentage: boolean,\n label: ReactNode,\n clampedValue: number,\n max: number,\n percentage: number\n) => {\n if (showHitCount) {\n return {\n type: 'hitCount' as const,\n content: `${Math.round(clampedValue)} de ${max}`,\n hasMetrics: true,\n };\n }\n\n if (showPercentage) {\n return {\n type: 'percentage' as const,\n content: `${Math.round(percentage)}%`,\n hasMetrics: true,\n };\n }\n\n return {\n type: 'label' as const,\n content: label,\n hasMetrics: false,\n };\n};\n\n/**\n * Parameters for compact layout configuration\n */\ninterface CompactLayoutConfigParams {\n showPercentage: boolean;\n showHitCount: boolean;\n percentage: number;\n clampedValue: number;\n max: number;\n label: ReactNode;\n percentageClassName: string;\n labelClassName: string;\n}\n\n/**\n * Helper function to get compact layout configuration\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n * 3. label (lowest priority) - displays custom label\n *\n * When both showHitCount and showPercentage are true, showHitCount takes precedence.\n */\nconst getCompactLayoutConfig = ({\n showPercentage,\n showHitCount,\n percentage,\n clampedValue,\n max,\n label,\n percentageClassName,\n labelClassName,\n}: CompactLayoutConfigParams) => {\n // Use centralized priority logic for consistency\n const displayPriority = getDisplayPriority(\n showHitCount,\n showPercentage,\n label,\n clampedValue,\n max,\n percentage\n );\n\n return {\n color: displayPriority.hasMetrics ? 'text-primary-600' : 'text-primary-700',\n className: displayPriority.hasMetrics\n ? percentageClassName\n : labelClassName,\n content: displayPriority.content,\n };\n};\n\n/**\n * Helper function to get default layout display configuration\n *\n * PRIORITY ORDER for default layout (showHitCount is not supported):\n * 1. showPercentage (when enabled, takes precedence over label)\n * 2. label (shown only when showPercentage is false)\n *\n * Note: Default layout does not support showHitCount feature.\n */\nconst getDefaultLayoutDisplayConfig = (\n size: ProgressBarSize,\n label: ReactNode,\n showPercentage: boolean\n) => ({\n showHeader: size === 'small' && !!(label || showPercentage),\n showPercentage: size === 'medium' && showPercentage,\n showLabel: size === 'medium' && !!label && !showPercentage, // Only show label when percentage is not shown\n});\n\n/**\n * Helper function to render hit count or percentage display for stacked layout\n *\n * PRIORITY ORDER (consistent across all layouts):\n * 1. showHitCount (highest priority) - displays \"X de Y\" format\n * 2. showPercentage - displays \"X%\" format\n *\n * When both showHitCount and showPercentage are true, showHitCount takes precedence.\n */\nconst renderStackedHitCountDisplay = (\n showHitCount: boolean,\n showPercentage: boolean,\n clampedValue: number,\n max: number,\n percentage: number,\n percentageClassName: string\n): ReactNode => {\n if (!showHitCount && !showPercentage) return null;\n\n // Use centralized priority logic for consistency\n const displayPriority = getDisplayPriority(\n showHitCount,\n showPercentage,\n null, // label is not relevant for stacked layout metrics display\n clampedValue,\n max,\n percentage\n );\n\n return (\n <div\n className={cn(\n 'text-xs font-medium leading-[14px] text-right',\n percentageClassName\n )}\n >\n {displayPriority.type === 'hitCount' ? (\n <>\n <span className=\"text-success-200\">{Math.round(clampedValue)}</span>\n <span className=\"text-text-600\"> de {max}</span>\n </>\n ) : (\n <Text size=\"xs\" weight=\"medium\" className=\"text-success-200\">\n {Math.round(percentage)}%\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * Base progress bar component with common rendering logic\n */\nconst ProgressBarBase = ({\n clampedValue,\n max,\n percentage,\n label,\n variantClasses,\n containerClassName,\n fillClassName,\n}: {\n clampedValue: number;\n max: number;\n percentage: number;\n label: ReactNode;\n variantClasses: VariantClassType;\n containerClassName: string;\n fillClassName: string;\n}) => (\n <div\n className={cn(\n containerClassName,\n variantClasses.background,\n 'overflow-hidden relative'\n )}\n >\n <progress\n value={clampedValue}\n max={max}\n aria-label={\n typeof label === 'string'\n ? `${label}: ${Math.round(percentage)}% complete`\n : `Progress: ${Math.round(percentage)}% of ${max}`\n }\n className=\"absolute inset-0 w-full h-full opacity-0\"\n />\n <div\n className={cn(\n fillClassName,\n variantClasses.fill,\n 'transition-all duration-300 ease-out'\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n);\n\n/**\n * Stacked layout component\n */\nconst StackedLayout = ({\n className,\n label,\n showPercentage,\n showHitCount,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n variantClasses,\n dimensions,\n}: StackedLayoutProps) => (\n <div\n className={cn(\n 'flex flex-col items-start gap-2',\n dimensions.width,\n dimensions.height,\n className\n )}\n >\n {shouldShowHeader(label, showPercentage, showHitCount) && (\n <div className=\"flex flex-row justify-between items-center w-full h-[19px]\">\n {label && (\n <Text\n as=\"div\"\n size=\"md\"\n weight=\"medium\"\n className={cn('text-text-600 leading-[19px]', labelClassName)}\n >\n {label}\n </Text>\n )}\n\n {renderStackedHitCountDisplay(\n showHitCount,\n showPercentage,\n clampedValue,\n max,\n percentage,\n percentageClassName\n )}\n </div>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName=\"w-full h-2 rounded-lg\"\n fillClassName=\"h-2 rounded-lg shadow-hard-shadow-3\"\n />\n </div>\n);\n\n/**\n * Compact layout component\n */\nconst CompactLayout = ({\n className,\n label,\n showPercentage,\n showHitCount,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n variantClasses,\n dimensions,\n}: CompactLayoutProps) => {\n const {\n color,\n className: compactClassName,\n content,\n } = getCompactLayoutConfig({\n showPercentage,\n showHitCount,\n percentage,\n clampedValue,\n max,\n label,\n percentageClassName,\n labelClassName,\n });\n\n return (\n <div\n className={cn(\n 'flex flex-col items-start gap-1',\n dimensions.width,\n dimensions.height,\n className\n )}\n >\n {shouldShowHeader(label, showPercentage, showHitCount) && (\n <Text\n as=\"div\"\n size=\"sm\"\n weight=\"medium\"\n color={color}\n className={cn('leading-4 w-full', compactClassName)}\n >\n {content}\n </Text>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName=\"w-full h-1 rounded-full\"\n fillClassName=\"h-1 rounded-full\"\n />\n </div>\n );\n};\n\n/**\n * Default layout component\n */\nconst DefaultLayout = ({\n className,\n size,\n sizeClasses,\n variantClasses,\n label,\n showPercentage,\n labelClassName,\n percentageClassName,\n clampedValue,\n max,\n percentage,\n}: DefaultLayoutProps) => {\n const gapClass = size === 'medium' ? 'gap-2' : sizeClasses.spacing;\n const progressBarClass = size === 'medium' ? 'flex-grow' : 'w-full';\n const displayConfig = getDefaultLayoutDisplayConfig(\n size,\n label,\n showPercentage\n );\n\n return (\n <div className={cn('flex', sizeClasses.layout, gapClass, className)}>\n {displayConfig.showHeader && (\n <div className=\"flex flex-row items-center justify-between w-full\">\n {label && (\n <Text\n as=\"div\"\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center',\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n </div>\n )}\n\n <ProgressBarBase\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n label={label}\n variantClasses={variantClasses}\n containerClassName={cn(\n progressBarClass,\n sizeClasses.container,\n sizeClasses.borderRadius\n )}\n fillClassName={cn(\n sizeClasses.bar,\n sizeClasses.borderRadius,\n 'shadow-hard-shadow-3'\n )}\n />\n\n {displayConfig.showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none',\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n\n {displayConfig.showLabel && (\n <Text\n as=\"div\"\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * ProgressBar component for Analytica Ensino platforms\n *\n * A progress bar component with size and color variants designed for tracking\n * activity progress (blue) and performance metrics (green).\n * Uses the Analytica Ensino Design System colors from styles.css with automatic\n * light/dark mode support. Includes Text component integration for consistent typography.\n *\n * CONTENT DISPLAY PRIORITY (Consistent across all layouts):\n * 1. showHitCount (highest) - \"X de Y\" format (stacked/compact only)\n * 2. showPercentage - \"X%\" format\n * 3. label (lowest) - Custom label text\n *\n * When multiple display options are enabled, higher priority options take precedence.\n *\n * @example\n * ```tsx\n * // Basic progress bar\n * <ProgressBar value={65} />\n *\n * // Activity progress (blue)\n * <ProgressBar variant=\"blue\" value={45} label=\"Progress\" showPercentage />\n *\n * // Performance metrics (green)\n * <ProgressBar variant=\"green\" size=\"medium\" value={85} label=\"Performance\" />\n *\n * // Small size with custom max value\n * <ProgressBar size=\"small\" value={3} max={5} showPercentage />\n *\n * // Stacked layout with fixed width and hit count\n * <ProgressBar layout=\"stacked\" variant=\"green\" value={28} max={30} label=\"Fáceis\" showHitCount />\n *\n * // Compact layout for small cards\n * <ProgressBar layout=\"compact\" variant=\"blue\" value={70} label=\"Questão 08\" />\n * ```\n */\nconst ProgressBar = ({\n value,\n max = 100,\n size = 'medium',\n variant = 'blue',\n layout = 'default',\n label,\n showPercentage = false,\n showHitCount = false,\n className = '',\n labelClassName = '',\n percentageClassName = '',\n stackedWidth,\n stackedHeight,\n compactWidth,\n compactHeight,\n}: ProgressBarProps) => {\n const { clampedValue, percentage } = calculateProgressValues(value, max);\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_CLASSES[variant];\n\n if (layout === 'stacked') {\n return (\n <StackedLayout\n className={className}\n label={label}\n showPercentage={showPercentage}\n showHitCount={showHitCount}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n variantClasses={variantClasses}\n dimensions={{\n width: stackedWidth ?? 'w-[380px]',\n height: stackedHeight ?? 'h-[35px]',\n }}\n />\n );\n }\n\n if (layout === 'compact') {\n return (\n <CompactLayout\n className={className}\n label={label}\n showPercentage={showPercentage}\n showHitCount={showHitCount}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n variantClasses={variantClasses}\n dimensions={{\n width: compactWidth ?? 'w-[131px]',\n height: compactHeight ?? 'h-[24px]',\n }}\n />\n );\n }\n\n return (\n <DefaultLayout\n className={className}\n size={size}\n sizeClasses={sizeClasses}\n variantClasses={variantClasses}\n label={label}\n showPercentage={showPercentage}\n labelClassName={labelClassName}\n percentageClassName={percentageClassName}\n clampedValue={clampedValue}\n max={max}\n percentage={percentage}\n />\n );\n};\n\nexport default ProgressBar;\n","import {\n forwardRef,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n useId,\n useState,\n useEffect,\n} from 'react';\nimport { CardBase } from '../Card/Card';\nimport { CaretRight } from 'phosphor-react';\nimport { cn } from '../../utils/utils';\n\ninterface CardAccordationProps extends HTMLAttributes<HTMLDivElement> {\n trigger: ReactNode;\n children: ReactNode;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: (isExpanded: boolean) => void;\n value?: string;\n disabled?: boolean;\n /** Additional class for the trigger button */\n triggerClassName?: string;\n /** Additional class for the content wrapper */\n contentClassName?: string;\n}\n\nconst CardAccordation = forwardRef<HTMLDivElement, CardAccordationProps>(\n (\n {\n trigger,\n children,\n className,\n defaultExpanded = false,\n expanded: controlledExpanded,\n onToggleExpanded,\n value,\n disabled = false,\n triggerClassName,\n contentClassName,\n ...props\n },\n ref\n ) => {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const generatedId = useId();\n\n // Use value as ID base for better semantics, fallback to generated ID\n const contentId = value ? `accordion-content-${value}` : generatedId;\n const headerId = value\n ? `accordion-header-${value}`\n : `${generatedId}-header`;\n\n // Determine if component is controlled\n const isControlled = controlledExpanded !== undefined;\n const isExpanded = isControlled ? controlledExpanded : internalExpanded;\n\n // Sync internal state when controlled value changes\n useEffect(() => {\n if (isControlled) {\n setInternalExpanded(controlledExpanded);\n }\n }, [isControlled, controlledExpanded]);\n\n const handleToggle = () => {\n if (disabled) return;\n\n const newExpanded = !isExpanded;\n\n if (!isControlled) {\n setInternalExpanded(newExpanded);\n }\n\n onToggleExpanded?.(newExpanded);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleToggle();\n }\n };\n\n return (\n <CardBase\n ref={ref}\n layout=\"vertical\"\n padding=\"none\"\n minHeight=\"none\"\n className={cn('overflow-hidden', className)}\n {...props}\n >\n {/* Clickable header */}\n <button\n id={headerId}\n type=\"button\"\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n className={cn(\n 'w-full cursor-pointer not-aria-expanded:rounded-xl aria-expanded:rounded-t-xl flex items-center justify-between gap-3 text-left transition-colors duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-950 focus-visible:ring-inset pl-2 pr-10',\n disabled && 'cursor-not-allowed text-text-400',\n triggerClassName\n )}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n aria-disabled={disabled}\n data-value={value}\n >\n {trigger}\n\n <CaretRight\n size={20}\n className={cn(\n 'transition-transform duration-200 flex-shrink-0',\n disabled ? 'text-gray-400' : 'text-text-700',\n isExpanded ? 'rotate-90' : 'rotate-0'\n )}\n data-testid=\"accordion-caret\"\n />\n </button>\n\n {/* Expandable content */}\n <section\n id={contentId}\n aria-labelledby={headerId}\n aria-hidden={!isExpanded}\n className={cn(\n 'transition-all duration-300 ease-in-out overflow-hidden',\n isExpanded ? 'opacity-100' : 'max-h-0 opacity-0'\n )}\n data-testid=\"accordion-content\"\n data-value={value}\n >\n <div className={cn('p-4 pt-0', contentClassName)}>{children}</div>\n </section>\n </CardBase>\n );\n }\n);\n\nCardAccordation.displayName = 'CardAccordation';\n\nexport { CardAccordation };\nexport type { CardAccordationProps };\n","import {\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactNode,\n useState,\n useRef,\n MouseEvent,\n ChangeEvent,\n KeyboardEvent,\n Ref,\n useEffect,\n} from 'react';\nimport Button from '../Button/Button';\nimport Badge from '../Badge/Badge';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport {\n CaretRight,\n ChatCircleText,\n CheckCircle,\n Clock,\n DotsThreeVertical,\n Play,\n SpeakerHigh,\n SpeakerLow,\n SpeakerSimpleX,\n XCircle,\n} from 'phosphor-react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport IconRender from '../IconRender/IconRender';\n\n// Componente base reutilizável para todos os cards\ninterface CardBaseProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n variant?: 'default' | 'compact' | 'minimal';\n layout?: 'horizontal' | 'vertical';\n padding?: 'none' | 'small' | 'medium' | 'large';\n minHeight?: 'none' | 'small' | 'medium' | 'large';\n cursor?: 'default' | 'pointer';\n}\n\nconst CARD_BASE_CLASSES = {\n default: 'w-full bg-background border border-border-50 rounded-xl',\n compact: 'w-full bg-background border border-border-50 rounded-lg',\n minimal: 'w-full bg-background border border-border-100 rounded-md',\n};\n\nconst CARD_PADDING_CLASSES = {\n none: '',\n small: 'p-2',\n medium: 'p-4',\n large: 'p-6',\n};\n\nconst CARD_MIN_HEIGHT_CLASSES = {\n none: '',\n small: 'min-h-16',\n medium: 'min-h-20',\n large: 'min-h-24',\n};\n\nconst CARD_LAYOUT_CLASSES = {\n horizontal: 'flex flex-row',\n vertical: 'flex flex-col',\n};\n\nconst CARD_CURSOR_CLASSES = {\n default: '',\n pointer: 'cursor-pointer',\n};\n\nconst CardBase = forwardRef<HTMLDivElement, CardBaseProps>(\n (\n {\n children,\n variant = 'default',\n layout = 'horizontal',\n padding = 'medium',\n minHeight = 'medium',\n cursor = 'default',\n className = '',\n onClick,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const baseClasses = CARD_BASE_CLASSES[variant];\n const paddingClasses = CARD_PADDING_CLASSES[padding];\n const minHeightClasses = CARD_MIN_HEIGHT_CLASSES[minHeight];\n const layoutClasses = CARD_LAYOUT_CLASSES[layout];\n const cursorClasses = CARD_CURSOR_CLASSES[cursor];\n\n // Make cards with onClick focusable and keyboard accessible\n const isInteractive = !!onClick;\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (isInteractive && ['Enter', ' '].includes(e.key)) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).click();\n }\n onKeyDown?.(e);\n };\n\n /*\n * Note: Using div with role=\"button\" instead of native <button> element.\n * Rationale:\n * - Card is a complex container component with multiple child elements\n * - Native button has layout/styling constraints incompatible with card design\n * - Full WCAG/ARIA compliance implemented: role, tabIndex, keyboard support\n */\n return (\n <div\n ref={ref}\n className={cn(\n baseClasses,\n paddingClasses,\n minHeightClasses,\n layoutClasses,\n cursorClasses,\n className\n )}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n tabIndex={isInteractive ? 0 : undefined}\n role={isInteractive ? 'button' : undefined}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\ninterface CardActivitiesResultsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n title: string;\n subTitle: string;\n header: string;\n description?: string;\n extended?: boolean;\n action?: 'warning' | 'success' | 'error' | 'info';\n}\n\nconst ACTION_CARD_CLASSES = {\n warning: 'bg-warning-background',\n success: 'bg-success-200',\n error: 'bg-error-100',\n info: 'bg-info-background',\n};\n\nconst ACTION_ICON_CLASSES = {\n warning: 'bg-warning-300 text-text',\n success: 'bg-indicator-positive text-text-950',\n error: 'bg-indicator-negative text-text',\n info: 'bg-info-500 text-text',\n};\n\nconst ACTION_SUBTITLE_CLASSES = {\n warning: 'text-warning-600',\n success: 'text-success-700',\n error: 'text-error-700',\n info: 'text-info-700',\n};\n\nconst ACTION_HEADER_CLASSES = {\n warning: 'text-warning-300',\n success: 'text-success-300',\n error: 'text-error-300',\n info: 'text-info-300',\n};\n\nconst CardActivitiesResults = forwardRef<\n HTMLDivElement,\n CardActivitiesResultsProps\n>(\n (\n {\n icon,\n title,\n subTitle,\n header,\n extended = false,\n action = 'success',\n description,\n className,\n ...props\n },\n ref\n ) => {\n const actionCardClasses = ACTION_CARD_CLASSES[action];\n const actionIconClasses = ACTION_ICON_CLASSES[action];\n const actionSubTitleClasses = ACTION_SUBTITLE_CLASSES[action];\n const actionHeaderClasses = ACTION_HEADER_CLASSES[action];\n\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full flex flex-col rounded-xl',\n extended && 'border border-border-50 bg-background',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'flex flex-col gap-1 items-center justify-center p-4',\n actionCardClasses,\n extended ? 'rounded-t-xl' : 'rounded-xl'\n )}\n >\n <span\n className={cn(\n 'size-7.5 rounded-full flex items-center justify-center',\n actionIconClasses\n )}\n >\n {icon}\n </span>\n\n <Text\n size=\"2xs\"\n weight=\"medium\"\n className=\"text-text-800 uppercase truncate\"\n >\n {title}\n </Text>\n\n <p\n className={cn('text-lg font-bold truncate', actionSubTitleClasses)}\n >\n {subTitle}\n </p>\n </div>\n\n {extended && (\n <div className=\"flex flex-col items-center gap-2.5 pb-9.5 pt-2.5\">\n <p\n className={cn(\n 'text-2xs font-medium uppercase truncate',\n actionHeaderClasses\n )}\n >\n {header}\n </p>\n <Badge size=\"large\" action=\"info\">\n {description}\n </Badge>\n </div>\n )}\n </div>\n );\n }\n);\n\ninterface CardQuestionProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n state?: 'done' | 'undone' | 'pending';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardQuestions = forwardRef<HTMLDivElement, CardQuestionProps>(\n (\n {\n header,\n state = 'undone',\n className,\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const getStateConfig = () => {\n switch (state) {\n case 'done':\n return {\n label: 'Realizado',\n buttonLabel: 'Ver Resultado',\n badgeAction: 'success' as const,\n };\n case 'pending':\n return {\n label: 'Aguardando correção',\n buttonLabel: 'Ver Resultado',\n badgeAction: 'info' as const,\n };\n default:\n return {\n label: 'Não Realizado',\n buttonLabel: 'Responder',\n badgeAction: 'error' as const,\n };\n }\n };\n\n const { label, buttonLabel, badgeAction } = getStateConfig();\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('justify-between gap-4', className)}\n {...props}\n >\n <section className=\"flex flex-col gap-1 flex-1 min-w-0\">\n <p className=\"font-bold text-xs text-text-950 truncate\">{header}</p>\n\n <div className=\"flex flex-row gap-6 items-center\">\n <Badge size=\"medium\" variant=\"solid\" action={badgeAction}>\n {label}\n </Badge>\n </div>\n </section>\n\n <span className=\"flex-shrink-0\">\n <Button\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit\"\n >\n {buttonLabel}\n </Button>\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardProgressProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subhead?: string;\n initialDate?: string;\n endDate?: string;\n progress?: number;\n direction?: 'horizontal' | 'vertical';\n icon: ReactNode;\n color?: string;\n progressVariant?: 'blue' | 'green';\n showDates?: boolean;\n}\n\nconst CardProgress = forwardRef<HTMLDivElement, CardProgressProps>(\n (\n {\n header,\n subhead,\n initialDate,\n endDate,\n progress = 0,\n direction = 'horizontal',\n icon,\n color = '#B7DFFF',\n progressVariant = 'blue',\n showDates = true,\n className,\n ...props\n },\n ref\n ) => {\n const isHorizontal = direction === 'horizontal';\n const contentComponent = {\n horizontal: (\n <>\n {showDates && (\n <div className=\"flex flex-row gap-6 items-center\">\n {initialDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Início</p>\n <p className=\"text-text-600\">{initialDate}</p>\n </span>\n )}\n {endDate && (\n <span className=\"flex flex-row gap-1 items-center text-2xs\">\n <p className=\"text-text-800 font-semibold\">Fim</p>\n <p className=\"text-text-600\">{endDate}</p>\n </span>\n )}\n </div>\n )}\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n </span>\n </>\n ),\n vertical: <p className=\"text-sm text-text-800\">{subhead}</p>,\n };\n\n return (\n <CardBase\n ref={ref}\n layout={isHorizontal ? 'horizontal' : 'vertical'}\n padding=\"none\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn(isHorizontal ? 'h-20' : '', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-6 text-text-950',\n isHorizontal\n ? 'min-w-[80px] min-h-[80px] rounded-l-xl'\n : 'min-h-[50px] w-full rounded-t-xl',\n !color.startsWith('#') ? `${color}` : ''\n )}\n style={color.startsWith('#') ? { backgroundColor: color } : undefined}\n data-testid=\"icon-container\"\n >\n {icon}\n </div>\n\n <div\n className={cn(\n 'p-4 flex flex-col justify-between w-full h-full',\n !isHorizontal && 'gap-4'\n )}\n >\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950 truncate\">\n {header}\n </Text>\n {contentComponent[direction]}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTopicProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n subHead?: string[];\n progress: number;\n showPercentage?: boolean;\n progressVariant?: 'blue' | 'green';\n}\n\nconst CardTopic = forwardRef<HTMLDivElement, CardTopicProps>(\n (\n {\n header,\n subHead,\n progress,\n showPercentage = false,\n progressVariant = 'blue',\n className = '',\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"vertical\"\n padding=\"small\"\n minHeight=\"medium\"\n cursor=\"pointer\"\n className={cn('justify-center gap-2 py-2 px-4', className)}\n {...props}\n >\n {subHead && (\n <span className=\"text-text-600 text-2xs flex flex-row gap-1\">\n {subHead.map((text, index) => (\n <Fragment key={`${text} - ${index}`}>\n <p>{text}</p>\n {index < subHead.length - 1 && <p>•</p>}\n </Fragment>\n ))}\n </span>\n )}\n\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n\n <span className=\"grid grid-cols-[1fr_auto] items-center gap-2\">\n <ProgressBar\n size=\"small\"\n value={progress}\n variant={progressVariant}\n data-testid=\"progress-bar\"\n />\n {showPercentage && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className={cn(\n 'text-text-950 leading-none tracking-normal text-center flex-none'\n )}\n >\n {Math.round(progress)}%\n </Text>\n )}\n </span>\n </CardBase>\n );\n }\n);\n\ninterface CardPerformanceProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n description?: string;\n progress?: number;\n labelProgress?: string;\n actionVariant?: 'button' | 'caret';\n progressVariant?: 'blue' | 'green';\n onClickButton?: (valueButton?: unknown) => void;\n valueButton?: unknown;\n}\n\nconst CardPerformance = forwardRef<HTMLDivElement, CardPerformanceProps>(\n (\n {\n header,\n progress,\n description = 'Sem dados ainda! Você ainda não fez um questionário neste assunto.',\n actionVariant = 'button',\n progressVariant = 'blue',\n labelProgress = '',\n className = '',\n onClickButton,\n valueButton,\n ...props\n },\n ref\n ) => {\n const hasProgress = progress !== undefined;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n actionVariant == 'caret' ? 'cursor-pointer' : '',\n className\n )}\n onClick={() => actionVariant == 'caret' && onClickButton?.(valueButton)}\n {...props}\n >\n <div className=\"w-full flex flex-col justify-between gap-2\">\n <div className=\"flex flex-row justify-between items-center gap-2\">\n <p className=\"text-lg font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n {actionVariant === 'button' && (\n <Button\n variant=\"outline\"\n size=\"extra-small\"\n onClick={() => onClickButton?.(valueButton)}\n className=\"min-w-fit flex-shrink-0\"\n >\n Ver Aula\n </Button>\n )}\n </div>\n\n <div className=\"w-full\">\n {hasProgress ? (\n <ProgressBar\n value={progress}\n label={`${progress}% ${labelProgress}`}\n variant={progressVariant}\n />\n ) : (\n <p className=\"text-xs text-text-600 truncate\">{description}</p>\n )}\n </div>\n </div>\n\n {actionVariant == 'caret' && (\n <CaretRight\n className=\"size-4.5 text-text-800 cursor-pointer\"\n data-testid=\"caret-icon\"\n />\n )}\n </CardBase>\n );\n }\n);\n\ninterface CardResultsProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n icon: string;\n correct_answers: number;\n incorrect_answers: number;\n direction?: 'row' | 'col';\n color?: string;\n}\n\nconst CardResults = forwardRef<HTMLDivElement, CardResultsProps>(\n (\n {\n header,\n correct_answers,\n incorrect_answers,\n icon,\n direction = 'col',\n color = '#B7DFFF',\n className,\n ...props\n },\n ref\n ) => {\n const isRow = direction == 'row';\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"none\"\n minHeight=\"medium\"\n className={cn('items-stretch cursor-pointer pr-4', className)}\n {...props}\n >\n <div\n className={cn(\n 'flex justify-center items-center [&>svg]:size-8 text-text-950 min-w-20 max-w-20 min-h-full rounded-l-xl'\n )}\n style={{\n backgroundColor: color,\n }}\n >\n <IconRender iconName={icon} color=\"currentColor\" size={20} />\n </div>\n\n <div className=\"w-full flex flex-row justify-between items-center\">\n <div\n className={cn(\n 'p-4 flex flex-wrap justify-between w-full h-full',\n isRow ? 'flex-row items-center gap-2' : 'flex-col'\n )}\n >\n <p className=\"text-sm font-bold text-text-950 flex-1\">{header}</p>\n <span className=\"flex flex-wrap flex-row gap-1 items-center\">\n <Badge\n action=\"success\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<CheckCircle />}\n >\n {correct_answers} Corretas\n </Badge>\n\n <Badge\n action=\"error\"\n variant=\"solid\"\n size=\"large\"\n iconLeft={<XCircle />}\n >\n {incorrect_answers} Incorretas\n </Badge>\n </span>\n </div>\n\n <CaretRight className=\"min-w-6 min-h-6 text-text-800\" />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardStatusProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n status?: 'correct' | 'incorrect' | 'unanswered' | 'pending';\n label?: string;\n}\n\nconst CardStatus = forwardRef<HTMLDivElement, CardStatusProps>(\n ({ header, className, status, label, ...props }, ref) => {\n const getLabelBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return 'Correta';\n case 'incorrect':\n return 'Incorreta';\n case 'unanswered':\n return 'Em branco';\n case 'pending':\n return 'Avaliação pendente';\n default:\n return 'Em branco';\n }\n };\n\n const getIconBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return <CheckCircle />;\n case 'incorrect':\n return <XCircle />;\n case 'pending':\n return <Clock />;\n default:\n return <XCircle />;\n }\n };\n\n const getActionBadge = (status: CardStatusProps['status']) => {\n switch (status) {\n case 'correct':\n return 'success';\n case 'incorrect':\n return 'error';\n case 'pending':\n return 'info';\n default:\n return 'info';\n }\n };\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"medium\"\n className={cn('items-center cursor-pointer', className)}\n {...props}\n >\n <div className=\"flex justify-between w-full h-full flex-row items-center gap-2\">\n <p className=\"text-sm font-bold text-text-950 truncate flex-1 min-w-0\">\n {header}\n </p>\n <span className=\"flex flex-row gap-1 items-center flex-shrink-0\">\n {status && (\n <Badge\n action={getActionBadge(status)}\n variant=\"solid\"\n size=\"medium\"\n iconLeft={getIconBadge(status)}\n >\n {getLabelBadge(status)}\n </Badge>\n )}\n {label && <p className=\"text-sm text-text-800\">{label}</p>}\n </span>\n <CaretRight className=\"min-w-6 min-h-6 text-text-800 cursor-pointer flex-shrink-0 ml-2\" />\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSettingsProps extends HTMLAttributes<HTMLDivElement> {\n icon: ReactNode;\n header: string;\n}\n\nconst CardSettings = forwardRef<HTMLDivElement, CardSettingsProps>(\n ({ header, className, icon, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"small\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <span className=\"[&>svg]:size-6\">{icon}</span>\n\n <p className=\"w-full text-sm truncate\">{header}</p>\n\n <CaretRight size={24} className=\"cursor-pointer\" />\n </CardBase>\n );\n }\n);\n\ninterface CardSupportProps extends HTMLAttributes<HTMLDivElement> {\n header: string;\n direction?: 'row' | 'col';\n children: ReactNode;\n}\n\nconst CardSupport = forwardRef<HTMLDivElement, CardSupportProps>(\n ({ header, className, direction = 'col', children, ...props }, ref) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n 'border-none items-center gap-2 text-text-700',\n className\n )}\n {...props}\n >\n <div\n className={cn(\n 'w-full flex',\n direction == 'col' ? 'flex-col' : 'flex-row items-center'\n )}\n >\n <span className=\"w-full min-w-0\">\n <p className=\"text-sm text-text-950 font-bold truncate\">{header}</p>\n </span>\n <span className=\"flex flex-row gap-1\">{children}</span>\n </div>\n\n <CaretRight className=\"text-text-800 cursor-pointer\" size={24} />\n </CardBase>\n );\n }\n);\n\ninterface CardForumProps<T = unknown> extends HTMLAttributes<HTMLDivElement> {\n title: string;\n content: string;\n comments: number;\n date: string;\n hour: string;\n onClickComments?: (value?: T) => void;\n valueComments?: T;\n onClickProfile?: (profile?: T) => void;\n valueProfile?: T;\n}\n\nconst CardForum = forwardRef<HTMLDivElement, CardForumProps>(\n (\n {\n title,\n content,\n comments,\n onClickComments,\n valueComments,\n onClickProfile,\n valueProfile,\n className = '',\n date,\n hour,\n ...props\n },\n ref\n ) => {\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n variant=\"minimal\"\n className={cn('w-auto h-auto gap-3', className)}\n {...props}\n >\n <button\n type=\"button\"\n aria-label=\"Ver perfil\"\n onClick={() => onClickProfile?.(valueProfile)}\n className=\"min-w-8 h-8 rounded-full bg-background-950\"\n />\n\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n <div className=\"flex flex-row gap-1 items-center flex-wrap\">\n <p className=\"text-xs font-semibold text-primary-700 truncate\">\n {title}\n </p>\n <p className=\"text-xs text-text-600\">\n • {date} • {hour}\n </p>\n </div>\n\n <p className=\"text-text-950 text-sm line-clamp-2 truncate\">\n {content}\n </p>\n\n <button\n type=\"button\"\n aria-label=\"Ver comentários\"\n onClick={() => onClickComments?.(valueComments)}\n className=\"text-text-600 flex flex-row gap-2 items-center\"\n >\n <ChatCircleText aria-hidden=\"true\" size={16} />\n <p className=\"text-xs\">{comments} respostas</p>\n </button>\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardAudioProps extends HTMLAttributes<HTMLDivElement> {\n src?: string;\n title?: string;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onAudioTimeUpdate?: (currentTime: number, duration: number) => void;\n loop?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n tracks?: Array<{\n kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';\n src: string;\n srcLang: string;\n label: string;\n default?: boolean;\n }>;\n}\n\nconst CardAudio = forwardRef<HTMLDivElement, CardAudioProps>(\n (\n {\n src,\n title,\n onPlay,\n onPause,\n onEnded,\n onAudioTimeUpdate,\n loop = false,\n preload = 'metadata',\n tracks,\n className,\n ...props\n },\n ref\n ) => {\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [showVolumeControl, setShowVolumeControl] = useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = useState(false);\n const [playbackRate, setPlaybackRate] = useState(1);\n const audioRef = useRef<HTMLAudioElement>(null);\n const volumeControlRef = useRef<HTMLDivElement>(null);\n const speedMenuRef = useRef<HTMLDivElement>(null);\n\n const formatTime = (time: number) => {\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const handlePlayPause = () => {\n if (isPlaying) {\n audioRef.current?.pause();\n setIsPlaying(false);\n onPause?.();\n } else {\n audioRef.current?.play();\n setIsPlaying(true);\n onPlay?.();\n }\n };\n\n const handleTimeUpdate = () => {\n const current = audioRef.current?.currentTime ?? 0;\n const total = audioRef.current?.duration ?? 0;\n\n setCurrentTime(current);\n setDuration(total);\n onAudioTimeUpdate?.(current, total);\n };\n\n const handleLoadedMetadata = () => {\n setDuration(audioRef.current?.duration ?? 0);\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n setCurrentTime(0);\n onEnded?.();\n };\n\n const handleProgressClick = (e: MouseEvent<HTMLButtonElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const width = rect.width;\n const percentage = clickX / width;\n const newTime = percentage * duration;\n\n if (audioRef.current) {\n audioRef.current.currentTime = newTime;\n }\n setCurrentTime(newTime);\n };\n\n const handleVolumeChange = (e: ChangeEvent<HTMLInputElement>) => {\n const newVolume = parseFloat(e.target.value);\n setVolume(newVolume);\n if (audioRef.current) {\n audioRef.current.volume = newVolume;\n }\n };\n\n const toggleVolumeControl = () => {\n setShowVolumeControl(!showVolumeControl);\n setShowSpeedMenu(false);\n };\n\n const toggleSpeedMenu = () => {\n setShowSpeedMenu(!showSpeedMenu);\n setShowVolumeControl(false);\n };\n\n const handleSpeedChange = (speed: number) => {\n setPlaybackRate(speed);\n if (audioRef.current) {\n audioRef.current.playbackRate = speed;\n }\n setShowSpeedMenu(false);\n };\n\n const getVolumeIcon = () => {\n if (volume === 0) {\n return <SpeakerSimpleX size={24} />;\n }\n if (volume < 0.5) {\n return <SpeakerLow size={24} />;\n }\n return <SpeakerHigh size={24} />;\n };\n\n useEffect(() => {\n const handleClickOutside = (event: Event) => {\n if (\n volumeControlRef.current &&\n !volumeControlRef.current.contains(event.target as Node)\n ) {\n setShowVolumeControl(false);\n }\n if (\n speedMenuRef.current &&\n !speedMenuRef.current.contains(event.target as Node)\n ) {\n setShowSpeedMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, []);\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n className={cn(\n 'flex flex-row w-auto h-14 items-center gap-2',\n className\n )}\n {...props}\n >\n {/* Audio element */}\n <audio\n ref={audioRef}\n src={src}\n loop={loop}\n preload={preload}\n onTimeUpdate={handleTimeUpdate}\n onLoadedMetadata={handleLoadedMetadata}\n onEnded={handleEnded}\n data-testid=\"audio-element\"\n aria-label={title}\n >\n {tracks ? (\n tracks.map((track) => (\n <track\n key={track.src}\n kind={track.kind}\n src={track.src}\n srcLang={track.srcLang}\n label={track.label}\n default={track.default}\n />\n ))\n ) : (\n <track\n kind=\"captions\"\n src=\"data:text/vtt;base64,\"\n srcLang=\"pt\"\n label=\"Sem legendas disponíveis\"\n />\n )}\n </audio>\n\n {/* Play/Pause Button */}\n <button\n type=\"button\"\n onClick={handlePlayPause}\n disabled={!src}\n className=\"cursor-pointer text-text-950 hover:text-primary-600 disabled:text-text-400 disabled:cursor-not-allowed\"\n aria-label={isPlaying ? 'Pausar' : 'Reproduzir'}\n >\n {isPlaying ? (\n <div className=\"w-6 h-6 flex items-center justify-center\">\n <div className=\"flex gap-0.5\">\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n <div className=\"w-1 h-4 bg-current rounded-sm\"></div>\n </div>\n </div>\n ) : (\n <Play size={24} />\n )}\n </button>\n\n {/* Current Time */}\n <p className=\"text-text-800 text-md font-medium min-w-[2.5rem]\">\n {formatTime(currentTime)}\n </p>\n\n {/* Progress Bar */}\n <div className=\"flex-1 relative\" data-testid=\"progress-bar\">\n <button\n type=\"button\"\n className=\"w-full h-2 bg-border-100 rounded-full cursor-pointer\"\n onClick={handleProgressClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.currentTarget.click();\n }\n }}\n aria-label=\"Barra de progresso do áudio\"\n >\n <div\n className=\"h-full bg-primary-600 rounded-full transition-all duration-100\"\n style={{\n width:\n duration > 0 ? `${(currentTime / duration) * 100}%` : '0%',\n }}\n />\n </button>\n </div>\n\n {/* Duration */}\n <p className=\"text-text-800 text-md font-medium min-w-[2.5rem]\">\n {formatTime(duration)}\n </p>\n\n {/* Volume Control */}\n <div className=\"relative h-6\" ref={volumeControlRef}>\n <button\n type=\"button\"\n onClick={toggleVolumeControl}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Controle de volume\"\n >\n <div className=\"w-6 h-6 flex items-center justify-center\">\n {getVolumeIcon()}\n </div>\n </button>\n\n {showVolumeControl && (\n <button\n type=\"button\"\n className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg focus:outline-none focus:ring-2 focus:ring-primary-500\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setShowVolumeControl(false);\n }\n }}\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.1\"\n value={volume}\n onChange={handleVolumeChange}\n onKeyDown={(e) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowRight') {\n e.preventDefault();\n const newVolume = Math.min(\n 1,\n Math.round((volume + 0.1) * 10) / 10\n );\n setVolume(newVolume);\n if (audioRef.current) audioRef.current.volume = newVolume;\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowLeft') {\n e.preventDefault();\n const newVolume = Math.max(\n 0,\n Math.round((volume - 0.1) * 10) / 10\n );\n setVolume(newVolume);\n if (audioRef.current) audioRef.current.volume = newVolume;\n }\n }}\n className=\"w-20 h-2 bg-border-100 rounded-lg appearance-none cursor-pointer\"\n style={{\n background: `linear-gradient(to right, #3b82f6 0%, #3b82f6 ${volume * 100}%, #e5e7eb ${volume * 100}%, #e5e7eb 100%)`,\n }}\n aria-label=\"Volume\"\n aria-valuenow={Math.round(volume * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n />\n </button>\n )}\n </div>\n\n {/* Menu Button */}\n <div className=\"relative h-6\" ref={speedMenuRef}>\n <button\n type=\"button\"\n onClick={toggleSpeedMenu}\n className=\"cursor-pointer text-text-950 hover:text-primary-600\"\n aria-label=\"Opções de velocidade\"\n >\n <DotsThreeVertical size={24} />\n </button>\n\n {showSpeedMenu && (\n <div className=\"absolute bottom-full right-0 mb-2 p-2 bg-background border border-border-100 rounded-lg shadow-lg min-w-24 z-10\">\n <div className=\"flex flex-col gap-1\">\n {[\n { speed: 1, label: '1x' },\n { speed: 1.5, label: '1.5x' },\n { speed: 2, label: '2x' },\n ].map(({ speed, label }) => (\n <button\n key={speed}\n type=\"button\"\n onClick={() => handleSpeedChange(speed)}\n className={cn(\n 'px-3 py-1 text-sm text-left rounded hover:bg-border-50 transition-colors',\n playbackRate === speed\n ? 'bg-primary-950 text-secondary-100 font-medium'\n : 'text-text-950'\n )}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardSimuladoProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n duration?: string;\n info: string;\n backgroundColor: 'enem' | 'prova' | 'simuladao' | 'vestibular';\n /**\n * Renders the card in a non-interactive \"coming soon\" state: greyed out,\n * not clickable, with an \"Em breve\" badge next to the title.\n */\n comingSoon?: boolean;\n /** Disables interaction (greyed out, not clickable) without a badge. */\n disabled?: boolean;\n}\n\nconst SIMULADO_BACKGROUND_CLASSES = {\n enem: 'bg-exam-1',\n prova: 'bg-exam-2',\n simuladao: 'bg-exam-3',\n vestibular: 'bg-exam-4',\n};\n\nconst CardSimulado = forwardRef<HTMLDivElement, CardSimuladoProps>(\n (\n {\n title,\n duration,\n info,\n backgroundColor,\n comingSoon = false,\n disabled = false,\n className,\n onClick,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const backgroundClass = SIMULADO_BACKGROUND_CLASSES[backgroundColor];\n const isInteractive = !comingSoon && !disabled;\n\n return (\n <CardBase\n ref={ref}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor={isInteractive ? 'pointer' : 'default'}\n aria-disabled={isInteractive ? undefined : true}\n // Only forward handlers when interactive: CardBase derives tabIndex,\n // role=\"button\" and Enter/Space activation from the presence of onClick,\n // so a disabled/coming-soon card must not receive them.\n onClick={isInteractive ? onClick : undefined}\n onKeyDown={isInteractive ? onKeyDown : undefined}\n className={cn(\n backgroundClass,\n isInteractive\n ? 'hover:shadow-soft-shadow-2 transition-shadow duration-200'\n : 'opacity-60 pointer-events-none',\n className\n )}\n {...props}\n >\n <div className=\"flex justify-between items-center w-full gap-4\">\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n {comingSoon ? (\n <div className=\"flex items-center gap-2 min-w-0\">\n <Text\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 truncate\"\n >\n {title}\n </Text>\n <Badge\n size=\"small\"\n variant=\"solid\"\n action=\"info\"\n className=\"flex-shrink-0\"\n data-testid=\"badge-em-breve\"\n >\n Em breve\n </Badge>\n </div>\n ) : (\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950 truncate\">\n {title}\n </Text>\n )}\n\n <div className=\"flex items-center gap-4 text-text-700\">\n {duration && (\n <div className=\"flex items-center gap-1\">\n <Clock size={16} className=\"flex-shrink-0\" />\n <Text size=\"sm\">{duration}</Text>\n </div>\n )}\n\n <Text size=\"sm\" className=\"truncate\">\n {info}\n </Text>\n </div>\n </div>\n\n {isInteractive && (\n <CaretRight\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n />\n )}\n </div>\n </CardBase>\n );\n }\n);\n\ninterface CardTestProps extends Omit<HTMLAttributes<HTMLElement>, 'onSelect'> {\n title: string;\n duration?: string;\n questionsCount?: number;\n additionalInfo?: string;\n selected?: boolean;\n onSelect?: (selected: boolean) => void;\n}\n\nconst CardTest = forwardRef<HTMLElement, CardTestProps>(\n (\n {\n title,\n duration,\n questionsCount,\n additionalInfo,\n selected = false,\n onSelect,\n className = '',\n ...props\n },\n ref\n ) => {\n const handleClick = () => {\n if (onSelect) {\n onSelect(!selected);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if ((event.key === 'Enter' || event.key === ' ') && onSelect) {\n event.preventDefault();\n onSelect(!selected);\n }\n };\n\n const isSelectable = !!onSelect;\n const getQuestionsText = (count: number) => {\n const singular = count === 1 ? 'questão' : 'questões';\n return `${count} ${singular}`;\n };\n\n const displayInfo = questionsCount\n ? getQuestionsText(questionsCount)\n : additionalInfo || '';\n const baseClasses =\n 'flex flex-row items-center p-4 gap-2 w-full max-w-full bg-background shadow-soft-shadow-1 rounded-xl isolate border-0 text-left';\n const interactiveClasses = isSelectable\n ? 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-offset-2'\n : '';\n const selectedClasses = selected\n ? 'ring-2 ring-primary-950 ring-offset-2'\n : '';\n\n if (isSelectable) {\n return (\n <button\n ref={ref as Ref<HTMLButtonElement>}\n type=\"button\"\n className={cn(\n `${baseClasses} ${interactiveClasses} ${selectedClasses} ${className}`.trim()\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n aria-pressed={selected}\n {...(props as HTMLAttributes<HTMLButtonElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <Clock size={16} className=\"text-text-700\" />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </button>\n );\n }\n\n return (\n <div\n ref={ref as Ref<HTMLDivElement>}\n className={cn(`${baseClasses} ${className}`.trim())}\n {...(props as HTMLAttributes<HTMLDivElement>)}\n >\n <div className=\"flex flex-col justify-between gap-[27px] flex-grow min-h-[67px] w-full min-w-0\">\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px] leading-[19px] truncate\"\n >\n {title}\n </Text>\n\n <div className=\"flex flex-row justify-start items-end gap-4 w-full\">\n {duration && (\n <div className=\"flex flex-row items-center gap-1 flex-shrink-0\">\n <Clock size={16} className=\"text-text-700\" />\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] whitespace-nowrap\"\n >\n {duration}\n </Text>\n </div>\n )}\n\n <Text\n size=\"sm\"\n className=\"text-text-700 leading-[21px] flex-grow truncate min-w-0\"\n >\n {displayInfo}\n </Text>\n </div>\n </div>\n </div>\n );\n }\n);\n\ninterface SimulationItem {\n id: string;\n title: string;\n type: 'enem' | 'prova' | 'simulado' | 'vestibular';\n info: string;\n}\n\ninterface SimulationHistoryData {\n date: string;\n simulations: SimulationItem[];\n}\n\ninterface CardSimulationHistoryProps extends HTMLAttributes<HTMLDivElement> {\n data: SimulationHistoryData[];\n onSimulationClick?: (simulation: SimulationItem) => void;\n}\n\nconst SIMULATION_TYPE_STYLES = {\n enem: {\n background: 'bg-exam-1',\n badge: 'exam1' as const,\n text: 'Enem',\n },\n prova: {\n background: 'bg-exam-2',\n badge: 'exam2' as const,\n text: 'Prova',\n },\n simulado: {\n background: 'bg-exam-3',\n badge: 'exam3' as const,\n text: 'Simuladão',\n },\n vestibular: {\n background: 'bg-exam-4',\n badge: 'exam4' as const,\n text: 'Vestibular',\n },\n};\n\nconst CardSimulationHistory = forwardRef<\n HTMLDivElement,\n CardSimulationHistoryProps\n>(({ data, onSimulationClick, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('w-full max-w-[992px] h-auto', className)}\n {...props}\n >\n {/* Content */}\n <div className=\"flex flex-col gap-0\">\n {data.map((section, sectionIndex) => (\n <div key={section.date} className=\"flex flex-col\">\n {/* Seção com data */}\n <div\n className={cn(\n 'flex flex-row justify-center items-start px-4 py-6 gap-2 w-full bg-background',\n sectionIndex === 0 ? 'rounded-t-3xl' : ''\n )}\n >\n <Text\n size=\"xs\"\n weight=\"bold\"\n className=\"text-text-800 w-11 flex-shrink-0\"\n >\n {section.date}\n </Text>\n\n <div className=\"flex flex-col gap-2 flex-1\">\n {section.simulations.map((simulation) => {\n const typeStyles = SIMULATION_TYPE_STYLES[simulation.type];\n\n return (\n <CardBase\n key={simulation.id}\n layout=\"horizontal\"\n padding=\"medium\"\n minHeight=\"none\"\n cursor=\"pointer\"\n className={cn(\n `${typeStyles.background} rounded-xl hover:shadow-soft-shadow-2 \n transition-shadow duration-200 h-auto min-h-[61px]`\n )}\n onClick={() => onSimulationClick?.(simulation)}\n >\n <div className=\"flex justify-between items-center w-full gap-2\">\n <div className=\"flex flex-wrap flex-col justify-between sm:flex-row gap-2 flex-1 min-w-0\">\n <Text\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 truncate\"\n >\n {simulation.title}\n </Text>\n\n <div className=\"flex items-center gap-2\">\n <Badge\n variant=\"examsOutlined\"\n action={typeStyles.badge}\n size=\"medium\"\n >\n {typeStyles.text}\n </Badge>\n\n <Text size=\"sm\" className=\"text-text-800 truncate\">\n {simulation.info}\n </Text>\n </div>\n </div>\n\n <CaretRight\n size={24}\n className=\"text-text-800 flex-shrink-0\"\n data-testid=\"caret-icon\"\n />\n </div>\n </CardBase>\n );\n })}\n </div>\n </div>\n </div>\n ))}\n\n {/* Footer rounded */}\n {data.length > 0 && (\n <div className=\"w-full h-6 bg-background rounded-b-3xl\" />\n )}\n </div>\n </div>\n );\n});\n\n// ======================================================================\n// CardEssayHistory — histórico de redações agrupado por data\n// ======================================================================\n\nexport enum EssayStatus {\n DRAFT = 'DRAFT',\n SUBMITTED = 'SUBMITTED',\n CORRECTING = 'CORRECTING',\n CORRECTED = 'CORRECTED',\n ERROR = 'ERROR',\n}\n\nexport enum EssayReviewStatus {\n PENDING = 'PENDING',\n APPROVED = 'APPROVED',\n MODIFIED = 'MODIFIED',\n}\n\nexport interface EssayHistoryItem {\n id: string;\n /** Título exibido. Se null/undefined, o componente cai no `fallbackTitle` */\n title: string | null;\n /** Título fallback (ex: título do tema) quando `title` está vazio */\n fallbackTitle?: string;\n status: EssayStatus;\n /** Nota total (0..maxScore). null quando ainda não pontuou */\n totalScore: number | null;\n /** Status da revisão do professor */\n reviewStatus?: EssayReviewStatus | null;\n}\n\nexport interface EssayHistoryData {\n /** Label da data do grupo (ex: \"12 Fev\") */\n date: string;\n essays: EssayHistoryItem[];\n}\n\ninterface CardEssayHistoryProps extends HTMLAttributes<HTMLDivElement> {\n data: EssayHistoryData[];\n /** Nota máxima pra compor o label \"X de {maxScore}\". Default: 1000 */\n maxScore?: number;\n /** Callback ao clicar num item clicável (CORRECTED com score, ou ERROR) */\n onEssayClick?: (essay: EssayHistoryItem) => void;\n}\n\ntype EssayVisualState = {\n background: string;\n text: string;\n clickable: boolean;\n};\n\nconst resolveEssayVisualState = (\n essay: EssayHistoryItem,\n maxScore: number\n): EssayVisualState => {\n // If essay has a score, show it (regardless of status - covers professor review cases)\n if (essay.totalScore != null) {\n return {\n background: 'bg-subject-12',\n text: `${essay.totalScore} de ${maxScore}`,\n clickable: true,\n };\n }\n if (essay.status === EssayStatus.ERROR) {\n return {\n background: 'bg-tertiary-100',\n text: 'Erro na correção',\n clickable: true,\n };\n }\n if (\n essay.status === EssayStatus.CORRECTING ||\n essay.status === EssayStatus.SUBMITTED\n ) {\n return {\n background: 'bg-secondary-200',\n text: 'Gerando resultado...',\n clickable: false,\n };\n }\n if (essay.status === EssayStatus.DRAFT) {\n return {\n background: 'bg-secondary-200',\n text: 'Rascunho',\n clickable: false,\n };\n }\n return {\n background: 'bg-secondary-200',\n text: 'Sem nota ainda',\n clickable: false,\n };\n};\n\ntype ReviewBadgeConfig = {\n label: string;\n action: 'success' | 'info';\n} | null;\n\nconst resolveReviewBadge = (essay: EssayHistoryItem): ReviewBadgeConfig => {\n if (\n essay.reviewStatus === EssayReviewStatus.APPROVED ||\n essay.reviewStatus === EssayReviewStatus.MODIFIED\n ) {\n return { label: 'Revisado', action: 'success' };\n }\n\n if (\n essay.status === EssayStatus.CORRECTED &&\n essay.reviewStatus === EssayReviewStatus.PENDING\n ) {\n return { label: 'Corrigido por IA', action: 'info' };\n }\n\n return null;\n};\n\nconst CardEssayHistory = forwardRef<HTMLDivElement, CardEssayHistoryProps>(\n ({ data, maxScore = 1000, onEssayClick, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('w-full max-w-248 bg-background rounded-3xl', className)}\n {...props}\n >\n <div className=\"flex flex-col\">\n {data.map((section, sectionIndex) => (\n <div\n key={`${section.date}-${sectionIndex}`}\n className=\"flex flex-row items-start px-4 py-6 gap-2 w-full\"\n >\n <Text\n size=\"xs\"\n weight=\"bold\"\n className=\"text-text-800 w-11 shrink-0 pt-3\"\n >\n {section.date}\n </Text>\n\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n {section.essays.map((essay) => {\n const visual = resolveEssayVisualState(essay, maxScore);\n const isClickable = visual.clickable && !!onEssayClick;\n const label =\n essay.title ?? essay.fallbackTitle ?? 'Sem título';\n const reviewBadge = resolveReviewBadge(essay);\n\n return (\n <button\n key={essay.id}\n type=\"button\"\n disabled={!isClickable}\n onClick={() => isClickable && onEssayClick?.(essay)}\n aria-label={`${label} — ${visual.text}`}\n className={cn(\n visual.background,\n 'rounded-xl p-4 flex flex-row items-center justify-between gap-2 w-full transition-shadow duration-200',\n isClickable\n ? 'cursor-pointer hover:shadow-soft-shadow-2'\n : 'cursor-default'\n )}\n >\n <Text\n size=\"md\"\n weight=\"bold\"\n className=\"text-text-950 truncate text-left\"\n >\n {label}\n </Text>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n {reviewBadge && (\n <Badge\n variant=\"solid\"\n action={reviewBadge.action}\n size=\"small\"\n >\n {reviewBadge.label}\n </Badge>\n )}\n <Text\n size=\"sm\"\n className=\"text-text-800 whitespace-nowrap\"\n >\n {visual.text}\n </Text>\n {isClickable && (\n <CaretRight\n size={20}\n className=\"text-text-800 shrink-0\"\n />\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n }\n);\n\nexport {\n CardBase,\n CardActivitiesResults,\n CardQuestions,\n CardProgress,\n CardTopic,\n CardPerformance,\n CardResults,\n CardStatus,\n CardSettings,\n CardSupport,\n CardForum,\n CardAudio,\n CardSimulado,\n CardTest,\n CardSimulationHistory,\n CardEssayHistory,\n};\n","import { cloneElement, ComponentType, JSX, ReactElement } from 'react';\nimport * as PhosphorIcons from '@phosphor-icons/react';\nimport { ChatPT } from '../../assets/icons/subjects/ChatPT';\nimport { ChatEN } from '../../assets/icons/subjects/ChatEN';\nimport { ChatES } from '../../assets/icons/subjects/ChatES';\nimport { BookOpenText } from '../../assets/icons/subjects/BookOpenText';\nimport { Microscope } from '../../assets/icons/subjects/Microscope';\nimport { HeadCircuit } from '../../assets/icons/subjects/HeadCircuit';\n\ntype PhosphorIconName = keyof typeof PhosphorIcons;\ntype PhosphorIconComponent = ComponentType<{\n size?: number;\n color?: string;\n weight?: 'thin' | 'light' | 'regular' | 'bold' | 'fill' | 'duotone';\n}>;\ntype CustomIconComponent = ComponentType<{\n size: number;\n color: string;\n}>;\n\n// Custom icons act as a fallback when Phosphor doesn't expose the name —\n// Chat_* have no Phosphor equivalent, and the others stay as a safety net\n// in case future Phosphor versions rename or remove them.\nconst CUSTOM_ICONS: Record<string, CustomIconComponent> = {\n Chat_PT: ChatPT,\n Chat_EN: ChatEN,\n Chat_ES: ChatES,\n BookOpenText,\n Microscope,\n HeadCircuit,\n};\n\nexport interface IconRenderProps {\n /**\n * The name of the icon to render\n */\n iconName: string | ReactElement;\n /**\n * The color of the icon\n * @default '#000000'\n */\n color?: string;\n /**\n * The size of the icon in pixels\n * @default 24\n */\n size?: number;\n /**\n * The weight/style of the icon (for Phosphor icons)\n * @default 'regular'\n */\n weight?: 'thin' | 'light' | 'regular' | 'bold' | 'fill' | 'duotone';\n}\n\n/**\n * Dynamic icon component that renders icons based on name\n * Supports Phosphor icons and custom Chat icons (ChatPT, ChatEN, ChatES)\n *\n * @param iconName - The name of the icon to render\n * @param color - The color of the icon\n * @param size - The size of the icon in pixels\n * @param weight - The weight/style of the icon (for Phosphor icons)\n * @returns JSX element with the corresponding icon\n */\nexport const IconRender = ({\n iconName,\n color = '#000000',\n size = 24,\n weight = 'regular',\n}: IconRenderProps): JSX.Element => {\n // Guard against undefined/null iconName\n if (!iconName) {\n const FallbackIcon = PhosphorIcons.QuestionIcon as PhosphorIconComponent;\n return <FallbackIcon size={size} color={color} weight={weight} />;\n }\n\n if (typeof iconName === 'string') {\n // @phosphor-icons/react v2 exports canonical names with an `Icon` suffix\n // (the bare name is deprecated). Backend keeps sending the bare name.\n const PhosphorIcon = PhosphorIcons[\n `${iconName}Icon` as PhosphorIconName\n ] as PhosphorIconComponent | undefined;\n if (PhosphorIcon) {\n return <PhosphorIcon size={size} color={color} weight={weight} />;\n }\n\n const CustomIcon = CUSTOM_ICONS[iconName];\n if (CustomIcon) {\n return <CustomIcon size={size} color={color} />;\n }\n\n const Fallback = PhosphorIcons.QuestionIcon as PhosphorIconComponent;\n return <Fallback size={size} color={color} weight={weight} />;\n } else {\n // Clone the ReactElement with icon props, casting to avoid TypeScript errors\n return cloneElement(iconName, {\n size,\n color: 'currentColor',\n } as Partial<{\n size: number;\n color: string;\n }>);\n }\n};\n\nexport default IconRender;\n","export const ChatPT = ({ size, color }: { size: number; color: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M27 6H5.00004C4.4696 6 3.9609 6.21071 3.58582 6.58579C3.21075 6.96086 3.00004 7.46957 3.00004 8V28C2.99773 28.3814 3.10562 28.7553 3.31074 29.0768C3.51585 29.3984 3.80947 29.6538 4.15629 29.8125C4.42057 29.9356 4.7085 29.9995 5.00004 30C5.46954 29.9989 5.92347 29.8315 6.28129 29.5275L6.29254 29.5187L10.375 26H27C27.5305 26 28.0392 25.7893 28.4142 25.4142C28.7893 25.0391 29 24.5304 29 24V8C29 7.46957 28.7893 6.96086 28.4142 6.58579C28.0392 6.21071 27.5305 6 27 6ZM27 24H10C9.75992 24.0001 9.52787 24.0866 9.34629 24.2437L5.00004 28V8H27V24Z\"\n fill={color}\n />\n <path\n d=\"M21.1758 12V20.5312H19.7168V12H21.1758ZM23.8535 12V13.1719H17.0625V12H23.8535Z\"\n fill={color}\n />\n <path\n d=\"M13.2402 17.3496H11.0195V16.1836H13.2402C13.627 16.1836 13.9395 16.1211 14.1777 15.9961C14.416 15.8711 14.5898 15.6992 14.6992 15.4805C14.8125 15.2578 14.8691 15.0039 14.8691 14.7188C14.8691 14.4492 14.8125 14.1973 14.6992 13.9629C14.5898 13.7246 14.416 13.5332 14.1777 13.3887C13.9395 13.2441 13.627 13.1719 13.2402 13.1719H11.4707V20.5312H10V12H13.2402C13.9004 12 14.4609 12.1172 14.9219 12.3516C15.3867 12.582 15.7402 12.9023 15.9824 13.3125C16.2246 13.7188 16.3457 14.1836 16.3457 14.707C16.3457 15.2578 16.2246 15.7305 15.9824 16.125C15.7402 16.5195 15.3867 16.8223 14.9219 17.0332C14.4609 17.2441 13.9004 17.3496 13.2402 17.3496Z\"\n fill={color}\n />\n </svg>\n);\n","export const ChatEN = ({ size, color }: { size: number; color: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M27 6H5.00004C4.4696 6 3.9609 6.21071 3.58582 6.58579C3.21075 6.96086 3.00004 7.46957 3.00004 8V28C2.99773 28.3814 3.10562 28.7553 3.31074 29.0768C3.51585 29.3984 3.80947 29.6538 4.15629 29.8125C4.42057 29.9356 4.7085 29.9995 5.00004 30C5.46954 29.9989 5.92347 29.8315 6.28129 29.5275L6.29254 29.5187L10.375 26H27C27.5305 26 28.0392 25.7893 28.4142 25.4142C28.7893 25.0391 29 24.5304 29 24V8C29 7.46957 28.7893 6.96086 28.4142 6.58579C28.0392 6.21071 27.5305 6 27 6ZM27 24H10C9.75992 24.0001 9.52787 24.0866 9.34629 24.2437L5.00004 28V8H27V24Z\"\n fill={color}\n />\n <path\n d=\"M22.5488 12V20.5312H21.0781L17.252 14.4199V20.5312H15.7812V12H17.252L21.0898 18.123V12H22.5488Z\"\n fill={color}\n />\n <path\n d=\"M14.584 19.3652V20.5312H10.0547V19.3652H14.584ZM10.4707 12V20.5312H9V12H10.4707ZM13.9922 15.5625V16.7109H10.0547V15.5625H13.9922ZM14.5547 12V13.1719H10.0547V12H14.5547Z\"\n fill={color}\n />\n </svg>\n);\n","export const ChatES = ({ size, color }: { size: number; color: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M27 6H5.00004C4.4696 6 3.9609 6.21071 3.58582 6.58579C3.21075 6.96086 3.00004 7.46957 3.00004 8V28C2.99773 28.3814 3.10562 28.7553 3.31074 29.0768C3.51585 29.3984 3.80947 29.6538 4.15629 29.8125C4.42057 29.9356 4.7085 29.9995 5.00004 30C5.46954 29.9989 5.92347 29.8315 6.28129 29.5275L6.29254 29.5187L10.375 26H27C27.5305 26 28.0392 25.7893 28.4142 25.4142C28.7893 25.0391 29 24.5304 29 24V8C29 7.46957 28.7893 6.96086 28.4142 6.58579C28.0392 6.21071 27.5305 6 27 6ZM27 24H10C9.75992 24.0001 9.52787 24.0866 9.34629 24.2437L5.00004 28V8H27V24Z\"\n fill={color}\n />\n <path\n d=\"M21.1426 17.8027C21.1426 17.627 21.1152 17.4707 21.0605 17.334C21.0098 17.1973 20.918 17.0723 20.7852 16.959C20.6523 16.8457 20.4648 16.7363 20.2227 16.6309C19.9844 16.5215 19.6797 16.4102 19.3086 16.2969C18.9023 16.1719 18.5273 16.0332 18.1836 15.8809C17.8438 15.7246 17.5469 15.5449 17.293 15.3418C17.0391 15.1348 16.8418 14.8984 16.7012 14.6328C16.5605 14.3633 16.4902 14.0527 16.4902 13.7012C16.4902 13.3535 16.5625 13.0371 16.707 12.752C16.8555 12.4668 17.0645 12.2207 17.334 12.0137C17.6074 11.8027 17.9297 11.6406 18.3008 11.5273C18.6719 11.4102 19.082 11.3516 19.5312 11.3516C20.1641 11.3516 20.709 11.4688 21.166 11.7031C21.627 11.9375 21.9805 12.252 22.2266 12.6465C22.4766 13.041 22.6016 13.4766 22.6016 13.9531H21.1426C21.1426 13.6719 21.082 13.4238 20.9609 13.209C20.8438 12.9902 20.6641 12.8184 20.4219 12.6934C20.1836 12.5684 19.8809 12.5059 19.5137 12.5059C19.166 12.5059 18.877 12.5586 18.6465 12.6641C18.416 12.7695 18.2441 12.9121 18.1309 13.0918C18.0176 13.2715 17.9609 13.4746 17.9609 13.7012C17.9609 13.8613 17.998 14.0078 18.0723 14.1406C18.1465 14.2695 18.2598 14.3906 18.4121 14.5039C18.5645 14.6133 18.7559 14.7168 18.9863 14.8145C19.2168 14.9121 19.4883 15.0059 19.8008 15.0957C20.2734 15.2363 20.6855 15.3926 21.0371 15.5645C21.3887 15.7324 21.6816 15.9238 21.916 16.1387C22.1504 16.3535 22.3262 16.5977 22.4434 16.8711C22.5605 17.1406 22.6191 17.4473 22.6191 17.791C22.6191 18.1504 22.5469 18.4746 22.4023 18.7637C22.2578 19.0488 22.0508 19.293 21.7812 19.4961C21.5156 19.6953 21.1953 19.8496 20.8203 19.959C20.4492 20.0645 20.0352 20.1172 19.5781 20.1172C19.168 20.1172 18.7637 20.0625 18.3652 19.9531C17.9707 19.8438 17.6113 19.6777 17.2871 19.4551C16.9629 19.2285 16.7051 18.9473 16.5137 18.6113C16.3223 18.2715 16.2266 17.875 16.2266 17.4219H17.6973C17.6973 17.6992 17.7441 17.9355 17.8379 18.1309C17.9355 18.3262 18.0703 18.4863 18.2422 18.6113C18.4141 18.7324 18.6133 18.8223 18.8398 18.8809C19.0703 18.9395 19.3164 18.9688 19.5781 18.9688C19.9219 18.9688 20.209 18.9199 20.4395 18.8223C20.6738 18.7246 20.8496 18.5879 20.9668 18.4121C21.084 18.2363 21.1426 18.0332 21.1426 17.8027Z\"\n fill={color}\n />\n <path\n d=\"M15.4512 18.834V20H10.9219V18.834H15.4512ZM11.3379 11.4688V20H9.86719V11.4688H11.3379ZM14.8594 15.0312V16.1797H10.9219V15.0312H14.8594ZM15.4219 11.4688V12.6406H10.9219V11.4688H15.4219Z\"\n fill={color}\n />\n </svg>\n);\n","export const BookOpenText = ({\n size,\n color,\n}: {\n size: number;\n color: string;\n}) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M29 6H20C19.2238 6 18.4582 6.18073 17.7639 6.52786C17.0697 6.875 16.4657 7.37902 16 8C15.5343 7.37902 14.9303 6.875 14.2361 6.52786C13.5418 6.18073 12.7762 6 12 6H3C2.73478 6 2.48043 6.10536 2.29289 6.29289C2.10536 6.48043 2 6.73478 2 7V25C2 25.2652 2.10536 25.5196 2.29289 25.7071C2.48043 25.8946 2.73478 26 3 26H12C12.7956 26 13.5587 26.3161 14.1213 26.8787C14.6839 27.4413 15 28.2044 15 29C15 29.2652 15.1054 29.5196 15.2929 29.7071C15.4804 29.8946 15.7348 30 16 30C16.2652 30 16.5196 29.8946 16.7071 29.7071C16.8946 29.5196 17 29.2652 17 29C17 28.2044 17.3161 27.4413 17.8787 26.8787C18.4413 26.3161 19.2044 26 20 26H29C29.2652 26 29.5196 25.8946 29.7071 25.7071C29.8946 25.5196 30 25.2652 30 25V7C30 6.73478 29.8946 6.48043 29.7071 6.29289C29.5196 6.10536 29.2652 6 29 6ZM12 24H4V8H12C12.7956 8 13.5587 8.31607 14.1213 8.87868C14.6839 9.44129 15 10.2044 15 11V25C14.1353 24.3493 13.0821 23.9983 12 24ZM28 24H20C18.9179 23.9983 17.8647 24.3493 17 25V11C17 10.2044 17.3161 9.44129 17.8787 8.87868C18.4413 8.31607 19.2044 8 20 8H28V24ZM20 11H25C25.2652 11 25.5196 11.1054 25.7071 11.2929C25.8946 11.4804 26 11.7348 26 12C26 12.2652 25.8946 12.5196 25.7071 12.7071C25.5196 12.8946 25.2652 13 25 13H20C19.7348 13 19.4804 12.8946 19.2929 12.7071C19.1054 12.5196 19 12.2652 19 12C19 11.7348 19.1054 11.4804 19.2929 11.2929C19.4804 11.1054 19.7348 11 20 11ZM26 16C26 16.2652 25.8946 16.5196 25.7071 16.7071C25.5196 16.8946 25.2652 17 25 17H20C19.7348 17 19.4804 16.8946 19.2929 16.7071C19.1054 16.5196 19 16.2652 19 16C19 15.7348 19.1054 15.4804 19.2929 15.2929C19.4804 15.1054 19.7348 15 20 15H25C25.2652 15 25.5196 15.1054 25.7071 15.2929C25.8946 15.4804 26 15.7348 26 16ZM26 20C26 20.2652 25.8946 20.5196 25.7071 20.7071C25.5196 20.8946 25.2652 21 25 21H20C19.7348 21 19.4804 20.8946 19.2929 20.7071C19.1054 20.5196 19 20.2652 19 20C19 19.7348 19.1054 19.4804 19.2929 19.2929C19.4804 19.1054 19.7348 19 20 19H25C25.2652 19 25.5196 19.1054 25.7071 19.2929C25.8946 19.4804 26 19.7348 26 20Z\"\n fill={color}\n />\n </svg>\n);\n","export const Microscope = ({\n size,\n color,\n}: {\n size: number;\n color: string;\n}) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M28 26H25.4925C26.7637 24.4552 27.5898 22.5932 27.882 20.6142C28.1743 18.6351 27.9216 16.6138 27.1511 14.7676C26.3806 12.9213 25.1215 11.32 23.5092 10.1358C21.8968 8.95153 19.9922 8.22913 18 8.04625V4C18 3.46957 17.7893 2.96086 17.4142 2.58579C17.0391 2.21071 16.5304 2 16 2H10C9.46957 2 8.96086 2.21071 8.58579 2.58579C8.21071 2.96086 8 3.46957 8 4V17C8 17.5304 8.21071 18.0391 8.58579 18.4142C8.96086 18.7893 9.46957 19 10 19H16C16.5304 19 17.0391 18.7893 17.4142 18.4142C17.7893 18.0391 18 17.5304 18 17V10.0575C19.7643 10.2552 21.4306 10.9703 22.7895 12.1128C24.1483 13.2553 25.1389 14.7742 25.6366 16.4783C26.1343 18.1824 26.1169 19.9957 25.5866 21.69C25.0563 23.3842 24.0368 24.8838 22.6562 26H4C3.73478 26 3.48043 26.1054 3.29289 26.2929C3.10536 26.4804 3 26.7348 3 27C3 27.2652 3.10536 27.5196 3.29289 27.7071C3.48043 27.8946 3.73478 28 4 28H28C28.2652 28 28.5196 27.8946 28.7071 27.7071C28.8946 27.5196 29 27.2652 29 27C29 26.7348 28.8946 26.4804 28.7071 26.2929C28.5196 26.1054 28.2652 26 28 26ZM16 17H10V4H16V17ZM9 23C8.73478 23 8.48043 22.8946 8.29289 22.7071C8.10536 22.5196 8 22.2652 8 22C8 21.7348 8.10536 21.4804 8.29289 21.2929C8.48043 21.1054 8.73478 21 9 21H17C17.2652 21 17.5196 21.1054 17.7071 21.2929C17.8946 21.4804 18 21.7348 18 22C18 22.2652 17.8946 22.5196 17.7071 22.7071C17.5196 22.8946 17.2652 23 17 23H9Z\"\n fill={color}\n />\n </svg>\n);\n","export const HeadCircuit = ({\n size,\n color,\n}: {\n size: number;\n color: string;\n}) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M24.0625 21.4338C25.327 20.3715 26.3372 19.0392 27.0187 17.5348C27.7001 16.0304 28.0354 14.3924 28 12.7413C27.875 7.02751 23.2987 2.31626 17.595 2.01626C16.1233 1.93616 14.6506 2.15261 13.2642 2.65277C11.8778 3.15293 10.6061 3.92659 9.52453 4.92781C8.44297 5.92903 7.57365 7.13739 6.96819 8.48112C6.36272 9.82485 6.03347 11.2766 5.99997 12.75L3.19372 18.1475C3.18247 18.17 3.17122 18.1925 3.16122 18.215C2.96003 18.6839 2.94569 19.212 3.12114 19.6912C3.29659 20.1704 3.64855 20.5644 4.10497 20.7925L4.13622 20.8063L6.99997 22.1175V26C6.99997 26.5304 7.21068 27.0392 7.58576 27.4142C7.96083 27.7893 8.46954 28 8.99997 28H15C15.2652 28 15.5195 27.8947 15.7071 27.7071C15.8946 27.5196 16 27.2652 16 27C16 26.7348 15.8946 26.4804 15.7071 26.2929C15.5195 26.1054 15.2652 26 15 26H8.99997V21.4763C9.00011 21.2846 8.94517 21.0969 8.84168 20.9356C8.73818 20.7742 8.5905 20.646 8.41622 20.5663L4.99997 19L7.88372 13.4575C7.95889 13.3166 7.99878 13.1597 7.99997 13C7.99968 10.9604 8.69216 8.98124 9.96395 7.38674C11.2357 5.79224 13.0114 4.677 15 4.22376V6.17251C14.3328 6.4084 13.7704 6.87258 13.4123 7.48299C13.0543 8.0934 12.9235 8.81075 13.0432 9.50824C13.1628 10.2057 13.5252 10.8385 14.0663 11.2946C14.6074 11.7508 15.2923 12.0009 16 12.0009C16.7077 12.0009 17.3926 11.7508 17.9336 11.2946C18.4747 10.8385 18.8371 10.2057 18.9568 9.50824C19.0764 8.81075 18.9457 8.0934 18.5876 7.48299C18.2295 6.87258 17.6672 6.4084 17 6.17251V4.00001C17.1625 4.00001 17.325 4.00001 17.4875 4.01251C19.2608 4.11409 20.9649 4.73627 22.3864 5.80124C23.808 6.86621 24.8841 8.32669 25.48 10H23C22.8533 9.99995 22.7084 10.0322 22.5755 10.0944C22.4426 10.1566 22.3251 10.2473 22.2312 10.36L19.0425 14.1875C18.3774 13.9397 17.6462 13.9351 16.9781 14.1744C16.3099 14.4138 15.748 14.8817 15.3916 15.4954C15.0352 16.1092 14.9073 16.8292 15.0306 17.5281C15.1538 18.227 15.5203 18.8598 16.0652 19.3146C16.61 19.7694 17.2981 20.0168 18.0078 20.0132C18.7175 20.0095 19.4031 19.755 19.9432 19.2947C20.4834 18.8343 20.8433 18.1977 20.9594 17.4976C21.0754 16.7974 20.9402 16.0788 20.5775 15.4688L23.4687 12H25.9425C25.9725 12.26 25.9908 12.5225 25.9975 12.7875C26.0286 14.2198 25.7187 15.639 25.0931 16.9278C24.4676 18.2167 23.5445 19.3383 22.4 20.2C22.2589 20.3057 22.1484 20.4469 22.0794 20.6091C22.0105 20.7713 21.9857 20.9489 22.0075 21.1238L23.0075 29.1238C23.0379 29.3653 23.1554 29.5874 23.3379 29.7485C23.5203 29.9095 23.7553 29.9985 23.9987 29.9988C24.0405 29.9988 24.0822 29.9962 24.1237 29.9913C24.2541 29.975 24.3799 29.9333 24.4942 29.8684C24.6084 29.8035 24.7087 29.7168 24.7893 29.6131C24.87 29.5094 24.9295 29.3909 24.9643 29.2643C24.9992 29.1376 25.0087 29.0054 24.9925 28.875L24.0625 21.4338ZM16 10C15.8022 10 15.6088 9.94136 15.4444 9.83148C15.28 9.7216 15.1518 9.56542 15.0761 9.38269C15.0004 9.19997 14.9806 8.9989 15.0192 8.80492C15.0578 8.61094 15.153 8.43275 15.2929 8.2929C15.4327 8.15305 15.6109 8.05781 15.8049 8.01922C15.9989 7.98064 16.1999 8.00044 16.3827 8.07613C16.5654 8.15182 16.7216 8.27999 16.8314 8.44444C16.9413 8.60889 17 8.80223 17 9.00001C17 9.26523 16.8946 9.51958 16.7071 9.70712C16.5195 9.89465 16.2652 10 16 10ZM18 18C17.8022 18 17.6088 17.9414 17.4444 17.8315C17.28 17.7216 17.1518 17.5654 17.0761 17.3827C17.0004 17.2 16.9806 16.9989 17.0192 16.8049C17.0578 16.6109 17.153 16.4328 17.2929 16.2929C17.4327 16.153 17.6109 16.0578 17.8049 16.0192C17.9989 15.9806 18.1999 16.0004 18.3827 16.0761C18.5654 16.1518 18.7216 16.28 18.8314 16.4444C18.9413 16.6089 19 16.8022 19 17C19 17.2652 18.8946 17.5196 18.7071 17.7071C18.5195 17.8947 18.2652 18 18 18Z\"\n fill={color}\n />\n </svg>\n);\n","import {\n Children,\n cloneElement,\n forwardRef,\n HTMLAttributes,\n isValidElement,\n ReactElement,\n ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { create, StoreApi } from 'zustand';\nimport { CardAccordationProps } from './Accordation';\n\ninterface AccordionGroupStore {\n type: 'single' | 'multiple';\n value: string | string[];\n collapsible: boolean;\n setValue: (value: string | string[]) => void;\n isItemExpanded: (itemValue: string) => boolean;\n}\n\ntype AccordionGroupStoreApi = StoreApi<AccordionGroupStore>;\n\nfunction createAccordionGroupStore(\n type: 'single' | 'multiple',\n initialValue: string | string[],\n collapsible: boolean\n): AccordionGroupStoreApi {\n return create<AccordionGroupStore>((set, get) => ({\n type,\n value: initialValue,\n collapsible,\n setValue: (value) => set({ value }),\n isItemExpanded: (itemValue: string): boolean => {\n const state = get();\n if (state.type === 'single') {\n return state.value === itemValue;\n } else {\n return Array.isArray(state.value) && state.value.includes(itemValue);\n }\n },\n }));\n}\n\ninterface AccordionGroupProps extends HTMLAttributes<HTMLDivElement> {\n type?: 'single' | 'multiple';\n defaultValue?: string | string[];\n value?: string | string[];\n onValueChange?: (value: string | string[]) => void;\n collapsible?: boolean;\n children: ReactNode;\n}\n\n// Helper function to inject store only to CardAccordation components\nconst injectStore = (\n children: ReactNode,\n store: AccordionGroupStoreApi,\n indexRef: { current: number },\n onItemToggle: (itemValue: string, isExpanded: boolean) => void\n): ReactNode => {\n return Children.map(children, (child) => {\n if (!isValidElement(child)) {\n return child;\n }\n\n const typedChild = child as ReactElement<\n CardAccordationProps & {\n children?: ReactNode;\n }\n >;\n\n // Check component displayName\n const displayName = (typedChild.type as unknown as { displayName?: string })\n ?.displayName;\n\n // Stop recursion at nested AccordionGroup - it manages its own children\n if (displayName === 'AccordionGroup') {\n return child;\n }\n\n let newProps: Partial<{\n children: ReactNode;\n value: string;\n expanded: boolean;\n onToggleExpanded: (isExpanded: boolean) => void;\n }> = {};\n\n if (displayName === 'CardAccordation') {\n // Generate value if not provided\n const itemValue =\n typedChild.props.value || `accordion-item-${indexRef.current++}`;\n\n // Get expanded state from store\n const storeState = store.getState();\n const expanded = storeState.isItemExpanded(itemValue);\n\n newProps.value = itemValue;\n newProps.expanded = expanded;\n newProps.onToggleExpanded = (isExpanded: boolean) => {\n onItemToggle(itemValue, isExpanded);\n typedChild.props.onToggleExpanded?.(isExpanded);\n };\n }\n\n // Recursively process children\n if (typedChild.props.children) {\n const processedChildren = injectStore(\n typedChild.props.children,\n store,\n indexRef,\n onItemToggle\n );\n\n // If it's a CardAccordation, add children to newProps\n if (displayName === 'CardAccordation') {\n newProps.children = processedChildren;\n } else if (processedChildren !== typedChild.props.children) {\n // For other elements, only clone if children changed\n return cloneElement(typedChild, { children: processedChildren });\n }\n }\n\n // Only clone if we have props to inject (only for CardAccordation)\n if (Object.keys(newProps).length > 0) {\n return cloneElement(typedChild, newProps);\n }\n\n return child;\n });\n};\n\nconst AccordionGroup = forwardRef<HTMLDivElement, AccordionGroupProps>(\n (\n {\n type = 'single',\n defaultValue,\n value: controlledValue,\n onValueChange,\n collapsible = true,\n children,\n className,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = useState<string | string[]>(\n defaultValue || (type === 'single' ? '' : [])\n );\n\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n // Create store only once using useRef\n const storeRef = useRef<AccordionGroupStoreApi | null>(null);\n if (storeRef.current) {\n // Update store configuration when props change\n storeRef.current.setState((prev) => {\n const nextState: Partial<AccordionGroupStore> = {};\n if (prev.type !== type) {\n nextState.type = type;\n }\n if (prev.collapsible !== collapsible) {\n nextState.collapsible = collapsible;\n }\n return nextState;\n });\n } else {\n // Create store on first render\n storeRef.current = createAccordionGroupStore(\n type,\n currentValue,\n collapsible\n );\n }\n const store = storeRef.current;\n\n // Sync store value when currentValue changes\n useEffect(() => {\n store.setState({ value: currentValue });\n }, [currentValue, store]);\n\n // Normalize internal value when type changes (uncontrolled mode)\n useEffect(() => {\n if (!isControlled) {\n setInternalValue((prev) => {\n if (type === 'single') {\n if (Array.isArray(prev)) {\n return prev[0] ?? '';\n }\n return typeof prev === 'string' ? prev : '';\n }\n if (Array.isArray(prev)) {\n return prev;\n }\n return prev ? [prev] : [];\n });\n }\n }, [isControlled, type]);\n\n const handleItemToggle = (itemValue: string, isExpanded: boolean) => {\n const storeState = store.getState();\n let newValue: string | string[];\n\n if (type === 'single') {\n // Single mode: only one item can be open at a time\n if (isExpanded) {\n newValue = itemValue;\n } else {\n // If collapsible, allow closing the current item\n newValue = collapsible ? '' : (storeState.value as string);\n }\n } else {\n // Multiple mode: multiple items can be open\n const currentArray = Array.isArray(storeState.value)\n ? storeState.value\n : [];\n\n if (isExpanded) {\n newValue = [...currentArray, itemValue];\n } else {\n newValue = currentArray.filter((v) => v !== itemValue);\n }\n }\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n store.setState({ value: newValue });\n onValueChange?.(newValue);\n };\n\n // Use ref to track index across recursive calls\n const indexRef = { current: 0 };\n const enhancedChildren = injectStore(\n children,\n store,\n indexRef,\n handleItemToggle\n );\n\n return (\n <div ref={ref} className={className} {...props}>\n {enhancedChildren}\n </div>\n );\n }\n);\n\nAccordionGroup.displayName = 'AccordionGroup';\n\nexport { AccordionGroup };\n","import { Star, Medal, WarningCircle, Info } from 'phosphor-react';\nimport type { Icon } from 'phosphor-react';\nimport Text from '../../Text/Text';\nimport { cn } from '../../../utils/utils';\n\n/**\n * Available variants for the StatCard component\n */\nexport type StatVariant = 'score' | 'correct' | 'incorrect' | 'blank';\n\n/**\n * Configuration for each stat card variant\n */\nexport const variantConfig: Record<\n StatVariant,\n {\n bg: string;\n text: string;\n iconBg: string;\n iconColor: string;\n IconComponent: Icon;\n }\n> = {\n score: {\n bg: 'bg-warning-background',\n text: 'text-warning-600',\n iconBg: 'bg-warning-300',\n iconColor: 'text-white',\n IconComponent: Star,\n },\n correct: {\n bg: 'bg-success-200',\n text: 'text-success-700',\n iconBg: 'bg-indicator-positive',\n iconColor: 'text-text-950',\n IconComponent: Medal,\n },\n incorrect: {\n bg: 'bg-error-100',\n text: 'text-error-700',\n iconBg: 'bg-indicator-negative',\n iconColor: 'text-white',\n IconComponent: WarningCircle,\n },\n blank: {\n bg: 'bg-info',\n text: 'text-info-800',\n iconBg: 'bg-indicator-info',\n iconColor: 'text-white',\n IconComponent: Info,\n },\n};\n\n/**\n * Props for the StatCard component\n */\nexport interface StatCardProps {\n /** Label text displayed above the value */\n label: string;\n /** Value to display (can be string or number) */\n value: string | number;\n /** Visual variant determining colors and icon */\n variant: StatVariant;\n /** Optional additional className */\n className?: string;\n}\n\n/**\n * StatCard component for displaying statistics with an icon\n *\n * Used in activity correction and performance modals to show\n * score, correct answers count, and incorrect answers count.\n *\n * @example\n * ```tsx\n * <StatCard label=\"NOTA\" value=\"8.5\" variant=\"score\" />\n * <StatCard label=\"CORRETAS\" value={10} variant=\"correct\" />\n * <StatCard label=\"INCORRETAS\" value={2} variant=\"incorrect\" />\n * ```\n */\nexport const StatCard = ({\n label,\n value,\n variant,\n className,\n}: StatCardProps) => {\n const config = variantConfig[variant];\n const IconComponent = config.IconComponent;\n\n return (\n <div\n className={cn(\n 'border border-border-50 rounded-xl py-4 px-3 flex flex-col items-center justify-center gap-1',\n config.bg,\n className\n )}\n >\n <div\n className={cn(\n 'w-[30px] h-[30px] rounded-2xl flex items-center justify-center',\n config.iconBg\n )}\n >\n <IconComponent\n size={16}\n className={config.iconColor}\n weight=\"regular\"\n />\n </div>\n <Text\n className={cn('text-2xs font-bold uppercase text-center', config.text)}\n >\n {label}\n </Text>\n <Text className={cn('text-xl font-bold', config.text)}>{value}</Text>\n </div>\n );\n};\n\nexport default StatCard;\n","/**\n * Question status enum for student activity correction\n * Maps from ANSWER_STATUS to a simpler status for UI display\n */\nexport const QUESTION_STATUS = {\n CORRETA: 'CORRETA',\n INCORRETA: 'INCORRETA',\n EM_BRANCO: 'EM_BRANCO',\n /** Reserved for future use - pending teacher evaluation for essay questions */\n PENDENTE: 'PENDENTE',\n} as const;\n\nexport type QuestionStatus =\n (typeof QUESTION_STATUS)[keyof typeof QUESTION_STATUS];\n","import { StatusBadgeConfig } from '@/types/activityDetails';\nimport {\n ANSWER_STATUS,\n QUESTION_TYPE,\n} from '../../components/Quiz/useQuizStore';\nimport { QUESTION_STATUS, type QuestionStatus } from './constants';\nimport type { CorrectionQuestionData } from './types';\n\n/**\n * Returns whether the answer is correct, incorrect, or null based on the answer status.\n * @param answerStatus - Answer status from ANSWER_STATUS enum\n * @returns Returns true for correct, false for incorrect, or null if undefined.\n */\nexport const getIsCorrect = (answerStatus: ANSWER_STATUS): boolean | null => {\n if (answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) return true;\n if (answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA) return false;\n return null;\n};\n\n/**\n * Map ANSWER_STATUS from Quiz to QUESTION_STATUS for correction modal\n * @param answerStatus - Answer status from QuestionResult\n * @returns QuestionStatus for UI display\n */\nexport const mapAnswerStatusToQuestionStatus = (\n answerStatus: ANSWER_STATUS\n): QuestionStatus => {\n switch (answerStatus) {\n case ANSWER_STATUS.RESPOSTA_CORRETA:\n return QUESTION_STATUS.CORRETA;\n case ANSWER_STATUS.RESPOSTA_INCORRETA:\n return QUESTION_STATUS.INCORRETA;\n case ANSWER_STATUS.NAO_RESPONDIDO:\n return QUESTION_STATUS.EM_BRANCO;\n case ANSWER_STATUS.PENDENTE_AVALIACAO:\n return QUESTION_STATUS.PENDENTE;\n default:\n return QUESTION_STATUS.EM_BRANCO;\n }\n};\n\n/**\n * Get question status badge configuration\n * @param status - Question status\n * @returns Badge configuration with label and colors\n */\nexport const getQuestionStatusBadgeConfig = (status: QuestionStatus) => {\n const configs: Partial<Record<QuestionStatus, StatusBadgeConfig>> = {\n [QUESTION_STATUS.CORRETA]: {\n label: 'Correta',\n bgColor: 'bg-success-background',\n textColor: 'text-success-800',\n },\n [QUESTION_STATUS.INCORRETA]: {\n label: 'Incorreta',\n bgColor: 'bg-error-background',\n textColor: 'text-error-800',\n },\n [QUESTION_STATUS.EM_BRANCO]: {\n label: 'Em branco',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n },\n [QUESTION_STATUS.PENDENTE]: {\n label: 'Pendente',\n bgColor: 'bg-warning-background',\n textColor: 'text-warning-800',\n },\n };\n\n const defaultConfig = {\n label: 'Sem categoria',\n bgColor: 'bg-gray-100',\n textColor: 'text-gray-600',\n };\n\n return configs[status] ?? defaultConfig;\n};\n\n/**\n * Check if question can be auto-validated based on options\n * All question types can be auto-validated except DISSERTATIVA (essay questions)\n * @param questionData - Correction question data\n * @returns true if can auto-validate, false otherwise\n */\nexport const canAutoValidate = (\n questionData: CorrectionQuestionData\n): boolean => {\n const { result } = questionData;\n\n // Only dissertative questions require manual evaluation\n if (result.questionType === QUESTION_TYPE.DISSERTATIVA) {\n return false;\n }\n\n return true;\n};\n\ntype Option = {\n id: string;\n option: string;\n isCorrect: boolean;\n};\n\n/**\n * Type predicate to check if an option has isCorrect defined\n */\nconst hasIsCorrect = (op: {\n id: string;\n option: string;\n isCorrect?: boolean | null;\n}): op is Option => {\n return op.isCorrect != null;\n};\n\n/**\n * Validate alternativa (single choice) question\n * Must select exactly one correct option\n */\nconst validateAlternativa = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n if (selected.size !== 1) return ANSWER_STATUS.RESPOSTA_INCORRETA;\n\n const [selectedId] = selected;\n return options.find((o) => o.id === selectedId)?.isCorrect\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate multipla escolha (multiple choice) question\n * Each option must match its correct state: selected if correct, not selected if incorrect\n */\nconst validateMultiplaEscolha = (\n selected: Set<string>,\n options: Option[]\n): ANSWER_STATUS => {\n const allMatch = options.every((op) => selected.has(op.id) === op.isCorrect);\n\n return allMatch\n ? ANSWER_STATUS.RESPOSTA_CORRETA\n : ANSWER_STATUS.RESPOSTA_INCORRETA;\n};\n\n/**\n * Validate verdadeiro/falso (true/false) question\n * Each statement is evaluated individually: if statement is true, must be selected;\n * if statement is false, must not be selected\n */\nconst validateVerdadeiroFalso = validateMultiplaEscolha;\n\nconst validators: Partial<\n Record<QUESTION_TYPE, (s: Set<string>, o: Option[]) => ANSWER_STATUS>\n> = {\n [QUESTION_TYPE.ALTERNATIVA]: validateAlternativa,\n [QUESTION_TYPE.MULTIPLA_ESCOLHA]: validateMultiplaEscolha,\n [QUESTION_TYPE.VERDADEIRO_FALSO]: validateVerdadeiroFalso,\n};\n\n/**\n * Auto-validate question based on selected options vs correct options\n * @param questionData - Correction question data\n * @returns ANSWER_STATUS if can determine, null otherwise\n */\nexport const autoValidateQuestion = (\n questionData: CorrectionQuestionData\n): ANSWER_STATUS | null => {\n const { result } = questionData;\n\n if (!canAutoValidate(questionData) || !result.options) return null;\n\n // Filter options to only include those with isCorrect defined\n const validOptions = result.options.filter(hasIsCorrect);\n if (validOptions.length === 0) return null;\n\n const selected = new Set(\n result.selectedOptions?.map((o) => o.optionId) ?? []\n );\n\n if (selected.size === 0) return ANSWER_STATUS.NAO_RESPONDIDO;\n\n const validator = validators[result.questionType];\n if (!validator) return null;\n\n return validator(selected, validOptions);\n};\n\n/**\n * Get question status from CorrectionQuestionData\n * Maps the result's answerStatus to QuestionStatus\n * If status is PENDENTE_AVALIACAO but can auto-validate, calculates status automatically\n * @param questionData - Correction question data\n * @returns QuestionStatus for UI display\n */\nexport const getQuestionStatusFromData = (\n questionData: CorrectionQuestionData\n): QuestionStatus => {\n const { result } = questionData;\n\n // If pending evaluation, try to auto-validate\n if (\n result.answerStatus === ANSWER_STATUS.PENDENTE_AVALIACAO &&\n canAutoValidate(questionData)\n ) {\n const autoValidatedStatus = autoValidateQuestion(questionData);\n if (autoValidatedStatus !== null) {\n return mapAnswerStatusToQuestionStatus(autoValidatedStatus);\n }\n }\n\n return mapAnswerStatusToQuestionStatus(result.answerStatus);\n};\n","import { CheckCircle, XCircle } from 'phosphor-react';\nimport Badge from '../Badge/Badge';\nimport { RadioGroup, RadioGroupItem } from '../Radio/Radio';\nimport { forwardRef, HTMLAttributes, useId, useState } from 'react';\nimport { cn } from '../../utils/utils';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\nimport { QuizVariant } from '../Quiz/Quiz.types';\nimport { OptionStatus } from '../../enums/Options';\n\n/**\n * Interface para definir uma alternativa\n */\nexport interface Alternative {\n value: string;\n label: string;\n status?: OptionStatus;\n disabled?: boolean;\n description?: string;\n}\n\n/**\n * Props do componente AlternativesList\n */\nexport interface AlternativesListProps {\n /** Lista de alternativas */\n alternatives: Alternative[];\n /** Nome do grupo de radio */\n name?: string;\n /** Valor selecionado por padrão */\n defaultValue?: string;\n /** Valor controlado */\n value?: string;\n /** Callback quando uma alternativa é selecionada */\n onValueChange?: (value: string) => void;\n /** Se o componente está desabilitado */\n disabled?: boolean;\n /** Layout das alternativas */\n layout?: 'default' | 'compact' | 'detailed';\n /** Classes CSS adicionais */\n className?: string;\n /** Modo de exibição: interativo (com radios funcionais) ou readonly (apenas visual) */\n mode?: 'interactive' | 'readonly';\n /** Valor selecionado pelo usuário (apenas para modo readonly) */\n selectedValue?: string;\n}\n\n/**\n * Componente reutilizável para exibir lista de alternativas com RadioGroup\n *\n * Suporta dois modos:\n * - `interactive`: Permite interação com radios (padrão)\n * - `readonly`: Apenas exibição visual dos estados\n *\n * @example\n * ```tsx\n * // Modo interativo (padrão)\n * <AlternativesList\n * mode=\"interactive\"\n * alternatives={[\n * { value: \"a\", label: \"Alternativa A\", status: \"correct\" },\n * { value: \"b\", label: \"Alternativa B\", status: \"incorrect\" },\n * { value: \"c\", label: \"Alternativa C\" }\n * ]}\n * defaultValue=\"a\"\n * onValueChange={(value) => console.log(value)}\n * />\n *\n * // Modo readonly - mostra seleção do usuário\n * <AlternativesList\n * mode=\"readonly\"\n * selectedValue=\"b\" // O que o usuário selecionou\n * alternatives={[\n * { value: \"a\", label: \"Resposta A\", status: \"correct\" }, // Mostra como correta\n * { value: \"b\", label: \"Resposta B\" }, // Mostra radio selecionado + badge incorreto\n * { value: \"c\", label: \"Resposta C\" }\n * ]}\n * />\n * ```\n */\nconst AlternativesList = ({\n alternatives,\n name,\n defaultValue,\n value,\n onValueChange,\n disabled = false,\n layout = 'default',\n className = '',\n mode = QuizVariant.INTERACTIVE,\n selectedValue,\n}: AlternativesListProps) => {\n // Gerar um ID único para garantir que cada instância tenha seu próprio grupo\n const uniqueId = useId();\n const groupName = name || `alternatives-${uniqueId}`;\n const [actualValue, setActualValue] = useState(value);\n // No modo readonly, não precisamos de interação\n const isReadonly = mode === 'readonly';\n const getStatusStyles = (\n status?: Alternative['status'],\n isReadonly?: boolean\n ) => {\n const hoverClass = isReadonly ? '' : 'hover:bg-background-50';\n\n switch (status) {\n case OptionStatus.CORRECT:\n return 'bg-success-background border-success-300';\n case OptionStatus.INCORRECT:\n return 'bg-error-background border-error-300';\n default:\n return `bg-background border-border-100 ${hoverClass}`;\n }\n };\n\n const getStatusBadge = (status?: Alternative['status']) => {\n switch (status) {\n case OptionStatus.CORRECT:\n return (\n <Badge variant=\"solid\" action=\"success\" iconLeft={<CheckCircle />}>\n Resposta correta\n </Badge>\n );\n case OptionStatus.INCORRECT:\n return (\n <Badge variant=\"solid\" action=\"error\" iconLeft={<XCircle />}>\n Resposta incorreta\n </Badge>\n );\n default:\n return null;\n }\n };\n\n const getLayoutClasses = () => {\n switch (layout) {\n case 'compact':\n return 'gap-2';\n case 'detailed':\n return 'gap-4';\n default:\n return 'gap-3.5';\n }\n };\n\n // Componente para renderizar alternativa no modo readonly\n const renderReadonlyAlternative = (alternative: Alternative) => {\n const alternativeId = alternative.value;\n const isUserSelected = selectedValue === alternative.value;\n const isCorrectAnswer = alternative.status === OptionStatus.CORRECT;\n\n // Determinar o status da alternativa para visualização\n let displayStatus: Alternative['status'] = undefined;\n if (isUserSelected && !isCorrectAnswer) {\n // Usuário selecionou alternativa incorreta\n displayStatus = OptionStatus.INCORRECT;\n } else if (isCorrectAnswer) {\n // Alternativa correta (independente se foi selecionada ou não)\n displayStatus = OptionStatus.CORRECT;\n }\n\n const statusStyles = getStatusStyles(displayStatus, true);\n const statusBadge = getStatusBadge(displayStatus);\n\n // Radio visual - apenas mostra selecionado se o usuário escolheu esta alternativa\n const renderRadio = () => {\n const radioClasses = `w-6 h-6 rounded-full border-2 cursor-default transition-all duration-200 flex items-center justify-center ${\n isUserSelected\n ? 'border-primary-950 bg-background'\n : 'border-border-400 bg-background'\n }`;\n\n const dotClasses =\n 'w-3 h-3 rounded-full bg-primary-950 transition-all duration-200';\n\n return (\n <div className={radioClasses}>\n {isUserSelected && <div className={dotClasses} />}\n </div>\n );\n };\n\n if (layout === 'detailed') {\n return (\n <div\n key={alternativeId}\n className={cn(\n 'border-2 rounded-lg p-4 w-full',\n statusStyles,\n alternative.disabled ? 'opacity-50' : ''\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1\">\n <div className=\"mt-1\">{renderRadio()}</div>\n <div className=\"flex-1\">\n <HtmlMathRenderer\n content={alternative.label}\n className={cn(\n 'block font-medium',\n selectedValue === alternative.value || statusBadge\n ? 'text-text-950'\n : 'text-text-600'\n )}\n />\n {alternative.description && (\n <p className=\"text-sm text-text-600 mt-1\">\n {alternative.description}\n </p>\n )}\n </div>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={alternativeId}\n className={cn(\n 'flex flex-row justify-between items-start gap-2 p-2 rounded-lg w-full',\n statusStyles,\n alternative.disabled ? 'opacity-50' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n {renderRadio()}\n <HtmlMathRenderer\n content={alternative.label}\n className={cn(\n 'flex-1',\n selectedValue === alternative.value || statusBadge\n ? 'text-text-950'\n : 'text-text-600'\n )}\n />\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n );\n };\n\n // Se for modo readonly, renderizar sem RadioGroup\n if (isReadonly) {\n return (\n <div\n className={cn('flex flex-col', getLayoutClasses(), 'w-full', className)}\n >\n {alternatives.map((alternative) =>\n renderReadonlyAlternative(alternative)\n )}\n </div>\n );\n }\n\n return (\n <RadioGroup\n name={groupName}\n defaultValue={defaultValue}\n value={value}\n onValueChange={(value) => {\n setActualValue(value);\n onValueChange?.(value);\n }}\n disabled={disabled}\n className={cn('flex flex-col', getLayoutClasses(), className)}\n >\n {alternatives.map((alternative, index) => {\n const alternativeId = alternative.value || `alt-${index}`;\n const statusStyles = getStatusStyles(alternative.status, false);\n const statusBadge = getStatusBadge(alternative.status);\n\n if (layout === 'detailed') {\n return (\n <div\n key={alternativeId}\n className={cn(\n 'border-2 rounded-lg p-4 transition-all',\n statusStyles,\n alternative.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1\">\n <RadioGroupItem\n value={alternative.value}\n id={alternativeId}\n disabled={alternative.disabled}\n className=\"mt-1\"\n />\n <div className=\"flex-1\">\n <label\n htmlFor={alternativeId}\n className={cn(\n 'block font-medium',\n actualValue === alternative.value\n ? 'text-text-950'\n : 'text-text-600',\n alternative.disabled\n ? 'cursor-not-allowed'\n : 'cursor-pointer'\n )}\n >\n <HtmlMathRenderer content={alternative.label} inline />\n </label>\n {alternative.description && (\n <p className=\"text-sm text-text-600 mt-1\">\n {alternative.description}\n </p>\n )}\n </div>\n </div>\n {statusBadge && (\n <div className=\"flex-shrink-0\">{statusBadge}</div>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={alternativeId}\n className={cn(\n 'flex flex-row justify-between gap-2 items-start p-2 rounded-lg transition-all',\n statusStyles,\n alternative.disabled ? 'opacity-50 cursor-not-allowed' : ''\n )}\n >\n <div className=\"flex items-center gap-2 flex-1\">\n <RadioGroupItem\n value={alternative.value}\n id={alternativeId}\n disabled={alternative.disabled}\n />\n <label\n htmlFor={alternativeId}\n className={cn(\n 'flex-1',\n actualValue === alternative.value\n ? 'text-text-950'\n : 'text-text-600',\n alternative.disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n <HtmlMathRenderer content={alternative.label} inline />\n </label>\n </div>\n {statusBadge && <div className=\"flex-shrink-0\">{statusBadge}</div>}\n </div>\n );\n })}\n </RadioGroup>\n );\n};\n\ninterface HeaderAlternativeProps extends HTMLAttributes<HTMLDivElement> {\n title: string;\n subTitle: string;\n content: string;\n}\n\nconst HeaderAlternative = forwardRef<HTMLDivElement, HeaderAlternativeProps>(\n ({ className, title, subTitle, content, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-background p-4 flex flex-col gap-4 rounded-xl',\n className\n )}\n {...props}\n >\n <span className=\"flex flex-col\">\n <p className=\"text-text-950 font-bold text-lg\">{title}</p>\n <p className=\"text-text-700 text-sm \">{subTitle}</p>\n </span>\n\n <HtmlMathRenderer content={content} className=\"text-text-950 text-md\" />\n </div>\n );\n }\n);\n\nexport { AlternativesList, HeaderAlternative };\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport type { BaseApiClient } from '../../types/api';\nimport type {\n UseUserAccessDataReturn,\n UseUserAccessDataState,\n UseStudentsFilterReturn,\n UseStudentsFilterState,\n StudentsFilterParams,\n StudentFilterItem,\n StudentGroup,\n UserAccessDataApiResponse,\n StudentsFilterApiResponse,\n} from './types';\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Groups students by school/year/class\n */\nfunction groupStudents(students: StudentFilterItem[]): StudentGroup[] {\n const groups = new Map<string, StudentGroup>();\n\n for (const student of students) {\n const key = `${student.schoolId}-${student.schoolYearId}-${student.classId}`;\n const label = `${student.schoolName} > ${student.schoolYearName} > ${student.className}`;\n\n if (!groups.has(key)) {\n groups.set(key, { key, label, students: [] });\n }\n groups.get(key)!.students.push(student);\n }\n\n // Sort groups by label and students by name\n const sortedGroups = Array.from(groups.values()).sort((a, b) =>\n a.label.localeCompare(b.label, 'pt-BR')\n );\n\n for (const group of sortedGroups) {\n group.students.sort((a, b) => a.name.localeCompare(b.name, 'pt-BR'));\n }\n\n return sortedGroups;\n}\n\n// ============================================================================\n// useUserAccessData HOOK\n// ============================================================================\n\n/**\n * Hook to fetch user access data (schools, schoolYears, classes)\n *\n * Receives the api client and calls /auth/me endpoint directly.\n *\n * @example\n * ```tsx\n * const { schools, schoolYears, classes, isLoading, error } = useUserAccessData(api);\n * ```\n */\nexport function useUserAccessData(api: BaseApiClient): UseUserAccessDataReturn {\n const [state, setState] = useState<UseUserAccessDataState>({\n isLoading: false,\n error: null,\n schools: [],\n schoolYears: [],\n classes: [],\n });\n\n const hasFetched = useRef(false);\n\n const fetchData = useCallback(async () => {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n try {\n const response = await api.get<UserAccessDataApiResponse>('/auth/me');\n const data = response.data.data;\n\n setState({\n isLoading: false,\n error: null,\n schools: data.schools.map((s) => ({\n id: s.id,\n name: s.name,\n })),\n schoolYears: data.schoolYears.map((sy) => ({\n id: sy.id,\n name: sy.name,\n schoolId: sy.schoolId,\n })),\n classes: data.classes.map((c) => ({\n id: c.id,\n name: c.name,\n schoolId: c.schoolId,\n schoolYearId: c.schoolYearId,\n })),\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Falha ao carregar dados';\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: errorMessage,\n }));\n }\n }, [api]);\n\n // Fetch on mount\n useEffect(() => {\n if (!hasFetched.current) {\n hasFetched.current = true;\n fetchData();\n }\n }, [fetchData]);\n\n return {\n ...state,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// useStudentsFilter HOOK\n// ============================================================================\n\n/**\n * Hook to fetch and manage students for filtering\n *\n * Receives the api client and calls /students/filters endpoint directly.\n *\n * @example\n * ```tsx\n * const { groupedStudents, isLoading, fetchStudents, clearStudents } = useStudentsFilter(api);\n *\n * // Fetch students when filters change\n * useEffect(() => {\n * if (schoolIds.length > 0) {\n * fetchStudents({ schoolIds, schoolYearIds, classIds });\n * }\n * }, [schoolIds, schoolYearIds, classIds]);\n * ```\n */\nexport function useStudentsFilter(api: BaseApiClient): UseStudentsFilterReturn {\n const [state, setState] = useState<UseStudentsFilterState>({\n isLoading: false,\n error: null,\n students: [],\n groupedStudents: [],\n });\n\n const fetchStudents = useCallback(\n async (filters: StudentsFilterParams) => {\n // Don't fetch if there are no filters\n const hasFilters =\n (filters.schoolIds && filters.schoolIds.length > 0) ||\n (filters.schoolYearIds && filters.schoolYearIds.length > 0) ||\n (filters.classIds && filters.classIds.length > 0);\n\n if (!hasFilters) {\n setState({\n isLoading: false,\n error: null,\n students: [],\n groupedStudents: [],\n });\n return;\n }\n\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n try {\n const response = await api.post<StudentsFilterApiResponse>(\n '/students/filters',\n {\n schoolIds: filters.schoolIds || [],\n schoolYearIds: filters.schoolYearIds || [],\n classIds: filters.classIds || [],\n }\n );\n\n const rawStudents = response.data.data.students;\n\n // Transform and filter students with complete data\n const students: StudentFilterItem[] = rawStudents\n .filter((s) => s.school && s.schoolYear && s.class)\n .map((s) => ({\n id: s.userInstitutionId,\n name: s.name,\n schoolId: s.school!.id,\n schoolYearId: s.schoolYear!.id,\n classId: s.class!.id,\n schoolName: s.school!.name,\n schoolYearName: s.schoolYear!.name,\n className: s.class!.name,\n }));\n\n const groupedStudents = groupStudents(students);\n\n setState({\n isLoading: false,\n error: null,\n students,\n groupedStudents,\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Falha ao carregar estudantes';\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: errorMessage,\n }));\n }\n },\n [api]\n );\n\n const clearStudents = useCallback(() => {\n setState({\n isLoading: false,\n error: null,\n students: [],\n groupedStudents: [],\n });\n }, []);\n\n return {\n ...state,\n fetchStudents,\n clearStudents,\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport type { BaseApiClient } from '../types/api';\nimport type {\n SimulationsStudentsResponse,\n SimulationsStudentsPage,\n SimulationsStudentsFilters,\n SimulationsListResponse,\n SimulationsListData,\n SimulationsListFilters,\n SimulationDetailResponse,\n SimulationDetailData,\n NoteResponse,\n NoteData,\n} from '../types/simulations';\n\nconst BASE_URL = '/performance/simulations';\n\n/** Encode a value before interpolating it into a request path segment. */\nconst segment = (value: string) => encodeURIComponent(value);\n\n/**\n * Hook return type for the teacher-facing Simulations feature.\n *\n * The hook exposes imperative fetchers (rather than holding everything in\n * state) because the UI loads data lazily across three nested levels:\n * students list -> a student's simulations -> a simulation's questions.\n */\nexport interface UseSimulationsReturn {\n fetchStudents: (\n filters?: SimulationsStudentsFilters\n ) => Promise<SimulationsStudentsPage>;\n fetchStudentSimulations: (\n userInstitutionId: string,\n filters?: SimulationsListFilters\n ) => Promise<SimulationsListData>;\n fetchSimulationDetail: (\n userInstitutionId: string,\n simulationId: string\n ) => Promise<SimulationDetailData>;\n fetchNote: (\n userInstitutionId: string,\n simulationId: string\n ) => Promise<NoteData | null>;\n saveNote: (\n userInstitutionId: string,\n simulationId: string,\n note: string\n ) => Promise<NoteData | null>;\n}\n\n/**\n * Factory that binds an API client to the Simulations hook.\n *\n * @example\n * ```tsx\n * const useSimulations = createUseSimulations(api);\n * const { fetchStudents } = useSimulations();\n * ```\n */\nexport const createUseSimulations =\n (apiClient: BaseApiClient) => (): UseSimulationsReturn => {\n const fetchStudents = useCallback(\n async (\n filters: SimulationsStudentsFilters = {}\n ): Promise<SimulationsStudentsPage> => {\n const { page = 1, limit = 20, search, classIds } = filters;\n const response = await apiClient.get<SimulationsStudentsResponse>(\n `${BASE_URL}/students`,\n { params: { page, limit, search, classIds } }\n );\n return response.data.data.students;\n },\n []\n );\n\n const fetchStudentSimulations = useCallback(\n async (\n userInstitutionId: string,\n filters: SimulationsListFilters = {}\n ): Promise<SimulationsListData> => {\n const { page = 1, limit = 20 } = filters;\n const response = await apiClient.get<SimulationsListResponse>(\n `${BASE_URL}/students/${segment(userInstitutionId)}`,\n { params: { page, limit } }\n );\n return response.data.data;\n },\n []\n );\n\n const fetchSimulationDetail = useCallback(\n async (\n userInstitutionId: string,\n simulationId: string\n ): Promise<SimulationDetailData> => {\n const response = await apiClient.get<SimulationDetailResponse>(\n `${BASE_URL}/students/${segment(userInstitutionId)}/${segment(simulationId)}`\n );\n return response.data.data;\n },\n []\n );\n\n const fetchNote = useCallback(\n async (\n userInstitutionId: string,\n simulationId: string\n ): Promise<NoteData | null> => {\n const response = await apiClient.get<NoteResponse>(\n `${BASE_URL}/students/${segment(userInstitutionId)}/${segment(simulationId)}/note`\n );\n return response.data.data;\n },\n []\n );\n\n const saveNote = useCallback(\n async (\n userInstitutionId: string,\n simulationId: string,\n note: string\n ): Promise<NoteData | null> => {\n const response = await apiClient.post<NoteResponse>(\n `${BASE_URL}/students/${segment(userInstitutionId)}/${segment(simulationId)}/note`,\n { note }\n );\n return response.data.data;\n },\n []\n );\n\n return useMemo(\n () => ({\n fetchStudents,\n fetchStudentSimulations,\n fetchSimulationDetail,\n fetchNote,\n saveNote,\n }),\n [\n fetchStudents,\n fetchStudentSimulations,\n fetchSimulationDetail,\n fetchNote,\n saveNote,\n ]\n );\n };\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { UserCircle } from 'phosphor-react';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport TextArea from '../TextArea/TextArea';\nimport { CardAccordation } from '../Accordation';\nimport { SkeletonCard } from '../Skeleton/Skeleton';\nimport { StatCard } from '../shared/StatCard';\nimport { AlternativesList } from '../Alternative/Alternative';\nimport { HtmlMathRenderer } from '../HtmlMathRenderer';\nimport { OptionStatus } from '../../enums/Options';\nimport {\n getQuestionStatusBadgeConfig,\n QUESTION_STATUS,\n type QuestionStatus,\n} from '../../utils/studentActivityCorrection';\nimport { cn } from '../../utils/utils';\nimport type { BaseApiClient } from '../../types/api';\nimport { createUseSimulations } from '../../hooks/useSimulations';\nimport type {\n SimulationsListData,\n SimulationDetailData,\n SimulationDetailQuestion,\n StudentSimulationItem,\n NoteData,\n} from '../../types/simulations';\n\nexport interface SimulationsDetailModalProps {\n /** API client used to fetch the student's simulations */\n readonly api: BaseApiClient;\n readonly isOpen: boolean;\n readonly onClose: () => void;\n /** The student whose simulations are shown (null closes the modal) */\n readonly student: { userInstitutionId: string; name: string } | null;\n}\n\ninterface DetailState {\n loading: boolean;\n error: string | null;\n data: SimulationDetailData | null;\n}\n\ninterface NoteState {\n loading: boolean;\n data: NoteData | null;\n}\n\n/** Map the simulation question status to the shared correction status. */\nconst QUESTION_STATUS_MAP: Record<\n SimulationDetailQuestion['status'],\n QuestionStatus\n> = {\n CORRECT: QUESTION_STATUS.CORRETA,\n INCORRECT: QUESTION_STATUS.INCORRETA,\n BLANK: QUESTION_STATUS.EM_BRANCO,\n};\n\n// ---------------------------------------------------------------------------\n// Level 2 — Question (reuses the shared alternatives renderer + status badge)\n// ---------------------------------------------------------------------------\n\nfunction QuestionItem({\n question,\n index,\n}: {\n readonly question: SimulationDetailQuestion;\n readonly index: number;\n}) {\n const badge = getQuestionStatusBadgeConfig(\n QUESTION_STATUS_MAP[question.status]\n );\n\n const alternatives = question.options.map((option) => {\n let status: OptionStatus;\n if (option.isCorrect) {\n status = OptionStatus.CORRECT;\n } else if (option.isSelected) {\n status = OptionStatus.INCORRECT;\n } else {\n status = OptionStatus.NEUTRAL;\n }\n return { label: option.option, value: option.id, status };\n });\n\n return (\n <CardAccordation\n value={question.questionId}\n trigger={\n <div className=\"flex flex-1 items-center justify-between gap-3 py-3\">\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Questão {index + 1}\n </Text>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n badge.bgColor,\n badge.textColor\n )}\n >\n {badge.label}\n </span>\n </div>\n }\n contentClassName=\"px-3 pb-3\"\n >\n <div className=\"flex flex-col gap-3\">\n <HtmlMathRenderer\n content={question.statement}\n className=\"text-sm text-text-800\"\n />\n <CardAccordation\n value={`${question.questionId}-options`}\n trigger={\n <div className=\"flex-1 py-2\">\n <Text size=\"sm\" weight=\"medium\" className=\"text-text-950\">\n Alternativas\n </Text>\n </div>\n }\n contentClassName=\"px-3 pb-3\"\n >\n <AlternativesList\n mode=\"readonly\"\n layout=\"compact\"\n name={`question-${question.questionId}`}\n alternatives={alternatives}\n selectedValue={question.selectedOptionId ?? ''}\n />\n </CardAccordation>\n </div>\n </CardAccordation>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Note (\"Observação\")\n// ---------------------------------------------------------------------------\n\nfunction NoteRow({\n note,\n loading,\n onSave,\n}: {\n readonly note: NoteData | null;\n readonly loading: boolean;\n readonly onSave: (text: string) => Promise<void>;\n}) {\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const startEditing = () => {\n setDraft(note?.note ?? '');\n setError(null);\n setEditing(true);\n };\n\n const handleSave = async () => {\n if (!draft.trim()) return;\n setSaving(true);\n setError(null);\n try {\n await onSave(draft.trim());\n setEditing(false);\n } catch {\n // Keep the editing UI open (draft preserved) and surface the failure.\n setError('Erro ao salvar a observação. Tente novamente.');\n } finally {\n setSaving(false);\n }\n };\n\n if (loading) {\n return <SkeletonCard className=\"h-14\" />;\n }\n\n if (editing) {\n return (\n <div className=\"flex flex-col gap-2 rounded-xl border border-border-200 p-3\">\n <TextArea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n placeholder=\"Escreva uma observação para este simulado\"\n rows={3}\n />\n {error && (\n <Text size=\"sm\" className=\"text-error-600\">\n {error}\n </Text>\n )}\n <div className=\"flex justify-end gap-2\">\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={() => setEditing(false)}\n >\n Cancelar\n </Button>\n <Button\n variant=\"solid\"\n size=\"small\"\n onClick={handleSave}\n disabled={saving || !draft.trim()}\n >\n Salvar\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center justify-between gap-3 rounded-xl border border-border-200 p-3\">\n <div className=\"flex min-w-0 flex-col\">\n <Text size=\"sm\" weight=\"bold\" className=\"text-text-950\">\n Observação\n </Text>\n {note?.note && (\n <Text size=\"sm\" className=\"truncate text-text-700\">\n {note.note}\n </Text>\n )}\n </div>\n <Button variant=\"solid\" size=\"small\" onClick={startEditing}>\n {note?.note ? 'Editar' : 'Incluir'}\n </Button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Level 1 — Simulation\n// ---------------------------------------------------------------------------\n\nfunction SimulationItem({\n simulation,\n index,\n expanded,\n onToggle,\n detail,\n note,\n onSaveNote,\n}: {\n readonly simulation: StudentSimulationItem;\n readonly index: number;\n readonly expanded: boolean;\n readonly onToggle: () => void;\n readonly detail: DetailState | undefined;\n readonly note: NoteState | undefined;\n readonly onSaveNote: (text: string) => Promise<void>;\n}) {\n return (\n <CardAccordation\n value={simulation.id}\n expanded={expanded}\n onToggleExpanded={onToggle}\n trigger={\n <div className=\"flex-1 py-4\">\n <Text weight=\"bold\" className=\"text-text-950\">\n {simulation.title?.trim()\n ? simulation.title.trim()\n : `Simulado ${index + 1}`}\n </Text>\n </div>\n }\n contentClassName=\"px-3 pb-4\"\n >\n {detail?.loading && <SkeletonCard className=\"h-40\" />}\n {detail?.error && (\n <Text size=\"sm\" className=\"text-error-600\">\n {detail.error}\n </Text>\n )}\n {detail?.data && (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex gap-3\">\n <StatCard\n label=\"Nº de questões corretas\"\n value={detail.data.counts.correct}\n variant=\"correct\"\n className=\"flex-1\"\n />\n <StatCard\n label=\"Nº de questões incorretas\"\n value={detail.data.counts.incorrect}\n variant=\"incorrect\"\n className=\"flex-1\"\n />\n <StatCard\n label=\"Nº de questões em branco\"\n value={detail.data.counts.blank}\n variant=\"blank\"\n className=\"flex-1\"\n />\n </div>\n\n <NoteRow\n note={note?.data ?? null}\n loading={note?.loading ?? false}\n onSave={onSaveNote}\n />\n\n <div className=\"flex flex-col gap-2\">\n <Text weight=\"bold\" className=\"text-text-950\">\n Respostas\n </Text>\n {detail.data.questions.map((question, qIndex) => (\n <QuestionItem\n key={question.questionId}\n question={question}\n index={qIndex}\n />\n ))}\n </div>\n </div>\n )}\n </CardAccordation>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Modal\n// ---------------------------------------------------------------------------\n\n/**\n * Modal that shows a single student's answered simulations as a nested\n * accordion (simulation -> question -> options), lazily loading each\n * simulation's detail when it is expanded. Reuses the shared StatCard and\n * AlternativesList components so the detail matches the activity correction UI.\n */\nexport function SimulationsDetailModal({\n api,\n isOpen,\n onClose,\n student,\n}: SimulationsDetailModalProps) {\n const useSimulations = useMemo(() => createUseSimulations(api), [api]);\n const {\n fetchStudentSimulations,\n fetchSimulationDetail,\n fetchNote,\n saveNote,\n } = useSimulations();\n\n const [list, setList] = useState<SimulationsListData | null>(null);\n const [listLoading, setListLoading] = useState(false);\n const [listError, setListError] = useState<string | null>(null);\n const [expandedId, setExpandedId] = useState<string | null>(null);\n const [details, setDetails] = useState<Record<string, DetailState>>({});\n const [notes, setNotes] = useState<Record<string, NoteState>>({});\n\n // Guards async state updates against the modal unmounting mid-request.\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Bumped on every new session (open / student change) so in-flight responses\n // from a previous student are ignored instead of writing into the new one.\n const requestEpochRef = useRef(0);\n useEffect(() => {\n requestEpochRef.current += 1;\n }, [isOpen, student?.userInstitutionId]);\n\n const isStaleResponse = useCallback(\n (epoch: number) => !mountedRef.current || requestEpochRef.current !== epoch,\n []\n );\n\n useEffect(() => {\n if (!isOpen || !student) return;\n\n setList(null);\n setExpandedId(null);\n setDetails({});\n setNotes({});\n setListLoading(true);\n setListError(null);\n\n let active = true;\n fetchStudentSimulations(student.userInstitutionId)\n .then((data) => {\n if (active) setList(data);\n })\n .catch(() => {\n if (active) setListError('Erro ao carregar os simulados do estudante');\n })\n .finally(() => {\n if (active) setListLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [isOpen, student, fetchStudentSimulations]);\n\n const handleToggle = useCallback(\n (simulationId: string) => {\n if (!student) return;\n const requestEpoch = requestEpochRef.current;\n const next = expandedId === simulationId ? null : simulationId;\n setExpandedId(next);\n\n if (next && !details[simulationId]) {\n setDetails((prev) => ({\n ...prev,\n [simulationId]: { loading: true, error: null, data: null },\n }));\n fetchSimulationDetail(student.userInstitutionId, simulationId)\n .then((data) => {\n if (isStaleResponse(requestEpoch)) return;\n setDetails((prev) => ({\n ...prev,\n [simulationId]: { loading: false, error: null, data },\n }));\n })\n .catch(() => {\n if (isStaleResponse(requestEpoch)) return;\n setDetails((prev) => ({\n ...prev,\n [simulationId]: {\n loading: false,\n error: 'Erro ao carregar o simulado',\n data: null,\n },\n }));\n });\n\n setNotes((prev) => ({\n ...prev,\n [simulationId]: { loading: true, data: null },\n }));\n fetchNote(student.userInstitutionId, simulationId)\n .then((data) => {\n if (isStaleResponse(requestEpoch)) return;\n setNotes((prev) => ({\n ...prev,\n [simulationId]: { loading: false, data },\n }));\n })\n .catch(() => {\n if (isStaleResponse(requestEpoch)) return;\n setNotes((prev) => ({\n ...prev,\n [simulationId]: { loading: false, data: null },\n }));\n });\n }\n },\n [\n student,\n expandedId,\n details,\n fetchSimulationDetail,\n fetchNote,\n isStaleResponse,\n ]\n );\n\n const makeSaveNote = useCallback(\n (simulationId: string) => async (text: string) => {\n if (!student) return;\n const requestEpoch = requestEpochRef.current;\n const saved = await saveNote(\n student.userInstitutionId,\n simulationId,\n text\n );\n if (isStaleResponse(requestEpoch)) return;\n setNotes((prev) => ({\n ...prev,\n [simulationId]: { loading: false, data: saved },\n }));\n },\n [student, saveNote, isStaleResponse]\n );\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title=\"Simulados\" size=\"xl\">\n {student && (\n <div className=\"flex max-h-[70vh] flex-col gap-4 overflow-y-auto pr-1\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"flex items-center gap-2\">\n <UserCircle size={24} weight=\"fill\" className=\"text-info-700\" />\n <Text weight=\"bold\" className=\"text-text-950\">\n {student.name}\n </Text>\n </span>\n <Text size=\"sm\" className=\"text-info-700\">\n {list?.student.simulationsAnswered ?? 0} simulados respondidos\n </Text>\n </div>\n\n {listLoading && <SkeletonCard className=\"h-20\" />}\n {listError && (\n <Text size=\"sm\" className=\"text-error-600\">\n {listError}\n </Text>\n )}\n {list?.simulations.data.length === 0 && !listLoading && (\n <Text size=\"sm\" className=\"text-text-600\">\n Este estudante ainda não respondeu nenhum simulado.\n </Text>\n )}\n\n {list && (\n <div className=\"flex flex-col gap-3\">\n {list.simulations.data.map((simulation, index) => (\n <SimulationItem\n key={simulation.id}\n simulation={simulation}\n index={index}\n expanded={expandedId === simulation.id}\n onToggle={() => handleToggle(simulation.id)}\n detail={details[simulation.id]}\n note={notes[simulation.id]}\n onSaveNote={makeSaveNote(simulation.id)}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </Modal>\n );\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","STATE_CLASSES","import_react","import_phosphor_react","import_react","import_react","import_phosphor_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","_","import_jsx_runtime","import_jsx_runtime","import_react","import_phosphor_react","import_react","import_phosphor_react","import_react","import_zustand","import_phosphor_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","value","disabled","readOnly","import_react","import_phosphor_react","import_jsx_runtime","VARIANT_ACTION_CLASSES","SIZE_CLASSES","import_jsx_runtime","katex","import_react","import_katex_min","import_react","match","import_jsx_runtime","segment","ReactMarkdown","remarkGfm","remarkMath","rehypeKatex","import_jsx_runtime","Element","import_react","import_phosphor_react","import_jsx_runtime","SIZE_CLASSES","import_jsx_runtime","import_react","import_zustand","import_jsx_runtime","SIZE_CLASSES","STATE_CLASSES","injectStore","import_jsx_runtime","SIZE_CLASSES","import_react","import_react","import_phosphor_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","status","import_phosphor_react","import_jsx_runtime","import_react","import_zustand","import_jsx_runtime","injectStore","import_phosphor_react","import_jsx_runtime","import_phosphor_react","import_react","import_jsx_runtime","isReadonly","value","import_react","import_react","import_jsx_runtime","formattedItemsMap","getBadgeText","isCategoryEnabled","handleAccordionValueChange","import_jsx_runtime","import_phosphor_react","import_jsx_runtime","import_react","import_phosphor_react","import_jsx_runtime","import_jsx_runtime"]}