@m4l/components 9.3.12-JT270825.beta.1 → 9.3.12-JT290825.beta.1

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 (50) hide show
  1. package/components/Stepper/Stepper.js +77 -0
  2. package/components/Stepper/Stepper.styles.js +289 -0
  3. package/components/Stepper/constants.js +6 -0
  4. package/components/Stepper/dictionary.js +14 -0
  5. package/components/Stepper/helpers/evaluateVisibilityStepCondition/index.js +17 -0
  6. package/components/Stepper/helpers/findNextVisibleValidStep/index.js +13 -0
  7. package/components/Stepper/helpers/findPrevVisibleValidStep/index.js +13 -0
  8. package/components/Stepper/helpers/index.js +1 -0
  9. package/components/Stepper/helpers/isLastVisibleValidStep/index.js +16 -0
  10. package/components/Stepper/hooks/useIsLastVisibleValidStep/index.js +16 -0
  11. package/components/Stepper/hooks/useStepper/index.js +20 -0
  12. package/components/Stepper/hooks/useStepperActions/index.js +1 -0
  13. package/components/Stepper/hooks/useStepperActions/useStepperActions.js +63 -0
  14. package/components/Stepper/hooks/useStickyStepperFooter/index.d.ts +7 -0
  15. package/components/Stepper/hooks/useStickyStepperFooter/index.js +20 -0
  16. package/components/Stepper/icons.js +12 -0
  17. package/components/Stepper/index.d.ts +9 -4
  18. package/components/Stepper/index.js +1 -0
  19. package/components/Stepper/slots/StepperEnum.js +36 -0
  20. package/components/Stepper/slots/StepperSlot.js +97 -0
  21. package/components/Stepper/store/StepperContext/index.js +103 -0
  22. package/components/Stepper/store/StepperStore/index.js +152 -0
  23. package/components/Stepper/subcomponents/ContentArea/index.js +24 -0
  24. package/components/Stepper/subcomponents/ContentArea/subcomponents/WrapperIcon/index.js +26 -0
  25. package/components/Stepper/subcomponents/ContentArea/subcomponents/WrapperTitle/index.js +23 -0
  26. package/components/Stepper/subcomponents/StepArea/index.js +135 -0
  27. package/components/Stepper/subcomponents/StepArea/subcomponents/Inidicator/index.js +85 -0
  28. package/components/Stepper/subcomponents/StepperButtons/StepperCancelButton/index.js +25 -0
  29. package/components/Stepper/subcomponents/StepperButtons/StepperNextButton/index.js +46 -0
  30. package/components/Stepper/subcomponents/StepperButtons/StepperPrevButton/index.js +52 -0
  31. package/components/Stepper/subcomponents/StepperButtons/StepperSubmitButton/index.js +20 -0
  32. package/components/Stepper/subcomponents/StepperButtons/index.js +1 -0
  33. package/components/Stepper/subcomponents/StepperContent/index.js +23 -0
  34. package/components/Stepper/subcomponents/StepperContent/subcomponents/Step/index.js +42 -0
  35. package/components/Stepper/subcomponents/StepperFooter/index.js +48 -0
  36. package/components/Stepper/subcomponents/StepperFooter/subcomponents/StepperFooterLeftActions/index.js +9 -0
  37. package/components/Stepper/subcomponents/StepperFooter/subcomponents/StepperFooterRightActions/index.js +33 -0
  38. package/components/Stepper/types.d.ts +7 -1
  39. package/components/index.d.ts +1 -0
  40. package/helpers/getStepsAndValidationSchema/getStepsAndValidationSchema.js +44 -0
  41. package/helpers/getStepsAndValidationSchema/index.d.ts +1 -0
  42. package/helpers/getStepsAndValidationSchema/index.js +1 -0
  43. package/helpers/getStepsAndValidationSchema/types.js +1 -0
  44. package/helpers/index.d.ts +1 -0
  45. package/helpers/index.js +1 -0
  46. package/index.d.ts +1 -0
  47. package/index.js +80 -52
  48. package/package.json +1 -1
  49. package/storybook/components/Stepper/helpers/useSteps.d.ts +1 -1
  50. package/storybook/components/Stepper/subcomponents/StepperDecorator.d.ts +1 -1
