@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.
Files changed (41) hide show
  1. package/DataRow-B7fJ5taA.js +55 -0
  2. package/DataRow-B7fJ5taA.js.map +1 -0
  3. package/DataRow-CfCaSdaJ.cjs +54 -0
  4. package/DataRow-CfCaSdaJ.cjs.map +1 -0
  5. package/EmptyState-DJj9KOEy.cjs +47 -0
  6. package/EmptyState-DJj9KOEy.cjs.map +1 -0
  7. package/EmptyState-kEoDkg1B.js +48 -0
  8. package/EmptyState-kEoDkg1B.js.map +1 -0
  9. package/PageHeader-BQZOqjNr.cjs +37 -0
  10. package/PageHeader-BQZOqjNr.cjs.map +1 -0
  11. package/PageHeader-DDYi6Nhy.js +38 -0
  12. package/PageHeader-DDYi6Nhy.js.map +1 -0
  13. package/components/DataRow/DataRow.cjs +6 -0
  14. package/components/DataRow/DataRow.cjs.map +1 -0
  15. package/components/DataRow/DataRow.d.ts +44 -0
  16. package/components/DataRow/DataRow.js +6 -0
  17. package/components/DataRow/DataRow.js.map +1 -0
  18. package/components/DataRow/index.d.ts +2 -0
  19. package/components/DataRow.d.ts +6 -0
  20. package/components/EmptyState/EmptyState.cjs +6 -0
  21. package/components/EmptyState/EmptyState.cjs.map +1 -0
  22. package/components/EmptyState/EmptyState.d.ts +24 -0
  23. package/components/EmptyState/EmptyState.js +6 -0
  24. package/components/EmptyState/EmptyState.js.map +1 -0
  25. package/components/EmptyState/index.d.ts +2 -0
  26. package/components/EmptyState.d.ts +6 -0
  27. package/components/PageHeader/PageHeader.cjs +6 -0
  28. package/components/PageHeader/PageHeader.cjs.map +1 -0
  29. package/components/PageHeader/PageHeader.d.ts +25 -0
  30. package/components/PageHeader/PageHeader.js +6 -0
  31. package/components/PageHeader/PageHeader.js.map +1 -0
  32. package/components/PageHeader/index.d.ts +2 -0
  33. package/components/PageHeader.d.ts +6 -0
  34. package/index.cjs +6 -0
  35. package/index.cjs.map +1 -1
  36. package/index.d.ts +6 -0
  37. package/index.js +12 -6
  38. package/index.js.map +1 -1
  39. package/package.json +16 -1
  40. package/theme/componentStyles.d.ts +1 -1
  41. 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,6 @@
1
+ import { D, D as D2 } from "../../DataRow-B7fJ5taA.js";
2
+ export {
3
+ D as DataRow,
4
+ D2 as default
5
+ };
6
+ //# sourceMappingURL=DataRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataRow.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ export { DataRow, default } from './DataRow';
2
+ export type { DataRowProps } from './DataRow';
@@ -0,0 +1,6 @@
1
+ export * from './DataRow/index'
2
+ export {}
3
+ import _default from './DataRow/index'
4
+ export default _default
5
+ export * from './DataRow/index'
6
+ export {}
@@ -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,6 @@
1
+ import { E, E as E2 } from "../../EmptyState-kEoDkg1B.js";
2
+ export {
3
+ E as EmptyState,
4
+ E2 as default
5
+ };
6
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ export { EmptyState, default } from './EmptyState';
2
+ export type { EmptyStateProps } from './EmptyState';
@@ -0,0 +1,6 @@
1
+ export * from './EmptyState/index'
2
+ export {}
3
+ import _default from './EmptyState/index'
4
+ export default _default
5
+ export * from './EmptyState/index'
6
+ export {}
@@ -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,6 @@
1
+ import { P, P as P2 } from "../../PageHeader-DDYi6Nhy.js";
2
+ export {
3
+ P as PageHeader,
4
+ P2 as default
5
+ };
6
+ //# sourceMappingURL=PageHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageHeader.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ export { PageHeader, default } from './PageHeader';
2
+ export type { PageHeaderProps } from './PageHeader';
@@ -0,0 +1,6 @@
1
+ export * from './PageHeader/index'
2
+ export {}
3
+ import _default from './PageHeader/index'
4
+ export default _default
5
+ export * from './PageHeader/index'
6
+ export {}
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
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 D3 } from "./DatePicker-D__RSgs-.js";
27
- import { D as D4 } from "./DateTimePicker-LeaE716a.js";
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 D5, a as a7, u as u2 } from "./DrawerItem-at1lsEo9.js";
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 DatePicker,
70
- D4 as DateTimePicker,
72
+ D3 as DataRow,
73
+ D4 as DatePicker,
74
+ D5 as DateTimePicker,
71
75
  D2 as Divider,
72
- D5 as Drawer,
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;"}
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.2.1",
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
- }