@soyfri/shared-library 3.2.1 → 3.3.0
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/DataRow-B7fJ5taA.js +55 -0
- package/DataRow-B7fJ5taA.js.map +1 -0
- package/DataRow-CfCaSdaJ.cjs +54 -0
- package/DataRow-CfCaSdaJ.cjs.map +1 -0
- package/EmptyState-DJj9KOEy.cjs +47 -0
- package/EmptyState-DJj9KOEy.cjs.map +1 -0
- package/EmptyState-kEoDkg1B.js +48 -0
- package/EmptyState-kEoDkg1B.js.map +1 -0
- package/PageHeader-BQZOqjNr.cjs +37 -0
- package/PageHeader-BQZOqjNr.cjs.map +1 -0
- package/PageHeader-DDYi6Nhy.js +38 -0
- package/PageHeader-DDYi6Nhy.js.map +1 -0
- package/components/DataRow/DataRow.cjs +6 -0
- package/components/DataRow/DataRow.cjs.map +1 -0
- package/components/DataRow/DataRow.d.ts +44 -0
- package/components/DataRow/DataRow.js +6 -0
- package/components/DataRow/DataRow.js.map +1 -0
- package/components/DataRow/index.d.ts +2 -0
- package/components/DataRow.d.ts +6 -0
- package/components/EmptyState/EmptyState.cjs +6 -0
- package/components/EmptyState/EmptyState.cjs.map +1 -0
- package/components/EmptyState/EmptyState.d.ts +24 -0
- package/components/EmptyState/EmptyState.js +6 -0
- package/components/EmptyState/EmptyState.js.map +1 -0
- package/components/EmptyState/index.d.ts +2 -0
- package/components/EmptyState.d.ts +6 -0
- package/components/PageHeader/PageHeader.cjs +6 -0
- package/components/PageHeader/PageHeader.cjs.map +1 -0
- package/components/PageHeader/PageHeader.d.ts +25 -0
- package/components/PageHeader/PageHeader.js +6 -0
- package/components/PageHeader/PageHeader.js.map +1 -0
- package/components/PageHeader/index.d.ts +2 -0
- package/components/PageHeader.d.ts +6 -0
- package/index.cjs +6 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +6 -0
- package/index.js +12 -6
- package/index.js.map +1 -1
- package/package.json +16 -1
- package/theme/componentStyles.d.ts +1 -1
- package/styles.css +0 -375
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useTheme, Box, Typography } from "@mui/material";
|
|
3
|
+
import { r as resolvePreset } from "./resolvePreset-K6_BfWHD.js";
|
|
4
|
+
function DataRow({
|
|
5
|
+
label,
|
|
6
|
+
children,
|
|
7
|
+
last,
|
|
8
|
+
labelWidth = 200,
|
|
9
|
+
preset,
|
|
10
|
+
sx,
|
|
11
|
+
className,
|
|
12
|
+
"data-testid": dataTestId
|
|
13
|
+
}) {
|
|
14
|
+
const theme = useTheme();
|
|
15
|
+
const presetSx = resolvePreset("DataRow", preset, theme);
|
|
16
|
+
const rootSx = [
|
|
17
|
+
{
|
|
18
|
+
display: "flex",
|
|
19
|
+
flexDirection: { xs: "column", sm: "row" },
|
|
20
|
+
alignItems: { xs: "flex-start", sm: "center" },
|
|
21
|
+
gap: { xs: 0.5, sm: 2 },
|
|
22
|
+
mb: last ? 0 : 2.5
|
|
23
|
+
},
|
|
24
|
+
...presetSx ? [presetSx] : [],
|
|
25
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
26
|
+
];
|
|
27
|
+
return /* @__PURE__ */ jsxs(Box, { sx: rootSx, className, "data-testid": dataTestId, children: [
|
|
28
|
+
/* @__PURE__ */ jsx(
|
|
29
|
+
Typography,
|
|
30
|
+
{
|
|
31
|
+
variant: "body2",
|
|
32
|
+
component: "label",
|
|
33
|
+
className: "fri-DataRow-label",
|
|
34
|
+
sx: { width: { sm: labelWidth }, flexShrink: 0, color: "text.secondary" },
|
|
35
|
+
children: label
|
|
36
|
+
}
|
|
37
|
+
),
|
|
38
|
+
typeof children === "string" ? /* @__PURE__ */ jsx(Typography, { variant: "body1", component: "span", className: "fri-DataRow-value", children }) : (
|
|
39
|
+
// El slot de valor crece: así un Input en modo edición ocupa el ancho
|
|
40
|
+
// restante y un Chip conserva su tamaño (es inline-flex).
|
|
41
|
+
/* @__PURE__ */ jsx(
|
|
42
|
+
Box,
|
|
43
|
+
{
|
|
44
|
+
className: "fri-DataRow-value",
|
|
45
|
+
sx: { flex: 1, minWidth: 0, width: { xs: "100%", sm: "auto" } },
|
|
46
|
+
children
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
] });
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
DataRow as D
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=DataRow-B7fJ5taA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataRow-B7fJ5taA.js","sources":["../src/components/DataRow/DataRow.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\n\nexport interface DataRowProps {\n /** Etiqueta del dato (columna izquierda). */\n label: ReactNode;\n /** Valor: texto, o cualquier nodo (chip, link, Input en modo edición). */\n children: ReactNode;\n /** Última fila de un bloque: sin margen inferior. */\n last?: boolean;\n /**\n * Ancho de la columna del label a partir de `sm`. Default `200`.\n * Fijo a propósito: alinea verticalmente todos los valores de un bloque.\n */\n labelWidth?: number | string;\n /** Preset registrado en `theme.styles.DataRow`. */\n preset?: string;\n sx?: SxProps<Theme>;\n className?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Fila label/valor — el patrón de dato para vistas de detalle.\n *\n * Geometría: label de ancho fijo + valor al lado; en móvil apila. El ancho fijo\n * (en vez de un `Grid` 4/8) evita que en una card full-width queden cientos de\n * px muertos entre label y valor.\n *\n * Tipografía: el paquete pone `body2`/`body1`. Para mapear a variantes propias\n * del consumidor, registrar un preset en el theme apuntando a las clases\n * internas:\n *\n * ```ts\n * styles: {\n * DataRow: {\n * default: {\n * '& .fri-DataRow-label': { typography: 'dataLabel' },\n * '& .fri-DataRow-value': { typography: 'dataValue' },\n * },\n * },\n * }\n * ```\n */\nexport function DataRow({\n label,\n children,\n last,\n labelWidth = 200,\n preset,\n sx,\n className,\n 'data-testid': dataTestId,\n}: DataRowProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('DataRow', preset, theme);\n\n const rootSx: SxProps<Theme> = [\n {\n display: 'flex',\n flexDirection: { xs: 'column', sm: 'row' },\n alignItems: { xs: 'flex-start', sm: 'center' },\n gap: { xs: 0.5, sm: 2 },\n mb: last ? 0 : 2.5,\n },\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ] as SxProps<Theme>;\n\n return (\n <Box sx={rootSx} className={className} data-testid={dataTestId}>\n <Typography\n variant=\"body2\"\n component=\"label\"\n className=\"fri-DataRow-label\"\n sx={{ width: { sm: labelWidth }, flexShrink: 0, color: 'text.secondary' }}\n >\n {label}\n </Typography>\n {typeof children === 'string' ? (\n <Typography variant=\"body1\" component=\"span\" className=\"fri-DataRow-value\">\n {children}\n </Typography>\n ) : (\n // El slot de valor crece: así un Input en modo edición ocupa el ancho\n // restante y un Chip conserva su tamaño (es inline-flex).\n <Box\n className=\"fri-DataRow-value\"\n sx={{ flex: 1, minWidth: 0, width: { xs: '100%', sm: 'auto' } }}\n >\n {children}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default DataRow;\n"],"names":[],"mappings":";;;AA+CO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAiB;AACf,QAAM,QAAQ,SAAA;AACd,QAAM,WAAW,cAAc,WAAW,QAAQ,KAAK;AAEvD,QAAM,SAAyB;AAAA,IAC7B;AAAA,MACE,SAAS;AAAA,MACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAA;AAAA,MACnC,YAAY,EAAE,IAAI,cAAc,IAAI,SAAA;AAAA,MACpC,KAAK,EAAE,IAAI,KAAK,IAAI,EAAA;AAAA,MACpB,IAAI,OAAO,IAAI;AAAA,IAAA;AAAA,IAEjB,GAAI,WAAW,CAAC,QAAQ,IAAI,CAAA;AAAA,IAC5B,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAA;AAAA,EAAC;AAG5C,8BACG,KAAA,EAAI,IAAI,QAAQ,WAAsB,eAAa,YAClD,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAU;AAAA,QACV,IAAI,EAAE,OAAO,EAAE,IAAI,cAAc,YAAY,GAAG,OAAO,iBAAA;AAAA,QAEtD,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,OAAO,aAAa,WACnB,oBAAC,YAAA,EAAW,SAAQ,SAAQ,WAAU,QAAO,WAAU,qBACpD,SAAA,CACH;AAAA;AAAA;AAAA,MAIA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAA,EAAO;AAAA,UAE3D;AAAA,QAAA;AAAA,MAAA;AAAA;AAAA,EACH,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
+
const material = require("@mui/material");
|
|
4
|
+
const resolvePreset = require("./resolvePreset-CxTI6_Ln.cjs");
|
|
5
|
+
function DataRow({
|
|
6
|
+
label,
|
|
7
|
+
children,
|
|
8
|
+
last,
|
|
9
|
+
labelWidth = 200,
|
|
10
|
+
preset,
|
|
11
|
+
sx,
|
|
12
|
+
className,
|
|
13
|
+
"data-testid": dataTestId
|
|
14
|
+
}) {
|
|
15
|
+
const theme = material.useTheme();
|
|
16
|
+
const presetSx = resolvePreset.resolvePreset("DataRow", preset, theme);
|
|
17
|
+
const rootSx = [
|
|
18
|
+
{
|
|
19
|
+
display: "flex",
|
|
20
|
+
flexDirection: { xs: "column", sm: "row" },
|
|
21
|
+
alignItems: { xs: "flex-start", sm: "center" },
|
|
22
|
+
gap: { xs: 0.5, sm: 2 },
|
|
23
|
+
mb: last ? 0 : 2.5
|
|
24
|
+
},
|
|
25
|
+
...presetSx ? [presetSx] : [],
|
|
26
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
27
|
+
];
|
|
28
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: rootSx, className, "data-testid": dataTestId, children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
30
|
+
material.Typography,
|
|
31
|
+
{
|
|
32
|
+
variant: "body2",
|
|
33
|
+
component: "label",
|
|
34
|
+
className: "fri-DataRow-label",
|
|
35
|
+
sx: { width: { sm: labelWidth }, flexShrink: 0, color: "text.secondary" },
|
|
36
|
+
children: label
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
typeof children === "string" ? /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", component: "span", className: "fri-DataRow-value", children }) : (
|
|
40
|
+
// El slot de valor crece: así un Input en modo edición ocupa el ancho
|
|
41
|
+
// restante y un Chip conserva su tamaño (es inline-flex).
|
|
42
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
43
|
+
material.Box,
|
|
44
|
+
{
|
|
45
|
+
className: "fri-DataRow-value",
|
|
46
|
+
sx: { flex: 1, minWidth: 0, width: { xs: "100%", sm: "auto" } },
|
|
47
|
+
children
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
exports.DataRow = DataRow;
|
|
54
|
+
//# sourceMappingURL=DataRow-CfCaSdaJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataRow-CfCaSdaJ.cjs","sources":["../src/components/DataRow/DataRow.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\n\nexport interface DataRowProps {\n /** Etiqueta del dato (columna izquierda). */\n label: ReactNode;\n /** Valor: texto, o cualquier nodo (chip, link, Input en modo edición). */\n children: ReactNode;\n /** Última fila de un bloque: sin margen inferior. */\n last?: boolean;\n /**\n * Ancho de la columna del label a partir de `sm`. Default `200`.\n * Fijo a propósito: alinea verticalmente todos los valores de un bloque.\n */\n labelWidth?: number | string;\n /** Preset registrado en `theme.styles.DataRow`. */\n preset?: string;\n sx?: SxProps<Theme>;\n className?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Fila label/valor — el patrón de dato para vistas de detalle.\n *\n * Geometría: label de ancho fijo + valor al lado; en móvil apila. El ancho fijo\n * (en vez de un `Grid` 4/8) evita que en una card full-width queden cientos de\n * px muertos entre label y valor.\n *\n * Tipografía: el paquete pone `body2`/`body1`. Para mapear a variantes propias\n * del consumidor, registrar un preset en el theme apuntando a las clases\n * internas:\n *\n * ```ts\n * styles: {\n * DataRow: {\n * default: {\n * '& .fri-DataRow-label': { typography: 'dataLabel' },\n * '& .fri-DataRow-value': { typography: 'dataValue' },\n * },\n * },\n * }\n * ```\n */\nexport function DataRow({\n label,\n children,\n last,\n labelWidth = 200,\n preset,\n sx,\n className,\n 'data-testid': dataTestId,\n}: DataRowProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('DataRow', preset, theme);\n\n const rootSx: SxProps<Theme> = [\n {\n display: 'flex',\n flexDirection: { xs: 'column', sm: 'row' },\n alignItems: { xs: 'flex-start', sm: 'center' },\n gap: { xs: 0.5, sm: 2 },\n mb: last ? 0 : 2.5,\n },\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ] as SxProps<Theme>;\n\n return (\n <Box sx={rootSx} className={className} data-testid={dataTestId}>\n <Typography\n variant=\"body2\"\n component=\"label\"\n className=\"fri-DataRow-label\"\n sx={{ width: { sm: labelWidth }, flexShrink: 0, color: 'text.secondary' }}\n >\n {label}\n </Typography>\n {typeof children === 'string' ? (\n <Typography variant=\"body1\" component=\"span\" className=\"fri-DataRow-value\">\n {children}\n </Typography>\n ) : (\n // El slot de valor crece: así un Input en modo edición ocupa el ancho\n // restante y un Chip conserva su tamaño (es inline-flex).\n <Box\n className=\"fri-DataRow-value\"\n sx={{ flex: 1, minWidth: 0, width: { xs: '100%', sm: 'auto' } }}\n >\n {children}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default DataRow;\n"],"names":["useTheme","resolvePreset","Box","jsx","Typography"],"mappings":";;;;AA+CO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAiB;AACf,QAAM,QAAQA,SAAAA,SAAA;AACd,QAAM,WAAWC,cAAAA,cAAc,WAAW,QAAQ,KAAK;AAEvD,QAAM,SAAyB;AAAA,IAC7B;AAAA,MACE,SAAS;AAAA,MACT,eAAe,EAAE,IAAI,UAAU,IAAI,MAAA;AAAA,MACnC,YAAY,EAAE,IAAI,cAAc,IAAI,SAAA;AAAA,MACpC,KAAK,EAAE,IAAI,KAAK,IAAI,EAAA;AAAA,MACpB,IAAI,OAAO,IAAI;AAAA,IAAA;AAAA,IAEjB,GAAI,WAAW,CAAC,QAAQ,IAAI,CAAA;AAAA,IAC5B,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAA;AAAA,EAAC;AAG5C,yCACGC,SAAAA,KAAA,EAAI,IAAI,QAAQ,WAAsB,eAAa,YAClD,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAACC,SAAAA;AAAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,WAAU;AAAA,QACV,IAAI,EAAE,OAAO,EAAE,IAAI,cAAc,YAAY,GAAG,OAAO,iBAAA;AAAA,QAEtD,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,OAAO,aAAa,WACnBD,+BAACC,SAAAA,YAAA,EAAW,SAAQ,SAAQ,WAAU,QAAO,WAAU,qBACpD,SAAA,CACH;AAAA;AAAA;AAAA,MAIAD,2BAAAA;AAAAA,QAACD,SAAAA;AAAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,EAAE,IAAI,QAAQ,IAAI,OAAA,EAAO;AAAA,UAE3D;AAAA,QAAA;AAAA,MAAA;AAAA;AAAA,EACH,GAEJ;AAEJ;;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
+
const material = require("@mui/material");
|
|
4
|
+
const resolvePreset = require("./resolvePreset-CxTI6_Ln.cjs");
|
|
5
|
+
function EmptyState({
|
|
6
|
+
title,
|
|
7
|
+
message,
|
|
8
|
+
icon,
|
|
9
|
+
action,
|
|
10
|
+
preset,
|
|
11
|
+
sx,
|
|
12
|
+
className,
|
|
13
|
+
"data-testid": dataTestId
|
|
14
|
+
}) {
|
|
15
|
+
const theme = material.useTheme();
|
|
16
|
+
const presetSx = resolvePreset.resolvePreset("EmptyState", preset, theme);
|
|
17
|
+
const rootSx = [
|
|
18
|
+
{
|
|
19
|
+
display: "flex",
|
|
20
|
+
flexDirection: "column",
|
|
21
|
+
alignItems: "center",
|
|
22
|
+
justifyContent: "center",
|
|
23
|
+
py: 8,
|
|
24
|
+
px: 3,
|
|
25
|
+
textAlign: "center",
|
|
26
|
+
color: "text.secondary"
|
|
27
|
+
},
|
|
28
|
+
...presetSx ? [presetSx] : [],
|
|
29
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
30
|
+
];
|
|
31
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: rootSx, className, "data-testid": dataTestId, children: [
|
|
32
|
+
icon,
|
|
33
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
34
|
+
material.Typography,
|
|
35
|
+
{
|
|
36
|
+
variant: "subtitle1",
|
|
37
|
+
className: "fri-EmptyState-title",
|
|
38
|
+
sx: { fontWeight: 600, color: "text.primary", mt: icon ? 2 : 0 },
|
|
39
|
+
children: title
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
message && /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", className: "fri-EmptyState-message", sx: { mt: 0.5 }, children: message }),
|
|
43
|
+
action && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: { mt: 3 }, children: action })
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
exports.EmptyState = EmptyState;
|
|
47
|
+
//# sourceMappingURL=EmptyState-DJj9KOEy.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState-DJj9KOEy.cjs","sources":["../src/components/EmptyState/EmptyState.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\n\nexport interface EmptyStateProps {\n /** Qué falta, en positivo: \"Sin dispositivos registrados\". */\n title: string;\n /** Línea secundaria opcional: qué puede hacer el usuario. */\n message?: string;\n /** Icono o ilustración arriba del título. */\n icon?: ReactNode;\n /** Acción opcional (botón) debajo del mensaje. */\n action?: ReactNode;\n /** Preset registrado en `theme.styles.EmptyState`. */\n preset?: string;\n sx?: SxProps<Theme>;\n className?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Estado vacío centrado, para usar dentro de una card, un tab o una tabla sin\n * resultados. Color y tipografía salen del theme del consumidor: no hay\n * hex ni tamaños hardcodeados.\n */\nexport function EmptyState({\n title,\n message,\n icon,\n action,\n preset,\n sx,\n className,\n 'data-testid': dataTestId,\n}: EmptyStateProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('EmptyState', preset, theme);\n\n const rootSx: SxProps<Theme> = [\n {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n py: 8,\n px: 3,\n textAlign: 'center',\n color: 'text.secondary',\n },\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ] as SxProps<Theme>;\n\n return (\n <Box sx={rootSx} className={className} data-testid={dataTestId}>\n {icon}\n <Typography\n variant=\"subtitle1\"\n className=\"fri-EmptyState-title\"\n sx={{ fontWeight: 600, color: 'text.primary', mt: icon ? 2 : 0 }}\n >\n {title}\n </Typography>\n {message && (\n <Typography variant=\"body2\" className=\"fri-EmptyState-message\" sx={{ mt: 0.5 }}>\n {message}\n </Typography>\n )}\n {action && <Box sx={{ mt: 3 }}>{action}</Box>}\n </Box>\n );\n}\n\nexport default EmptyState;\n"],"names":["useTheme","resolvePreset","Box","jsx","Typography"],"mappings":";;;;AA2BO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAoB;AAClB,QAAM,QAAQA,SAAAA,SAAA;AACd,QAAM,WAAWC,cAAAA,cAAc,cAAc,QAAQ,KAAK;AAE1D,QAAM,SAAyB;AAAA,IAC7B;AAAA,MACE,SAAS;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,OAAO;AAAA,IAAA;AAAA,IAET,GAAI,WAAW,CAAC,QAAQ,IAAI,CAAA;AAAA,IAC5B,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAA;AAAA,EAAC;AAG5C,yCACGC,SAAAA,KAAA,EAAI,IAAI,QAAQ,WAAsB,eAAa,YACjD,UAAA;AAAA,IAAA;AAAA,IACDC,2BAAAA;AAAAA,MAACC,SAAAA;AAAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,IAAI,OAAO,IAAI,EAAA;AAAA,QAE5D,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,WACCD,2BAAAA,IAACC,SAAAA,YAAA,EAAW,SAAQ,SAAQ,WAAU,0BAAyB,IAAI,EAAE,IAAI,IAAA,GACtE,UAAA,QAAA,CACH;AAAA,IAED,yCAAWF,SAAAA,KAAA,EAAI,IAAI,EAAE,IAAI,EAAA,GAAM,UAAA,OAAA,CAAO;AAAA,EAAA,GACzC;AAEJ;;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useTheme, Box, Typography } from "@mui/material";
|
|
3
|
+
import { r as resolvePreset } from "./resolvePreset-K6_BfWHD.js";
|
|
4
|
+
function EmptyState({
|
|
5
|
+
title,
|
|
6
|
+
message,
|
|
7
|
+
icon,
|
|
8
|
+
action,
|
|
9
|
+
preset,
|
|
10
|
+
sx,
|
|
11
|
+
className,
|
|
12
|
+
"data-testid": dataTestId
|
|
13
|
+
}) {
|
|
14
|
+
const theme = useTheme();
|
|
15
|
+
const presetSx = resolvePreset("EmptyState", preset, theme);
|
|
16
|
+
const rootSx = [
|
|
17
|
+
{
|
|
18
|
+
display: "flex",
|
|
19
|
+
flexDirection: "column",
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
justifyContent: "center",
|
|
22
|
+
py: 8,
|
|
23
|
+
px: 3,
|
|
24
|
+
textAlign: "center",
|
|
25
|
+
color: "text.secondary"
|
|
26
|
+
},
|
|
27
|
+
...presetSx ? [presetSx] : [],
|
|
28
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
29
|
+
];
|
|
30
|
+
return /* @__PURE__ */ jsxs(Box, { sx: rootSx, className, "data-testid": dataTestId, children: [
|
|
31
|
+
icon,
|
|
32
|
+
/* @__PURE__ */ jsx(
|
|
33
|
+
Typography,
|
|
34
|
+
{
|
|
35
|
+
variant: "subtitle1",
|
|
36
|
+
className: "fri-EmptyState-title",
|
|
37
|
+
sx: { fontWeight: 600, color: "text.primary", mt: icon ? 2 : 0 },
|
|
38
|
+
children: title
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
message && /* @__PURE__ */ jsx(Typography, { variant: "body2", className: "fri-EmptyState-message", sx: { mt: 0.5 }, children: message }),
|
|
42
|
+
action && /* @__PURE__ */ jsx(Box, { sx: { mt: 3 }, children: action })
|
|
43
|
+
] });
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
EmptyState as E
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=EmptyState-kEoDkg1B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState-kEoDkg1B.js","sources":["../src/components/EmptyState/EmptyState.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\n\nexport interface EmptyStateProps {\n /** Qué falta, en positivo: \"Sin dispositivos registrados\". */\n title: string;\n /** Línea secundaria opcional: qué puede hacer el usuario. */\n message?: string;\n /** Icono o ilustración arriba del título. */\n icon?: ReactNode;\n /** Acción opcional (botón) debajo del mensaje. */\n action?: ReactNode;\n /** Preset registrado en `theme.styles.EmptyState`. */\n preset?: string;\n sx?: SxProps<Theme>;\n className?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Estado vacío centrado, para usar dentro de una card, un tab o una tabla sin\n * resultados. Color y tipografía salen del theme del consumidor: no hay\n * hex ni tamaños hardcodeados.\n */\nexport function EmptyState({\n title,\n message,\n icon,\n action,\n preset,\n sx,\n className,\n 'data-testid': dataTestId,\n}: EmptyStateProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('EmptyState', preset, theme);\n\n const rootSx: SxProps<Theme> = [\n {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n py: 8,\n px: 3,\n textAlign: 'center',\n color: 'text.secondary',\n },\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ] as SxProps<Theme>;\n\n return (\n <Box sx={rootSx} className={className} data-testid={dataTestId}>\n {icon}\n <Typography\n variant=\"subtitle1\"\n className=\"fri-EmptyState-title\"\n sx={{ fontWeight: 600, color: 'text.primary', mt: icon ? 2 : 0 }}\n >\n {title}\n </Typography>\n {message && (\n <Typography variant=\"body2\" className=\"fri-EmptyState-message\" sx={{ mt: 0.5 }}>\n {message}\n </Typography>\n )}\n {action && <Box sx={{ mt: 3 }}>{action}</Box>}\n </Box>\n );\n}\n\nexport default EmptyState;\n"],"names":[],"mappings":";;;AA2BO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAoB;AAClB,QAAM,QAAQ,SAAA;AACd,QAAM,WAAW,cAAc,cAAc,QAAQ,KAAK;AAE1D,QAAM,SAAyB;AAAA,IAC7B;AAAA,MACE,SAAS;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,OAAO;AAAA,IAAA;AAAA,IAET,GAAI,WAAW,CAAC,QAAQ,IAAI,CAAA;AAAA,IAC5B,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAA;AAAA,EAAC;AAG5C,8BACG,KAAA,EAAI,IAAI,QAAQ,WAAsB,eAAa,YACjD,UAAA;AAAA,IAAA;AAAA,IACD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAU;AAAA,QACV,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,IAAI,OAAO,IAAI,EAAA;AAAA,QAE5D,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,WACC,oBAAC,YAAA,EAAW,SAAQ,SAAQ,WAAU,0BAAyB,IAAI,EAAE,IAAI,IAAA,GACtE,UAAA,QAAA,CACH;AAAA,IAED,8BAAW,KAAA,EAAI,IAAI,EAAE,IAAI,EAAA,GAAM,UAAA,OAAA,CAAO;AAAA,EAAA,GACzC;AAEJ;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
+
const material = require("@mui/material");
|
|
4
|
+
const resolvePreset = require("./resolvePreset-CxTI6_Ln.cjs");
|
|
5
|
+
function PageHeader({
|
|
6
|
+
title,
|
|
7
|
+
breadcrumbs,
|
|
8
|
+
actions,
|
|
9
|
+
preset,
|
|
10
|
+
sx,
|
|
11
|
+
className,
|
|
12
|
+
"data-testid": dataTestId
|
|
13
|
+
}) {
|
|
14
|
+
const theme = material.useTheme();
|
|
15
|
+
const presetSx = resolvePreset.resolvePreset("PageHeader", preset, theme);
|
|
16
|
+
const rootSx = [
|
|
17
|
+
{
|
|
18
|
+
display: "flex",
|
|
19
|
+
flexWrap: "wrap",
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
justifyContent: "space-between",
|
|
22
|
+
gap: 2,
|
|
23
|
+
mb: 3
|
|
24
|
+
},
|
|
25
|
+
...presetSx ? [presetSx] : [],
|
|
26
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
27
|
+
];
|
|
28
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: rootSx, className, "data-testid": dataTestId, children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "h4", component: "h1", className: "fri-PageHeader-title", sx: { color: "text.primary" }, children: title }),
|
|
30
|
+
(breadcrumbs || actions) && /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { className: "fri-PageHeader-aside", sx: { display: "flex", alignItems: "center", gap: 2 }, children: [
|
|
31
|
+
breadcrumbs,
|
|
32
|
+
actions
|
|
33
|
+
] })
|
|
34
|
+
] });
|
|
35
|
+
}
|
|
36
|
+
exports.PageHeader = PageHeader;
|
|
37
|
+
//# sourceMappingURL=PageHeader-BQZOqjNr.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeader-BQZOqjNr.cjs","sources":["../src/components/PageHeader/PageHeader.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\n\nexport interface PageHeaderProps {\n /** Título de la página. Se renderiza como `<h1>`. */\n title: ReactNode;\n /**\n * Migas de pan ya armadas por el consumidor — normalmente un `<Breadcrumbs>`\n * con los `Link` de su router. Es un slot a propósito: el paquete no depende\n * de ninguna librería de routing.\n */\n breadcrumbs?: ReactNode;\n /** Acciones a la derecha (botones, menús). */\n actions?: ReactNode;\n /** Preset registrado en `theme.styles.PageHeader`. */\n preset?: string;\n sx?: SxProps<Theme>;\n className?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Encabezado de página: título a la izquierda, migas + acciones a la derecha.\n * En pantallas angostas envuelve en vez de comprimir el título.\n */\nexport function PageHeader({\n title,\n breadcrumbs,\n actions,\n preset,\n sx,\n className,\n 'data-testid': dataTestId,\n}: PageHeaderProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('PageHeader', preset, theme);\n\n const rootSx: SxProps<Theme> = [\n {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n mb: 3,\n },\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ] as SxProps<Theme>;\n\n return (\n <Box sx={rootSx} className={className} data-testid={dataTestId}>\n <Typography variant=\"h4\" component=\"h1\" className=\"fri-PageHeader-title\" sx={{ color: 'text.primary' }}>\n {title}\n </Typography>\n {(breadcrumbs || actions) && (\n <Box className=\"fri-PageHeader-aside\" sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n {breadcrumbs}\n {actions}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default PageHeader;\n"],"names":["useTheme","resolvePreset","Box","jsx","Typography","jsxs"],"mappings":";;;;AA4BO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAoB;AAClB,QAAM,QAAQA,SAAAA,SAAA;AACd,QAAM,WAAWC,cAAAA,cAAc,cAAc,QAAQ,KAAK;AAE1D,QAAM,SAAyB;AAAA,IAC7B;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,KAAK;AAAA,MACL,IAAI;AAAA,IAAA;AAAA,IAEN,GAAI,WAAW,CAAC,QAAQ,IAAI,CAAA;AAAA,IAC5B,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAA;AAAA,EAAC;AAG5C,yCACGC,SAAAA,KAAA,EAAI,IAAI,QAAQ,WAAsB,eAAa,YAClD,UAAA;AAAA,IAAAC,2BAAAA,IAACC,SAAAA,YAAA,EAAW,SAAQ,MAAK,WAAU,MAAK,WAAU,wBAAuB,IAAI,EAAE,OAAO,eAAA,GACnF,UAAA,OACH;AAAA,KACE,eAAe,YACfC,2BAAAA,KAACH,SAAAA,KAAA,EAAI,WAAU,wBAAuB,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,KACrF,UAAA;AAAA,MAAA;AAAA,MACA;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useTheme, Box, Typography } from "@mui/material";
|
|
3
|
+
import { r as resolvePreset } from "./resolvePreset-K6_BfWHD.js";
|
|
4
|
+
function PageHeader({
|
|
5
|
+
title,
|
|
6
|
+
breadcrumbs,
|
|
7
|
+
actions,
|
|
8
|
+
preset,
|
|
9
|
+
sx,
|
|
10
|
+
className,
|
|
11
|
+
"data-testid": dataTestId
|
|
12
|
+
}) {
|
|
13
|
+
const theme = useTheme();
|
|
14
|
+
const presetSx = resolvePreset("PageHeader", preset, theme);
|
|
15
|
+
const rootSx = [
|
|
16
|
+
{
|
|
17
|
+
display: "flex",
|
|
18
|
+
flexWrap: "wrap",
|
|
19
|
+
alignItems: "center",
|
|
20
|
+
justifyContent: "space-between",
|
|
21
|
+
gap: 2,
|
|
22
|
+
mb: 3
|
|
23
|
+
},
|
|
24
|
+
...presetSx ? [presetSx] : [],
|
|
25
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
26
|
+
];
|
|
27
|
+
return /* @__PURE__ */ jsxs(Box, { sx: rootSx, className, "data-testid": dataTestId, children: [
|
|
28
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h4", component: "h1", className: "fri-PageHeader-title", sx: { color: "text.primary" }, children: title }),
|
|
29
|
+
(breadcrumbs || actions) && /* @__PURE__ */ jsxs(Box, { className: "fri-PageHeader-aside", sx: { display: "flex", alignItems: "center", gap: 2 }, children: [
|
|
30
|
+
breadcrumbs,
|
|
31
|
+
actions
|
|
32
|
+
] })
|
|
33
|
+
] });
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
PageHeader as P
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=PageHeader-DDYi6Nhy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeader-DDYi6Nhy.js","sources":["../src/components/PageHeader/PageHeader.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\n\nexport interface PageHeaderProps {\n /** Título de la página. Se renderiza como `<h1>`. */\n title: ReactNode;\n /**\n * Migas de pan ya armadas por el consumidor — normalmente un `<Breadcrumbs>`\n * con los `Link` de su router. Es un slot a propósito: el paquete no depende\n * de ninguna librería de routing.\n */\n breadcrumbs?: ReactNode;\n /** Acciones a la derecha (botones, menús). */\n actions?: ReactNode;\n /** Preset registrado en `theme.styles.PageHeader`. */\n preset?: string;\n sx?: SxProps<Theme>;\n className?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Encabezado de página: título a la izquierda, migas + acciones a la derecha.\n * En pantallas angostas envuelve en vez de comprimir el título.\n */\nexport function PageHeader({\n title,\n breadcrumbs,\n actions,\n preset,\n sx,\n className,\n 'data-testid': dataTestId,\n}: PageHeaderProps) {\n const theme = useTheme();\n const presetSx = resolvePreset('PageHeader', preset, theme);\n\n const rootSx: SxProps<Theme> = [\n {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n mb: 3,\n },\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ] as SxProps<Theme>;\n\n return (\n <Box sx={rootSx} className={className} data-testid={dataTestId}>\n <Typography variant=\"h4\" component=\"h1\" className=\"fri-PageHeader-title\" sx={{ color: 'text.primary' }}>\n {title}\n </Typography>\n {(breadcrumbs || actions) && (\n <Box className=\"fri-PageHeader-aside\" sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n {breadcrumbs}\n {actions}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default PageHeader;\n"],"names":[],"mappings":";;;AA4BO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAoB;AAClB,QAAM,QAAQ,SAAA;AACd,QAAM,WAAW,cAAc,cAAc,QAAQ,KAAK;AAE1D,QAAM,SAAyB;AAAA,IAC7B;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,KAAK;AAAA,MACL,IAAI;AAAA,IAAA;AAAA,IAEN,GAAI,WAAW,CAAC,QAAQ,IAAI,CAAA;AAAA,IAC5B,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAA;AAAA,EAAC;AAG5C,8BACG,KAAA,EAAI,IAAI,QAAQ,WAAsB,eAAa,YAClD,UAAA;AAAA,IAAA,oBAAC,YAAA,EAAW,SAAQ,MAAK,WAAU,MAAK,WAAU,wBAAuB,IAAI,EAAE,OAAO,eAAA,GACnF,UAAA,OACH;AAAA,KACE,eAAe,YACf,qBAAC,KAAA,EAAI,WAAU,wBAAuB,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,KACrF,UAAA;AAAA,MAAA;AAAA,MACA;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const DataRow = require("../../DataRow-CfCaSdaJ.cjs");
|
|
4
|
+
exports.DataRow = DataRow.DataRow;
|
|
5
|
+
exports.default = DataRow.DataRow;
|
|
6
|
+
//# sourceMappingURL=DataRow.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataRow.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material/styles';
|
|
3
|
+
export interface DataRowProps {
|
|
4
|
+
/** Etiqueta del dato (columna izquierda). */
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
/** Valor: texto, o cualquier nodo (chip, link, Input en modo edición). */
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
/** Última fila de un bloque: sin margen inferior. */
|
|
9
|
+
last?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Ancho de la columna del label a partir de `sm`. Default `200`.
|
|
12
|
+
* Fijo a propósito: alinea verticalmente todos los valores de un bloque.
|
|
13
|
+
*/
|
|
14
|
+
labelWidth?: number | string;
|
|
15
|
+
/** Preset registrado en `theme.styles.DataRow`. */
|
|
16
|
+
preset?: string;
|
|
17
|
+
sx?: SxProps<Theme>;
|
|
18
|
+
className?: string;
|
|
19
|
+
'data-testid'?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Fila label/valor — el patrón de dato para vistas de detalle.
|
|
23
|
+
*
|
|
24
|
+
* Geometría: label de ancho fijo + valor al lado; en móvil apila. El ancho fijo
|
|
25
|
+
* (en vez de un `Grid` 4/8) evita que en una card full-width queden cientos de
|
|
26
|
+
* px muertos entre label y valor.
|
|
27
|
+
*
|
|
28
|
+
* Tipografía: el paquete pone `body2`/`body1`. Para mapear a variantes propias
|
|
29
|
+
* del consumidor, registrar un preset en el theme apuntando a las clases
|
|
30
|
+
* internas:
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* styles: {
|
|
34
|
+
* DataRow: {
|
|
35
|
+
* default: {
|
|
36
|
+
* '& .fri-DataRow-label': { typography: 'dataLabel' },
|
|
37
|
+
* '& .fri-DataRow-value': { typography: 'dataValue' },
|
|
38
|
+
* },
|
|
39
|
+
* },
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function DataRow({ label, children, last, labelWidth, preset, sx, className, 'data-testid': dataTestId, }: DataRowProps): import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
export default DataRow;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataRow.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const EmptyState = require("../../EmptyState-DJj9KOEy.cjs");
|
|
4
|
+
exports.EmptyState = EmptyState.EmptyState;
|
|
5
|
+
exports.default = EmptyState.EmptyState;
|
|
6
|
+
//# sourceMappingURL=EmptyState.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material/styles';
|
|
3
|
+
export interface EmptyStateProps {
|
|
4
|
+
/** Qué falta, en positivo: "Sin dispositivos registrados". */
|
|
5
|
+
title: string;
|
|
6
|
+
/** Línea secundaria opcional: qué puede hacer el usuario. */
|
|
7
|
+
message?: string;
|
|
8
|
+
/** Icono o ilustración arriba del título. */
|
|
9
|
+
icon?: ReactNode;
|
|
10
|
+
/** Acción opcional (botón) debajo del mensaje. */
|
|
11
|
+
action?: ReactNode;
|
|
12
|
+
/** Preset registrado en `theme.styles.EmptyState`. */
|
|
13
|
+
preset?: string;
|
|
14
|
+
sx?: SxProps<Theme>;
|
|
15
|
+
className?: string;
|
|
16
|
+
'data-testid'?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Estado vacío centrado, para usar dentro de una card, un tab o una tabla sin
|
|
20
|
+
* resultados. Color y tipografía salen del theme del consumidor: no hay
|
|
21
|
+
* hex ni tamaños hardcodeados.
|
|
22
|
+
*/
|
|
23
|
+
export declare function EmptyState({ title, message, icon, action, preset, sx, className, 'data-testid': dataTestId, }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export default EmptyState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const PageHeader = require("../../PageHeader-BQZOqjNr.cjs");
|
|
4
|
+
exports.PageHeader = PageHeader.PageHeader;
|
|
5
|
+
exports.default = PageHeader.PageHeader;
|
|
6
|
+
//# sourceMappingURL=PageHeader.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeader.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material/styles';
|
|
3
|
+
export interface PageHeaderProps {
|
|
4
|
+
/** Título de la página. Se renderiza como `<h1>`. */
|
|
5
|
+
title: ReactNode;
|
|
6
|
+
/**
|
|
7
|
+
* Migas de pan ya armadas por el consumidor — normalmente un `<Breadcrumbs>`
|
|
8
|
+
* con los `Link` de su router. Es un slot a propósito: el paquete no depende
|
|
9
|
+
* de ninguna librería de routing.
|
|
10
|
+
*/
|
|
11
|
+
breadcrumbs?: ReactNode;
|
|
12
|
+
/** Acciones a la derecha (botones, menús). */
|
|
13
|
+
actions?: ReactNode;
|
|
14
|
+
/** Preset registrado en `theme.styles.PageHeader`. */
|
|
15
|
+
preset?: string;
|
|
16
|
+
sx?: SxProps<Theme>;
|
|
17
|
+
className?: string;
|
|
18
|
+
'data-testid'?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Encabezado de página: título a la izquierda, migas + acciones a la derecha.
|
|
22
|
+
* En pantallas angostas envuelve en vez de comprimir el título.
|
|
23
|
+
*/
|
|
24
|
+
export declare function PageHeader({ title, breadcrumbs, actions, preset, sx, className, 'data-testid': dataTestId, }: PageHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export default PageHeader;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeader.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/index.cjs
CHANGED
|
@@ -14,6 +14,9 @@ const Alert = require("./Alert-B3SMPD1s.cjs");
|
|
|
14
14
|
const Divider = require("./Divider-CIY0JK4U.cjs");
|
|
15
15
|
const ButtonGroup = require("./ButtonGroup-CNunDofQ.cjs");
|
|
16
16
|
const Breadcrumbs = require("./Breadcrumbs-B9I3vxPb.cjs");
|
|
17
|
+
const PageHeader = require("./PageHeader-BQZOqjNr.cjs");
|
|
18
|
+
const DataRow = require("./DataRow-CfCaSdaJ.cjs");
|
|
19
|
+
const EmptyState = require("./EmptyState-DJj9KOEy.cjs");
|
|
17
20
|
const Step = require("./Step-Nd7SJbRZ.cjs");
|
|
18
21
|
const Tab = require("./Tab-D1S7kxXI.cjs");
|
|
19
22
|
const Table = require("./Table-DaNgX7PO.cjs");
|
|
@@ -178,6 +181,9 @@ exports.Alert = Alert.Alert;
|
|
|
178
181
|
exports.Divider = Divider.Divider;
|
|
179
182
|
exports.ButtonGroup = ButtonGroup.ButtonGroup;
|
|
180
183
|
exports.Breadcrumbs = Breadcrumbs.Breadcrumbs;
|
|
184
|
+
exports.PageHeader = PageHeader.PageHeader;
|
|
185
|
+
exports.DataRow = DataRow.DataRow;
|
|
186
|
+
exports.EmptyState = EmptyState.EmptyState;
|
|
181
187
|
exports.Step = Step.Step;
|
|
182
188
|
exports.Stepper = Step.Stepper;
|
|
183
189
|
exports.Tab = Tab.Tab;
|
package/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/scrollToTop.ts"],"sourcesContent":["export interface ScrollToTopOptions {\n /** Comportamiento del scroll. Default: `'smooth'`. */\n behavior?: ScrollBehavior;\n /**\n * Elemento target del scroll. Default: `window`. Útil cuando el contenedor\n * scrolleable NO es `window` (p.ej. un `<Box>` con `overflow: auto`).\n */\n target?: Window | HTMLElement;\n /** Offset desde el top. Default: `0`. */\n top?: number;\n}\n\n/**\n * Hace scroll al tope (por default con animación suave). Safe en SSR — si\n * `window` no existe, es un no-op.\n *\n * Llamar tras mutaciones / cambios de filtros / apertura de modales para\n * asegurar que el usuario vea el mensaje de confirmación en la parte\n * superior de la página.\n *\n * ```ts\n * import { scrollToTop } from '@soyfri/shared-library';\n *\n * scrollToTop(); // window, smooth\n * scrollToTop({ behavior: 'auto' }); // window, instantáneo\n * scrollToTop({ target: myScrollableRef.current }); // container custom\n * ```\n */\nexport function scrollToTop({\n behavior = 'smooth',\n target = typeof window !== 'undefined' ? window : undefined,\n top = 0,\n}: ScrollToTopOptions = {}): void {\n if (!target) return;\n target.scrollTo({ top, left: 0, behavior });\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/scrollToTop.ts"],"sourcesContent":["export interface ScrollToTopOptions {\n /** Comportamiento del scroll. Default: `'smooth'`. */\n behavior?: ScrollBehavior;\n /**\n * Elemento target del scroll. Default: `window`. Útil cuando el contenedor\n * scrolleable NO es `window` (p.ej. un `<Box>` con `overflow: auto`).\n */\n target?: Window | HTMLElement;\n /** Offset desde el top. Default: `0`. */\n top?: number;\n}\n\n/**\n * Hace scroll al tope (por default con animación suave). Safe en SSR — si\n * `window` no existe, es un no-op.\n *\n * Llamar tras mutaciones / cambios de filtros / apertura de modales para\n * asegurar que el usuario vea el mensaje de confirmación en la parte\n * superior de la página.\n *\n * ```ts\n * import { scrollToTop } from '@soyfri/shared-library';\n *\n * scrollToTop(); // window, smooth\n * scrollToTop({ behavior: 'auto' }); // window, instantáneo\n * scrollToTop({ target: myScrollableRef.current }); // container custom\n * ```\n */\nexport function scrollToTop({\n behavior = 'smooth',\n target = typeof window !== 'undefined' ? window : undefined,\n top = 0,\n}: ScrollToTopOptions = {}): void {\n if (!target) return;\n target.scrollTo({ top, left: 0, behavior });\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BO,SAAS,YAAY;AAAA,EAC1B,WAAW;AAAA,EACX,SAAS,OAAO,WAAW,cAAc,SAAS;AAAA,EAClD,MAAM;AACR,IAAwB,IAAU;AAChC,MAAI,CAAC,OAAQ;AACb,SAAO,SAAS,EAAE,KAAK,MAAM,GAAG,UAAU;AAC5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/index.d.ts
CHANGED
|
@@ -20,6 +20,12 @@ export { ButtonGroup } from './components/ButtonGroup';
|
|
|
20
20
|
export type { ButtonGroupProps } from './components/ButtonGroup';
|
|
21
21
|
export { Breadcrumbs } from './components/Breadcrumbs';
|
|
22
22
|
export type { BreadcrumbsProps } from './components/Breadcrumbs';
|
|
23
|
+
export { PageHeader } from './components/PageHeader';
|
|
24
|
+
export type { PageHeaderProps } from './components/PageHeader';
|
|
25
|
+
export { DataRow } from './components/DataRow';
|
|
26
|
+
export type { DataRowProps } from './components/DataRow';
|
|
27
|
+
export { EmptyState } from './components/EmptyState';
|
|
28
|
+
export type { EmptyStateProps } from './components/EmptyState';
|
|
23
29
|
export { Stepper, Step } from './components/Stepper';
|
|
24
30
|
export { Tabs, Tab } from './components/Tabs';
|
|
25
31
|
export { Table } from './components/Table';
|
package/index.js
CHANGED
|
@@ -12,6 +12,9 @@ import { A as A2 } from "./Alert-YsPScpSE.js";
|
|
|
12
12
|
import { D as D2 } from "./Divider-BApcM5CV.js";
|
|
13
13
|
import { B as B2 } from "./ButtonGroup-CcKUZ-lT.js";
|
|
14
14
|
import { B as B3 } from "./Breadcrumbs-C41SPbtX.js";
|
|
15
|
+
import { P } from "./PageHeader-DDYi6Nhy.js";
|
|
16
|
+
import { D as D3 } from "./DataRow-B7fJ5taA.js";
|
|
17
|
+
import { E } from "./EmptyState-kEoDkg1B.js";
|
|
15
18
|
import { a, S as S3 } from "./Step-BArsou1V.js";
|
|
16
19
|
import { a as a2, T } from "./Tab-DycIMXmQ.js";
|
|
17
20
|
import { T as T2 } from "./Table-aNFAOuQk.js";
|
|
@@ -23,12 +26,12 @@ import { A as A3, a as a4 } from "./Autocomplete-E5aSUGVK.js";
|
|
|
23
26
|
import { S as S6 } from "./Switch-CY1Dd2ff.js";
|
|
24
27
|
import { R } from "./RadioGroup-cKCpag8W.js";
|
|
25
28
|
import { C as C3 } from "./Checkbox-BL4kvHFB.js";
|
|
26
|
-
import { D as
|
|
27
|
-
import { D as
|
|
29
|
+
import { D as D4 } from "./DatePicker-D__RSgs-.js";
|
|
30
|
+
import { D as D5 } from "./DateTimePicker-LeaE716a.js";
|
|
28
31
|
import { I as I2 } from "./InputGroup-D5pXKGjZ.js";
|
|
29
32
|
import { A as A4, a as a5 } from "./ActionMenu-BXRVKopM.js";
|
|
30
33
|
import { A as A5, a as a6, u } from "./AppBarMenuToggle-BpXBMeca.js";
|
|
31
|
-
import { D as
|
|
34
|
+
import { D as D6, a as a7, u as u2 } from "./DrawerItem-at1lsEo9.js";
|
|
32
35
|
import { F } from "./Flyout-DCcDBYKT.js";
|
|
33
36
|
import { G } from "./Gallery-ClBJxCMc.js";
|
|
34
37
|
import { I as I3 } from "./Icon-CUwK2c8z.js";
|
|
@@ -66,11 +69,13 @@ export {
|
|
|
66
69
|
Column,
|
|
67
70
|
Container,
|
|
68
71
|
D as DEFAULT_PRESET_NAME,
|
|
69
|
-
D3 as
|
|
70
|
-
D4 as
|
|
72
|
+
D3 as DataRow,
|
|
73
|
+
D4 as DatePicker,
|
|
74
|
+
D5 as DateTimePicker,
|
|
71
75
|
D2 as Divider,
|
|
72
|
-
|
|
76
|
+
D6 as Drawer,
|
|
73
77
|
a7 as DrawerItem,
|
|
78
|
+
E as EmptyState,
|
|
74
79
|
Fade,
|
|
75
80
|
F as Flyout,
|
|
76
81
|
G as Gallery,
|
|
@@ -93,6 +98,7 @@ export {
|
|
|
93
98
|
c as ModalFooter,
|
|
94
99
|
a3 as ModalHeader,
|
|
95
100
|
O as Option,
|
|
101
|
+
P as PageHeader,
|
|
96
102
|
Paper,
|
|
97
103
|
R as RadioGroup,
|
|
98
104
|
S5 as Select,
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/scrollToTop.ts"],"sourcesContent":["export interface ScrollToTopOptions {\n /** Comportamiento del scroll. Default: `'smooth'`. */\n behavior?: ScrollBehavior;\n /**\n * Elemento target del scroll. Default: `window`. Útil cuando el contenedor\n * scrolleable NO es `window` (p.ej. un `<Box>` con `overflow: auto`).\n */\n target?: Window | HTMLElement;\n /** Offset desde el top. Default: `0`. */\n top?: number;\n}\n\n/**\n * Hace scroll al tope (por default con animación suave). Safe en SSR — si\n * `window` no existe, es un no-op.\n *\n * Llamar tras mutaciones / cambios de filtros / apertura de modales para\n * asegurar que el usuario vea el mensaje de confirmación en la parte\n * superior de la página.\n *\n * ```ts\n * import { scrollToTop } from '@soyfri/shared-library';\n *\n * scrollToTop(); // window, smooth\n * scrollToTop({ behavior: 'auto' }); // window, instantáneo\n * scrollToTop({ target: myScrollableRef.current }); // container custom\n * ```\n */\nexport function scrollToTop({\n behavior = 'smooth',\n target = typeof window !== 'undefined' ? window : undefined,\n top = 0,\n}: ScrollToTopOptions = {}): void {\n if (!target) return;\n target.scrollTo({ top, left: 0, behavior });\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/scrollToTop.ts"],"sourcesContent":["export interface ScrollToTopOptions {\n /** Comportamiento del scroll. Default: `'smooth'`. */\n behavior?: ScrollBehavior;\n /**\n * Elemento target del scroll. Default: `window`. Útil cuando el contenedor\n * scrolleable NO es `window` (p.ej. un `<Box>` con `overflow: auto`).\n */\n target?: Window | HTMLElement;\n /** Offset desde el top. Default: `0`. */\n top?: number;\n}\n\n/**\n * Hace scroll al tope (por default con animación suave). Safe en SSR — si\n * `window` no existe, es un no-op.\n *\n * Llamar tras mutaciones / cambios de filtros / apertura de modales para\n * asegurar que el usuario vea el mensaje de confirmación en la parte\n * superior de la página.\n *\n * ```ts\n * import { scrollToTop } from '@soyfri/shared-library';\n *\n * scrollToTop(); // window, smooth\n * scrollToTop({ behavior: 'auto' }); // window, instantáneo\n * scrollToTop({ target: myScrollableRef.current }); // container custom\n * ```\n */\nexport function scrollToTop({\n behavior = 'smooth',\n target = typeof window !== 'undefined' ? window : undefined,\n top = 0,\n}: ScrollToTopOptions = {}): void {\n if (!target) return;\n target.scrollTo({ top, left: 0, behavior });\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BO,SAAS,YAAY;AAAA,EAC1B,WAAW;AAAA,EACX,SAAS,OAAO,WAAW,cAAc,SAAS;AAAA,EAClD,MAAM;AACR,IAAwB,IAAU;AAChC,MAAI,CAAC,OAAQ;AACb,SAAO,SAAS,EAAE,KAAK,MAAM,GAAG,UAAU;AAC5C;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soyfri/shared-library",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"main": "./index.cjs",
|
|
5
5
|
"module": "./index.js",
|
|
6
6
|
"types": "./index.d.ts",
|
|
@@ -87,6 +87,11 @@
|
|
|
87
87
|
"require": "./components/RadioGroup/RadioGroup.cjs",
|
|
88
88
|
"types": "./components/RadioGroup/index.d.ts"
|
|
89
89
|
},
|
|
90
|
+
"./components/PageHeader": {
|
|
91
|
+
"import": "./components/PageHeader/PageHeader.js",
|
|
92
|
+
"require": "./components/PageHeader/PageHeader.cjs",
|
|
93
|
+
"types": "./components/PageHeader/index.d.ts"
|
|
94
|
+
},
|
|
90
95
|
"./components/Modal": {
|
|
91
96
|
"import": "./components/Modal/Modal.js",
|
|
92
97
|
"require": "./components/Modal/Modal.cjs",
|
|
@@ -122,6 +127,11 @@
|
|
|
122
127
|
"require": "./components/Flyout/Flyout.cjs",
|
|
123
128
|
"types": "./components/Flyout/index.d.ts"
|
|
124
129
|
},
|
|
130
|
+
"./components/EmptyState": {
|
|
131
|
+
"import": "./components/EmptyState/EmptyState.js",
|
|
132
|
+
"require": "./components/EmptyState/EmptyState.cjs",
|
|
133
|
+
"types": "./components/EmptyState/index.d.ts"
|
|
134
|
+
},
|
|
125
135
|
"./components/Drawer": {
|
|
126
136
|
"import": "./components/Drawer/Drawer.js",
|
|
127
137
|
"require": "./components/Drawer/Drawer.cjs",
|
|
@@ -142,6 +152,11 @@
|
|
|
142
152
|
"require": "./components/DatePicker/DatePicker.cjs",
|
|
143
153
|
"types": "./components/DatePicker/index.d.ts"
|
|
144
154
|
},
|
|
155
|
+
"./components/DataRow": {
|
|
156
|
+
"import": "./components/DataRow/DataRow.js",
|
|
157
|
+
"require": "./components/DataRow/DataRow.cjs",
|
|
158
|
+
"types": "./components/DataRow/index.d.ts"
|
|
159
|
+
},
|
|
145
160
|
"./components/Column": {
|
|
146
161
|
"import": "./components/Column/Column.js",
|
|
147
162
|
"require": "./components/Column/Column.cjs",
|
|
@@ -4,7 +4,7 @@ import { SxProps, Theme } from '@mui/material/styles';
|
|
|
4
4
|
* theme. Si en el futuro se agrega otro componente al sistema, se extiende
|
|
5
5
|
* esta union.
|
|
6
6
|
*/
|
|
7
|
-
export type LibraryComponentName = 'Input' | 'Select' | 'Autocomplete' | 'DatePicker' | 'DateTimePicker' | 'Drawer' | 'AppBar' | 'Card' | 'RadioGroup' | 'Switch' | 'Checkbox' | 'Gallery';
|
|
7
|
+
export type LibraryComponentName = 'Input' | 'Select' | 'Autocomplete' | 'DatePicker' | 'DateTimePicker' | 'Drawer' | 'AppBar' | 'Card' | 'RadioGroup' | 'Switch' | 'Checkbox' | 'Gallery' | 'DataRow' | 'EmptyState' | 'PageHeader';
|
|
8
8
|
/**
|
|
9
9
|
* Un estilo de preset. Puede ser un objeto sx directo o una función del theme
|
|
10
10
|
* para acceder a palette/typography/etc.
|
package/styles.css
DELETED
|
@@ -1,375 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties;
|
|
3
|
-
.\@container {
|
|
4
|
-
container-type: inline-size;
|
|
5
|
-
}
|
|
6
|
-
.collapse {
|
|
7
|
-
visibility: collapse;
|
|
8
|
-
}
|
|
9
|
-
.invisible {
|
|
10
|
-
visibility: hidden;
|
|
11
|
-
}
|
|
12
|
-
.visible {
|
|
13
|
-
visibility: visible;
|
|
14
|
-
}
|
|
15
|
-
.absolute {
|
|
16
|
-
position: absolute;
|
|
17
|
-
}
|
|
18
|
-
.fixed {
|
|
19
|
-
position: fixed;
|
|
20
|
-
}
|
|
21
|
-
.relative {
|
|
22
|
-
position: relative;
|
|
23
|
-
}
|
|
24
|
-
.static {
|
|
25
|
-
position: static;
|
|
26
|
-
}
|
|
27
|
-
.sticky {
|
|
28
|
-
position: sticky;
|
|
29
|
-
}
|
|
30
|
-
.isolate {
|
|
31
|
-
isolation: isolate;
|
|
32
|
-
}
|
|
33
|
-
.float-left {
|
|
34
|
-
float: left;
|
|
35
|
-
}
|
|
36
|
-
.float-right {
|
|
37
|
-
float: right;
|
|
38
|
-
}
|
|
39
|
-
.container {
|
|
40
|
-
width: 100%;
|
|
41
|
-
}
|
|
42
|
-
.block {
|
|
43
|
-
display: block;
|
|
44
|
-
}
|
|
45
|
-
.contents {
|
|
46
|
-
display: contents;
|
|
47
|
-
}
|
|
48
|
-
.flex {
|
|
49
|
-
display: flex;
|
|
50
|
-
}
|
|
51
|
-
.grid {
|
|
52
|
-
display: grid;
|
|
53
|
-
}
|
|
54
|
-
.hidden {
|
|
55
|
-
display: none;
|
|
56
|
-
}
|
|
57
|
-
.inline {
|
|
58
|
-
display: inline;
|
|
59
|
-
}
|
|
60
|
-
.inline-block {
|
|
61
|
-
display: inline-block;
|
|
62
|
-
}
|
|
63
|
-
.inline-flex {
|
|
64
|
-
display: inline-flex;
|
|
65
|
-
}
|
|
66
|
-
.table {
|
|
67
|
-
display: table;
|
|
68
|
-
}
|
|
69
|
-
.table-cell {
|
|
70
|
-
display: table-cell;
|
|
71
|
-
}
|
|
72
|
-
.table-header-group {
|
|
73
|
-
display: table-header-group;
|
|
74
|
-
}
|
|
75
|
-
.table-row {
|
|
76
|
-
display: table-row;
|
|
77
|
-
}
|
|
78
|
-
.table-row-group {
|
|
79
|
-
display: table-row-group;
|
|
80
|
-
}
|
|
81
|
-
.flex-shrink {
|
|
82
|
-
flex-shrink: 1;
|
|
83
|
-
}
|
|
84
|
-
.shrink {
|
|
85
|
-
flex-shrink: 1;
|
|
86
|
-
}
|
|
87
|
-
.flex-grow {
|
|
88
|
-
flex-grow: 1;
|
|
89
|
-
}
|
|
90
|
-
.grow {
|
|
91
|
-
flex-grow: 1;
|
|
92
|
-
}
|
|
93
|
-
.border-collapse {
|
|
94
|
-
border-collapse: collapse;
|
|
95
|
-
}
|
|
96
|
-
.transform {
|
|
97
|
-
transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
|
|
98
|
-
}
|
|
99
|
-
.transform\! {
|
|
100
|
-
transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,) !important;
|
|
101
|
-
}
|
|
102
|
-
.resize {
|
|
103
|
-
resize: both;
|
|
104
|
-
}
|
|
105
|
-
.truncate {
|
|
106
|
-
overflow: hidden;
|
|
107
|
-
text-overflow: ellipsis;
|
|
108
|
-
white-space: nowrap;
|
|
109
|
-
}
|
|
110
|
-
.border {
|
|
111
|
-
border-style: var(--tw-border-style);
|
|
112
|
-
border-width: 1px;
|
|
113
|
-
}
|
|
114
|
-
.text-wrap {
|
|
115
|
-
text-wrap: wrap;
|
|
116
|
-
}
|
|
117
|
-
.lowercase {
|
|
118
|
-
text-transform: lowercase;
|
|
119
|
-
}
|
|
120
|
-
.uppercase {
|
|
121
|
-
text-transform: uppercase;
|
|
122
|
-
}
|
|
123
|
-
.italic {
|
|
124
|
-
font-style: italic;
|
|
125
|
-
}
|
|
126
|
-
.tabular-nums {
|
|
127
|
-
--tw-numeric-spacing: tabular-nums;
|
|
128
|
-
font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
|
|
129
|
-
}
|
|
130
|
-
.overline {
|
|
131
|
-
text-decoration-line: overline;
|
|
132
|
-
}
|
|
133
|
-
.underline {
|
|
134
|
-
text-decoration-line: underline;
|
|
135
|
-
}
|
|
136
|
-
.antialiased {
|
|
137
|
-
-webkit-font-smoothing: antialiased;
|
|
138
|
-
-moz-osx-font-smoothing: grayscale;
|
|
139
|
-
}
|
|
140
|
-
.ring {
|
|
141
|
-
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
142
|
-
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
143
|
-
}
|
|
144
|
-
.outline {
|
|
145
|
-
outline-style: var(--tw-outline-style);
|
|
146
|
-
outline-width: 1px;
|
|
147
|
-
}
|
|
148
|
-
.grayscale {
|
|
149
|
-
--tw-grayscale: grayscale(100%);
|
|
150
|
-
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
151
|
-
}
|
|
152
|
-
.filter {
|
|
153
|
-
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
154
|
-
}
|
|
155
|
-
.filter\! {
|
|
156
|
-
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,) !important;
|
|
157
|
-
}
|
|
158
|
-
.transition {
|
|
159
|
-
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
|
|
160
|
-
transition-timing-function: var(--tw-ease, ease);
|
|
161
|
-
transition-duration: var(--tw-duration, 0s);
|
|
162
|
-
}
|
|
163
|
-
@property --tw-rotate-x {
|
|
164
|
-
syntax: "*";
|
|
165
|
-
inherits: false;
|
|
166
|
-
}
|
|
167
|
-
@property --tw-rotate-y {
|
|
168
|
-
syntax: "*";
|
|
169
|
-
inherits: false;
|
|
170
|
-
}
|
|
171
|
-
@property --tw-rotate-z {
|
|
172
|
-
syntax: "*";
|
|
173
|
-
inherits: false;
|
|
174
|
-
}
|
|
175
|
-
@property --tw-skew-x {
|
|
176
|
-
syntax: "*";
|
|
177
|
-
inherits: false;
|
|
178
|
-
}
|
|
179
|
-
@property --tw-skew-y {
|
|
180
|
-
syntax: "*";
|
|
181
|
-
inherits: false;
|
|
182
|
-
}
|
|
183
|
-
@property --tw-border-style {
|
|
184
|
-
syntax: "*";
|
|
185
|
-
inherits: false;
|
|
186
|
-
initial-value: solid;
|
|
187
|
-
}
|
|
188
|
-
@property --tw-ordinal {
|
|
189
|
-
syntax: "*";
|
|
190
|
-
inherits: false;
|
|
191
|
-
}
|
|
192
|
-
@property --tw-slashed-zero {
|
|
193
|
-
syntax: "*";
|
|
194
|
-
inherits: false;
|
|
195
|
-
}
|
|
196
|
-
@property --tw-numeric-figure {
|
|
197
|
-
syntax: "*";
|
|
198
|
-
inherits: false;
|
|
199
|
-
}
|
|
200
|
-
@property --tw-numeric-spacing {
|
|
201
|
-
syntax: "*";
|
|
202
|
-
inherits: false;
|
|
203
|
-
}
|
|
204
|
-
@property --tw-numeric-fraction {
|
|
205
|
-
syntax: "*";
|
|
206
|
-
inherits: false;
|
|
207
|
-
}
|
|
208
|
-
@property --tw-shadow {
|
|
209
|
-
syntax: "*";
|
|
210
|
-
inherits: false;
|
|
211
|
-
initial-value: 0 0 #0000;
|
|
212
|
-
}
|
|
213
|
-
@property --tw-shadow-color {
|
|
214
|
-
syntax: "*";
|
|
215
|
-
inherits: false;
|
|
216
|
-
}
|
|
217
|
-
@property --tw-shadow-alpha {
|
|
218
|
-
syntax: "<percentage>";
|
|
219
|
-
inherits: false;
|
|
220
|
-
initial-value: 100%;
|
|
221
|
-
}
|
|
222
|
-
@property --tw-inset-shadow {
|
|
223
|
-
syntax: "*";
|
|
224
|
-
inherits: false;
|
|
225
|
-
initial-value: 0 0 #0000;
|
|
226
|
-
}
|
|
227
|
-
@property --tw-inset-shadow-color {
|
|
228
|
-
syntax: "*";
|
|
229
|
-
inherits: false;
|
|
230
|
-
}
|
|
231
|
-
@property --tw-inset-shadow-alpha {
|
|
232
|
-
syntax: "<percentage>";
|
|
233
|
-
inherits: false;
|
|
234
|
-
initial-value: 100%;
|
|
235
|
-
}
|
|
236
|
-
@property --tw-ring-color {
|
|
237
|
-
syntax: "*";
|
|
238
|
-
inherits: false;
|
|
239
|
-
}
|
|
240
|
-
@property --tw-ring-shadow {
|
|
241
|
-
syntax: "*";
|
|
242
|
-
inherits: false;
|
|
243
|
-
initial-value: 0 0 #0000;
|
|
244
|
-
}
|
|
245
|
-
@property --tw-inset-ring-color {
|
|
246
|
-
syntax: "*";
|
|
247
|
-
inherits: false;
|
|
248
|
-
}
|
|
249
|
-
@property --tw-inset-ring-shadow {
|
|
250
|
-
syntax: "*";
|
|
251
|
-
inherits: false;
|
|
252
|
-
initial-value: 0 0 #0000;
|
|
253
|
-
}
|
|
254
|
-
@property --tw-ring-inset {
|
|
255
|
-
syntax: "*";
|
|
256
|
-
inherits: false;
|
|
257
|
-
}
|
|
258
|
-
@property --tw-ring-offset-width {
|
|
259
|
-
syntax: "<length>";
|
|
260
|
-
inherits: false;
|
|
261
|
-
initial-value: 0px;
|
|
262
|
-
}
|
|
263
|
-
@property --tw-ring-offset-color {
|
|
264
|
-
syntax: "*";
|
|
265
|
-
inherits: false;
|
|
266
|
-
initial-value: #fff;
|
|
267
|
-
}
|
|
268
|
-
@property --tw-ring-offset-shadow {
|
|
269
|
-
syntax: "*";
|
|
270
|
-
inherits: false;
|
|
271
|
-
initial-value: 0 0 #0000;
|
|
272
|
-
}
|
|
273
|
-
@property --tw-outline-style {
|
|
274
|
-
syntax: "*";
|
|
275
|
-
inherits: false;
|
|
276
|
-
initial-value: solid;
|
|
277
|
-
}
|
|
278
|
-
@property --tw-blur {
|
|
279
|
-
syntax: "*";
|
|
280
|
-
inherits: false;
|
|
281
|
-
}
|
|
282
|
-
@property --tw-brightness {
|
|
283
|
-
syntax: "*";
|
|
284
|
-
inherits: false;
|
|
285
|
-
}
|
|
286
|
-
@property --tw-contrast {
|
|
287
|
-
syntax: "*";
|
|
288
|
-
inherits: false;
|
|
289
|
-
}
|
|
290
|
-
@property --tw-grayscale {
|
|
291
|
-
syntax: "*";
|
|
292
|
-
inherits: false;
|
|
293
|
-
}
|
|
294
|
-
@property --tw-hue-rotate {
|
|
295
|
-
syntax: "*";
|
|
296
|
-
inherits: false;
|
|
297
|
-
}
|
|
298
|
-
@property --tw-invert {
|
|
299
|
-
syntax: "*";
|
|
300
|
-
inherits: false;
|
|
301
|
-
}
|
|
302
|
-
@property --tw-opacity {
|
|
303
|
-
syntax: "*";
|
|
304
|
-
inherits: false;
|
|
305
|
-
}
|
|
306
|
-
@property --tw-saturate {
|
|
307
|
-
syntax: "*";
|
|
308
|
-
inherits: false;
|
|
309
|
-
}
|
|
310
|
-
@property --tw-sepia {
|
|
311
|
-
syntax: "*";
|
|
312
|
-
inherits: false;
|
|
313
|
-
}
|
|
314
|
-
@property --tw-drop-shadow {
|
|
315
|
-
syntax: "*";
|
|
316
|
-
inherits: false;
|
|
317
|
-
}
|
|
318
|
-
@property --tw-drop-shadow-color {
|
|
319
|
-
syntax: "*";
|
|
320
|
-
inherits: false;
|
|
321
|
-
}
|
|
322
|
-
@property --tw-drop-shadow-alpha {
|
|
323
|
-
syntax: "<percentage>";
|
|
324
|
-
inherits: false;
|
|
325
|
-
initial-value: 100%;
|
|
326
|
-
}
|
|
327
|
-
@property --tw-drop-shadow-size {
|
|
328
|
-
syntax: "*";
|
|
329
|
-
inherits: false;
|
|
330
|
-
}
|
|
331
|
-
@layer properties {
|
|
332
|
-
@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
|
|
333
|
-
*, ::before, ::after, ::backdrop {
|
|
334
|
-
--tw-rotate-x: initial;
|
|
335
|
-
--tw-rotate-y: initial;
|
|
336
|
-
--tw-rotate-z: initial;
|
|
337
|
-
--tw-skew-x: initial;
|
|
338
|
-
--tw-skew-y: initial;
|
|
339
|
-
--tw-border-style: solid;
|
|
340
|
-
--tw-ordinal: initial;
|
|
341
|
-
--tw-slashed-zero: initial;
|
|
342
|
-
--tw-numeric-figure: initial;
|
|
343
|
-
--tw-numeric-spacing: initial;
|
|
344
|
-
--tw-numeric-fraction: initial;
|
|
345
|
-
--tw-shadow: 0 0 #0000;
|
|
346
|
-
--tw-shadow-color: initial;
|
|
347
|
-
--tw-shadow-alpha: 100%;
|
|
348
|
-
--tw-inset-shadow: 0 0 #0000;
|
|
349
|
-
--tw-inset-shadow-color: initial;
|
|
350
|
-
--tw-inset-shadow-alpha: 100%;
|
|
351
|
-
--tw-ring-color: initial;
|
|
352
|
-
--tw-ring-shadow: 0 0 #0000;
|
|
353
|
-
--tw-inset-ring-color: initial;
|
|
354
|
-
--tw-inset-ring-shadow: 0 0 #0000;
|
|
355
|
-
--tw-ring-inset: initial;
|
|
356
|
-
--tw-ring-offset-width: 0px;
|
|
357
|
-
--tw-ring-offset-color: #fff;
|
|
358
|
-
--tw-ring-offset-shadow: 0 0 #0000;
|
|
359
|
-
--tw-outline-style: solid;
|
|
360
|
-
--tw-blur: initial;
|
|
361
|
-
--tw-brightness: initial;
|
|
362
|
-
--tw-contrast: initial;
|
|
363
|
-
--tw-grayscale: initial;
|
|
364
|
-
--tw-hue-rotate: initial;
|
|
365
|
-
--tw-invert: initial;
|
|
366
|
-
--tw-opacity: initial;
|
|
367
|
-
--tw-saturate: initial;
|
|
368
|
-
--tw-sepia: initial;
|
|
369
|
-
--tw-drop-shadow: initial;
|
|
370
|
-
--tw-drop-shadow-color: initial;
|
|
371
|
-
--tw-drop-shadow-alpha: 100%;
|
|
372
|
-
--tw-drop-shadow-size: initial;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|