@@ -0,0 +1,77 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useRef, useMemo, Children, isValidElement, cloneElement } from "react";
3
+ import { useFlagsPresent, CommonFlags } from "@m4l/core";
4
+ import { S as StepperRootStyled, C as ContentSectionStyled } from "./slots/StepperSlot.js";
5
+ import { a as getComponentSlotRoot } from "../../utils/getComponentSlotRoot.js";
6
+ import { S as STEPPER_PREFIX_NAME } from "./constants.js";
7
+ import { S as StepArea } from "./subcomponents/StepArea/index.js";
8
+ import { C as ContentArea } from "./subcomponents/ContentArea/index.js";
9
+ import { S as StepperProvider } from "./store/StepperContext/index.js";
10
+ import { S as StepperFooter } from "./subcomponents/StepperFooter/index.js";
11
+ import { S as StepperContent } from "./subcomponents/StepperContent/index.js";
12
+ import { u as useStickyStepperFooter } from "./hooks/useStickyStepperFooter/index.js";
13
+ import { u as useComponentSize } from "../../hooks/useComponentSize/useComponentSize.js";
14
+ function Stepper(props) {
15
+ const { orientation, size, children } = props;
16
+ const { currentSize } = useComponentSize(size);
17
+ const containerRef = useRef(null);
18
+ const contentSectionRef = useRef(null);
19
+ const stepperFooterSticky = useStickyStepperFooter(
20
+ containerRef,
21
+ contentSectionRef
22
+ );
23
+ const ownerState = {
24
+ size: currentSize,
25
+ orientation,
26
+ stepperFooterSticky
27
+ };
28
+ const classRoot = getComponentSlotRoot(STEPPER_PREFIX_NAME);
29
+ const { stepperFooter, stepperContent } = useMemo(() => {
30
+ let footer = null;
31
+ let content = null;
32
+ let footerCount = 0;
33
+ let contentCount = 0;
34
+ if (children) {
35
+ Children.forEach(children, (child) => {
36
+ if (isValidElement(child)) {
37
+ if (child.type === StepperFooter) {
38
+ footerCount++;
39
+ if (footerCount > 1) {
40
+ throw new Error(
41
+ "Stepper: Solo se permite un componente StepperFooter. Se encontraron múltiples StepperFooter."
42
+ );
43
+ }
44
+ footer = child;
45
+ } else if (child.type === StepperContent) {
46
+ contentCount++;
47
+ if (contentCount > 1) {
48
+ throw new Error(
49
+ "Stepper: Solo se permite un componente StepperContent. Se encontraron múltiples StepperContent."
50
+ );
51
+ }
52
+ content = child;
53
+ } else {
54
+ throw new Error(
55
+ "Stepper: Solo se permiten componentes StepperContent y StepperFooter como hijos."
56
+ );
57
+ }
58
+ }
59
+ });
60
+ }
61
+ return { stepperFooter: footer, stepperContent: content };
62
+ }, [children]);
63
+ const hasPresentFlags = useFlagsPresent([CommonFlags.FLAG_DICTIONARY_LOADED]);
64
+ if (!hasPresentFlags) {
65
+ return null;
66
+ }
67
+ return /* @__PURE__ */ jsx(StepperProvider, { ...props, children: /* @__PURE__ */ jsxs(StepperRootStyled, { className: classRoot, children: [
68
+ /* @__PURE__ */ jsxs(ContentSectionStyled, { ownerState, children: [
69
+ /* @__PURE__ */ jsx(StepArea, {}),
70
+ /* @__PURE__ */ jsx(ContentArea, { children: stepperContent })
71
+ ] }),
72
+ stepperFooter && cloneElement(stepperFooter, { ownerState })
73
+ ] }) });
74
+ }
75
+ export {
76
+ Stepper as S
77
+ };
@@ -0,0 +1,289 @@
1
+ import { g as getSizeStyles } from "../../utils/getSizeStyles/getSizeStyles.js";
2
+ const stepperStyles = {
3
+ /**
4
+ *
5
+ * Estilos para el contenedor principal del Stepper.
6
+ */
7
+ stepperRoot: ({ theme, ownerState }) => ({
8
+ display: "flex",
9
+ flexDirection: "column",
10
+ justifyContent: ownerState?.stepperFooterSticky ? "flex-start" : "space-between",
11
+ background: theme.vars.palette.background.default,
12
+ width: "100%",
13
+ height: "100%",
14
+ borderRadius: theme.vars.size.borderRadius.r1
15
+ }),
16
+ /**
17
+ * Estilos para la sección que contiene los pasos del Stepper.
18
+ */
19
+ contentSection: ({ theme, ownerState }) => ({
20
+ display: "flex",
21
+ flexDirection: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? "column" : "row",
22
+ gap: theme.vars.size.baseSpacings.sp8
23
+ }),
24
+ /**
25
+ * Estilos para la sección que contiene los botones de acción del Stepper.
26
+ */
27
+ stepArea: ({ theme, ownerState }) => ({
28
+ ...ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? {
29
+ display: "flex",
30
+ alignItems: "start",
31
+ width: "100%",
32
+ minWidth: "350px",
33
+ overflowX: "auto"
34
+ } : {
35
+ maxWidth: "116px"
36
+ }
37
+ }),
38
+ /**
39
+ * Estilos para el área de contenido del Stepper.
40
+ */
41
+ contentArea: ({ theme, ownerState }) => ({
42
+ flex: 1,
43
+ display: "flex",
44
+ flexDirection: "column",
45
+ gap: theme.vars.size.baseSpacings.sp6,
46
+ ...ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? {
47
+ borderTop: "1px solid",
48
+ paddingTop: theme.vars.size.baseSpacings.sp8
49
+ } : {
50
+ borderLeft: "1px solid",
51
+ paddingLeft: theme.vars.size.baseSpacings.sp8
52
+ },
53
+ borderColor: theme.vars.palette?.border.disabled
54
+ }),
55
+ /**
56
+ * Estilos para cada paso del Stepper.
57
+ */
58
+ step: ({ theme, ownerState }) => {
59
+ const currentStep = ownerState?.currentStep ?? 0;
60
+ const step = ownerState?.step ?? 0;
61
+ const totalSteps = ownerState?.totalSteps ?? 0;
62
+ const isCompleted = currentStep > step;
63
+ const isLastStep = step === totalSteps - 1;
64
+ return {
65
+ cursor: "pointer",
66
+ display: "flex",
67
+ flexDirection: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? "column" : "row",
68
+ alignItems: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? "center" : "start",
69
+ justifyContent: ownerState?.visibleTitle ? "space-between" : "center",
70
+ gap: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? theme.vars.size.baseSpacings.sp1 : theme.vars.size.baseSpacings.sp4,
71
+ width: "100%",
72
+ ...(ownerState?.orientation === "vertical" || theme.generalSettings.isMobile) && {
73
+ minWidth: theme.vars.size.baseSpacings.sp10
74
+ },
75
+ height: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? "auto" : theme.vars.size.baseSpacings.sp13,
76
+ position: "relative",
77
+ ...!isLastStep && (ownerState?.orientation === "vertical" || theme.generalSettings.isMobile) && {
78
+ "&::after": {
79
+ content: '""',
80
+ position: "absolute",
81
+ top: ownerState?.orientation === "horizontal" && theme.generalSettings.isMobile ? "16px" : "10px",
82
+ // Ajustado para coincidir con el centro del indicador cuando alignItems es start
83
+ height: "1px",
84
+ borderTop: `1px ${isCompleted ? "solid" : "dashed"} ${isCompleted ? theme.vars.palette.primary.enabled : theme.vars.palette.border.default}`,
85
+ left: "50%",
86
+ width: "100%"
87
+ }
88
+ }
89
+ };
90
+ },
91
+ /**
92
+ * Estilos para el nombre del paso dentro del Stepper.
93
+ */
94
+ stepName: ({ theme, ownerState }) => ({
95
+ ...ownerState?.orientation === "horizontal" && {
96
+ height: theme.generalSettings.isMobile ? theme.vars.size.mobile.medium.action : theme.vars.size.desktop.large.action
97
+ },
98
+ ...(ownerState?.orientation === "vertical" || theme.generalSettings.isMobile) && {
99
+ maxWidth: "120px",
100
+ width: "100%",
101
+ lineHeight: "1.2",
102
+ marginTop: theme.vars.size.baseSpacings.sp1
103
+ },
104
+ alignContent: "center",
105
+ cursor: "pointer",
106
+ overflow: "hidden",
107
+ ...theme.generalSettings.isMobile ? {
108
+ display: "none"
109
+ } : {
110
+ display: ownerState?.visibleTitle ? "-webkit-box" : "none"
111
+ },
112
+ WebkitBoxOrient: "vertical",
113
+ WebkitLineClamp: 2,
114
+ textOverflow: "ellipsis",
115
+ flex: 1,
116
+ minWidth: 0,
117
+ whiteSpace: "normal",
118
+ order: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? 1 : 0,
119
+ "&.M4LTypography-root": {
120
+ color: (ownerState?.currentStep ?? 0) > (ownerState?.step ?? 0) ? theme.vars.palette.primary.semanticText : (ownerState?.currentStep ?? 0) === (ownerState?.step ?? 0) ? theme.vars.palette.text.primary : theme.vars.palette.text.secondary,
121
+ textAlign: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? "center" : "right"
122
+ }
123
+ }),
124
+ /**
125
+ * Estilos para el indicador numérico de cada paso del Stepper.
126
+ */
127
+ indicator: ({ theme, ownerState }) => {
128
+ const currentStep = ownerState?.currentStep ?? 0;
129
+ const step = ownerState?.step ?? 0;
130
+ const totalSteps = ownerState?.totalSteps ?? 0;
131
+ const isCompleted = currentStep > step;
132
+ const isCurrent = currentStep === step;
133
+ const isLastStep = step === totalSteps - 1;
134
+ const isValidStep = ownerState?.stepValidationStatus?.[step] ?? true;
135
+ return {
136
+ ...ownerState?.orientation === "horizontal" && {
137
+ marginTop: theme.generalSettings.isMobile ? "6px" : theme.vars.size.baseSpacings.sp1
138
+ },
139
+ display: "flex",
140
+ alignItems: "center",
141
+ justifyContent: "center",
142
+ order: ownerState?.orientation === "vertical" || theme.generalSettings.isMobile ? 0 : 1,
143
+ ...getSizeStyles(theme, ownerState?.size || "medium", "case", (size) => {
144
+ return {
145
+ width: size,
146
+ height: size
147
+ };
148
+ }),
149
+ background: isCompleted ? ownerState?.indicatorType === "dot" || theme.generalSettings.isMobile ? theme.vars.palette.background.default : theme.vars.palette.primary.toneOpacity : !isValidStep ? theme.vars.palette.error.enabled : ownerState?.indicatorType === "dot" || theme.generalSettings.isMobile ? theme.vars.palette.background.default : isCurrent ? theme.vars.palette.primary.enabled : theme.vars.palette.default.enabled,
150
+ borderRadius: theme.vars.size.borderRadius.r2,
151
+ ...ownerState?.indicatorType === "number" && !theme.generalSettings.isMobile && {
152
+ boxShadow: isCurrent ? "0 2px 8px 0 rgb(0, 100, 255, 0.16)" : "none"
153
+ },
154
+ position: "relative",
155
+ zIndex: 1,
156
+ textAlign: "center",
157
+ "& > div": {
158
+ position: "absolute",
159
+ top: "50%",
160
+ left: "50%",
161
+ transform: "translate(-50%, -50%)"
162
+ },
163
+ ...!isLastStep && ownerState?.orientation === "horizontal" && !theme.generalSettings.isMobile && {
164
+ "&::after": {
165
+ content: '""',
166
+ position: "absolute",
167
+ top: "100%",
168
+ left: "50%",
169
+ transform: "translateX(-50%)",
170
+ width: "1px",
171
+ height: theme.vars.size.baseSpacings.sp12,
172
+ borderLeft: `1px ${isCompleted ? "solid" : "dashed"} ${isCompleted ? theme.vars.palette.primary.enabled : theme.vars.palette.border.default}`
173
+ }
174
+ }
175
+ };
176
+ },
177
+ /**
178
+ * Estilos para el número de texto dentro del indicador numérico del Stepper.
179
+ */
180
+ textNumber: ({ theme, ownerState }) => {
181
+ const currentStep = ownerState?.currentStep ?? 0;
182
+ const step = ownerState?.step ?? 0;
183
+ const isCompleted = currentStep > step;
184
+ const isCurrent = currentStep === step;
185
+ return {
186
+ "&.M4LTypography-root": {
187
+ color: isCompleted || isCurrent ? theme.vars.palette.primary.contrastText : theme.vars.palette.text.primary
188
+ }
189
+ };
190
+ },
191
+ /**
192
+ * Estilos para el área de contenido del Stepper.
193
+ */
194
+ contentAreaHeader: ({ theme }) => ({
195
+ display: "flex",
196
+ alignItems: "center",
197
+ gap: theme.size.baseSpacings.sp3
198
+ }),
199
+ /**
200
+ * Estilos para el contenedor del icono del titulo del Stepper.
201
+ */
202
+ wrapperIcon: ({ theme, ownerState }) => ({
203
+ ...getSizeStyles(theme, ownerState?.size || "medium", "box", (size) => {
204
+ return {
205
+ width: size,
206
+ height: size
207
+ };
208
+ }),
209
+ display: "flex",
210
+ alignItems: "center",
211
+ justifyContent: "center",
212
+ background: theme.vars.palette.primary.enabledOpacity,
213
+ borderRadius: theme.vars.size.borderRadius["r1-5"]
214
+ }),
215
+ /**
216
+ * Estilos para el título del Stepper.
217
+ */
218
+ wrapperTitle: ({ theme }) => ({
219
+ color: theme.vars.palette.text.primary,
220
+ display: "flex",
221
+ flexDirection: "column",
222
+ gap: theme.vars.size.baseSpacings["sp0-5"]
223
+ }),
224
+ /**
225
+ * Estilos para el icono del Stepper.
226
+ */
227
+ icon: ({ theme, ownerState }) => ({
228
+ ...getSizeStyles(theme, ownerState?.size || "medium", "case", (size) => {
229
+ return {
230
+ width: size,
231
+ height: size
232
+ };
233
+ })
234
+ }),
235
+ /**
236
+ * Estilos para el título del Stepper.
237
+ */
238
+ title: () => ({}),
239
+ /**
240
+ * Estilos para la descripción del Stepper.
241
+ */
242
+ description: ({ theme }) => ({
243
+ "&.M4LTypography-root": {
244
+ color: theme.vars.palette.text.secondary
245
+ }
246
+ }),
247
+ /**
248
+ * Estilos para la sección de botones de acción del Stepper.
249
+ */
250
+ stepperFooterSection: ({ theme, ownerState }) => ({
251
+ display: "flex",
252
+ alignItems: "center",
253
+ justifyContent: "space-between",
254
+ paddingTop: theme.vars.size.baseSpacings.sp4,
255
+ ...ownerState?.stepperFooterSticky && {
256
+ position: "sticky",
257
+ bottom: 0,
258
+ backgroundColor: theme.vars.palette.background.default,
259
+ marginTop: "auto",
260
+ zIndex: 10
261
+ }
262
+ }),
263
+ /**
264
+ * Estilos para las acciones del lado izquierdo del StepperFooter.
265
+ */
266
+ stepperFooterLeftActions: ({ theme }) => ({
267
+ display: "flex",
268
+ alignItems: "center",
269
+ gap: theme.vars.size.baseSpacings.sp3
270
+ }),
271
+ /**
272
+ * Estilos para las acciones del lado derecho del StepperFooter.
273
+ */
274
+ stepperFooterRightActions: ({ theme }) => ({
275
+ display: "flex",
276
+ alignItems: "center",
277
+ gap: theme.vars.size.baseSpacings.sp3
278
+ }),
279
+ /**
280
+ * Estilos para el contenedor de los botones del Stepper.
281
+ */
282
+ wrapperButtons: ({ theme }) => ({
283
+ display: "flex",
284
+ gap: theme.size.baseSpacings.sp3
285
+ })
286
+ };
287
+ export {
288
+ stepperStyles as s
289
+ };
@@ -0,0 +1,6 @@
1
+ const STEPPER_PREFIX_NAME = "M4LStepper";
2
+ const STEPPER_STORE_ID = "M4LStepperStore";
3
+ export {
4
+ STEPPER_PREFIX_NAME as S,
5
+ STEPPER_STORE_ID as a
6
+ };
@@ -0,0 +1,14 @@
1
+ const STEPPER_DICTIONARY_ID = "stepper";
2
+ function getStepperComponentsDictionary() {
3
+ return [STEPPER_DICTIONARY_ID];
4
+ }
5
+ const DICTIONARY = {
6
+ LABEL_PREV_BUTTON: `${STEPPER_DICTIONARY_ID}.label_prev_button`,
7
+ LABEL_NEXT_BUTTON: `${STEPPER_DICTIONARY_ID}.label_next_button`,
8
+ LABEL_CANCEL_BUTTON: `${STEPPER_DICTIONARY_ID}.label_cancel_button`,
9
+ LABEL_SUBMIT_BUTTON: `${STEPPER_DICTIONARY_ID}.label_submit_button`
10
+ };
11
+ export {
12
+ DICTIONARY as D,
13
+ getStepperComponentsDictionary as g
14
+ };
@@ -0,0 +1,17 @@
1
+ const evaluateVisibilityStepCondition = (step, formData, visibilityData) => {
2
+ if (!step.visibilityCondition) {
3
+ return true;
4
+ }
5
+ try {
6
+ return step.visibilityCondition(formData || {}, visibilityData);
7
+ } catch (error) {
8
+ console.error(
9
+ `Error evualuando la condición del step "${step.key}":`,
10
+ error
11
+ );
12
+ return false;
13
+ }
14
+ };
15
+ export {
16
+ evaluateVisibilityStepCondition as e
17
+ };
@@ -0,0 +1,13 @@
1
+ import { e as evaluateVisibilityStepCondition } from "../evaluateVisibilityStepCondition/index.js";
2
+ const findNextVisibleValidStep = (currentStepIndex, steps, formData, visibilityData) => {
3
+ for (let i = currentStepIndex + 1; i < steps.length; i++) {
4
+ const step = steps[i];
5
+ if (evaluateVisibilityStepCondition(step, formData || {}, visibilityData)) {
6
+ return i;
7
+ }
8
+ }
9
+ return steps.length;
10
+ };
11
+ export {
12
+ findNextVisibleValidStep as f
13
+ };
@@ -0,0 +1,13 @@
1
+ import { e as evaluateVisibilityStepCondition } from "../evaluateVisibilityStepCondition/index.js";
2
+ const findPrevVisibleValidStep = (currentStepIndex, steps, formData, visibilityData) => {
3
+ for (let i = currentStepIndex - 1; i >= 0; i--) {
4
+ const step = steps[i];
5
+ if (evaluateVisibilityStepCondition(step, formData || {}, visibilityData)) {
6
+ return i;
7
+ }
8
+ }
9
+ return -1;
10
+ };
11
+ export {
12
+ findPrevVisibleValidStep as f
13
+ };
@@ -0,0 +1,16 @@
1
+ import { e as evaluateVisibilityStepCondition } from "../evaluateVisibilityStepCondition/index.js";
2
+ const isLastVisibleValidStep = (currentStepIndex, steps, formData, visibilityData) => {
3
+ if (!steps || currentStepIndex >= steps.length || currentStepIndex < 0) {
4
+ return false;
5
+ }
6
+ for (let i = currentStepIndex + 1; i < steps.length; i++) {
7
+ const step = steps[i];
8
+ if (evaluateVisibilityStepCondition(step, formData || {}, visibilityData)) {
9
+ return false;
10
+ }
11
+ }
12
+ return true;
13
+ };
14
+ export {
15
+ isLastVisibleValidStep as i
16
+ };
@@ -0,0 +1,16 @@
1
+ import { useFormContext } from "react-hook-form";
2
+ import { u as useStepper } from "../useStepper/index.js";
3
+ import { i as isLastVisibleValidStep } from "../../helpers/isLastVisibleValidStep/index.js";
4
+ const useIsLastVisibleValidStep = () => {
5
+ const { getValues } = useFormContext();
6
+ const { currentStep, steps, visibilityData } = useStepper((state) => ({
7
+ currentStep: state.currentStep,
8
+ steps: state.steps,
9
+ visibilityData: state.visibilityData
10
+ }));
11
+ const formData = getValues();
12
+ return isLastVisibleValidStep(currentStep, steps || [], formData, visibilityData);
13
+ };
14
+ export {
15
+ useIsLastVisibleValidStep as u
16
+ };
@@ -0,0 +1,20 @@
1
+ import { useContext } from "react";
2
+ import { useStore } from "zustand";
3
+ import { shallow } from "zustand/shallow";
4
+ import { a as StepperContext } from "../../store/StepperContext/index.js";
5
+ function useStepper(selector, equalityFn) {
6
+ const context = useContext(StepperContext);
7
+ if (!context) {
8
+ throw new Error(
9
+ "useStepperStore context must be use inside StepperContext"
10
+ );
11
+ }
12
+ const { store } = context;
13
+ const storeData = useStore(store, selector, equalityFn ?? shallow);
14
+ return {
15
+ ...storeData
16
+ };
17
+ }
18
+ export {
19
+ useStepper as u
20
+ };
@@ -0,0 +1,63 @@
1
+ import { u as useStepper } from "../useStepper/index.js";
2
+ import { useFormContext } from "react-hook-form";
3
+ function useStepperActions() {
4
+ const { trigger, clearErrors, getValues, reset } = useFormContext();
5
+ const {
6
+ nextStep,
7
+ prevStep,
8
+ currentStep,
9
+ steps,
10
+ setStepValidationStatus,
11
+ resetStepper
12
+ } = useStepper((state) => ({
13
+ nextStep: state.actions.nextStep,
14
+ prevStep: state.actions.prevStep,
15
+ currentStep: state.currentStep,
16
+ steps: state.steps,
17
+ setStepValidationStatus: state.actions.setStepValidationStatus,
18
+ resetStepper: state.actions.resetStepper
19
+ }));
20
+ const prevStepAction = () => {
21
+ const formData = getValues();
22
+ prevStep(formData);
23
+ };
24
+ const nextStepAction = async () => {
25
+ const formData = getValues();
26
+ const futureSteps = steps.slice(currentStep + 1);
27
+ const futureFields = [];
28
+ futureSteps.forEach((step) => {
29
+ if (step.validationFields) {
30
+ futureFields.push(...step.validationFields);
31
+ }
32
+ });
33
+ const validateFn = async () => {
34
+ const currentStepData = steps[currentStep];
35
+ const fieldsToValidate = currentStepData?.validationFields || [];
36
+ if (fieldsToValidate.length === 0) {
37
+ return true;
38
+ }
39
+ return await trigger(fieldsToValidate);
40
+ };
41
+ const success = await nextStep(validateFn, formData);
42
+ if (success && futureFields.length > 0) {
43
+ clearErrors(futureFields);
44
+ setTimeout(() => {
45
+ clearErrors(futureFields);
46
+ futureSteps.forEach((_, index) => {
47
+ const stepIndex = currentStep + 1 + index;
48
+ setStepValidationStatus(stepIndex, true);
49
+ });
50
+ }, 100);
51
+ }
52
+ return success;
53
+ };
54
+ const cancelAction = () => {
55
+ reset();
56
+ clearErrors();
57
+ resetStepper();
58
+ };
59
+ return { prevStepAction, nextStepAction, cancelAction };
60
+ }
61
+ export {
62
+ useStepperActions as u
63
+ };
@@ -0,0 +1,7 @@
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;
@@ -0,0 +1,20 @@
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
+ };
@@ -0,0 +1,12 @@
1
+ const pathIcons = {
2
+ patronum: "frontend/components/step/assets/icons/patronum_fill.svg",
3
+ arrowLeft: "frontend/components/step/assets/icons/arrow_left.svg",
4
+ arrowRight: "frontend/components/step/assets/icons/arrow_right.svg",
5
+ circleCheck: "frontend/components/step/assets/icons/circle_check.svg",
6
+ circleError: "frontend/components/step/assets/icons/circle_error.svg",
7
+ dotOutline: "frontend/components/step/assets/icons/dot_outline.svg",
8
+ dotSelected: "frontend/components/step/assets/icons/dot_selected.svg"
9
+ };
10
+ export {
11
+ pathIcons as p
12
+ };
@@ -2,8 +2,13 @@ export { useStepper } from './hooks/useStepper/index';
2
2
  export { Stepper } from './Stepper';
