@m4l/components 9.3.25-beta.0 → 9.3.26

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 (110) hide show
  1. package/@types/export.d.ts +6 -0
  2. package/@types/types.d.ts +26 -1
  3. package/components/CommonActions/components/ActionFormCancel/ActionFormCancel.js +8 -2
  4. package/components/CommonActions/components/ActionFormCancel/types.d.ts +1 -0
  5. package/components/DataGrid/DataGrid.js +6 -2
  6. package/components/DataGrid/Datagrid.styles.js +67 -18
  7. package/components/DataGrid/constants.d.ts +19 -0
  8. package/components/DataGrid/formatters/ColumnIconFormatter/formatter.d.ts +1 -2
  9. package/components/DataGrid/formatters/ColumnIconFormatter/formatter.js +3 -6
  10. package/components/DataGrid/formatters/ColumnIconFormatter/types.d.ts +2 -4
  11. package/components/DataGrid/formatters/ColumnSetCheckFormatter/formatter.js +7 -1
  12. package/components/DataGrid/formatters/ColumnSetCheckFormatter/types.d.ts +1 -0
  13. package/components/DataGrid/formatters/ColumnTagsFormatter/formatter.d.ts +8 -0
  14. package/components/DataGrid/formatters/ColumnTagsFormatter/formatter.js +16 -0
  15. package/components/DataGrid/formatters/ColumnTagsFormatter/index.d.ts +3 -0
  16. package/components/DataGrid/formatters/ColumnTagsFormatter/index.js +1 -0
  17. package/components/DataGrid/formatters/ColumnTagsFormatter/types.d.ts +4 -0
  18. package/components/DataGrid/formatters/ColumnTagsFormatter/useColumnTags.d.ts +9 -0
  19. package/components/DataGrid/formatters/ColumnTagsFormatter/useColumnTags.js +60 -0
  20. package/components/DataGrid/formatters/index.d.ts +1 -0
  21. package/components/DataGrid/hooks/useModalCardDetail.d.ts +2 -2
  22. package/components/DataGrid/hooks/useModalCardDetail.js +49 -48
  23. package/components/DataGrid/slots/DataGridEnum.d.ts +2 -0
  24. package/components/DataGrid/slots/DataGridEnum.js +2 -0
  25. package/components/DataGrid/slots/DataGridSlot.d.ts +3 -1
  26. package/components/DataGrid/slots/DataGridSlot.js +45 -37
  27. package/components/DataGrid/subcomponents/Cards/helpers/calculateCardHeight.d.ts +18 -0
  28. package/components/DataGrid/subcomponents/Cards/helpers/calculateCardHeight.js +10 -0
  29. package/components/DataGrid/subcomponents/Cards/helpers/scrollToCardElement.d.ts +9 -0
  30. package/components/DataGrid/subcomponents/Cards/helpers/scrollToCardElement.js +25 -0
  31. package/components/DataGrid/subcomponents/Cards/hooks/useCardContent.d.ts +1 -2
  32. package/components/DataGrid/subcomponents/Cards/hooks/useCardContent.js +62 -73
  33. package/components/DataGrid/subcomponents/Cards/index.js +71 -16
  34. package/components/DataGrid/subcomponents/Cards/subcomponents/CardDetails/index.js +36 -18
  35. package/components/DataGrid/subcomponents/Cards/subcomponents/CardHeader/index.d.ts +1 -1
  36. package/components/DataGrid/subcomponents/Cards/subcomponents/CardHeader/index.js +13 -20
  37. package/components/DataGrid/subcomponents/Cards/subcomponents/CardRow/index.d.ts +6 -1
  38. package/components/DataGrid/subcomponents/Cards/subcomponents/CardRow/index.js +67 -36
  39. package/components/DataGrid/subcomponents/Cards/subcomponents/IntersectCard/index.js +9 -2
  40. package/components/DataGrid/subcomponents/Cards/subcomponents/LazyLoadCard/index.js +4 -2
  41. package/components/DataGrid/subcomponents/Cards/types.d.ts +50 -1
  42. package/components/DataGrid/subcomponents/CheckboxCellAdapter/index.js +5 -2
  43. package/components/DataGrid/subcomponents/ControlNavigate/ControlNavigate.js +1 -1
  44. package/components/DataGrid/subcomponents/HeaderActions/index.js +1 -1
  45. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/RowsCount/index.js +1 -1
  46. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/Settings/subcomponents/ColumnsConfig/index.js +1 -1
  47. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/Settings/subcomponents/ColumnsConfigCards/index.js +1 -1
  48. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/ViewMode/index.js +1 -1
  49. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/hooks/useModalSettings/index.js +1 -1
  50. package/components/DataGrid/subcomponents/HeaderActions/subcomponents/hooks/useModalSettingsCards/index.js +1 -1
  51. package/components/DataGrid/subcomponents/Table/index.js +60 -41
  52. package/components/DataGrid/subcomponents/Table/subcomponents/CheckboxFormatter.js +16 -18
  53. package/components/DataGrid/subcomponents/Table/subcomponents/DraggableHeaderRenderer.js +3 -3
  54. package/components/DataGrid/subcomponents/Table/subcomponents/HeaderRenderClick/HeaderRenderClick.js +1 -1
  55. package/components/DataGrid/subcomponents/editors/TextEditor/index.js +1 -1
  56. package/components/DataGrid/tests/helpers/types.d.ts +3 -0
  57. package/components/DataGrid/types.d.ts +17 -2
  58. package/components/ObjectLogs/slots/ObjectLogsSlots.js +3 -5
  59. package/components/Stepper/Stepper.styles.js +1 -0
  60. package/components/Stepper/subcomponents/StepperButtons/StepperCancelButton/index.js +1 -1
  61. package/components/formatters/IconsFormatter/IconsFormatter.d.ts +6 -0
  62. package/components/formatters/IconsFormatter/IconsFormatter.js +22 -0
  63. package/components/formatters/IconsFormatter/IconsFormatter.styles.d.ts +2 -0
  64. package/components/formatters/IconsFormatter/IconsFormatter.styles.js +29 -0
  65. package/components/formatters/IconsFormatter/constants.d.ts +1 -0
  66. package/components/formatters/IconsFormatter/constants.js +4 -0
  67. package/components/{DataGrid/formatters/ColumnIconFormatter → formatters/IconsFormatter}/helpers/renderIcon.d.ts +2 -2
  68. package/components/formatters/IconsFormatter/helpers/renderIcon.js +24 -0
  69. package/components/formatters/IconsFormatter/helpers/renderMultipleIcons.d.ts +7 -0
  70. package/components/formatters/IconsFormatter/helpers/renderMultipleIcons.js +16 -0
  71. package/components/formatters/IconsFormatter/index.d.ts +3 -0
  72. package/components/formatters/IconsFormatter/index.js +1 -0
  73. package/components/formatters/IconsFormatter/slots/IconsFormatterEnum.d.ts +5 -0
  74. package/components/formatters/IconsFormatter/slots/IconsFormatterEnum.js +9 -0
  75. package/components/formatters/IconsFormatter/slots/IconsFormatterSlots.d.ts +9 -0
  76. package/components/formatters/IconsFormatter/slots/IconsFormatterSlots.js +22 -0
  77. package/components/formatters/IconsFormatter/types.d.ts +57 -0
  78. package/components/formatters/IconsFormatter/types.js +1 -0
  79. package/components/formatters/TagsFormatter/TagsFormatter.d.ts +5 -0
  80. package/components/formatters/TagsFormatter/TagsFormatter.js +28 -0
  81. package/components/formatters/TagsFormatter/TagsFormatter.styles.d.ts +2 -0
  82. package/components/formatters/TagsFormatter/TagsFormatter.styles.js +41 -0
  83. package/components/formatters/TagsFormatter/constants.d.ts +5 -0
  84. package/components/formatters/TagsFormatter/constants.js +11 -0
  85. package/components/formatters/TagsFormatter/helpers/renderMultipleTag.d.ts +8 -0
  86. package/components/formatters/TagsFormatter/helpers/renderMultipleTag.js +19 -0
  87. package/components/formatters/TagsFormatter/helpers/renderTag.d.ts +7 -0
  88. package/components/formatters/TagsFormatter/helpers/renderTag.js +9 -0
  89. package/components/formatters/TagsFormatter/helpers/validateHexColor.d.ts +8 -0
  90. package/components/formatters/TagsFormatter/helpers/validateHexColor.js +9 -0
  91. package/components/formatters/TagsFormatter/index.d.ts +2 -0
  92. package/components/formatters/TagsFormatter/index.js +1 -0
  93. package/components/formatters/TagsFormatter/slots/TagsFormatterEnum.d.ts +5 -0
  94. package/components/formatters/TagsFormatter/slots/TagsFormatterEnum.js +9 -0
  95. package/components/formatters/TagsFormatter/slots/TagsFormatterSlots.d.ts +6 -0
  96. package/components/formatters/TagsFormatter/slots/TagsFormatterSlots.js +16 -0
  97. package/components/formatters/TagsFormatter/subcomponents/Tag/Tag.d.ts +5 -0
  98. package/components/formatters/TagsFormatter/subcomponents/Tag/Tag.js +35 -0
  99. package/components/formatters/TagsFormatter/subcomponents/Tag/index.d.ts +1 -0
  100. package/components/formatters/TagsFormatter/subcomponents/Tag/index.js +1 -0
  101. package/components/formatters/TagsFormatter/types.d.ts +47 -0
  102. package/components/formatters/index.d.ts +6 -5
  103. package/components/hook-form/RHFormContext/styles.js +2 -1
  104. package/contexts/ModalContext/index.js +5 -5
  105. package/index.js +62 -56
  106. package/package.json +1 -1
  107. package/components/DataGrid/formatters/ColumnIconFormatter/constants.js +0 -4
  108. package/components/DataGrid/formatters/ColumnIconFormatter/helpers/renderIcon.js +0 -58
  109. package/components/DataGrid/formatters/ColumnIconFormatter/helpers/renderMultipleIcons.d.ts +0 -7
  110. package/components/DataGrid/formatters/ColumnIconFormatter/helpers/renderMultipleIcons.js +0 -19
