@soyfri/shared-library 2.0.0-beta.8 → 2.0.0-beta8
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/Autocomplete-BA-cGASd.js +316 -0
- package/Autocomplete-BA-cGASd.js.map +1 -0
- package/Autocomplete-C2x-lBvZ.cjs +315 -0
- package/Autocomplete-C2x-lBvZ.cjs.map +1 -0
- package/Avatar-9L7YMxya.cjs +162 -0
- package/Avatar-9L7YMxya.cjs.map +1 -0
- package/Avatar-BJTr-PBd.js +163 -0
- package/Avatar-BJTr-PBd.js.map +1 -0
- package/Card-DG_crfkK.cjs +185 -0
- package/Card-DG_crfkK.cjs.map +1 -0
- package/Card-Ug-ttVSh.js +186 -0
- package/Card-Ug-ttVSh.js.map +1 -0
- package/Chip-OPYQ1uQ_.js +74 -0
- package/Chip-OPYQ1uQ_.js.map +1 -0
- package/Chip-qoJLDiva.cjs +73 -0
- package/Chip-qoJLDiva.cjs.map +1 -0
- package/DatePicker-8f_9bwhS.js +202 -0
- package/DatePicker-8f_9bwhS.js.map +1 -0
- package/DatePicker-DLSfkgGA.cjs +201 -0
- package/DatePicker-DLSfkgGA.cjs.map +1 -0
- package/DateRangePicker-BVpeJCHI.js +76 -0
- package/DateRangePicker-BVpeJCHI.js.map +1 -0
- package/DateRangePicker-B_hKQhbj.cjs +75 -0
- package/DateRangePicker-B_hKQhbj.cjs.map +1 -0
- package/DateTimePicker-CWNW09-O.cjs +220 -0
- package/DateTimePicker-CWNW09-O.cjs.map +1 -0
- package/DateTimePicker-D4L9GAod.js +221 -0
- package/DateTimePicker-D4L9GAod.js.map +1 -0
- package/Input-Cp911l23.js +174 -0
- package/Input-Cp911l23.js.map +1 -0
- package/Input-DI0jfq5X.cjs +173 -0
- package/Input-DI0jfq5X.cjs.map +1 -0
- package/Modal-Bm_HH9cv.cjs +319 -0
- package/Modal-Bm_HH9cv.cjs.map +1 -0
- package/Modal-Bnz6d9m9.js +320 -0
- package/Modal-Bnz6d9m9.js.map +1 -0
- package/RadioGroup-CxqDHap1.cjs +200 -0
- package/RadioGroup-CxqDHap1.cjs.map +1 -0
- package/RadioGroup-DMi9FvMP.js +201 -0
- package/RadioGroup-DMi9FvMP.js.map +1 -0
- package/Select-3CBOfM2H.js +447 -0
- package/Select-3CBOfM2H.js.map +1 -0
- package/Select-Bku4f4f8.cjs +446 -0
- package/Select-Bku4f4f8.cjs.map +1 -0
- package/Stat-BUcFCGrz.cjs +83 -0
- package/Stat-BUcFCGrz.cjs.map +1 -0
- package/Stat-C06A_izS.js +84 -0
- package/Stat-C06A_izS.js.map +1 -0
- package/StatusMessage-C5B6oGZ_.cjs +78 -0
- package/StatusMessage-C5B6oGZ_.cjs.map +1 -0
- package/StatusMessage-D1GlfQdz.js +79 -0
- package/StatusMessage-D1GlfQdz.js.map +1 -0
- package/Step-Dq0N72YB.js +49 -0
- package/Step-Dq0N72YB.js.map +1 -0
- package/Step-a8U8O-91.cjs +48 -0
- package/Step-a8U8O-91.cjs.map +1 -0
- package/Switch-BIeobv6i.cjs +179 -0
- package/Switch-BIeobv6i.cjs.map +1 -0
- package/Switch-DQEOxM2R.js +180 -0
- package/Switch-DQEOxM2R.js.map +1 -0
- package/Tab-Co31KY2k.cjs +95 -0
- package/Tab-Co31KY2k.cjs.map +1 -0
- package/Tab-DiK62gRz.js +96 -0
- package/Tab-DiK62gRz.js.map +1 -0
- package/Table-C2LbW0B1.js +531 -0
- package/Table-C2LbW0B1.js.map +1 -0
- package/Table-C4OM6rrC.cjs +530 -0
- package/Table-C4OM6rrC.cjs.map +1 -0
- package/components/AppBar/AppBar.cjs +1 -1
- package/components/AppBar/AppBar.js +1 -1
- package/components/Autocomplete/Autocomplete.cjs +4 -311
- package/components/Autocomplete/Autocomplete.cjs.map +1 -1
- package/components/Autocomplete/Autocomplete.js +4 -311
- package/components/Autocomplete/Autocomplete.js.map +1 -1
- package/components/Avatar/Avatar.cjs +2 -160
- package/components/Avatar/Avatar.cjs.map +1 -1
- package/components/Avatar/Avatar.js +2 -160
- package/components/Avatar/Avatar.js.map +1 -1
- package/components/Card/Card.cjs +7 -184
- package/components/Card/Card.cjs.map +1 -1
- package/components/Card/Card.js +7 -184
- package/components/Card/Card.js.map +1 -1
- package/components/Chip/Chip.cjs +2 -71
- package/components/Chip/Chip.cjs.map +1 -1
- package/components/Chip/Chip.js +2 -71
- package/components/Chip/Chip.js.map +1 -1
- package/components/Column/Column.cjs +1 -1
- package/components/Column/Column.cjs.map +1 -1
- package/components/Column/Column.d.ts +1 -1
- package/components/Column/Column.js +1 -1
- package/components/Column/Column.js.map +1 -1
- package/components/Column/index.d.ts +1 -0
- package/components/DatePicker/DatePicker.cjs +3 -200
- package/components/DatePicker/DatePicker.cjs.map +1 -1
- package/components/DatePicker/DatePicker.js +3 -200
- package/components/DatePicker/DatePicker.js.map +1 -1
- package/components/DateRangePicker/DateRangePicker.cjs +2 -73
- package/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
- package/components/DateRangePicker/DateRangePicker.js +2 -73
- package/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/components/DateTimePicker/DateTimePicker.cjs +3 -219
- package/components/DateTimePicker/DateTimePicker.cjs.map +1 -1
- package/components/DateTimePicker/DateTimePicker.js +3 -219
- package/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/components/Drawer/Drawer.cjs +1 -1
- package/components/Drawer/Drawer.js +1 -1
- package/components/Input/Input.cjs +3 -172
- package/components/Input/Input.cjs.map +1 -1
- package/components/Input/Input.js +3 -172
- package/components/Input/Input.js.map +1 -1
- package/components/Modal/Modal.cjs +7 -317
- package/components/Modal/Modal.cjs.map +1 -1
- package/components/Modal/Modal.js +6 -316
- package/components/Modal/Modal.js.map +1 -1
- package/components/Modal/index.d.ts +2 -1
- package/components/Modal.d.ts +4 -0
- package/components/RadioGroup/RadioGroup.cjs +3 -199
- package/components/RadioGroup/RadioGroup.cjs.map +1 -1
- package/components/RadioGroup/RadioGroup.js +3 -199
- package/components/RadioGroup/RadioGroup.js.map +1 -1
- package/components/ScrollTopButton/ScrollTopButton.cjs +1 -1
- package/components/ScrollTopButton/ScrollTopButton.js +1 -1
- package/components/Select/Select.cjs +4 -445
- package/components/Select/Select.cjs.map +1 -1
- package/components/Select/Select.js +4 -445
- package/components/Select/Select.js.map +1 -1
- package/components/Stat/Stat.cjs +2 -81
- package/components/Stat/Stat.cjs.map +1 -1
- package/components/Stat/Stat.js +2 -81
- package/components/Stat/Stat.js.map +1 -1
- package/components/StatusMessage/StatusMessage.cjs +4 -77
- package/components/StatusMessage/StatusMessage.cjs.map +1 -1
- package/components/StatusMessage/StatusMessage.d.ts +1 -1
- package/components/StatusMessage/StatusMessage.js +3 -76
- package/components/StatusMessage/StatusMessage.js.map +1 -1
- package/components/StatusMessage/index.d.ts +2 -1
- package/components/StatusMessage.d.ts +4 -0
- package/components/Stepper/Stepper.cjs +3 -46
- package/components/Stepper/Stepper.cjs.map +1 -1
- package/components/Stepper/Stepper.js +3 -46
- package/components/Stepper/Stepper.js.map +1 -1
- package/components/Switch/Switch.cjs +3 -178
- package/components/Switch/Switch.cjs.map +1 -1
- package/components/Switch/Switch.js +3 -178
- package/components/Switch/Switch.js.map +1 -1
- package/components/Table/Table.cjs +2 -528
- package/components/Table/Table.cjs.map +1 -1
- package/components/Table/Table.d.ts +1 -1
- package/components/Table/Table.js +2 -528
- package/components/Table/Table.js.map +1 -1
- package/components/Tabs/Tabs.cjs +3 -93
- package/components/Tabs/Tabs.cjs.map +1 -1
- package/components/Tabs/Tabs.js +3 -93
- package/components/Tabs/Tabs.js.map +1 -1
- package/hooks/Wizard/WizardContext.d.ts +2 -2
- package/index.cjs +46 -1
- package/index.cjs.map +1 -1
- package/index.d.ts +30 -0
- package/index.js +46 -1
- package/index.js.map +1 -1
- package/package.json +5 -3
- package/{resolvePreset-CT3kU-K2.cjs → resolvePreset-CxTI6_Ln.cjs} +3 -3
- package/{resolvePreset-CT3kU-K2.cjs.map → resolvePreset-CxTI6_Ln.cjs.map} +1 -1
- package/{resolvePreset-B-IB0ehH.js → resolvePreset-K6_BfWHD.js} +3 -3
- package/{resolvePreset-B-IB0ehH.js.map → resolvePreset-K6_BfWHD.js.map} +1 -1
- package/useWizard-CWdIxZzX.cjs.map +1 -1
- package/useWizard-CWq--C3o.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal-Bnz6d9m9.js","sources":["../src/components/Modal/ModalFooter.tsx","../src/components/Modal/ModalHeader.tsx","../src/components/Modal/ModalBody.tsx","../src/components/Modal/Modal.tsx"],"sourcesContent":["import React from 'react';\nimport { Box, Button, Stack } from '@mui/material';\nimport { ButtonProps } from '@mui/material/Button';\n\n// Interfaz para acciones personalizadas (se mantiene aquí)\nexport interface ModalAction {\n text: string;\n onClick?: () => void;\n disabled?: boolean;\n variant?: ButtonProps['variant'];\n color?: ButtonProps['color'];\n /**\n * Props adicionales que se forwardean al `<Button>` interno. Útil para casos\n * avanzados como conectar el botón con un `<form id=\"...\">` externo usando\n * `buttonProps={{ type: 'submit', form: 'my-form-id' }}`.\n */\n buttonProps?: Partial<ButtonProps> & { form?: string };\n}\n\nexport interface ModalFooterProps { // Renombrado\n children?: React.ReactNode;\n showCloseButton?: boolean;\n closeButtonText?: string;\n closeButtonDisabled?: boolean;\n onClose: () => void;\n actions?: ModalAction[];\n}\n\nexport const ModalFooter: React.FC<ModalFooterProps> = ({ // Renombrado\n children,\n showCloseButton = true,\n closeButtonText = \"Cerrar\",\n closeButtonDisabled = false,\n onClose,\n actions = [],\n}) => {\n return (\n <Box sx={{ padding: 2, borderTop: '1px solid #e0e0e0', display: 'flex', justifyContent: 'flex-end', gap: 1 }}>\n {children}\n <Stack direction=\"row\" spacing={1}>\n {showCloseButton && (\n <Button\n onClick={onClose}\n disabled={closeButtonDisabled}\n variant=\"outlined\"\n color=\"secondary\"\n >\n {closeButtonText}\n </Button>\n )}\n {actions.map((action, index) => {\n const { buttonProps } = action;\n return (\n <Button\n key={index}\n onClick={action.onClick}\n disabled={action.disabled}\n variant={action.variant || 'contained'}\n color={action.color || 'primary'}\n {...(buttonProps as any)}\n >\n {action.text}\n </Button>\n );\n })}\n </Stack>\n </Box>\n );\n};\n\nexport default ModalFooter;","import React from 'react';\nimport { Box, Typography } from '@mui/material';\n\ninterface ModalHeaderProps { // Renombrado\n children: React.ReactNode;\n}\n\nexport const ModalHeader: React.FC<ModalHeaderProps> = ({ children }) => { // Renombrado\n return (\n <Box sx={{ padding: 2, borderBottom: '1px solid #e0e0e0', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography variant=\"h6\" component=\"h2\">\n {children}\n </Typography>\n </Box>\n );\n};\n\nexport default ModalHeader;","import React from 'react';\nimport { Box } from '@mui/material';\n\ninterface ModalBodyProps { // Renombrado\n children: React.ReactNode;\n}\n\nexport const ModalBody: React.FC<ModalBodyProps> = ({ children }) => { // Renombrado\n return (\n <Box sx={{ padding: 2, overflowY: 'auto', flexGrow: 1 }}>\n {children}\n </Box>\n );\n};\n\nexport default ModalBody;","import React, {\n useState,\n useImperativeHandle,\n forwardRef,\n type ReactNode,\n} from 'react';\nimport {\n Modal as MuiModal,\n Paper,\n useTheme,\n useMediaQuery,\n Box,\n Stack,\n Typography,\n} from '@mui/material';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\nimport CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline';\n\nimport type { DialogProps } from '@mui/material/Dialog';\nimport { ModalAction, ModalFooter, ModalFooterProps } from './ModalFooter';\nimport { ModalHeader } from './ModalHeader';\nimport { ModalBody } from './ModalBody';\n\n// Define la interfaz para los métodos que el padre puede llamar a través de la ref\nexport interface ModalRef {\n open: () => void;\n close: () => void;\n}\n\nexport type ModalMode = 'default' | 'confirm';\nexport type ModalSeverity = 'info' | 'warning' | 'error' | 'success';\n\ninterface ModalProps {\n /**\n * Modo del modal.\n * - `default` (default): modal genérico con slots `Header`/`Body`/`Footer` y\n * `actions` custom.\n * - `confirm`: reemplaza al `ConfirmModal` legacy. Renderiza un layout\n * focalizado con icono por severidad, mensaje y botones \"Cancelar\" /\n * \"Confirmar\".\n */\n mode?: ModalMode;\n\n // ── Props comunes ────────────────────────────────────────────────────\n /** Controlado externamente. Omitir si se usa vía ref. */\n open?: boolean;\n /** Callback al cerrar. También se dispara al confirmar/cancelar. */\n onClose?: () => void;\n title?: string;\n children?: ReactNode;\n showCloseButton?: boolean;\n closeButtonText?: string;\n closeButtonDisabled?: boolean;\n actions?: ModalAction[];\n maxWidth?: DialogProps['maxWidth'];\n hiddenFooter?: boolean;\n\n // ── Props del modo confirm ───────────────────────────────────────────\n /**\n * Callback de confirmación. Soporta promesa — si devuelve `Promise`, el\n * botón muestra estado `disabled` mientras resuelve.\n */\n onConfirm?: () => void | Promise<void>;\n /** Texto del botón primario en modo `confirm`. Default: \"Confirmar\". */\n confirmText?: string;\n /** Deshabilita el botón de confirmar. */\n confirmDisabled?: boolean;\n /**\n * Severidad visual en modo `confirm`. Controla el icono y el color del\n * botón de confirmación.\n * - `info` (default): primary\n * - `warning`: warning (amarillo)\n * - `error`: error (rojo) — típico para \"Eliminar\"\n * - `success`: success (verde) — típico para \"Aprobar\"\n */\n severity?: ModalSeverity;\n /**\n * Mensaje del confirm. Puede ser string o cualquier ReactNode. Si se omite,\n * se usa `children`.\n */\n confirmMessage?: ReactNode;\n}\n\nconst modalStyle = {\n position: 'absolute' as const,\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '90%',\n maxHeight: '90vh',\n display: 'flex',\n flexDirection: 'column' as const,\n outline: 'none',\n};\n\nconst severityConfig: Record<\n ModalSeverity,\n { color: ModalAction['color']; icon: ReactNode; bg: string }\n> = {\n info: {\n color: 'primary',\n icon: <InfoOutlinedIcon sx={{ fontSize: 48 }} />,\n bg: 'primary.light',\n },\n warning: {\n color: 'warning',\n icon: <WarningAmberIcon sx={{ fontSize: 48 }} />,\n bg: 'warning.light',\n },\n error: {\n color: 'error',\n icon: <ErrorOutlineIcon sx={{ fontSize: 48 }} />,\n bg: 'error.light',\n },\n success: {\n color: 'success',\n icon: <CheckCircleOutlineIcon sx={{ fontSize: 48 }} />,\n bg: 'success.light',\n },\n};\n\nexport const Modal = forwardRef<ModalRef, ModalProps>(\n (\n {\n mode = 'default',\n open: controlledOpen,\n onClose: controlledOnClose,\n title,\n children,\n showCloseButton = true,\n closeButtonText = 'Cerrar',\n closeButtonDisabled = false,\n actions = [],\n maxWidth = 'sm',\n hiddenFooter = false,\n\n // Props del modo confirm\n onConfirm,\n confirmText = 'Confirmar',\n confirmDisabled = false,\n severity = 'info',\n confirmMessage,\n },\n ref,\n ) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const [confirmLoading, setConfirmLoading] = useState(false);\n\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;\n\n useImperativeHandle(ref, () => ({\n open: () => setInternalOpen(true),\n close: () => {\n setInternalOpen(false);\n controlledOnClose?.();\n },\n }));\n\n const handleCloseInternal = () => {\n setInternalOpen(false);\n controlledOnClose?.();\n };\n\n const handleConfirm = async () => {\n if (!onConfirm) {\n handleCloseInternal();\n return;\n }\n try {\n const result = onConfirm();\n if (result instanceof Promise) {\n setConfirmLoading(true);\n await result;\n }\n } finally {\n setConfirmLoading(false);\n handleCloseInternal();\n }\n };\n\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n\n const getWidth = () => {\n if (isMobile) return '95%';\n switch (maxWidth) {\n case 'xs':\n return 300;\n case 'sm':\n return 500;\n case 'md':\n return 700;\n case 'lg':\n return 900;\n case 'xl':\n return 1100;\n case false:\n return 'auto';\n default:\n return 500;\n }\n };\n\n // ── Render modo CONFIRM ─────────────────────────────────────────────\n if (mode === 'confirm') {\n const config = severityConfig[severity];\n const message = confirmMessage ?? children;\n\n return (\n <MuiModal\n open={isOpen}\n onClose={handleCloseInternal}\n aria-labelledby=\"modal-title\"\n closeAfterTransition\n >\n <Paper sx={{ ...modalStyle, width: getWidth() }}>\n <Stack spacing={2.5} sx={{ p: 3, alignItems: 'center', textAlign: 'center' }}>\n <Box\n sx={{\n width: 72,\n height: 72,\n borderRadius: '50%',\n backgroundColor: (t) =>\n t.palette[severity === 'info' ? 'primary' : severity].light,\n color: (t) =>\n t.palette[severity === 'info' ? 'primary' : severity].dark,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.9,\n }}\n >\n {config.icon}\n </Box>\n {title && (\n <Typography variant=\"h6\" component=\"h2\" sx={{ fontWeight: 700 }}>\n {title}\n </Typography>\n )}\n {message && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {message}\n </Typography>\n )}\n </Stack>\n <ModalFooter\n showCloseButton={showCloseButton}\n closeButtonText={closeButtonText}\n closeButtonDisabled={closeButtonDisabled || confirmLoading}\n onClose={handleCloseInternal}\n actions={[\n {\n text: confirmText,\n onClick: handleConfirm,\n disabled: confirmDisabled || confirmLoading,\n variant: 'contained',\n color: config.color,\n },\n ]}\n />\n </Paper>\n </MuiModal>\n );\n }\n\n // ── Render modo DEFAULT (legacy) ────────────────────────────────────\n const renderChildren = () => {\n let header: ReactNode | null = null;\n let body: ReactNode | null = null;\n let footer: ReactNode | null = null;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n if (child.type === ModalHeader) {\n header = child;\n } else if (child.type === ModalBody) {\n body = child;\n } else if (child.type === ModalFooter) {\n const footerChild = child as React.ReactElement<ModalFooterProps>;\n const {\n showCloseButton: childShowCloseButton,\n closeButtonText: childCloseButtonText,\n closeButtonDisabled: childCloseButtonDisabled,\n onClose: childOnClose,\n actions: childActions,\n ...restOfFooterProps\n } = footerChild.props;\n\n footer = React.cloneElement(footerChild, {\n showCloseButton,\n closeButtonText,\n closeButtonDisabled,\n onClose: handleCloseInternal,\n actions,\n ...restOfFooterProps,\n });\n }\n }\n });\n\n if (!footer && !hiddenFooter) {\n footer = (\n <ModalFooter\n showCloseButton={showCloseButton}\n closeButtonText={closeButtonText}\n closeButtonDisabled={closeButtonDisabled}\n onClose={handleCloseInternal}\n actions={actions}\n />\n );\n }\n\n return (\n <>\n {header || (title && <ModalHeader>{title}</ModalHeader>)}\n {body}\n {footer}\n </>\n );\n };\n\n return (\n <MuiModal\n open={isOpen}\n onClose={handleCloseInternal}\n aria-labelledby=\"modal-title\"\n aria-describedby=\"modal-description\"\n closeAfterTransition\n >\n <Paper sx={{ ...modalStyle, width: getWidth() }}>\n {renderChildren()}\n </Paper>\n </MuiModal>\n );\n },\n);\n\n// Define los sub-componentes como propiedades estáticas con tipos explícitos\ntype ModalComponent = React.ForwardRefExoticComponent<\n ModalProps & React.RefAttributes<ModalRef>\n> & {\n Header: typeof ModalHeader;\n Body: typeof ModalBody;\n Footer: typeof ModalFooter;\n};\n\nconst ModalWithStatics = Modal as ModalComponent;\n\nModalWithStatics.Header = ModalHeader;\nModalWithStatics.Body = ModalBody;\nModalWithStatics.Footer = ModalFooter;\n\nexport default ModalWithStatics;\n"],"names":["MuiModal","React"],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
+
var __objRest = (source, exclude) => {
|
|
22
|
+
var target = {};
|
|
23
|
+
for (var prop in source)
|
|
24
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
if (source != null && __getOwnPropSymbols)
|
|
27
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
28
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
};
|
|
33
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
34
|
+
const styles = require("@mui/material/styles");
|
|
35
|
+
const material = require("@mui/material");
|
|
36
|
+
const reactHookForm = require("react-hook-form");
|
|
37
|
+
const resolvePreset = require("./resolvePreset-CxTI6_Ln.cjs");
|
|
38
|
+
const toRadius = (borderRadius) => typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius;
|
|
39
|
+
const FOCUS_TRANSITION = "border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, box-shadow 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms";
|
|
40
|
+
const buildRadioGroupSx = ({
|
|
41
|
+
bordered,
|
|
42
|
+
borderRadius,
|
|
43
|
+
error
|
|
44
|
+
}) => {
|
|
45
|
+
const radius = toRadius(borderRadius);
|
|
46
|
+
if (!bordered) {
|
|
47
|
+
return {
|
|
48
|
+
"& .MuiFormHelperText-root": { marginLeft: 0 }
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return (theme) => ({
|
|
52
|
+
"& .MuiRadioGroup-root": __spreadProps(__spreadValues({
|
|
53
|
+
paddingTop: 1.25,
|
|
54
|
+
paddingBottom: 1.25,
|
|
55
|
+
paddingX: 1.5,
|
|
56
|
+
border: `1px solid ${error ? theme.palette.error.main : theme.palette.divider}`,
|
|
57
|
+
borderRadius: radius,
|
|
58
|
+
transition: FOCUS_TRANSITION
|
|
59
|
+
}, error && {
|
|
60
|
+
boxShadow: `0 0 0 1px ${theme.palette.error.main}`
|
|
61
|
+
}), {
|
|
62
|
+
// Focus del usuario sobre cualquier radio interno.
|
|
63
|
+
"&:focus-within": {
|
|
64
|
+
borderColor: error ? theme.palette.error.main : theme.palette.primary.main,
|
|
65
|
+
boxShadow: `0 0 0 1px ${error ? theme.palette.error.main : theme.palette.primary.main}`
|
|
66
|
+
}
|
|
67
|
+
}),
|
|
68
|
+
"& .MuiFormHelperText-root": {
|
|
69
|
+
marginLeft: 0
|
|
70
|
+
},
|
|
71
|
+
"& .MuiFormLabel-root": {
|
|
72
|
+
marginBottom: 0.5
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
const RadioGroup = (props) => {
|
|
77
|
+
const _a = props, {
|
|
78
|
+
options,
|
|
79
|
+
label,
|
|
80
|
+
row = true,
|
|
81
|
+
size = "small",
|
|
82
|
+
disabled = false,
|
|
83
|
+
error = false,
|
|
84
|
+
helperText,
|
|
85
|
+
bordered = true,
|
|
86
|
+
borderRadius = 10,
|
|
87
|
+
defaultValue,
|
|
88
|
+
preset,
|
|
89
|
+
sx
|
|
90
|
+
} = _a, rest = __objRest(_a, [
|
|
91
|
+
"options",
|
|
92
|
+
"label",
|
|
93
|
+
"row",
|
|
94
|
+
"size",
|
|
95
|
+
"disabled",
|
|
96
|
+
"error",
|
|
97
|
+
"helperText",
|
|
98
|
+
"bordered",
|
|
99
|
+
"borderRadius",
|
|
100
|
+
"defaultValue",
|
|
101
|
+
"preset",
|
|
102
|
+
"sx"
|
|
103
|
+
]);
|
|
104
|
+
const theme = styles.useTheme();
|
|
105
|
+
const presetSx = resolvePreset.resolvePreset("RadioGroup", preset, theme);
|
|
106
|
+
const buildSx = (effectiveError) => [
|
|
107
|
+
buildRadioGroupSx({ bordered, borderRadius, error: effectiveError }),
|
|
108
|
+
...presetSx ? [presetSx] : [],
|
|
109
|
+
...Array.isArray(sx) ? sx : [sx]
|
|
110
|
+
];
|
|
111
|
+
const renderOptions = (currentValue, _onChange, fieldName) => options.map((opt) => {
|
|
112
|
+
var _a2;
|
|
113
|
+
const inputId = (_a2 = opt.id) != null ? _a2 : `${fieldName != null ? fieldName : "radio"}-${opt.value}`;
|
|
114
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
115
|
+
material.FormControlLabel,
|
|
116
|
+
{
|
|
117
|
+
value: opt.value,
|
|
118
|
+
control: /* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
+
material.Radio,
|
|
120
|
+
{
|
|
121
|
+
id: inputId,
|
|
122
|
+
size,
|
|
123
|
+
disabled: disabled || opt.disabled
|
|
124
|
+
}
|
|
125
|
+
),
|
|
126
|
+
label: opt.label,
|
|
127
|
+
checked: currentValue === opt.value,
|
|
128
|
+
disabled: disabled || opt.disabled
|
|
129
|
+
},
|
|
130
|
+
inputId
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
if ("control" in props && props.control) {
|
|
134
|
+
const { name: name2, control, validation } = props;
|
|
135
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
136
|
+
reactHookForm.Controller,
|
|
137
|
+
{
|
|
138
|
+
name: name2,
|
|
139
|
+
control,
|
|
140
|
+
rules: validation,
|
|
141
|
+
defaultValue,
|
|
142
|
+
render: ({ field, fieldState: { error: fieldError } }) => {
|
|
143
|
+
var _a2, _b;
|
|
144
|
+
const finalError = !!fieldError || error;
|
|
145
|
+
const finalHelperText = (_a2 = fieldError == null ? void 0 : fieldError.message) != null ? _a2 : helperText;
|
|
146
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
147
|
+
material.FormControl,
|
|
148
|
+
{
|
|
149
|
+
error: finalError,
|
|
150
|
+
disabled,
|
|
151
|
+
sx: buildSx(finalError),
|
|
152
|
+
fullWidth: true,
|
|
153
|
+
children: [
|
|
154
|
+
label && /* @__PURE__ */ jsxRuntime.jsx(material.FormLabel, { children: label }),
|
|
155
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
156
|
+
material.RadioGroup,
|
|
157
|
+
__spreadProps(__spreadValues({}, rest), {
|
|
158
|
+
row,
|
|
159
|
+
name: field.name,
|
|
160
|
+
value: (_b = field.value) != null ? _b : "",
|
|
161
|
+
onBlur: field.onBlur,
|
|
162
|
+
onChange: (_e, value2) => field.onChange(value2),
|
|
163
|
+
children: renderOptions(field.value, field.onChange, field.name)
|
|
164
|
+
})
|
|
165
|
+
),
|
|
166
|
+
finalHelperText && /* @__PURE__ */ jsxRuntime.jsx(material.FormHelperText, { children: finalHelperText })
|
|
167
|
+
]
|
|
168
|
+
}
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
const { value, onChange, name } = props;
|
|
175
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
176
|
+
material.FormControl,
|
|
177
|
+
{
|
|
178
|
+
error,
|
|
179
|
+
disabled,
|
|
180
|
+
sx: buildSx(error),
|
|
181
|
+
fullWidth: true,
|
|
182
|
+
children: [
|
|
183
|
+
label && /* @__PURE__ */ jsxRuntime.jsx(material.FormLabel, { children: label }),
|
|
184
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
185
|
+
material.RadioGroup,
|
|
186
|
+
__spreadProps(__spreadValues({}, rest), {
|
|
187
|
+
row,
|
|
188
|
+
name,
|
|
189
|
+
value: value != null ? value : "",
|
|
190
|
+
onChange: (_e, next) => onChange(next),
|
|
191
|
+
children: renderOptions(value, onChange, name)
|
|
192
|
+
})
|
|
193
|
+
),
|
|
194
|
+
helperText && /* @__PURE__ */ jsxRuntime.jsx(material.FormHelperText, { children: helperText })
|
|
195
|
+
]
|
|
196
|
+
}
|
|
197
|
+
);
|
|
198
|
+
};
|
|
199
|
+
exports.RadioGroup = RadioGroup;
|
|
200
|
+
//# sourceMappingURL=RadioGroup-CxqDHap1.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioGroup-CxqDHap1.cjs","sources":["../src/components/RadioGroup/RadioGroup.sx.ts","../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface BuildRadioGroupSxOptions {\n bordered: boolean;\n borderRadius: number | string;\n error: boolean;\n}\n\nconst toRadius = (borderRadius: number | string) =>\n typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius;\n\n/**\n * Transición compartida (matchea el InputGroup).\n */\nconst FOCUS_TRANSITION =\n 'border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, ' +\n 'box-shadow 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms';\n\n/**\n * Builder de sx para RadioGroup. Reproduce el estilo del antiguo\n * `FormRadioGroup` legacy: contenedor con borde + padding vertical.\n *\n * Cuando `bordered=true`, el contenedor gana:\n * - `:focus-within` → borde + shadow primario (mismo patrón que `InputGroup`).\n * - `error=true` → borde + shadow de error (palette.error.main).\n *\n * El shadow es de 1px, así que no hay shift de layout — sólo se intensifica\n * visualmente el borde sin empujar nada alrededor.\n *\n * Si `bordered=false`, devuelve un sx mínimo (sólo helper text reset).\n */\nexport const buildRadioGroupSx = ({\n bordered,\n borderRadius,\n error,\n}: BuildRadioGroupSxOptions): SxProps<Theme> => {\n const radius = toRadius(borderRadius);\n\n if (!bordered) {\n return {\n '& .MuiFormHelperText-root': { marginLeft: 0 },\n };\n }\n\n return (theme) => ({\n '& .MuiRadioGroup-root': {\n paddingTop: 1.25,\n paddingBottom: 1.25,\n paddingX: 1.5,\n border: `1px solid ${\n error ? theme.palette.error.main : theme.palette.divider\n }`,\n borderRadius: radius,\n transition: FOCUS_TRANSITION,\n ...(error && {\n boxShadow: `0 0 0 1px ${theme.palette.error.main}`,\n }),\n // Focus del usuario sobre cualquier radio interno.\n '&:focus-within': {\n borderColor: error\n ? theme.palette.error.main\n : theme.palette.primary.main,\n boxShadow: `0 0 0 1px ${\n error ? theme.palette.error.main : theme.palette.primary.main\n }`,\n },\n },\n '& .MuiFormHelperText-root': {\n marginLeft: 0,\n },\n '& .MuiFormLabel-root': {\n marginBottom: 0.5,\n },\n });\n};\n","import { useTheme } from '@mui/material/styles';\nimport {\n FormControl,\n FormControlLabel,\n FormHelperText,\n FormLabel,\n Radio,\n RadioGroup as MuiRadioGroup,\n type RadioGroupProps as MuiRadioGroupProps,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport { Controller, type Control, type RegisterOptions } from 'react-hook-form';\n\nimport { buildRadioGroupSx } from './RadioGroup.sx';\nimport { resolvePreset } from '../_shared/resolvePreset';\n\n// ── Tipos de dominio ─────────────────────────────────────────────────────\nexport interface RadioOption {\n /** Valor que se emite cuando se selecciona la opción. */\n value: string;\n /** Texto mostrado al lado del radio. */\n label: string;\n /** Deshabilitar opción individualmente. */\n disabled?: boolean;\n /** ID custom del input (default: prefijo + value). */\n id?: string;\n}\n\nexport type RadioGroupSize = 'small' | 'medium';\n\n// ── Props base (todo lo común entre RHF y controlado) ────────────────────\nexport interface BaseRadioGroupProps\n extends Omit<MuiRadioGroupProps, 'value' | 'onChange' | 'defaultValue'> {\n options: RadioOption[];\n /** Label superior del grupo. */\n label?: string;\n /** Distribución horizontal (default: true — replica el comportamiento legacy). */\n row?: boolean;\n size?: RadioGroupSize;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n /** Renderiza un contenedor con borde estilo \"form field\". Default: true. */\n bordered?: boolean;\n /** Border radius del contenedor (cuando bordered). Default: 10. */\n borderRadius?: number | string;\n defaultValue?: string;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.RadioGroup`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n * - Cualquier otro string = mergea el preset encima del estilo built-in.\n */\n preset?: string;\n sx?: SxProps<Theme>;\n}\n\n// ── Variantes discriminadas (RHF vs controlado) ──────────────────────────\nexport interface RHFRadioGroupProps extends BaseRadioGroupProps {\n name: string;\n control: Control<any>;\n validation?: RegisterOptions;\n value?: never;\n onChange?: never;\n}\n\nexport interface ControlledRadioGroupProps extends BaseRadioGroupProps {\n name?: string;\n control?: never;\n validation?: never;\n value: string;\n onChange: (value: string) => void;\n}\n\n// ── API pública final ────────────────────────────────────────────────────\nexport type RadioGroupProps = RHFRadioGroupProps | ControlledRadioGroupProps;\n\nexport const RadioGroup: React.FC<RadioGroupProps> = (props) => {\n const {\n options,\n label,\n row = true,\n size = 'small',\n disabled = false,\n error = false,\n helperText,\n bordered = true,\n borderRadius = 10,\n defaultValue,\n preset,\n sx,\n ...rest\n } = props as ControlledRadioGroupProps & {\n control?: Control<any>;\n validation?: RegisterOptions;\n };\n\n const theme = useTheme();\n const presetSx = resolvePreset('RadioGroup', preset, theme);\n\n // Construye el sx con el estado de error efectivo; se llama por rama\n // (RHF usa el error del Controller, controlado usa el prop `error`).\n const buildSx = (effectiveError: boolean) => [\n buildRadioGroupSx({ bordered, borderRadius, error: effectiveError }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : [sx]),\n ];\n\n const renderOptions = (\n currentValue: string | undefined,\n _onChange: (value: string) => void,\n fieldName?: string,\n ) =>\n options.map((opt) => {\n const inputId = opt.id ?? `${fieldName ?? 'radio'}-${opt.value}`;\n return (\n <FormControlLabel\n key={inputId}\n value={opt.value}\n control={\n <Radio\n id={inputId}\n size={size}\n disabled={disabled || opt.disabled}\n />\n }\n label={opt.label}\n checked={currentValue === opt.value}\n disabled={disabled || opt.disabled}\n />\n );\n });\n\n // ── RHF mode ──────────────────────────────────────────────────────────\n if ('control' in props && props.control) {\n const { name, control, validation } = props as RHFRadioGroupProps;\n return (\n <Controller\n name={name}\n control={control}\n rules={validation}\n defaultValue={defaultValue}\n render={({ field, fieldState: { error: fieldError } }) => {\n const finalError = !!fieldError || error;\n const finalHelperText = fieldError?.message ?? helperText;\n return (\n <FormControl\n error={finalError}\n disabled={disabled}\n sx={buildSx(finalError)}\n fullWidth\n >\n {label && <FormLabel>{label}</FormLabel>}\n <MuiRadioGroup\n {...rest}\n row={row}\n name={field.name}\n value={field.value ?? ''}\n onBlur={field.onBlur}\n onChange={(_e, value) => field.onChange(value)}\n >\n {renderOptions(field.value, field.onChange, field.name)}\n </MuiRadioGroup>\n {finalHelperText && <FormHelperText>{finalHelperText}</FormHelperText>}\n </FormControl>\n );\n }}\n />\n );\n }\n\n // ── Controlled mode ───────────────────────────────────────────────────\n const { value, onChange, name } = props as ControlledRadioGroupProps;\n return (\n <FormControl\n error={error}\n disabled={disabled}\n sx={buildSx(error)}\n fullWidth\n >\n {label && <FormLabel>{label}</FormLabel>}\n <MuiRadioGroup\n {...rest}\n row={row}\n name={name}\n value={value ?? ''}\n onChange={(_e, next) => onChange(next)}\n >\n {renderOptions(value, onChange, name)}\n </MuiRadioGroup>\n {helperText && <FormHelperText>{helperText}</FormHelperText>}\n </FormControl>\n );\n};\n\nexport default RadioGroup;\n"],"names":["useTheme","resolvePreset","_a","jsx","FormControlLabel","Radio","name","Controller","jsxs","FormControl","FormLabel","MuiRadioGroup","value","FormHelperText"],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __objRest = (source, exclude) => {
|
|
21
|
+
var target = {};
|
|
22
|
+
for (var prop in source)
|
|
23
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
24
|
+
target[prop] = source[prop];
|
|
25
|
+
if (source != null && __getOwnPropSymbols)
|
|
26
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
27
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
}
|
|
30
|
+
return target;
|
|
31
|
+
};
|
|
32
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
33
|
+
import { useTheme } from "@mui/material/styles";
|
|
34
|
+
import { FormControl, FormLabel, RadioGroup as RadioGroup$1, FormHelperText, FormControlLabel, Radio } from "@mui/material";
|
|
35
|
+
import { Controller } from "react-hook-form";
|
|
36
|
+
import { r as resolvePreset } from "./resolvePreset-K6_BfWHD.js";
|
|
37
|
+
const toRadius = (borderRadius) => typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius;
|
|
38
|
+
const FOCUS_TRANSITION = "border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, box-shadow 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms";
|
|
39
|
+
const buildRadioGroupSx = ({
|
|
40
|
+
bordered,
|
|
41
|
+
borderRadius,
|
|
42
|
+
error
|
|
43
|
+
}) => {
|
|
44
|
+
const radius = toRadius(borderRadius);
|
|
45
|
+
if (!bordered) {
|
|
46
|
+
return {
|
|
47
|
+
"& .MuiFormHelperText-root": { marginLeft: 0 }
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return (theme) => ({
|
|
51
|
+
"& .MuiRadioGroup-root": __spreadProps(__spreadValues({
|
|
52
|
+
paddingTop: 1.25,
|
|
53
|
+
paddingBottom: 1.25,
|
|
54
|
+
paddingX: 1.5,
|
|
55
|
+
border: `1px solid ${error ? theme.palette.error.main : theme.palette.divider}`,
|
|
56
|
+
borderRadius: radius,
|
|
57
|
+
transition: FOCUS_TRANSITION
|
|
58
|
+
}, error && {
|
|
59
|
+
boxShadow: `0 0 0 1px ${theme.palette.error.main}`
|
|
60
|
+
}), {
|
|
61
|
+
// Focus del usuario sobre cualquier radio interno.
|
|
62
|
+
"&:focus-within": {
|
|
63
|
+
borderColor: error ? theme.palette.error.main : theme.palette.primary.main,
|
|
64
|
+
boxShadow: `0 0 0 1px ${error ? theme.palette.error.main : theme.palette.primary.main}`
|
|
65
|
+
}
|
|
66
|
+
}),
|
|
67
|
+
"& .MuiFormHelperText-root": {
|
|
68
|
+
marginLeft: 0
|
|
69
|
+
},
|
|
70
|
+
"& .MuiFormLabel-root": {
|
|
71
|
+
marginBottom: 0.5
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const RadioGroup = (props) => {
|
|
76
|
+
const _a = props, {
|
|
77
|
+
options,
|
|
78
|
+
label,
|
|
79
|
+
row = true,
|
|
80
|
+
size = "small",
|
|
81
|
+
disabled = false,
|
|
82
|
+
error = false,
|
|
83
|
+
helperText,
|
|
84
|
+
bordered = true,
|
|
85
|
+
borderRadius = 10,
|
|
86
|
+
defaultValue,
|
|
87
|
+
preset,
|
|
88
|
+
sx
|
|
89
|
+
} = _a, rest = __objRest(_a, [
|
|
90
|
+
"options",
|
|
91
|
+
"label",
|
|
92
|
+
"row",
|
|
93
|
+
"size",
|
|
94
|
+
"disabled",
|
|
95
|
+
"error",
|
|
96
|
+
"helperText",
|
|
97
|
+
"bordered",
|
|
98
|
+
"borderRadius",
|
|
99
|
+
"defaultValue",
|
|
100
|
+
"preset",
|
|
101
|
+
"sx"
|
|
102
|
+
]);
|
|
103
|
+
const theme = useTheme();
|
|
104
|
+
const presetSx = resolvePreset("RadioGroup", preset, theme);
|
|
105
|
+
const buildSx = (effectiveError) => [
|
|
106
|
+
buildRadioGroupSx({ bordered, borderRadius, error: effectiveError }),
|
|
107
|
+
...presetSx ? [presetSx] : [],
|
|
108
|
+
...Array.isArray(sx) ? sx : [sx]
|
|
109
|
+
];
|
|
110
|
+
const renderOptions = (currentValue, _onChange, fieldName) => options.map((opt) => {
|
|
111
|
+
var _a2;
|
|
112
|
+
const inputId = (_a2 = opt.id) != null ? _a2 : `${fieldName != null ? fieldName : "radio"}-${opt.value}`;
|
|
113
|
+
return /* @__PURE__ */ jsx(
|
|
114
|
+
FormControlLabel,
|
|
115
|
+
{
|
|
116
|
+
value: opt.value,
|
|
117
|
+
control: /* @__PURE__ */ jsx(
|
|
118
|
+
Radio,
|
|
119
|
+
{
|
|
120
|
+
id: inputId,
|
|
121
|
+
size,
|
|
122
|
+
disabled: disabled || opt.disabled
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
label: opt.label,
|
|
126
|
+
checked: currentValue === opt.value,
|
|
127
|
+
disabled: disabled || opt.disabled
|
|
128
|
+
},
|
|
129
|
+
inputId
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
if ("control" in props && props.control) {
|
|
133
|
+
const { name: name2, control, validation } = props;
|
|
134
|
+
return /* @__PURE__ */ jsx(
|
|
135
|
+
Controller,
|
|
136
|
+
{
|
|
137
|
+
name: name2,
|
|
138
|
+
control,
|
|
139
|
+
rules: validation,
|
|
140
|
+
defaultValue,
|
|
141
|
+
render: ({ field, fieldState: { error: fieldError } }) => {
|
|
142
|
+
var _a2, _b;
|
|
143
|
+
const finalError = !!fieldError || error;
|
|
144
|
+
const finalHelperText = (_a2 = fieldError == null ? void 0 : fieldError.message) != null ? _a2 : helperText;
|
|
145
|
+
return /* @__PURE__ */ jsxs(
|
|
146
|
+
FormControl,
|
|
147
|
+
{
|
|
148
|
+
error: finalError,
|
|
149
|
+
disabled,
|
|
150
|
+
sx: buildSx(finalError),
|
|
151
|
+
fullWidth: true,
|
|
152
|
+
children: [
|
|
153
|
+
label && /* @__PURE__ */ jsx(FormLabel, { children: label }),
|
|
154
|
+
/* @__PURE__ */ jsx(
|
|
155
|
+
RadioGroup$1,
|
|
156
|
+
__spreadProps(__spreadValues({}, rest), {
|
|
157
|
+
row,
|
|
158
|
+
name: field.name,
|
|
159
|
+
value: (_b = field.value) != null ? _b : "",
|
|
160
|
+
onBlur: field.onBlur,
|
|
161
|
+
onChange: (_e, value2) => field.onChange(value2),
|
|
162
|
+
children: renderOptions(field.value, field.onChange, field.name)
|
|
163
|
+
})
|
|
164
|
+
),
|
|
165
|
+
finalHelperText && /* @__PURE__ */ jsx(FormHelperText, { children: finalHelperText })
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
const { value, onChange, name } = props;
|
|
174
|
+
return /* @__PURE__ */ jsxs(
|
|
175
|
+
FormControl,
|
|
176
|
+
{
|
|
177
|
+
error,
|
|
178
|
+
disabled,
|
|
179
|
+
sx: buildSx(error),
|
|
180
|
+
fullWidth: true,
|
|
181
|
+
children: [
|
|
182
|
+
label && /* @__PURE__ */ jsx(FormLabel, { children: label }),
|
|
183
|
+
/* @__PURE__ */ jsx(
|
|
184
|
+
RadioGroup$1,
|
|
185
|
+
__spreadProps(__spreadValues({}, rest), {
|
|
186
|
+
row,
|
|
187
|
+
name,
|
|
188
|
+
value: value != null ? value : "",
|
|
189
|
+
onChange: (_e, next) => onChange(next),
|
|
190
|
+
children: renderOptions(value, onChange, name)
|
|
191
|
+
})
|
|
192
|
+
),
|
|
193
|
+
helperText && /* @__PURE__ */ jsx(FormHelperText, { children: helperText })
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
);
|
|
197
|
+
};
|
|
198
|
+
export {
|
|
199
|
+
RadioGroup as R
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=RadioGroup-DMi9FvMP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioGroup-DMi9FvMP.js","sources":["../src/components/RadioGroup/RadioGroup.sx.ts","../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface BuildRadioGroupSxOptions {\n bordered: boolean;\n borderRadius: number | string;\n error: boolean;\n}\n\nconst toRadius = (borderRadius: number | string) =>\n typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius;\n\n/**\n * Transición compartida (matchea el InputGroup).\n */\nconst FOCUS_TRANSITION =\n 'border-color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms, ' +\n 'box-shadow 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms';\n\n/**\n * Builder de sx para RadioGroup. Reproduce el estilo del antiguo\n * `FormRadioGroup` legacy: contenedor con borde + padding vertical.\n *\n * Cuando `bordered=true`, el contenedor gana:\n * - `:focus-within` → borde + shadow primario (mismo patrón que `InputGroup`).\n * - `error=true` → borde + shadow de error (palette.error.main).\n *\n * El shadow es de 1px, así que no hay shift de layout — sólo se intensifica\n * visualmente el borde sin empujar nada alrededor.\n *\n * Si `bordered=false`, devuelve un sx mínimo (sólo helper text reset).\n */\nexport const buildRadioGroupSx = ({\n bordered,\n borderRadius,\n error,\n}: BuildRadioGroupSxOptions): SxProps<Theme> => {\n const radius = toRadius(borderRadius);\n\n if (!bordered) {\n return {\n '& .MuiFormHelperText-root': { marginLeft: 0 },\n };\n }\n\n return (theme) => ({\n '& .MuiRadioGroup-root': {\n paddingTop: 1.25,\n paddingBottom: 1.25,\n paddingX: 1.5,\n border: `1px solid ${\n error ? theme.palette.error.main : theme.palette.divider\n }`,\n borderRadius: radius,\n transition: FOCUS_TRANSITION,\n ...(error && {\n boxShadow: `0 0 0 1px ${theme.palette.error.main}`,\n }),\n // Focus del usuario sobre cualquier radio interno.\n '&:focus-within': {\n borderColor: error\n ? theme.palette.error.main\n : theme.palette.primary.main,\n boxShadow: `0 0 0 1px ${\n error ? theme.palette.error.main : theme.palette.primary.main\n }`,\n },\n },\n '& .MuiFormHelperText-root': {\n marginLeft: 0,\n },\n '& .MuiFormLabel-root': {\n marginBottom: 0.5,\n },\n });\n};\n","import { useTheme } from '@mui/material/styles';\nimport {\n FormControl,\n FormControlLabel,\n FormHelperText,\n FormLabel,\n Radio,\n RadioGroup as MuiRadioGroup,\n type RadioGroupProps as MuiRadioGroupProps,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport { Controller, type Control, type RegisterOptions } from 'react-hook-form';\n\nimport { buildRadioGroupSx } from './RadioGroup.sx';\nimport { resolvePreset } from '../_shared/resolvePreset';\n\n// ── Tipos de dominio ─────────────────────────────────────────────────────\nexport interface RadioOption {\n /** Valor que se emite cuando se selecciona la opción. */\n value: string;\n /** Texto mostrado al lado del radio. */\n label: string;\n /** Deshabilitar opción individualmente. */\n disabled?: boolean;\n /** ID custom del input (default: prefijo + value). */\n id?: string;\n}\n\nexport type RadioGroupSize = 'small' | 'medium';\n\n// ── Props base (todo lo común entre RHF y controlado) ────────────────────\nexport interface BaseRadioGroupProps\n extends Omit<MuiRadioGroupProps, 'value' | 'onChange' | 'defaultValue'> {\n options: RadioOption[];\n /** Label superior del grupo. */\n label?: string;\n /** Distribución horizontal (default: true — replica el comportamiento legacy). */\n row?: boolean;\n size?: RadioGroupSize;\n disabled?: boolean;\n error?: boolean;\n helperText?: string;\n /** Renderiza un contenedor con borde estilo \"form field\". Default: true. */\n bordered?: boolean;\n /** Border radius del contenedor (cuando bordered). Default: 10. */\n borderRadius?: number | string;\n defaultValue?: string;\n /**\n * Nombre del preset de estilo registrado en `theme.styles.RadioGroup`.\n * - `\"default\"` (o ausente) = estilo built-in del paquete.\n * - Cualquier otro string = mergea el preset encima del estilo built-in.\n */\n preset?: string;\n sx?: SxProps<Theme>;\n}\n\n// ── Variantes discriminadas (RHF vs controlado) ──────────────────────────\nexport interface RHFRadioGroupProps extends BaseRadioGroupProps {\n name: string;\n control: Control<any>;\n validation?: RegisterOptions;\n value?: never;\n onChange?: never;\n}\n\nexport interface ControlledRadioGroupProps extends BaseRadioGroupProps {\n name?: string;\n control?: never;\n validation?: never;\n value: string;\n onChange: (value: string) => void;\n}\n\n// ── API pública final ────────────────────────────────────────────────────\nexport type RadioGroupProps = RHFRadioGroupProps | ControlledRadioGroupProps;\n\nexport const RadioGroup: React.FC<RadioGroupProps> = (props) => {\n const {\n options,\n label,\n row = true,\n size = 'small',\n disabled = false,\n error = false,\n helperText,\n bordered = true,\n borderRadius = 10,\n defaultValue,\n preset,\n sx,\n ...rest\n } = props as ControlledRadioGroupProps & {\n control?: Control<any>;\n validation?: RegisterOptions;\n };\n\n const theme = useTheme();\n const presetSx = resolvePreset('RadioGroup', preset, theme);\n\n // Construye el sx con el estado de error efectivo; se llama por rama\n // (RHF usa el error del Controller, controlado usa el prop `error`).\n const buildSx = (effectiveError: boolean) => [\n buildRadioGroupSx({ bordered, borderRadius, error: effectiveError }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : [sx]),\n ];\n\n const renderOptions = (\n currentValue: string | undefined,\n _onChange: (value: string) => void,\n fieldName?: string,\n ) =>\n options.map((opt) => {\n const inputId = opt.id ?? `${fieldName ?? 'radio'}-${opt.value}`;\n return (\n <FormControlLabel\n key={inputId}\n value={opt.value}\n control={\n <Radio\n id={inputId}\n size={size}\n disabled={disabled || opt.disabled}\n />\n }\n label={opt.label}\n checked={currentValue === opt.value}\n disabled={disabled || opt.disabled}\n />\n );\n });\n\n // ── RHF mode ──────────────────────────────────────────────────────────\n if ('control' in props && props.control) {\n const { name, control, validation } = props as RHFRadioGroupProps;\n return (\n <Controller\n name={name}\n control={control}\n rules={validation}\n defaultValue={defaultValue}\n render={({ field, fieldState: { error: fieldError } }) => {\n const finalError = !!fieldError || error;\n const finalHelperText = fieldError?.message ?? helperText;\n return (\n <FormControl\n error={finalError}\n disabled={disabled}\n sx={buildSx(finalError)}\n fullWidth\n >\n {label && <FormLabel>{label}</FormLabel>}\n <MuiRadioGroup\n {...rest}\n row={row}\n name={field.name}\n value={field.value ?? ''}\n onBlur={field.onBlur}\n onChange={(_e, value) => field.onChange(value)}\n >\n {renderOptions(field.value, field.onChange, field.name)}\n </MuiRadioGroup>\n {finalHelperText && <FormHelperText>{finalHelperText}</FormHelperText>}\n </FormControl>\n );\n }}\n />\n );\n }\n\n // ── Controlled mode ───────────────────────────────────────────────────\n const { value, onChange, name } = props as ControlledRadioGroupProps;\n return (\n <FormControl\n error={error}\n disabled={disabled}\n sx={buildSx(error)}\n fullWidth\n >\n {label && <FormLabel>{label}</FormLabel>}\n <MuiRadioGroup\n {...rest}\n row={row}\n name={name}\n value={value ?? ''}\n onChange={(_e, next) => onChange(next)}\n >\n {renderOptions(value, onChange, name)}\n </MuiRadioGroup>\n {helperText && <FormHelperText>{helperText}</FormHelperText>}\n </FormControl>\n );\n};\n\nexport default RadioGroup;\n"],"names":["_a","name","MuiRadioGroup","value"],"mappings":"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"}
|