analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
853 lines (791 loc) • 36 kB
JavaScript
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
var _chunkXRCGVXQTjs = require('./chunk-XRCGVXQT.js');
var _chunkC5FRUHXCjs = require('./chunk-C5FRUHXC.js');
var _chunkNEDUOGWUjs = require('./chunk-NEDUOGWU.js');
var _chunkBJMKBBN3js = require('./chunk-BJMKBBN3.js');
var _chunkTCLRDUMFjs = require('./chunk-TCLRDUMF.js');
var _chunk34ST3MKOjs = require('./chunk-34ST3MKO.js');
var _chunkANT66KVKjs = require('./chunk-ANT66KVK.js');
// src/components/ComparatorChart/ComparatorView.tsx
var _react = require('react');
var _CaretLeft = require('@phosphor-icons/react/dist/csr/CaretLeft');
// src/components/ComparatorChart/ComparatorEmptyState.tsx
var _Plus = require('@phosphor-icons/react/dist/csr/Plus');
var _jsxruntime = require('react/jsx-runtime');
function ComparatorEmptyState({
onSelectClick,
canCompareSchools,
canCompareSchoolYears,
isLoading = false,
labels: customLabels
}) {
const labels = { ..._chunkXRCGVXQTjs.DEFAULT_COMPARATOR_LABELS, ...customLabels };
const hasAnyOption = canCompareSchools || canCompareSchoolYears;
const getButtonText = () => {
if (canCompareSchools && canCompareSchoolYears) {
return labels.selectComparison;
}
if (canCompareSchools) {
return labels.selectSchools;
}
return labels.selectSchoolYears;
};
const getDescriptionText = () => {
if (canCompareSchools && canCompareSchoolYears) {
return labels.emptyStateDescriptionBoth;
}
if (canCompareSchools) {
return labels.emptyStateDescriptionSchools;
}
if (canCompareSchoolYears) {
return labels.emptyStateDescriptionSchoolYears;
}
return labels.noAccessMessage;
};
const buttonText = getButtonText();
const descriptionText = getDescriptionText();
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col items-center justify-center h-full gap-6", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-24 h-24 rounded-full bg-primary-100 flex items-center justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
"svg",
{
className: "w-12 h-12 text-primary-600",
fill: "none",
stroke: "currentColor",
viewBox: "0 0 24 24",
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
"path",
{
strokeLinecap: "round",
strokeLinejoin: "round",
strokeWidth: 2,
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"
}
)
}
) }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "text-center", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "semibold", className: "text-text-950 mb-2", children: labels.title }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-500", children: descriptionText })
] }),
hasAnyOption && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "outline",
action: "primary",
size: "medium",
onClick: onSelectClick,
disabled: isLoading,
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Plus.PlusIcon, { size: 18 }),
buttonText
]
}
)
] });
}
// src/components/ComparatorChart/ComparatorLoadingState.tsx
function ComparatorLoadingState() {
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
"div",
{
className: "flex flex-col gap-6",
"data-testid": "comparator-loading-skeleton",
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonCard, { className: "h-12 w-full" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonCard, { className: "h-64 w-full" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNEDUOGWUjs.SkeletonCard, { className: "h-64 w-full" })
]
}
);
}
// src/components/ComparatorChart/ComparatorSelectTypeStep.tsx
function ComparatorSelectTypeStep({
onSelectType,
canCompareSchools,
canCompareSchoolYears,
labels: customLabels
}) {
const labels = { ..._chunkXRCGVXQTjs.DEFAULT_COMPARATOR_LABELS, ...customLabels };
if (!canCompareSchools && !canCompareSchoolYears) {
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-col gap-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-600", children: labels.noAccessMessage }) });
}
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-4", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-600", children: labels.selectComparisonType }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex gap-4", children: [
canCompareSchools && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "raw",
onClick: () => onSelectType("school"),
className: "flex-1 p-4 border border-border-200 rounded-xl hover:border-primary-500 hover:bg-primary-50 transition-colors text-left",
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "semibold", className: "text-text-950", children: labels.schools }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-500", children: labels.compareSchoolsDescription })
]
}
),
canCompareSchoolYears && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "raw",
onClick: () => onSelectType("schoolYear"),
className: "flex-1 p-4 border border-border-200 rounded-xl hover:border-primary-500 hover:bg-primary-50 transition-colors text-left",
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "semibold", className: "text-text-950", children: labels.schoolYears }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-500", children: labels.compareSchoolYearsDescription })
]
}
)
] })
] });
}
// src/components/ComparatorChart/ComparatorSelectItemsStep.tsx
var _X = require('@phosphor-icons/react/dist/csr/X');
function ComparatorSelectItemsStep({
options,
selectedItems,
onSelectItem,
onRemoveItem,
comparisonType,
labels: customLabels
}) {
const labels = { ..._chunkXRCGVXQTjs.DEFAULT_COMPARATOR_LABELS, ...customLabels };
const isMaxReached = selectedItems.length >= 5;
const placeholder = comparisonType === "school" ? labels.schools : labels.schoolYears;
const itemTypeName = comparisonType === "school" ? labels.schools.toLowerCase() : labels.schoolYears.toLowerCase();
const singularItemTypeName = comparisonType === "school" ? labels.school : labels.schoolYear;
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-4", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-600", children: labels.selectItemInstruction.replace("{item}", singularItemTypeName) }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkC5FRUHXCjs.SearchSelect_default,
{
options,
placeholder,
searchPlaceholder: `${labels.search} ${placeholder.toLowerCase()}...`,
onValueChange: onSelectItem,
disabled: isMaxReached,
emptyText: "Nenhum resultado encontrado",
size: "medium",
variant: "outlined"
}
),
selectedItems.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-wrap gap-2 p-3 bg-secondary-50 rounded-xl border border-border-100", children: selectedItems.map((item) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunkBJMKBBN3js.Badge_default,
{
variant: "outlined",
action: "info",
size: "medium",
className: "flex items-center gap-1 pr-1",
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
"span",
{
className: "w-2 h-2 rounded-full mr-1",
style: { backgroundColor: item.color }
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "truncate max-w-[200px]", children: item.name }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "raw",
onClick: () => onRemoveItem(item.id),
className: "ml-1 p-0.5 rounded-full hover:bg-secondary-200 transition-colors",
"aria-label": `Remover ${item.name}`,
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _X.XIcon, { size: 14 })
}
)
]
},
item.id
)) }),
isMaxReached && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-warning-600", children: labels.maxLimitWarning }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-500", children: [
selectedItems.length,
" de 5 ",
itemTypeName,
" ",
labels.ofSelected
] })
] });
}
// src/components/ComparatorChart/Legend.tsx
function Legend({ items }) {
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-col gap-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex flex-wrap gap-4 items-center", children: items.map((item) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
"div",
{
className: "w-3 h-3 rounded-full",
style: { backgroundColor: item.color }
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-700", children: item.name })
] }, item.id)) }) });
}
// src/components/ComparatorChart/PercentageScale.tsx
function PercentageScale() {
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-4 mb-2 border-b border-border-100 pb-2", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-64 shrink-0" }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex-1 flex justify-between px-1", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-400", children: "0%" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-400", children: "25%" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-400", children: "50%" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-400", children: "75%" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-400", children: "100%" })
] })
] });
}
// src/components/ComparatorChart/ChartArea.tsx
function ChartArea({ children }) {
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "relative", children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "absolute inset-0 flex items-stretch pointer-events-none gap-4", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-64 shrink-0" }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex-1 flex", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-1/4 border-r border-dashed border-border-200" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-1/4 border-r border-dashed border-border-200" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-1/4 border-r border-dashed border-border-200" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-1/4" })
] })
] }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "relative space-y-6", children })
] });
}
// src/components/ComparatorChart/BarChartRow.tsx
function BarChartRow({ label, values, items }) {
const [hoveredItem, setHoveredItem] = _react.useState.call(void 0, null);
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-4", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-text-700 w-64 shrink-0", children: label }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-1 space-y-1.5", children: items.map((item) => {
const value = values.find((v) => v.itemId === item.id);
const percentage = _nullishCoalesce(_optionalChain([value, 'optionalAccess', _ => _.percentage]), () => ( 0));
const clampedPercentage = Math.max(0, Math.min(percentage, 100));
const isHovered = hoveredItem === item.id;
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
"div",
{
className: "relative group",
onMouseEnter: () => setHoveredItem(item.id),
onMouseLeave: () => setHoveredItem(null),
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-1 h-5 bg-secondary-100 rounded-full overflow-hidden relative", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
"div",
{
className: `h-full rounded-full transition-all duration-500 ${isHovered ? "opacity-90" : ""}`,
style: {
width: `${clampedPercentage}%`,
backgroundColor: item.color,
minWidth: clampedPercentage > 0 ? "8px" : "0px"
}
}
) }),
isHovered && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
"div",
{
className: "absolute z-10 px-2 py-1 bg-text-900 rounded shadow-lg whitespace-nowrap",
style: {
left: `${Math.min(Math.max(percentage, 5), 95)}%`,
top: "-28px",
transform: "translateX(-50%)"
},
children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", weight: "medium", className: "text-white", children: [
item.name,
": ",
percentage.toFixed(1),
"%"
] }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
"div",
{
className: "absolute w-2 h-2 bg-text-900 rotate-45",
style: {
left: "50%",
bottom: "-4px",
transform: "translateX(-50%)"
}
}
)
]
}
)
]
},
item.id
);
}) })
] });
}
// src/components/ComparatorChart/KnowledgeAreasContent.tsx
function KnowledgeAreasContent({
data,
items,
title = "Profici\xEAncia m\xE9dia das escolas por \xE1rea do Enem"
}) {
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-secondary-50 rounded-2xl p-6", children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mb-6", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "semibold", className: "text-text-950 mb-4", children: title }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, Legend, { items })
] }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, PercentageScale, {}),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, ChartArea, { children: data.map((area) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
BarChartRow,
{
label: area.area,
values: area.values,
items
},
area.area
)) })
] });
}
// src/components/ComparatorChart/CurricularComponentsContent.tsx
function CurricularComponentsContent({
data,
items,
title = "Profici\xEAncia m\xE9dia por componente curricular"
}) {
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-secondary-50 rounded-2xl p-6", children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mb-6", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "semibold", className: "text-text-950 mb-4", children: title }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, Legend, { items })
] }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, PercentageScale, {}),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, ChartArea, { children: data.map((component) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
BarChartRow,
{
label: component.component,
values: component.values,
items
},
component.component
)) })
] });
}
// src/components/ComparatorChart/CompetenciesContent.tsx
function CompetenciesContent({
data,
items,
title = "Profici\xEAncia m\xE9dia por compet\xEAncia"
}) {
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-secondary-50 rounded-2xl p-6", children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mb-6", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "semibold", className: "text-text-950 mb-4", children: title }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, Legend, { items })
] }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, PercentageScale, {}),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, ChartArea, { children: data.map((competency) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
BarChartRow,
{
label: competency.competency,
values: competency.values,
items
},
competency.competency
)) })
] });
}
// src/components/ComparatorChart/NationalAverageCard.tsx
var DETAIL_LABELS = [
{ key: "languages", label: "LINGUAGENS, C\xD3DIGOS E SUAS TECNOLOGIAS" },
{ key: "humanities", label: "CI\xCANCIAS HUMANAS E SUAS TECNOLOGIAS" },
{ key: "essay", label: "REDA\xC7\xC3O" },
{ key: "naturalSciences", label: "CI\xCANCIAS DA NATUREZA E SUAS TECNOLOGIAS" },
{ key: "mathematics", label: "MATEM\xC1TICA E SUAS TECNOLOGIAS" }
];
function NationalAverageCard({
data,
color,
labels: customLabels
}) {
const labels = { ..._chunkXRCGVXQTjs.DEFAULT_COMPARATOR_LABELS, ...customLabels };
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-secondary-50 rounded-2xl p-6", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "semibold", className: "text-text-950 mb-4", children: data.itemName }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "grid grid-cols-3 gap-4 mb-6", children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
"div",
{
className: "bg-background rounded-xl p-4 text-center border-l-4",
style: { borderColor: color },
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "2xl", weight: "bold", className: "text-primary-700", children: data.simulatedProficiency.toFixed(1) }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-500 uppercase", children: labels.simulatedProficiency })
]
}
),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-warning-50 rounded-xl p-4 text-center", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "2xl", weight: "bold", className: "text-warning-700", children: data.publicAverage }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-500 uppercase", children: labels.publicSchoolAverage })
] }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-success-50 rounded-xl p-4 text-center", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "2xl", weight: "bold", className: "text-success-700", children: data.privateAverage }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "xs", className: "text-text-500 uppercase", children: labels.privateSchoolAverage })
] })
] }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "grid grid-cols-5 gap-4 mb-4", children: DETAIL_LABELS.map(({ key, label }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-background rounded-xl p-3 text-center", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkANT66KVKjs.Text_default,
{
size: "xs",
className: "text-text-500 uppercase mb-1 line-clamp-2",
children: label
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "bold", className: "text-primary-700", children: data.details[key] })
] }, key)) }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkBJMKBBN3js.Badge_default,
{
variant: "solid",
action: data.status === "above" ? "success" : "warning",
size: "medium",
className: "w-full justify-center py-3",
children: data.status === "above" ? labels.aboveAverage : labels.belowAverage
}
)
] });
}
// src/components/ComparatorChart/NationalAveragesContent.tsx
function NationalAveragesContent({
data,
items,
title,
labels: customLabels
}) {
const labels = { ..._chunkXRCGVXQTjs.DEFAULT_COMPARATOR_LABELS, ...customLabels };
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "space-y-6", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "md", weight: "semibold", className: "text-text-950", children: title || labels.nationalAveragesTitle }),
data.map((item) => {
const selectedItem = items.find((i) => i.id === item.itemId);
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
NationalAverageCard,
{
data: item,
color: _optionalChain([selectedItem, 'optionalAccess', _2 => _2.color]),
labels
},
item.itemId
);
})
] });
}
// src/components/ComparatorChart/ComparatorTabContent.tsx
function ComparatorTabContent({
activeTab,
data,
selectedItems,
labels
}) {
switch (activeTab) {
case "knowledge-areas" /* KNOWLEDGE_AREAS */:
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
KnowledgeAreasContent,
{
data: data.knowledgeAreas,
items: selectedItems,
title: _optionalChain([labels, 'optionalAccess', _3 => _3.knowledgeAreasTitle])
}
);
case "curricular-components" /* CURRICULAR_COMPONENTS */:
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
CurricularComponentsContent,
{
data: data.curricularComponents,
items: selectedItems,
title: _optionalChain([labels, 'optionalAccess', _4 => _4.curricularComponentsTitle])
}
);
case "competencies" /* COMPETENCIES */:
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
CompetenciesContent,
{
data: data.competencies,
items: selectedItems,
title: _optionalChain([labels, 'optionalAccess', _5 => _5.competenciesTitle])
}
);
case "national-averages" /* NATIONAL_AVERAGES */:
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
NationalAveragesContent,
{
data: data.nationalAverages,
items: selectedItems,
title: _optionalChain([labels, 'optionalAccess', _6 => _6.nationalAveragesTitle]),
labels
}
);
default:
return null;
}
}
// src/components/ComparatorChart/ComparatorView.tsx
function ComparatorView({
schools,
schoolYears,
useComparatorStore,
useComparator,
onBack,
activeTab: externalActiveTab,
onTabChange,
tabs = _chunkXRCGVXQTjs.DEFAULT_COMPARATOR_TABS,
labels: customLabels,
isUserLoading = false,
onFetchUserData
}) {
const labels = _react.useMemo.call(void 0,
() => ({ ..._chunkXRCGVXQTjs.DEFAULT_COMPARATOR_LABELS, ...customLabels }),
[customLabels]
);
const {
comparisonType,
selectedItems,
setComparisonType,
addItem,
removeItem,
clearSelection
} = useComparatorStore();
const { data, loading, fetchData } = useComparator();
const [isModalOpen, setIsModalOpen] = _react.useState.call(void 0, false);
const [modalStep, setModalStep] = _react.useState.call(void 0, 1);
const [internalActiveTab, setInternalActiveTab] = _react.useState.call(void 0,
"knowledge-areas" /* KNOWLEDGE_AREAS */
);
const hasInitializedRef = _react.useRef.call(void 0, false);
const activeTab = _nullishCoalesce(externalActiveTab, () => ( internalActiveTab));
const canCompareSchools = schools.length > 1;
const canCompareSchoolYears = schoolYears.length > 1;
const hasAnyComparisonOption = canCompareSchools || canCompareSchoolYears;
_react.useEffect.call(void 0, () => {
_optionalChain([onFetchUserData, 'optionalCall', _7 => _7(true)]);
}, [onFetchUserData]);
_react.useEffect.call(void 0, () => {
if (hasInitializedRef.current) return;
if (selectedItems.length > 0 && comparisonType) {
hasInitializedRef.current = true;
fetchData(
selectedItems.map((i) => i.id),
comparisonType,
activeTab
);
}
}, [selectedItems, comparisonType, activeTab, fetchData]);
const options = _react.useMemo.call(void 0, () => {
if (comparisonType === "school") return schools;
if (comparisonType === "schoolYear") return schoolYears;
return [];
}, [comparisonType, schools, schoolYears]);
const availableOptions = _react.useMemo.call(void 0, () => {
return options.filter(
(opt) => !selectedItems.some((item) => item.id === opt.value)
);
}, [options, selectedItems]);
const handleTabChange = _react.useCallback.call(void 0,
(tab) => {
if (onTabChange) {
onTabChange(tab);
} else {
setInternalActiveTab(tab);
}
if (selectedItems.length > 0 && comparisonType) {
fetchData(
selectedItems.map((i) => i.id),
comparisonType,
tab
);
}
},
[selectedItems, comparisonType, onTabChange, fetchData]
);
const handleOpenModal = _react.useCallback.call(void 0, () => {
if (comparisonType) {
setModalStep(2);
setIsModalOpen(true);
return;
}
if (canCompareSchools && !canCompareSchoolYears) {
setComparisonType("school");
setModalStep(2);
} else if (canCompareSchoolYears && !canCompareSchools) {
setComparisonType("schoolYear");
setModalStep(2);
} else {
setModalStep(1);
}
setIsModalOpen(true);
}, [
comparisonType,
canCompareSchools,
canCompareSchoolYears,
setComparisonType
]);
const handleSelectType = _react.useCallback.call(void 0,
(type) => {
clearSelection();
setComparisonType(type);
setModalStep(2);
},
[clearSelection, setComparisonType]
);
const handleSelectItem = _react.useCallback.call(void 0,
(value) => {
if (selectedItems.length >= 5) return;
const option = options.find((opt) => opt.value === value);
if (!option) return;
addItem({
id: option.value,
name: option.label,
color: ""
});
},
[options, selectedItems.length, addItem]
);
const handleRemoveItem = _react.useCallback.call(void 0,
(itemId) => {
removeItem(itemId);
},
[removeItem]
);
const handleConfirmSelection = _react.useCallback.call(void 0, () => {
setIsModalOpen(false);
if (selectedItems.length > 0 && comparisonType) {
fetchData(
selectedItems.map((i) => i.id),
comparisonType,
activeTab
);
}
}, [selectedItems, comparisonType, activeTab, fetchData]);
const handleCloseModal = _react.useCallback.call(void 0, () => {
setIsModalOpen(false);
}, []);
const handleChangeType = _react.useCallback.call(void 0, () => {
setModalStep(1);
clearSelection();
}, [clearSelection]);
const buttonText = _react.useMemo.call(void 0, () => {
if (selectedItems.length > 0) {
return comparisonType === "school" ? labels.selectSchools : labels.selectSchoolYears;
}
if (canCompareSchools && canCompareSchoolYears) {
return labels.selectComparison;
}
return canCompareSchools ? labels.selectSchools : labels.selectSchoolYears;
}, [
selectedItems.length,
comparisonType,
canCompareSchools,
canCompareSchoolYears,
labels
]);
const renderMainContent = () => {
if (selectedItems.length === 0) {
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
ComparatorEmptyState,
{
onSelectClick: handleOpenModal,
canCompareSchools,
canCompareSchoolYears,
isLoading: isUserLoading,
labels
}
);
}
if (loading) {
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComparatorLoadingState, {});
}
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
ComparatorTabContent,
{
activeTab,
data,
selectedItems,
labels
}
);
};
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "h-screen bg-background flex flex-col", children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "header", { className: "flex items-center justify-between px-6 py-4 border-b border-border-100 bg-secondary-50", children: [
onBack ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "raw",
onClick: onBack,
className: "flex items-center gap-2 text-text-950 hover:text-text-700 transition-colors",
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretLeft.CaretLeftIcon, { size: 20, weight: "bold" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "semibold", children: labels.title })
]
}
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-center gap-2 text-text-950", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "semibold", children: labels.title }) }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "solid",
action: "primary",
size: "medium",
onClick: handleOpenModal,
disabled: !hasAnyComparisonOption || isUserLoading,
children: buttonText
}
)
] }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex gap-2 px-6 py-4 border-b border-border-100 bg-secondary-50", children: tabs.map((tab) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "raw",
onClick: () => handleTabChange(tab.value),
className: `px-4 py-2 text-sm font-medium transition-colors ${activeTab === tab.value ? "text-primary-700 border-b-2 border-primary-600" : "text-text-500 hover:text-text-700"}`,
children: tab.label
},
tab.value
)) }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "main", { className: "flex-1 overflow-auto p-6", children: renderMainContent() }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkTCLRDUMFjs.Modal_default,
{
isOpen: isModalOpen,
onClose: handleCloseModal,
title: labels.filters,
size: "md",
footer: modalStep === 2 ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex justify-end gap-3 w-full", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk34ST3MKOjs.Button_default, { variant: "outline", onClick: handleChangeType, children: labels.back }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "solid",
action: "primary",
onClick: handleConfirmSelection,
disabled: selectedItems.length === 0,
children: [
labels.confirm,
" (",
selectedItems.length,
"/5)"
]
}
)
] }) : void 0,
children: modalStep === 1 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
ComparatorSelectTypeStep,
{
onSelectType: handleSelectType,
canCompareSchools,
canCompareSchoolYears,
labels
}
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
ComparatorSelectItemsStep,
{
options: availableOptions,
selectedItems,
onSelectItem: handleSelectItem,
onRemoveItem: handleRemoveItem,
comparisonType,
labels
}
)
}
)
] });
}
exports.Legend = Legend; exports.PercentageScale = PercentageScale; exports.ChartArea = ChartArea; exports.BarChartRow = BarChartRow; exports.KnowledgeAreasContent = KnowledgeAreasContent; exports.CurricularComponentsContent = CurricularComponentsContent; exports.CompetenciesContent = CompetenciesContent; exports.NationalAverageCard = NationalAverageCard; exports.NationalAveragesContent = NationalAveragesContent; exports.ComparatorEmptyState = ComparatorEmptyState; exports.ComparatorLoadingState = ComparatorLoadingState; exports.ComparatorSelectTypeStep = ComparatorSelectTypeStep; exports.ComparatorSelectItemsStep = ComparatorSelectItemsStep; exports.ComparatorTabContent = ComparatorTabContent; exports.ComparatorView = ComparatorView;
//# sourceMappingURL=chunk-2JRNCQLG.js.map