@soyfri/shared-library 2.0.0-beta.9 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Button-C17mExpd.cjs.map +1 -1
- package/Button-UkkP-bNw.js.map +1 -1
- package/README.md +182 -150
- package/components/ActionMenu/ActionMenu.cjs +52 -52
- package/components/ActionMenu/ActionMenu.cjs.map +1 -1
- package/components/ActionMenu/ActionMenu.d.ts +20 -36
- package/components/ActionMenu/ActionMenu.js +55 -55
- package/components/ActionMenu/ActionMenu.js.map +1 -1
- package/components/ActionMenu/index.d.ts +2 -2
- package/components/AppBar/AppBar.cjs +2 -219
- package/components/AppBar/AppBar.cjs.map +1 -1
- package/components/AppBar/AppBar.d.ts +6 -6
- package/components/AppBar/AppBar.js +5 -222
- package/components/AppBar/AppBar.js.map +1 -1
- package/components/AppBar/index.d.ts +0 -6
- package/components/Autocomplete/Autocomplete.cjs +93 -94
- package/components/Autocomplete/Autocomplete.cjs.map +1 -1
- package/components/Autocomplete/Autocomplete.d.ts +29 -26
- package/components/Autocomplete/Autocomplete.definitions.d.ts +2 -1
- package/components/Autocomplete/Autocomplete.helpers.d.ts +12 -8
- package/components/Autocomplete/Autocomplete.js +94 -95
- package/components/Autocomplete/Autocomplete.js.map +1 -1
- package/components/Autocomplete/_parts/AutocompleteChips.d.ts +7 -6
- package/components/Autocomplete/_parts/AutocompleteOption.d.ts +10 -13
- package/components/Autocomplete/index.d.ts +1 -1
- package/components/Avatar/Avatar.cjs +17 -18
- package/components/Avatar/Avatar.cjs.map +1 -1
- package/components/Avatar/Avatar.js +17 -18
- package/components/Avatar/Avatar.js.map +1 -1
- package/components/Avatar/index.d.ts +1 -0
- package/components/Button/Button.d.ts +5 -5
- package/components/Button/index.d.ts +1 -0
- package/components/Card/Card.cjs +3 -92
- package/components/Card/Card.cjs.map +1 -1
- package/components/Card/Card.d.ts +3 -50
- package/components/Card/Card.js +5 -94
- package/components/Card/Card.js.map +1 -1
- package/components/Card/Card.sx.d.ts +3 -6
- package/components/Card/index.d.ts +1 -1
- package/components/Checkbox/Checkbox.cjs +189 -0
- package/components/Checkbox/Checkbox.cjs.map +1 -0
- package/components/Checkbox/Checkbox.d.ts +55 -0
- package/components/Checkbox/Checkbox.js +189 -0
- package/components/Checkbox/Checkbox.js.map +1 -0
- package/components/Checkbox/Checkbox.sx.d.ts +13 -0
- package/components/Checkbox/index.d.ts +2 -0
- package/components/Checkbox.d.ts +6 -0
- package/components/Chip/Chip.cjs +2 -1
- package/components/Chip/Chip.cjs.map +1 -1
- package/components/Chip/Chip.js +2 -1
- package/components/Chip/Chip.js.map +1 -1
- package/components/Chip/index.d.ts +2 -1
- package/components/Chip.d.ts +4 -0
- package/components/DatePicker/DatePicker.cjs +40 -63
- package/components/DatePicker/DatePicker.cjs.map +1 -1
- package/components/DatePicker/DatePicker.d.ts +1 -13
- package/components/DatePicker/DatePicker.js +36 -59
- package/components/DatePicker/DatePicker.js.map +1 -1
- package/components/DatePicker/index.d.ts +1 -1
- package/components/DateTimePicker/DateTimePicker.cjs +58 -82
- package/components/DateTimePicker/DateTimePicker.cjs.map +1 -1
- package/components/DateTimePicker/DateTimePicker.d.ts +9 -17
- package/components/DateTimePicker/DateTimePicker.definitions.d.ts +2 -0
- package/components/DateTimePicker/DateTimePicker.helpers.d.ts +4 -2
- package/components/DateTimePicker/DateTimePicker.js +54 -78
- package/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/components/DateTimePicker/index.d.ts +1 -1
- package/components/Drawer/Drawer.cjs +12 -6
- package/components/Drawer/Drawer.cjs.map +1 -1
- package/components/Drawer/Drawer.d.ts +3 -1
- package/components/Drawer/Drawer.js +13 -7
- package/components/Drawer/Drawer.js.map +1 -1
- package/components/Drawer/DrawerItem.d.ts +6 -1
- package/components/Gallery/Gallery.cjs +154 -79
- package/components/Gallery/Gallery.cjs.map +1 -1
- package/components/Gallery/Gallery.d.ts +25 -9
- package/components/Gallery/Gallery.js +154 -79
- package/components/Gallery/Gallery.js.map +1 -1
- package/components/Gallery/GalleryLightbox.d.ts +6 -10
- package/components/Gallery/GalleryMain.d.ts +3 -7
- package/components/Gallery/GalleryThumbnails.d.ts +7 -11
- package/components/Gallery/index.d.ts +2 -1
- package/components/Gallery.d.ts +4 -0
- package/components/Icon/Icon.cjs +6 -8
- package/components/Icon/Icon.cjs.map +1 -1
- package/components/Icon/Icon.d.ts +11 -17
- package/components/Icon/Icon.js +6 -8
- package/components/Icon/Icon.js.map +1 -1
- package/components/Icon/index.d.ts +2 -1
- package/components/Icon.d.ts +4 -0
- package/components/Input/Input.cjs +26 -13
- package/components/Input/Input.cjs.map +1 -1
- package/components/Input/Input.d.ts +9 -2
- package/components/Input/Input.helpers.d.ts +3 -3
- package/components/Input/Input.js +23 -10
- package/components/Input/Input.js.map +1 -1
- package/components/Input/index.d.ts +1 -1
- package/components/InputGroup/InputGroup.cjs +23 -22
- package/components/InputGroup/InputGroup.cjs.map +1 -1
- package/components/InputGroup/InputGroup.d.ts +4 -4
- package/components/InputGroup/InputGroup.js +22 -21
- package/components/InputGroup/InputGroup.js.map +1 -1
- package/components/InputGroup/index.d.ts +2 -1
- package/components/InputGroup.d.ts +4 -0
- package/components/Modal/Modal.cjs +127 -98
- package/components/Modal/Modal.cjs.map +1 -1
- package/components/Modal/Modal.d.ts +20 -5
- package/components/Modal/Modal.js +130 -101
- package/components/Modal/Modal.js.map +1 -1
- package/components/Modal/ModalBody.d.ts +6 -1
- package/components/Modal/ModalFooter.d.ts +4 -4
- package/components/Modal/ModalHeader.d.ts +6 -1
- package/components/Modal/index.d.ts +4 -2
- package/components/Modal.d.ts +4 -0
- package/components/RadioGroup/RadioGroup.cjs +9 -7
- package/components/RadioGroup/RadioGroup.cjs.map +1 -1
- package/components/RadioGroup/RadioGroup.d.ts +9 -3
- package/components/RadioGroup/RadioGroup.js +9 -7
- package/components/RadioGroup/RadioGroup.js.map +1 -1
- package/components/RadioGroup/index.d.ts +1 -1
- package/components/Select/Select.cjs +129 -264
- package/components/Select/Select.cjs.map +1 -1
- package/components/Select/Select.d.ts +35 -20
- package/components/Select/Select.helpers.d.ts +6 -19
- package/components/Select/Select.js +134 -269
- package/components/Select/Select.js.map +1 -1
- package/components/Select/index.d.ts +1 -1
- package/components/Stat/Stat.cjs +2 -2
- package/components/Stat/Stat.cjs.map +1 -1
- package/components/Stat/Stat.js +2 -2
- package/components/Stat/Stat.js.map +1 -1
- package/components/Stat/index.d.ts +2 -1
- package/components/Stat.d.ts +4 -0
- package/components/StatusMessage/StatusMessage.cjs +84 -55
- package/components/StatusMessage/StatusMessage.cjs.map +1 -1
- package/components/StatusMessage/StatusMessage.d.ts +20 -36
- package/components/StatusMessage/StatusMessage.js +86 -57
- package/components/StatusMessage/StatusMessage.js.map +1 -1
- package/components/StatusMessage/StatusMessageContext.d.ts +16 -0
- package/components/StatusMessage/index.d.ts +4 -1
- package/components/StatusMessage.d.ts +4 -0
- package/components/Stepper/Stepper.cjs +289 -55
- package/components/Stepper/Stepper.cjs.map +1 -1
- package/components/Stepper/Stepper.d.ts +9 -20
- package/components/Stepper/Stepper.js +291 -57
- package/components/Stepper/Stepper.js.map +1 -1
- package/{hooks/Wizard/WizardContext.d.ts → components/Stepper/StepperContext.d.ts} +29 -23
- package/components/Stepper/_hooks/useHorizontalScroll.d.ts +19 -0
- package/components/Stepper/_parts/StepperScrollArrow.d.ts +19 -0
- package/components/Stepper/index.d.ts +6 -2
- package/components/Stepper.d.ts +4 -0
- package/components/Switch/Switch.cjs +5 -2
- package/components/Switch/Switch.cjs.map +1 -1
- package/components/Switch/Switch.d.ts +7 -2
- package/components/Switch/Switch.js +5 -2
- package/components/Switch/Switch.js.map +1 -1
- package/components/Tabs/Tabs.cjs +45 -29
- package/components/Tabs/Tabs.cjs.map +1 -1
- package/components/Tabs/Tabs.d.ts +21 -16
- package/components/Tabs/Tabs.js +46 -30
- package/components/Tabs/Tabs.js.map +1 -1
- package/components/Tabs/index.d.ts +4 -2
- package/components/Tabs.d.ts +4 -0
- package/components/Timeline/Timeline.cjs +3 -2
- package/components/Timeline/Timeline.cjs.map +1 -1
- package/components/Timeline/Timeline.d.ts +4 -8
- package/components/Timeline/Timeline.js +3 -2
- package/components/Timeline/Timeline.js.map +1 -1
- package/components/Timeline/index.d.ts +4 -2
- package/components/Timeline.d.ts +4 -0
- package/components/_shared/mergeSx.d.ts +7 -0
- package/{formField.sx-DfVbMe0V.js → formField.sx-8_QRnKxv.js} +2 -11
- package/formField.sx-8_QRnKxv.js.map +1 -0
- package/{formField.sx-CQ1mbk9M.cjs → formField.sx-BAX7KwMR.cjs} +10 -19
- package/formField.sx-BAX7KwMR.cjs.map +1 -0
- package/index.cjs +31 -2
- package/index.cjs.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +16 -2
- package/index.js.map +1 -1
- package/mergeSx-BXoNZjB_.js +10 -0
- package/mergeSx-BXoNZjB_.js.map +1 -0
- package/mergeSx-Dbccoo_H.cjs +9 -0
- package/mergeSx-Dbccoo_H.cjs.map +1 -0
- package/mui.d.ts +3 -2
- package/package.json +6 -16
- package/theme/componentStyles.d.ts +1 -1
- package/tokens-BRrcP_p_.js +21 -0
- package/tokens-BRrcP_p_.js.map +1 -0
- package/tokens-jaWWNk39.cjs +20 -0
- package/tokens-jaWWNk39.cjs.map +1 -0
- package/utils/index.d.ts +2 -0
- package/{components/ScrollTopButton → utils}/scrollToTop.d.ts +6 -7
- package/components/AppBar/AppBarBrand.d.ts +0 -31
- package/components/AppBar/AppBarUserMenu.d.ts +0 -65
- package/components/Autocomplete/Autocomplete.types.d.ts +0 -1
- package/components/DatePicker/DatePicker.types.d.ts +0 -1
- package/components/DateTimePicker/DateTimePicker.types.d.ts +0 -1
- package/components/Input/Input.types.d.ts +0 -1
- package/components/PageLoader/PageLoader.cjs +0 -61
- package/components/PageLoader/PageLoader.cjs.map +0 -1
- package/components/PageLoader/PageLoader.d.ts +0 -38
- package/components/PageLoader/PageLoader.js +0 -61
- package/components/PageLoader/PageLoader.js.map +0 -1
- package/components/PageLoader/index.d.ts +0 -2
- package/components/PageLoader.d.ts +0 -6
- package/components/RadioGroup/RadioGroup.types.d.ts +0 -1
- package/components/ScrollTopButton/ScrollTopButton.cjs +0 -79
- package/components/ScrollTopButton/ScrollTopButton.cjs.map +0 -1
- package/components/ScrollTopButton/ScrollTopButton.d.ts +0 -48
- package/components/ScrollTopButton/ScrollTopButton.js +0 -79
- package/components/ScrollTopButton/ScrollTopButton.js.map +0 -1
- package/components/ScrollTopButton/index.d.ts +0 -4
- package/components/ScrollTopButton.d.ts +0 -6
- package/components/Select/Select.definitions.d.ts +0 -17
- package/components/Select/Select.types.d.ts +0 -1
- package/components/Select/_parts/SelectSearchHeader.d.ts +0 -15
- package/components/Select/_parts/SelectValue.d.ts +0 -22
- package/formField.sx-CQ1mbk9M.cjs.map +0 -1
- package/formField.sx-DfVbMe0V.js.map +0 -1
- package/hooks/Wizard/Wizard.cjs +0 -7
- package/hooks/Wizard/Wizard.cjs.map +0 -1
- package/hooks/Wizard/Wizard.js +0 -7
- package/hooks/Wizard/Wizard.js.map +0 -1
- package/hooks/Wizard/index.d.ts +0 -3
- package/hooks/Wizard/useWizard.d.ts +0 -9
- package/hooks/Wizard.d.ts +0 -2
- package/useWizard-CWdIxZzX.cjs +0 -94
- package/useWizard-CWdIxZzX.cjs.map +0 -1
- package/useWizard-CWq--C3o.js +0 -95
- package/useWizard-CWq--C3o.js.map +0 -1
- /package/{styles.css → index.css} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stepper.cjs","sources":["../../../src/components/Stepper/Stepper.tsx","../../../src/components/Stepper/Step.tsx"],"sourcesContent":["import React, { ReactElement } from \"react\";\nimport {\n Stepper as MuiStepper,\n Step as MuiStep,\n StepLabel as MuiStepLabel,\n Box,\n useMediaQuery,\n useTheme,\n Breakpoint,\n} from \"@mui/material\";\nimport { StepProps } from \"./Step\";\nimport { useWizard } from \"../../hooks/Wizard\";\n\ninterface MyStepperProps {\n children: ReactElement<StepProps>[];\n orientation?: \"horizontal\" | \"vertical\";\n sx?: object;\n alternateLabel?: boolean;\n /**\n * Índice 0-based del paso activo. Si no se provee, el Stepper intenta\n * leerlo del `WizardContext` (si está dentro de un `<WizardProvider>`).\n * Si tampoco hay provider, el default es 0.\n */\n currentStep?: number;\n /**\n * Cuando es true (default), en pantallas más angostas que `mobileBreakpoint`\n * el stepper horizontal automáticamente:\n * - cambia a orientación vertical si hay >3 steps, o\n * - oculta los labels (solo dots) si hay ≤3 steps,\n * para evitar que se desborde del contenedor.\n * Si pasas `orientation=\"vertical\"` explícito, no se altera.\n */\n responsive?: boolean;\n /** Breakpoint debajo del cual aplica el modo mobile. Default: \"sm\". */\n mobileBreakpoint?: Breakpoint;\n}\n\nexport const Stepper: React.FC<MyStepperProps> = ({\n children,\n orientation = \"horizontal\",\n alternateLabel = false,\n responsive = true,\n mobileBreakpoint = \"sm\",\n sx,\n currentStep: currentStepProp,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down(mobileBreakpoint));\n\n // Solo aplicamos adaptación mobile si el consumer pidió orientación horizontal.\n const mobileAdapt = responsive && isMobile && orientation === \"horizontal\";\n // Con muchos steps no caben aunque ocultes labels → mejor vertical.\n const effectiveOrientation: \"horizontal\" | \"vertical\" =\n mobileAdapt && children.length > 3 ? \"vertical\" : orientation;\n // Con pocos steps conservamos horizontal pero ocultamos labels para no desbordar.\n const hideLabelsOnMobile = mobileAdapt && children.length <= 3;\n const effectiveAlternateLabel =\n alternateLabel && effectiveOrientation === \"horizontal\";\n // Lee el paso desde el WizardContext cuando el consumer no lo pasa como prop.\n // Si el Stepper NO está dentro de un WizardProvider, `useWizard()` devuelve\n // el valor default (currentStep=0, totalSteps=0), así que no rompe nada.\n const wizard = useWizard();\n const currentStep =\n currentStepProp !== undefined\n ? currentStepProp\n : wizard.totalSteps > 0\n ? wizard.currentStep\n : 0;\n\n return (\n <Box sx={{ width: \"100%\", overflowX: \"hidden\", ...sx }}>\n <MuiStepper\n activeStep={currentStep}\n orientation={effectiveOrientation}\n alternativeLabel={effectiveAlternateLabel}\n sx={{\n // En horizontal con muchos labels + poco ancho, permitimos que\n // los labels hagan wrap en lugar de forzar overflow.\n ...(effectiveOrientation === \"horizontal\" && {\n flexWrap: \"wrap\",\n rowGap: 1,\n \"& .MuiStepLabel-label\": { textAlign: \"center\" },\n }),\n }}\n >\n {children.map((child, idx) => {\n const { label, completed, disabled, className, sx: stepSx, dotColor, activeDotColor, completedDotColor, iconTextColor } = child.props;\n return (\n <MuiStep key={idx} completed={completed} disabled={disabled} className={className} sx={stepSx}>\n <MuiStepLabel sx={{\n pointerEvents: 'none',\n // Ocultamos la parte de texto en mobile cuando aplicamos\n // reducción a dots-only. El icono se mantiene visible.\n ...(hideLabelsOnMobile && {\n \"& .MuiStepLabel-labelContainer\": { display: \"none\" },\n }),\n \"& .MuiStepIcon-root\": {\n color: dotColor,\n },\n \"& .MuiStepIcon-active\": {\n color: activeDotColor,\n },\n \"& .MuiStepIcon-completed\": {\n color: completedDotColor,\n },\n \"& .MuiStepIcon-text\": {\n fill: iconTextColor,\n },\n }}\n >{label}\n </MuiStepLabel>\n </MuiStep>\n );\n })}\n </MuiStepper>\n <Box mt={2}>\n {children.map((child, idx) =>\n idx === currentStep ? <Box key={idx}>{child.props.children}</Box> : null\n )}\n </Box>\n </Box>\n );\n};\n\nexport default Stepper;","import React from \"react\";\nimport { StepProps as MuiStepProps } from \"@mui/material\";\n\ntype PickMuiStepProps = Pick<MuiStepProps, \"completed\" | \"disabled\" | \"sx\" | \"className\">;\n\nexport interface StepProps extends PickMuiStepProps {\n label: React.ReactNode;\n children?: React.ReactNode;\n disabled?: boolean;\n sx?: object;\n dotColor?: string; // dot base\n activeDotColor?: string; // dot activa\n completedDotColor?: string; // dot completada\n iconTextColor?: string; // número o check dentro\n}\n\nexport const Step = (_: StepProps): null => null;\n\nStep.displayName = \"Step\";\n\nexport default Step;"],"names":["useTheme","useMediaQuery","useWizard","jsxs","Box","jsx","MuiStepper","MuiStep","MuiStepLabel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAqCO,MAAM,UAAoC,CAAC;AAAA,EAChD;AAAA,EACA,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB;AAAA,EACA,aAAa;AACf,MAAM;AACJ,QAAM,QAAQA,SAAAA,SAAA;AACd,QAAM,WAAWC,SAAAA,cAAc,MAAM,YAAY,KAAK,gBAAgB,CAAC;AAGvE,QAAM,cAAc,cAAc,YAAY,gBAAgB;AAE9D,QAAM,uBACJ,eAAe,SAAS,SAAS,IAAI,aAAa;AAEpD,QAAM,qBAAqB,eAAe,SAAS,UAAU;AAC7D,QAAM,0BACJ,kBAAkB,yBAAyB;AAI7C,QAAM,SAASC,UAAAA,UAAA;AACf,QAAM,cACJ,oBAAoB,SAChB,kBACA,OAAO,aAAa,IAClB,OAAO,cACP;AAER,SACEC,gCAACC,SAAAA,KAAA,EAAI,IAAI,iBAAE,OAAO,QAAQ,WAAW,YAAa,KAChD,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAACC,SAAAA;AAAAA,MAAA;AAAA,QACC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,IAAI,mBAGE,yBAAyB,gBAAgB;AAAA,UAC3C,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,yBAAyB,EAAE,WAAW,SAAA;AAAA,QAAS;AAAA,QAIlD,UAAA,SAAS,IAAI,CAAC,OAAO,QAAQ;AAC5B,gBAAM,EAAE,OAAO,WAAW,UAAU,WAAW,IAAI,QAAQ,UAAU,gBAAgB,mBAAmB,cAAA,IAAkB,MAAM;AAChI,gDACGC,eAAA,EAAkB,WAAsB,UAAoB,WAAsB,IAAI,QACrF,UAAAF,2BAAAA;AAAAA,YAACG,SAAAA;AAAAA,YAAA;AAAA,cAAa,IAAI;AAAA,gBAChB,eAAe;AAAA,iBAGX,sBAAsB;AAAA,gBACxB,kCAAkC,EAAE,SAAS,OAAA;AAAA,cAAO,IALtC;AAAA,gBAOhB,uBAAuB;AAAA,kBACrB,OAAO;AAAA,gBAAA;AAAA,gBAET,yBAAyB;AAAA,kBACvB,OAAO;AAAA,gBAAA;AAAA,gBAET,4BAA4B;AAAA,kBAC1B,OAAO;AAAA,gBAAA;AAAA,gBAET,uBAAuB;AAAA,kBACrB,MAAM;AAAA,gBAAA;AAAA,cACR;AAAA,cAEA,UAAA;AAAA,YAAA;AAAA,UAAA,KArBU,GAuBd;AAAA,QAEJ,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEHH,2BAAAA,IAACD,SAAAA,KAAA,EAAI,IAAI,GACN,UAAA,SAAS;AAAA,MAAI,CAAC,OAAO,QACpB,QAAQ,cAAcC,2BAAAA,IAACD,SAAAA,KAAA,EAAe,UAAA,MAAM,MAAM,SAAA,GAAlB,GAA2B,IAAS;AAAA,IAAA,EACtE,CACF;AAAA,EAAA,GACF;AAEJ;AC1GO,MAAM,OAAO,CAAC,MAAuB;AAE5C,KAAK,cAAc;;;"}
|
|
1
|
+
{"version":3,"file":"Stepper.cjs","sources":["../../../src/components/Stepper/StepperContext.tsx","../../../src/components/Stepper/_hooks/useHorizontalScroll.ts","../../../src/components/Stepper/_parts/StepperScrollArrow.tsx","../../../src/components/Stepper/Stepper.tsx","../../../src/components/Stepper/Step.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type FC,\n type ReactNode,\n} from 'react';\n\n/**\n * API expuesta por `useStepper()`.\n */\nexport interface StepperContextValue {\n /** Índice del paso actual (0-based). */\n currentStep: number;\n /** Total de pasos del stepper. */\n totalSteps: number;\n /** True si `currentStep === 0`. */\n isFirst: boolean;\n /** True si `currentStep === totalSteps - 1`. */\n isLast: boolean;\n /** True tras ejecutar `submitStep()` desde el último paso. */\n completed: boolean;\n /** Avanza al siguiente paso (no pasa de `totalSteps - 1`). */\n nextStep: () => void;\n /** Retrocede al paso anterior (no baja de 0). */\n prevStep: () => void;\n /** Salta a un paso específico (0-based). No-op si fuera de rango. */\n goToStep: (stepNumber: number) => void;\n /**\n * Envía el stepper. Marca `completed = true` y dispara el callback\n * `onSubmit` del provider. En el último paso suele reemplazar a `nextStep`.\n */\n submitStep: () => void;\n /** Resetea al paso inicial y limpia `completed`. */\n reset: () => void;\n}\n\nconst defaultValue: StepperContextValue = {\n currentStep: 0,\n totalSteps: 0,\n isFirst: true,\n isLast: true,\n completed: false,\n nextStep: () => {},\n prevStep: () => {},\n goToStep: () => {},\n submitStep: () => {},\n reset: () => {},\n};\n\nexport const StepperContext = createContext<StepperContextValue>(defaultValue);\n\n/**\n * Hook para consumir el `StepperContext` desde cualquier descendiente de\n * `<StepperProvider>`.\n *\n * Si se llama fuera de un provider, devuelve los valores por defecto (no-op)\n * para que componentes como `<Stepper>` puedan leerlo sin romper cuando no\n * hay provider envolvente.\n */\nexport function useStepper(): StepperContextValue {\n return useContext(StepperContext);\n}\n\nexport interface StepperProviderProps {\n /** Número total de pasos. Requerido. */\n totalSteps: number;\n /** Paso inicial (0-based). Default: 0. */\n initialStep?: number;\n /**\n * Callback disparado cuando se llama `submitStep()`. Recibe el paso actual.\n * El paquete NO ejecuta ninguna petición; queda a cargo del consumer.\n */\n onSubmit?: (currentStep: number) => void;\n /**\n * Callback disparado en cada cambio de paso (next/prev/goTo).\n * Útil para tracking o validaciones externas.\n */\n onStepChange?: (newStep: number, prevStep: number) => void;\n children?: ReactNode;\n}\n\n/**\n * Provider del stepper. Administra el `currentStep` internamente. El consumer\n * no necesita gestionar estado — solo consumirlo con `useStepper()` desde\n * cualquier descendiente.\n *\n * ```tsx\n * <StepperProvider totalSteps={3} onSubmit={handleFinalSubmit}>\n * <Stepper>\n * <Step label=\"Paso 1\"><StepOne /></Step>\n * <Step label=\"Paso 2\"><StepTwo /></Step>\n * <Step label=\"Paso 3\"><StepThree /></Step>\n * </Stepper>\n * <StepperControls />\n * </StepperProvider>\n * ```\n */\nexport const StepperProvider: FC<StepperProviderProps> = ({\n totalSteps,\n initialStep = 0,\n onSubmit,\n onStepChange,\n children,\n}) => {\n const [currentStep, setCurrentStep] = useState(initialStep);\n const [completed, setCompleted] = useState(false);\n\n const changeStep = useCallback(\n (newStep: number) => {\n if (newStep < 0 || newStep >= totalSteps) return;\n if (newStep === currentStep) return;\n onStepChange?.(newStep, currentStep);\n setCurrentStep(newStep);\n },\n [currentStep, totalSteps, onStepChange],\n );\n\n const nextStep = useCallback(() => {\n changeStep(currentStep + 1);\n }, [changeStep, currentStep]);\n\n const prevStep = useCallback(() => {\n changeStep(currentStep - 1);\n }, [changeStep, currentStep]);\n\n const goToStep = useCallback(\n (stepNumber: number) => {\n changeStep(stepNumber);\n },\n [changeStep],\n );\n\n const submitStep = useCallback(() => {\n setCompleted(true);\n onSubmit?.(currentStep);\n }, [currentStep, onSubmit]);\n\n const reset = useCallback(() => {\n setCurrentStep(initialStep);\n setCompleted(false);\n }, [initialStep]);\n\n const value = useMemo<StepperContextValue>(\n () => ({\n currentStep,\n totalSteps,\n isFirst: currentStep === 0,\n isLast: currentStep === totalSteps - 1,\n completed,\n nextStep,\n prevStep,\n goToStep,\n submitStep,\n reset,\n }),\n [\n currentStep,\n totalSteps,\n completed,\n nextStep,\n prevStep,\n goToStep,\n submitStep,\n reset,\n ],\n );\n\n return (\n <StepperContext.Provider value={value}>{children}</StepperContext.Provider>\n );\n};\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\n/**\n * Hook interno del Stepper para manejar scroll horizontal cuando los steps\n * no caben en el contenedor. No se exporta desde el barrel — es un detalle\n * de implementación.\n *\n * @param enabled - Si el scroll está activo (típicamente sólo en orientación horizontal).\n * @param deps - Cosas que afectan el layout y disparan un recompute (ej. cantidad de steps, paso activo).\n *\n * Retorna:\n * - `scrollRef`: ref a asignar al contenedor con `overflow-x: auto`.\n * - `canScrollLeft` / `canScrollRight`: flags para habilitar/deshabilitar flechas.\n * - `scrollBy(delta)`: imperativo con scroll suave.\n */\nexport function useHorizontalScroll(enabled: boolean, deps: unknown[] = []) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n\n const updateScrollState = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const { scrollLeft, scrollWidth, clientWidth } = el;\n // Tolerancia de 1px por redondeos de subpixel.\n setCanScrollLeft(scrollLeft > 1);\n setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n }, []);\n\n useLayoutEffect(() => {\n if (!enabled) return;\n updateScrollState();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, updateScrollState, ...deps]);\n\n useEffect(() => {\n if (!enabled) return;\n const el = scrollRef.current;\n if (!el) return;\n el.addEventListener('scroll', updateScrollState, { passive: true });\n const ro = new ResizeObserver(updateScrollState);\n ro.observe(el);\n return () => {\n el.removeEventListener('scroll', updateScrollState);\n ro.disconnect();\n };\n }, [enabled, updateScrollState]);\n\n const scrollBy = useCallback((delta: number) => {\n const el = scrollRef.current;\n if (!el) return;\n el.scrollBy({ left: delta, behavior: 'smooth' });\n }, []);\n\n return { scrollRef, canScrollLeft, canScrollRight, scrollBy };\n}\n","import { IconButton } from '@mui/material';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\n\ninterface StepperScrollArrowProps {\n direction: 'left' | 'right';\n /** Cuando `false`, el botón está deshabilitado (por ejemplo, ya estás al inicio). */\n enabled: boolean;\n /**\n * Cuando `false`, el botón queda con `visibility: hidden` (reserva su\n * espacio pero no se ve). Útil para que el área de scroll no se corra\n * horizontalmente cuando no hay overflow en ningún lado.\n */\n visible: boolean;\n onClick: () => void;\n}\n\n/**\n * Flecha de scroll (`<` / `>`) del Stepper horizontal. Se muestra a los\n * costados del área scrollable cuando hay overflow. Componente privado —\n * no se exporta del barrel.\n */\nexport const StepperScrollArrow = ({\n direction,\n enabled,\n visible,\n onClick,\n}: StepperScrollArrowProps) => {\n const isLeft = direction === 'left';\n const Icon = isLeft ? ChevronLeftIcon : ChevronRightIcon;\n const ariaLabel = isLeft ? 'Anterior' : 'Siguiente';\n\n return (\n <IconButton\n aria-label={ariaLabel}\n size=\"small\"\n onClick={onClick}\n disabled={!enabled}\n sx={{\n flex: '0 0 auto',\n // Reservamos el slot siempre que haya overflow en algún lado,\n // así el área scroll tiene un ancho estable (no saltan los\n // steps cuando aparece/desaparece la flecha).\n visibility: visible ? 'visible' : 'hidden',\n }}\n >\n <Icon fontSize=\"small\" />\n </IconButton>\n );\n};\n","import {\n Children,\n isValidElement,\n type FC,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport {\n Stepper as MuiStepper,\n Step as MuiStep,\n StepLabel as MuiStepLabel,\n Box,\n} from '@mui/material';\n\nimport { StepProps } from './Step';\nimport { useStepper } from './StepperContext';\nimport { useHorizontalScroll } from './_hooks/useHorizontalScroll';\nimport { StepperScrollArrow } from './_parts/StepperScrollArrow';\n\nexport interface StepperProps {\n /** Uno o varios `<Step>`. Children que no sean `<Step>` se ignoran. */\n children: ReactNode;\n orientation?: 'horizontal' | 'vertical';\n alternateLabel?: boolean;\n /**\n * Índice 0-based del paso activo. Si no se provee, el Stepper intenta\n * leerlo del `StepperContext` (si está dentro de un `<StepperProvider>`).\n * Si tampoco hay provider, el default es 0.\n */\n currentStep?: number;\n keepMounted?: boolean;\n sx?: object;\n}\n\nexport const Stepper: FC<StepperProps> = ({\n children,\n orientation = 'horizontal',\n alternateLabel = false,\n currentStep: currentStepProp,\n keepMounted = false,\n sx,\n}) => {\n // Lee el paso desde el StepperContext cuando el consumer no lo pasa como prop.\n const stepperCtx = useStepper();\n const currentStep =\n currentStepProp !== undefined\n ? currentStepProp\n : stepperCtx.totalSteps > 0\n ? stepperCtx.currentStep\n : 0;\n\n const isHorizontal = orientation === 'horizontal';\n\n // Filtra los children a los que tengan displayName=\"Step\" — acepta arrays,\n // single child, fragments, y descarta cualquier otra cosa (strings, null, etc.).\n const steps: ReactElement<StepProps>[] = Children.toArray(children).filter(\n (child): child is ReactElement<StepProps> =>\n isValidElement(child) &&\n (child.type as { displayName?: string })?.displayName === 'Step',\n );\n\n const { scrollRef, canScrollLeft, canScrollRight, scrollBy } = useHorizontalScroll(\n isHorizontal,\n [steps.length, currentStep],\n );\n\n const showArrows = isHorizontal && (canScrollLeft || canScrollRight);\n\n return (\n <Box sx={sx}>\n <Box\n sx={\n isHorizontal\n ? { display: 'flex', alignItems: 'center', width: '100%', gap: 0.5 }\n : undefined\n }\n >\n {isHorizontal && (\n <StepperScrollArrow\n direction=\"left\"\n enabled={canScrollLeft}\n visible={showArrows}\n onClick={() => scrollBy(-160)}\n />\n )}\n <Box\n ref={scrollRef}\n sx={\n isHorizontal\n ? {\n flex: '1 1 auto',\n minWidth: 0,\n overflowX: 'auto',\n scrollBehavior: 'smooth',\n WebkitOverflowScrolling: 'touch',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n }\n : undefined\n }\n >\n <MuiStepper\n activeStep={currentStep}\n orientation={orientation}\n alternativeLabel={alternateLabel}\n sx={{\n ...(isHorizontal && {\n display: 'inline-flex',\n flexWrap: 'nowrap',\n minWidth: '100%',\n width: 'max-content',\n '& .MuiStep-root': { flex: '0 0 auto', minWidth: 120 },\n }),\n ...(alternateLabel && { justifyContent: 'center' }),\n }}\n >\n {steps.map((step, idx) => {\n const {\n label,\n completed,\n disabled,\n className,\n sx: stepSx,\n dotColor,\n activeDotColor,\n completedDotColor,\n iconTextColor,\n } = step.props;\n const key = step.key ?? idx;\n return (\n <MuiStep\n key={key}\n completed={completed}\n disabled={disabled}\n className={className}\n sx={stepSx}\n >\n <MuiStepLabel\n sx={{\n pointerEvents: 'none',\n '& .MuiStepIcon-root': { color: dotColor },\n '& .MuiStepIcon-active': { color: activeDotColor },\n '& .MuiStepIcon-completed': { color: completedDotColor },\n '& .MuiStepIcon-text': { fill: iconTextColor },\n }}\n >\n {label}\n </MuiStepLabel>\n </MuiStep>\n );\n })}\n </MuiStepper>\n </Box>\n {isHorizontal && (\n <StepperScrollArrow\n direction=\"right\"\n enabled={canScrollRight}\n visible={showArrows}\n onClick={() => scrollBy(160)}\n />\n )}\n </Box>\n\n {/* Cuerpos de los steps — render según el modo `keepMounted` */}\n <Box mt={2}\n sx={{\n display: 'flex',\n justifyContent: 'center',\n }}>\n {keepMounted\n ? steps.map((step, idx) => {\n const key = step.key ?? idx;\n const isActive = idx === currentStep;\n return (\n <Box\n key={key}\n // `display: none` mantiene el nodo en el DOM — state de los\n // hijos (inputs, useState, etc.) no se pierde al navegar.\n sx={{ display: isActive ? 'block' : 'none', width: '100%' }}\n // Accesibilidad: oculta del flujo de lectura pero no del DOM.\n aria-hidden={!isActive}\n >\n {step.props.children}\n </Box>\n );\n })\n : steps.map((step, idx) => {\n if (idx !== currentStep) return null;\n const key = step.key ?? idx;\n return <Box key={key}>{step.props.children}</Box>;\n })}\n </Box>\n </Box>\n );\n};\n\nexport default Stepper;\n","import React from \"react\";\nimport { StepProps as MuiStepProps } from \"@mui/material\";\n\ntype PickMuiStepProps = Pick<MuiStepProps, \"completed\" | \"disabled\" | \"sx\" | \"className\">;\n\nexport interface StepProps extends PickMuiStepProps {\n label: React.ReactNode;\n children?: React.ReactNode;\n disabled?: boolean;\n sx?: object;\n dotColor?: string; // dot base\n activeDotColor?: string; // dot activa\n completedDotColor?: string; // dot completada\n iconTextColor?: string; // número o check dentro\n}\n\nexport const Step = (_: StepProps): null => null;\n\nStep.displayName = \"Step\";\n\nexport default Step;"],"names":["createContext","useContext","useState","useCallback","useMemo","jsx","useRef","useLayoutEffect","useEffect","IconButton","Children","isValidElement","jsxs","Box","MuiStepper","MuiStep","MuiStepLabel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAM,eAAoC;AAAA,EACxC,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU,MAAM;AAAA,EAAC;AAAA,EACjB,UAAU,MAAM;AAAA,EAAC;AAAA,EACjB,UAAU,MAAM;AAAA,EAAC;AAAA,EACjB,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,OAAO,MAAM;AAAA,EAAC;AAChB;AAEO,MAAM,iBAAiBA,MAAAA,cAAmC,YAAY;AAUtE,SAAS,aAAkC;AAChD,SAAOC,MAAAA,WAAW,cAAc;AAClC;AAoCO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,aAAa,cAAc,IAAIC,MAAAA,SAAS,WAAW;AAC1D,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,KAAK;AAEhD,QAAM,aAAaC,MAAAA;AAAAA,IACjB,CAAC,YAAoB;AACnB,UAAI,UAAU,KAAK,WAAW,WAAY;AAC1C,UAAI,YAAY,YAAa;AAC7B,mDAAe,SAAS;AACxB,qBAAe,OAAO;AAAA,IACxB;AAAA,IACA,CAAC,aAAa,YAAY,YAAY;AAAA,EAAA;AAGxC,QAAM,WAAWA,MAAAA,YAAY,MAAM;AACjC,eAAW,cAAc,CAAC;AAAA,EAC5B,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,WAAWA,MAAAA,YAAY,MAAM;AACjC,eAAW,cAAc,CAAC;AAAA,EAC5B,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,WAAWA,MAAAA;AAAAA,IACf,CAAC,eAAuB;AACtB,iBAAW,UAAU;AAAA,IACvB;AAAA,IACA,CAAC,UAAU;AAAA,EAAA;AAGb,QAAM,aAAaA,MAAAA,YAAY,MAAM;AACnC,iBAAa,IAAI;AACjB,yCAAW;AAAA,EACb,GAAG,CAAC,aAAa,QAAQ,CAAC;AAE1B,QAAM,QAAQA,MAAAA,YAAY,MAAM;AAC9B,mBAAe,WAAW;AAC1B,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,QAAQC,MAAAA;AAAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,gBAAgB;AAAA,MACzB,QAAQ,gBAAgB,aAAa;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAGF,SACEC,2BAAAA,IAAC,eAAe,UAAf,EAAwB,OAAe,SAAA,CAAS;AAErD;AC9JO,SAAS,oBAAoB,SAAkB,OAAkB,IAAI;AAC1E,QAAM,YAAYC,MAAAA,OAA8B,IAAI;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAIJ,MAAAA,SAAS,KAAK;AACxD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAS,KAAK;AAE1D,QAAM,oBAAoBC,MAAAA,YAAY,MAAM;AAC1C,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,UAAM,EAAE,YAAY,aAAa,YAAA,IAAgB;AAEjD,qBAAiB,aAAa,CAAC;AAC/B,sBAAkB,aAAa,cAAc,cAAc,CAAC;AAAA,EAC9D,GAAG,CAAA,CAAE;AAELI,QAAAA,gBAAgB,MAAM;AACpB,QAAI,CAAC,QAAS;AACd,sBAAA;AAAA,EAEF,GAAG,CAAC,SAAS,mBAAmB,GAAG,IAAI,CAAC;AAExCC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,OAAG,iBAAiB,UAAU,mBAAmB,EAAE,SAAS,MAAM;AAClE,UAAM,KAAK,IAAI,eAAe,iBAAiB;AAC/C,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM;AACX,SAAG,oBAAoB,UAAU,iBAAiB;AAClD,SAAG,WAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC,SAAS,iBAAiB,CAAC;AAE/B,QAAM,WAAWL,kBAAY,CAAC,UAAkB;AAC9C,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,GAAI;AACT,OAAG,SAAS,EAAE,MAAM,OAAO,UAAU,UAAU;AAAA,EACjD,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,WAAW,eAAe,gBAAgB,SAAA;AACrD;ACjCO,MAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA+B;AAC7B,QAAM,SAAS,cAAc;AAC7B,QAAM,OAAO,SAAS,kBAAkB;AACxC,QAAM,YAAY,SAAS,aAAa;AAExC,SACEE,2BAAAA;AAAAA,IAACI,SAAAA;AAAAA,IAAA;AAAA,MACC,cAAY;AAAA,MACZ,MAAK;AAAA,MACL;AAAA,MACA,UAAU,CAAC;AAAA,MACX,IAAI;AAAA,QACF,MAAM;AAAA;AAAA;AAAA;AAAA,QAIN,YAAY,UAAU,YAAY;AAAA,MAAA;AAAA,MAGpC,UAAAJ,2BAAAA,IAAC,MAAA,EAAK,UAAS,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA;AAG7B;ACfO,MAAM,UAA4B,CAAC;AAAA,EACxC;AAAA,EACA,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AACF,MAAM;AAEJ,QAAM,aAAa,WAAA;AACnB,QAAM,cACJ,oBAAoB,SAChB,kBACA,WAAW,aAAa,IACtB,WAAW,cACX;AAER,QAAM,eAAe,gBAAgB;AAIrC,QAAM,QAAmCK,MAAAA,SAAS,QAAQ,QAAQ,EAAE;AAAA,IAClE,CAAC,UAAA;;AACCC,mBAAAA,eAAe,KAAK,OACnB,WAAM,SAAN,mBAAyC,iBAAgB;AAAA;AAAA,EAAA;AAG9D,QAAM,EAAE,WAAW,eAAe,gBAAgB,aAAa;AAAA,IAC7D;AAAA,IACA,CAAC,MAAM,QAAQ,WAAW;AAAA,EAAA;AAG5B,QAAM,aAAa,iBAAiB,iBAAiB;AAErD,SACEC,gCAACC,SAAAA,OAAI,IACH,UAAA;AAAA,IAAAD,2BAAAA;AAAAA,MAACC,SAAAA;AAAAA,MAAA;AAAA,QACC,IACE,eACI,EAAE,SAAS,QAAQ,YAAY,UAAU,OAAO,QAAQ,KAAK,IAAA,IAC7D;AAAA,QAGL,UAAA;AAAA,UAAA,gBACCR,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS;AAAA,cACT,SAAS;AAAA,cACT,SAAS,MAAM,SAAS,IAAI;AAAA,YAAA;AAAA,UAAA;AAAA,UAGhCA,2BAAAA;AAAAA,YAACQ,SAAAA;AAAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL,IACE,eACI;AAAA,gBACA,MAAM;AAAA,gBACN,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,gBAAgB;AAAA,gBAChB,yBAAyB;AAAA,gBACzB,gBAAgB;AAAA,gBAChB,wBAAwB,EAAE,SAAS,OAAA;AAAA,cAAO,IAE1C;AAAA,cAGN,UAAAR,2BAAAA;AAAAA,gBAACS,SAAAA;AAAAA,gBAAA;AAAA,kBACC,YAAY;AAAA,kBACZ;AAAA,kBACA,kBAAkB;AAAA,kBAClB,IAAI,kCACE,gBAAgB;AAAA,oBAClB,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,mBAAmB,EAAE,MAAM,YAAY,UAAU,IAAA;AAAA,kBAAI,IAEnD,kBAAkB,EAAE,gBAAgB,SAAA;AAAA,kBAGzC,UAAA,MAAM,IAAI,CAAC,MAAM,QAAQ;;AACxB,0BAAM;AAAA,sBACJ;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,IAAI;AAAA,sBACJ;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBAAA,IACE,KAAK;AACT,0BAAM,OAAM,UAAK,QAAL,YAAY;AACxB,2BACET,2BAAAA;AAAAA,sBAACU,SAAAA;AAAAA,sBAAA;AAAA,wBAEC;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA,IAAI;AAAA,wBAEJ,UAAAV,2BAAAA;AAAAA,0BAACW,SAAAA;AAAAA,0BAAA;AAAA,4BACC,IAAI;AAAA,8BACF,eAAe;AAAA,8BACf,uBAAuB,EAAE,OAAO,SAAA;AAAA,8BAChC,yBAAyB,EAAE,OAAO,eAAA;AAAA,8BAClC,4BAA4B,EAAE,OAAO,kBAAA;AAAA,8BACrC,uBAAuB,EAAE,MAAM,cAAA;AAAA,4BAAc;AAAA,4BAG9C,UAAA;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBACH;AAAA,sBAhBK;AAAA,oBAAA;AAAA,kBAmBX,CAAC;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH;AAAA,UAAA;AAAA,UAED,gBACCX,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS;AAAA,cACT,SAAS;AAAA,cACT,SAAS,MAAM,SAAS,GAAG;AAAA,YAAA;AAAA,UAAA;AAAA,QAC7B;AAAA,MAAA;AAAA,IAAA;AAAA,IAKJA,2BAAAA;AAAAA,MAACQ,SAAAA;AAAAA,MAAA;AAAA,QAAI,IAAI;AAAA,QACP,IAAI;AAAA,UACF,SAAS;AAAA,UACT,gBAAgB;AAAA,QAAA;AAAA,QAEjB,UAAA,cACG,MAAM,IAAI,CAAC,MAAM,QAAQ;;AACzB,gBAAM,OAAM,UAAK,QAAL,YAAY;AACxB,gBAAM,WAAW,QAAQ;AACzB,iBACER,2BAAAA;AAAAA,YAACQ,SAAAA;AAAAA,YAAA;AAAA,cAIC,IAAI,EAAE,SAAS,WAAW,UAAU,QAAQ,OAAO,OAAA;AAAA,cAEnD,eAAa,CAAC;AAAA,cAEb,eAAK,MAAM;AAAA,YAAA;AAAA,YAPP;AAAA,UAAA;AAAA,QAUX,CAAC,IACC,MAAM,IAAI,CAAC,MAAM,QAAQ;;AACzB,cAAI,QAAQ,YAAa,QAAO;AAChC,gBAAM,OAAM,UAAK,QAAL,YAAY;AACxB,iBAAOR,2BAAAA,IAACQ,SAAAA,KAAA,EAAe,UAAA,KAAK,MAAM,YAAjB,GAA0B;AAAA,QAC7C,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GACF;AAEJ;AClLO,MAAM,OAAO,CAAC,MAAuB;AAE5C,KAAK,cAAc;;;;;;;"}
|
|
@@ -1,28 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
orientation?: "horizontal" | "vertical";
|
|
7
|
-
sx?: object;
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
|
+
export interface StepperProps {
|
|
3
|
+
/** Uno o varios `<Step>`. Children que no sean `<Step>` se ignoran. */
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
orientation?: 'horizontal' | 'vertical';
|
|
8
6
|
alternateLabel?: boolean;
|
|
9
7
|
/**
|
|
10
8
|
* Índice 0-based del paso activo. Si no se provee, el Stepper intenta
|
|
11
|
-
* leerlo del `
|
|
9
|
+
* leerlo del `StepperContext` (si está dentro de un `<StepperProvider>`).
|
|
12
10
|
* Si tampoco hay provider, el default es 0.
|
|
13
11
|
*/
|
|
14
12
|
currentStep?: number;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
* el stepper horizontal automáticamente:
|
|
18
|
-
* - cambia a orientación vertical si hay >3 steps, o
|
|
19
|
-
* - oculta los labels (solo dots) si hay ≤3 steps,
|
|
20
|
-
* para evitar que se desborde del contenedor.
|
|
21
|
-
* Si pasas `orientation="vertical"` explícito, no se altera.
|
|
22
|
-
*/
|
|
23
|
-
responsive?: boolean;
|
|
24
|
-
/** Breakpoint debajo del cual aplica el modo mobile. Default: "sm". */
|
|
25
|
-
mobileBreakpoint?: Breakpoint;
|
|
13
|
+
keepMounted?: boolean;
|
|
14
|
+
sx?: object;
|
|
26
15
|
}
|
|
27
|
-
export declare const Stepper:
|
|
16
|
+
export declare const Stepper: FC<StepperProps>;
|
|
28
17
|
export default Stepper;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defProps = Object.defineProperties;
|
|
3
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
2
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
3
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
4
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -16,77 +14,313 @@ var __spreadValues = (a, b) => {
|
|
|
16
14
|
}
|
|
17
15
|
return a;
|
|
18
16
|
};
|
|
19
|
-
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import
|
|
17
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
import { createContext, useState, useCallback, useMemo, useContext, useRef, useLayoutEffect, useEffect, Children, isValidElement } from "react";
|
|
19
|
+
import { IconButton, Box, Stepper as Stepper$1, Step as Step$1, StepLabel } from "@mui/material";
|
|
20
|
+
import ChevronLeftIcon from "@mui/icons-material/ChevronLeft";
|
|
21
|
+
import ChevronRightIcon from "@mui/icons-material/ChevronRight";
|
|
22
|
+
const defaultValue = {
|
|
23
|
+
currentStep: 0,
|
|
24
|
+
totalSteps: 0,
|
|
25
|
+
isFirst: true,
|
|
26
|
+
isLast: true,
|
|
27
|
+
completed: false,
|
|
28
|
+
nextStep: () => {
|
|
29
|
+
},
|
|
30
|
+
prevStep: () => {
|
|
31
|
+
},
|
|
32
|
+
goToStep: () => {
|
|
33
|
+
},
|
|
34
|
+
submitStep: () => {
|
|
35
|
+
},
|
|
36
|
+
reset: () => {
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const StepperContext = createContext(defaultValue);
|
|
40
|
+
function useStepper() {
|
|
41
|
+
return useContext(StepperContext);
|
|
42
|
+
}
|
|
43
|
+
const StepperProvider = ({
|
|
44
|
+
totalSteps,
|
|
45
|
+
initialStep = 0,
|
|
46
|
+
onSubmit,
|
|
47
|
+
onStepChange,
|
|
48
|
+
children
|
|
49
|
+
}) => {
|
|
50
|
+
const [currentStep, setCurrentStep] = useState(initialStep);
|
|
51
|
+
const [completed, setCompleted] = useState(false);
|
|
52
|
+
const changeStep = useCallback(
|
|
53
|
+
(newStep) => {
|
|
54
|
+
if (newStep < 0 || newStep >= totalSteps) return;
|
|
55
|
+
if (newStep === currentStep) return;
|
|
56
|
+
onStepChange == null ? void 0 : onStepChange(newStep, currentStep);
|
|
57
|
+
setCurrentStep(newStep);
|
|
58
|
+
},
|
|
59
|
+
[currentStep, totalSteps, onStepChange]
|
|
60
|
+
);
|
|
61
|
+
const nextStep = useCallback(() => {
|
|
62
|
+
changeStep(currentStep + 1);
|
|
63
|
+
}, [changeStep, currentStep]);
|
|
64
|
+
const prevStep = useCallback(() => {
|
|
65
|
+
changeStep(currentStep - 1);
|
|
66
|
+
}, [changeStep, currentStep]);
|
|
67
|
+
const goToStep = useCallback(
|
|
68
|
+
(stepNumber) => {
|
|
69
|
+
changeStep(stepNumber);
|
|
70
|
+
},
|
|
71
|
+
[changeStep]
|
|
72
|
+
);
|
|
73
|
+
const submitStep = useCallback(() => {
|
|
74
|
+
setCompleted(true);
|
|
75
|
+
onSubmit == null ? void 0 : onSubmit(currentStep);
|
|
76
|
+
}, [currentStep, onSubmit]);
|
|
77
|
+
const reset = useCallback(() => {
|
|
78
|
+
setCurrentStep(initialStep);
|
|
79
|
+
setCompleted(false);
|
|
80
|
+
}, [initialStep]);
|
|
81
|
+
const value = useMemo(
|
|
82
|
+
() => ({
|
|
83
|
+
currentStep,
|
|
84
|
+
totalSteps,
|
|
85
|
+
isFirst: currentStep === 0,
|
|
86
|
+
isLast: currentStep === totalSteps - 1,
|
|
87
|
+
completed,
|
|
88
|
+
nextStep,
|
|
89
|
+
prevStep,
|
|
90
|
+
goToStep,
|
|
91
|
+
submitStep,
|
|
92
|
+
reset
|
|
93
|
+
}),
|
|
94
|
+
[
|
|
95
|
+
currentStep,
|
|
96
|
+
totalSteps,
|
|
97
|
+
completed,
|
|
98
|
+
nextStep,
|
|
99
|
+
prevStep,
|
|
100
|
+
goToStep,
|
|
101
|
+
submitStep,
|
|
102
|
+
reset
|
|
103
|
+
]
|
|
104
|
+
);
|
|
105
|
+
return /* @__PURE__ */ jsx(StepperContext.Provider, { value, children });
|
|
106
|
+
};
|
|
107
|
+
function useHorizontalScroll(enabled, deps = []) {
|
|
108
|
+
const scrollRef = useRef(null);
|
|
109
|
+
const [canScrollLeft, setCanScrollLeft] = useState(false);
|
|
110
|
+
const [canScrollRight, setCanScrollRight] = useState(false);
|
|
111
|
+
const updateScrollState = useCallback(() => {
|
|
112
|
+
const el = scrollRef.current;
|
|
113
|
+
if (!el) return;
|
|
114
|
+
const { scrollLeft, scrollWidth, clientWidth } = el;
|
|
115
|
+
setCanScrollLeft(scrollLeft > 1);
|
|
116
|
+
setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);
|
|
117
|
+
}, []);
|
|
118
|
+
useLayoutEffect(() => {
|
|
119
|
+
if (!enabled) return;
|
|
120
|
+
updateScrollState();
|
|
121
|
+
}, [enabled, updateScrollState, ...deps]);
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
if (!enabled) return;
|
|
124
|
+
const el = scrollRef.current;
|
|
125
|
+
if (!el) return;
|
|
126
|
+
el.addEventListener("scroll", updateScrollState, { passive: true });
|
|
127
|
+
const ro = new ResizeObserver(updateScrollState);
|
|
128
|
+
ro.observe(el);
|
|
129
|
+
return () => {
|
|
130
|
+
el.removeEventListener("scroll", updateScrollState);
|
|
131
|
+
ro.disconnect();
|
|
132
|
+
};
|
|
133
|
+
}, [enabled, updateScrollState]);
|
|
134
|
+
const scrollBy = useCallback((delta) => {
|
|
135
|
+
const el = scrollRef.current;
|
|
136
|
+
if (!el) return;
|
|
137
|
+
el.scrollBy({ left: delta, behavior: "smooth" });
|
|
138
|
+
}, []);
|
|
139
|
+
return { scrollRef, canScrollLeft, canScrollRight, scrollBy };
|
|
140
|
+
}
|
|
141
|
+
const StepperScrollArrow = ({
|
|
142
|
+
direction,
|
|
143
|
+
enabled,
|
|
144
|
+
visible,
|
|
145
|
+
onClick
|
|
146
|
+
}) => {
|
|
147
|
+
const isLeft = direction === "left";
|
|
148
|
+
const Icon = isLeft ? ChevronLeftIcon : ChevronRightIcon;
|
|
149
|
+
const ariaLabel = isLeft ? "Anterior" : "Siguiente";
|
|
150
|
+
return /* @__PURE__ */ jsx(
|
|
151
|
+
IconButton,
|
|
152
|
+
{
|
|
153
|
+
"aria-label": ariaLabel,
|
|
154
|
+
size: "small",
|
|
155
|
+
onClick,
|
|
156
|
+
disabled: !enabled,
|
|
157
|
+
sx: {
|
|
158
|
+
flex: "0 0 auto",
|
|
159
|
+
// Reservamos el slot siempre que haya overflow en algún lado,
|
|
160
|
+
// así el área scroll tiene un ancho estable (no saltan los
|
|
161
|
+
// steps cuando aparece/desaparece la flecha).
|
|
162
|
+
visibility: visible ? "visible" : "hidden"
|
|
163
|
+
},
|
|
164
|
+
children: /* @__PURE__ */ jsx(Icon, { fontSize: "small" })
|
|
165
|
+
}
|
|
166
|
+
);
|
|
167
|
+
};
|
|
23
168
|
const Stepper = ({
|
|
24
169
|
children,
|
|
25
170
|
orientation = "horizontal",
|
|
26
171
|
alternateLabel = false,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
sx
|
|
30
|
-
currentStep: currentStepProp
|
|
172
|
+
currentStep: currentStepProp,
|
|
173
|
+
keepMounted = false,
|
|
174
|
+
sx
|
|
31
175
|
}) => {
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
176
|
+
const stepperCtx = useStepper();
|
|
177
|
+
const currentStep = currentStepProp !== void 0 ? currentStepProp : stepperCtx.totalSteps > 0 ? stepperCtx.currentStep : 0;
|
|
178
|
+
const isHorizontal = orientation === "horizontal";
|
|
179
|
+
const steps = Children.toArray(children).filter(
|
|
180
|
+
(child) => {
|
|
181
|
+
var _a;
|
|
182
|
+
return isValidElement(child) && ((_a = child.type) == null ? void 0 : _a.displayName) === "Step";
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
const { scrollRef, canScrollLeft, canScrollRight, scrollBy } = useHorizontalScroll(
|
|
186
|
+
isHorizontal,
|
|
187
|
+
[steps.length, currentStep]
|
|
188
|
+
);
|
|
189
|
+
const showArrows = isHorizontal && (canScrollLeft || canScrollRight);
|
|
190
|
+
return /* @__PURE__ */ jsxs(Box, { sx, children: [
|
|
191
|
+
/* @__PURE__ */ jsxs(
|
|
192
|
+
Box,
|
|
43
193
|
{
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
194
|
+
sx: isHorizontal ? { display: "flex", alignItems: "center", width: "100%", gap: 0.5 } : void 0,
|
|
195
|
+
children: [
|
|
196
|
+
isHorizontal && /* @__PURE__ */ jsx(
|
|
197
|
+
StepperScrollArrow,
|
|
198
|
+
{
|
|
199
|
+
direction: "left",
|
|
200
|
+
enabled: canScrollLeft,
|
|
201
|
+
visible: showArrows,
|
|
202
|
+
onClick: () => scrollBy(-160)
|
|
203
|
+
}
|
|
204
|
+
),
|
|
205
|
+
/* @__PURE__ */ jsx(
|
|
206
|
+
Box,
|
|
56
207
|
{
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
208
|
+
ref: scrollRef,
|
|
209
|
+
sx: isHorizontal ? {
|
|
210
|
+
flex: "1 1 auto",
|
|
211
|
+
minWidth: 0,
|
|
212
|
+
overflowX: "auto",
|
|
213
|
+
scrollBehavior: "smooth",
|
|
214
|
+
WebkitOverflowScrolling: "touch",
|
|
215
|
+
scrollbarWidth: "none",
|
|
216
|
+
"&::-webkit-scrollbar": { display: "none" }
|
|
217
|
+
} : void 0,
|
|
218
|
+
children: /* @__PURE__ */ jsx(
|
|
219
|
+
Stepper$1,
|
|
220
|
+
{
|
|
221
|
+
activeStep: currentStep,
|
|
222
|
+
orientation,
|
|
223
|
+
alternativeLabel: alternateLabel,
|
|
224
|
+
sx: __spreadValues(__spreadValues({}, isHorizontal && {
|
|
225
|
+
display: "inline-flex",
|
|
226
|
+
flexWrap: "nowrap",
|
|
227
|
+
minWidth: "100%",
|
|
228
|
+
width: "max-content",
|
|
229
|
+
"& .MuiStep-root": { flex: "0 0 auto", minWidth: 120 }
|
|
230
|
+
}), alternateLabel && { justifyContent: "center" }),
|
|
231
|
+
children: steps.map((step, idx) => {
|
|
232
|
+
var _a;
|
|
233
|
+
const {
|
|
234
|
+
label,
|
|
235
|
+
completed,
|
|
236
|
+
disabled,
|
|
237
|
+
className,
|
|
238
|
+
sx: stepSx,
|
|
239
|
+
dotColor,
|
|
240
|
+
activeDotColor,
|
|
241
|
+
completedDotColor,
|
|
242
|
+
iconTextColor
|
|
243
|
+
} = step.props;
|
|
244
|
+
const key = (_a = step.key) != null ? _a : idx;
|
|
245
|
+
return /* @__PURE__ */ jsx(
|
|
246
|
+
Step$1,
|
|
247
|
+
{
|
|
248
|
+
completed,
|
|
249
|
+
disabled,
|
|
250
|
+
className,
|
|
251
|
+
sx: stepSx,
|
|
252
|
+
children: /* @__PURE__ */ jsx(
|
|
253
|
+
StepLabel,
|
|
254
|
+
{
|
|
255
|
+
sx: {
|
|
256
|
+
pointerEvents: "none",
|
|
257
|
+
"& .MuiStepIcon-root": { color: dotColor },
|
|
258
|
+
"& .MuiStepIcon-active": { color: activeDotColor },
|
|
259
|
+
"& .MuiStepIcon-completed": { color: completedDotColor },
|
|
260
|
+
"& .MuiStepIcon-text": { fill: iconTextColor }
|
|
261
|
+
},
|
|
262
|
+
children: label
|
|
263
|
+
}
|
|
264
|
+
)
|
|
265
|
+
},
|
|
266
|
+
key
|
|
267
|
+
);
|
|
268
|
+
})
|
|
73
269
|
}
|
|
74
|
-
|
|
75
|
-
children: label
|
|
270
|
+
)
|
|
76
271
|
}
|
|
77
|
-
)
|
|
78
|
-
|
|
272
|
+
),
|
|
273
|
+
isHorizontal && /* @__PURE__ */ jsx(
|
|
274
|
+
StepperScrollArrow,
|
|
275
|
+
{
|
|
276
|
+
direction: "right",
|
|
277
|
+
enabled: canScrollRight,
|
|
278
|
+
visible: showArrows,
|
|
279
|
+
onClick: () => scrollBy(160)
|
|
280
|
+
}
|
|
281
|
+
)
|
|
282
|
+
]
|
|
79
283
|
}
|
|
80
284
|
),
|
|
81
|
-
/* @__PURE__ */ jsx(
|
|
82
|
-
|
|
83
|
-
|
|
285
|
+
/* @__PURE__ */ jsx(
|
|
286
|
+
Box,
|
|
287
|
+
{
|
|
288
|
+
mt: 2,
|
|
289
|
+
sx: {
|
|
290
|
+
display: "flex",
|
|
291
|
+
justifyContent: "center"
|
|
292
|
+
},
|
|
293
|
+
children: keepMounted ? steps.map((step, idx) => {
|
|
294
|
+
var _a;
|
|
295
|
+
const key = (_a = step.key) != null ? _a : idx;
|
|
296
|
+
const isActive = idx === currentStep;
|
|
297
|
+
return /* @__PURE__ */ jsx(
|
|
298
|
+
Box,
|
|
299
|
+
{
|
|
300
|
+
sx: { display: isActive ? "block" : "none", width: "100%" },
|
|
301
|
+
"aria-hidden": !isActive,
|
|
302
|
+
children: step.props.children
|
|
303
|
+
},
|
|
304
|
+
key
|
|
305
|
+
);
|
|
306
|
+
}) : steps.map((step, idx) => {
|
|
307
|
+
var _a;
|
|
308
|
+
if (idx !== currentStep) return null;
|
|
309
|
+
const key = (_a = step.key) != null ? _a : idx;
|
|
310
|
+
return /* @__PURE__ */ jsx(Box, { children: step.props.children }, key);
|
|
311
|
+
})
|
|
312
|
+
}
|
|
313
|
+
)
|
|
84
314
|
] });
|
|
85
315
|
};
|
|
86
316
|
const Step = (_) => null;
|
|
87
317
|
Step.displayName = "Step";
|
|
88
318
|
export {
|
|
89
319
|
Step,
|
|
90
|
-
Stepper
|
|
320
|
+
Stepper,
|
|
321
|
+
StepperContext,
|
|
322
|
+
StepperProvider,
|
|
323
|
+
Stepper as default,
|
|
324
|
+
useStepper
|
|
91
325
|
};
|
|
92
326
|
//# sourceMappingURL=Stepper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stepper.js","sources":["../../../src/components/Stepper/Stepper.tsx","../../../src/components/Stepper/Step.tsx"],"sourcesContent":["import React, { ReactElement } from \"react\";\nimport {\n Stepper as MuiStepper,\n Step as MuiStep,\n StepLabel as MuiStepLabel,\n Box,\n useMediaQuery,\n useTheme,\n Breakpoint,\n} from \"@mui/material\";\nimport { StepProps } from \"./Step\";\nimport { useWizard } from \"../../hooks/Wizard\";\n\ninterface MyStepperProps {\n children: ReactElement<StepProps>[];\n orientation?: \"horizontal\" | \"vertical\";\n sx?: object;\n alternateLabel?: boolean;\n /**\n * Índice 0-based del paso activo. Si no se provee, el Stepper intenta\n * leerlo del `WizardContext` (si está dentro de un `<WizardProvider>`).\n * Si tampoco hay provider, el default es 0.\n */\n currentStep?: number;\n /**\n * Cuando es true (default), en pantallas más angostas que `mobileBreakpoint`\n * el stepper horizontal automáticamente:\n * - cambia a orientación vertical si hay >3 steps, o\n * - oculta los labels (solo dots) si hay ≤3 steps,\n * para evitar que se desborde del contenedor.\n * Si pasas `orientation=\"vertical\"` explícito, no se altera.\n */\n responsive?: boolean;\n /** Breakpoint debajo del cual aplica el modo mobile. Default: \"sm\". */\n mobileBreakpoint?: Breakpoint;\n}\n\nexport const Stepper: React.FC<MyStepperProps> = ({\n children,\n orientation = \"horizontal\",\n alternateLabel = false,\n responsive = true,\n mobileBreakpoint = \"sm\",\n sx,\n currentStep: currentStepProp,\n}) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down(mobileBreakpoint));\n\n // Solo aplicamos adaptación mobile si el consumer pidió orientación horizontal.\n const mobileAdapt = responsive && isMobile && orientation === \"horizontal\";\n // Con muchos steps no caben aunque ocultes labels → mejor vertical.\n const effectiveOrientation: \"horizontal\" | \"vertical\" =\n mobileAdapt && children.length > 3 ? \"vertical\" : orientation;\n // Con pocos steps conservamos horizontal pero ocultamos labels para no desbordar.\n const hideLabelsOnMobile = mobileAdapt && children.length <= 3;\n const effectiveAlternateLabel =\n alternateLabel && effectiveOrientation === \"horizontal\";\n // Lee el paso desde el WizardContext cuando el consumer no lo pasa como prop.\n // Si el Stepper NO está dentro de un WizardProvider, `useWizard()` devuelve\n // el valor default (currentStep=0, totalSteps=0), así que no rompe nada.\n const wizard = useWizard();\n const currentStep =\n currentStepProp !== undefined\n ? currentStepProp\n : wizard.totalSteps > 0\n ? wizard.currentStep\n : 0;\n\n return (\n <Box sx={{ width: \"100%\", overflowX: \"hidden\", ...sx }}>\n <MuiStepper\n activeStep={currentStep}\n orientation={effectiveOrientation}\n alternativeLabel={effectiveAlternateLabel}\n sx={{\n // En horizontal con muchos labels + poco ancho, permitimos que\n // los labels hagan wrap en lugar de forzar overflow.\n ...(effectiveOrientation === \"horizontal\" && {\n flexWrap: \"wrap\",\n rowGap: 1,\n \"& .MuiStepLabel-label\": { textAlign: \"center\" },\n }),\n }}\n >\n {children.map((child, idx) => {\n const { label, completed, disabled, className, sx: stepSx, dotColor, activeDotColor, completedDotColor, iconTextColor } = child.props;\n return (\n <MuiStep key={idx} completed={completed} disabled={disabled} className={className} sx={stepSx}>\n <MuiStepLabel sx={{\n pointerEvents: 'none',\n // Ocultamos la parte de texto en mobile cuando aplicamos\n // reducción a dots-only. El icono se mantiene visible.\n ...(hideLabelsOnMobile && {\n \"& .MuiStepLabel-labelContainer\": { display: \"none\" },\n }),\n \"& .MuiStepIcon-root\": {\n color: dotColor,\n },\n \"& .MuiStepIcon-active\": {\n color: activeDotColor,\n },\n \"& .MuiStepIcon-completed\": {\n color: completedDotColor,\n },\n \"& .MuiStepIcon-text\": {\n fill: iconTextColor,\n },\n }}\n >{label}\n </MuiStepLabel>\n </MuiStep>\n );\n })}\n </MuiStepper>\n <Box mt={2}>\n {children.map((child, idx) =>\n idx === currentStep ? <Box key={idx}>{child.props.children}</Box> : null\n )}\n </Box>\n </Box>\n );\n};\n\nexport default Stepper;","import React from \"react\";\nimport { StepProps as MuiStepProps } from \"@mui/material\";\n\ntype PickMuiStepProps = Pick<MuiStepProps, \"completed\" | \"disabled\" | \"sx\" | \"className\">;\n\nexport interface StepProps extends PickMuiStepProps {\n label: React.ReactNode;\n children?: React.ReactNode;\n disabled?: boolean;\n sx?: object;\n dotColor?: string; // dot base\n activeDotColor?: string; // dot activa\n completedDotColor?: string; // dot completada\n iconTextColor?: string; // número o check dentro\n}\n\nexport const Step = (_: StepProps): null => null;\n\nStep.displayName = \"Step\";\n\nexport default Step;"],"names":["MuiStepper","MuiStep","MuiStepLabel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqCO,MAAM,UAAoC,CAAC;AAAA,EAChD;AAAA,EACA,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB;AAAA,EACA,aAAa;AACf,MAAM;AACJ,QAAM,QAAQ,SAAA;AACd,QAAM,WAAW,cAAc,MAAM,YAAY,KAAK,gBAAgB,CAAC;AAGvE,QAAM,cAAc,cAAc,YAAY,gBAAgB;AAE9D,QAAM,uBACJ,eAAe,SAAS,SAAS,IAAI,aAAa;AAEpD,QAAM,qBAAqB,eAAe,SAAS,UAAU;AAC7D,QAAM,0BACJ,kBAAkB,yBAAyB;AAI7C,QAAM,SAAS,UAAA;AACf,QAAM,cACJ,oBAAoB,SAChB,kBACA,OAAO,aAAa,IAClB,OAAO,cACP;AAER,SACE,qBAAC,KAAA,EAAI,IAAI,iBAAE,OAAO,QAAQ,WAAW,YAAa,KAChD,UAAA;AAAA,IAAA;AAAA,MAACA;AAAAA,MAAA;AAAA,QACC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,IAAI,mBAGE,yBAAyB,gBAAgB;AAAA,UAC3C,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,yBAAyB,EAAE,WAAW,SAAA;AAAA,QAAS;AAAA,QAIlD,UAAA,SAAS,IAAI,CAAC,OAAO,QAAQ;AAC5B,gBAAM,EAAE,OAAO,WAAW,UAAU,WAAW,IAAI,QAAQ,UAAU,gBAAgB,mBAAmB,cAAA,IAAkB,MAAM;AAChI,qCACGC,QAAA,EAAkB,WAAsB,UAAoB,WAAsB,IAAI,QACrF,UAAA;AAAA,YAACC;AAAAA,YAAA;AAAA,cAAa,IAAI;AAAA,gBAChB,eAAe;AAAA,iBAGX,sBAAsB;AAAA,gBACxB,kCAAkC,EAAE,SAAS,OAAA;AAAA,cAAO,IALtC;AAAA,gBAOhB,uBAAuB;AAAA,kBACrB,OAAO;AAAA,gBAAA;AAAA,gBAET,yBAAyB;AAAA,kBACvB,OAAO;AAAA,gBAAA;AAAA,gBAET,4BAA4B;AAAA,kBAC1B,OAAO;AAAA,gBAAA;AAAA,gBAET,uBAAuB;AAAA,kBACrB,MAAM;AAAA,gBAAA;AAAA,cACR;AAAA,cAEA,UAAA;AAAA,YAAA;AAAA,UAAA,KArBU,GAuBd;AAAA,QAEJ,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,oBAAC,KAAA,EAAI,IAAI,GACN,UAAA,SAAS;AAAA,MAAI,CAAC,OAAO,QACpB,QAAQ,cAAc,oBAAC,KAAA,EAAe,UAAA,MAAM,MAAM,SAAA,GAAlB,GAA2B,IAAS;AAAA,IAAA,EACtE,CACF;AAAA,EAAA,GACF;AAEJ;AC1GO,MAAM,OAAO,CAAC,MAAuB;AAE5C,KAAK,cAAc;"}
|
|
1
|
+
{"version":3,"file":"Stepper.js","sources":["../../../src/components/Stepper/StepperContext.tsx","../../../src/components/Stepper/_hooks/useHorizontalScroll.ts","../../../src/components/Stepper/_parts/StepperScrollArrow.tsx","../../../src/components/Stepper/Stepper.tsx","../../../src/components/Stepper/Step.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type FC,\n type ReactNode,\n} from 'react';\n\n/**\n * API expuesta por `useStepper()`.\n */\nexport interface StepperContextValue {\n /** Índice del paso actual (0-based). */\n currentStep: number;\n /** Total de pasos del stepper. */\n totalSteps: number;\n /** True si `currentStep === 0`. */\n isFirst: boolean;\n /** True si `currentStep === totalSteps - 1`. */\n isLast: boolean;\n /** True tras ejecutar `submitStep()` desde el último paso. */\n completed: boolean;\n /** Avanza al siguiente paso (no pasa de `totalSteps - 1`). */\n nextStep: () => void;\n /** Retrocede al paso anterior (no baja de 0). */\n prevStep: () => void;\n /** Salta a un paso específico (0-based). No-op si fuera de rango. */\n goToStep: (stepNumber: number) => void;\n /**\n * Envía el stepper. Marca `completed = true` y dispara el callback\n * `onSubmit` del provider. En el último paso suele reemplazar a `nextStep`.\n */\n submitStep: () => void;\n /** Resetea al paso inicial y limpia `completed`. */\n reset: () => void;\n}\n\nconst defaultValue: StepperContextValue = {\n currentStep: 0,\n totalSteps: 0,\n isFirst: true,\n isLast: true,\n completed: false,\n nextStep: () => {},\n prevStep: () => {},\n goToStep: () => {},\n submitStep: () => {},\n reset: () => {},\n};\n\nexport const StepperContext = createContext<StepperContextValue>(defaultValue);\n\n/**\n * Hook para consumir el `StepperContext` desde cualquier descendiente de\n * `<StepperProvider>`.\n *\n * Si se llama fuera de un provider, devuelve los valores por defecto (no-op)\n * para que componentes como `<Stepper>` puedan leerlo sin romper cuando no\n * hay provider envolvente.\n */\nexport function useStepper(): StepperContextValue {\n return useContext(StepperContext);\n}\n\nexport interface StepperProviderProps {\n /** Número total de pasos. Requerido. */\n totalSteps: number;\n /** Paso inicial (0-based). Default: 0. */\n initialStep?: number;\n /**\n * Callback disparado cuando se llama `submitStep()`. Recibe el paso actual.\n * El paquete NO ejecuta ninguna petición; queda a cargo del consumer.\n */\n onSubmit?: (currentStep: number) => void;\n /**\n * Callback disparado en cada cambio de paso (next/prev/goTo).\n * Útil para tracking o validaciones externas.\n */\n onStepChange?: (newStep: number, prevStep: number) => void;\n children?: ReactNode;\n}\n\n/**\n * Provider del stepper. Administra el `currentStep` internamente. El consumer\n * no necesita gestionar estado — solo consumirlo con `useStepper()` desde\n * cualquier descendiente.\n *\n * ```tsx\n * <StepperProvider totalSteps={3} onSubmit={handleFinalSubmit}>\n * <Stepper>\n * <Step label=\"Paso 1\"><StepOne /></Step>\n * <Step label=\"Paso 2\"><StepTwo /></Step>\n * <Step label=\"Paso 3\"><StepThree /></Step>\n * </Stepper>\n * <StepperControls />\n * </StepperProvider>\n * ```\n */\nexport const StepperProvider: FC<StepperProviderProps> = ({\n totalSteps,\n initialStep = 0,\n onSubmit,\n onStepChange,\n children,\n}) => {\n const [currentStep, setCurrentStep] = useState(initialStep);\n const [completed, setCompleted] = useState(false);\n\n const changeStep = useCallback(\n (newStep: number) => {\n if (newStep < 0 || newStep >= totalSteps) return;\n if (newStep === currentStep) return;\n onStepChange?.(newStep, currentStep);\n setCurrentStep(newStep);\n },\n [currentStep, totalSteps, onStepChange],\n );\n\n const nextStep = useCallback(() => {\n changeStep(currentStep + 1);\n }, [changeStep, currentStep]);\n\n const prevStep = useCallback(() => {\n changeStep(currentStep - 1);\n }, [changeStep, currentStep]);\n\n const goToStep = useCallback(\n (stepNumber: number) => {\n changeStep(stepNumber);\n },\n [changeStep],\n );\n\n const submitStep = useCallback(() => {\n setCompleted(true);\n onSubmit?.(currentStep);\n }, [currentStep, onSubmit]);\n\n const reset = useCallback(() => {\n setCurrentStep(initialStep);\n setCompleted(false);\n }, [initialStep]);\n\n const value = useMemo<StepperContextValue>(\n () => ({\n currentStep,\n totalSteps,\n isFirst: currentStep === 0,\n isLast: currentStep === totalSteps - 1,\n completed,\n nextStep,\n prevStep,\n goToStep,\n submitStep,\n reset,\n }),\n [\n currentStep,\n totalSteps,\n completed,\n nextStep,\n prevStep,\n goToStep,\n submitStep,\n reset,\n ],\n );\n\n return (\n <StepperContext.Provider value={value}>{children}</StepperContext.Provider>\n );\n};\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\n/**\n * Hook interno del Stepper para manejar scroll horizontal cuando los steps\n * no caben en el contenedor. No se exporta desde el barrel — es un detalle\n * de implementación.\n *\n * @param enabled - Si el scroll está activo (típicamente sólo en orientación horizontal).\n * @param deps - Cosas que afectan el layout y disparan un recompute (ej. cantidad de steps, paso activo).\n *\n * Retorna:\n * - `scrollRef`: ref a asignar al contenedor con `overflow-x: auto`.\n * - `canScrollLeft` / `canScrollRight`: flags para habilitar/deshabilitar flechas.\n * - `scrollBy(delta)`: imperativo con scroll suave.\n */\nexport function useHorizontalScroll(enabled: boolean, deps: unknown[] = []) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n\n const updateScrollState = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const { scrollLeft, scrollWidth, clientWidth } = el;\n // Tolerancia de 1px por redondeos de subpixel.\n setCanScrollLeft(scrollLeft > 1);\n setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n }, []);\n\n useLayoutEffect(() => {\n if (!enabled) return;\n updateScrollState();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, updateScrollState, ...deps]);\n\n useEffect(() => {\n if (!enabled) return;\n const el = scrollRef.current;\n if (!el) return;\n el.addEventListener('scroll', updateScrollState, { passive: true });\n const ro = new ResizeObserver(updateScrollState);\n ro.observe(el);\n return () => {\n el.removeEventListener('scroll', updateScrollState);\n ro.disconnect();\n };\n }, [enabled, updateScrollState]);\n\n const scrollBy = useCallback((delta: number) => {\n const el = scrollRef.current;\n if (!el) return;\n el.scrollBy({ left: delta, behavior: 'smooth' });\n }, []);\n\n return { scrollRef, canScrollLeft, canScrollRight, scrollBy };\n}\n","import { IconButton } from '@mui/material';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\n\ninterface StepperScrollArrowProps {\n direction: 'left' | 'right';\n /** Cuando `false`, el botón está deshabilitado (por ejemplo, ya estás al inicio). */\n enabled: boolean;\n /**\n * Cuando `false`, el botón queda con `visibility: hidden` (reserva su\n * espacio pero no se ve). Útil para que el área de scroll no se corra\n * horizontalmente cuando no hay overflow en ningún lado.\n */\n visible: boolean;\n onClick: () => void;\n}\n\n/**\n * Flecha de scroll (`<` / `>`) del Stepper horizontal. Se muestra a los\n * costados del área scrollable cuando hay overflow. Componente privado —\n * no se exporta del barrel.\n */\nexport const StepperScrollArrow = ({\n direction,\n enabled,\n visible,\n onClick,\n}: StepperScrollArrowProps) => {\n const isLeft = direction === 'left';\n const Icon = isLeft ? ChevronLeftIcon : ChevronRightIcon;\n const ariaLabel = isLeft ? 'Anterior' : 'Siguiente';\n\n return (\n <IconButton\n aria-label={ariaLabel}\n size=\"small\"\n onClick={onClick}\n disabled={!enabled}\n sx={{\n flex: '0 0 auto',\n // Reservamos el slot siempre que haya overflow en algún lado,\n // así el área scroll tiene un ancho estable (no saltan los\n // steps cuando aparece/desaparece la flecha).\n visibility: visible ? 'visible' : 'hidden',\n }}\n >\n <Icon fontSize=\"small\" />\n </IconButton>\n );\n};\n","import {\n Children,\n isValidElement,\n type FC,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport {\n Stepper as MuiStepper,\n Step as MuiStep,\n StepLabel as MuiStepLabel,\n Box,\n} from '@mui/material';\n\nimport { StepProps } from './Step';\nimport { useStepper } from './StepperContext';\nimport { useHorizontalScroll } from './_hooks/useHorizontalScroll';\nimport { StepperScrollArrow } from './_parts/StepperScrollArrow';\n\nexport interface StepperProps {\n /** Uno o varios `<Step>`. Children que no sean `<Step>` se ignoran. */\n children: ReactNode;\n orientation?: 'horizontal' | 'vertical';\n alternateLabel?: boolean;\n /**\n * Índice 0-based del paso activo. Si no se provee, el Stepper intenta\n * leerlo del `StepperContext` (si está dentro de un `<StepperProvider>`).\n * Si tampoco hay provider, el default es 0.\n */\n currentStep?: number;\n keepMounted?: boolean;\n sx?: object;\n}\n\nexport const Stepper: FC<StepperProps> = ({\n children,\n orientation = 'horizontal',\n alternateLabel = false,\n currentStep: currentStepProp,\n keepMounted = false,\n sx,\n}) => {\n // Lee el paso desde el StepperContext cuando el consumer no lo pasa como prop.\n const stepperCtx = useStepper();\n const currentStep =\n currentStepProp !== undefined\n ? currentStepProp\n : stepperCtx.totalSteps > 0\n ? stepperCtx.currentStep\n : 0;\n\n const isHorizontal = orientation === 'horizontal';\n\n // Filtra los children a los que tengan displayName=\"Step\" — acepta arrays,\n // single child, fragments, y descarta cualquier otra cosa (strings, null, etc.).\n const steps: ReactElement<StepProps>[] = Children.toArray(children).filter(\n (child): child is ReactElement<StepProps> =>\n isValidElement(child) &&\n (child.type as { displayName?: string })?.displayName === 'Step',\n );\n\n const { scrollRef, canScrollLeft, canScrollRight, scrollBy } = useHorizontalScroll(\n isHorizontal,\n [steps.length, currentStep],\n );\n\n const showArrows = isHorizontal && (canScrollLeft || canScrollRight);\n\n return (\n <Box sx={sx}>\n <Box\n sx={\n isHorizontal\n ? { display: 'flex', alignItems: 'center', width: '100%', gap: 0.5 }\n : undefined\n }\n >\n {isHorizontal && (\n <StepperScrollArrow\n direction=\"left\"\n enabled={canScrollLeft}\n visible={showArrows}\n onClick={() => scrollBy(-160)}\n />\n )}\n <Box\n ref={scrollRef}\n sx={\n isHorizontal\n ? {\n flex: '1 1 auto',\n minWidth: 0,\n overflowX: 'auto',\n scrollBehavior: 'smooth',\n WebkitOverflowScrolling: 'touch',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n }\n : undefined\n }\n >\n <MuiStepper\n activeStep={currentStep}\n orientation={orientation}\n alternativeLabel={alternateLabel}\n sx={{\n ...(isHorizontal && {\n display: 'inline-flex',\n flexWrap: 'nowrap',\n minWidth: '100%',\n width: 'max-content',\n '& .MuiStep-root': { flex: '0 0 auto', minWidth: 120 },\n }),\n ...(alternateLabel && { justifyContent: 'center' }),\n }}\n >\n {steps.map((step, idx) => {\n const {\n label,\n completed,\n disabled,\n className,\n sx: stepSx,\n dotColor,\n activeDotColor,\n completedDotColor,\n iconTextColor,\n } = step.props;\n const key = step.key ?? idx;\n return (\n <MuiStep\n key={key}\n completed={completed}\n disabled={disabled}\n className={className}\n sx={stepSx}\n >\n <MuiStepLabel\n sx={{\n pointerEvents: 'none',\n '& .MuiStepIcon-root': { color: dotColor },\n '& .MuiStepIcon-active': { color: activeDotColor },\n '& .MuiStepIcon-completed': { color: completedDotColor },\n '& .MuiStepIcon-text': { fill: iconTextColor },\n }}\n >\n {label}\n </MuiStepLabel>\n </MuiStep>\n );\n })}\n </MuiStepper>\n </Box>\n {isHorizontal && (\n <StepperScrollArrow\n direction=\"right\"\n enabled={canScrollRight}\n visible={showArrows}\n onClick={() => scrollBy(160)}\n />\n )}\n </Box>\n\n {/* Cuerpos de los steps — render según el modo `keepMounted` */}\n <Box mt={2}\n sx={{\n display: 'flex',\n justifyContent: 'center',\n }}>\n {keepMounted\n ? steps.map((step, idx) => {\n const key = step.key ?? idx;\n const isActive = idx === currentStep;\n return (\n <Box\n key={key}\n // `display: none` mantiene el nodo en el DOM — state de los\n // hijos (inputs, useState, etc.) no se pierde al navegar.\n sx={{ display: isActive ? 'block' : 'none', width: '100%' }}\n // Accesibilidad: oculta del flujo de lectura pero no del DOM.\n aria-hidden={!isActive}\n >\n {step.props.children}\n </Box>\n );\n })\n : steps.map((step, idx) => {\n if (idx !== currentStep) return null;\n const key = step.key ?? idx;\n return <Box key={key}>{step.props.children}</Box>;\n })}\n </Box>\n </Box>\n );\n};\n\nexport default Stepper;\n","import React from \"react\";\nimport { StepProps as MuiStepProps } from \"@mui/material\";\n\ntype PickMuiStepProps = Pick<MuiStepProps, \"completed\" | \"disabled\" | \"sx\" | \"className\">;\n\nexport interface StepProps extends PickMuiStepProps {\n label: React.ReactNode;\n children?: React.ReactNode;\n disabled?: boolean;\n sx?: object;\n dotColor?: string; // dot base\n activeDotColor?: string; // dot activa\n completedDotColor?: string; // dot completada\n iconTextColor?: string; // número o check dentro\n}\n\nexport const Step = (_: StepProps): null => null;\n\nStep.displayName = \"Step\";\n\nexport default Step;"],"names":["MuiStepper","MuiStep","MuiStepLabel"],"mappings":"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"}
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
2
|
/**
|
|
3
|
-
* API expuesta por `
|
|
4
|
-
*
|
|
5
|
-
* Nota de retro-compatibilidad: los nombres `submitStep`, `nextStep`,
|
|
6
|
-
* `prevStep`, `goToStep` se mantienen idénticos al `WizardContext` de
|
|
7
|
-
* `@soyfri/fri-web-components` para que consumers migrando no tengan que
|
|
8
|
-
* cambiar sus llamadas. Se agregan campos extra opcionales que antes no
|
|
9
|
-
* existían (`currentStep`, `totalSteps`, `isFirst`, `isLast`, `completed`).
|
|
3
|
+
* API expuesta por `useStepper()`.
|
|
10
4
|
*/
|
|
11
|
-
export interface
|
|
5
|
+
export interface StepperContextValue {
|
|
12
6
|
/** Índice del paso actual (0-based). */
|
|
13
7
|
currentStep: number;
|
|
14
|
-
/** Total de pasos del
|
|
8
|
+
/** Total de pasos del stepper. */
|
|
15
9
|
totalSteps: number;
|
|
16
10
|
/** True si `currentStep === 0`. */
|
|
17
11
|
isFirst: boolean;
|
|
@@ -26,16 +20,25 @@ export interface WizardContextValue {
|
|
|
26
20
|
/** Salta a un paso específico (0-based). No-op si fuera de rango. */
|
|
27
21
|
goToStep: (stepNumber: number) => void;
|
|
28
22
|
/**
|
|
29
|
-
* Envía el
|
|
23
|
+
* Envía el stepper. Marca `completed = true` y dispara el callback
|
|
30
24
|
* `onSubmit` del provider. En el último paso suele reemplazar a `nextStep`.
|
|
31
25
|
*/
|
|
32
26
|
submitStep: () => void;
|
|
33
|
-
/** Resetea
|
|
27
|
+
/** Resetea al paso inicial y limpia `completed`. */
|
|
34
28
|
reset: () => void;
|
|
35
29
|
}
|
|
36
|
-
export declare const
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
export declare const StepperContext: import('react').Context<StepperContextValue>;
|
|
31
|
+
/**
|
|
32
|
+
* Hook para consumir el `StepperContext` desde cualquier descendiente de
|
|
33
|
+
* `<StepperProvider>`.
|
|
34
|
+
*
|
|
35
|
+
* Si se llama fuera de un provider, devuelve los valores por defecto (no-op)
|
|
36
|
+
* para que componentes como `<Stepper>` puedan leerlo sin romper cuando no
|
|
37
|
+
* hay provider envolvente.
|
|
38
|
+
*/
|
|
39
|
+
export declare function useStepper(): StepperContextValue;
|
|
40
|
+
export interface StepperProviderProps {
|
|
41
|
+
/** Número total de pasos. Requerido. */
|
|
39
42
|
totalSteps: number;
|
|
40
43
|
/** Paso inicial (0-based). Default: 0. */
|
|
41
44
|
initialStep?: number;
|
|
@@ -52,16 +55,19 @@ export interface WizardProviderProps {
|
|
|
52
55
|
children?: ReactNode;
|
|
53
56
|
}
|
|
54
57
|
/**
|
|
55
|
-
* Provider del
|
|
56
|
-
* no necesita gestionar estado —
|
|
58
|
+
* Provider del stepper. Administra el `currentStep` internamente. El consumer
|
|
59
|
+
* no necesita gestionar estado — solo consumirlo con `useStepper()` desde
|
|
57
60
|
* cualquier descendiente.
|
|
58
61
|
*
|
|
59
62
|
* ```tsx
|
|
60
|
-
* <
|
|
61
|
-
* <Stepper
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
63
|
+
* <StepperProvider totalSteps={3} onSubmit={handleFinalSubmit}>
|
|
64
|
+
* <Stepper>
|
|
65
|
+
* <Step label="Paso 1"><StepOne /></Step>
|
|
66
|
+
* <Step label="Paso 2"><StepTwo /></Step>
|
|
67
|
+
* <Step label="Paso 3"><StepThree /></Step>
|
|
68
|
+
* </Stepper>
|
|
69
|
+
* <StepperControls />
|
|
70
|
+
* </StepperProvider>
|
|
65
71
|
* ```
|
|
66
72
|
*/
|
|
67
|
-
export declare const
|
|
73
|
+
export declare const StepperProvider: FC<StepperProviderProps>;
|