@m4l/components 9.3.13-JT02092025.beta.4 → 9.3.13-JT03092025.beta.2

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.
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useRef, useMemo, Children, isValidElement, cloneElement } from "react";
2
+ import { useMemo, Children, isValidElement } from "react";
3
3
  import clsx from "clsx";
4
4
  import { useFlagsPresent, CommonFlags } from "@m4l/core";
5
5
  import { S as StepperRootStyled, C as ContentSectionStyled } from "./slots/StepperSlot.js";
@@ -10,21 +10,13 @@ import { C as ContentArea } from "./subcomponents/ContentArea/index.js";
10
10
  import { S as StepperProvider } from "./store/StepperContext/index.js";
11
11
  import { S as StepperFooter } from "./subcomponents/StepperFooter/index.js";
12
12
  import { S as StepperContent } from "./subcomponents/StepperContent/index.js";
13
- import { u as useStickyStepperFooter } from "./hooks/useStickyStepperFooter/index.js";
14
13
  import { u as useComponentSize } from "../../hooks/useComponentSize/useComponentSize.js";
15
14
  function Stepper(props) {
16
15
  const { orientation, size, children, className } = props;
17
16
  const { currentSize } = useComponentSize(size);
18
- const containerRef = useRef(null);
19
- const contentSectionRef = useRef(null);
20
- const stepperFooterSticky = useStickyStepperFooter(
21
- containerRef,
22
- contentSectionRef
23
- );
24
17
  const ownerState = {
25
18
  size: currentSize,
26
- orientation,
27
- stepperFooterSticky
19
+ orientation
28
20
  };
29
21
  const classRoot = getComponentSlotRoot(STEPPER_PREFIX_NAME);
30
22
  const { stepperFooter, stepperContent } = useMemo(() => {
@@ -70,7 +62,7 @@ function Stepper(props) {
70
62
  /* @__PURE__ */ jsx(StepArea, {}),
71
63
  /* @__PURE__ */ jsx(ContentArea, { children: stepperContent })
72
64
  ] }),
73
- stepperFooter && cloneElement(stepperFooter, { ownerState })
65
+ stepperFooter
74
66
  ] }) });
75
67
  }