3
3
  export { StepperContent } from './subcomponents/StepperContent';
4
4
  export { Step } from './subcomponents/StepperContent/subcomponents/Step';
5
- export { StepperFooter, } from './subcomponents/StepperFooter';
6
- export { StepperFooterLeftActions, } from './subcomponents/StepperFooter/subcomponents/StepperFooterLeftActions';
7
- export { StepperFooterRightActions, } from './subcomponents/StepperFooter/subcomponents/StepperFooterRightActions';
8
- export { StepperNextButton, StepperPrevButton, StepperCancelButton, StepperSubmitButton, } from './subcomponents/StepperButtons';
5
+ export { StepperFooter } from './subcomponents/StepperFooter';
6
+ export { StepperFooterLeftActions } from './subcomponents/StepperFooter/subcomponents/StepperFooterLeftActions';
7
+ export { StepperFooterRightActions } from './subcomponents/StepperFooter/subcomponents/StepperFooterRightActions';
8
+ export { StepperNextButton } from './subcomponents/StepperButtons/StepperNextButton';
9
+ export { StepperPrevButton } from './subcomponents/StepperButtons/StepperPrevButton';
10
+ export { StepperCancelButton } from './subcomponents/StepperButtons/StepperCancelButton';
11
+ export { StepperSubmitButton } from './subcomponents/StepperButtons/StepperSubmitButton';
9
12
  export { evaluateVisibilityStepCondition } from './helpers/evaluateVisibilityStepCondition';
