analytica-frontend-lib 1.2.80 → 1.2.81

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.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/dist/ActivitiesHistory/index.css +10 -0
  3. package/dist/ActivitiesHistory/index.css.map +1 -1
  4. package/dist/ActivityCardQuestionBanks/index.css +10 -0
  5. package/dist/ActivityCardQuestionBanks/index.css.map +1 -1
  6. package/dist/ActivityCardQuestionPreview/index.css +10 -0
  7. package/dist/ActivityCardQuestionPreview/index.css.map +1 -1
  8. package/dist/ActivityDetails/index.css +10 -0
  9. package/dist/ActivityDetails/index.css.map +1 -1
  10. package/dist/ActivityFilters/index.css +10 -0
  11. package/dist/ActivityFilters/index.css.map +1 -1
  12. package/dist/ActivityPreview/index.css +10 -0
  13. package/dist/ActivityPreview/index.css.map +1 -1
  14. package/dist/AlertManager/index.css +10 -0
  15. package/dist/AlertManager/index.css.map +1 -1
  16. package/dist/QuestionsData/index.d.ts +50 -0
  17. package/dist/QuestionsData/index.d.ts.map +1 -0
  18. package/dist/QuestionsData/index.js +281 -0
  19. package/dist/QuestionsData/index.js.map +1 -0
  20. package/dist/QuestionsData/index.mjs +254 -0
  21. package/dist/QuestionsData/index.mjs.map +1 -0
  22. package/dist/RecommendedLessonsHistory/index.css +10 -0
  23. package/dist/RecommendedLessonsHistory/index.css.map +1 -1
  24. package/dist/SendActivityModal/SendActivityModal.css +10 -0
  25. package/dist/SendActivityModal/SendActivityModal.css.map +1 -1
  26. package/dist/SendActivityModal/index.css +10 -0
  27. package/dist/SendActivityModal/index.css.map +1 -1
  28. package/dist/TableProvider/index.css +10 -0
  29. package/dist/TableProvider/index.css.map +1 -1
  30. package/dist/index.css +10 -0
  31. package/dist/index.css.map +1 -1
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +1078 -885
  35. package/dist/index.js.map +1 -1
  36. package/dist/index.mjs +1077 -885
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/styles.css +10 -0
  39. package/dist/styles.css.map +1 -1
  40. package/package.json +2 -1
