analytica-frontend-lib 1.2.47 → 1.2.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ActivityCardQuestionBanks/index.css +28 -2
- package/dist/ActivityCardQuestionBanks/index.css.map +1 -1
- package/dist/ActivityCardQuestionPreview/index.css +28 -2
- package/dist/ActivityCardQuestionPreview/index.css.map +1 -1
- package/dist/ActivityDetails/index.css +28 -2
- package/dist/ActivityDetails/index.css.map +1 -1
- package/dist/ActivityFilters/index.css +28 -2
- package/dist/ActivityFilters/index.css.map +1 -1
- package/dist/ActivityPreview/index.css +28 -2
- package/dist/ActivityPreview/index.css.map +1 -1
- package/dist/AlertManager/index.css +28 -2
- package/dist/AlertManager/index.css.map +1 -1
- package/dist/ProgressCircle/index.d.ts.map +1 -1
- package/dist/ProgressCircle/index.js +8 -8
- package/dist/ProgressCircle/index.js.map +1 -1
- package/dist/ProgressCircle/index.mjs +8 -8
- package/dist/ProgressCircle/index.mjs.map +1 -1
- package/dist/RecommendedLessonDetails/index.d.ts +4 -0
- package/dist/RecommendedLessonDetails/index.d.ts.map +1 -0
- package/dist/RecommendedLessonDetails/index.js +2250 -0
- package/dist/RecommendedLessonDetails/index.js.map +1 -0
- package/dist/RecommendedLessonDetails/index.mjs +2242 -0
- package/dist/RecommendedLessonDetails/index.mjs.map +1 -0
- package/dist/RecommendedLessonsHistory/index.css +28 -2
- package/dist/RecommendedLessonsHistory/index.css.map +1 -1
- package/dist/RecommendedLessonsHistory/index.js +3 -5
- package/dist/RecommendedLessonsHistory/index.js.map +1 -1
- package/dist/RecommendedLessonsHistory/index.mjs +3 -5
- package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.css +19353 -0
- package/dist/SendActivityModal/SendActivityModal.css.map +1 -0
- package/dist/SendActivityModal/SendActivityModal.d.ts +12 -0
- package/dist/SendActivityModal/SendActivityModal.d.ts.map +1 -0
- package/dist/SendActivityModal/SendActivityModal.js +6446 -0
- package/dist/SendActivityModal/SendActivityModal.js.map +1 -0
- package/dist/SendActivityModal/SendActivityModal.mjs +6486 -0
- package/dist/SendActivityModal/SendActivityModal.mjs.map +1 -0
- package/dist/SendActivityModal/hooks/useSendActivityModal.d.ts +43 -0
- package/dist/SendActivityModal/hooks/useSendActivityModal.d.ts.map +1 -0
- package/dist/SendActivityModal/hooks/useSendActivityModal.js +269 -0
- package/dist/SendActivityModal/hooks/useSendActivityModal.js.map +1 -0
- package/dist/SendActivityModal/hooks/useSendActivityModal.mjs +243 -0
- package/dist/SendActivityModal/hooks/useSendActivityModal.mjs.map +1 -0
- package/dist/SendActivityModal/index.css +28 -2
- package/dist/SendActivityModal/index.css.map +1 -1
- package/dist/SendActivityModal/types.d.ts +95 -0
- package/dist/SendActivityModal/types.d.ts.map +1 -0
- package/dist/SendActivityModal/types.js +35 -0
- package/dist/SendActivityModal/types.js.map +1 -0
- package/dist/SendActivityModal/types.mjs +10 -0
- package/dist/SendActivityModal/types.mjs.map +1 -0
- package/dist/SendActivityModal/validation.d.ts +133 -0
- package/dist/SendActivityModal/validation.d.ts.map +1 -0
- package/dist/SendActivityModal/validation.js +178 -0
- package/dist/SendActivityModal/validation.js.map +1 -0
- package/dist/SendActivityModal/validation.mjs +144 -0
- package/dist/SendActivityModal/validation.mjs.map +1 -0
- package/dist/TableProvider/index.css +28 -2
- package/dist/TableProvider/index.css.map +1 -1
- package/dist/hooks/useRecommendedLessonDetails/index.d.ts +780 -0
- package/dist/hooks/useRecommendedLessonDetails/index.d.ts.map +1 -0
- package/dist/hooks/useRecommendedLessonDetails/index.js +204 -0
- package/dist/hooks/useRecommendedLessonDetails/index.js.map +1 -0
- package/dist/hooks/useRecommendedLessonDetails/index.mjs +174 -0
- package/dist/hooks/useRecommendedLessonDetails/index.mjs.map +1 -0
- package/dist/hooks/useRecommendedLessonDetails.d.ts +780 -0
- package/dist/hooks/useRecommendedLessonDetails.d.ts.map +1 -0
- package/dist/index.css +28 -2
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +657 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +645 -10
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +28 -2
- package/dist/styles.css.map +1 -1
- package/dist/types/recommendedLessons/index.d.ts +156 -0
- package/dist/types/recommendedLessons/index.d.ts.map +1 -1
- package/dist/types/recommendedLessons/index.js +47 -2
- package/dist/types/recommendedLessons/index.js.map +1 -1
- package/dist/types/recommendedLessons/index.mjs +41 -1
- package/dist/types/recommendedLessons/index.mjs.map +1 -1
- package/dist/types/recommendedLessons.d.ts +156 -0
- package/dist/types/recommendedLessons.d.ts.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/RecommendedLessonDetails/RecommendedLessonDetails.tsx","../../src/utils/utils.ts","../../src/components/Text/Text.tsx","../../src/components/RecommendedLessonDetails/components/Breadcrumb.tsx","../../src/components/RecommendedLessonDetails/components/LessonHeader.tsx","../../src/components/Button/Button.tsx","../../src/assets/icons/subjects/BookOpenText.tsx","../../src/assets/icons/subjects/ChatEN.tsx","../../src/assets/icons/subjects/ChatES.tsx","../../src/assets/icons/subjects/ChatPT.tsx","../../src/assets/icons/subjects/HeadCircuit.tsx","../../src/assets/icons/subjects/Microscope.tsx","../../src/components/SubjectInfo/SubjectInfo.tsx","../../src/types/recommendedLessons.ts","../../src/components/RecommendedLessonDetails/utils/lessonDetailsUtils.ts","../../src/components/Skeleton/Skeleton.tsx","../../src/components/RecommendedLessonDetails/components/LoadingSkeleton.tsx","../../src/components/RecommendedLessonDetails/components/ResultsSection.tsx","../../src/components/ProgressCircle/ProgressCircle.tsx","../../src/components/RecommendedLessonDetails/components/StudentsTable.tsx","../../src/components/Badge/Badge.tsx","../../src/components/ProgressBar/ProgressBar.tsx","../../src/components/Table/Table.tsx","../../src/components/NoSearchResult/NoSearchResult.tsx","../../src/components/EmptyState/EmptyState.tsx","../../src/components/RecommendedLessonDetails/types.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport type { LessonDetailsData } from '../../types/recommendedLessons';\nimport type { SubjectEnum } from '../../enums/SubjectEnum';\nimport {\n Breadcrumb,\n LessonHeader,\n LoadingSkeleton,\n ResultsSection,\n StudentsTable,\n} from './components';\nimport { transformStudentForDisplay } from './utils/lessonDetailsUtils';\nimport {\n DEFAULT_LABELS,\n type BreadcrumbItem,\n type LessonDetailsLabels,\n} from './types';\n\n/**\n * Props for RecommendedLessonDetails component\n */\nexport interface RecommendedLessonDetailsProps {\n /** Lesson data to display (from API responses) */\n data: LessonDetailsData | null;\n /** Loading state */\n loading?: boolean;\n /** Error message */\n error?: string | null;\n /** Callback when \"Ver aula\" button is clicked */\n onViewLesson?: () => void;\n /** Callback when \"Ver desempenho\" button is clicked for a student */\n onViewStudentPerformance?: (studentId: string) => void;\n /** Callback for breadcrumb navigation */\n onBreadcrumbClick?: (path: string) => void;\n /** Function to map subject name to SubjectEnum */\n mapSubjectNameToEnum?: (name: string) => SubjectEnum | null;\n /** Custom breadcrumb items */\n breadcrumbs?: BreadcrumbItem[];\n /** Custom labels */\n labels?: Partial<LessonDetailsLabels>;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * RecommendedLessonDetails component\n *\n * Displays detailed information about a recommended lesson including:\n * - Breadcrumb navigation\n * - Lesson metadata (title, dates, school, subject, class)\n * - Results cards (completion %, best result topic, hardest topic)\n * - Students table with status, progress, and actions\n *\n * @example\n * ```tsx\n * <RecommendedLessonDetails\n * data={{\n * goal: goalData, // from /goals/{id}\n * details: detailsData, // from /goals/{id}/details\n * breakdown: breakdown, // optional, from /recommended-class/history\n * }}\n * onViewLesson={() => navigate('/view-lesson')}\n * onViewStudentPerformance={(id) => navigate(`/student/${id}`)}\n * mapSubjectNameToEnum={mapSubjectNameToEnum}\n * />\n * ```\n */\nconst RecommendedLessonDetails = ({\n data,\n loading = false,\n error = null,\n onViewLesson,\n onViewStudentPerformance,\n onBreadcrumbClick,\n mapSubjectNameToEnum,\n breadcrumbs,\n labels: customLabels,\n className,\n}: RecommendedLessonDetailsProps) => {\n const labels = useMemo(\n () => ({ ...DEFAULT_LABELS, ...customLabels }),\n [customLabels]\n );\n\n const defaultBreadcrumbs: BreadcrumbItem[] = useMemo(\n () => [\n { label: 'Aulas recomendadas', path: '/aulas-recomendadas' },\n { label: data?.goal.title || 'Detalhes' },\n ],\n [data?.goal.title]\n );\n\n const breadcrumbItems = breadcrumbs || defaultBreadcrumbs;\n\n // Transform API students to display format\n const displayStudents = useMemo(() => {\n if (!data?.details.students) return [];\n const deadline = data?.goal.finalDate;\n return data.details.students.map((student) =>\n transformStudentForDisplay(student, deadline)\n );\n }, [data?.details.students, data?.goal.finalDate]);\n\n if (loading) {\n return (\n <div\n className={cn('flex flex-col gap-6', className)}\n data-testid=\"lesson-details-loading\"\n >\n <LoadingSkeleton />\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center py-12',\n className\n )}\n data-testid=\"lesson-details-error\"\n >\n <Text size=\"md\" className=\"text-error-700\">\n {error}\n </Text>\n </div>\n );\n }\n\n if (!data) {\n return null;\n }\n\n return (\n <div\n className={cn('flex flex-col gap-6', className)}\n data-testid=\"recommended-lesson-details\"\n >\n {/* Breadcrumb */}\n <Breadcrumb items={breadcrumbItems} onItemClick={onBreadcrumbClick} />\n\n {/* Header with metadata */}\n <LessonHeader\n data={data}\n onViewLesson={onViewLesson}\n mapSubjectNameToEnum={mapSubjectNameToEnum}\n viewLessonLabel={labels.viewLesson}\n />\n\n {/* Results section */}\n <ResultsSection data={data} labels={labels} />\n\n {/* Students table */}\n <StudentsTable\n students={displayStudents}\n onViewPerformance={onViewStudentPerformance}\n labels={labels}\n />\n </div>\n );\n};\n\nexport default RecommendedLessonDetails;\n","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} from './activityFilters';\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n} from './activityDetailsUtils';\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 { ComponentPropsWithoutRef, 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<ComponentPropsWithoutRef<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 = '';\n let weightClasses = '';\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 { CaretRightIcon } from '@phosphor-icons/react';\nimport Text from '../../Text/Text';\nimport type { BreadcrumbItem } from '../types';\n\n/**\n * Props for Breadcrumb component\n */\ninterface BreadcrumbProps {\n /** Breadcrumb items to display */\n items: BreadcrumbItem[];\n /** Callback when a breadcrumb item is clicked */\n onItemClick?: (path: string) => void;\n}\n\n/**\n * Breadcrumb navigation component\n * Displays a path of navigation items with optional click handlers\n */\nexport const Breadcrumb = ({ items, onItemClick }: BreadcrumbProps) => (\n <nav className=\"flex items-center gap-2 text-sm\" aria-label=\"Breadcrumb\">\n {items.map((item, index) => (\n <Text\n key={item.path ?? item.label}\n as=\"span\"\n className=\"flex items-center gap-2\"\n >\n {index > 0 && <CaretRightIcon size={14} className=\"text-text-500\" />}\n {item.path ? (\n <button\n type=\"button\"\n onClick={() => onItemClick?.(item.path!)}\n className=\"text-text-600 hover:text-primary-700 transition-colors\"\n >\n {item.label}\n </button>\n ) : (\n <Text as=\"span\" className=\"text-text-950 font-medium\">\n {item.label}\n </Text>\n )}\n </Text>\n ))}\n </nav>\n);\n\nexport default Breadcrumb;\n","import { BookBookmarkIcon } from '@phosphor-icons/react';\nimport Text from '../../Text/Text';\nimport Button from '../../Button/Button';\nimport { getSubjectInfo } from '../../SubjectInfo/SubjectInfo';\nimport { cn } from '../../../utils/utils';\nimport type { LessonDetailsData } from '../../../types/recommendedLessons';\nimport type { SubjectEnum } from '../../../enums/SubjectEnum';\nimport { formatDate } from '../utils/lessonDetailsUtils';\n\n/**\n * Props for LessonHeader component\n */\ninterface LessonHeaderProps {\n /** Lesson details data */\n data: LessonDetailsData;\n /** Callback when \"Ver aula\" button is clicked */\n onViewLesson?: () => void;\n /** Function to map subject name to SubjectEnum */\n mapSubjectNameToEnum?: (name: string) => SubjectEnum | null;\n /** Label for the view lesson button */\n viewLessonLabel: string;\n}\n\n/**\n * Header section with lesson metadata\n * Displays title, dates, school, subject, and class information\n */\nexport const LessonHeader = ({\n data,\n onViewLesson,\n mapSubjectNameToEnum,\n viewLessonLabel,\n}: LessonHeaderProps) => {\n const { goal, breakdown } = data;\n\n // Extract subject from first lesson if available\n const subjectName =\n goal.lessonsGoals[0]?.supLessonsProgress?.lesson?.subject?.name || '';\n const subjectEnum = mapSubjectNameToEnum?.(subjectName);\n const subjectInfo = subjectEnum ? getSubjectInfo(subjectEnum) : null;\n\n return (\n <div className=\"bg-background rounded-xl border border-border-50 p-6\">\n <div className=\"flex flex-col lg:flex-row lg:items-start lg:justify-between gap-4\">\n <div className=\"flex flex-col gap-2\">\n <Text\n as=\"h1\"\n size=\"xl\"\n weight=\"bold\"\n className=\"text-text-950 lg:text-2xl\"\n >\n {goal.title}\n </Text>\n <div className=\"flex flex-wrap items-center gap-2 text-sm text-text-600\">\n <Text as=\"span\" size=\"sm\" className=\"text-text-600\">\n Início em {formatDate(goal.startDate)}\n </Text>\n <Text as=\"span\" size=\"sm\" className=\"text-text-400\">\n •\n </Text>\n <Text as=\"span\" size=\"sm\" className=\"text-text-600\">\n Prazo final {formatDate(goal.finalDate)}\n </Text>\n {breakdown?.schoolName && (\n <>\n <Text as=\"span\" size=\"sm\" className=\"text-text-400\">\n •\n </Text>\n <Text as=\"span\" size=\"sm\" className=\"text-text-600\">\n {breakdown.schoolName}\n </Text>\n </>\n )}\n {subjectName && (\n <>\n <Text as=\"span\" size=\"sm\" className=\"text-text-400\">\n •\n </Text>\n <Text as=\"span\" size=\"sm\" className=\"flex items-center gap-1\">\n {subjectInfo && (\n <Text\n as=\"span\"\n className={cn(\n 'size-5 rounded flex items-center justify-center text-white',\n subjectInfo.colorClass\n )}\n >\n {subjectInfo.icon}\n </Text>\n )}\n {subjectName}\n </Text>\n </>\n )}\n {breakdown?.className && (\n <>\n <Text as=\"span\" size=\"sm\" className=\"text-text-400\">\n •\n </Text>\n <Text as=\"span\" size=\"sm\" className=\"text-text-600\">\n {breakdown.className}\n </Text>\n </>\n )}\n </div>\n </div>\n {onViewLesson && (\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"small\"\n iconLeft={<BookBookmarkIcon size={16} />}\n onClick={onViewLesson}\n >\n {viewLessonLabel}\n </Button>\n )}\n </div>\n </div>\n );\n};\n\nexport default LessonHeader;\n","import { ButtonHTMLAttributes, ReactNode } 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 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 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 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 */\n variant?: 'solid' | 'outline' | 'link';\n /** Action type of the button */\n action?: 'primary' | '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, 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 = ({\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}: ButtonProps) => {\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 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 && <span className=\"ml-2 flex items-center\">{iconRight}</span>}\n </button>\n );\n};\n\nexport default Button;\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 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 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 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","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","import { BookOpenText } from '../../assets/icons/subjects/BookOpenText';\nimport { ChatEN } from '../../assets/icons/subjects/ChatEN';\nimport { ChatES } from '../../assets/icons/subjects/ChatES';\nimport { ChatPT } from '../../assets/icons/subjects/ChatPT';\nimport { HeadCircuit } from '../../assets/icons/subjects/HeadCircuit';\nimport { Microscope } from '../../assets/icons/subjects/Microscope';\nimport { SubjectEnum } from '../../enums/SubjectEnum';\nimport {\n ArticleNyTimes,\n Atom,\n Book,\n BookBookmark,\n DribbbleLogo,\n Flask,\n GlobeHemisphereWest,\n MathOperations,\n Palette,\n Person,\n Scroll,\n} from 'phosphor-react';\nimport { ReactElement } from 'react';\nexport interface IconProps {\n size?: number;\n color?: string;\n}\n\nexport interface SubjectData {\n icon: ReactElement<IconProps>;\n colorClass: string;\n name: string;\n}\n\nexport const SubjectInfo: Record<SubjectEnum, SubjectData> = {\n [SubjectEnum.FISICA]: {\n icon: <Atom size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-1',\n name: SubjectEnum.FISICA,\n },\n [SubjectEnum.HISTORIA]: {\n icon: <Scroll size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-2',\n name: SubjectEnum.HISTORIA,\n },\n [SubjectEnum.LITERATURA]: {\n icon: <BookOpenText size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-3',\n name: SubjectEnum.LITERATURA,\n },\n [SubjectEnum.GEOGRAFIA]: {\n icon: <GlobeHemisphereWest size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-4',\n name: SubjectEnum.GEOGRAFIA,\n },\n [SubjectEnum.BIOLOGIA]: {\n icon: <Microscope size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-5',\n name: SubjectEnum.BIOLOGIA,\n },\n [SubjectEnum.PORTUGUES]: {\n icon: <ChatPT size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-6',\n name: SubjectEnum.PORTUGUES,\n },\n [SubjectEnum.QUIMICA]: {\n icon: <Flask size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-7',\n name: SubjectEnum.QUIMICA,\n },\n [SubjectEnum.ARTES]: {\n icon: <Palette size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-8',\n name: SubjectEnum.ARTES,\n },\n [SubjectEnum.MATEMATICA]: {\n icon: <MathOperations size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-9',\n name: SubjectEnum.MATEMATICA,\n },\n [SubjectEnum.FILOSOFIA]: {\n icon: <HeadCircuit size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-10',\n name: SubjectEnum.FILOSOFIA,\n },\n [SubjectEnum.ESPANHOL]: {\n icon: <ChatES size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-11',\n name: SubjectEnum.ESPANHOL,\n },\n [SubjectEnum.REDACAO]: {\n icon: <ArticleNyTimes size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-12',\n name: SubjectEnum.REDACAO,\n },\n [SubjectEnum.SOCIOLOGIA]: {\n icon: <Person size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-13',\n name: SubjectEnum.SOCIOLOGIA,\n },\n [SubjectEnum.INGLES]: {\n icon: <ChatEN size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-14',\n name: SubjectEnum.INGLES,\n },\n [SubjectEnum.EDUCACAO_FISICA]: {\n icon: <DribbbleLogo size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-15',\n name: SubjectEnum.EDUCACAO_FISICA,\n },\n [SubjectEnum.TRILHAS]: {\n icon: <BookBookmark size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-16',\n name: SubjectEnum.TRILHAS,\n },\n};\n\nexport const getSubjectInfo = (subject: SubjectEnum): SubjectData => {\n return (\n SubjectInfo[subject] || {\n icon: <Book size={17} color=\"currentColor\" />,\n colorClass: 'bg-subject-16',\n name: subject,\n }\n );\n};\n\nexport const getSubjectIcon = (subject: SubjectEnum): ReactElement => {\n return SubjectInfo[subject].icon;\n};\n\nexport const getSubjectColorClass = (subject: SubjectEnum): string => {\n return SubjectInfo[subject].colorClass;\n};\n\nexport const getSubjectName = (subject: SubjectEnum): string => {\n return SubjectInfo[subject].name;\n};\n","/**\n * Recommended Lessons / Goals (Aulas Recomendadas) Type Definitions\n * Based on /recommended-class/history endpoint\n */\n\n/**\n * Goal status from backend API\n */\nexport enum GoalApiStatus {\n A_VENCER = 'A_VENCER',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUIDA',\n}\n\n/**\n * Goal status for display in UI (Badge component)\n */\nexport enum GoalDisplayStatus {\n ATIVA = 'ATIVA',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUÍDA',\n}\n\n/**\n * Badge action types for goal status visualization\n */\nexport enum GoalBadgeActionType {\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\n/**\n * Subject info from API response\n */\nexport interface GoalSubject {\n id: string;\n name: string;\n}\n\n/**\n * Creator info from API response\n */\nexport interface GoalCreator {\n id: string;\n name: string;\n}\n\n/**\n * Goal stats from API response\n */\nexport interface GoalStats {\n totalStudents: number;\n completedCount: number;\n completionPercentage: number;\n}\n\n/**\n * Class breakdown info from API response\n */\nexport interface GoalBreakdown {\n classId: string;\n className: string;\n schoolId: string;\n schoolName: string;\n studentCount: number;\n completedCount: number;\n}\n\n/**\n * Goal data from API response\n */\nexport interface GoalData {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n createdAt: string;\n progress: number;\n totalLessons: number;\n}\n\n/**\n * Goal history item from /recommended-class/history endpoint\n */\nexport interface GoalHistoryItem {\n goal: GoalData;\n subject: GoalSubject | null;\n creator: GoalCreator | null;\n stats: GoalStats;\n breakdown: GoalBreakdown[];\n}\n\n/**\n * Goal table item interface for goals list table\n */\nexport interface GoalTableItem extends Record<string, unknown> {\n id: string;\n startDate: string | null;\n deadline: string | null;\n title: string;\n school: string;\n year: string;\n subject: string;\n class: string;\n status: GoalDisplayStatus;\n completionPercentage: number;\n}\n\n/**\n * Goals history API complete response from /recommended-class/history\n */\nexport interface GoalsHistoryApiResponse {\n message: string;\n data: {\n goals: GoalHistoryItem[];\n total: number;\n };\n}\n\n/**\n * Goal history filters for API query parameters\n */\nexport interface GoalHistoryFilters {\n page?: number;\n limit?: number;\n status?: GoalApiStatus;\n search?: string;\n startDate?: string;\n finalDate?: string;\n subjectId?: string;\n schoolId?: string;\n schoolIds?: string[];\n classId?: string;\n classIds?: string[];\n studentIds?: string[];\n sortBy?: 'createdAt' | 'finalDate' | 'title' | 'completionPercentage';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Pagination info for goals history\n */\nexport interface GoalHistoryPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n/**\n * Filter option for dropdowns\n * Extends with index signature to be compatible with CheckBoxGroup Item type\n */\nexport interface GoalFilterOption {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * User data for filter options (schools, classes, subjects)\n */\nexport interface GoalUserFilterData {\n schools?: Array<{ id: string; name: string }>;\n classes?: Array<{ id: string; name: string; schoolId?: string }>;\n subjects?: Array<{ id: string; name: string }>;\n schoolYears?: Array<{ id: string; name: string }>;\n}\n\n/**\n * Get status badge action based on goal display status\n * @param status - Goal display status\n * @returns Badge action type for styling\n */\nexport const getGoalStatusBadgeAction = (\n status: GoalDisplayStatus\n): GoalBadgeActionType => {\n const actionMap: Record<GoalDisplayStatus, GoalBadgeActionType> = {\n [GoalDisplayStatus.CONCLUIDA]: GoalBadgeActionType.SUCCESS,\n [GoalDisplayStatus.ATIVA]: GoalBadgeActionType.WARNING,\n [GoalDisplayStatus.VENCIDA]: GoalBadgeActionType.ERROR,\n };\n return actionMap[status] ?? GoalBadgeActionType.WARNING;\n};\n\n/**\n * Goal status options for filter (Vencida and Ativa)\n */\nexport const GOAL_FILTER_STATUS_OPTIONS: GoalFilterOption[] = [\n { id: GoalApiStatus.VENCIDA, name: 'Vencida' },\n { id: GoalApiStatus.A_VENCER, name: 'Ativa' },\n];\n\n/**\n * All goal status options\n */\nexport const GOAL_STATUS_OPTIONS: GoalFilterOption[] = [\n { id: GoalApiStatus.A_VENCER, name: 'A Vencer' },\n { id: GoalApiStatus.VENCIDA, name: 'Vencida' },\n { id: GoalApiStatus.CONCLUIDA, name: 'Concluída' },\n];\n\n// ============================================\n// Recommended Lesson Details Types\n// Based on /goals/{id} and /goals/{id}/details endpoints\n// ============================================\n\n/**\n * Student status for display in UI\n */\nexport enum StudentLessonStatus {\n A_INICIAR = 'A INICIAR',\n EM_ANDAMENTO = 'EM ANDAMENTO',\n NAO_FINALIZADO = 'NÃO FINALIZADO',\n CONCLUIDO = 'CONCLUÍDO',\n}\n\n/**\n * Badge action type for student status\n */\nexport const getStudentStatusBadgeAction = (\n status: StudentLessonStatus\n): 'success' | 'warning' | 'error' | 'info' => {\n const actionMap: Record<\n StudentLessonStatus,\n 'success' | 'warning' | 'error' | 'info'\n > = {\n [StudentLessonStatus.CONCLUIDO]: 'success',\n [StudentLessonStatus.EM_ANDAMENTO]: 'info',\n [StudentLessonStatus.A_INICIAR]: 'warning',\n [StudentLessonStatus.NAO_FINALIZADO]: 'error',\n };\n return actionMap[status] ?? 'warning';\n};\n\n/**\n * Checks if a deadline has passed\n * @param deadline - ISO date string of the deadline\n * @returns true if deadline has passed, false otherwise\n */\nexport const isDeadlinePassed = (deadline: string | null): boolean => {\n if (!deadline) return false;\n return new Date(deadline) < new Date();\n};\n\n/**\n * Derives student display status from progress, completedAt, and deadline\n * @param progress - Student progress percentage (0-100)\n * @param completedAt - ISO date string when student completed, or null\n * @param deadline - ISO date string of the goal deadline, or null\n * @returns The appropriate StudentLessonStatus\n */\nexport const deriveStudentStatus = (\n progress: number,\n completedAt: string | null,\n deadline?: string | null\n): StudentLessonStatus => {\n // If completed (either by completedAt or 100% progress), it's CONCLUIDO\n if (completedAt) return StudentLessonStatus.CONCLUIDO;\n if (progress === 100) return StudentLessonStatus.CONCLUIDO;\n\n // If deadline passed and not completed, it's NAO_FINALIZADO\n if (isDeadlinePassed(deadline ?? null) && progress < 100) {\n return StudentLessonStatus.NAO_FINALIZADO;\n }\n\n // Otherwise, derive from progress\n if (progress === 0) return StudentLessonStatus.A_INICIAR;\n if (progress > 0) return StudentLessonStatus.EM_ANDAMENTO;\n return StudentLessonStatus.A_INICIAR;\n};\n\n/**\n * Formats days to complete as a readable string\n */\nexport const formatDaysToComplete = (\n daysToComplete: number | null\n): string | null => {\n if (daysToComplete === null) return null;\n if (daysToComplete === 1) return '1 dia';\n return `${daysToComplete} dias`;\n};\n\n// ============================================\n// API Response Types - /goals/{id}/details\n// ============================================\n\n/**\n * Student data from /goals/{id}/details endpoint\n */\nexport interface GoalDetailStudent {\n userInstitutionId: string;\n userId: string;\n name: string;\n progress: number;\n completedAt: string | null;\n avgScore: number | null;\n daysToComplete: number | null;\n}\n\n/**\n * Aggregated stats from /goals/{id}/details endpoint\n */\nexport interface GoalDetailAggregated {\n completionPercentage: number;\n avgScore: number | null;\n}\n\n/**\n * Content performance item from /goals/{id}/details endpoint\n */\nexport interface GoalDetailContentPerformanceItem {\n contentId: string;\n contentName: string;\n rate: number;\n}\n\n/**\n * Content performance from /goals/{id}/details endpoint\n */\nexport interface GoalDetailContentPerformance {\n best: GoalDetailContentPerformanceItem | null;\n worst: GoalDetailContentPerformanceItem | null;\n}\n\n/**\n * Response data from /goals/{id}/details endpoint\n */\nexport interface GoalDetailsData {\n students: GoalDetailStudent[];\n aggregated: GoalDetailAggregated;\n contentPerformance: GoalDetailContentPerformance;\n}\n\n/**\n * Full API response from /goals/{id}/details endpoint\n */\nexport interface GoalDetailsApiResponse {\n message: string;\n data: GoalDetailsData;\n}\n\n// ============================================\n// API Response Types - /goals/{id}\n// ============================================\n\n/**\n * Subject info from lesson in /goals/{id} response\n */\nexport interface GoalLessonSubject {\n id: string;\n name: string;\n color: string;\n icon: string;\n}\n\n/**\n * Lesson info from /goals/{id} response\n */\nexport interface GoalLesson {\n id: string;\n content: { id: string; name: string };\n subtopic: { id: string; name: string };\n topic: { id: string; name: string };\n subject: GoalLessonSubject;\n}\n\n/**\n * Lesson progress from /goals/{id} response\n */\nexport interface GoalLessonProgress {\n id: string;\n userId: string;\n lessonId: string;\n progress: number;\n lesson: GoalLesson;\n}\n\n/**\n * Lesson goal item from /goals/{id} response\n */\nexport interface GoalLessonGoalItem {\n goalId: string;\n supLessonsProgressId: string;\n supLessonsProgress: GoalLessonProgress;\n}\n\n/**\n * Goal metadata from /goals/{id} endpoint\n */\nexport interface GoalMetadata {\n id: string;\n title: string;\n startDate: string;\n finalDate: string;\n progress: number;\n lessonsGoals: GoalLessonGoalItem[];\n}\n\n/**\n * Full API response from /goals/{id} endpoint\n */\nexport interface GoalApiResponse {\n message: string;\n data: GoalMetadata;\n}\n\n// ============================================\n// Combined Data for Component\n// ============================================\n\n/**\n * Combined data structure for RecommendedLessonDetails component\n * Combines data from /goals/{id}, /goals/{id}/details, and breakdown info\n */\nexport interface LessonDetailsData {\n /** Goal metadata from /goals/{id} */\n goal: GoalMetadata;\n /** Details from /goals/{id}/details */\n details: GoalDetailsData;\n /** Optional breakdown info from /recommended-class/history */\n breakdown?: GoalBreakdown;\n}\n","import type { GoalDetailStudent } from '../../../types/recommendedLessons';\nimport {\n deriveStudentStatus,\n formatDaysToComplete,\n} from '../../../types/recommendedLessons';\nimport type { DisplayStudent } from '../types';\n\n/**\n * Format date string to display format (DD/MM/YYYY)\n * @param dateString - ISO date string or null\n * @returns Formatted date string or placeholder\n */\nexport const formatDate = (dateString: string | null): string => {\n if (!dateString) return '-';\n const date = new Date(dateString);\n if (Number.isNaN(date.getTime())) return '-';\n return date.toLocaleDateString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n};\n\n/**\n * Transform API student data to display format\n * @param student - Student data from API\n * @param deadline - Goal deadline to determine NAO_FINALIZADO status\n * @returns Transformed student for table display\n */\nexport const transformStudentForDisplay = (\n student: GoalDetailStudent,\n deadline?: string | null\n): DisplayStudent => ({\n id: student.userInstitutionId,\n name: student.name,\n status: deriveStudentStatus(student.progress, student.completedAt, deadline),\n completionPercentage: student.progress,\n duration: formatDaysToComplete(student.daysToComplete),\n});\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 {\n SkeletonText,\n SkeletonRounded,\n SkeletonTable,\n} from '../../Skeleton/Skeleton';\n\n/**\n * Loading skeleton component for RecommendedLessonDetails\n * Uses the shared Skeleton components from the library\n */\nexport const LoadingSkeleton = () => (\n <div className=\"flex flex-col gap-6\">\n {/* Breadcrumb skeleton */}\n <SkeletonText width={256} />\n\n {/* Header skeleton */}\n <div className=\"bg-background rounded-xl border border-border-50 p-6\">\n <div className=\"flex flex-col gap-3\">\n <SkeletonText width=\"75%\" height={28} />\n <SkeletonText width=\"50%\" />\n </div>\n </div>\n\n {/* Results section skeleton */}\n <div className=\"flex flex-col gap-4\">\n <SkeletonText width={192} height={20} />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <SkeletonRounded height={140} />\n <SkeletonRounded height={140} />\n <SkeletonRounded height={140} />\n </div>\n </div>\n\n {/* Table skeleton */}\n <div className=\"bg-background rounded-xl border border-border-50 p-4\">\n <SkeletonTable rows={4} columns={5} />\n </div>\n </div>\n);\n\nexport default LoadingSkeleton;\n","import { TrophyIcon, WarningIcon } from '@phosphor-icons/react';\nimport Text from '../../Text/Text';\nimport ProgressCircle from '../../ProgressCircle/ProgressCircle';\nimport type { LessonDetailsData } from '../../../types/recommendedLessons';\nimport type { LessonDetailsLabels } from '../types';\n\n/**\n * Props for ResultsSection component\n */\ninterface ResultsSectionProps {\n /** Lesson details data */\n data: LessonDetailsData;\n /** Labels for the component */\n labels: LessonDetailsLabels;\n}\n\n/**\n * Results section with 3 cards\n * Displays completion percentage, best result, and hardest topic\n */\nexport const ResultsSection = ({ data, labels }: ResultsSectionProps) => {\n const { details } = data;\n const { aggregated, contentPerformance } = details;\n\n return (\n <div className=\"flex flex-col gap-4\">\n <Text as=\"h2\" size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n {labels.resultsTitle}\n </Text>\n {/* White container with the 3 cards */}\n <div className=\"bg-background rounded-xl border border-border-50 p-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {/* Completion percentage card */}\n <div className=\"flex flex-col items-center justify-center rounded-xl p-4 min-h-28 bg-primary-50\">\n <ProgressCircle\n value={aggregated.completionPercentage}\n size=\"small\"\n variant=\"blue\"\n label={labels.completedLabel}\n showPercentage\n />\n </div>\n\n {/* Best result topic card */}\n <div className=\"flex flex-col items-center justify-center rounded-xl p-4 min-h-28 bg-success-200\">\n <Text\n as=\"span\"\n className=\"size-8 rounded-full flex items-center justify-center bg-warning-300 mb-2\"\n >\n <TrophyIcon size={18} weight=\"fill\" className=\"text-white\" />\n </Text>\n <Text\n size=\"2xs\"\n weight=\"bold\"\n className=\"text-text-700 uppercase text-center leading-none mb-1\"\n >\n {labels.bestResultLabel}\n </Text>\n <Text\n size=\"xl\"\n weight=\"bold\"\n className=\"text-success-700 text-center leading-none tracking-wide\"\n >\n {contentPerformance.best?.contentName || '-'}\n </Text>\n </div>\n\n {/* Hardest topic card */}\n <div className=\"flex flex-col items-center justify-center rounded-xl p-4 min-h-28 bg-error-100\">\n <Text\n as=\"span\"\n className=\"size-8 rounded-full flex items-center justify-center bg-error-300 mb-2\"\n >\n <WarningIcon size={18} weight=\"fill\" className=\"text-error-700\" />\n </Text>\n <Text\n size=\"2xs\"\n weight=\"bold\"\n className=\"text-text-700 uppercase text-center leading-none mb-1\"\n >\n {labels.hardestTopicLabel}\n </Text>\n <Text\n size=\"xl\"\n weight=\"bold\"\n className=\"text-error-700 text-center leading-none tracking-wide\"\n >\n {contentPerformance.worst?.contentName || '-'}\n </Text>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ResultsSection;\n","import { ReactNode } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Progress circle size variants\n */\ntype ProgressCircleSize = 'small' | 'medium';\n\n/**\n * Progress circle color variants\n */\ntype ProgressCircleVariant = 'blue' | 'green';\n\n/**\n * Size configurations using Tailwind classes\n */\nconst SIZE_CLASSES = {\n small: {\n container: 'w-[107px] h-[107px]', // 107px circle to fit labels like \"CONCLUÍDO\"\n strokeWidth: 4, // 4px stroke width - matches ProgressBar small (h-1)\n textSize: '2xl', // 24px for percentage (font-size: 24px)\n textWeight: 'medium', // font-weight: 500\n labelSize: '2xs' as const, // 10px for status label\n labelWeight: 'bold', // font-weight: 700\n spacing: 'gap-0', // Reduced gap between percentage and label for better spacing\n contentWidth: 'max-w-[85px]', // Width to fit labels like \"CONCLUÍDO\" inside circle\n },\n medium: {\n container: 'w-[152px] h-[152px]', // 151.67px ≈ 152px circle from design specs\n strokeWidth: 8, // 8px stroke width - matches ProgressBar medium (h-2)\n textSize: '2xl', // 24px for percentage (font-size: 24px)\n textWeight: 'medium', // font-weight: 500\n labelSize: 'xs' as const, // 12px for status label (font-size: 12px)\n labelWeight: 'medium', // font-weight: 500 (changed from bold)\n spacing: 'gap-1', // 4px gap between percentage and label\n contentWidth: 'max-w-[90px]', // Reduced width to fit text inside circle\n },\n} as const;\n\n/**\n * Color configurations using design system colors\n */\nconst VARIANT_CLASSES = {\n blue: {\n background: 'stroke-primary-100', // Light blue background (#BBDCF7)\n fill: 'stroke-primary-700', // Blue for activity progress (#2271C4)\n textColor: 'text-primary-700', // Blue text color (#2271C4)\n labelColor: 'text-text-700', // Gray text for label (#525252)\n },\n green: {\n background: 'stroke-background-300', // Gray background (#D5D4D4 - matches design)\n fill: 'stroke-success-200', // Green for performance (#84D3A2 - matches design)\n textColor: 'text-text-800', // Dark gray text (#404040 - matches design)\n labelColor: 'text-text-600', // Medium gray text for label (#737373 - matches design)\n },\n} as const;\n\n/**\n * ProgressCircle component props interface\n */\nexport type ProgressCircleProps = {\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 circle */\n size?: ProgressCircleSize;\n /** Color variant of the progress circle */\n variant?: ProgressCircleVariant;\n /** Optional label to display below percentage */\n label?: ReactNode;\n /** Show percentage text */\n showPercentage?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Label CSS classes */\n labelClassName?: string;\n /** Percentage text CSS classes */\n percentageClassName?: string;\n};\n\n/**\n * ProgressCircle component for Analytica Ensino platforms\n *\n * A circular progress indicator 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 * @example\n * ```tsx\n * // Basic progress circle\n * <ProgressCircle value={65} />\n *\n * // Activity progress (blue)\n * <ProgressCircle variant=\"blue\" value={45} label=\"CONCLUÍDO\" showPercentage />\n *\n * // Performance metrics (green)\n * <ProgressCircle variant=\"green\" size=\"medium\" value={85} label=\"MÉDIA\" />\n *\n * // Small size with custom max value\n * <ProgressCircle size=\"small\" value={3} max={5} showPercentage />\n * ```\n */\nconst ProgressCircle = ({\n value,\n max = 100,\n size = 'small',\n variant = 'blue',\n label,\n showPercentage = true,\n className = '',\n labelClassName = '',\n percentageClassName = '',\n}: ProgressCircleProps) => {\n // Ensure value is within bounds and handle NaN/Infinity\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 // Get size and variant classes\n const sizeClasses = SIZE_CLASSES[size];\n const variantClasses = VARIANT_CLASSES[variant];\n\n // Calculate SVG dimensions and stroke properties\n // small: 107px container, radius = (107 - strokeWidth*2) / 2 ≈ 49.5, center = 53.5\n // medium: 152px container, radius = 64, center = 76\n const radius = size === 'small' ? 49 : 64;\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference - (percentage / 100) * circumference;\n const center = size === 'small' ? 53.5 : 76;\n const svgSize = size === 'small' ? 107 : 152;\n\n return (\n <div\n className={cn(\n 'relative flex flex-col items-center justify-center',\n sizeClasses.container,\n 'rounded-lg',\n className\n )}\n >\n {/* Progress circle SVG */}\n <svg\n className=\"absolute inset-0 transform -rotate-90\"\n width={svgSize}\n height={svgSize}\n viewBox={`0 0 ${svgSize} ${svgSize}`}\n aria-hidden=\"true\"\n >\n {/* Background circle */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n strokeWidth={sizeClasses.strokeWidth}\n className={cn(variantClasses.background, 'rounded-lg')}\n />\n {/* Progress circle - SVG stroke properties require style for animation */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n strokeWidth={sizeClasses.strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n className={cn(\n variantClasses.fill,\n 'transition-all duration-500 ease-out shadow-soft-shadow-3 rounded-lg'\n )}\n />\n </svg>\n\n {/* Native progress element for accessibility */}\n <progress\n value={clampedValue}\n max={max}\n aria-label={typeof label === 'string' ? label : 'Progress'}\n className=\"absolute opacity-0 w-0 h-0\"\n />\n\n {/* Content overlay - centered content */}\n <div\n className={cn(\n 'relative z-10 flex flex-col items-center justify-center',\n sizeClasses.spacing,\n sizeClasses.contentWidth\n )}\n >\n {/* Percentage text */}\n {showPercentage && (\n <Text\n size={sizeClasses.textSize}\n weight={sizeClasses.textWeight}\n className={cn(\n 'text-center w-full',\n variantClasses.textColor,\n percentageClassName\n )}\n >\n {Math.round(percentage)}%\n </Text>\n )}\n\n {/* Label text */}\n {label && (\n <Text\n as=\"span\"\n size={sizeClasses.labelSize}\n weight={sizeClasses.labelWeight}\n className={cn(\n variantClasses.labelColor,\n 'text-center uppercase tracking-wide truncate w-full',\n labelClassName\n )}\n >\n {label}\n </Text>\n )}\n </div>\n </div>\n );\n};\n\nexport default ProgressCircle;\n","import { useCallback } from 'react';\nimport { UserIcon } from '@phosphor-icons/react';\nimport Text from '../../Text/Text';\nimport Button from '../../Button/Button';\nimport Badge from '../../Badge/Badge';\nimport ProgressBar from '../../ProgressBar/ProgressBar';\nimport Table, {\n TableHeader,\n TableBody,\n TableHead,\n TableRow,\n TableCell,\n useTableSort,\n} from '../../Table/Table';\nimport {\n StudentLessonStatus,\n getStudentStatusBadgeAction,\n} from '../../../types/recommendedLessons';\nimport type { DisplayStudent, LessonDetailsLabels } from '../types';\n\n/**\n * Props for StudentsTable component\n */\ninterface StudentsTableProps {\n /** List of students to display */\n students: DisplayStudent[];\n /** Callback when view performance button is clicked */\n onViewPerformance?: (studentId: string) => void;\n /** Labels for the component */\n labels: LessonDetailsLabels;\n /** Empty state message */\n emptyMessage?: string;\n}\n\n/**\n * Students table component\n * Displays students with their status, completion, and duration\n */\nexport const StudentsTable = ({\n students,\n onViewPerformance,\n labels,\n emptyMessage = 'Nenhum aluno encontrado',\n}: StudentsTableProps) => {\n const { sortedData, sortColumn, sortDirection, handleSort } =\n useTableSort<DisplayStudent>(students);\n\n const canViewPerformance = useCallback((student: DisplayStudent) => {\n return (\n student.status === StudentLessonStatus.CONCLUIDO ||\n student.status === StudentLessonStatus.NAO_FINALIZADO\n );\n }, []);\n\n return (\n <div className=\"bg-background rounded-xl border border-border-50 overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead\n sortable\n sortDirection={sortColumn === 'name' ? sortDirection : undefined}\n onSort={() => handleSort('name')}\n >\n {labels.studentColumn}\n </TableHead>\n <TableHead\n sortable\n sortDirection={\n sortColumn === 'status' ? sortDirection : undefined\n }\n onSort={() => handleSort('status')}\n >\n {labels.statusColumn}\n </TableHead>\n <TableHead\n sortable\n sortDirection={\n sortColumn === 'completionPercentage'\n ? sortDirection\n : undefined\n }\n onSort={() => handleSort('completionPercentage')}\n >\n {labels.completionColumn}\n </TableHead>\n <TableHead>{labels.durationColumn}</TableHead>\n <TableHead className=\"w-[140px]\" />\n </TableRow>\n </TableHeader>\n <TableBody>\n {sortedData.length === 0 ? (\n <TableRow>\n <TableCell colSpan={5} className=\"text-center py-8\">\n <Text size=\"sm\" className=\"text-text-500\">\n {emptyMessage}\n </Text>\n </TableCell>\n </TableRow>\n ) : (\n sortedData.map((student) => (\n <TableRow key={student.id}>\n <TableCell>\n <div className=\"flex items-center gap-2\">\n <Text\n as=\"span\"\n className=\"size-8 rounded-full bg-background-100 flex items-center justify-center\"\n >\n <UserIcon size={16} className=\"text-text-500\" />\n </Text>\n <Text size=\"sm\" className=\"text-text-950\">\n {student.name}\n </Text>\n </div>\n </TableCell>\n <TableCell>\n <Badge\n variant=\"solid\"\n action={getStudentStatusBadgeAction(student.status)}\n size=\"small\"\n >\n {student.status}\n </Badge>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col gap-1 min-w-[120px]\">\n <Text size=\"sm\" className=\"text-primary-700 font-medium\">\n {student.completionPercentage}%\n </Text>\n <ProgressBar\n value={student.completionPercentage}\n size=\"small\"\n variant=\"blue\"\n className=\"w-full max-w-[100px]\"\n />\n </div>\n </TableCell>\n <TableCell>\n <Text size=\"sm\" className=\"text-text-700\">\n {student.duration ?? '-'}\n </Text>\n </TableCell>\n <TableCell>\n {canViewPerformance(student) ? (\n <Button\n variant=\"outline\"\n size=\"extra-small\"\n onClick={() => onViewPerformance?.(student.id)}\n >\n {labels.viewPerformance}\n </Button>\n ) : (\n <Button variant=\"outline\" size=\"extra-small\" disabled>\n {labels.viewPerformance}\n </Button>\n )}\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n );\n};\n\nexport default StudentsTable;\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 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 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-row justify-center items-center gap-8 w-full max-w-4xl min-h-96\">\n {/* Illustration */}\n <div className=\"w-72 h-72 flex-shrink-0 relative\">\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-start w-full max-w-md\">\n {/* Header Container */}\n <div className=\"flex flex-row 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-3xl leading-tight w-full flex items-center\"\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-lg leading-relaxed w-full 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 */\n image?: string;\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\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 * <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 */\nconst EmptyState = ({\n image,\n title,\n description,\n buttonText,\n buttonIcon,\n onButtonClick,\n buttonVariant = 'solid',\n buttonAction = 'primary',\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 return (\n <div className=\"flex flex-col justify-center items-center gap-6 w-full min-h-[705px] bg-background rounded-xl p-6\">\n {/* Illustration */}\n {image && (\n <img src={image} alt={displayTitle} className=\"w-[170px] h-[150px]\" />\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\n as=\"h2\"\n className=\"text-text-950 font-semibold text-3xl leading-[35px] text-center\"\n >\n {displayTitle}\n </Text>\n\n {/* Description */}\n <Text className=\"text-text-600 font-normal text-[18px] leading-[27px] text-center\">\n {displayDescription}\n </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 type { StudentLessonStatus } from '../../types/recommendedLessons';\n\n/**\n * Internal student type for table display\n */\nexport interface DisplayStudent extends Record<string, unknown> {\n id: string;\n name: string;\n status: StudentLessonStatus;\n completionPercentage: number;\n duration: string | null;\n}\n\n/**\n * Labels for the RecommendedLessonDetails component\n */\nexport interface LessonDetailsLabels {\n viewLesson: string;\n viewPerformance: string;\n resultsTitle: string;\n completedLabel: string;\n bestResultLabel: string;\n hardestTopicLabel: string;\n studentColumn: string;\n statusColumn: string;\n completionColumn: string;\n durationColumn: string;\n}\n\n/**\n * Default labels for the component (pt-BR)\n */\nexport const DEFAULT_LABELS: LessonDetailsLabels = {\n viewLesson: 'Ver aula',\n viewPerformance: 'Ver desempenho',\n resultsTitle: 'Resultados da aula recomendada',\n completedLabel: 'CONCLUÍDO',\n bestResultLabel: 'MELHOR RESULTADO',\n hardestTopicLabel: 'MAIOR DIFICULDADE',\n studentColumn: 'Aluno',\n statusColumn: 'Status',\n completionColumn: 'Conclusão',\n durationColumn: 'Duração',\n};\n\n/**\n * Breadcrumb item type\n */\nexport interface BreadcrumbItem {\n label: string;\n path?: string;\n}\n"],"mappings":"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","names":["useMemo","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","_","jsx","jsxs","jsx","jsxs","SIZE_CLASSES","jsx","jsxs","jsx","jsxs","VARIANT_ACTION_CLASSES","SIZE_CLASSES","Fragment","jsx","jsxs","SIZE_CLASSES","VARIANT_CLASSES","forwardRef","jsx","jsxs","jsx","jsxs","jsx","jsxs","forwardRef","jsx","jsxs","jsx","jsxs","useMemo"]}
|
|
@@ -827,6 +827,10 @@
|
|
|
827
827
|
width: calc(var(--spacing) * 4.5);
|
|
828
828
|
height: calc(var(--spacing) * 4.5);
|
|
829
829
|
}
|
|
830
|
+
.size-5 {
|
|
831
|
+
width: calc(var(--spacing) * 5);
|
|
832
|
+
height: calc(var(--spacing) * 5);
|
|
833
|
+
}
|
|
830
834
|
.size-6 {
|
|
831
835
|
width: calc(var(--spacing) * 6);
|
|
832
836
|
height: calc(var(--spacing) * 6);
|
|
@@ -835,6 +839,10 @@
|
|
|
835
839
|
width: calc(var(--spacing) * 7.5);
|
|
836
840
|
height: calc(var(--spacing) * 7.5);
|
|
837
841
|
}
|
|
842
|
+
.size-8 {
|
|
843
|
+
width: calc(var(--spacing) * 8);
|
|
844
|
+
height: calc(var(--spacing) * 8);
|
|
845
|
+
}
|
|
838
846
|
.size-10 {
|
|
839
847
|
width: calc(var(--spacing) * 10);
|
|
840
848
|
height: calc(var(--spacing) * 10);
|
|
@@ -947,6 +955,9 @@
|
|
|
947
955
|
.h-\[90px\] {
|
|
948
956
|
height: 90px;
|
|
949
957
|
}
|
|
958
|
+
.h-\[107px\] {
|
|
959
|
+
height: 107px;
|
|
960
|
+
}
|
|
950
961
|
.h-\[120px\] {
|
|
951
962
|
height: 120px;
|
|
952
963
|
}
|
|
@@ -1040,6 +1051,9 @@
|
|
|
1040
1051
|
.min-h-24 {
|
|
1041
1052
|
min-height: calc(var(--spacing) * 24);
|
|
1042
1053
|
}
|
|
1054
|
+
.min-h-28 {
|
|
1055
|
+
min-height: calc(var(--spacing) * 28);
|
|
1056
|
+
}
|
|
1043
1057
|
.min-h-96 {
|
|
1044
1058
|
min-height: calc(var(--spacing) * 96);
|
|
1045
1059
|
}
|
|
@@ -1172,6 +1186,9 @@
|
|
|
1172
1186
|
.w-\[100px\] {
|
|
1173
1187
|
width: 100px;
|
|
1174
1188
|
}
|
|
1189
|
+
.w-\[107px\] {
|
|
1190
|
+
width: 107px;
|
|
1191
|
+
}
|
|
1175
1192
|
.w-\[110px\] {
|
|
1176
1193
|
width: 110px;
|
|
1177
1194
|
}
|
|
@@ -1184,6 +1201,9 @@
|
|
|
1184
1201
|
.w-\[131px\] {
|
|
1185
1202
|
width: 131px;
|
|
1186
1203
|
}
|
|
1204
|
+
.w-\[140px\] {
|
|
1205
|
+
width: 140px;
|
|
1206
|
+
}
|
|
1187
1207
|
.w-\[152px\] {
|
|
1188
1208
|
width: 152px;
|
|
1189
1209
|
}
|
|
@@ -1251,12 +1271,15 @@
|
|
|
1251
1271
|
.max-w-20 {
|
|
1252
1272
|
max-width: calc(var(--spacing) * 20);
|
|
1253
1273
|
}
|
|
1254
|
-
.max-w-\[
|
|
1255
|
-
max-width:
|
|
1274
|
+
.max-w-\[85px\] {
|
|
1275
|
+
max-width: 85px;
|
|
1256
1276
|
}
|
|
1257
1277
|
.max-w-\[90px\] {
|
|
1258
1278
|
max-width: 90px;
|
|
1259
1279
|
}
|
|
1280
|
+
.max-w-\[100px\] {
|
|
1281
|
+
max-width: 100px;
|
|
1282
|
+
}
|
|
1260
1283
|
.max-w-\[140px\] {
|
|
1261
1284
|
max-width: 140px;
|
|
1262
1285
|
}
|
|
@@ -3117,6 +3140,9 @@
|
|
|
3117
3140
|
.py-8 {
|
|
3118
3141
|
padding-block: calc(var(--spacing) * 8);
|
|
3119
3142
|
}
|
|
3143
|
+
.py-12 {
|
|
3144
|
+
padding-block: calc(var(--spacing) * 12);
|
|
3145
|
+
}
|
|
3120
3146
|
.py-\[17px\] {
|
|
3121
3147
|
padding-block: 17px;
|
|
3122
3148
|
}
|