analytica-frontend-lib 1.0.44 → 1.0.46

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.
@@ -0,0 +1,381 @@
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/Stepper/Stepper.tsx
21
+ var Stepper_exports = {};
22
+ __export(Stepper_exports, {
23
+ Step: () => Step,
24
+ default: () => Stepper_default
25
+ });
26
+ module.exports = __toCommonJS(Stepper_exports);
27
+
28
+ // src/components/Text/Text.tsx
29
+ var import_jsx_runtime = require("react/jsx-runtime");
30
+ var Text = ({
31
+ children,
32
+ size = "md",
33
+ weight = "normal",
34
+ color = "text-text-950",
35
+ as,
36
+ className = "",
37
+ ...props
38
+ }) => {
39
+ let sizeClasses = "";
40
+ let weightClasses = "";
41
+ const sizeClassMap = {
42
+ "2xs": "text-2xs",
43
+ xs: "text-xs",
44
+ sm: "text-sm",
45
+ md: "text-md",
46
+ lg: "text-lg",
47
+ xl: "text-xl",
48
+ "2xl": "text-2xl",
49
+ "3xl": "text-3xl",
50
+ "4xl": "text-4xl",
51
+ "5xl": "text-5xl",
52
+ "6xl": "text-6xl"
53
+ };
54
+ sizeClasses = sizeClassMap[size] ?? sizeClassMap.md;
55
+ const weightClassMap = {
56
+ hairline: "font-hairline",
57
+ light: "font-light",
58
+ normal: "font-normal",
59
+ medium: "font-medium",
60
+ semibold: "font-semibold",
61
+ bold: "font-bold",
62
+ extrabold: "font-extrabold",
63
+ black: "font-black"
64
+ };
65
+ weightClasses = weightClassMap[weight] ?? weightClassMap.normal;
66
+ const baseClasses = "font-primary";
67
+ const Component = as ?? "p";
68
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
69
+ Component,
70
+ {
71
+ className: `${baseClasses} ${sizeClasses} ${weightClasses} ${color} ${className}`,
72
+ ...props,
73
+ children
74
+ }
75
+ );
76
+ };
77
+ var Text_default = Text;
78
+
79
+ // src/components/Stepper/Stepper.tsx
80
+ var import_phosphor_react = require("phosphor-react");
81
+ var import_jsx_runtime2 = require("react/jsx-runtime");
82
+ var SIZE_CLASSES = {
83
+ small: {
84
+ container: "gap-2",
85
+ // 8px gap as specified in CSS
86
+ stepWidth: "w-[58px]",
87
+ // exact 58px from CSS
88
+ stepHeight: "h-[38px]",
89
+ // exact 38px from CSS
90
+ indicator: "w-5 h-5",
91
+ // 20px as specified
92
+ progressBar: "h-0.5",
93
+ // 2px as specified
94
+ indicatorTextSize: "2xs",
95
+ // 10px as specified
96
+ labelTextSize: "xs",
97
+ // 12px as specified
98
+ iconSize: "w-3 h-3"
99
+ // 12px
100
+ },
101
+ medium: {
102
+ container: "gap-3",
103
+ // 12px (8px + 4px progression)
104
+ stepWidth: "w-[110px]",
105
+ // 110px (increased from 90px to fit "Endereço Residencial")
106
+ stepHeight: "h-[48px]",
107
+ // 48px (increased from 46px for better proportion)
108
+ indicator: "w-6 h-6",
109
+ // 24px (20px + 4px progression)
110
+ progressBar: "h-0.5",
111
+ // 2px maintained for consistency
112
+ indicatorTextSize: "2xs",
113
+ // 10px maintained for readability
114
+ labelTextSize: "xs",
115
+ // 12px maintained
116
+ iconSize: "w-3.5 h-3.5"
117
+ // 14px
118
+ },
119
+ large: {
120
+ container: "gap-4",
121
+ // 16px (12px + 4px progression)
122
+ stepWidth: "w-[160px]",
123
+ // 160px (increased from 140px to fit "Endereço Residencial")
124
+ stepHeight: "h-[58px]",
125
+ // 58px (increased from 54px for better proportion)
126
+ indicator: "w-7 h-7",
127
+ // 28px (24px + 4px progression)
128
+ progressBar: "h-1",
129
+ // 4px (increased for better visibility)
130
+ indicatorTextSize: "xs",
131
+ // 12px (increased for larger size)
132
+ labelTextSize: "sm",
133
+ // 14px (increased for larger size)
134
+ iconSize: "w-4 h-4"
135
+ // 16px
136
+ },
137
+ extraLarge: {
138
+ container: "gap-5",
139
+ // 20px (16px + 4px progression)
140
+ stepWidth: "w-[200px]",
141
+ // 200px (increased from 180px to ensure "Endereço Residencial" fits)
142
+ stepHeight: "h-[68px]",
143
+ // 68px (increased from 62px for better proportion)
144
+ indicator: "w-8 h-8",
145
+ // 32px (28px + 4px progression)
146
+ progressBar: "h-1",
147
+ // 4px maintained
148
+ indicatorTextSize: "xs",
149
+ // 12px maintained for readability
150
+ labelTextSize: "sm",
151
+ // 14px maintained
152
+ iconSize: "w-[18px] h-[18px]"
153
+ // 18px
154
+ }
155
+ };
156
+ var STATE_CLASSES = {
157
+ pending: {
158
+ progressBar: "bg-text-400",
159
+ // #A3A3A3
160
+ indicator: "bg-text-400",
161
+ // #A3A3A3
162
+ indicatorText: "text-white",
163
+ // Branco para contraste com background cinza
164
+ label: "text-text-400"
165
+ // #A3A3A3
166
+ },
167
+ current: {
168
+ progressBar: "bg-primary-800",
169
+ // #1C61B2 usando classe Tailwind padrão
170
+ indicator: "bg-primary-800",
171
+ // #1C61B2 usando classe Tailwind padrão
172
+ indicatorText: "text-white",
173
+ // Branco usando classe Tailwind padrão
174
+ label: "text-primary-800"
175
+ // #1C61B2 usando classe Tailwind padrão
176
+ },
177
+ completed: {
178
+ progressBar: "bg-primary-400",
179
+ // #48A0E8 para barra quando checked (completed)
180
+ indicator: "bg-primary-400",
181
+ // #48A0E8 para corresponder à barra de progresso
182
+ indicatorText: "text-white",
183
+ // Branco usando classe Tailwind padrão
184
+ label: "text-primary-400"
185
+ // #48A0E8 para corresponder à barra de progresso
186
+ }
187
+ };
188
+ var Step = ({
189
+ step,
190
+ index,
191
+ size: _size,
192
+ sizeClasses,
193
+ stateClasses,
194
+ isLast: _isLast,
195
+ className = ""
196
+ }) => {
197
+ const stepNumber = index + 1;
198
+ const isCompleted = step.state === "completed";
199
+ const getAriaLabel = () => {
200
+ let suffix = "";
201
+ if (step.state === "completed") {
202
+ suffix = " (conclu\xEDdo)";
203
+ } else if (step.state === "current") {
204
+ suffix = " (atual)";
205
+ }
206
+ return `${step.label}${suffix}`;
207
+ };
208
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
209
+ "div",
210
+ {
211
+ className: `
212
+ flex flex-col justify-center items-center pb-2 gap-2
213
+ ${sizeClasses.stepWidth} ${sizeClasses.stepHeight}
214
+ flex-none flex-grow
215
+ ${className}
216
+ sm:max-w-[100px] md:max-w-[120px] lg:max-w-none xl:max-w-none
217
+ sm:min-h-[40px] md:min-h-[45px] lg:min-h-none
218
+ overflow-visible
219
+ `,
220
+ children: [
221
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
222
+ "div",
223
+ {
224
+ className: `
225
+ w-full ${sizeClasses.progressBar} ${stateClasses.progressBar}
226
+ rounded-sm flex-none
227
+ `
228
+ }
229
+ ),
230
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
231
+ "div",
232
+ {
233
+ className: `
234
+ flex flex-col sm:flex-row items-center
235
+ gap-1 sm:gap-2 w-full sm:w-auto
236
+ h-auto sm:h-5 flex-none
237
+ overflow-visible
238
+ `,
239
+ children: [
240
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
241
+ "div",
242
+ {
243
+ className: `
244
+ ${sizeClasses.indicator} ${stateClasses.indicator}
245
+ rounded-full flex items-center justify-center relative
246
+ flex-none transition-all duration-300 ease-out
247
+ w-4 h-4 sm:w-5 sm:h-5 md:w-5 md:h-5 lg:w-6 lg:h-6
248
+ `,
249
+ "aria-label": getAriaLabel(),
250
+ children: isCompleted ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
251
+ import_phosphor_react.Check,
252
+ {
253
+ weight: "bold",
254
+ className: `
255
+ ${stateClasses.indicatorText}
256
+ w-2.5 h-2.5 sm:w-3 sm:h-3 md:w-3 md:h-3 lg:w-3.5 lg:h-3.5
257
+ `
258
+ }
259
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
260
+ Text_default,
261
+ {
262
+ size: sizeClasses.indicatorTextSize,
263
+ weight: "medium",
264
+ color: "",
265
+ className: `${stateClasses.indicatorText} leading-none text-2xs sm:text-xs`,
266
+ children: stepNumber
267
+ }
268
+ )
269
+ }
270
+ ),
271
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
272
+ Text_default,
273
+ {
274
+ size: sizeClasses.labelTextSize,
275
+ weight: "medium",
276
+ color: "",
277
+ className: `
278
+ ${stateClasses.label} leading-tight flex-none
279
+ text-center sm:text-left break-words
280
+ px-1 sm:px-0 max-w-full
281
+ text-2xs sm:text-xs md:text-xs lg:text-sm
282
+ whitespace-normal
283
+ `,
284
+ children: step.label
285
+ }
286
+ )
287
+ ]
288
+ }
289
+ )
290
+ ]
291
+ }
292
+ );
293
+ };
294
+ var calculateStepStates = (steps, currentStep) => {
295
+ return steps.map((step, index) => {
296
+ let stepState;
297
+ if (index < currentStep) {
298
+ stepState = "completed";
299
+ } else if (index === currentStep) {
300
+ stepState = "current";
301
+ } else {
302
+ stepState = "pending";
303
+ }
304
+ return {
305
+ ...step,
306
+ state: stepState
307
+ };
308
+ });
309
+ };
310
+ var getProgressText = (currentStep, totalSteps, customText) => {
311
+ if (customText) return customText;
312
+ return `Etapa ${currentStep + 1} de ${totalSteps}`;
313
+ };
314
+ var Stepper = ({
315
+ steps: initialSteps,
316
+ size = "medium",
317
+ currentStep,
318
+ className = "",
319
+ stepClassName = "",
320
+ showProgress = false,
321
+ progressText,
322
+ responsive = true
323
+ }) => {
324
+ const sizeClasses = SIZE_CLASSES[size];
325
+ const steps = currentStep !== void 0 ? calculateStepStates(initialSteps, currentStep) : initialSteps;
326
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
327
+ "fieldset",
328
+ {
329
+ className: `flex flex-col gap-4 sm:gap-5 md:gap-6 ${className} border-0 p-0 m-0`,
330
+ children: [
331
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("legend", { className: "absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0", children: "Stepper de formul\xE1rio" }),
332
+ showProgress && currentStep !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
333
+ Text_default,
334
+ {
335
+ size: "sm",
336
+ weight: "medium",
337
+ className: "text-text-600 text-center sm:text-left text-xs sm:text-sm",
338
+ children: getProgressText(currentStep, steps.length, progressText)
339
+ }
340
+ ),
341
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
342
+ "div",
343
+ {
344
+ className: `
345
+ flex items-center
346
+ ${sizeClasses.container}
347
+ ${responsive ? "flex-row overflow-x-auto overflow-y-hidden scrollbar-hide justify-start sm:justify-center md:justify-center lg:justify-center" : "flex-row justify-center"}
348
+ px-2 sm:px-4 md:px-6 lg:px-0
349
+ max-w-full min-w-0
350
+ gap-2 sm:gap-3 md:gap-4 lg:gap-4
351
+ `,
352
+ role: "tablist",
353
+ "aria-label": "Progress steps",
354
+ children: steps.map((step, index) => {
355
+ const stateClasses = STATE_CLASSES[step.state];
356
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
357
+ Step,
358
+ {
359
+ step,
360
+ index,
361
+ size,
362
+ sizeClasses,
363
+ stateClasses,
364
+ isLast: index === steps.length - 1,
365
+ className: stepClassName
366
+ },
367
+ step.id
368
+ );
369
+ })
370
+ }
371
+ )
372
+ ]
373
+ }
374
+ );
375
+ };
376
+ var Stepper_default = Stepper;
377
+ // Annotate the CommonJS export names for ESM import in node:
378
+ 0 && (module.exports = {
379
+ Step
380
+ });
381
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/Stepper/Stepper.tsx","../../src/components/Text/Text.tsx"],"sourcesContent":["// ReactNode removed as it's not used in this component\nimport Text from '../Text/Text';\nimport { Check } from 'phosphor-react';\n\n/**\n * Stepper size variants\n */\ntype StepperSize = 'small' | 'medium' | 'large' | 'extraLarge';\n\n/**\n * Step state variants\n */\ntype StepState = 'pending' | 'current' | 'completed';\n\n/**\n * Individual step data interface\n */\nexport interface StepData {\n /** Unique identifier for the step */\n id: string;\n /** Label text for the step */\n label: string;\n /** Current state of the step */\n state: StepState;\n}\n\n/**\n * Size configurations - Following design system pattern from CSS specifications\n * Small size based on exact CSS: width 58px, height 38px, gap 8px\n */\nconst SIZE_CLASSES = {\n small: {\n container: 'gap-2', // 8px gap as specified in CSS\n stepWidth: 'w-[58px]', // exact 58px from CSS\n stepHeight: 'h-[38px]', // exact 38px from CSS\n indicator: 'w-5 h-5', // 20px as specified\n progressBar: 'h-0.5', // 2px as specified\n indicatorTextSize: '2xs', // 10px as specified\n labelTextSize: 'xs', // 12px as specified\n iconSize: 'w-3 h-3', // 12px\n },\n medium: {\n container: 'gap-3', // 12px (8px + 4px progression)\n stepWidth: 'w-[110px]', // 110px (increased from 90px to fit \"Endereço Residencial\")\n stepHeight: 'h-[48px]', // 48px (increased from 46px for better proportion)\n indicator: 'w-6 h-6', // 24px (20px + 4px progression)\n progressBar: 'h-0.5', // 2px maintained for consistency\n indicatorTextSize: '2xs', // 10px maintained for readability\n labelTextSize: 'xs', // 12px maintained\n iconSize: 'w-3.5 h-3.5', // 14px\n },\n large: {\n container: 'gap-4', // 16px (12px + 4px progression)\n stepWidth: 'w-[160px]', // 160px (increased from 140px to fit \"Endereço Residencial\")\n stepHeight: 'h-[58px]', // 58px (increased from 54px for better proportion)\n indicator: 'w-7 h-7', // 28px (24px + 4px progression)\n progressBar: 'h-1', // 4px (increased for better visibility)\n indicatorTextSize: 'xs', // 12px (increased for larger size)\n labelTextSize: 'sm', // 14px (increased for larger size)\n iconSize: 'w-4 h-4', // 16px\n },\n extraLarge: {\n container: 'gap-5', // 20px (16px + 4px progression)\n stepWidth: 'w-[200px]', // 200px (increased from 180px to ensure \"Endereço Residencial\" fits)\n stepHeight: 'h-[68px]', // 68px (increased from 62px for better proportion)\n indicator: 'w-8 h-8', // 32px (28px + 4px progression)\n progressBar: 'h-1', // 4px maintained\n indicatorTextSize: 'xs', // 12px maintained for readability\n labelTextSize: 'sm', // 14px maintained\n iconSize: 'w-[18px] h-[18px]', // 18px\n },\n} as const;\n\n/**\n * State configurations using exact colors from CSS specs\n * pending: #A3A3A3 = text-400 (etapa ainda não iniciada)\n * current: #1C61B2 = primary-800 (etapa atual sendo preenchida) - baseado no CSS fornecido\n * completed: #1C61B2 = primary-800 (etapa concluída)\n * text color: #FEFEFF = text\n */\nconst STATE_CLASSES = {\n pending: {\n progressBar: 'bg-text-400', // #A3A3A3\n indicator: 'bg-text-400', // #A3A3A3\n indicatorText: 'text-white', // Branco para contraste com background cinza\n label: 'text-text-400', // #A3A3A3\n },\n current: {\n progressBar: 'bg-primary-800', // #1C61B2 usando classe Tailwind padrão\n indicator: 'bg-primary-800', // #1C61B2 usando classe Tailwind padrão\n indicatorText: 'text-white', // Branco usando classe Tailwind padrão\n label: 'text-primary-800', // #1C61B2 usando classe Tailwind padrão\n },\n completed: {\n progressBar: 'bg-primary-400', // #48A0E8 para barra quando checked (completed)\n indicator: 'bg-primary-400', // #48A0E8 para corresponder à barra de progresso\n indicatorText: 'text-white', // Branco usando classe Tailwind padrão\n label: 'text-primary-400', // #48A0E8 para corresponder à barra de progresso\n },\n} as const;\n\n/**\n * Type for size classes\n */\ntype SizeClassType = (typeof SIZE_CLASSES)[keyof typeof SIZE_CLASSES];\n\n/**\n * Type for state classes\n */\ntype StateClassType = (typeof STATE_CLASSES)[keyof typeof STATE_CLASSES];\n\n/**\n * Props for individual step component\n */\ninterface StepProps {\n step: StepData;\n index: number;\n size: StepperSize;\n sizeClasses: SizeClassType;\n stateClasses: StateClassType;\n isLast: boolean;\n className?: string;\n}\n\n/**\n * Individual Step component - Based on exact design specifications\n * Layout: flex-column with progress bar at top, then icon+label row\n * Fully responsive for mobile, tablets, and laptops\n */\nexport const Step = ({\n step,\n index,\n size: _size,\n sizeClasses,\n stateClasses,\n isLast: _isLast,\n className = '',\n}: StepProps) => {\n const stepNumber = index + 1;\n const isCompleted = step.state === 'completed';\n\n // Generate accessible aria-label based on step state\n const getAriaLabel = () => {\n let suffix = '';\n if (step.state === 'completed') {\n suffix = ' (concluído)';\n } else if (step.state === 'current') {\n suffix = ' (atual)';\n }\n return `${step.label}${suffix}`;\n };\n\n return (\n <div\n className={`\n flex flex-col justify-center items-center pb-2 gap-2\n ${sizeClasses.stepWidth} ${sizeClasses.stepHeight}\n flex-none flex-grow\n ${className}\n sm:max-w-[100px] md:max-w-[120px] lg:max-w-none xl:max-w-none\n sm:min-h-[40px] md:min-h-[45px] lg:min-h-none\n overflow-visible\n `}\n >\n {/* Progress Bar - Full width at top with responsive scaling */}\n <div\n className={`\n w-full ${sizeClasses.progressBar} ${stateClasses.progressBar}\n rounded-sm flex-none\n `}\n />\n\n {/* Step Content Container - Responsive layout for all devices, no vertical scroll */}\n <div\n className={`\n flex flex-col sm:flex-row items-center\n gap-1 sm:gap-2 w-full sm:w-auto\n h-auto sm:h-5 flex-none\n overflow-visible\n `}\n >\n {/* Step Indicator Circle with responsive sizing */}\n <div\n className={`\n ${sizeClasses.indicator} ${stateClasses.indicator}\n rounded-full flex items-center justify-center relative\n flex-none transition-all duration-300 ease-out\n w-4 h-4 sm:w-5 sm:h-5 md:w-5 md:h-5 lg:w-6 lg:h-6\n `}\n aria-label={getAriaLabel()}\n >\n {isCompleted ? (\n <Check\n weight=\"bold\"\n className={`\n ${stateClasses.indicatorText}\n w-2.5 h-2.5 sm:w-3 sm:h-3 md:w-3 md:h-3 lg:w-3.5 lg:h-3.5\n `}\n />\n ) : (\n <Text\n size={sizeClasses.indicatorTextSize as '2xs' | 'xs' | 'sm'}\n weight=\"medium\"\n color=\"\"\n className={`${stateClasses.indicatorText} leading-none text-2xs sm:text-xs`}\n >\n {stepNumber}\n </Text>\n )}\n </div>\n\n {/* Step Label with full responsive text sizing, no vertical overflow */}\n <Text\n size={sizeClasses.labelTextSize as '2xs' | 'xs' | 'sm' | 'md'}\n weight=\"medium\"\n color=\"\"\n className={`\n ${stateClasses.label} leading-tight flex-none\n text-center sm:text-left break-words\n px-1 sm:px-0 max-w-full\n text-2xs sm:text-xs md:text-xs lg:text-sm\n whitespace-normal\n `}\n >\n {step.label}\n </Text>\n </div>\n </div>\n );\n};\n\n/**\n * Stepper component props interface\n */\nexport type StepperProps = {\n /** Array of step data */\n steps: StepData[];\n /** Size variant of the stepper */\n size?: StepperSize;\n /** Current active step index */\n currentStep?: number;\n /** Additional CSS classes */\n className?: string;\n /** Step container CSS classes */\n stepClassName?: string;\n /** Progress indicator (e.g., \"Etapa 2 de 4\") */\n showProgress?: boolean;\n /** Custom progress text */\n progressText?: string;\n /** Make stepper responsive (vertical on mobile) */\n responsive?: boolean;\n};\n\n/**\n * Helper function to calculate step states based on current step\n */\nconst calculateStepStates = (\n steps: StepData[],\n currentStep: number\n): StepData[] => {\n return steps.map((step, index) => {\n let stepState: StepState;\n\n if (index < currentStep) {\n stepState = 'completed';\n } else if (index === currentStep) {\n stepState = 'current';\n } else {\n stepState = 'pending';\n }\n\n return {\n ...step,\n state: stepState,\n };\n });\n};\n\n/**\n * Helper function to get progress text\n */\nconst getProgressText = (\n currentStep: number,\n totalSteps: number,\n customText?: string\n): string => {\n if (customText) return customText;\n return `Etapa ${currentStep + 1} de ${totalSteps}`;\n};\n\n/**\n * Stepper component for Analytica Ensino platforms\n *\n * A progress stepper component that displays a sequence of steps with different states.\n * Follows the exact design specifications with proper spacing, colors, and layout.\n * Fully responsive for mobile, tablets, and laptops.\n *\n * Design specifications:\n * - Based on exact CSS specifications from Figma design\n * - Fully responsive: mobile (320px+) -> tablets (640px+) -> laptops (1024px+)\n * - Progressive sizing with responsive breakpoints that adapt to device type\n * - Consistent gaps that scale with screen size and device capabilities\n * - Consistent color scheme: pending (gray), current (dark blue), completed (light blue)\n * - Responsive design with overflow scroll on smaller devices\n * - Optimized text sizing and layout for each device category\n *\n * @example\n * ```tsx\n * // Basic stepper - automatically responsive for all devices\n * <Stepper steps={steps} currentStep={1} />\n *\n * // Custom styling with full responsive behavior\n * <Stepper steps={steps} size=\"medium\" showProgress responsive />\n * ```\n */\nconst Stepper = ({\n steps: initialSteps,\n size = 'medium',\n currentStep,\n className = '',\n stepClassName = '',\n showProgress = false,\n progressText,\n responsive = true,\n}: StepperProps) => {\n const sizeClasses = SIZE_CLASSES[size];\n\n // Calculate steps with states if currentStep is provided\n const steps =\n currentStep !== undefined\n ? calculateStepStates(initialSteps, currentStep)\n : initialSteps;\n\n return (\n <fieldset\n className={`flex flex-col gap-4 sm:gap-5 md:gap-6 ${className} border-0 p-0 m-0`}\n >\n <legend className=\"absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0\">\n Stepper de formulário\n </legend>\n {/* Progress indicator with responsive text */}\n {showProgress && currentStep !== undefined && (\n <Text\n size=\"sm\"\n weight=\"medium\"\n className=\"text-text-600 text-center sm:text-left text-xs sm:text-sm\"\n >\n {getProgressText(currentStep, steps.length, progressText)}\n </Text>\n )}\n\n {/* Stepper container - Fully responsive for all devices with horizontal scroll only */}\n <div\n className={`\n flex items-center\n ${sizeClasses.container}\n ${\n responsive\n ? 'flex-row overflow-x-auto overflow-y-hidden scrollbar-hide justify-start sm:justify-center md:justify-center lg:justify-center'\n : 'flex-row justify-center'\n }\n px-2 sm:px-4 md:px-6 lg:px-0\n max-w-full min-w-0\n gap-2 sm:gap-3 md:gap-4 lg:gap-4\n `}\n role=\"tablist\"\n aria-label=\"Progress steps\"\n >\n {steps.map((step, index) => {\n const stateClasses = STATE_CLASSES[step.state];\n\n return (\n <Step\n key={step.id}\n step={step}\n index={index}\n size={size}\n sizeClasses={sizeClasses}\n stateClasses={stateClasses}\n isLast={index === steps.length - 1}\n className={stepClassName}\n />\n );\n })}\n </div>\n </fieldset>\n );\n};\n\nexport default Stepper;\n","import { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\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={`${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"]}