@@ -1,5 +1,5 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { O as InputTextEditorStyled } from "../../../slots/DataGridSlot.js";
2
+ import { P as InputTextEditorStyled } from "../../../slots/DataGridSlot.js";
3
3
  function autoFocusAndSelect(input) {
4
4
  input?.focus();
5
5
  input?.select();
@@ -2,6 +2,7 @@ import { RenderHeaderCellProps } from 'react-data-grid';
2
2
  import { ChipStatusFormatterProps } from '../../../formatters/ChipStatusFormatter/types';
3
3
  import { DeepKeyOf } from '../../../../utils/types';
4
4
  import { ColumnAlign } from '../../types';
5
+ import { TagConfig } from '../../../formatters/TagsFormatter/types';
5
6
  export interface SeedProps {
6
7
  quantity: number;
7
8
  withBoolean?: boolean;
@@ -17,6 +18,7 @@ export interface SeedProps {
17
18
  withSetCheck?: boolean;
18
19
  withCesar?: boolean;
19
20
  withChipStatus?: boolean;
21
+ withTags?: boolean;
20
22
  withActions?: boolean;
21
23
  withActionsUser?: boolean;
22
24
  withBooleanStatus?: boolean;
@@ -52,6 +54,7 @@ export interface RowType {
52
54
  symbol: string;
53
55
  unit: string;
54
56
  };
57
+ tags?: TagConfig[];
55
58
  setCheck?: boolean;
56
59
  cesar?: string;
57
60
  status?: {
@@ -161,6 +161,11 @@ export interface GridProps<TRow, TSummaryRow, TKey extends RowKey = RowKey> exte
161
161
  * Incluye habilitación, configuración de columnas y renderizado personalizado
162
162
  */
163
163
  cardsViewConfig?: CardsViewConfig<TRow>;
164
+ /**
165
+ * Key de la fila a la que se debe hacer scroll y highlight automáticamente.
166
+ * Útil cuando se agrega un nuevo elemento y se quiere enfocar en él.
167
+ */
168
+ focusOnRowKey?: TKey;
164
169
  }
165
170
  export declare const DATAGRID_TEST_ID = "m4ldatagrid";
166
171
  export declare const PREFIX_TEST_ATTRIBUTE = "data-testid";
@@ -185,7 +190,6 @@ export interface ActionsProps {
185
190
  * Props para el hook useModalDetail
186
191
  */
187
192
  export interface UseModalDetailProps<TRow> {
188
- row: TRow;
189
193
  columns: readonly Column<TRow, any>[];
190
194
  viewMode: ViewMode;
191
195
  onRowsChange?: Maybe<(rows: TRow[], data: RowsChangeData<TRow, any>) => void>;
@@ -249,7 +253,18 @@ export interface CardContentProps<TRow> {
249
253
  originalColumns: readonly Column<TRow, any>[];
250
254
  onRowsChange?: Maybe<(rows: TRow[], data: RowsChangeData<TRow, any>) => void>;
251
255
  }
252
- export type DataGridOwnerState<TRow, TSummaryRow, TKey extends RowKey = RowKey> = Pick<DataGridProps<TRow, TSummaryRow, TKey>, 'visibleCustomHeader'> & {
256
+ /**
257
+ * Configuración de densidad para el DataGrid.
258
+ * Define las alturas de filas, headers y la variante inicial.
259
+ */
260
+ export interface DataGridDensityConfig {
261
+ rowHeights: RowHeights;
262
+ rowHeaderHeights: RowHeights;
263
+ initialRowHeightVariant: RowHeightVariants;
264
+ }
265
+ export type DataGridOwnerState<TRow, TSummaryRow, TKey extends RowKey = RowKey> = Pick<DataGridProps<TRow, TSummaryRow, TKey>, 'visibleCustomHeader' | 'size'> & {
266
+ currentRowHeightVariant?: RowHeightVariants;
267
+ currentRowHeight?: number;
253
268
  viewMode?: ViewMode;
254
269
  isActive?: boolean;
255
270
  hasActions?: boolean;
@@ -41,11 +41,11 @@ styled(IconButton, {
41
41
  name: OBJECT_LOGS_KEY_COMPONENT,
42
42
  slot: ObjectLogsSlots.iconButtonStyled
43
43
  })(objectLogsStyles?.iconButtonStyled);
44
- const IconStyled = styled(Icon, {
44
+ styled(Icon, {
45
45
  name: OBJECT_LOGS_KEY_COMPONENT,
46
46
  slot: ObjectLogsSlots.iconStyled
47
47
  })(objectLogsStyles?.iconStyled);
48
- const IconClickeableStyled = styled(Icon, {
48
+ styled(Icon, {
49
49
  name: OBJECT_LOGS_KEY_COMPONENT,
50
50
  slot: ObjectLogsSlots.iconClickeableStyled
51
51
  })(objectLogsStyles?.iconClickeableStyled);
@@ -57,8 +57,6 @@ export {
57
57
  ContainerWrapperStyled as C,
58
58
  DetailDialogComponent as D,
59
59
  GridWrapperStyled as G,
60
- IconClickeableStyled as I,
61
60
  StackStyled as S,
62
- WindowBaseStyled as W,
63
- IconStyled as a
61
+ WindowBaseStyled as W
64
62
  };
@@ -153,6 +153,7 @@ const stepperStyles = {
153
153
  alignItems: "center",
154
154
  justifyContent: "center",
155
155
  flexShrink: 0,
156
+ zIndex: 1,
156
157
  order: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? 0 : 1,
157
158
  background: !isValidStep && ownerState?.hasBeenValidated ? theme.vars.palette.error.enabled : isCompleted && isValidStep ? ownerState?.indicatorType === "dot" || theme.generalSettings.isMobile ? theme.vars.palette.background.default : theme.vars.palette.primary.toneOpacity : isCurrent ? ownerState?.indicatorType === "dot" || theme.generalSettings.isMobile ? theme.vars.palette.background.default : theme.vars.palette.primary.enabled : ownerState?.indicatorType === "dot" || theme.generalSettings.isMobile ? theme.vars.palette.background.default : theme.vars.palette.default.enabled,
158
159
  borderRadius: theme.vars.size.borderRadius.r2,
@@ -2,7 +2,7 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { A as ActionFormCancel } from "../../../../CommonActions/components/ActionFormCancel/ActionFormCancel.js";
3
3
  function StepperCancelButton(props) {
4
4
  const { ...rest } = props;
5
- return /* @__PURE__ */ jsx(ActionFormCancel, { ...rest });
5
+ return /* @__PURE__ */ jsx(ActionFormCancel, { "data-testid": "stepper-cancel-button", ...rest });
6
6
  }
7
7
  export {
8
8
  StepperCancelButton as S
@@ -0,0 +1,6 @@
1
+ import { IconsFormatterProps } from './types';
2
+ /**
3
+ * IconsFormatter
4
+ * Componente formatter que renderiza uno o varios iconos
5
+ */
6
+ export declare const IconsFormatter: (props: IconsFormatterProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,22 @@
1
+ import { useMemo } from "react";
2
+ import { r as renderIcon } from "./helpers/renderIcon.js";
3
+ import { r as renderMultipleIcons } from "./helpers/renderMultipleIcons.js";
4
+ const IconsFormatter = (props) => {
5
+ const { icons } = props;
6
+ const iconsArray = useMemo(() => {
7
+ if (!icons) {
8
+ return null;
9
+ }
10
+ return Array.isArray(icons) ? icons : [icons];
11
+ }, [icons]);
12
+ if (!iconsArray || iconsArray.length === 0) {
13
+ return null;
14
+ }
15
+ if (iconsArray.length === 1) {
16
+ return renderIcon(iconsArray[0]);
17
+ }
18
+ return renderMultipleIcons(iconsArray);
19
+ };
20
+ export {
21
+ IconsFormatter as I
22
+ };
@@ -0,0 +1,2 @@
1
+ import { IconsFormatterStyles } from './types';
2
+ export declare const iconsFormatterStyles: IconsFormatterStyles;
@@ -0,0 +1,29 @@
1
+ const iconsFormatterStyles = {
2
+ /**
3
+ * Estilo del contenedor de array de iconos
4
+ */
5
+ iconsContainer: ({ theme }) => ({
6
+ display: "flex",
7
+ alignItems: "center",
8
+ flexWrap: "wrap",
9
+ gap: theme.vars.size.baseSpacings.sp1,
10
+ maxHeight: "100%",
11
+ overflow: "hidden"
12
+ }),
13
+ /**
14
+ * Estilo del icono
15
+ */
16
+ icon: () => ({
17
+ flexShrink: 0
18
+ }),
19
+ /**
20
+ * Estilo del icono clickeable
21
+ */
22
+ iconClickeable: () => ({
23
+ cursor: "pointer",
24
+ flexShrink: 0
25
+ })
26
+ };
27
+ export {
28
+ iconsFormatterStyles as i
29
+ };
@@ -0,0 +1 @@
1
+ export declare const ICONS_FORMATTER_KEY_COMPONENT = "M4LIconsFormatter";
@@ -0,0 +1,4 @@
1
+ const ICONS_FORMATTER_KEY_COMPONENT = "M4LIconsFormatter";
2
+ export {
3
+ ICONS_FORMATTER_KEY_COMPONENT as I
4
+ };
@@ -1,8 +1,8 @@
1
- import { ColumnIconResponse } from '../types';
1
+ import { IconConfig } from '../types';
2
2
  /**
3
3
  * Helper que renderiza un único icono
4
4
  * @param iconConfig - Configuración del icono
5
5
  * @param key - Clave opcional para listas
6
6
  * @returns Componente de icono renderizado
7
7
  */
8
- export declare function renderIcon(iconConfig: ColumnIconResponse, key?: number): import("react/jsx-runtime").JSX.Element;
8
+ export declare function renderIcon(iconConfig: IconConfig, key?: number): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,24 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { I as IconClickeableStyled, a as IconStyled } from "../slots/IconsFormatterSlots.js";
3
+ function renderIcon(iconConfig, key) {
4
+ const { iconUrl, onClick, tooltip, dataTestId, color, visible, size } = iconConfig;
5
+ if (visible === false) {
6
+ return null;
7
+ }
8
+ const IconComponent = onClick ? IconClickeableStyled : IconStyled;
9
+ return /* @__PURE__ */ jsx(
10
+ IconComponent,
11
+ {
12
+ src: iconUrl,
13
+ onClick,
14
+ tooltipContent: tooltip,
15
+ instaceDataTestId: dataTestId,
16
+ color,
17
+ size
18
+ },
19
+ key
20
+ );
21
+ }
22
+ export {
23
+ renderIcon as r
24
+ };
@@ -0,0 +1,7 @@
1
+ import { IconConfig } from '../types';
2
+ /**
3
+ * Helper que renderiza múltiples iconos
4
+ * @param icons - Array de configuraciones de iconos
5
+ * @returns Componente contenedor con múltiples iconos
6
+ */
7
+ export declare function renderMultipleIcons(icons: IconConfig[]): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,16 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { b as IconsContainerStyled } from "../slots/IconsFormatterSlots.js";
3
+ import { r as renderIcon } from "./renderIcon.js";
4
+ function renderMultipleIcons(icons) {
5
+ const visibleIcons = icons.filter((icon) => icon.visible !== false);
6
+ if (visibleIcons.length === 0) {
7
+ return null;
8
+ }
9
+ if (visibleIcons.length === 1) {
10
+ return renderIcon(visibleIcons[0]);
11
+ }
12
+ return /* @__PURE__ */ jsx(IconsContainerStyled, { children: visibleIcons.map((icon, index) => renderIcon(icon, index)) });
13
+ }
14
+ export {
15
+ renderMultipleIcons as r
16
+ };
@@ -0,0 +1,3 @@
1
+ export { IconsFormatter } from './IconsFormatter';
2
+ export * from './types';
3
+ export * from './constants';
@@ -0,0 +1,5 @@
1
+ export declare enum IconsFormatterSlots {
2
+ iconsContainer = "iconsContainer",
3
+ icon = "icon",
4
+ iconClickeable = "iconClickeable"
5
+ }
@@ -0,0 +1,9 @@
1
+ var IconsFormatterSlots = /* @__PURE__ */ ((IconsFormatterSlots2) => {
2
+ IconsFormatterSlots2["iconsContainer"] = "iconsContainer";
3
+ IconsFormatterSlots2["icon"] = "icon";
4
+ IconsFormatterSlots2["iconClickeable"] = "iconClickeable";
5
+ return IconsFormatterSlots2;
6
+ })(IconsFormatterSlots || {});
7
+ export {
8
+ IconsFormatterSlots as I
9
+ };
@@ -0,0 +1,9 @@
1
+ export declare const IconsContainerStyled: import('@emotion/styled').StyledComponent<import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & Record<string, unknown> & {
2
+ ownerState?: any;
3
+ }, Pick<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('react').ClassAttributes<HTMLDivElement> | keyof import('react').HTMLAttributes<HTMLDivElement>>, {}>;
4
+ export declare const IconStyled: import('@emotion/styled').StyledComponent<Pick<import('../../../Icon').IconProps, keyof import('../../../Icon').IconProps> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & Record<string, unknown> & {
5
+ ownerState?: any;
6
+ }, {}, {}>;
7
+ export declare const IconClickeableStyled: import('@emotion/styled').StyledComponent<Pick<import('../../../Icon').IconProps, keyof import('../../../Icon').IconProps> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & Record<string, unknown> & {
8
+ ownerState?: any;
9
+ }, {}, {}>;
@@ -0,0 +1,22 @@
1
+ import { styled } from "@mui/material";
2
+ import { I as ICONS_FORMATTER_KEY_COMPONENT } from "../constants.js";
3
+ import { I as IconsFormatterSlots } from "./IconsFormatterEnum.js";
4
+ import { i as iconsFormatterStyles } from "../IconsFormatter.styles.js";
5
+ import { I as Icon } from "../../../Icon/Icon.js";
6
+ const IconsContainerStyled = styled("div", {
7
+ name: ICONS_FORMATTER_KEY_COMPONENT,
8
+ slot: IconsFormatterSlots.iconsContainer
9
+ })(iconsFormatterStyles.iconsContainer);
10
+ const IconStyled = styled(Icon, {
11
+ name: ICONS_FORMATTER_KEY_COMPONENT,
12
+ slot: IconsFormatterSlots.icon
13
+ })(iconsFormatterStyles.icon);
14
+ const IconClickeableStyled = styled(Icon, {
15
+ name: ICONS_FORMATTER_KEY_COMPONENT,
16
+ slot: IconsFormatterSlots.iconClickeable
17
+ })(iconsFormatterStyles.iconClickeable);
18
+ export {
19
+ IconClickeableStyled as I,
20
+ IconStyled as a,
21
+ IconsContainerStyled as b
22
+ };
@@ -0,0 +1,57 @@
1
+ import { Theme } from '@mui/material';
2
+ import { DeepKeyOf } from '../../../utils/types';
3
+ import { Sizes } from '@m4l/styles';
4
+ import { IconsFormatterSlots } from './slots/IconsFormatterEnum';
5
+ import { M4LOverridesStyleRules } from '../../../@types/augmentations';
6
+ import { ICONS_FORMATTER_KEY_COMPONENT } from './constants';
7
+ export type IconColorDeep = DeepKeyOf<Theme['vars']['palette']> | string;
8
+ /**
9
+ * Configuración para un solo icono
10
+ */
11
+ export interface IconConfig {
12
+ /**
13
+ * URL o ruta de la imagen del icono
14
+ */
15
+ iconUrl: string;
16
+ /**
17
+ * Tooltip que se mostrará al pasar el cursor sobre el icono
18
+ */
19
+ tooltip?: string;
20
+ /**
21
+ * Función que se ejecuta al hacer clic en el icono
22
+ */
23
+ onClick?: () => void;
24
+ /**
25
+ * Data test id para testing
26
+ */
27
+ dataTestId?: string;
28
+ /**
29
+ * Controla la visibilidad del icono
30
+ */
31
+ visible?: boolean;
32
+ /**
33
+ * Color del icono
34
+ */
35
+ color?: IconColorDeep;
36
+ /**
37
+ * Tamaño del icono
38
+ */
39
+ size?: Extract<Sizes, 'small' | 'medium'>;
40
+ }
41
+ /**
42
+ * Props para el IconsFormatter
43
+ */
44
+ export interface IconsFormatterProps {
45
+ /**
46
+ * Array de configuraciones de iconos (puede ser uno o varios)
47
+ */
48
+ icons: IconConfig | IconConfig[];
49
+ }
50
+ /**
51
+ * Tipos de slots disponibles para el TagFormatter
52
+ */
53
+ export type IconsFormatterSlotsType = IconsFormatterSlots;
54
+ /**
55
+ * Estilos aplicables al TagFormatter
56
+ */
57
+ export type IconsFormatterStyles = M4LOverridesStyleRules<IconsFormatterSlotsType, typeof ICONS_FORMATTER_KEY_COMPONENT, Theme>;
@@ -0,0 +1,5 @@
1
+ import { TagsFormatterProps } from './types';
2
+ /**
3
+ * Formatter para mostrar uno o múltiples tags
4
+ */
5
+ export declare const TagsFormatter: (props: TagsFormatterProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,28 @@
1
+ import { useMemo } from "react";
2
+ import { r as renderTag } from "./helpers/renderTag.js";
3
+ import { r as renderMultipleTags } from "./helpers/renderMultipleTag.js";
4
+ import { u as useComponentSize } from "../../../hooks/useComponentSize/useComponentSize.js";
5
+ const TagsFormatter = (props) => {
6
+ const { tags, className, size } = props;
7
+ const { currentSize } = useComponentSize(size);
8
+ const tagsArray = useMemo(() => {
9
+ if (!tags) {
10
+ return null;
11
+ }
12
+ return Array.isArray(tags) ? tags : [tags];
13
+ }, [tags]);
14
+ if (!tagsArray || tagsArray.length === 0) {
15
+ return null;
16
+ }
17
+ if (tagsArray.length === 1) {
18
+ return renderTag({
19
+ tag: tagsArray[0],
20
+ size: currentSize,
21
+ className
22
+ });
23
+ }
24
+ return renderMultipleTags(tagsArray, currentSize, className);
25
+ };
26
+ export {
27
+ TagsFormatter as T
28
+ };
@@ -0,0 +1,2 @@
1
+ import { TagsFormatterStyles } from './types';
2
+ export declare const tagsFormatterStyles: TagsFormatterStyles;
@@ -0,0 +1,41 @@
1
+ import { g as getSizeStyles } from "../../../utils/getSizeStyles/getSizeStyles.js";
2
+ import { getContrastTextColor } from "@m4l/graphics";
3
+ const tagsFormatterStyles = {
4
+ /**
5
+ * Contenedor de multiple tags
6
+ */
7
+ tagsContainer: ({ theme }) => ({
8
+ display: "flex",
9
+ flexWrap: "wrap",
10
+ gap: theme.vars.size.baseSpacings.sp1,
11
+ maxHeight: "100%",
12
+ overflow: "hidden"
13
+ }),
14
+ /**
15
+ * Estilos del tag individual
16
+ */
17
+ tag: ({ theme, ownerState }) => {
18
+ const backgroundColor = ownerState?.backgroundColor || "#000000";
19
+ const textColor = getContrastTextColor(backgroundColor);
20
+ return {
21
+ display: "inline-block",
22
+ paddingLeft: theme.vars.size.baseSpacings.sp2,
23
+ paddingRight: theme.vars.size.baseSpacings.sp2,
24
+ borderRadius: theme.vars.size.borderRadius.r1,
25
+ cursor: "default",
26
+ maxWidth: "200px",
27
+ whiteSpace: "nowrap",
28
+ overflowY: "hidden",
29
+ overflowX: "auto",
30
+ verticalAlign: "middle",
31
+ ...getSizeStyles(theme, ownerState?.size || "medium", "base"),
32
+ ...theme.typography.body,
33
+ lineHeight: getSizeStyles(theme, ownerState?.size || "medium", "base").height,
34
+ backgroundColor,
35
+ color: textColor
36
+ };
37
+ }
38
+ };
39
+ export {
40
+ tagsFormatterStyles as t
41
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Clave del componente TagsFormatter
3
+ */
4
+ export declare const TAGS_FORMATTER_KEY_COMPONENT = "M4LTagsFormatter";
5
+ export declare const TAGS_FORMATTER_CLASSES: Record<string, string>;
@@ -0,0 +1,11 @@
1
+ import { g as getComponentClasses } from "../../../utils/getComponentSlotRoot.js";
2
+ import { T as TagsFormatterSlots } from "./slots/TagsFormatterEnum.js";
3
+ const TAGS_FORMATTER_KEY_COMPONENT = "M4LTagsFormatter";
4
+ const TAGS_FORMATTER_CLASSES = getComponentClasses(
5
+ TAGS_FORMATTER_KEY_COMPONENT,
6
+ TagsFormatterSlots
7
+ );
8
+ export {
9
+ TAGS_FORMATTER_KEY_COMPONENT as T,
10
+ TAGS_FORMATTER_CLASSES as a
11
+ };
@@ -0,0 +1,8 @@
1
+ import { TagConfig } from '../types';
2
+ /**
3
+ * Helper que renderiza múltiples tags
4
+ * @param tags - Array de tags
5
+ * @param size - Tamaño de los chips
6
+ * @returns Array de componentes de tags renderizados
7
+ */
8
+ export declare const renderMultipleTags: (tags: TagConfig[], size: "small" | "medium", className?: string) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { T as TagsContainerStyled } from "../slots/TagsFormatterSlots.js";
3
+ import { r as renderTag } from "./renderTag.js";
4
+ const renderMultipleTags = (tags, size, className) => {
5
+ return /* @__PURE__ */ jsx(TagsContainerStyled, { children: tags.map((tag, index) => {
6
+ const tagWithKey = {
7
+ ...tag,
8
+ key: tag.key || `${tag.label}-${index}`
9
+ };
10
+ return renderTag({
11
+ tag: tagWithKey,
12
+ size,
13
+ className
14
+ });
15
+ }) });
16
+ };
17
+ export {
18
+ renderMultipleTags as r
19
+ };
@@ -0,0 +1,7 @@
1
+ import { RenderTagProps } from '../types';
2
+ /**
3
+ * Helper que renderiza un tag
4
+ * @param props - Props del tag
5
+ * @returns Componente de tag renderizado
6
+ */
7
+ export declare const renderTag: (props: RenderTagProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { T as Tag } from "../subcomponents/Tag/Tag.js";
3
+ const renderTag = (props) => {
4
+ const { tag, size, className } = props;
5
+ return /* @__PURE__ */ jsx(Tag, { ...tag, size, className });
6
+ };
7
+ export {
8
+ renderTag as r
9
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Valida que un color sea hexadecimal válido
3
+ * - Debe existir
4
+ * - Debe empezar con #
5
+ * @param backgroundColor - Color a validar
6
+ * @returns true si el color es válido, false en caso contrario
7
+ */
8
+ export declare const validateHexColor: (backgroundColor: string) => boolean;
@@ -0,0 +1,9 @@
1
+ const validateHexColor = (backgroundColor) => {
2
+ if (!backgroundColor) {
3
+ return false;
4
+ }
5
+ return backgroundColor.startsWith("#");
6
+ };
7
+ export {
8
+ validateHexColor as v
9
+ };
@@ -0,0 +1,2 @@
1
+ export { TagsFormatter } from './TagsFormatter';
2
+ export type { TagsFormatterProps } from './types';
@@ -0,0 +1,5 @@
1
+ export declare enum TagsFormatterSlots {
2
+ root = "root",
3
+ tagsContainer = "tagsContainer",
4
+ tag = "tag"
5
+ }
@@ -0,0 +1,9 @@
1
+ var TagsFormatterSlots = /* @__PURE__ */ ((TagsFormatterSlots2) => {
2
+ TagsFormatterSlots2["root"] = "root";
3
+ TagsFormatterSlots2["tagsContainer"] = "tagsContainer";
4
+ TagsFormatterSlots2["tag"] = "tag";
5
+ return TagsFormatterSlots2;
6
+ })(TagsFormatterSlots || {});
7
+ export {
8
+ TagsFormatterSlots as T
9
+ };
@@ -0,0 +1,6 @@
1
+ export declare const TagsContainerStyled: import('@emotion/styled').StyledComponent<import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & Record<string, unknown> & {
2
+ ownerState?: any;
3
+ }, Pick<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('react').ClassAttributes<HTMLDivElement> | keyof import('react').HTMLAttributes<HTMLDivElement>>, {}>;
4
+ export declare const TagStyled: import('@emotion/styled').StyledComponent<import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & Record<string, unknown> & {
5
+ ownerState?: any;
6
+ }, Pick<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('react').ClassAttributes<HTMLDivElement> | keyof import('react').HTMLAttributes<HTMLDivElement>>, {}>;
@@ -0,0 +1,16 @@
1
+ import { styled } from "@mui/material";
2
+ import { T as TAGS_FORMATTER_KEY_COMPONENT } from "../constants.js";
3
+ import { T as TagsFormatterSlots } from "./TagsFormatterEnum.js";
4
+ import { t as tagsFormatterStyles } from "../TagsFormatter.styles.js";
5
+ const TagsContainerStyled = styled("div", {
6
+ name: TAGS_FORMATTER_KEY_COMPONENT,
7
+ slot: TagsFormatterSlots.tagsContainer
8
+ })(tagsFormatterStyles.tagsContainer);
9
+ const TagStyled = styled("div", {
10
+ name: TAGS_FORMATTER_KEY_COMPONENT,
11
+ slot: TagsFormatterSlots.tag
12
+ })(tagsFormatterStyles.tag);
13
+ export {
14
+ TagsContainerStyled as T,
15
+ TagStyled as a
16
+ };
@@ -0,0 +1,5 @@
1
+ import { TagConfig } from '../../types';
2
+ /**
3
+ * Componente Tag que muestra un tag con color hexadecimal
4
+ */
5
+ export declare const Tag: (props: TagConfig) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,35 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useMemo } from "react";
3
+ import { v as validateHexColor } from "../../helpers/validateHexColor.js";
4
+ import { a as TagStyled } from "../../slots/TagsFormatterSlots.js";
5
+ import clsx from "clsx";
6
+ import { a as TAGS_FORMATTER_CLASSES } from "../../constants.js";
7
+ import { u as useComponentSize } from "../../../../../hooks/useComponentSize/useComponentSize.js";
8
+ const Tag = (props) => {
9
+ const { label, backgroundColor, size, className } = props;
10
+ const { currentSize } = useComponentSize(size);
11
+ const ownerState = useMemo(
12
+ () => ({
13
+ size: currentSize,
14
+ backgroundColor
15
+ }),
16
+ [currentSize, backgroundColor]
17
+ );
18
+ if (!validateHexColor(backgroundColor)) {
19
+ console.error(
20
+ `backgroundColor no válido: "${backgroundColor}". backgroundColor debe ser un color hexadecimal.`
21
+ );
22
+ return null;
23
+ }
24
+ return /* @__PURE__ */ jsx(
25
+ TagStyled,
26
+ {
27
+ ownerState,
28
+ className: clsx(className, TAGS_FORMATTER_CLASSES.root),
29
+ children: label
30
+ }
31
+ );
32
+ };
33
+ export {
34
+ Tag as T
35
+ };
@@ -0,0 +1 @@
1
+ export { Tag } from './Tag';