13
+ export { type Step as TypeStep } from './types';
14
+ export { getStepperComponentsDictionary } from './dictionary';
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,36 @@
1
+ var StepperSlots = /* @__PURE__ */ ((StepperSlots2) => {
2
+ StepperSlots2["stepperRoot"] = "stepperRoot";
3
+ return StepperSlots2;
4
+ })(StepperSlots || {});
5
+ var ContentSlots = /* @__PURE__ */ ((ContentSlots2) => {
6
+ ContentSlots2["contentSection"] = "contentSection";
7
+ ContentSlots2["stepArea"] = "stepArea";
8
+ ContentSlots2["step"] = "step";
9
+ ContentSlots2["stepName"] = "stepName";
10
+ ContentSlots2["indicator"] = "indicator";
11
+ ContentSlots2["textNumber"] = "textNumber";
12
+ return ContentSlots2;
13
+ })(ContentSlots || {});
14
+ var ContentAreaSlots = /* @__PURE__ */ ((ContentAreaSlots2) => {
15
+ ContentAreaSlots2["contentArea"] = "contentArea";
16
+ ContentAreaSlots2["contentAreaHeader"] = "contentAreaHeader";
17
+ ContentAreaSlots2["wrapperIcon"] = "wrapperIcon";
18
+ ContentAreaSlots2["wrapperTitle"] = "wrapperTitle";
19
+ ContentAreaSlots2["icon"] = "icon";
20
+ ContentAreaSlots2["title"] = "title";
21
+ ContentAreaSlots2["description"] = "description";
22
+ return ContentAreaSlots2;
23
+ })(ContentAreaSlots || {});
24
+ var StepperFooterSlots = /* @__PURE__ */ ((StepperFooterSlots2) => {
25
+ StepperFooterSlots2["stepperFooterSection"] = "stepperFooterSection";
26
+ StepperFooterSlots2["stepperFooterLeftActions"] = "stepperFooterLeftActions";
27
+ StepperFooterSlots2["stepperFooterRightActions"] = "stepperFooterRightActions";
28
+ StepperFooterSlots2["wrapperButtons"] = "wrapperButtons";
29
+ return StepperFooterSlots2;
30
+ })(StepperFooterSlots || {});
31
+ export {
32
+ ContentSlots as C,
33
+ StepperSlots as S,
34
+ StepperFooterSlots as a,
35
+ ContentAreaSlots as b
36
+ };