76
68
  export {
@@ -4,10 +4,10 @@ const stepperStyles = {
4
4
  *
5
5
  * Estilos para el contenedor principal del Stepper.
6
6
  */
7
- stepperRoot: ({ theme, ownerState }) => ({
7
+ stepperRoot: ({ theme }) => ({
8
8
  display: "flex",
9
9
  flexDirection: "column",
10
- justifyContent: ownerState?.stepperFooterSticky ? "flex-start" : "space-between",
10
+ justifyContent: "flex-start",
11
11
  background: theme.vars.palette.background.default,
12
12
  width: "100%",
13
13
  height: "100%",
@@ -24,6 +24,9 @@ const stepperStyles = {
24
24
  flexDirection: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? "column" : "row",
25
25
  gap: theme.vars.size.baseSpacings.sp8
26
26
  }),
27
+ stepContent: ({ ownerState }) => ({
28
+ display: ownerState?.isStepVisible ? "block" : "none"
29
+ }),
27
30
  /**
28
31
  * Estilos para la sección que contiene los botones de acción del Stepper.
29
32
  */
@@ -69,6 +72,7 @@ const stepperStyles = {
69
72
  return {
70
73
  cursor: "pointer",
71
74
  display: "flex",
75
+ visibility: ownerState?.isStepVisible ? "visible" : "hidden",
72
76
  flexDirection: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? "column" : "row",
73
77
  alignItems: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? "center" : "start",
74
78
  justifyContent: ownerState?.visibleTitle ? "space-between" : "center",
@@ -164,12 +168,10 @@ const stepperStyles = {
164
168
  borderLeft: `1px ${isCompleted ? "solid" : "dashed"} ${isCompleted ? theme.vars.palette.primary.enabled : theme.vars.palette.border.default}`
165
169
  }
166
170
  },
167
- width: "20px",
168
- height: "20px"
169
- // ...getSizeStyles(theme, ownerState?.size || 'medium', 'case', (size) => ({
170
- // width: size,
171
- // height: size,
172
- // })),
171
+ ...getSizeStyles(theme, ownerState?.size || "medium", "case", (size) => ({
172
+ width: size,
173
+ height: size
174
+ }))
173
175
  };
174
176
  },
175
177
  /**
@@ -256,18 +258,16 @@ const stepperStyles = {
256
258
  /**
257
259
  * Estilos para la sección de botones de acción del Stepper.
258
260
  */
259
- stepperFooterSection: ({ theme, ownerState }) => ({
261
+ stepperFooterSection: ({ theme }) => ({
260
262
  display: "flex",
261
263
  alignItems: "center",
262
264
  justifyContent: "space-between",
263
265
  paddingTop: theme.vars.size.baseSpacings.sp4,
264
- ...ownerState?.stepperFooterSticky && {
265
- position: "sticky",
266
- bottom: 0,
267
- backgroundColor: theme.vars.palette.background.default,
268
- marginTop: "auto",
269
- zIndex: 10
270
- }
266
+ position: "sticky",
267
+ bottom: 0,
268
+ backgroundColor: theme.vars.palette.background.default,
269
+ marginTop: "auto",
270
+ zIndex: 10
271
271
  }),
272
272
  /**
273
273
  * Estilos para las acciones del lado izquierdo del StepperFooter.
@@ -11,6 +11,7 @@ export declare enum ContentSlots {
11
11
  }
12
12
  export declare enum ContentAreaSlots {
13
13
  contentArea = "contentArea",
14
+ stepContent = "stepContent",
14
15
  contentAreaHeader = "contentAreaHeader",
15
16
  contentAreaBody = "contentAreaBody",
16
17
  wrapperIcon = "wrapperIcon",
@@ -13,6 +13,7 @@ var ContentSlots = /* @__PURE__ */ ((ContentSlots2) => {
13
13
  })(ContentSlots || {});
14
14
  var ContentAreaSlots = /* @__PURE__ */ ((ContentAreaSlots2) => {
15
15
  ContentAreaSlots2["contentArea"] = "contentArea";
16
+ ContentAreaSlots2["stepContent"] = "stepContent";
16
17
  ContentAreaSlots2["contentAreaHeader"] = "contentAreaHeader";
17
18
  ContentAreaSlots2["contentAreaBody"] = "contentAreaBody";
18
19
  ContentAreaSlots2["wrapperIcon"] = "wrapperIcon";
@@ -32,6 +33,6 @@ var StepperFooterSlots = /* @__PURE__ */ ((StepperFooterSlots2) => {
32
33
  export {
33
34
  ContentSlots as C,
34
35
  StepperSlots as S,
35
- StepperFooterSlots as a,
36
- ContentAreaSlots as b
36
+ ContentAreaSlots as a,
37
+ StepperFooterSlots as b
37
38
  };
@@ -13,6 +13,9 @@ export declare const StepAreaStyled: import('@emotion/styled').StyledComponent<i
13
13
  export declare const ContentAreaStyled: import('@emotion/styled').StyledComponent<import('@mui/system').MUIStyledCommonProps<import('@mui/material/styles').Theme> & Record<string, unknown> & {
14
14
  ownerState?: (Partial<import('../types').StepperOwnerState> & Record<string, unknown>) | undefined;
15
15
  }, Pick<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('react').ClassAttributes<HTMLDivElement> | keyof import('react').HTMLAttributes<HTMLDivElement>>, {}>;
16
+ export declare const StepContentStyled: import('@emotion/styled').StyledComponent<import('@mui/system').MUIStyledCommonProps<import('@mui/material/styles').Theme> & Record<string, unknown> & {
17
+ ownerState?: (Partial<import('../types').StepperOwnerState> & Record<string, unknown>) | undefined;
18
+ }, Pick<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('react').ClassAttributes<HTMLDivElement> | keyof import('react').HTMLAttributes<HTMLDivElement>>, {}>;
16
19
  export declare const StepStyled: import('@emotion/styled').StyledComponent<import('@mui/system').MUIStyledCommonProps<import('@mui/material/styles').Theme> & Record<string, unknown> & {
17
20
  ownerState?: (Partial<import('../types').StepperOwnerState> & Record<string, unknown>) | undefined;
18
21
  }, Pick<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('react').ClassAttributes<HTMLDivElement> | keyof import('react').HTMLAttributes<HTMLDivElement>>, {}>;
@@ -1,6 +1,6 @@
1
1
  import { styled } from "@mui/material/styles";
2
2
  import { S as STEPPER_PREFIX_NAME } from "../constants.js";
3
- import { S as StepperSlots, C as ContentSlots, a as StepperFooterSlots, b as ContentAreaSlots } from "./StepperEnum.js";
3
+ import { S as StepperSlots, C as ContentSlots, a as ContentAreaSlots, b as StepperFooterSlots } from "./StepperEnum.js";
4
4
  import { s as stepperStyles } from "../Stepper.styles.js";
5
5
  import { T as Typography } from "../../mui_extended/Typography/Typography.js";
6
6
  import { I as Icon } from "../../Icon/Icon.js";
@@ -20,6 +20,10 @@ const ContentAreaStyled = styled("div", {
20
20
  name: STEPPER_PREFIX_NAME,
21
21
  slot: ContentAreaSlots.contentArea
22
22
  })(stepperStyles.contentArea);
23
+ const StepContentStyled = styled("div", {
24
+ name: STEPPER_PREFIX_NAME,
25
+ slot: ContentAreaSlots.stepContent
26
+ })(stepperStyles.stepContent);
23
27
  const StepStyled = styled("div", {
24
28
  name: STEPPER_PREFIX_NAME,
25
29
  slot: ContentSlots.step
@@ -96,7 +100,8 @@ export {
96
100
  StepNameStyled as g,
97
101
  IndicatorStyled as h,
98
102
  TextNumberStyled as i,
99
- StepperFooterSectionStyled as j,
100
- StepperFooterLeftActionsStyled as k,
101
- StepperFooterRightActionsStyled as l
103
+ StepContentStyled as j,
104
+ StepperFooterSectionStyled as k,
105
+ StepperFooterLeftActionsStyled as l,
106
+ StepperFooterRightActionsStyled as m
102
107
  };
@@ -64,7 +64,7 @@ const StepperProvider = (props) => {
64
64
  if (stepperStoreRef.current && steps) {
65
65
  const store = stepperStoreRef.current;
66
66
  const currentState = store.getState();
67
- store.getState().actions.init(steps);
67
+ store.getState().actions.init(steps, true);
68
68
  if (visibilityData) {
69
69
  const hasVisibilityDataChanged = JSON.stringify(prevVisibilityDataRef.current) !== JSON.stringify(visibilityData);
70
70
  if (hasVisibilityDataChanged) {
@@ -29,10 +29,12 @@ const createStepperStore = (initProps, storeDevtoolsEnabled = false) => {
29
29
  /**
30
30
  * init es la acción que se ejecuta al inicializar el store
31
31
  */
32
- init: (steps) => {
32
+ init: (steps, preserveStepValidationStatus = false) => {
33
33
  set((state) => {
34
34
  state.steps = steps;
35
- state.stepValidationStatus = {};
35
+ if (!preserveStepValidationStatus) {
36
+ state.stepValidationStatus = {};
37
+ }
36
38
  });
37
39
  },
38
40
  /**
@@ -22,9 +22,11 @@ export interface StepperState extends Pick<StepperProps, 'storeId' | 'visibleTit
22
22
  export interface StepperStateWithActions extends StepperState {
23
23
  actions: {
24
24
  /**
25
- * inicializa el estado del componente con los steps que provienen desde afuera
25
+ * inicializa el estado del componente con los steps que provienen desde afuera,
26
+ * @param steps - Array de steps
27
+ * @param preserveStepValidationStatus - Indica si se debe preservar el estado de validación de los pasos, por defecto es false
26
28
  */
27
- init: (steps: Array<Step>) => void;
29
+ init: (steps: Array<Step>, preserveStepValidationStatus?: boolean) => void;
28
30
  /**
29
31
  * Establece el paso actual
30
32
  * @param currentStep - Índice del paso actual
@@ -33,10 +33,8 @@ function StepArea() {
33
33
  shallow
34
34
  );
35
35
  const validSteps = useMemo(() => {
36
- return steps.filter(
37
- (step) => evaluateVisibilityStepCondition(step, formValues || {}, visibilityData)
38
- );
39
- }, [steps, formValues, visibilityData]);
36
+ return steps;
37
+ }, [steps]);
40
38
  const ownerState = {
41
39
  visibleTitle,
42
40
  orientation,
@@ -104,12 +102,24 @@ function StepArea() {
104
102
  };
105
103
  return /* @__PURE__ */ jsx(StepAreaStyled, { ownerState, children: validSteps.map((step, validIndex) => {
106
104
  const originalIndex = steps.findIndex((s) => s.key === step.key);
105
+ const totalVisibleSteps = validSteps.filter(
106
+ (s) => evaluateVisibilityStepCondition(s, formValues || {}, visibilityData)
107
+ ).length;
107
108
  return /* @__PURE__ */ jsxs(
108
109
  StepStyled,
109
110
  {
110
111
  role: "button",
111
112
  onClick: () => handleStepClick(validIndex),
112
- ownerState: { ...ownerState, currentStep, step: validIndex },
113
+ ownerState: {
114
+ ...ownerState,
115
+ currentStep,
116
+ step: validIndex,
117
+ isStepVisible: evaluateVisibilityStepCondition(
118
+ step,
119
+ formValues || {},
120
+ visibilityData
121
+ )
122
+ },
113
123
  children: [
114
124
  visibleTitle && /* @__PURE__ */ jsx(
115
125
  StepNameStyled,
@@ -124,7 +134,7 @@ function StepArea() {
124
134
  {
125
135
  currentStep,
126
136
  step: validIndex,
127
- totalSteps: validSteps.length,
137
+ totalSteps: totalVisibleSteps,
128
138
  originalStepIndex: originalIndex
129
139
  }
130
140
  )
@@ -3,4 +3,4 @@ import { StepProps } from '../../../../types';
3
3
  * Componente Step - Representa un paso individual en el Stepper
4
4
  * Solo se renderiza cuando el step actual coincide con stepKey Y la condition es true
5
5
  */
6
- export declare function Step(props: StepProps): import("react/jsx-runtime").JSX.Element | null;
6
+ export declare function Step(props: StepProps): import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,8 @@
1
- import { jsx, Fragment } from "react/jsx-runtime";
1
+ import { jsx } from "react/jsx-runtime";
2
2
  import { useMemo } from "react";
3
3
  import { u as useStepper } from "../../../../hooks/useStepper/index.js";
4
4
  import { useWatch } from "react-hook-form";
5
+ import { j as StepContentStyled } from "../../../../slots/StepperSlot.js";
5
6
  import { e as evaluateVisibilityStepCondition } from "../../../../helpers/evaluateVisibilityStepCondition/index.js";
6
7
  function Step(props) {
7
8
  const { stepKey, children } = props;
@@ -24,18 +25,16 @@ function Step(props) {
24
25
  if (stepKey !== currentStepConfig.key) {
25
26
  return false;
26
27
  }
27
- if (stepConfig && !evaluateVisibilityStepCondition(stepConfig, formValues || {}, visibilityData)) {
28
+ if (stepConfig && !evaluateVisibilityStepCondition(
29
+ stepConfig,
30
+ formValues || {},
31
+ visibilityData
32
+ )) {
28
33
  return false;
29
34
  }
30
35
  return true;
31
36
  }, [currentStepConfig, stepKey, stepConfig, formValues, visibilityData]);
32
- const renderedContent = useMemo(() => {
33
- if (!isStepVisible) {
34
- return null;
35
- }
36
- return /* @__PURE__ */ jsx(Fragment, { children });
37
- }, [isStepVisible, children]);
38
- return renderedContent;
37
+ return /* @__PURE__ */ jsx(StepContentStyled, { ownerState: { isStepVisible }, children });
39
38
  }
40
39
  export {
41
40
  Step as S
@@ -1,10 +1,10 @@
1
1
  import { jsxs } from "react/jsx-runtime";
2
2
  import { useMemo, Children, isValidElement } from "react";
3
- import { j as StepperFooterSectionStyled } from "../../slots/StepperSlot.js";
3
+ import { k as StepperFooterSectionStyled } from "../../slots/StepperSlot.js";
4
4
  import { S as StepperFooterLeftActions } from "./subcomponents/StepperFooterLeftActions/index.js";
5
5
  import { S as StepperFooterRightActions } from "./subcomponents/StepperFooterRightActions/index.js";
6
6
  function StepperFooter(props) {
7
- const { children, ownerState } = props;
7
+ const { children } = props;
8
8
  const { stepperFooterLeftActions, stepperFooterRightActions } = useMemo(() => {
9
9
  let parsedLeftActions = null;
10
10
  let parsedRightActions = null;
@@ -38,7 +38,7 @@ function StepperFooter(props) {
38
38
  stepperFooterRightActions: parsedRightActions
39
39
  };
40
40
  }, [children]);
41
- return /* @__PURE__ */ jsxs(StepperFooterSectionStyled, { ownerState, children: [
41
+ return /* @__PURE__ */ jsxs(StepperFooterSectionStyled, { children: [
42
42
  stepperFooterLeftActions,
43
43
  stepperFooterRightActions
44
44
  ] });
@@ -1,5 +1,5 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { k as StepperFooterLeftActionsStyled } from "../../../../slots/StepperSlot.js";
2
+ import { l as StepperFooterLeftActionsStyled } from "../../../../slots/StepperSlot.js";
3
3
  function StepperFooterLeftActions(props) {
4
4
  const { children } = props;
5
5
  return /* @__PURE__ */ jsx(StepperFooterLeftActionsStyled, { children });
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import React, { useMemo } from "react";
3
3
  import { u as useIsLastVisibleValidStep } from "../../../../hooks/useIsLastVisibleValidStep/index.js";
4
- import { l as StepperFooterRightActionsStyled } from "../../../../slots/StepperSlot.js";
4
+ import { m as StepperFooterRightActionsStyled } from "../../../../slots/StepperSlot.js";
5
5
  import { S as StepperNextButton } from "../../../StepperButtons/StepperNextButton/index.js";
6
6
  import { S as StepperSubmitButton } from "../../../StepperButtons/StepperSubmitButton/index.js";
7
7
  function StepperFooterRightActions(props) {
@@ -138,7 +138,6 @@ export interface IndicatorProps {
138
138
  */
139
139
  export interface StepperFooterProps {
140
140
  children?: ReactNode;
141
- ownerState?: StepperOwnerState;
142
141
  }
143
142
  /**
144
143
  * Props del StepperFooterLeftActions
@@ -160,7 +159,7 @@ export interface StepperOwnerState extends Pick<StepperProps, 'visibleTitle'>, R
160
159
  indicatorType?: IndicatorType;
161
160
  size?: Extract<Sizes, 'small' | 'medium'>;
162
161
  stepValidationStatus?: Record<number, boolean>;
163
- stepperFooterSticky?: boolean;
162
+ isStepVisible?: boolean;
164
163
  }
165
164
  export type StepperSlotsType = StepperSlots | ContentSlots | ContentAreaSlots | StepperFooterSlots;
166
165
  export type StepperStyles = M4LOverridesStyleRules<StepperSlotsType, typeof STEPPER_PREFIX_NAME, Theme>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m4l/components",
3
- "version": "9.3.13-JT02092025.beta.4",
3
+ "version": "9.3.13-JT03092025.beta.2",
4
4
  "license": "UNLICENSED",
5
5
  "description": "M4L Components",
6
6
  "lint-staged": {
@@ -1,7 +0,0 @@
1
- /**
2
- * Hook para determinar cuando el footer del Stepper debe usar posición sticky.
3
- * @param containerRef - Referencia al contenedor del Stepper
4
- * @param contentRef - Referencia al área de contenido del Stepper
5
- * @returns boolean - true si el footer debe ser sticky, false en caso contrario
6
- */
7
- export declare function useStickyStepperFooter(containerRef: React.RefObject<HTMLDivElement>, contentRef: React.RefObject<HTMLElement>): boolean;
@@ -1,20 +0,0 @@
1
- import { useMemo } from "react";
2
- import { u as useSizeContainer } from "../../../../hooks/useSizeContainer/index.js";
3
- function useStickyStepperFooter(containerRef, contentRef) {
4
- const containerSize = useSizeContainer(containerRef.current);
5
- const shouldBeSticky = useMemo(() => {
6
- if (!containerRef.current || !contentRef.current) {
7
- return false;
8
- }
9
- const containerHeight = containerRef.current.clientHeight;
10
- const contentHeight = contentRef.current.clientHeight;
11
- const totalContentHeight = contentHeight + 80;
12
- const exceedsContainer = totalContentHeight > containerHeight;
13
- const hasMinimumSpace = containerHeight > 120;
14
- return exceedsContainer && hasMinimumSpace;
15
- }, [containerSize, containerRef, contentRef]);
16
- return shouldBeSticky;
17
- }
18
- export {
19
- useStickyStepperFooter as u
20
- };