@foi/design-system 0.0.16 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -329,7 +329,7 @@ interface Product { id: number; name: string; price: number; }
329
329
  const columns: DataGridColumn<Product>[] = [
330
330
  {
331
331
  key: 'name',
332
- label: 'Product',
332
+ label: 'Product', // string → wrapped in the themed --DATAGRID-thLabel span
333
333
  type: 'text',
334
334
  filter: { type: 'search' },
335
335
  },
@@ -342,6 +342,23 @@ const columns: DataGridColumn<Product>[] = [
342
342
  ];
343
343
  ```
344
344
 
345
+ `label` accepts any `ReactNode`. A plain string is automatically wrapped in the themed `--DATAGRID-thLabel` span so it inherits the header typography. Pass a custom node to render icons, badges, or anything else without that wrapper:
346
+
347
+ ```tsx
348
+ import Icon from '@components/atoms/Icon';
349
+
350
+ {
351
+ key: 'price',
352
+ label: (
353
+ <span style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>
354
+ <Icon name='payments' size='sm' />
355
+ Price
356
+ </span>
357
+ ),
358
+ type: 'number',
359
+ }
360
+ ```
361
+
345
362
  ### The `onFetch` contract
346
363
 
347
364
  `onFetch` receives `{ page, pageSize, sort?, filters? }` and must return `{ data, total }`. It is called automatically whenever the page, sort, or any filter changes.
@@ -0,0 +1,456 @@
1
+ import { i as e, n as t, r as n } from "./emotion-react-jsx-runtime.browser.esm-Ch-DwUYg.js";
2
+ import { r } from "./theme-D01EcUA9.js";
3
+ import { a as i, i as a, n as o, o as s, r as c, s as l, t as u } from "./RadioGroup.context-Bu218uUX.js";
4
+ import d, { useEffect as f, useMemo as p, useRef as m } from "react";
5
+ import { css as h } from "@emotion/react";
6
+ import { useController as g } from "react-hook-form";
7
+ import { createPortal as _ } from "react-dom";
8
+ //#region src/components/molecules/CheckboxGroup/CheckboxGroup.emotion.ts
9
+ var v = (e, t) => `
10
+ .--CHECKBOXGROUP-label {
11
+ ${r(e, "color", `--CHECKBOXGROUP-EVENTS-${t}-COLOR-PRIMARY`)}
12
+ }
13
+
14
+ .--CHECKBOXGROUP-helperText {
15
+ ${r(e, "color", `--CHECKBOXGROUP-EVENTS-${t}-COLOR-SECONDARY`)}
16
+ }
17
+ `, y = (e) => h`
18
+ &.--CHECKBOXGROUP {
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: 8px;
22
+ width: fit-content;
23
+
24
+ // ENABLED
25
+ ${v(e, "ENABLED")};
26
+
27
+ // ERROR
28
+ &.--CHECKBOXGROUP-error {
29
+ ${v(e, "ERROR")};
30
+ }
31
+
32
+ // DISABLED
33
+ &.--CHECKBOXGROUP-disabled {
34
+ ${v(e, "DISABLED")};
35
+ }
36
+
37
+ .--CHECKBOXGROUP-items {
38
+ display: flex;
39
+ flex-direction: column;
40
+ gap: 16px;
41
+ }
42
+
43
+ &.--CHECKBOXGROUP--horizontal .--CHECKBOXGROUP-items {
44
+ flex-direction: row;
45
+ flex-wrap: wrap;
46
+ }
47
+
48
+ .--CHECKBOXGROUP-label {
49
+ // FONT
50
+ font-family: ${e["--FONTFAMILY-PRIMARY"]};
51
+ font-size: 0.875rem;
52
+ font-weight: 500;
53
+ line-height: 1;
54
+ }
55
+
56
+ .--CHECKBOXGROUP-helperText {
57
+ // FONT
58
+ font-family: ${e["--FONTFAMILY-PRIMARY"]};
59
+ font-size: 13px;
60
+ line-height: 16px;
61
+ margin-left: 14px;
62
+ }
63
+ }
64
+ `, b = "--CHECKBOXGROUP", x = ({ name: e, control: r, children: a, label: o, helperText: s, showErrorText: c = !0, disabled: l, direction: u = "vertical", style: d, className: f }) => {
65
+ let { field: p, fieldState: m } = g({
66
+ control: r,
67
+ name: e
68
+ }), h = Array.isArray(p.value) ? p.value : [], _ = m.error;
69
+ return /* @__PURE__ */ t(i.Provider, {
70
+ value: {
71
+ checkedValues: h,
72
+ onChange: (e, t) => {
73
+ let n = t ? [...h, e] : h.filter((t) => t !== e);
74
+ p.onChange(n), p.onBlur();
75
+ },
76
+ disabled: l,
77
+ error: _
78
+ },
79
+ children: /* @__PURE__ */ n("div", {
80
+ className: [
81
+ b,
82
+ `${b}--${u}`,
83
+ c && _?.message && `${b}-error`,
84
+ l && `${b}-disabled`,
85
+ f || ""
86
+ ].join(" "),
87
+ css: y(d),
88
+ "data-testid": b,
89
+ children: [
90
+ o && /* @__PURE__ */ t("span", {
91
+ className: `${b}-label`,
92
+ "data-testid": `${b}-label`,
93
+ children: o
94
+ }),
95
+ /* @__PURE__ */ t("div", {
96
+ className: `${b}-items`,
97
+ "data-testid": `${b}-items`,
98
+ children: a
99
+ }),
100
+ /* @__PURE__ */ n("span", {
101
+ className: `${b}-helperText`,
102
+ "data-testid": `${b}-helperText`,
103
+ children: [s && (!_ || !c) && s, c && _ && _.message]
104
+ })
105
+ ]
106
+ })
107
+ });
108
+ }, S = ({ theme: n, variant: r = "default", ...i }) => {
109
+ let { componentStyles: a } = e([l.CHECKBOXGROUP], n, r.toUpperCase());
110
+ return /* @__PURE__ */ t(x, {
111
+ ...i,
112
+ style: a
113
+ });
114
+ }, C = (e) => h`
115
+ &.--CHECKBOXTREE {
116
+ display: flex;
117
+ flex-direction: column;
118
+ gap: 8px;
119
+ width: fit-content;
120
+
121
+ .--CHECKBOXTREE-children {
122
+ display: flex;
123
+ flex-direction: column;
124
+ padding-left: 36px;
125
+ gap: 16px;
126
+ }
127
+
128
+ .--CHECKBOXTREE-helperText {
129
+ font-family: ${e["--FONTFAMILY-PRIMARY"]};
130
+ font-size: 13px;
131
+ line-height: 16px;
132
+ margin-left: 14px;
133
+ ${r(e, "color", "--CHECKBOXTREE-EVENTS-ENABLED-COLOR-SECONDARY")}
134
+
135
+ &:empty {
136
+ display: none;
137
+ }
138
+ }
139
+
140
+ &.--CHECKBOXTREE-error {
141
+ .--CHECKBOXTREE-helperText {
142
+ ${r(e, "color", "--CHECKBOXTREE-EVENTS-ERROR-COLOR-SECONDARY")}
143
+ }
144
+ }
145
+
146
+ &.--CHECKBOXTREE-disabled {
147
+ .--CHECKBOXTREE-helperText {
148
+ ${r(e, "color", "--CHECKBOXTREE-EVENTS-DISABLED-COLOR-SECONDARY")}
149
+ }
150
+ }
151
+ }
152
+ `, w = "--CHECKBOXTREE", T = ({ name: e, control: r, children: i, label: o, iconChecked: l = /* @__PURE__ */ t(s, { name: "check" }), iconIndeterminate: u = /* @__PURE__ */ t(s, { name: "remove" }), helperText: h, showErrorText: _ = !0, disabled: v, style: y, className: b }) => {
153
+ let { field: x, fieldState: S } = g({
154
+ control: r,
155
+ name: e
156
+ }), T = Array.isArray(x.value) ? x.value : [], E = S.error, D = p(() => d.Children.toArray(i).map((e) => {
157
+ let t = e;
158
+ return t.props?.value ?? t.props?.name ?? "";
159
+ }).filter(Boolean), [i]), O = D.length > 0 && D.every((e) => T.includes(e)), k = !O && D.some((e) => T.includes(e)), A = m(null);
160
+ return f(() => {
161
+ let e = A.current?.querySelectorAll("input[type=\"checkbox\"]")[0];
162
+ e && (e.indeterminate = k);
163
+ }, [k]), /* @__PURE__ */ n("div", {
164
+ ref: A,
165
+ className: [
166
+ w,
167
+ _ && E?.message ? `${w}-error` : "",
168
+ v ? `${w}-disabled` : "",
169
+ b || ""
170
+ ].join(" "),
171
+ css: C(y),
172
+ "data-testid": w,
173
+ children: [
174
+ /* @__PURE__ */ t(c, {
175
+ checked: O || k,
176
+ onChecked: (e) => {
177
+ let t = e ? [...D] : [];
178
+ x.onChange(t), x.onBlur();
179
+ },
180
+ label: o,
181
+ icon: k ? u : l,
182
+ disabled: v,
183
+ showErrorText: !1,
184
+ helperText: void 0
185
+ }),
186
+ /* @__PURE__ */ t(a.Provider, {
187
+ value: {
188
+ checkedValues: T,
189
+ onChange: (e, t) => {
190
+ let n = t ? [...T, e] : T.filter((t) => t !== e);
191
+ x.onChange(n), x.onBlur();
192
+ },
193
+ disabled: v,
194
+ error: E
195
+ },
196
+ children: /* @__PURE__ */ t("div", {
197
+ className: `${w}-children`,
198
+ "data-testid": `${w}-children`,
199
+ children: i
200
+ })
201
+ }),
202
+ /* @__PURE__ */ n("span", {
203
+ className: `${w}-helperText`,
204
+ "data-testid": `${w}-helperText`,
205
+ children: [h && (!E || !_) && h, _ && E && E.message]
206
+ })
207
+ ]
208
+ });
209
+ }, E = ({ theme: n, variant: r = "default", ...i }) => {
210
+ let { componentStyles: a } = e([l.CHECKBOXTREE], n, r.toUpperCase());
211
+ return /* @__PURE__ */ t(T, {
212
+ ...i,
213
+ style: a
214
+ });
215
+ }, D = (e, t) => `
216
+ // BACKGROUNDS
217
+ ${r(e, "background-color", `--MODAL-${t}-BACKGROUND-COLOR`)}
218
+
219
+ // BORDERS
220
+ ${r(e, "border-color", `--MODAL-${t}-BORDER-COLOR`)}
221
+ ${r(e, "border-width", `--MODAL-${t}-BORDER-WIDTH`)}
222
+ ${r(e, "border-style", `--MODAL-${t}-BORDER-STYLE`)}
223
+ ${r(e, "border-radius", `--MODAL-${t}-BORDER-RADIUS`)}
224
+ `, O = (e) => h`
225
+ &.--MODAL-scrim {
226
+ position: fixed;
227
+ inset: 0;
228
+ background-color: rgba(0, 0, 0, 0.5);
229
+ display: flex;
230
+ align-items: center;
231
+ justify-content: center;
232
+ z-index: 1000;
233
+ }
234
+
235
+ .--MODAL {
236
+ display: flex;
237
+ flex-direction: column;
238
+ width: 480px;
239
+ max-width: calc(100vw - 48px);
240
+ max-height: calc(100vh - 64px);
241
+ overflow: hidden;
242
+ box-shadow:
243
+ rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,
244
+ rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,
245
+ rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;
246
+
247
+ ${D(e, "ROOT")}
248
+
249
+ &.--MODAL-lg {
250
+ width: 720px;
251
+ }
252
+
253
+ .--MODAL-header {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 8px;
257
+ padding: 16px 20px;
258
+ flex-shrink: 0;
259
+ }
260
+
261
+ .--MODAL-title {
262
+ flex: 1;
263
+ margin: 0;
264
+
265
+ ${r(e, "color", "--MODAL-EVENTS-ENABLED-COLOR-PRIMARY")};
266
+
267
+ font-family: ${e["--FONTFAMILY-PRIMARY"]};
268
+ font-size: 1rem;
269
+ font-weight: 600;
270
+ line-height: 1.25;
271
+ }
272
+
273
+ .--MODAL-body {
274
+ flex: 1;
275
+ padding: 20px;
276
+ overflow-y: auto;
277
+
278
+ ${r(e, "color", "--MODAL-EVENTS-ENABLED-COLOR-SECONDARY")};
279
+
280
+ font-family: ${e["--FONTFAMILY-PRIMARY"]};
281
+ font-size: 0.875rem;
282
+ line-height: 1.5;
283
+ }
284
+
285
+ .--MODAL-footer {
286
+ display: flex;
287
+ justify-content: flex-end;
288
+ gap: 8px;
289
+ padding: 16px 20px;
290
+ flex-shrink: 0;
291
+ }
292
+ }
293
+ `, k = "--MODAL", A = ({ open: e, onClose: r, header: i, showCloseButton: a = !0, size: c = "md", children: l, footer: u, staticBackdrop: d = !1, className: p, style: m }) => (f(() => {
294
+ if (!e || d) return;
295
+ let t = (e) => {
296
+ e.key === "Escape" && r();
297
+ };
298
+ return document.addEventListener("keydown", t), () => document.removeEventListener("keydown", t);
299
+ }, [
300
+ e,
301
+ r,
302
+ d
303
+ ]), e ? _(/* @__PURE__ */ t("div", {
304
+ className: `${k}-scrim`,
305
+ css: O(m),
306
+ role: "dialog",
307
+ "aria-modal": "true",
308
+ onClick: (e) => {
309
+ !d && e.target === e.currentTarget && r();
310
+ },
311
+ children: /* @__PURE__ */ n("div", {
312
+ className: [
313
+ k,
314
+ c === "lg" ? `${k}-lg` : "",
315
+ p || ""
316
+ ].filter(Boolean).join(" "),
317
+ children: [
318
+ (i !== void 0 || a) && /* @__PURE__ */ n("header", {
319
+ className: `${k}-header`,
320
+ children: [i, a && /* @__PURE__ */ t(o, {
321
+ icon: /* @__PURE__ */ t(s, { name: "close" }),
322
+ onClick: r,
323
+ "aria-label": "Cerrar modal"
324
+ })]
325
+ }),
326
+ l !== void 0 && /* @__PURE__ */ t("div", {
327
+ className: `${k}-body`,
328
+ children: l
329
+ }),
330
+ u && /* @__PURE__ */ t("footer", {
331
+ className: `${k}-footer`,
332
+ children: u
333
+ })
334
+ ]
335
+ })
336
+ }), document.body) : null);
337
+ A.displayName = "Modal";
338
+ //#endregion
339
+ //#region src/components/molecules/Modal/index.tsx
340
+ var j = ({ theme: n, variant: r = "default", ...i }) => {
341
+ let { componentStyles: a } = e([l.MODAL], n, r.toUpperCase());
342
+ return /* @__PURE__ */ t(A, {
343
+ ...i,
344
+ style: a
345
+ });
346
+ }, M = (e, t) => `
347
+ .--RADIOGROUP-label {
348
+ ${r(e, "color", `--RADIOGROUP-EVENTS-${t}-COLOR-PRIMARY`)}
349
+ }
350
+
351
+ .--RADIOGROUP-helperText {
352
+ ${r(e, "color", `--RADIOGROUP-EVENTS-${t}-COLOR-SECONDARY`)}
353
+ }
354
+ `, N = (e) => h`
355
+ &.--RADIOGROUP {
356
+ display: flex;
357
+ flex-direction: column;
358
+ gap: 8px;
359
+ width: fit-content;
360
+
361
+ // ENABLED
362
+ ${M(e, "ENABLED")};
363
+
364
+ // ERROR
365
+ &.--RADIOGROUP-error {
366
+ ${M(e, "ERROR")};
367
+ }
368
+
369
+ // DISABLED
370
+ &.--RADIOGROUP-disabled {
371
+ ${M(e, "DISABLED")};
372
+ }
373
+
374
+ .--RADIOGROUP-items {
375
+ display: flex;
376
+ flex-direction: column;
377
+ gap: 16px;
378
+ }
379
+
380
+ &.--RADIOGROUP--horizontal .--RADIOGROUP-items {
381
+ flex-direction: row;
382
+ flex-wrap: wrap;
383
+ }
384
+
385
+ .--RADIOGROUP-label {
386
+ // FONT
387
+ font-family: ${e["--FONTFAMILY-PRIMARY"]};
388
+ font-size: 0.875rem;
389
+ font-weight: 500;
390
+ line-height: 1;
391
+ }
392
+
393
+ .--RADIOGROUP-helperText {
394
+ // FONT
395
+ font-family: ${e["--FONTFAMILY-PRIMARY"]};
396
+ font-size: 13px;
397
+ line-height: 16px;
398
+ margin-left: 14px;
399
+ }
400
+ }
401
+ `, P = "--RADIOGROUP", F = ({ name: e, control: r, children: i, label: a, helperText: o, showErrorText: s = !0, disabled: c, direction: l = "vertical", style: f, className: p }) => {
402
+ let { field: m, fieldState: h } = g({
403
+ control: r,
404
+ name: e
405
+ }), _ = typeof m.value == "string" ? m.value : "", v = h.error, y = (e) => {
406
+ m.onChange(e), m.onBlur();
407
+ }, b = d.Children.toArray(i).find((e) => d.isValidElement(e) && !e.props.disabled)?.props.value ?? "";
408
+ return /* @__PURE__ */ t(u.Provider, {
409
+ value: {
410
+ name: e,
411
+ selectedValue: _,
412
+ onChange: y,
413
+ disabled: c,
414
+ error: v,
415
+ firstValue: b
416
+ },
417
+ children: /* @__PURE__ */ n("div", {
418
+ className: [
419
+ P,
420
+ `${P}--${l}`,
421
+ s && v?.message && `${P}-error`,
422
+ c && `${P}-disabled`,
423
+ p || ""
424
+ ].join(" "),
425
+ css: N(f),
426
+ "data-testid": P,
427
+ children: [
428
+ a && /* @__PURE__ */ t("span", {
429
+ className: `${P}-label`,
430
+ "data-testid": `${P}-label`,
431
+ children: a
432
+ }),
433
+ /* @__PURE__ */ t("div", {
434
+ className: `${P}-items`,
435
+ "data-testid": `${P}-items`,
436
+ children: i
437
+ }),
438
+ /* @__PURE__ */ n("span", {
439
+ className: `${P}-helperText`,
440
+ "data-testid": `${P}-helperText`,
441
+ children: [o && (!v || !s) && o, s && v && v.message]
442
+ })
443
+ ]
444
+ })
445
+ });
446
+ }, I = ({ theme: n, variant: r = "default", ...i }) => {
447
+ let { componentStyles: a } = e([l.RADIOGROUP], n, r.toUpperCase());
448
+ return /* @__PURE__ */ t(F, {
449
+ ...i,
450
+ style: a
451
+ });
452
+ };
453
+ //#endregion
454
+ export { S as i, j as n, E as r, I as t };
455
+
456
+ //# sourceMappingURL=RadioGroup-DzEJw4WJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup-DzEJw4WJ.js","names":[],"sources":["../src/components/molecules/CheckboxGroup/CheckboxGroup.emotion.ts","../src/components/molecules/CheckboxGroup/CheckboxGroup.tsx","../src/components/molecules/CheckboxGroup/index.tsx","../src/components/molecules/CheckboxTree/CheckboxTree.emotion.ts","../src/components/molecules/CheckboxTree/CheckboxTree.tsx","../src/components/molecules/CheckboxTree/index.tsx","../src/components/molecules/Modal/Modal.emotion.ts","../src/components/molecules/Modal/Modal.tsx","../src/components/molecules/Modal/index.tsx","../src/components/molecules/RadioGroup/RadioGroup.emotion.ts","../src/components/molecules/RadioGroup/RadioGroup.tsx","../src/components/molecules/RadioGroup/index.tsx"],"sourcesContent":["import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst labelColor = (theme: Record<string, string>, event: string): string => `\n .--CHECKBOXGROUP-label {\n ${getStyle(theme, 'color', `--CHECKBOXGROUP-EVENTS-${event}-COLOR-PRIMARY`)}\n }\n\n .--CHECKBOXGROUP-helperText {\n ${getStyle(theme, 'color', `--CHECKBOXGROUP-EVENTS-${event}-COLOR-SECONDARY`)}\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--CHECKBOXGROUP {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: fit-content;\n\n // ENABLED\n ${labelColor(theme, 'ENABLED')};\n\n // ERROR\n &.--CHECKBOXGROUP-error {\n ${labelColor(theme, 'ERROR')};\n }\n\n // DISABLED\n &.--CHECKBOXGROUP-disabled {\n ${labelColor(theme, 'DISABLED')};\n }\n\n .--CHECKBOXGROUP-items {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n &.--CHECKBOXGROUP--horizontal .--CHECKBOXGROUP-items {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .--CHECKBOXGROUP-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1;\n }\n\n .--CHECKBOXGROUP-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 13px;\n line-height: 16px;\n margin-left: 14px;\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport emotion from './CheckboxGroup.emotion';\nimport type { CheckboxGroupProps } from './CheckboxGroup.interface';\nimport { CheckboxGroupContext } from './CheckboxGroup.context';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n\nconst CLASS = '--CHECKBOXGROUP';\n\n/**\n * CheckboxGroup manages a set of `<Checkbox>` children as a single RHF field.\n * The form value is `string[]` — the `value` props of every checked child.\n *\n * Validation (min, max, custom) is declared on the Zod schema:\n * ```ts\n * z.object({\n * options: z.array(z.string()).min(1, 'Select at least one').max(3, 'Select at most 3'),\n * })\n * ```\n *\n * @example\n * ```tsx\n * <CheckboxGroup name=\"options\" control={control} label=\"Skills\">\n * <Checkbox value=\"react\" label=\"React\" />\n * <Checkbox value=\"vue\" label=\"Vue\" />\n * </CheckboxGroup>\n * ```\n */\nconst CheckboxGroup = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n children,\n label,\n helperText,\n showErrorText = true,\n disabled,\n direction = 'vertical',\n style,\n className,\n}: CheckboxGroupProps<TFieldValues>) => {\n const { field, fieldState } = useController({ control, name: name as FieldPath<TFieldValues> });\n\n const checkedValues: string[] = Array.isArray(field.value) ? field.value : [];\n const errorText = fieldState.error;\n\n const onChange = (value: string, checked: boolean) => {\n const next = checked ? [...checkedValues, value] : checkedValues.filter(v => v !== value);\n field.onChange(next);\n field.onBlur();\n };\n\n return (\n <CheckboxGroupContext.Provider value={{ checkedValues, onChange, disabled, error: errorText }}>\n <div\n className={[\n CLASS,\n `${CLASS}--${direction}`,\n showErrorText && errorText?.message && `${CLASS}-error`,\n disabled && `${CLASS}-disabled`,\n className || '',\n ].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n {label && (\n <span className={`${CLASS}-label`} data-testid={`${CLASS}-label`}>\n {label}\n </span>\n )}\n\n <div className={`${CLASS}-items`} data-testid={`${CLASS}-items`}>\n {children}\n </div>\n\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!errorText || !showErrorText) && helperText}\n {showErrorText && errorText && errorText.message}\n </span>\n </div>\n </CheckboxGroupContext.Provider>\n );\n};\n\nexport default CheckboxGroup;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { CheckboxGroupStyleProps } from './CheckboxGroup.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport CheckboxGroupBase from './CheckboxGroup';\n\nconst CheckboxGroup = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: CheckboxGroupStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.CHECKBOXGROUP], theme, variant.toUpperCase());\n\n return <CheckboxGroupBase {...rest} style={componentStyles} />;\n};\n\nexport default CheckboxGroup;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst Style = (theme: Record<string, string>) => css`\n &.--CHECKBOXTREE {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: fit-content;\n\n .--CHECKBOXTREE-children {\n display: flex;\n flex-direction: column;\n padding-left: 36px;\n gap: 16px;\n }\n\n .--CHECKBOXTREE-helperText {\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 13px;\n line-height: 16px;\n margin-left: 14px;\n ${getStyle(theme, 'color', '--CHECKBOXTREE-EVENTS-ENABLED-COLOR-SECONDARY')}\n\n &:empty {\n display: none;\n }\n }\n\n &.--CHECKBOXTREE-error {\n .--CHECKBOXTREE-helperText {\n ${getStyle(theme, 'color', '--CHECKBOXTREE-EVENTS-ERROR-COLOR-SECONDARY')}\n }\n }\n\n &.--CHECKBOXTREE-disabled {\n .--CHECKBOXTREE-helperText {\n ${getStyle(theme, 'color', '--CHECKBOXTREE-EVENTS-DISABLED-COLOR-SECONDARY')}\n }\n }\n }\n`;\n\nexport default Style;\n","import React, { useRef, useEffect, useMemo } from 'react';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\nimport Icon from '@components/atoms/Icon';\n// Component Base\nimport emotion from './CheckboxTree.emotion';\nimport type { CheckboxTreeProps } from './CheckboxTree.interface';\nimport Checkbox from '@components/atoms/Checkbox';\nimport { CheckboxTreeContext } from './CheckboxTree.context';\n\nconst CLASS = '--CHECKBOXTREE';\n\n/**\n * CheckboxTree renders a parent `<Checkbox>` that controls all of its `<Checkbox>` children.\n *\n * Parent states:\n * - **Checked** — all children are checked.\n * - **Unchecked** — no children are checked.\n * - **Indeterminate** — some (but not all) children are checked.\n *\n * The form value is `string[]` — the `value` props of every checked child.\n * Validation is declared on the Zod schema, the same way as CheckboxGroup.\n *\n * @example\n * ```tsx\n * <CheckboxTree name=\"options\" control={control} label=\"Select all\">\n * <Checkbox value=\"a\" label=\"Option A\" />\n * <Checkbox value=\"b\" label=\"Option B\" />\n * </CheckboxTree>\n * ```\n */\nconst CheckboxTree = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n children,\n label,\n iconChecked = <Icon name='check' />,\n iconIndeterminate = <Icon name='remove' />,\n helperText,\n showErrorText = true,\n disabled,\n style,\n className,\n}: CheckboxTreeProps<TFieldValues>) => {\n const { field, fieldState } = useController({ control, name: name as FieldPath<TFieldValues> });\n\n const checkedValues: string[] = Array.isArray(field.value) ? field.value : [];\n const errorText = fieldState.error;\n\n const childValues = useMemo(\n () =>\n React.Children.toArray(children)\n .map(child => {\n const el = child as React.ReactElement<{ value?: string; name?: string }>;\n return el.props?.value ?? el.props?.name ?? '';\n })\n .filter(Boolean),\n [children],\n );\n\n const allChecked = childValues.length > 0 && childValues.every(v => checkedValues.includes(v));\n const someChecked = !allChecked && childValues.some(v => checkedValues.includes(v));\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const input = rootRef.current?.querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')[0];\n if (input) input.indeterminate = someChecked;\n }, [someChecked]);\n\n const onParentChange = (checked: boolean) => {\n const next = checked ? [...childValues] : [];\n field.onChange(next);\n field.onBlur();\n };\n\n const onChange = (value: string, checked: boolean) => {\n const next = checked ? [...checkedValues, value] : checkedValues.filter(v => v !== value);\n field.onChange(next);\n field.onBlur();\n };\n\n return (\n <div\n ref={rootRef}\n className={[\n CLASS,\n showErrorText && errorText?.message ? `${CLASS}-error` : '',\n disabled ? `${CLASS}-disabled` : '',\n className || '',\n ].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n <Checkbox\n checked={allChecked || someChecked}\n onChecked={onParentChange}\n label={label}\n icon={someChecked ? iconIndeterminate : iconChecked}\n disabled={disabled}\n showErrorText={false}\n helperText={undefined}\n />\n\n <CheckboxTreeContext.Provider value={{ checkedValues, onChange, disabled, error: errorText }}>\n <div className={`${CLASS}-children`} data-testid={`${CLASS}-children`}>\n {children}\n </div>\n </CheckboxTreeContext.Provider>\n\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!errorText || !showErrorText) && helperText}\n {showErrorText && errorText && errorText.message}\n </span>\n </div>\n );\n};\n\nexport default CheckboxTree;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { CheckboxTreeStyleProps } from './CheckboxTree.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport CheckboxTreeBase from './CheckboxTree';\n\nconst CheckboxTree = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: CheckboxTreeStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.CHECKBOXTREE], theme, variant.toUpperCase());\n\n return <CheckboxTreeBase {...rest} style={componentStyles} />;\n};\n\nexport default CheckboxTree;\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst container = (theme: Record<string, string>, event: string): string => `\n // BACKGROUNDS\n ${getStyle(theme, 'background-color', `--MODAL-${event}-BACKGROUND-COLOR`)}\n \n // BORDERS\n ${getStyle(theme, 'border-color', `--MODAL-${event}-BORDER-COLOR`)}\n ${getStyle(theme, 'border-width', `--MODAL-${event}-BORDER-WIDTH`)}\n ${getStyle(theme, 'border-style', `--MODAL-${event}-BORDER-STYLE`)}\n ${getStyle(theme, 'border-radius', `--MODAL-${event}-BORDER-RADIUS`)}\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--MODAL-scrim {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n\n .--MODAL {\n display: flex;\n flex-direction: column;\n width: 480px;\n max-width: calc(100vw - 48px);\n max-height: calc(100vh - 64px);\n overflow: hidden;\n box-shadow:\n rgba(0, 0, 0, 0.2) 0px 5px 5px -3px,\n rgba(0, 0, 0, 0.14) 0px 8px 10px 1px,\n rgba(0, 0, 0, 0.12) 0px 3px 14px 2px;\n\n ${container(theme, 'ROOT')}\n\n &.--MODAL-lg {\n width: 720px;\n }\n\n .--MODAL-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px 20px;\n flex-shrink: 0;\n }\n\n .--MODAL-title {\n flex: 1;\n margin: 0;\n\n ${getStyle(theme, 'color', '--MODAL-EVENTS-ENABLED-COLOR-PRIMARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 1rem;\n font-weight: 600;\n line-height: 1.25;\n }\n\n .--MODAL-body {\n flex: 1;\n padding: 20px;\n overflow-y: auto;\n\n ${getStyle(theme, 'color', '--MODAL-EVENTS-ENABLED-COLOR-SECONDARY')};\n\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n line-height: 1.5;\n }\n\n .--MODAL-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 16px 20px;\n flex-shrink: 0;\n }\n }\n`;\n\nexport default Style;\n","import { type FC, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n// Component Base\nimport emotion from './Modal.emotion';\nimport type { ModalProps } from './Modal.interface';\n// Custom Components\nimport IconButton from '@components/atoms/IconButton';\nimport Icon from '@components/atoms/Icon';\n\nconst CLASS = '--MODAL';\n\n/**\n * Generic overlay dialog rendered via a portal into `document.body`.\n *\n * Closes on:\n * - Clicking the × button in the header.\n * - Pressing **Escape** (unless `staticBackdrop` is `true`).\n * - Clicking the semi-transparent backdrop (unless `staticBackdrop` is `true`).\n *\n * Pass `footer` to render action buttons below the body content.\n */\nconst Modal: FC<ModalProps> = ({\n open,\n onClose,\n header,\n showCloseButton = true,\n size = 'md',\n children,\n footer,\n staticBackdrop = false,\n className,\n style,\n}) => {\n useEffect(() => {\n if (!open || staticBackdrop) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, onClose, staticBackdrop]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n className={`${CLASS}-scrim`}\n css={emotion(style)}\n role='dialog'\n aria-modal='true'\n onClick={e => {\n if (!staticBackdrop && e.target === e.currentTarget) onClose();\n }}\n >\n <div className={[CLASS, size === 'lg' ? `${CLASS}-lg` : '', className || ''].filter(Boolean).join(' ')}>\n {(header !== undefined || showCloseButton) && (\n <header className={`${CLASS}-header`}>\n {header}\n {showCloseButton && <IconButton icon={<Icon name='close' />} onClick={onClose} aria-label='Cerrar modal' />}\n </header>\n )}\n {children !== undefined && <div className={`${CLASS}-body`}>{children}</div>}\n {footer && <footer className={`${CLASS}-footer`}>{footer}</footer>}\n </div>\n </div>,\n document.body,\n );\n};\n\nModal.displayName = 'Modal';\n\nexport default Modal;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { FC } from 'react';\nimport type { ModalStyleProps } from './Modal.interface';\nimport ModalBase from './Modal';\n\nconst Modal: FC<ModalStyleProps> = ({ theme, variant = 'default', ...rest }) => {\n const { componentStyles } = useCreateComponentStyles([Component.MODAL], theme, variant.toUpperCase());\n return <ModalBase {...rest} style={componentStyles} />;\n};\n\nexport default Modal;\nexport type { ModalStyleProps, ModalProps } from './Modal.interface';\n","import { css } from '@emotion/react';\nimport { getStyle } from '@utilities/emotion/styles';\n\nconst labelColor = (theme: Record<string, string>, event: string): string => `\n .--RADIOGROUP-label {\n ${getStyle(theme, 'color', `--RADIOGROUP-EVENTS-${event}-COLOR-PRIMARY`)}\n }\n\n .--RADIOGROUP-helperText {\n ${getStyle(theme, 'color', `--RADIOGROUP-EVENTS-${event}-COLOR-SECONDARY`)}\n }\n`;\n\nconst Style = (theme: Record<string, string>) => css`\n &.--RADIOGROUP {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: fit-content;\n\n // ENABLED\n ${labelColor(theme, 'ENABLED')};\n\n // ERROR\n &.--RADIOGROUP-error {\n ${labelColor(theme, 'ERROR')};\n }\n\n // DISABLED\n &.--RADIOGROUP-disabled {\n ${labelColor(theme, 'DISABLED')};\n }\n\n .--RADIOGROUP-items {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n &.--RADIOGROUP--horizontal .--RADIOGROUP-items {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .--RADIOGROUP-label {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 1;\n }\n\n .--RADIOGROUP-helperText {\n // FONT\n font-family: ${theme['--FONTFAMILY-PRIMARY']};\n font-size: 13px;\n line-height: 16px;\n margin-left: 14px;\n }\n }\n`;\n\nexport default Style;\n","// Component Base\nimport React from 'react';\nimport emotion from './RadioGroup.emotion';\nimport type { RadioGroupProps } from './RadioGroup.interface';\nimport { RadioGroupContext } from '@components/atoms/Radio/RadioGroup.context';\n// External Libraries\nimport { useController, type FieldValues, type FieldPath } from 'react-hook-form';\n\nconst CLASS = '--RADIOGROUP';\n\n/**\n * RadioGroup manages a set of `<Radio>` children as a single RHF field.\n * The form value is a `string` — the `value` prop of the selected Radio.\n *\n * Provides a `RadioGroupContext` that every child `<Radio>` reads its selected state from.\n * Rendering a `<Radio>` outside a RadioGroup throws an error.\n *\n * @example\n * ```tsx\n * <RadioGroup name=\"option\" control={control} label=\"Pick one\">\n * <Radio value=\"a\" label=\"Option A\" />\n * <Radio value=\"b\" label=\"Option B\" />\n * </RadioGroup>\n * ```\n */\nconst RadioGroup = <TFieldValues extends FieldValues = FieldValues>({\n name,\n control,\n children,\n label,\n helperText,\n showErrorText = true,\n disabled,\n direction = 'vertical',\n style,\n className,\n}: RadioGroupProps<TFieldValues>) => {\n const { field, fieldState } = useController({ control, name: name as FieldPath<TFieldValues> });\n\n const selectedValue: string = typeof field.value === 'string' ? field.value : '';\n const errorText = fieldState.error;\n\n const onChange = (value: string) => {\n field.onChange(value);\n field.onBlur();\n };\n\n const firstValue =\n (\n React.Children.toArray(children).find(\n (child): child is React.ReactElement<{ value?: string; disabled?: boolean }> =>\n React.isValidElement<{ value?: string; disabled?: boolean }>(child) && !child.props.disabled,\n ) as React.ReactElement<{ value?: string }> | undefined\n )?.props.value ?? '';\n\n return (\n <RadioGroupContext.Provider value={{ name, selectedValue, onChange, disabled, error: errorText, firstValue }}>\n <div\n className={[\n CLASS,\n `${CLASS}--${direction}`,\n showErrorText && errorText?.message && `${CLASS}-error`,\n disabled && `${CLASS}-disabled`,\n className || '',\n ].join(' ')}\n css={emotion(style)}\n data-testid={CLASS}\n >\n {label && (\n <span className={`${CLASS}-label`} data-testid={`${CLASS}-label`}>\n {label}\n </span>\n )}\n\n <div className={`${CLASS}-items`} data-testid={`${CLASS}-items`}>\n {children}\n </div>\n\n <span className={`${CLASS}-helperText`} data-testid={`${CLASS}-helperText`}>\n {helperText && (!errorText || !showErrorText) && helperText}\n {showErrorText && errorText && errorText.message}\n </span>\n </div>\n </RadioGroupContext.Provider>\n );\n};\n\nexport default RadioGroup;\n","import { useCreateComponentStyles } from '@hocs/ThemeProvider/useThemeProvider.hook';\nimport { Component } from '@hocs/ThemeProvider/interfaces';\nimport type { RadioGroupStyleProps } from './RadioGroup.interface';\nimport type { FieldValues } from 'react-hook-form';\nimport RadioGroupBase from './RadioGroup';\n\nconst RadioGroup = <TFieldValues extends FieldValues = FieldValues>({\n theme,\n variant = 'default',\n ...rest\n}: RadioGroupStyleProps<TFieldValues>) => {\n const { componentStyles } = useCreateComponentStyles([Component.RADIOGROUP], theme, variant.toUpperCase());\n\n return <RadioGroupBase {...rest} style={componentStyles} />;\n};\n\nexport default RadioGroup;\n"],"mappings":"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"}