analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
1 lines • 51.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/components/ComparatorChart/ComparatorView.tsx","../src/components/ComparatorChart/ComparatorEmptyState.tsx","../src/components/ComparatorChart/ComparatorLoadingState.tsx","../src/components/ComparatorChart/ComparatorSelectTypeStep.tsx","../src/components/ComparatorChart/ComparatorSelectItemsStep.tsx","../src/components/ComparatorChart/Legend.tsx","../src/components/ComparatorChart/PercentageScale.tsx","../src/components/ComparatorChart/ChartArea.tsx","../src/components/ComparatorChart/BarChartRow.tsx","../src/components/ComparatorChart/KnowledgeAreasContent.tsx","../src/components/ComparatorChart/CurricularComponentsContent.tsx","../src/components/ComparatorChart/CompetenciesContent.tsx","../src/components/ComparatorChart/NationalAverageCard.tsx","../src/components/ComparatorChart/NationalAveragesContent.tsx","../src/components/ComparatorChart/ComparatorTabContent.tsx"],"sourcesContent":["import { useState, useMemo, useCallback, useEffect, useRef } from 'react';\nimport { CaretLeftIcon } from '@phosphor-icons/react/dist/csr/CaretLeft';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport Modal from '../Modal/Modal';\nimport type { SearchSelectOption } from '../SearchSelect/SearchSelect';\nimport { ComparatorEmptyState } from './ComparatorEmptyState';\nimport { ComparatorLoadingState } from './ComparatorLoadingState';\nimport { ComparatorSelectTypeStep } from './ComparatorSelectTypeStep';\nimport { ComparatorSelectItemsStep } from './ComparatorSelectItemsStep';\nimport { ComparatorTabContent } from './ComparatorTabContent';\nimport {\n ComparatorTabValue,\n DEFAULT_COMPARATOR_LABELS,\n DEFAULT_COMPARATOR_TABS,\n type ComparisonType,\n type ComparatorTabType,\n type ComparatorStoreState,\n type UseComparatorReturn,\n type ComparatorLabels,\n type ComparatorTab,\n} from '../../types/comparator';\n\nexport interface ComparatorViewProps {\n // Data sources\n readonly schools: SearchSelectOption[];\n readonly schoolYears: SearchSelectOption[];\n\n // Store hooks (injected)\n readonly useComparatorStore: () => ComparatorStoreState;\n readonly useComparator: () => UseComparatorReturn;\n\n // Navigation\n readonly onBack?: () => void;\n\n // Tab management\n readonly activeTab?: ComparatorTabType;\n readonly onTabChange?: (tab: ComparatorTabType) => void;\n readonly tabs?: ComparatorTab[];\n\n // Customization\n readonly labels?: Partial<ComparatorLabels>;\n readonly isUserLoading?: boolean;\n\n // Callbacks\n readonly onFetchUserData?: (force?: boolean) => void;\n}\n\nexport function ComparatorView({\n schools,\n schoolYears,\n useComparatorStore,\n useComparator,\n onBack,\n activeTab: externalActiveTab,\n onTabChange,\n tabs = DEFAULT_COMPARATOR_TABS,\n labels: customLabels,\n isUserLoading = false,\n onFetchUserData,\n}: ComparatorViewProps) {\n const labels = useMemo(\n () => ({ ...DEFAULT_COMPARATOR_LABELS, ...customLabels }),\n [customLabels]\n );\n\n // Store state\n const {\n comparisonType,\n selectedItems,\n setComparisonType,\n addItem,\n removeItem,\n clearSelection,\n } = useComparatorStore();\n\n // Data hook\n const { data, loading, fetchData } = useComparator();\n\n // Local UI state\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [modalStep, setModalStep] = useState<1 | 2>(1);\n const [internalActiveTab, setInternalActiveTab] = useState<ComparatorTabType>(\n ComparatorTabValue.KNOWLEDGE_AREAS\n );\n const hasInitializedRef = useRef(false);\n\n // Use external tab if provided, otherwise internal\n const activeTab = externalActiveTab ?? internalActiveTab;\n\n // Determine comparison availability\n const canCompareSchools = schools.length > 1;\n const canCompareSchoolYears = schoolYears.length > 1;\n const hasAnyComparisonOption = canCompareSchools || canCompareSchoolYears;\n\n // Fetch user data on mount\n useEffect(() => {\n onFetchUserData?.(true);\n }, [onFetchUserData]);\n\n // Load comparison data on mount if there are persisted selections\n useEffect(() => {\n if (hasInitializedRef.current) return;\n if (selectedItems.length > 0 && comparisonType) {\n hasInitializedRef.current = true;\n fetchData(\n selectedItems.map((i) => i.id),\n comparisonType,\n activeTab\n );\n }\n }, [selectedItems, comparisonType, activeTab, fetchData]);\n\n // Options based on comparison type\n const options = useMemo((): SearchSelectOption[] => {\n if (comparisonType === 'school') return schools;\n if (comparisonType === 'schoolYear') return schoolYears;\n return [];\n }, [comparisonType, schools, schoolYears]);\n\n // Filter out already selected items\n const availableOptions = useMemo(() => {\n return options.filter(\n (opt) => !selectedItems.some((item) => item.id === opt.value)\n );\n }, [options, selectedItems]);\n\n // Handlers\n const handleTabChange = useCallback(\n (tab: ComparatorTabType) => {\n if (onTabChange) {\n onTabChange(tab);\n } else {\n setInternalActiveTab(tab);\n }\n\n if (selectedItems.length > 0 && comparisonType) {\n fetchData(\n selectedItems.map((i) => i.id),\n comparisonType,\n tab\n );\n }\n },\n [selectedItems, comparisonType, onTabChange, fetchData]\n );\n\n const handleOpenModal = useCallback(() => {\n if (comparisonType) {\n setModalStep(2);\n setIsModalOpen(true);\n return;\n }\n\n if (canCompareSchools && !canCompareSchoolYears) {\n setComparisonType('school');\n setModalStep(2);\n } else if (canCompareSchoolYears && !canCompareSchools) {\n setComparisonType('schoolYear');\n setModalStep(2);\n } else {\n setModalStep(1);\n }\n setIsModalOpen(true);\n }, [\n comparisonType,\n canCompareSchools,\n canCompareSchoolYears,\n setComparisonType,\n ]);\n\n const handleSelectType = useCallback(\n (type: ComparisonType) => {\n clearSelection();\n setComparisonType(type);\n setModalStep(2);\n },\n [clearSelection, setComparisonType]\n );\n\n const handleSelectItem = useCallback(\n (value: string) => {\n if (selectedItems.length >= 5) return;\n\n const option = options.find((opt) => opt.value === value);\n if (!option) return;\n\n addItem({\n id: option.value,\n name: option.label,\n color: '',\n });\n },\n [options, selectedItems.length, addItem]\n );\n\n const handleRemoveItem = useCallback(\n (itemId: string) => {\n removeItem(itemId);\n },\n [removeItem]\n );\n\n const handleConfirmSelection = useCallback(() => {\n setIsModalOpen(false);\n if (selectedItems.length > 0 && comparisonType) {\n fetchData(\n selectedItems.map((i) => i.id),\n comparisonType,\n activeTab\n );\n }\n }, [selectedItems, comparisonType, activeTab, fetchData]);\n\n const handleCloseModal = useCallback(() => {\n setIsModalOpen(false);\n }, []);\n\n const handleChangeType = useCallback(() => {\n setModalStep(1);\n clearSelection();\n }, [clearSelection]);\n\n // Get button text\n const buttonText = useMemo(() => {\n if (selectedItems.length > 0) {\n return comparisonType === 'school'\n ? labels.selectSchools\n : labels.selectSchoolYears;\n }\n if (canCompareSchools && canCompareSchoolYears) {\n return labels.selectComparison;\n }\n return canCompareSchools ? labels.selectSchools : labels.selectSchoolYears;\n }, [\n selectedItems.length,\n comparisonType,\n canCompareSchools,\n canCompareSchoolYears,\n labels,\n ]);\n\n const renderMainContent = () => {\n if (selectedItems.length === 0) {\n return (\n <ComparatorEmptyState\n onSelectClick={handleOpenModal}\n canCompareSchools={canCompareSchools}\n canCompareSchoolYears={canCompareSchoolYears}\n isLoading={isUserLoading}\n labels={labels}\n />\n );\n }\n\n if (loading) {\n return <ComparatorLoadingState />;\n }\n\n return (\n <ComparatorTabContent\n activeTab={activeTab}\n data={data}\n selectedItems={selectedItems}\n labels={labels}\n />\n );\n };\n\n return (\n <div className=\"h-screen bg-background flex flex-col\">\n {/* Header */}\n <header className=\"flex items-center justify-between px-6 py-4 border-b border-border-100 bg-secondary-50\">\n {onBack ? (\n <Button\n variant=\"raw\"\n onClick={onBack}\n className=\"flex items-center gap-2 text-text-950 hover:text-text-700 transition-colors\"\n >\n <CaretLeftIcon size={20} weight=\"bold\" />\n <Text size=\"lg\" weight=\"semibold\">\n {labels.title}\n </Text>\n </Button>\n ) : (\n <div className=\"flex items-center gap-2 text-text-950\">\n <Text size=\"lg\" weight=\"semibold\">\n {labels.title}\n </Text>\n </div>\n )}\n <Button\n variant=\"solid\"\n action=\"primary\"\n size=\"medium\"\n onClick={handleOpenModal}\n disabled={!hasAnyComparisonOption || isUserLoading}\n >\n {buttonText}\n </Button>\n </header>\n\n {/* Tabs */}\n <div className=\"flex gap-2 px-6 py-4 border-b border-border-100 bg-secondary-50\">\n {tabs.map((tab) => (\n <Button\n variant=\"raw\"\n key={tab.value}\n onClick={() => handleTabChange(tab.value)}\n className={`px-4 py-2 text-sm font-medium transition-colors ${\n activeTab === tab.value\n ? 'text-primary-700 border-b-2 border-primary-600'\n : 'text-text-500 hover:text-text-700'\n }`}\n >\n {tab.label}\n </Button>\n ))}\n </div>\n\n {/* Content */}\n <main className=\"flex-1 overflow-auto p-6\">{renderMainContent()}</main>\n\n {/* Selection Modal */}\n <Modal\n isOpen={isModalOpen}\n onClose={handleCloseModal}\n title={labels.filters}\n size=\"md\"\n footer={\n modalStep === 2 ? (\n <div className=\"flex justify-end gap-3 w-full\">\n <Button variant=\"outline\" onClick={handleChangeType}>\n {labels.back}\n </Button>\n <Button\n variant=\"solid\"\n action=\"primary\"\n onClick={handleConfirmSelection}\n disabled={selectedItems.length === 0}\n >\n {labels.confirm} ({selectedItems.length}/5)\n </Button>\n </div>\n ) : undefined\n }\n >\n {modalStep === 1 ? (\n <ComparatorSelectTypeStep\n onSelectType={handleSelectType}\n canCompareSchools={canCompareSchools}\n canCompareSchoolYears={canCompareSchoolYears}\n labels={labels}\n />\n ) : (\n <ComparatorSelectItemsStep\n options={availableOptions}\n selectedItems={selectedItems}\n onSelectItem={handleSelectItem}\n onRemoveItem={handleRemoveItem}\n comparisonType={comparisonType!}\n labels={labels}\n />\n )}\n </Modal>\n </div>\n );\n}\n","import { PlusIcon } from '@phosphor-icons/react/dist/csr/Plus';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport type { ComparatorLabels } from '../../types/comparator';\nimport { DEFAULT_COMPARATOR_LABELS } from '../../types/comparator';\n\nexport interface ComparatorEmptyStateProps {\n readonly onSelectClick: () => void;\n readonly canCompareSchools: boolean;\n readonly canCompareSchoolYears: boolean;\n readonly isLoading?: boolean;\n readonly labels?: Partial<ComparatorLabels>;\n}\n\nexport function ComparatorEmptyState({\n onSelectClick,\n canCompareSchools,\n canCompareSchoolYears,\n isLoading = false,\n labels: customLabels,\n}: ComparatorEmptyStateProps) {\n const labels = { ...DEFAULT_COMPARATOR_LABELS, ...customLabels };\n const hasAnyOption = canCompareSchools || canCompareSchoolYears;\n\n const getButtonText = (): string => {\n if (canCompareSchools && canCompareSchoolYears) {\n return labels.selectComparison;\n }\n if (canCompareSchools) {\n return labels.selectSchools;\n }\n return labels.selectSchoolYears;\n };\n\n const getDescriptionText = (): string => {\n if (canCompareSchools && canCompareSchoolYears) {\n return labels.emptyStateDescriptionBoth;\n }\n if (canCompareSchools) {\n return labels.emptyStateDescriptionSchools;\n }\n if (canCompareSchoolYears) {\n return labels.emptyStateDescriptionSchoolYears;\n }\n return labels.noAccessMessage;\n };\n\n const buttonText = getButtonText();\n const descriptionText = getDescriptionText();\n\n return (\n <div className=\"flex flex-col items-center justify-center h-full gap-6\">\n <div className=\"w-24 h-24 rounded-full bg-primary-100 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-primary-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"\n />\n </svg>\n </div>\n <div className=\"text-center\">\n <Text size=\"lg\" weight=\"semibold\" className=\"text-text-950 mb-2\">\n {labels.title}\n </Text>\n <Text size=\"sm\" className=\"text-text-500\">\n {descriptionText}\n </Text>\n </div>\n {hasAnyOption && (\n <Button\n variant=\"outline\"\n action=\"primary\"\n size=\"medium\"\n onClick={onSelectClick}\n disabled={isLoading}\n >\n <PlusIcon size={18} />\n {buttonText}\n </Button>\n )}\n </div>\n );\n}\n","import { SkeletonCard } from '../Skeleton/Skeleton';\n\nexport function ComparatorLoadingState() {\n return (\n <div\n className=\"flex flex-col gap-6\"\n data-testid=\"comparator-loading-skeleton\"\n >\n <SkeletonCard className=\"h-12 w-full\" />\n <SkeletonCard className=\"h-64 w-full\" />\n <SkeletonCard className=\"h-64 w-full\" />\n </div>\n );\n}\n","import Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport type { ComparisonType, ComparatorLabels } from '../../types/comparator';\nimport { DEFAULT_COMPARATOR_LABELS } from '../../types/comparator';\n\nexport interface ComparatorSelectTypeStepProps {\n readonly onSelectType: (type: ComparisonType) => void;\n readonly canCompareSchools: boolean;\n readonly canCompareSchoolYears: boolean;\n readonly labels?: Partial<ComparatorLabels>;\n}\n\nexport function ComparatorSelectTypeStep({\n onSelectType,\n canCompareSchools,\n canCompareSchoolYears,\n labels: customLabels,\n}: ComparatorSelectTypeStepProps) {\n const labels = { ...DEFAULT_COMPARATOR_LABELS, ...customLabels };\n\n if (!canCompareSchools && !canCompareSchoolYears) {\n return (\n <div className=\"flex flex-col gap-4\">\n <Text size=\"sm\" className=\"text-text-600\">\n {labels.noAccessMessage}\n </Text>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <Text size=\"sm\" className=\"text-text-600\">\n {labels.selectComparisonType}\n </Text>\n <div className=\"flex gap-4\">\n {canCompareSchools && (\n <Button\n variant=\"raw\"\n onClick={() => onSelectType('school')}\n className=\"flex-1 p-4 border border-border-200 rounded-xl hover:border-primary-500 hover:bg-primary-50 transition-colors text-left\"\n >\n <Text size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n {labels.schools}\n </Text>\n <Text size=\"sm\" className=\"text-text-500\">\n {labels.compareSchoolsDescription}\n </Text>\n </Button>\n )}\n {canCompareSchoolYears && (\n <Button\n variant=\"raw\"\n onClick={() => onSelectType('schoolYear')}\n className=\"flex-1 p-4 border border-border-200 rounded-xl hover:border-primary-500 hover:bg-primary-50 transition-colors text-left\"\n >\n <Text size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n {labels.schoolYears}\n </Text>\n <Text size=\"sm\" className=\"text-text-500\">\n {labels.compareSchoolYearsDescription}\n </Text>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","import { XIcon } from '@phosphor-icons/react/dist/csr/X';\nimport Text from '../Text/Text';\nimport Button from '../Button/Button';\nimport Badge from '../Badge/Badge';\nimport SearchSelect from '../SearchSelect/SearchSelect';\nimport type { SearchSelectOption } from '../SearchSelect/SearchSelect';\nimport type {\n ComparisonType,\n ComparisonItem,\n ComparatorLabels,\n} from '../../types/comparator';\nimport { DEFAULT_COMPARATOR_LABELS } from '../../types/comparator';\n\nexport interface ComparatorSelectItemsStepProps {\n readonly options: SearchSelectOption[];\n readonly selectedItems: ComparisonItem[];\n readonly onSelectItem: (value: string) => void;\n readonly onRemoveItem: (itemId: string) => void;\n readonly comparisonType: ComparisonType;\n readonly labels?: Partial<ComparatorLabels>;\n}\n\nexport function ComparatorSelectItemsStep({\n options,\n selectedItems,\n onSelectItem,\n onRemoveItem,\n comparisonType,\n labels: customLabels,\n}: ComparatorSelectItemsStepProps) {\n const labels = { ...DEFAULT_COMPARATOR_LABELS, ...customLabels };\n const isMaxReached = selectedItems.length >= 5;\n const placeholder =\n comparisonType === 'school' ? labels.schools : labels.schoolYears;\n const itemTypeName =\n comparisonType === 'school'\n ? labels.schools.toLowerCase()\n : labels.schoolYears.toLowerCase();\n const singularItemTypeName =\n comparisonType === 'school' ? labels.school : labels.schoolYear;\n\n return (\n <div className=\"flex flex-col gap-4\">\n <Text size=\"sm\" className=\"text-text-600\">\n {labels.selectItemInstruction.replace('{item}', singularItemTypeName)}\n </Text>\n\n <SearchSelect\n options={options}\n placeholder={placeholder}\n searchPlaceholder={`${labels.search} ${placeholder.toLowerCase()}...`}\n onValueChange={onSelectItem}\n disabled={isMaxReached}\n emptyText=\"Nenhum resultado encontrado\"\n size=\"medium\"\n variant=\"outlined\"\n />\n\n {selectedItems.length > 0 && (\n <div className=\"flex flex-wrap gap-2 p-3 bg-secondary-50 rounded-xl border border-border-100\">\n {selectedItems.map((item) => (\n <Badge\n key={item.id}\n variant=\"outlined\"\n action=\"info\"\n size=\"medium\"\n className=\"flex items-center gap-1 pr-1\"\n >\n <span\n className=\"w-2 h-2 rounded-full mr-1\"\n style={{ backgroundColor: item.color }}\n />\n <span className=\"truncate max-w-[200px]\">{item.name}</span>\n <Button\n variant=\"raw\"\n onClick={() => onRemoveItem(item.id)}\n className=\"ml-1 p-0.5 rounded-full hover:bg-secondary-200 transition-colors\"\n aria-label={`Remover ${item.name}`}\n >\n <XIcon size={14} />\n </Button>\n </Badge>\n ))}\n </div>\n )}\n\n {isMaxReached && (\n <Text size=\"xs\" className=\"text-warning-600\">\n {labels.maxLimitWarning}\n </Text>\n )}\n\n <Text size=\"xs\" className=\"text-text-500\">\n {selectedItems.length} de 5 {itemTypeName} {labels.ofSelected}\n </Text>\n </div>\n );\n}\n","import Text from '../Text/Text';\n\nexport interface LegendItem {\n id: string;\n name: string;\n color: string;\n}\n\nexport interface LegendProps {\n readonly items: LegendItem[];\n}\n\nexport function Legend({ items }: LegendProps) {\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-wrap gap-4 items-center\">\n {items.map((item) => (\n <div key={item.id} className=\"flex items-center gap-2\">\n <div\n className=\"w-3 h-3 rounded-full\"\n style={{ backgroundColor: item.color }}\n />\n <Text size=\"sm\" className=\"text-text-700\">\n {item.name}\n </Text>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import Text from '../Text/Text';\n\nexport function PercentageScale() {\n return (\n <div className=\"flex items-center gap-4 mb-2 border-b border-border-100 pb-2\">\n {/* Spacer for label column (matches BarChartRow label width) */}\n <div className=\"w-64 shrink-0\" />\n {/* Scale markers */}\n <div className=\"flex-1 flex justify-between px-1\">\n <Text size=\"xs\" className=\"text-text-400\">\n 0%\n </Text>\n <Text size=\"xs\" className=\"text-text-400\">\n 25%\n </Text>\n <Text size=\"xs\" className=\"text-text-400\">\n 50%\n </Text>\n <Text size=\"xs\" className=\"text-text-400\">\n 75%\n </Text>\n <Text size=\"xs\" className=\"text-text-400\">\n 100%\n </Text>\n </div>\n </div>\n );\n}\n","import { ReactNode } from 'react';\n\nexport interface ChartAreaProps {\n readonly children: ReactNode;\n}\n\nexport function ChartArea({ children }: ChartAreaProps) {\n return (\n <div className=\"relative\">\n {/* Grid lines */}\n <div className=\"absolute inset-0 flex items-stretch pointer-events-none gap-4\">\n {/* Spacer for label column (matches BarChartRow label width) */}\n <div className=\"w-64 shrink-0\" />\n <div className=\"flex-1 flex\">\n <div className=\"w-1/4 border-r border-dashed border-border-200\" />\n <div className=\"w-1/4 border-r border-dashed border-border-200\" />\n <div className=\"w-1/4 border-r border-dashed border-border-200\" />\n <div className=\"w-1/4\" />\n </div>\n </div>\n {/* Content */}\n <div className=\"relative space-y-6\">{children}</div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport Text from '../Text/Text';\nimport type { LegendItem } from './Legend';\n\nexport interface BarChartValue {\n itemId: string;\n percentage: number;\n}\n\nexport interface BarChartRowProps {\n readonly label: string;\n readonly values: BarChartValue[];\n readonly items: LegendItem[];\n}\n\nexport function BarChartRow({ label, values, items }: BarChartRowProps) {\n const [hoveredItem, setHoveredItem] = useState<string | null>(null);\n\n return (\n <div className=\"flex items-center gap-4\">\n <Text size=\"sm\" className=\"text-text-700 w-64 shrink-0\">\n {label}\n </Text>\n <div className=\"flex-1 space-y-1.5\">\n {items.map((item) => {\n const value = values.find((v) => v.itemId === item.id);\n const percentage = value?.percentage ?? 0;\n const clampedPercentage = Math.max(0, Math.min(percentage, 100));\n const isHovered = hoveredItem === item.id;\n\n return (\n <div\n key={item.id}\n className=\"relative group\"\n onMouseEnter={() => setHoveredItem(item.id)}\n onMouseLeave={() => setHoveredItem(null)}\n >\n <div className=\"flex-1 h-5 bg-secondary-100 rounded-full overflow-hidden relative\">\n <div\n className={`h-full rounded-full transition-all duration-500 ${\n isHovered ? 'opacity-90' : ''\n }`}\n style={{\n width: `${clampedPercentage}%`,\n backgroundColor: item.color,\n minWidth: clampedPercentage > 0 ? '8px' : '0px',\n }}\n />\n </div>\n {/* Tooltip */}\n {isHovered && (\n <div\n className=\"absolute z-10 px-2 py-1 bg-text-900 rounded shadow-lg whitespace-nowrap\"\n style={{\n left: `${Math.min(Math.max(percentage, 5), 95)}%`,\n top: '-28px',\n transform: 'translateX(-50%)',\n }}\n >\n <Text size=\"xs\" weight=\"medium\" className=\"text-white\">\n {item.name}: {percentage.toFixed(1)}%\n </Text>\n <div\n className=\"absolute w-2 h-2 bg-text-900 rotate-45\"\n style={{\n left: '50%',\n bottom: '-4px',\n transform: 'translateX(-50%)',\n }}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import Text from '../Text/Text';\nimport { Legend } from './Legend';\nimport { PercentageScale } from './PercentageScale';\nimport { ChartArea } from './ChartArea';\nimport { BarChartRow } from './BarChartRow';\nimport type { KnowledgeAreaData, ComparisonItem } from '../../types/comparator';\n\nexport interface KnowledgeAreasContentProps {\n readonly data: KnowledgeAreaData[];\n readonly items: ComparisonItem[];\n readonly title?: string;\n}\n\nexport function KnowledgeAreasContent({\n data,\n items,\n title = 'Proficiência média das escolas por área do Enem',\n}: KnowledgeAreasContentProps) {\n return (\n <div className=\"bg-secondary-50 rounded-2xl p-6\">\n <div className=\"mb-6\">\n <Text size=\"md\" weight=\"semibold\" className=\"text-text-950 mb-4\">\n {title}\n </Text>\n <Legend items={items} />\n </div>\n <PercentageScale />\n <ChartArea>\n {data.map((area) => (\n <BarChartRow\n key={area.area}\n label={area.area}\n values={area.values}\n items={items}\n />\n ))}\n </ChartArea>\n </div>\n );\n}\n","import Text from '../Text/Text';\nimport { Legend } from './Legend';\nimport { PercentageScale } from './PercentageScale';\nimport { ChartArea } from './ChartArea';\nimport { BarChartRow } from './BarChartRow';\nimport type {\n CurricularComponentData,\n ComparisonItem,\n} from '../../types/comparator';\n\nexport interface CurricularComponentsContentProps {\n readonly data: CurricularComponentData[];\n readonly items: ComparisonItem[];\n readonly title?: string;\n}\n\nexport function CurricularComponentsContent({\n data,\n items,\n title = 'Proficiência média por componente curricular',\n}: CurricularComponentsContentProps) {\n return (\n <div className=\"bg-secondary-50 rounded-2xl p-6\">\n <div className=\"mb-6\">\n <Text size=\"md\" weight=\"semibold\" className=\"text-text-950 mb-4\">\n {title}\n </Text>\n <Legend items={items} />\n </div>\n <PercentageScale />\n <ChartArea>\n {data.map((component) => (\n <BarChartRow\n key={component.component}\n label={component.component}\n values={component.values}\n items={items}\n />\n ))}\n </ChartArea>\n </div>\n );\n}\n","import Text from '../Text/Text';\nimport { Legend } from './Legend';\nimport { PercentageScale } from './PercentageScale';\nimport { ChartArea } from './ChartArea';\nimport { BarChartRow } from './BarChartRow';\nimport type { CompetencyData, ComparisonItem } from '../../types/comparator';\n\nexport interface CompetenciesContentProps {\n readonly data: CompetencyData[];\n readonly items: ComparisonItem[];\n readonly title?: string;\n}\n\nexport function CompetenciesContent({\n data,\n items,\n title = 'Proficiência média por competência',\n}: CompetenciesContentProps) {\n return (\n <div className=\"bg-secondary-50 rounded-2xl p-6\">\n <div className=\"mb-6\">\n <Text size=\"md\" weight=\"semibold\" className=\"text-text-950 mb-4\">\n {title}\n </Text>\n <Legend items={items} />\n </div>\n <PercentageScale />\n <ChartArea>\n {data.map((competency) => (\n <BarChartRow\n key={competency.competency}\n label={competency.competency}\n values={competency.values}\n items={items}\n />\n ))}\n </ChartArea>\n </div>\n );\n}\n","import Text from '../Text/Text';\nimport Badge from '../Badge/Badge';\nimport type {\n NationalAverageData,\n ComparatorLabels,\n} from '../../types/comparator';\nimport { DEFAULT_COMPARATOR_LABELS } from '../../types/comparator';\n\nexport interface NationalAverageCardProps {\n readonly data: NationalAverageData;\n readonly color?: string;\n readonly labels?: Partial<ComparatorLabels>;\n}\n\nconst DETAIL_LABELS = [\n { key: 'languages', label: 'LINGUAGENS, CÓDIGOS E SUAS TECNOLOGIAS' },\n { key: 'humanities', label: 'CIÊNCIAS HUMANAS E SUAS TECNOLOGIAS' },\n { key: 'essay', label: 'REDAÇÃO' },\n { key: 'naturalSciences', label: 'CIÊNCIAS DA NATUREZA E SUAS TECNOLOGIAS' },\n { key: 'mathematics', label: 'MATEMÁTICA E SUAS TECNOLOGIAS' },\n] as const;\n\nexport function NationalAverageCard({\n data,\n color,\n labels: customLabels,\n}: NationalAverageCardProps) {\n const labels = { ...DEFAULT_COMPARATOR_LABELS, ...customLabels };\n\n return (\n <div className=\"bg-secondary-50 rounded-2xl p-6\">\n <Text size=\"md\" weight=\"semibold\" className=\"text-text-950 mb-4\">\n {data.itemName}\n </Text>\n\n {/* Main scores */}\n <div className=\"grid grid-cols-3 gap-4 mb-6\">\n <div\n className=\"bg-background rounded-xl p-4 text-center border-l-4\"\n style={{ borderColor: color }}\n >\n <Text size=\"2xl\" weight=\"bold\" className=\"text-primary-700\">\n {data.simulatedProficiency.toFixed(1)}\n </Text>\n <Text size=\"xs\" className=\"text-text-500 uppercase\">\n {labels.simulatedProficiency}\n </Text>\n </div>\n <div className=\"bg-warning-50 rounded-xl p-4 text-center\">\n <Text size=\"2xl\" weight=\"bold\" className=\"text-warning-700\">\n {data.publicAverage}\n </Text>\n <Text size=\"xs\" className=\"text-text-500 uppercase\">\n {labels.publicSchoolAverage}\n </Text>\n </div>\n <div className=\"bg-success-50 rounded-xl p-4 text-center\">\n <Text size=\"2xl\" weight=\"bold\" className=\"text-success-700\">\n {data.privateAverage}\n </Text>\n <Text size=\"xs\" className=\"text-text-500 uppercase\">\n {labels.privateSchoolAverage}\n </Text>\n </div>\n </div>\n\n {/* Detail scores */}\n <div className=\"grid grid-cols-5 gap-4 mb-4\">\n {DETAIL_LABELS.map(({ key, label }) => (\n <div key={key} className=\"bg-background rounded-xl p-3 text-center\">\n <Text\n size=\"xs\"\n className=\"text-text-500 uppercase mb-1 line-clamp-2\"\n >\n {label}\n </Text>\n <Text size=\"lg\" weight=\"bold\" className=\"text-primary-700\">\n {data.details[key]}\n </Text>\n </div>\n ))}\n </div>\n\n {/* Status */}\n <Badge\n variant=\"solid\"\n action={data.status === 'above' ? 'success' : 'warning'}\n size=\"medium\"\n className=\"w-full justify-center py-3\"\n >\n {data.status === 'above' ? labels.aboveAverage : labels.belowAverage}\n </Badge>\n </div>\n );\n}\n","import Text from '../Text/Text';\nimport { NationalAverageCard } from './NationalAverageCard';\nimport type {\n NationalAverageData,\n ComparisonItem,\n ComparatorLabels,\n} from '../../types/comparator';\nimport { DEFAULT_COMPARATOR_LABELS } from '../../types/comparator';\n\nexport interface NationalAveragesContentProps {\n readonly data: NationalAverageData[];\n readonly items: ComparisonItem[];\n readonly title?: string;\n readonly labels?: Partial<ComparatorLabels>;\n}\n\nexport function NationalAveragesContent({\n data,\n items,\n title,\n labels: customLabels,\n}: NationalAveragesContentProps) {\n const labels = { ...DEFAULT_COMPARATOR_LABELS, ...customLabels };\n\n return (\n <div className=\"space-y-6\">\n <Text size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n {title || labels.nationalAveragesTitle}\n </Text>\n {data.map((item) => {\n const selectedItem = items.find((i) => i.id === item.itemId);\n return (\n <NationalAverageCard\n key={item.itemId}\n data={item}\n color={selectedItem?.color}\n labels={labels}\n />\n );\n })}\n </div>\n );\n}\n","import { KnowledgeAreasContent } from './KnowledgeAreasContent';\nimport { CurricularComponentsContent } from './CurricularComponentsContent';\nimport { CompetenciesContent } from './CompetenciesContent';\nimport { NationalAveragesContent } from './NationalAveragesContent';\nimport {\n ComparatorTabValue,\n type ComparatorTabType,\n type ComparatorData,\n type ComparisonItem,\n type ComparatorLabels,\n} from '../../types/comparator';\n\nexport interface ComparatorTabContentProps {\n readonly activeTab: ComparatorTabType;\n readonly data: ComparatorData;\n readonly selectedItems: ComparisonItem[];\n readonly labels?: Partial<ComparatorLabels>;\n}\n\nexport function ComparatorTabContent({\n activeTab,\n data,\n selectedItems,\n labels,\n}: ComparatorTabContentProps) {\n switch (activeTab) {\n case ComparatorTabValue.KNOWLEDGE_AREAS:\n return (\n <KnowledgeAreasContent\n data={data.knowledgeAreas}\n items={selectedItems}\n title={labels?.knowledgeAreasTitle}\n />\n );\n case ComparatorTabValue.CURRICULAR_COMPONENTS:\n return (\n <CurricularComponentsContent\n data={data.curricularComponents}\n items={selectedItems}\n title={labels?.curricularComponentsTitle}\n />\n );\n case ComparatorTabValue.COMPETENCIES:\n return (\n <CompetenciesContent\n data={data.competencies}\n items={selectedItems}\n title={labels?.competenciesTitle}\n />\n );\n case ComparatorTabValue.NATIONAL_AVERAGES:\n return (\n <NationalAveragesContent\n data={data.nationalAverages}\n items={selectedItems}\n title={labels?.nationalAveragesTitle}\n labels={labels}\n />\n );\n default:\n return null;\n }\n}\n"],"mappings":"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