@@ -0,0 +1,50 @@
1
+ import { HTMLAttributes } from 'react';
2
+ /**
3
+ * Data structure for questions statistics
4
+ */
5
+ export interface QuestionsDataItem {
6
+ /** Total number of questions answered */
7
+ total: number;
8
+ /** Number of correct answers */
9
+ corretas: number;
10
+ /** Number of incorrect answers */
11
+ incorretas: number;
12
+ /** Number of blank (unanswered) questions */
13
+ emBranco?: number;
14
+ }
15
+ /**
16
+ * Props for the QuestionsData component
17
+ */
18
+ export interface QuestionsDataProps extends HTMLAttributes<HTMLDivElement> {
19
+ /** Card title */
20
+ title?: string;
21
+ /** Question statistics data */
22
+ data: QuestionsDataItem;
23
+ /** Whether to show blank questions bar */
24
+ showEmBranco?: boolean;
25
+ /** Maximum value for the chart scale (defaults to total) */
26
+ maxValue?: number;
27
+ /** Height of the chart area in pixels */
28
+ chartHeight?: number;
29
+ }
30
+ /**
31
+ * QuestionsData component - displays a vertical bar chart showing
32
+ * question statistics (total, correct, incorrect, and optionally blank).
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * <QuestionsData
37
+ * title="Dados de questões"
38
+ * data={{
39
+ * total: 120,
40
+ * corretas: 80,
41
+ * incorretas: 30,
42
+ * emBranco: 10,
43
+ * }}
44
+ * showEmBranco
45
+ * />
46
+ * ```
47
+ */
48
+ export declare const QuestionsData: ({ title, data, showEmBranco, maxValue, chartHeight, className, ...props }: QuestionsDataProps) => import("react/jsx-runtime").JSX.Element;
49
+ export default QuestionsData;
50
+ //# sourceMappingURL=QuestionsData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuestionsData.d.ts","sourceRoot":"","sources":["../../../src/components/QuestionsData/QuestionsData.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAIvC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACxE,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAwJD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,aAAa,GAAI,2EAQ3B,kBAAkB,4CA8GpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/components/QuestionsData/QuestionsData.tsx
21
+ var QuestionsData_exports = {};
22
+ __export(QuestionsData_exports, {
23
+ QuestionsData: () => QuestionsData,
24
+ default: () => QuestionsData_default
25
+ });
26
+ module.exports = __toCommonJS(QuestionsData_exports);
27
+
28
+ // src/utils/utils.ts
29
+ var import_clsx = require("clsx");
30
+ var import_tailwind_merge = require("tailwind-merge");
31
+ function cn(...inputs) {
32
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
33
+ }
34
+
35
+ // src/components/Text/Text.tsx
36
+ var import_jsx_runtime = require("react/jsx-runtime");
37
+ var Text = ({
38
+ children,
39
+ size = "md",
40
+ weight = "normal",
41
+ color = "text-text-950",
42
+ as,
43
+ className = "",
44
+ ...props
45
+ }) => {
46
+ let sizeClasses = "";
47
+ let weightClasses = "";
48
+ const sizeClassMap = {
49
+ "2xs": "text-2xs",
50
+ xs: "text-xs",
51
+ sm: "text-sm",
52
+ md: "text-md",
53
+ lg: "text-lg",
54
+ xl: "text-xl",
55
+ "2xl": "text-2xl",
56
+ "3xl": "text-3xl",
57
+ "4xl": "text-4xl",
58
+ "5xl": "text-5xl",
59
+ "6xl": "text-6xl"
60
+ };
61
+ sizeClasses = sizeClassMap[size] ?? sizeClassMap.md;
62
+ const weightClassMap = {
63
+ hairline: "font-hairline",
64
+ light: "font-light",
65
+ normal: "font-normal",
66
+ medium: "font-medium",
67
+ semibold: "font-semibold",
68
+ bold: "font-bold",
69
+ extrabold: "font-extrabold",
70
+ black: "font-black"
71
+ };
72
+ weightClasses = weightClassMap[weight] ?? weightClassMap.normal;
73
+ const baseClasses = "font-primary";
74
+ const Component = as ?? "p";
75
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
76
+ Component,
77
+ {
78
+ className: cn(baseClasses, sizeClasses, weightClasses, color, className),
79
+ ...props,
80
+ children
81
+ }
82
+ );
83
+ };
84
+ var Text_default = Text;
85
+
86
+ // src/components/QuestionsData/QuestionsData.tsx
87
+ var import_jsx_runtime2 = require("react/jsx-runtime");
88
+ var BAR_COLORS = {
89
+ total: "bg-info-600",
90
+ corretas: "bg-success-200",
91
+ incorretas: "bg-warning-400",
92
+ emBranco: "bg-background-300"
93
+ };
94
+ var calculateYAxisTicks = (maxValue) => {
95
+ if (maxValue <= 0) return [0];
96
+ const niceMax = Math.ceil(maxValue / 10) * 10;
97
+ const step = niceMax / 4;
98
+ return [
99
+ niceMax,
100
+ Math.round(step * 3),
101
+ Math.round(step * 2),
102
+ Math.round(step),
103
+ 0
104
+ ];
105
+ };
106
+ var LegendItem = ({ color, label }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-row items-center gap-2", children: [
107
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: cn("w-2 h-2 rounded-full", color) }),
108
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text_default, { size: "xs", weight: "medium", className: "text-text-600", children: label })
109
+ ] });
110
+ var DataBar = ({
111
+ label,
112
+ value,
113
+ maxValue,
114
+ colorClass,
115
+ chartHeight
116
+ }) => {
117
+ const percentage = maxValue === 0 ? 0 : value / maxValue * 100;
118
+ const barHeight = percentage / 100 * chartHeight;
119
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col items-center gap-2 flex-1", children: [
120
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
121
+ "div",
122
+ {
123
+ className: "w-full flex items-end justify-center",
124
+ style: { height: chartHeight },
125
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
126
+ "div",
127
+ {
128
+ className: cn(
129
+ "w-16 rounded-lg transition-all duration-300",
130
+ colorClass
131
+ ),
132
+ style: { height: `${barHeight}px` }
133
+ }
134
+ )
135
+ }
136
+ ),
137
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Text_default, { size: "xs", weight: "medium", className: "text-text-600 text-center", children: label })
138
+ ] });
139
+ };
140
+ var GridLines = ({
141
+ ticks,
142
+ chartHeight
143
+ }) => {
144
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
145
+ "div",
146
+ {
147
+ className: "absolute inset-0 flex flex-col justify-between pointer-events-none",
148
+ style: { height: chartHeight },
149
+ children: ticks.map((tick, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
150
+ "div",
151
+ {
152
+ className: "w-full border-t border-dashed border-border-200",
153
+ style: { marginTop: index === 0 ? 0 : void 0 }
154
+ },
155
+ `${tick}-${index}`
156
+ ))
157
+ }
158
+ );
159
+ };
160
+ var YAxis = ({
161
+ ticks,
162
+ chartHeight
163
+ }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
164
+ "div",
165
+ {
166
+ className: "flex flex-col justify-between items-end pr-3",
167
+ style: { height: chartHeight },
168
+ "aria-hidden": "true",
169
+ children: ticks.map((tick, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
170
+ Text_default,
171
+ {
172
+ size: "xs",
173
+ weight: "medium",
174
+ className: "text-text-500",
175
+ children: tick
176
+ },
177
+ `${tick}-${index}`
178
+ ))
179
+ }
180
+ );
181
+ var QuestionsData = ({
182
+ title = "Dados de quest\xF5es",
183
+ data,
184
+ showEmBranco = false,
185
+ maxValue,
186
+ chartHeight = 180,
187
+ className,
188
+ ...props
189
+ }) => {
190
+ const chartMaxValue = maxValue ?? data.total;
191
+ const yAxisTicks = calculateYAxisTicks(chartMaxValue);
192
+ const adjustedMaxValue = yAxisTicks[0];
193
+ const blankSuffix = showEmBranco && data.emBranco !== void 0 ? `, ${data.emBranco} em branco` : "";
194
+ const chartDescription = `Gr\xE1fico de barras mostrando ${data.total} quest\xF5es respondidas, ${data.corretas} corretas, ${data.incorretas} incorretas${blankSuffix}`;
195
+ const barItems = [
196
+ {
197
+ key: "total",
198
+ label: "Total",
199
+ legendLabel: "Total de quest\xF5es respondidas",
200
+ value: data.total,
201
+ colorClass: BAR_COLORS.total
202
+ },
203
+ {
204
+ key: "corretas",
205
+ label: "Corretas",
206
+ legendLabel: "Quest\xF5es corretas",
207
+ value: data.corretas,
208
+ colorClass: BAR_COLORS.corretas
209
+ },
210
+ {
211
+ key: "incorretas",
212
+ label: "Incorretas",
213
+ legendLabel: "Quest\xF5es incorretas",
214
+ value: data.incorretas,
215
+ colorClass: BAR_COLORS.incorretas
216
+ }
217
+ ];
218
+ if (showEmBranco && data.emBranco !== void 0) {
219
+ barItems.push({
220
+ key: "emBranco",
221
+ label: "Em branco",
222
+ legendLabel: "Quest\xF5es em branco",
223
+ value: data.emBranco,
224
+ colorClass: BAR_COLORS.emBranco
225
+ });
226
+ }
227
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
228
+ "div",
229
+ {
230
+ className: cn(
231
+ "flex flex-col p-5 gap-4 bg-background border border-border-50 rounded-xl",
232
+ className
233
+ ),
234
+ ...props,
235
+ children: [
236
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
237
+ Text_default,
238
+ {
239
+ as: "h3",
240
+ size: "lg",
241
+ weight: "bold",
242
+ className: "text-text-950 tracking-[0.2px]",
243
+ children: title
244
+ }
245
+ ),
246
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex flex-row flex-wrap gap-x-6 gap-y-2 mb-4", children: barItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
247
+ LegendItem,
248
+ {
249
+ color: BAR_COLORS[item.key],
250
+ label: item.legendLabel
251
+ },
252
+ item.key
253
+ )) }),
254
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-row", "aria-label": chartDescription, children: [
255
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(YAxis, { ticks: yAxisTicks, chartHeight }),
256
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "w-4" }),
257
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex-1 relative", children: [
258
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(GridLines, { ticks: yAxisTicks, chartHeight }),
259
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex flex-row flex-1 gap-4 relative z-10", children: barItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
260
+ DataBar,
261
+ {
262
+ label: item.label,
263
+ value: item.value,
264
+ maxValue: adjustedMaxValue,
265
+ colorClass: item.colorClass,
266
+ chartHeight
267
+ },
268
+ item.key
269
+ )) })
270
+ ] })
271
+ ] })
272
+ ]
273
+ }
274
+ );
275
+ };
276
+ var QuestionsData_default = QuestionsData;
277
+ // Annotate the CommonJS export names for ESM import in node:
278
+ 0 && (module.exports = {
279
+ QuestionsData
280
+ });
281
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/QuestionsData/QuestionsData.tsx","../../src/utils/utils.ts","../../src/components/Text/Text.tsx"],"sourcesContent":["import { HTMLAttributes } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Data structure for questions statistics\n */\nexport interface QuestionsDataItem {\n /** Total number of questions answered */\n total: number;\n /** Number of correct answers */\n corretas: number;\n /** Number of incorrect answers */\n incorretas: number;\n /** Number of blank (unanswered) questions */\n emBranco?: number;\n}\n\n/**\n * Props for the QuestionsData component\n */\nexport interface QuestionsDataProps extends HTMLAttributes<HTMLDivElement> {\n /** Card title */\n title?: string;\n /** Question statistics data */\n data: QuestionsDataItem;\n /** Whether to show blank questions bar */\n showEmBranco?: boolean;\n /** Maximum value for the chart scale (defaults to total) */\n maxValue?: number;\n /** Height of the chart area in pixels */\n chartHeight?: number;\n}\n\n/**\n * Bar item configuration\n */\ninterface BarItemConfig {\n key: string;\n label: string;\n legendLabel: string;\n value: number;\n colorClass: string;\n}\n\n/**\n * Color classes for bars and legend dots using design system tokens\n */\nconst BAR_COLORS = {\n total: 'bg-info-600',\n corretas: 'bg-success-200',\n incorretas: 'bg-warning-400',\n emBranco: 'bg-background-300',\n} as const;\n\n/**\n * Calculate Y-axis tick values based on max value\n */\nconst calculateYAxisTicks = (maxValue: number): number[] => {\n if (maxValue <= 0) return [0];\n\n // Round up to nearest \"nice\" number for the max tick\n const niceMax = Math.ceil(maxValue / 10) * 10;\n\n // Generate 5 ticks including 0 and max\n const step = niceMax / 4;\n return [\n niceMax,\n Math.round(step * 3),\n Math.round(step * 2),\n Math.round(step),\n 0,\n ];\n};\n\n/**\n * Legend item component\n */\nconst LegendItem = ({ color, label }: { color: string; label: string }) => (\n <div className=\"flex flex-row items-center gap-2\">\n <div className={cn('w-2 h-2 rounded-full', color)} />\n <Text size=\"xs\" weight=\"medium\" className=\"text-text-600\">\n {label}\n </Text>\n </div>\n);\n\n/**\n * Individual vertical bar component\n */\nconst DataBar = ({\n label,\n value,\n maxValue,\n colorClass,\n chartHeight,\n}: {\n label: string;\n value: number;\n maxValue: number;\n colorClass: string;\n chartHeight: number;\n}) => {\n const percentage = maxValue === 0 ? 0 : (value / maxValue) * 100;\n const barHeight = (percentage / 100) * chartHeight;\n\n return (\n <div className=\"flex flex-col items-center gap-2 flex-1\">\n {/* Bar container */}\n <div\n className=\"w-full flex items-end justify-center\"\n style={{ height: chartHeight }}\n >\n <div\n className={cn(\n 'w-16 rounded-lg transition-all duration-300',\n colorClass\n )}\n style={{ height: `${barHeight}px` }}\n />\n </div>\n\n {/* Label */}\n <Text size=\"xs\" weight=\"medium\" className=\"text-text-600 text-center\">\n {label}\n </Text>\n </div>\n );\n};\n\n/**\n * Grid lines component for the chart background\n */\nconst GridLines = ({\n ticks,\n chartHeight,\n}: {\n ticks: number[];\n chartHeight: number;\n}) => {\n return (\n <div\n className=\"absolute inset-0 flex flex-col justify-between pointer-events-none\"\n style={{ height: chartHeight }}\n >\n {ticks.map((tick, index) => (\n <div\n key={`${tick}-${index}`}\n className=\"w-full border-t border-dashed border-border-200\"\n style={{ marginTop: index === 0 ? 0 : undefined }}\n />\n ))}\n </div>\n );\n};\n\n/**\n * Y-Axis component\n */\nconst YAxis = ({\n ticks,\n chartHeight,\n}: {\n ticks: number[];\n chartHeight: number;\n}) => (\n <div\n className=\"flex flex-col justify-between items-end pr-3\"\n style={{ height: chartHeight }}\n aria-hidden=\"true\"\n >\n {ticks.map((tick, index) => (\n <Text\n key={`${tick}-${index}`}\n size=\"xs\"\n weight=\"medium\"\n className=\"text-text-500\"\n >\n {tick}\n </Text>\n ))}\n </div>\n);\n\n/**\n * QuestionsData component - displays a vertical bar chart showing\n * question statistics (total, correct, incorrect, and optionally blank).\n *\n * @example\n * ```tsx\n * <QuestionsData\n * title=\"Dados de questões\"\n * data={{\n * total: 120,\n * corretas: 80,\n * incorretas: 30,\n * emBranco: 10,\n * }}\n * showEmBranco\n * />\n * ```\n */\nexport const QuestionsData = ({\n title = 'Dados de questões',\n data,\n showEmBranco = false,\n maxValue,\n chartHeight = 180,\n className,\n ...props\n}: QuestionsDataProps) => {\n // Calculate the maximum value for the scale\n const chartMaxValue = maxValue ?? data.total;\n\n // Calculate Y-axis ticks\n const yAxisTicks = calculateYAxisTicks(chartMaxValue);\n const adjustedMaxValue = yAxisTicks[0]; // Use the nice max for calculations\n\n // Build accessible chart description\n const blankSuffix =\n showEmBranco && data.emBranco !== undefined\n ? `, ${data.emBranco} em branco`\n : '';\n const chartDescription = `Gráfico de barras mostrando ${data.total} questões respondidas, ${data.corretas} corretas, ${data.incorretas} incorretas${blankSuffix}`;\n\n // Build bar items configuration\n const barItems: BarItemConfig[] = [\n {\n key: 'total',\n label: 'Total',\n legendLabel: 'Total de questões respondidas',\n value: data.total,\n colorClass: BAR_COLORS.total,\n },\n {\n key: 'corretas',\n label: 'Corretas',\n legendLabel: 'Questões corretas',\n value: data.corretas,\n colorClass: BAR_COLORS.corretas,\n },\n {\n key: 'incorretas',\n label: 'Incorretas',\n legendLabel: 'Questões incorretas',\n value: data.incorretas,\n colorClass: BAR_COLORS.incorretas,\n },\n ];\n\n // Add blank questions bar if enabled\n if (showEmBranco && data.emBranco !== undefined) {\n barItems.push({\n key: 'emBranco',\n label: 'Em branco',\n legendLabel: 'Questões em branco',\n value: data.emBranco,\n colorClass: BAR_COLORS.emBranco,\n });\n }\n\n return (\n <div\n className={cn(\n 'flex flex-col p-5 gap-4 bg-background border border-border-50 rounded-xl',\n className\n )}\n {...props}\n >\n {/* Header */}\n <Text\n as=\"h3\"\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px]\"\n >\n {title}\n </Text>\n\n {/* Legend */}\n <div className=\"flex flex-row flex-wrap gap-x-6 gap-y-2 mb-4\">\n {barItems.map((item) => (\n <LegendItem\n key={item.key}\n color={BAR_COLORS[item.key as keyof typeof BAR_COLORS]}\n label={item.legendLabel}\n />\n ))}\n </div>\n\n {/* Chart */}\n <div className=\"flex flex-row\" aria-label={chartDescription}>\n {/* Y-Axis */}\n <YAxis ticks={yAxisTicks} chartHeight={chartHeight} />\n\n {/* Spacer between Y-axis and chart */}\n <div className=\"w-4\" />\n\n {/* Chart area with grid and bars */}\n <div className=\"flex-1 relative\">\n {/* Grid lines */}\n <GridLines ticks={yAxisTicks} chartHeight={chartHeight} />\n\n {/* Bars */}\n <div className=\"flex flex-row flex-1 gap-4 relative z-10\">\n {barItems.map((item) => (\n <DataBar\n key={item.key}\n label={item.label}\n value={item.value}\n maxValue={adjustedMaxValue}\n colorClass={item.colorClass}\n chartHeight={chartHeight}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default QuestionsData;\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 areFiltersEqual,\n} from './activityFilters';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './questionTypeUtils';\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"],"mappings":"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","names":["import_jsx_runtime"]}
@@ -0,0 +1,254 @@
1
+ // src/utils/utils.ts
2
+ import { clsx } from "clsx";
3
+ import { twMerge } from "tailwind-merge";
4
+ function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+
8
+ // src/components/Text/Text.tsx
9
+ import { jsx } from "react/jsx-runtime";
10
+ var Text = ({
11
+ children,
12
+ size = "md",
13
+ weight = "normal",
14
+ color = "text-text-950",
15
+ as,
16
+ className = "",
17
+ ...props
18
+ }) => {
19
+ let sizeClasses = "";
20
+ let weightClasses = "";
21
+ const sizeClassMap = {
22
+ "2xs": "text-2xs",
23
+ xs: "text-xs",
24
+ sm: "text-sm",
25
+ md: "text-md",
26
+ lg: "text-lg",
27
+ xl: "text-xl",
28
+ "2xl": "text-2xl",
29
+ "3xl": "text-3xl",
30
+ "4xl": "text-4xl",
31
+ "5xl": "text-5xl",
32
+ "6xl": "text-6xl"
33
+ };
34
+ sizeClasses = sizeClassMap[size] ?? sizeClassMap.md;
35
+ const weightClassMap = {
36
+ hairline: "font-hairline",
37
+ light: "font-light",
38
+ normal: "font-normal",
39
+ medium: "font-medium",
40
+ semibold: "font-semibold",
41
+ bold: "font-bold",
42
+ extrabold: "font-extrabold",
43
+ black: "font-black"
44
+ };
45
+ weightClasses = weightClassMap[weight] ?? weightClassMap.normal;
46
+ const baseClasses = "font-primary";
47
+ const Component = as ?? "p";
48
+ return /* @__PURE__ */ jsx(
49
+ Component,
50
+ {
51
+ className: cn(baseClasses, sizeClasses, weightClasses, color, className),
52
+ ...props,
53
+ children
54
+ }
55
+ );
56
+ };
57
+ var Text_default = Text;
58
+
59
+ // src/components/QuestionsData/QuestionsData.tsx
60
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
61
+ var BAR_COLORS = {
62
+ total: "bg-info-600",
63
+ corretas: "bg-success-200",
64
+ incorretas: "bg-warning-400",
65
+ emBranco: "bg-background-300"
66
+ };
67
+ var calculateYAxisTicks = (maxValue) => {
68
+ if (maxValue <= 0) return [0];
69
+ const niceMax = Math.ceil(maxValue / 10) * 10;
70
+ const step = niceMax / 4;
71
+ return [
72
+ niceMax,
73
+ Math.round(step * 3),
74
+ Math.round(step * 2),
75
+ Math.round(step),
76
+ 0
77
+ ];
78
+ };
79
+ var LegendItem = ({ color, label }) => /* @__PURE__ */ jsxs("div", { className: "flex flex-row items-center gap-2", children: [
80
+ /* @__PURE__ */ jsx2("div", { className: cn("w-2 h-2 rounded-full", color) }),
81
+ /* @__PURE__ */ jsx2(Text_default, { size: "xs", weight: "medium", className: "text-text-600", children: label })
82
+ ] });
83
+ var DataBar = ({
84
+ label,
85
+ value,
86
+ maxValue,
87
+ colorClass,
88
+ chartHeight
89
+ }) => {
90
+ const percentage = maxValue === 0 ? 0 : value / maxValue * 100;
91
+ const barHeight = percentage / 100 * chartHeight;
92
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 flex-1", children: [
93
+ /* @__PURE__ */ jsx2(
94
+ "div",
95
+ {
96
+ className: "w-full flex items-end justify-center",
97
+ style: { height: chartHeight },
98
+ children: /* @__PURE__ */ jsx2(
99
+ "div",
100
+ {
101
+ className: cn(
102
+ "w-16 rounded-lg transition-all duration-300",
103
+ colorClass
104
+ ),
105
+ style: { height: `${barHeight}px` }
106
+ }
107
+ )
108
+ }
109
+ ),
110
+ /* @__PURE__ */ jsx2(Text_default, { size: "xs", weight: "medium", className: "text-text-600 text-center", children: label })
111
+ ] });
112
+ };
113
+ var GridLines = ({
114
+ ticks,
115
+ chartHeight
116
+ }) => {
117
+ return /* @__PURE__ */ jsx2(
118
+ "div",
119
+ {
120
+ className: "absolute inset-0 flex flex-col justify-between pointer-events-none",
121
+ style: { height: chartHeight },
122
+ children: ticks.map((tick, index) => /* @__PURE__ */ jsx2(
123
+ "div",
124
+ {
125
+ className: "w-full border-t border-dashed border-border-200",
126
+ style: { marginTop: index === 0 ? 0 : void 0 }
127
+ },
128
+ `${tick}-${index}`
129
+ ))
130
+ }
131
+ );
132
+ };
133
+ var YAxis = ({
134
+ ticks,
135
+ chartHeight
136
+ }) => /* @__PURE__ */ jsx2(
137
+ "div",
138
+ {
139
+ className: "flex flex-col justify-between items-end pr-3",
140
+ style: { height: chartHeight },
141
+ "aria-hidden": "true",
142
+ children: ticks.map((tick, index) => /* @__PURE__ */ jsx2(
143
+ Text_default,
144
+ {
145
+ size: "xs",
146
+ weight: "medium",
147
+ className: "text-text-500",
148
+ children: tick
149
+ },
150
+ `${tick}-${index}`
151
+ ))
152
+ }
153
+ );
154
+ var QuestionsData = ({
155
+ title = "Dados de quest\xF5es",
156
+ data,
157
+ showEmBranco = false,
158
+ maxValue,
159
+ chartHeight = 180,
160
+ className,
161
+ ...props
162
+ }) => {
163
+ const chartMaxValue = maxValue ?? data.total;
164
+ const yAxisTicks = calculateYAxisTicks(chartMaxValue);
165
+ const adjustedMaxValue = yAxisTicks[0];
166
+ const blankSuffix = showEmBranco && data.emBranco !== void 0 ? `, ${data.emBranco} em branco` : "";
167
+ const chartDescription = `Gr\xE1fico de barras mostrando ${data.total} quest\xF5es respondidas, ${data.corretas} corretas, ${data.incorretas} incorretas${blankSuffix}`;
168
+ const barItems = [
169
+ {
170
+ key: "total",
171
+ label: "Total",
172
+ legendLabel: "Total de quest\xF5es respondidas",
173
+ value: data.total,
174
+ colorClass: BAR_COLORS.total
175
+ },
176
+ {
177
+ key: "corretas",
178
+ label: "Corretas",
179
+ legendLabel: "Quest\xF5es corretas",
180
+ value: data.corretas,
181
+ colorClass: BAR_COLORS.corretas
182
+ },
183
+ {
184
+ key: "incorretas",
185
+ label: "Incorretas",
186
+ legendLabel: "Quest\xF5es incorretas",
187
+ value: data.incorretas,
188
+ colorClass: BAR_COLORS.incorretas
189
+ }
190
+ ];
191
+ if (showEmBranco && data.emBranco !== void 0) {
192
+ barItems.push({
193
+ key: "emBranco",
194
+ label: "Em branco",
195
+ legendLabel: "Quest\xF5es em branco",
196
+ value: data.emBranco,
197
+ colorClass: BAR_COLORS.emBranco
198
+ });
199
+ }
200
+ return /* @__PURE__ */ jsxs(
201
+ "div",
202
+ {
203
+ className: cn(
204
+ "flex flex-col p-5 gap-4 bg-background border border-border-50 rounded-xl",
205
+ className
206
+ ),
207
+ ...props,
208
+ children: [
209
+ /* @__PURE__ */ jsx2(
210
+ Text_default,
211
+ {
212
+ as: "h3",
213
+ size: "lg",
214
+ weight: "bold",
215
+ className: "text-text-950 tracking-[0.2px]",
216
+ children: title
217
+ }
218
+ ),
219
+ /* @__PURE__ */ jsx2("div", { className: "flex flex-row flex-wrap gap-x-6 gap-y-2 mb-4", children: barItems.map((item) => /* @__PURE__ */ jsx2(
220
+ LegendItem,
221
+ {
222
+ color: BAR_COLORS[item.key],
223
+ label: item.legendLabel
224
+ },
225
+ item.key
226
+ )) }),
227
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-row", "aria-label": chartDescription, children: [
228
+ /* @__PURE__ */ jsx2(YAxis, { ticks: yAxisTicks, chartHeight }),
229
+ /* @__PURE__ */ jsx2("div", { className: "w-4" }),
230
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 relative", children: [
231
+ /* @__PURE__ */ jsx2(GridLines, { ticks: yAxisTicks, chartHeight }),
232
+ /* @__PURE__ */ jsx2("div", { className: "flex flex-row flex-1 gap-4 relative z-10", children: barItems.map((item) => /* @__PURE__ */ jsx2(
233
+ DataBar,
234
+ {
235
+ label: item.label,
236
+ value: item.value,
237
+ maxValue: adjustedMaxValue,
238
+ colorClass: item.colorClass,
239
+ chartHeight
240
+ },
241
+ item.key
242
+ )) })
243
+ ] })
244
+ ] })
245
+ ]
246
+ }
247
+ );
248
+ };
249
+ var QuestionsData_default = QuestionsData;
250
+ export {
251
+ QuestionsData,
252
+ QuestionsData_default as default
253
+ };
254
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/utils.ts","../../src/components/Text/Text.tsx","../../src/components/QuestionsData/QuestionsData.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport { syncDropdownState } from './dropdown';\nexport {\n getSelectedIdsFromCategories,\n toggleArrayItem,\n toggleSingleValue,\n areFiltersEqual,\n} from './activityFilters';\nexport {\n mapQuestionTypeToEnum,\n mapQuestionTypeToEnumRequired,\n} from './questionTypeUtils';\nexport {\n getStatusBadgeConfig,\n formatTimeSpent,\n formatQuestionNumbers,\n formatDateToBrazilian,\n} 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 { HTMLAttributes } from 'react';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\n\n/**\n * Data structure for questions statistics\n */\nexport interface QuestionsDataItem {\n /** Total number of questions answered */\n total: number;\n /** Number of correct answers */\n corretas: number;\n /** Number of incorrect answers */\n incorretas: number;\n /** Number of blank (unanswered) questions */\n emBranco?: number;\n}\n\n/**\n * Props for the QuestionsData component\n */\nexport interface QuestionsDataProps extends HTMLAttributes<HTMLDivElement> {\n /** Card title */\n title?: string;\n /** Question statistics data */\n data: QuestionsDataItem;\n /** Whether to show blank questions bar */\n showEmBranco?: boolean;\n /** Maximum value for the chart scale (defaults to total) */\n maxValue?: number;\n /** Height of the chart area in pixels */\n chartHeight?: number;\n}\n\n/**\n * Bar item configuration\n */\ninterface BarItemConfig {\n key: string;\n label: string;\n legendLabel: string;\n value: number;\n colorClass: string;\n}\n\n/**\n * Color classes for bars and legend dots using design system tokens\n */\nconst BAR_COLORS = {\n total: 'bg-info-600',\n corretas: 'bg-success-200',\n incorretas: 'bg-warning-400',\n emBranco: 'bg-background-300',\n} as const;\n\n/**\n * Calculate Y-axis tick values based on max value\n */\nconst calculateYAxisTicks = (maxValue: number): number[] => {\n if (maxValue <= 0) return [0];\n\n // Round up to nearest \"nice\" number for the max tick\n const niceMax = Math.ceil(maxValue / 10) * 10;\n\n // Generate 5 ticks including 0 and max\n const step = niceMax / 4;\n return [\n niceMax,\n Math.round(step * 3),\n Math.round(step * 2),\n Math.round(step),\n 0,\n ];\n};\n\n/**\n * Legend item component\n */\nconst LegendItem = ({ color, label }: { color: string; label: string }) => (\n <div className=\"flex flex-row items-center gap-2\">\n <div className={cn('w-2 h-2 rounded-full', color)} />\n <Text size=\"xs\" weight=\"medium\" className=\"text-text-600\">\n {label}\n </Text>\n </div>\n);\n\n/**\n * Individual vertical bar component\n */\nconst DataBar = ({\n label,\n value,\n maxValue,\n colorClass,\n chartHeight,\n}: {\n label: string;\n value: number;\n maxValue: number;\n colorClass: string;\n chartHeight: number;\n}) => {\n const percentage = maxValue === 0 ? 0 : (value / maxValue) * 100;\n const barHeight = (percentage / 100) * chartHeight;\n\n return (\n <div className=\"flex flex-col items-center gap-2 flex-1\">\n {/* Bar container */}\n <div\n className=\"w-full flex items-end justify-center\"\n style={{ height: chartHeight }}\n >\n <div\n className={cn(\n 'w-16 rounded-lg transition-all duration-300',\n colorClass\n )}\n style={{ height: `${barHeight}px` }}\n />\n </div>\n\n {/* Label */}\n <Text size=\"xs\" weight=\"medium\" className=\"text-text-600 text-center\">\n {label}\n </Text>\n </div>\n );\n};\n\n/**\n * Grid lines component for the chart background\n */\nconst GridLines = ({\n ticks,\n chartHeight,\n}: {\n ticks: number[];\n chartHeight: number;\n}) => {\n return (\n <div\n className=\"absolute inset-0 flex flex-col justify-between pointer-events-none\"\n style={{ height: chartHeight }}\n >\n {ticks.map((tick, index) => (\n <div\n key={`${tick}-${index}`}\n className=\"w-full border-t border-dashed border-border-200\"\n style={{ marginTop: index === 0 ? 0 : undefined }}\n />\n ))}\n </div>\n );\n};\n\n/**\n * Y-Axis component\n */\nconst YAxis = ({\n ticks,\n chartHeight,\n}: {\n ticks: number[];\n chartHeight: number;\n}) => (\n <div\n className=\"flex flex-col justify-between items-end pr-3\"\n style={{ height: chartHeight }}\n aria-hidden=\"true\"\n >\n {ticks.map((tick, index) => (\n <Text\n key={`${tick}-${index}`}\n size=\"xs\"\n weight=\"medium\"\n className=\"text-text-500\"\n >\n {tick}\n </Text>\n ))}\n </div>\n);\n\n/**\n * QuestionsData component - displays a vertical bar chart showing\n * question statistics (total, correct, incorrect, and optionally blank).\n *\n * @example\n * ```tsx\n * <QuestionsData\n * title=\"Dados de questões\"\n * data={{\n * total: 120,\n * corretas: 80,\n * incorretas: 30,\n * emBranco: 10,\n * }}\n * showEmBranco\n * />\n * ```\n */\nexport const QuestionsData = ({\n title = 'Dados de questões',\n data,\n showEmBranco = false,\n maxValue,\n chartHeight = 180,\n className,\n ...props\n}: QuestionsDataProps) => {\n // Calculate the maximum value for the scale\n const chartMaxValue = maxValue ?? data.total;\n\n // Calculate Y-axis ticks\n const yAxisTicks = calculateYAxisTicks(chartMaxValue);\n const adjustedMaxValue = yAxisTicks[0]; // Use the nice max for calculations\n\n // Build accessible chart description\n const blankSuffix =\n showEmBranco && data.emBranco !== undefined\n ? `, ${data.emBranco} em branco`\n : '';\n const chartDescription = `Gráfico de barras mostrando ${data.total} questões respondidas, ${data.corretas} corretas, ${data.incorretas} incorretas${blankSuffix}`;\n\n // Build bar items configuration\n const barItems: BarItemConfig[] = [\n {\n key: 'total',\n label: 'Total',\n legendLabel: 'Total de questões respondidas',\n value: data.total,\n colorClass: BAR_COLORS.total,\n },\n {\n key: 'corretas',\n label: 'Corretas',\n legendLabel: 'Questões corretas',\n value: data.corretas,\n colorClass: BAR_COLORS.corretas,\n },\n {\n key: 'incorretas',\n label: 'Incorretas',\n legendLabel: 'Questões incorretas',\n value: data.incorretas,\n colorClass: BAR_COLORS.incorretas,\n },\n ];\n\n // Add blank questions bar if enabled\n if (showEmBranco && data.emBranco !== undefined) {\n barItems.push({\n key: 'emBranco',\n label: 'Em branco',\n legendLabel: 'Questões em branco',\n value: data.emBranco,\n colorClass: BAR_COLORS.emBranco,\n });\n }\n\n return (\n <div\n className={cn(\n 'flex flex-col p-5 gap-4 bg-background border border-border-50 rounded-xl',\n className\n )}\n {...props}\n >\n {/* Header */}\n <Text\n as=\"h3\"\n size=\"lg\"\n weight=\"bold\"\n className=\"text-text-950 tracking-[0.2px]\"\n >\n {title}\n </Text>\n\n {/* Legend */}\n <div className=\"flex flex-row flex-wrap gap-x-6 gap-y-2 mb-4\">\n {barItems.map((item) => (\n <LegendItem\n key={item.key}\n color={BAR_COLORS[item.key as keyof typeof BAR_COLORS]}\n label={item.legendLabel}\n />\n ))}\n </div>\n\n {/* Chart */}\n <div className=\"flex flex-row\" aria-label={chartDescription}>\n {/* Y-Axis */}\n <YAxis ticks={yAxisTicks} chartHeight={chartHeight} />\n\n {/* Spacer between Y-axis and chart */}\n <div className=\"w-4\" />\n\n {/* Chart area with grid and bars */}\n <div className=\"flex-1 relative\">\n {/* Grid lines */}\n <GridLines ticks={yAxisTicks} chartHeight={chartHeight} />\n\n {/* Bars */}\n <div className=\"flex flex-row flex-1 gap-4 relative z-10\">\n {barItems.map((item) => (\n <DataBar\n key={item.key}\n label={item.label}\n value={item.value}\n maxValue={adjustedMaxValue}\n colorClass={item.colorClass}\n chartHeight={chartHeight}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default QuestionsData;\n"],"mappings":"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","names":["jsx"]}