@soyfri/shared-library 1.5.0 → 2.0.0-beta.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/dist/components/ActionMenu/ActionMenu.cjs +107 -0
- package/dist/components/ActionMenu/ActionMenu.cjs.map +1 -0
- package/dist/components/ActionMenu/ActionMenu.d.ts +60 -0
- package/dist/components/ActionMenu/ActionMenu.js +107 -0
- package/dist/components/ActionMenu/ActionMenu.js.map +1 -0
- package/dist/components/ActionMenu/index.d.ts +2 -0
- package/dist/components/ActionMenu.d.ts +6 -0
- package/dist/components/AppBar/AppBar.cjs +346 -0
- package/dist/components/AppBar/AppBar.cjs.map +1 -0
- package/dist/components/AppBar/AppBar.d.ts +55 -0
- package/dist/components/AppBar/AppBar.js +346 -0
- package/dist/components/AppBar/AppBar.js.map +1 -0
- package/dist/components/AppBar/AppBar.sx.d.ts +12 -0
- package/dist/components/AppBar/AppBarBrand.d.ts +31 -0
- package/dist/components/AppBar/AppBarContext.d.ts +18 -0
- package/dist/components/AppBar/AppBarMenuToggle.d.ts +39 -0
- package/dist/components/AppBar/AppBarUserMenu.d.ts +65 -0
- package/dist/components/AppBar/index.d.ts +12 -0
- package/dist/components/AppBar.d.ts +6 -0
- package/dist/components/Autocomplete/Autocomplete.cjs +259 -54
- package/dist/components/Autocomplete/Autocomplete.cjs.map +1 -1
- package/dist/components/Autocomplete/Autocomplete.d.ts +64 -9
- package/dist/components/Autocomplete/Autocomplete.definitions.d.ts +6 -0
- package/dist/components/Autocomplete/Autocomplete.helpers.d.ts +18 -0
- package/dist/components/Autocomplete/Autocomplete.js +261 -56
- package/dist/components/Autocomplete/Autocomplete.js.map +1 -1
- package/dist/components/Autocomplete/Autocomplete.sx.d.ts +7 -0
- package/dist/components/Autocomplete/Autocomplete.types.d.ts +1 -0
- package/dist/components/Autocomplete/_parts/AutocompleteChips.d.ts +19 -0
- package/dist/components/Autocomplete/_parts/AutocompleteLoader.d.ts +9 -0
- package/dist/components/Autocomplete/_parts/AutocompleteOption.d.ts +19 -0
- package/dist/components/Autocomplete/index.d.ts +2 -1
- package/dist/components/Autocomplete.d.ts +4 -0
- package/dist/components/Avatar/Avatar.cjs +116 -79
- package/dist/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.d.ts +16 -2
- package/dist/components/Avatar/Avatar.definitions.d.ts +11 -0
- package/dist/components/Avatar/Avatar.js +117 -80
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Card/Card.cjs +168 -9
- package/dist/components/Card/Card.cjs.map +1 -1
- package/dist/components/Card/Card.d.ts +78 -8
- package/dist/components/Card/Card.js +170 -11
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Card/Card.sx.d.ts +17 -0
- package/dist/components/Card/index.d.ts +4 -1
- package/dist/components/Card.d.ts +4 -0
- package/dist/components/DatePicker/DatePicker.cjs +201 -3
- package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +47 -9
- package/dist/components/DatePicker/DatePicker.definitions.d.ts +1 -0
- package/dist/components/DatePicker/DatePicker.helpers.d.ts +7 -0
- package/dist/components/DatePicker/DatePicker.js +200 -2
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.sx.d.ts +9 -0
- package/dist/components/DatePicker/DatePicker.types.d.ts +1 -0
- package/dist/components/DatePicker/index.d.ts +2 -1
- package/dist/components/DatePicker.d.ts +4 -0
- package/dist/components/DateTimePicker/DateTimePicker.cjs +152 -138
- package/dist/components/DateTimePicker/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.d.ts +46 -9
- package/dist/components/DateTimePicker/DateTimePicker.definitions.d.ts +1 -0
- package/dist/components/DateTimePicker/DateTimePicker.helpers.d.ts +11 -0
- package/dist/components/DateTimePicker/DateTimePicker.js +152 -138
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.sx.d.ts +7 -0
- package/dist/components/DateTimePicker/DateTimePicker.types.d.ts +1 -0
- package/dist/components/DateTimePicker/index.d.ts +2 -1
- package/dist/components/DateTimePicker.d.ts +4 -0
- package/dist/components/Drawer/Drawer.cjs +271 -0
- package/dist/components/Drawer/Drawer.cjs.map +1 -0
- package/dist/components/Drawer/Drawer.d.ts +51 -0
- package/dist/components/Drawer/Drawer.js +271 -0
- package/dist/components/Drawer/Drawer.js.map +1 -0
- package/dist/components/Drawer/Drawer.sx.d.ts +23 -0
- package/dist/components/Drawer/DrawerContext.d.ts +18 -0
- package/dist/components/Drawer/DrawerItem.d.ts +35 -0
- package/dist/components/Drawer/index.d.ts +6 -0
- package/dist/components/Drawer.d.ts +6 -0
- package/dist/components/Icon/Icon.cjs +44 -3
- package/dist/components/Icon/Icon.cjs.map +1 -1
- package/dist/components/Icon/Icon.d.ts +34 -1
- package/dist/components/Icon/Icon.js +44 -3
- package/dist/components/Icon/Icon.js.map +1 -1
- package/dist/components/Input/Input.cjs +173 -3
- package/dist/components/Input/Input.cjs.map +1 -1
- package/dist/components/Input/Input.d.ts +20 -15
- package/dist/components/Input/Input.definitions.d.ts +5 -2
- package/dist/components/Input/Input.helpers.d.ts +14 -0
- package/dist/components/Input/Input.js +172 -2
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Input/Input.sx.d.ts +8 -0
- package/dist/components/Input/Input.types.d.ts +1 -0
- package/dist/components/Input/index.d.ts +2 -1
- package/dist/components/Input.d.ts +4 -0
- package/dist/components/InputGroup/InputGroup.cjs +104 -91
- package/dist/components/InputGroup/InputGroup.cjs.map +1 -1
- package/dist/components/InputGroup/InputGroup.d.ts +37 -1
- package/dist/components/InputGroup/InputGroup.definitions.d.ts +6 -0
- package/dist/components/InputGroup/InputGroup.js +106 -93
- package/dist/components/InputGroup/InputGroup.js.map +1 -1
- package/dist/components/Modal/Modal.cjs +226 -116
- package/dist/components/Modal/Modal.cjs.map +1 -1
- package/dist/components/Modal/Modal.d.ts +38 -2
- package/dist/components/Modal/Modal.js +227 -117
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/ModalFooter.d.ts +9 -1
- package/dist/components/Modal/index.d.ts +5 -0
- package/dist/components/PageLoader/PageLoader.cjs +61 -0
- package/dist/components/PageLoader/PageLoader.cjs.map +1 -0
- package/dist/components/PageLoader/PageLoader.d.ts +38 -0
- package/dist/components/PageLoader/PageLoader.js +61 -0
- package/dist/components/PageLoader/PageLoader.js.map +1 -0
- package/dist/components/PageLoader/index.d.ts +2 -0
- package/dist/components/PageLoader.d.ts +6 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.cjs +79 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.cjs.map +1 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.d.ts +48 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.js +79 -0
- package/dist/components/ScrollTopButton/ScrollTopButton.js.map +1 -0
- package/dist/components/ScrollTopButton/index.d.ts +4 -0
- package/dist/components/ScrollTopButton/scrollToTop.d.ts +29 -0
- package/dist/components/ScrollTopButton.d.ts +6 -0
- package/dist/components/Select/Select.cjs +446 -4
- package/dist/components/Select/Select.cjs.map +1 -1
- package/dist/components/Select/Select.d.ts +33 -13
- package/dist/components/Select/Select.definitions.d.ts +3 -0
- package/dist/components/Select/Select.helpers.d.ts +28 -0
- package/dist/components/Select/Select.js +445 -3
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/Select.sx.d.ts +7 -0
- package/dist/components/Select/Select.types.d.ts +1 -0
- package/dist/components/Select/_parts/SelectMenuItem.d.ts +20 -0
- package/dist/components/Select/_parts/SelectSearchHeader.d.ts +15 -0
- package/dist/components/Select/_parts/SelectValue.d.ts +22 -0
- package/dist/components/Select/index.d.ts +2 -1
- package/dist/components/Select.d.ts +4 -0
- package/dist/components/Stat/Stat.cjs +1 -1
- package/dist/components/Stat/Stat.js +1 -1
- package/dist/components/Stepper/Stepper.cjs +4 -1
- package/dist/components/Stepper/Stepper.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.d.ts +5 -0
- package/dist/components/Stepper/Stepper.js +4 -1
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/_shared/formField.sx.d.ts +33 -0
- package/dist/components/_shared/resolvePreset.d.ts +18 -0
- package/dist/formField.sx-CQ1mbk9M.cjs +76 -0
- package/dist/formField.sx-CQ1mbk9M.cjs.map +1 -0
- package/dist/formField.sx-DfVbMe0V.js +77 -0
- package/dist/formField.sx-DfVbMe0V.js.map +1 -0
- package/dist/hooks/Wizard/Wizard.cjs +7 -0
- package/dist/hooks/Wizard/Wizard.cjs.map +1 -0
- package/dist/hooks/Wizard/Wizard.js +7 -0
- package/dist/hooks/Wizard/Wizard.js.map +1 -0
- package/dist/hooks/Wizard/WizardContext.d.ts +67 -0
- package/dist/hooks/Wizard/index.d.ts +3 -0
- package/dist/hooks/Wizard/useWizard.d.ts +9 -0
- package/dist/hooks/Wizard.d.ts +2 -0
- package/dist/index.cjs +99 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +31 -2
- package/dist/index.js.map +1 -1
- package/dist/mui.d.ts +5 -0
- package/dist/resolvePreset-B-IB0ehH.js +15 -0
- package/dist/resolvePreset-B-IB0ehH.js.map +1 -0
- package/dist/resolvePreset-CT3kU-K2.cjs +14 -0
- package/dist/resolvePreset-CT3kU-K2.cjs.map +1 -0
- package/dist/styles.css +3 -112
- package/dist/theme/componentStyles.d.ts +32 -0
- package/dist/theme/tokens.d.ts +28 -0
- package/dist/useWizard-CWdIxZzX.cjs +94 -0
- package/dist/useWizard-CWdIxZzX.cjs.map +1 -0
- package/dist/useWizard-CWq--C3o.js +95 -0
- package/dist/useWizard-CWq--C3o.js.map +1 -0
- package/package.json +1 -1
- package/src/components/ActionMenu/ActionMenu.stories.tsx +230 -0
- package/src/components/ActionMenu/ActionMenu.tsx +174 -0
- package/src/components/ActionMenu/index.ts +2 -0
- package/src/components/AppBar/AppBar.stories.tsx +272 -0
- package/src/components/AppBar/AppBar.sx.ts +32 -0
- package/src/components/AppBar/AppBar.tsx +123 -0
- package/src/components/AppBar/AppBarBrand.tsx +120 -0
- package/src/components/AppBar/AppBarContext.ts +25 -0
- package/src/components/AppBar/AppBarMenuToggle.tsx +90 -0
- package/src/components/AppBar/AppBarUserMenu.tsx +217 -0
- package/src/components/AppBar/index.ts +25 -0
- package/src/components/Autocomplete/Autocomplete.definitions.ts +223 -0
- package/src/components/Autocomplete/Autocomplete.helpers.ts +60 -0
- package/src/components/Autocomplete/Autocomplete.stories.tsx +363 -2
- package/src/components/Autocomplete/Autocomplete.sx.ts +30 -0
- package/src/components/Autocomplete/Autocomplete.tsx +312 -90
- package/src/components/Autocomplete/Autocomplete.types.ts +13 -0
- package/src/components/Autocomplete/_parts/AutocompleteChips.tsx +55 -0
- package/src/components/Autocomplete/_parts/AutocompleteLoader.tsx +17 -0
- package/src/components/Autocomplete/_parts/AutocompleteOption.tsx +31 -0
- package/src/components/Autocomplete/index.ts +12 -1
- package/src/components/Avatar/Avatar.definitions.ts +162 -0
- package/src/components/Avatar/Avatar.stories.tsx +205 -1
- package/src/components/Avatar/Avatar.tsx +166 -103
- package/src/components/Card/Card.stories.tsx +205 -16
- package/src/components/Card/Card.sx.ts +104 -0
- package/src/components/Card/Card.tsx +191 -35
- package/src/components/Card/index.ts +9 -1
- package/src/components/DatePicker/DatePicker.definitions.ts +24 -1
- package/src/components/DatePicker/DatePicker.helpers.ts +24 -0
- package/src/components/DatePicker/DatePicker.stories.tsx +29 -2
- package/src/components/DatePicker/DatePicker.sx.ts +33 -0
- package/src/components/DatePicker/DatePicker.tsx +163 -139
- package/src/components/DatePicker/DatePicker.types.ts +10 -0
- package/src/components/DatePicker/index.ts +9 -1
- package/src/components/DateTimePicker/DateTimePicker.definitions.ts +24 -0
- package/src/components/DateTimePicker/DateTimePicker.helpers.ts +38 -0
- package/src/components/DateTimePicker/DateTimePicker.stories.tsx +29 -1
- package/src/components/DateTimePicker/DateTimePicker.sx.ts +30 -0
- package/src/components/DateTimePicker/DateTimePicker.tsx +200 -166
- package/src/components/DateTimePicker/DateTimePicker.types.ts +10 -0
- package/src/components/DateTimePicker/index.ts +9 -1
- package/src/components/Drawer/Drawer.stories.tsx +270 -0
- package/src/components/Drawer/Drawer.sx.ts +106 -0
- package/src/components/Drawer/Drawer.tsx +214 -0
- package/src/components/Drawer/DrawerContext.ts +26 -0
- package/src/components/Drawer/DrawerItem.tsx +110 -0
- package/src/components/Drawer/index.ts +10 -0
- package/src/components/Flyout/Flyout.stories.tsx +26 -18
- package/src/components/Icon/Icon.stories.tsx +68 -1
- package/src/components/Icon/Icon.tsx +87 -6
- package/src/components/Input/Input.definitions.ts +74 -2
- package/src/components/Input/Input.helpers.ts +49 -0
- package/src/components/Input/Input.stories.tsx +116 -4
- package/src/components/Input/Input.sx.ts +42 -0
- package/src/components/Input/Input.tsx +117 -162
- package/src/components/Input/Input.types.ts +10 -0
- package/src/components/Input/index.ts +9 -1
- package/src/components/InputGroup/InputGroup.definitions.ts +158 -0
- package/src/components/InputGroup/InputGroup.stories.tsx +159 -28
- package/src/components/InputGroup/InputGroup.tsx +159 -116
- package/src/components/Modal/Modal.stories.tsx +434 -6
- package/src/components/Modal/Modal.tsx +303 -121
- package/src/components/Modal/ModalFooter.tsx +22 -12
- package/src/components/Modal/index.ts +6 -1
- package/src/components/PageLoader/PageLoader.stories.tsx +217 -0
- package/src/components/PageLoader/PageLoader.tsx +96 -0
- package/src/components/PageLoader/index.ts +2 -0
- package/src/components/ScrollTopButton/ScrollTopButton.stories.tsx +158 -0
- package/src/components/ScrollTopButton/ScrollTopButton.tsx +135 -0
- package/src/components/ScrollTopButton/index.ts +8 -0
- package/src/components/ScrollTopButton/scrollToTop.ts +37 -0
- package/src/components/Select/Select.definitions.ts +114 -0
- package/src/components/Select/Select.helpers.ts +71 -0
- package/src/components/Select/Select.stories.tsx +126 -8
- package/src/components/Select/Select.sx.ts +14 -0
- package/src/components/Select/Select.tsx +246 -285
- package/src/components/Select/Select.types.ts +15 -0
- package/src/components/Select/_parts/SelectMenuItem.tsx +40 -0
- package/src/components/Select/_parts/SelectSearchHeader.tsx +51 -0
- package/src/components/Select/_parts/SelectValue.tsx +96 -0
- package/src/components/Select/index.ts +14 -1
- package/src/components/Stepper/Stepper.tsx +17 -1
- package/src/components/Tooltip/Tooltip.stories.tsx +15 -3
- package/src/components/_shared/formField.sx.ts +118 -0
- package/src/components/_shared/resolvePreset.ts +35 -0
- package/src/hooks/Wizard/Wizard.stories.tsx +301 -0
- package/src/hooks/Wizard/WizardContext.tsx +166 -0
- package/src/hooks/Wizard/index.ts +6 -0
- package/src/hooks/Wizard/useWizard.ts +13 -0
- package/src/index.ts +17 -1
- package/src/mui.ts +44 -0
- package/src/theme/componentStyles.ts +47 -0
- package/src/theme/tokens.ts +43 -0
- package/dist/DatePicker-BSNboVhN.js +0 -201
- package/dist/DatePicker-BSNboVhN.js.map +0 -1
- package/dist/DatePicker-BoqxWAhj.cjs +0 -200
- package/dist/DatePicker-BoqxWAhj.cjs.map +0 -1
- package/dist/Input-DFHs7cJ_.js +0 -171
- package/dist/Input-DFHs7cJ_.js.map +0 -1
- package/dist/Input-c8MwNNPg.cjs +0 -170
- package/dist/Input-c8MwNNPg.cjs.map +0 -1
- package/dist/Select-BO2N56sm.cjs +0 -411
- package/dist/Select-BO2N56sm.cjs.map +0 -1
- package/dist/Select-BcLkyHSE.js +0 -412
- package/dist/Select-BcLkyHSE.js.map +0 -1
- package/dist/index.css +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import { Avatar as MuiAvatar
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Avatar as MuiAvatar,\n Box,\n Tooltip,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\n\nexport interface AvatarItem {\n text?: string;\n imageUrl?: string;\n badge?: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl' | number;\n\nexport interface AvatarProps {\n type?: string;\n items: AvatarItem[];\n displayedAvatars?: number;\n size?: AvatarSize;\n showText?: boolean;\n showTooltip?: boolean;\n /**\n * sx aplicado al contenedor raíz.\n */\n sx?: SxProps<Theme>;\n /**\n * sx aplicado a cada MuiAvatar individual (se mergea sobre los defaults).\n */\n avatarSx?: SxProps<Theme>;\n className?: string;\n /**\n * Overlap (px) entre avatares cuando hay varios. Default depende del tamaño.\n */\n overlap?: number;\n}\n\n// Escala alineada con la escala de MUI (sm=32, md=40, lg=56, xl=96) con borde\n// proporcional para el efecto stacked.\nconst sizeMap: Record<\n Exclude<AvatarSize, number>,\n { px: number; border: number; font: number; overlap: number }\n> = {\n sm: { px: 32, border: 2, font: 14, overlap: 8 },\n md: { px: 40, border: 2, font: 16, overlap: 10 },\n lg: { px: 56, border: 3, font: 22, overlap: 14 },\n xl: { px: 96, border: 4, font: 36, overlap: 20 },\n};\n\nconst resolveSize = (size: AvatarSize) => {\n if (typeof size === 'number') {\n return {\n px: size,\n border: Math.max(2, Math.round(size * 0.05)),\n font: Math.round(size * 0.4),\n overlap: Math.round(size * 0.25),\n };\n }\n return sizeMap[size];\n};\n\nconst mergeSx = (base: SxProps<Theme>, extra?: SxProps<Theme>): SxProps<Theme> => {\n if (!extra) return base;\n const baseArr = Array.isArray(base) ? base : [base];\n const extraArr = Array.isArray(extra) ? extra : [extra];\n return [...baseArr, ...extraArr] as SxProps<Theme>;\n};\n\nexport const Avatar: React.FC<AvatarProps> = ({\n items,\n type,\n displayedAvatars = 4,\n size = 'sm',\n showText = true,\n showTooltip = false,\n sx,\n avatarSx,\n className,\n overlap,\n}) => {\n const [errorIndex, setErrorIndex] = useState<Set<number>>(new Set());\n\n const handleImageError = (index: number) => {\n setErrorIndex((prev) => {\n const next = new Set(prev);\n next.add(index);\n return next;\n });\n };\n\n if (!items || items.length === 0) {\n return null;\n }\n\n const s = resolveSize(size);\n const effectiveOverlap = overlap ?? s.overlap;\n const visibleItems = items.slice(0, displayedAvatars);\n\n const baseAvatarSx: SxProps<Theme> = {\n width: s.px,\n height: s.px,\n fontSize: s.font,\n fontWeight: 700,\n border: (theme) => `${s.border}px solid ${theme.palette.background.paper}`,\n boxSizing: 'content-box',\n };\n\n const renderSingleAvatar = (item: AvatarItem, i: number) => {\n const hasImage = !!item.imageUrl && !errorIndex.has(i);\n const showBadgeFallback = !!item.badge;\n\n // Defaults tirando al theme; item.color / item.backgroundColor tienen prioridad.\n const itemSx: SxProps<Theme> = {\n bgcolor: item.backgroundColor ?? 'action.selected',\n color: item.color ?? 'text.secondary',\n // Stacking manual: margen negativo al segundo avatar en adelante.\n ...(i > 0 && { marginLeft: `-${effectiveOverlap}px` }),\n zIndex: visibleItems.length - i,\n };\n\n const finalSx = mergeSx(mergeSx(baseAvatarSx, itemSx), avatarSx);\n\n const avatarEl = (\n <MuiAvatar\n data-testid=\"avatar\"\n alt={item.text || 'User avatar'}\n src={hasImage ? item.imageUrl : undefined}\n imgProps={{\n 'data-testid': 'image',\n onError: () => handleImageError(i),\n } as React.ImgHTMLAttributes<HTMLImageElement>}\n sx={finalSx}\n >\n {!hasImage && showBadgeFallback ? (\n <span data-testid=\"badge\" aria-label={item.text}>\n {item.badge}\n </span>\n ) : !hasImage ? (\n <AccountCircleIcon\n data-testid=\"icon\"\n aria-label={item.text}\n sx={{ width: '100%', height: '100%' }}\n />\n ) : null}\n </MuiAvatar>\n );\n\n if (showTooltip && item.text) {\n return (\n <Tooltip key={i} title={item.text}>\n {avatarEl}\n </Tooltip>\n );\n }\n return <React.Fragment key={i}>{avatarEl}</React.Fragment>;\n };\n\n return (\n <Box\n data-testid=\"avatar-container\"\n className={className}\n sx={mergeSx(\n {\n display: 'flex',\n alignItems: 'center',\n lineHeight: 1,\n width: 'fit-content',\n },\n sx,\n )}\n >\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n {visibleItems.map((item, i) => renderSingleAvatar(item, i))}\n </Box>\n\n {showText && items[0]?.text && (\n <Typography\n data-testid=\"text\"\n variant=\"caption\"\n sx={{\n ml: 1,\n fontSize: '0.75rem',\n fontWeight: 400,\n color: 'text.primary',\n }}\n >\n {type && items.length === 1 && (\n <Box component=\"span\" data-testid=\"type\" sx={{ mr: 0.5 }}>\n {type}:\n </Box>\n )}\n {items[0].text}\n {items.length > 1 && ` +${items.length - 1}`}\n </Typography>\n )}\n </Box>\n );\n};\n\nexport default Avatar;\n"],"names":["_a","MuiAvatar","React"],"mappings":"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"}
|
|
@@ -1,28 +1,187 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty
|
|
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
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
22
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
23
|
const material = require("@mui/material");
|
|
5
|
-
const
|
|
24
|
+
const resolvePreset = require("../../resolvePreset-CT3kU-K2.cjs");
|
|
25
|
+
const paddingMap = {
|
|
26
|
+
none: 0,
|
|
27
|
+
dense: 1.5,
|
|
28
|
+
normal: 2.5,
|
|
29
|
+
loose: 4
|
|
30
|
+
};
|
|
31
|
+
function buildCardSx({
|
|
32
|
+
variant,
|
|
33
|
+
padding,
|
|
34
|
+
clickable
|
|
35
|
+
}) {
|
|
36
|
+
return (theme) => __spreadProps(__spreadValues({
|
|
37
|
+
borderRadius: 2,
|
|
38
|
+
backgroundColor: "background.paper",
|
|
39
|
+
boxShadow: variant === "elevated" ? theme.shadows[1] : "none",
|
|
40
|
+
border: variant === "outlined" ? `1px solid ${theme.palette.divider}` : "none",
|
|
41
|
+
transition: theme.transitions.create(
|
|
42
|
+
["box-shadow", "transform", "border-color"],
|
|
43
|
+
{ duration: theme.transitions.duration.shorter }
|
|
44
|
+
),
|
|
45
|
+
cursor: clickable ? "pointer" : "default"
|
|
46
|
+
}, clickable && {
|
|
47
|
+
"&:hover": {
|
|
48
|
+
boxShadow: variant === "elevated" ? theme.shadows[3] : variant === "outlined" ? theme.shadows[1] : "none",
|
|
49
|
+
transform: variant !== "plain" ? "translateY(-1px)" : "none"
|
|
50
|
+
},
|
|
51
|
+
"&:active": {
|
|
52
|
+
transform: "translateY(0)"
|
|
53
|
+
}
|
|
54
|
+
}), {
|
|
55
|
+
// Body padding (cuando no hay header/footer envolventes). Para el caso
|
|
56
|
+
// compuesto los slots manejan su propio padding, dejamos el root en 0.
|
|
57
|
+
p: paddingMap[padding]
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function buildCardHeaderSx() {
|
|
61
|
+
return (theme) => ({
|
|
62
|
+
display: "flex",
|
|
63
|
+
alignItems: "center",
|
|
64
|
+
gap: 1.5,
|
|
65
|
+
px: 2.5,
|
|
66
|
+
py: 1.75,
|
|
67
|
+
borderBottom: `1px solid ${theme.palette.divider}`,
|
|
68
|
+
"& .card-header-text": {
|
|
69
|
+
flex: 1,
|
|
70
|
+
minWidth: 0
|
|
71
|
+
},
|
|
72
|
+
"& .card-header-actions": {
|
|
73
|
+
display: "flex",
|
|
74
|
+
alignItems: "center",
|
|
75
|
+
gap: 0.5,
|
|
76
|
+
flexShrink: 0
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function buildCardBodySx(padding) {
|
|
81
|
+
return {
|
|
82
|
+
px: padding === "none" ? 0 : padding === "dense" ? 1.5 : padding === "loose" ? 4 : 2.5,
|
|
83
|
+
py: padding === "none" ? 0 : padding === "dense" ? 1.5 : padding === "loose" ? 4 : 2.5
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function buildCardFooterSx() {
|
|
87
|
+
return (theme) => ({
|
|
88
|
+
display: "flex",
|
|
89
|
+
alignItems: "center",
|
|
90
|
+
justifyContent: "flex-end",
|
|
91
|
+
gap: 1,
|
|
92
|
+
px: 2.5,
|
|
93
|
+
py: 1.5,
|
|
94
|
+
borderTop: `1px solid ${theme.palette.divider}`,
|
|
95
|
+
backgroundColor: theme.palette.action.hover
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function Card({
|
|
6
99
|
children,
|
|
100
|
+
title,
|
|
101
|
+
subtitle,
|
|
102
|
+
actions,
|
|
103
|
+
header,
|
|
104
|
+
footer,
|
|
105
|
+
variant,
|
|
106
|
+
padding = "normal",
|
|
107
|
+
clickable = false,
|
|
108
|
+
preset,
|
|
7
109
|
raised,
|
|
8
110
|
sx,
|
|
9
|
-
|
|
111
|
+
bodySx,
|
|
112
|
+
headerSx,
|
|
113
|
+
footerSx,
|
|
10
114
|
onClick,
|
|
11
115
|
onBlur,
|
|
116
|
+
className,
|
|
12
117
|
"data-testid": dataTestId
|
|
13
|
-
})
|
|
14
|
-
|
|
118
|
+
}) {
|
|
119
|
+
const theme = material.useTheme();
|
|
120
|
+
const resolvedVariant = raised ? "elevated" : variant != null ? variant : "elevated";
|
|
121
|
+
const hasHeader = Boolean(header || title || subtitle || actions);
|
|
122
|
+
const hasFooter = Boolean(footer);
|
|
123
|
+
const isCompound = hasHeader || hasFooter;
|
|
124
|
+
const rootPadding = isCompound ? "none" : padding;
|
|
125
|
+
const presetSx = resolvePreset.resolvePreset("Card", preset, theme);
|
|
126
|
+
const rootSx = [
|
|
127
|
+
buildCardSx({
|
|
128
|
+
variant: resolvedVariant,
|
|
129
|
+
padding: rootPadding,
|
|
130
|
+
clickable: clickable || Boolean(onClick)
|
|
131
|
+
}),
|
|
132
|
+
...presetSx ? [presetSx] : [],
|
|
133
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
134
|
+
];
|
|
135
|
+
const renderHeader = () => {
|
|
136
|
+
if (header) return /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: [buildCardHeaderSx(), ...Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : []], children: header });
|
|
137
|
+
if (!title && !subtitle && !actions) return null;
|
|
138
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: [buildCardHeaderSx(), ...Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : []], children: [
|
|
139
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Box, { className: "card-header-text", children: [
|
|
140
|
+
title && /* @__PURE__ */ jsxRuntime.jsx(
|
|
141
|
+
material.Typography,
|
|
142
|
+
{
|
|
143
|
+
variant: "subtitle1",
|
|
144
|
+
component: "div",
|
|
145
|
+
sx: { fontWeight: 600, lineHeight: 1.3 },
|
|
146
|
+
noWrap: true,
|
|
147
|
+
children: title
|
|
148
|
+
}
|
|
149
|
+
),
|
|
150
|
+
subtitle && /* @__PURE__ */ jsxRuntime.jsx(
|
|
151
|
+
material.Typography,
|
|
152
|
+
{
|
|
153
|
+
variant: "caption",
|
|
154
|
+
color: "text.secondary",
|
|
155
|
+
component: "div",
|
|
156
|
+
noWrap: true,
|
|
157
|
+
children: subtitle
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
] }),
|
|
161
|
+
actions && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { className: "card-header-actions", children: actions })
|
|
162
|
+
] });
|
|
163
|
+
};
|
|
164
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
15
165
|
material.Card,
|
|
16
166
|
{
|
|
17
|
-
|
|
18
|
-
sx,
|
|
167
|
+
sx: rootSx,
|
|
19
168
|
className,
|
|
20
169
|
"data-testid": dataTestId,
|
|
21
170
|
onClick,
|
|
22
171
|
onBlur,
|
|
23
|
-
|
|
172
|
+
elevation: 0,
|
|
173
|
+
children: [
|
|
174
|
+
renderHeader(),
|
|
175
|
+
isCompound ? /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: [buildCardBodySx(padding), ...Array.isArray(bodySx) ? bodySx : bodySx ? [bodySx] : []], children }) : children,
|
|
176
|
+
hasFooter && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { sx: [buildCardFooterSx(), ...Array.isArray(footerSx) ? footerSx : footerSx ? [footerSx] : []], children: footer })
|
|
177
|
+
]
|
|
24
178
|
}
|
|
25
179
|
);
|
|
26
|
-
}
|
|
180
|
+
}
|
|
27
181
|
exports.Card = Card;
|
|
182
|
+
exports.buildCardBodySx = buildCardBodySx;
|
|
183
|
+
exports.buildCardFooterSx = buildCardFooterSx;
|
|
184
|
+
exports.buildCardHeaderSx = buildCardHeaderSx;
|
|
185
|
+
exports.buildCardSx = buildCardSx;
|
|
186
|
+
exports.default = Card;
|
|
28
187
|
//# sourceMappingURL=Card.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.cjs","sources":["../../../src/components/Card/Card.tsx"],"sourcesContent":["import { CardActions, Card as MuiCard } from \"@mui/material\";\nimport type { CardProps } from \"@mui/material/Card\";\nimport { CardContent as MuiCardContent } from \"@mui/material\";\n\n\ntype PickCardProps = Pick<CardProps, 'children' | 'raised' | 'sx' | 'className' | 'sx'>;\n\nexport interface MyCardProps extends PickCardProps {\n children?: React.ReactNode;\n raised?: boolean;\n className?: string\n onClick?: () => void;\n onBlur?: () => void;\n \"data-testid\"?: string;\n sx?: object;\n}\n\nexport const Card: React.FC<MyCardProps> = ({\n children,\n raised,\n sx,\n className,\n onClick,\n onBlur,\n \"data-testid\": dataTestId\n}) => {\n return (\n <MuiCard\n raised={raised}\n sx={sx}\n className={className}\n data-testid={dataTestId}\n onClick={onClick}\n onBlur={onBlur}\n\n >\n\n {children}\n\n </MuiCard>\n );\n};\n\nexport default Card;"],"names":["jsx","MuiCard"],"mappings":";;;;AAiBO,MAAM,OAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACnB,MAAM;AACF,SACIA,2BAAAA;AAAAA,IAACC,SAAAA;AAAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA;AAAA,MAIC;AAAA,IAAA;AAAA,EAAA;AAIb;;"}
|
|
1
|
+
{"version":3,"file":"Card.cjs","sources":["../../../src/components/Card/Card.sx.ts","../../../src/components/Card/Card.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles';\n\nexport type CardVariant = 'elevated' | 'outlined' | 'plain';\nexport type CardPadding = 'none' | 'dense' | 'normal' | 'loose';\n\nexport interface BuildCardSxArgs {\n variant: CardVariant;\n padding: CardPadding;\n clickable: boolean;\n}\n\nconst paddingMap: Record<CardPadding, number> = {\n none: 0,\n dense: 1.5,\n normal: 2.5,\n loose: 4,\n};\n\n/**\n * Estilo base del Card (root). La props `sx` del consumer se compone encima\n * junto al preset resuelto (en Card.tsx). Este builder solo se ocupa del\n * variant + padding, para que siga siendo predecible.\n */\nexport function buildCardSx({\n variant,\n padding,\n clickable,\n}: BuildCardSxArgs): SxProps<Theme> {\n return (theme) => ({\n borderRadius: 2,\n backgroundColor: 'background.paper',\n boxShadow:\n variant === 'elevated'\n ? theme.shadows[1]\n : 'none',\n border:\n variant === 'outlined'\n ? `1px solid ${theme.palette.divider}`\n : 'none',\n transition: theme.transitions.create(\n ['box-shadow', 'transform', 'border-color'],\n { duration: theme.transitions.duration.shorter },\n ),\n cursor: clickable ? 'pointer' : 'default',\n ...(clickable && {\n '&:hover': {\n boxShadow:\n variant === 'elevated'\n ? theme.shadows[3]\n : variant === 'outlined'\n ? theme.shadows[1]\n : 'none',\n transform: variant !== 'plain' ? 'translateY(-1px)' : 'none',\n },\n '&:active': {\n transform: 'translateY(0)',\n },\n }),\n // Body padding (cuando no hay header/footer envolventes). Para el caso\n // compuesto los slots manejan su propio padding, dejamos el root en 0.\n p: paddingMap[padding],\n });\n}\n\nexport function buildCardHeaderSx(): SxProps<Theme> {\n return (theme) => ({\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n px: 2.5,\n py: 1.75,\n borderBottom: `1px solid ${theme.palette.divider}`,\n '& .card-header-text': {\n flex: 1,\n minWidth: 0,\n },\n '& .card-header-actions': {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n flexShrink: 0,\n },\n });\n}\n\nexport function buildCardBodySx(padding: CardPadding): SxProps<Theme> {\n return {\n px: padding === 'none' ? 0 : padding === 'dense' ? 1.5 : padding === 'loose' ? 4 : 2.5,\n py: padding === 'none' ? 0 : padding === 'dense' ? 1.5 : padding === 'loose' ? 4 : 2.5,\n };\n}\n\nexport function buildCardFooterSx(): SxProps<Theme> {\n return (theme) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 1,\n px: 2.5,\n py: 1.5,\n borderTop: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.action.hover,\n });\n}\n","import React, { type ReactNode } from 'react';\nimport { Box, Card as MuiCard, Typography, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\nimport {\n buildCardSx,\n buildCardHeaderSx,\n buildCardBodySx,\n buildCardFooterSx,\n type CardVariant,\n type CardPadding,\n} from './Card.sx';\n\nexport interface CardProps {\n /** Contenido principal. */\n children?: ReactNode;\n /**\n * Título del Card. Si se provee, renderiza un header con separador. Puede\n * ser string o cualquier ReactNode para permitir iconos / chips.\n */\n title?: ReactNode;\n /** Texto secundario debajo del título. */\n subtitle?: ReactNode;\n /**\n * Acciones del header (botones, ActionMenu, etc). Se renderizan alineadas\n * a la derecha.\n */\n actions?: ReactNode;\n /**\n * Header totalmente custom. Si se provee, ignora `title`/`subtitle`/`actions`\n * y toma control del slot entero.\n */\n header?: ReactNode;\n /** Footer custom (botones, mensajes, etc). */\n footer?: ReactNode;\n /**\n * Variante visual.\n * - `elevated` (default): sombra sutil.\n * - `outlined`: borde sin sombra.\n * - `plain`: sin borde ni sombra, útil para layouts con nesting.\n */\n variant?: CardVariant;\n /**\n * Densidad del padding interno. Solo aplica al body cuando hay header/footer;\n * cuando no hay slots, aplica al root.\n */\n padding?: CardPadding;\n /** Si `true`, muestra feedback de hover/active (cursor, sombra). */\n clickable?: boolean;\n /**\n * Preset registrado en `theme.styles.Card`. `\"default\"` usa el estilo\n * built-in sin preset extra.\n */\n preset?: string;\n /**\n * MUI `raised` legacy — mantenido por backward-compat. Equivale a\n * `variant=\"elevated\"` con sombra mayor. Ignora `variant` si se usa.\n */\n raised?: boolean;\n /** sx del root. Se compone sobre el base + preset. */\n sx?: SxProps<Theme>;\n /** sx custom del slot body. */\n bodySx?: SxProps<Theme>;\n /** sx custom del slot header. */\n headerSx?: SxProps<Theme>;\n /** sx custom del slot footer. */\n footerSx?: SxProps<Theme>;\n onClick?: () => void;\n onBlur?: () => void;\n className?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Card semántico con slots `title` / `subtitle` / `actions` / `footer`.\n * Reemplaza el patrón `<div class=\"card\"><div class=\"card-header\">...</div>...`\n * de Metronic/Bootstrap con composición declarativa.\n *\n * Backward-compat: si solo se pasa `children`, se comporta como el Card\n * original (MUI Card + body padding).\n *\n * ```tsx\n * <Card\n * title=\"Datos del cliente\"\n * subtitle=\"Última actualización: hace 2h\"\n * actions={<ActionMenu items={menuItems} />}\n * footer={<Button>Guardar</Button>}\n * >\n * <CustomerForm />\n * </Card>\n * ```\n */\nexport function Card({\n children,\n title,\n subtitle,\n actions,\n header,\n footer,\n variant,\n padding = 'normal',\n clickable = false,\n preset,\n raised,\n sx,\n bodySx,\n headerSx,\n footerSx,\n onClick,\n onBlur,\n className,\n 'data-testid': dataTestId,\n}: CardProps) {\n const theme = useTheme();\n\n // Back-compat: `raised` legacy => elevated. Si no vienen ni `raised` ni\n // `variant`, default a 'elevated'.\n const resolvedVariant: CardVariant = raised\n ? 'elevated'\n : (variant ?? 'elevated');\n\n const hasHeader = Boolean(header || title || subtitle || actions);\n const hasFooter = Boolean(footer);\n const isCompound = hasHeader || hasFooter;\n\n // Cuando hay slots, el root no lleva padding (lo llevan los slots).\n const rootPadding: CardPadding = isCompound ? 'none' : padding;\n\n const presetSx = resolvePreset('Card', preset, theme);\n\n const rootSx: SxProps<Theme> = [\n buildCardSx({\n variant: resolvedVariant,\n padding: rootPadding,\n clickable: clickable || Boolean(onClick),\n }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const renderHeader = () => {\n if (header) return <Box sx={[buildCardHeaderSx(), ...(Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : [])]}>{header}</Box>;\n if (!title && !subtitle && !actions) return null;\n return (\n <Box sx={[buildCardHeaderSx(), ...(Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : [])]}>\n <Box className=\"card-header-text\">\n {title && (\n <Typography\n variant=\"subtitle1\"\n component=\"div\"\n sx={{ fontWeight: 600, lineHeight: 1.3 }}\n noWrap\n >\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n component=\"div\"\n noWrap\n >\n {subtitle}\n </Typography>\n )}\n </Box>\n {actions && <Box className=\"card-header-actions\">{actions}</Box>}\n </Box>\n );\n };\n\n return (\n <MuiCard\n sx={rootSx}\n className={className}\n data-testid={dataTestId}\n onClick={onClick}\n onBlur={onBlur}\n elevation={0} // sombra la maneja buildCardSx\n >\n {renderHeader()}\n {isCompound ? (\n <Box sx={[buildCardBodySx(padding), ...(Array.isArray(bodySx) ? bodySx : bodySx ? [bodySx] : [])]}>\n {children}\n </Box>\n ) : (\n children\n )}\n {hasFooter && (\n <Box sx={[buildCardFooterSx(), ...(Array.isArray(footerSx) ? footerSx : footerSx ? [footerSx] : [])]}>\n {footer}\n </Box>\n )}\n </MuiCard>\n );\n}\n\nexport default Card;\n"],"names":["useTheme","resolvePreset","jsx","Box","jsxs","Typography","MuiCard"],"mappings":"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"}
|
|
@@ -1,13 +1,83 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material/styles';
|
|
3
|
+
import { CardVariant, CardPadding } from './Card.sx';
|
|
4
|
+
export interface CardProps {
|
|
5
|
+
/** Contenido principal. */
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
/**
|
|
8
|
+
* Título del Card. Si se provee, renderiza un header con separador. Puede
|
|
9
|
+
* ser string o cualquier ReactNode para permitir iconos / chips.
|
|
10
|
+
*/
|
|
11
|
+
title?: ReactNode;
|
|
12
|
+
/** Texto secundario debajo del título. */
|
|
13
|
+
subtitle?: ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* Acciones del header (botones, ActionMenu, etc). Se renderizan alineadas
|
|
16
|
+
* a la derecha.
|
|
17
|
+
*/
|
|
18
|
+
actions?: ReactNode;
|
|
19
|
+
/**
|
|
20
|
+
* Header totalmente custom. Si se provee, ignora `title`/`subtitle`/`actions`
|
|
21
|
+
* y toma control del slot entero.
|
|
22
|
+
*/
|
|
23
|
+
header?: ReactNode;
|
|
24
|
+
/** Footer custom (botones, mensajes, etc). */
|
|
25
|
+
footer?: ReactNode;
|
|
26
|
+
/**
|
|
27
|
+
* Variante visual.
|
|
28
|
+
* - `elevated` (default): sombra sutil.
|
|
29
|
+
* - `outlined`: borde sin sombra.
|
|
30
|
+
* - `plain`: sin borde ni sombra, útil para layouts con nesting.
|
|
31
|
+
*/
|
|
32
|
+
variant?: CardVariant;
|
|
33
|
+
/**
|
|
34
|
+
* Densidad del padding interno. Solo aplica al body cuando hay header/footer;
|
|
35
|
+
* cuando no hay slots, aplica al root.
|
|
36
|
+
*/
|
|
37
|
+
padding?: CardPadding;
|
|
38
|
+
/** Si `true`, muestra feedback de hover/active (cursor, sombra). */
|
|
39
|
+
clickable?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Preset registrado en `theme.styles.Card`. `"default"` usa el estilo
|
|
42
|
+
* built-in sin preset extra.
|
|
43
|
+
*/
|
|
44
|
+
preset?: string;
|
|
45
|
+
/**
|
|
46
|
+
* MUI `raised` legacy — mantenido por backward-compat. Equivale a
|
|
47
|
+
* `variant="elevated"` con sombra mayor. Ignora `variant` si se usa.
|
|
48
|
+
*/
|
|
5
49
|
raised?: boolean;
|
|
6
|
-
|
|
50
|
+
/** sx del root. Se compone sobre el base + preset. */
|
|
51
|
+
sx?: SxProps<Theme>;
|
|
52
|
+
/** sx custom del slot body. */
|
|
53
|
+
bodySx?: SxProps<Theme>;
|
|
54
|
+
/** sx custom del slot header. */
|
|
55
|
+
headerSx?: SxProps<Theme>;
|
|
56
|
+
/** sx custom del slot footer. */
|
|
57
|
+
footerSx?: SxProps<Theme>;
|
|
7
58
|
onClick?: () => void;
|
|
8
59
|
onBlur?: () => void;
|
|
9
|
-
|
|
10
|
-
|
|
60
|
+
className?: string;
|
|
61
|
+
'data-testid'?: string;
|
|
11
62
|
}
|
|
12
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Card semántico con slots `title` / `subtitle` / `actions` / `footer`.
|
|
65
|
+
* Reemplaza el patrón `<div class="card"><div class="card-header">...</div>...`
|
|
66
|
+
* de Metronic/Bootstrap con composición declarativa.
|
|
67
|
+
*
|
|
68
|
+
* Backward-compat: si solo se pasa `children`, se comporta como el Card
|
|
69
|
+
* original (MUI Card + body padding).
|
|
70
|
+
*
|
|
71
|
+
* ```tsx
|
|
72
|
+
* <Card
|
|
73
|
+
* title="Datos del cliente"
|
|
74
|
+
* subtitle="Última actualización: hace 2h"
|
|
75
|
+
* actions={<ActionMenu items={menuItems} />}
|
|
76
|
+
* footer={<Button>Guardar</Button>}
|
|
77
|
+
* >
|
|
78
|
+
* <CustomerForm />
|
|
79
|
+
* </Card>
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare function Card({ children, title, subtitle, actions, header, footer, variant, padding, clickable, preset, raised, sx, bodySx, headerSx, footerSx, onClick, onBlur, className, 'data-testid': dataTestId, }: CardProps): import("react/jsx-runtime").JSX.Element;
|
|
13
83
|
export default Card;
|
|
@@ -1,28 +1,187 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
21
|
+
import { useTheme, Card as Card$1, Box, Typography } from "@mui/material";
|
|
22
|
+
import { r as resolvePreset } from "../../resolvePreset-B-IB0ehH.js";
|
|
23
|
+
const paddingMap = {
|
|
24
|
+
none: 0,
|
|
25
|
+
dense: 1.5,
|
|
26
|
+
normal: 2.5,
|
|
27
|
+
loose: 4
|
|
28
|
+
};
|
|
29
|
+
function buildCardSx({
|
|
30
|
+
variant,
|
|
31
|
+
padding,
|
|
32
|
+
clickable
|
|
33
|
+
}) {
|
|
34
|
+
return (theme) => __spreadProps(__spreadValues({
|
|
35
|
+
borderRadius: 2,
|
|
36
|
+
backgroundColor: "background.paper",
|
|
37
|
+
boxShadow: variant === "elevated" ? theme.shadows[1] : "none",
|
|
38
|
+
border: variant === "outlined" ? `1px solid ${theme.palette.divider}` : "none",
|
|
39
|
+
transition: theme.transitions.create(
|
|
40
|
+
["box-shadow", "transform", "border-color"],
|
|
41
|
+
{ duration: theme.transitions.duration.shorter }
|
|
42
|
+
),
|
|
43
|
+
cursor: clickable ? "pointer" : "default"
|
|
44
|
+
}, clickable && {
|
|
45
|
+
"&:hover": {
|
|
46
|
+
boxShadow: variant === "elevated" ? theme.shadows[3] : variant === "outlined" ? theme.shadows[1] : "none",
|
|
47
|
+
transform: variant !== "plain" ? "translateY(-1px)" : "none"
|
|
48
|
+
},
|
|
49
|
+
"&:active": {
|
|
50
|
+
transform: "translateY(0)"
|
|
51
|
+
}
|
|
52
|
+
}), {
|
|
53
|
+
// Body padding (cuando no hay header/footer envolventes). Para el caso
|
|
54
|
+
// compuesto los slots manejan su propio padding, dejamos el root en 0.
|
|
55
|
+
p: paddingMap[padding]
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function buildCardHeaderSx() {
|
|
59
|
+
return (theme) => ({
|
|
60
|
+
display: "flex",
|
|
61
|
+
alignItems: "center",
|
|
62
|
+
gap: 1.5,
|
|
63
|
+
px: 2.5,
|
|
64
|
+
py: 1.75,
|
|
65
|
+
borderBottom: `1px solid ${theme.palette.divider}`,
|
|
66
|
+
"& .card-header-text": {
|
|
67
|
+
flex: 1,
|
|
68
|
+
minWidth: 0
|
|
69
|
+
},
|
|
70
|
+
"& .card-header-actions": {
|
|
71
|
+
display: "flex",
|
|
72
|
+
alignItems: "center",
|
|
73
|
+
gap: 0.5,
|
|
74
|
+
flexShrink: 0
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function buildCardBodySx(padding) {
|
|
79
|
+
return {
|
|
80
|
+
px: padding === "none" ? 0 : padding === "dense" ? 1.5 : padding === "loose" ? 4 : 2.5,
|
|
81
|
+
py: padding === "none" ? 0 : padding === "dense" ? 1.5 : padding === "loose" ? 4 : 2.5
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function buildCardFooterSx() {
|
|
85
|
+
return (theme) => ({
|
|
86
|
+
display: "flex",
|
|
87
|
+
alignItems: "center",
|
|
88
|
+
justifyContent: "flex-end",
|
|
89
|
+
gap: 1,
|
|
90
|
+
px: 2.5,
|
|
91
|
+
py: 1.5,
|
|
92
|
+
borderTop: `1px solid ${theme.palette.divider}`,
|
|
93
|
+
backgroundColor: theme.palette.action.hover
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function Card({
|
|
4
97
|
children,
|
|
98
|
+
title,
|
|
99
|
+
subtitle,
|
|
100
|
+
actions,
|
|
101
|
+
header,
|
|
102
|
+
footer,
|
|
103
|
+
variant,
|
|
104
|
+
padding = "normal",
|
|
105
|
+
clickable = false,
|
|
106
|
+
preset,
|
|
5
107
|
raised,
|
|
6
108
|
sx,
|
|
7
|
-
|
|
109
|
+
bodySx,
|
|
110
|
+
headerSx,
|
|
111
|
+
footerSx,
|
|
8
112
|
onClick,
|
|
9
113
|
onBlur,
|
|
114
|
+
className,
|
|
10
115
|
"data-testid": dataTestId
|
|
11
|
-
})
|
|
12
|
-
|
|
116
|
+
}) {
|
|
117
|
+
const theme = useTheme();
|
|
118
|
+
const resolvedVariant = raised ? "elevated" : variant != null ? variant : "elevated";
|
|
119
|
+
const hasHeader = Boolean(header || title || subtitle || actions);
|
|
120
|
+
const hasFooter = Boolean(footer);
|
|
121
|
+
const isCompound = hasHeader || hasFooter;
|
|
122
|
+
const rootPadding = isCompound ? "none" : padding;
|
|
123
|
+
const presetSx = resolvePreset("Card", preset, theme);
|
|
124
|
+
const rootSx = [
|
|
125
|
+
buildCardSx({
|
|
126
|
+
variant: resolvedVariant,
|
|
127
|
+
padding: rootPadding,
|
|
128
|
+
clickable: clickable || Boolean(onClick)
|
|
129
|
+
}),
|
|
130
|
+
...presetSx ? [presetSx] : [],
|
|
131
|
+
...Array.isArray(sx) ? sx : sx ? [sx] : []
|
|
132
|
+
];
|
|
133
|
+
const renderHeader = () => {
|
|
134
|
+
if (header) return /* @__PURE__ */ jsx(Box, { sx: [buildCardHeaderSx(), ...Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : []], children: header });
|
|
135
|
+
if (!title && !subtitle && !actions) return null;
|
|
136
|
+
return /* @__PURE__ */ jsxs(Box, { sx: [buildCardHeaderSx(), ...Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : []], children: [
|
|
137
|
+
/* @__PURE__ */ jsxs(Box, { className: "card-header-text", children: [
|
|
138
|
+
title && /* @__PURE__ */ jsx(
|
|
139
|
+
Typography,
|
|
140
|
+
{
|
|
141
|
+
variant: "subtitle1",
|
|
142
|
+
component: "div",
|
|
143
|
+
sx: { fontWeight: 600, lineHeight: 1.3 },
|
|
144
|
+
noWrap: true,
|
|
145
|
+
children: title
|
|
146
|
+
}
|
|
147
|
+
),
|
|
148
|
+
subtitle && /* @__PURE__ */ jsx(
|
|
149
|
+
Typography,
|
|
150
|
+
{
|
|
151
|
+
variant: "caption",
|
|
152
|
+
color: "text.secondary",
|
|
153
|
+
component: "div",
|
|
154
|
+
noWrap: true,
|
|
155
|
+
children: subtitle
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
] }),
|
|
159
|
+
actions && /* @__PURE__ */ jsx(Box, { className: "card-header-actions", children: actions })
|
|
160
|
+
] });
|
|
161
|
+
};
|
|
162
|
+
return /* @__PURE__ */ jsxs(
|
|
13
163
|
Card$1,
|
|
14
164
|
{
|
|
15
|
-
|
|
16
|
-
sx,
|
|
165
|
+
sx: rootSx,
|
|
17
166
|
className,
|
|
18
167
|
"data-testid": dataTestId,
|
|
19
168
|
onClick,
|
|
20
169
|
onBlur,
|
|
21
|
-
|
|
170
|
+
elevation: 0,
|
|
171
|
+
children: [
|
|
172
|
+
renderHeader(),
|
|
173
|
+
isCompound ? /* @__PURE__ */ jsx(Box, { sx: [buildCardBodySx(padding), ...Array.isArray(bodySx) ? bodySx : bodySx ? [bodySx] : []], children }) : children,
|
|
174
|
+
hasFooter && /* @__PURE__ */ jsx(Box, { sx: [buildCardFooterSx(), ...Array.isArray(footerSx) ? footerSx : footerSx ? [footerSx] : []], children: footer })
|
|
175
|
+
]
|
|
22
176
|
}
|
|
23
177
|
);
|
|
24
|
-
}
|
|
178
|
+
}
|
|
25
179
|
export {
|
|
26
|
-
Card
|
|
180
|
+
Card,
|
|
181
|
+
buildCardBodySx,
|
|
182
|
+
buildCardFooterSx,
|
|
183
|
+
buildCardHeaderSx,
|
|
184
|
+
buildCardSx,
|
|
185
|
+
Card as default
|
|
27
186
|
};
|
|
28
187
|
//# sourceMappingURL=Card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.js","sources":["../../../src/components/Card/Card.tsx"],"sourcesContent":["import { CardActions, Card as MuiCard } from \"@mui/material\";\nimport type { CardProps } from \"@mui/material/Card\";\nimport { CardContent as MuiCardContent } from \"@mui/material\";\n\n\ntype PickCardProps = Pick<CardProps, 'children' | 'raised' | 'sx' | 'className' | 'sx'>;\n\nexport interface MyCardProps extends PickCardProps {\n children?: React.ReactNode;\n raised?: boolean;\n className?: string\n onClick?: () => void;\n onBlur?: () => void;\n \"data-testid\"?: string;\n sx?: object;\n}\n\nexport const Card: React.FC<MyCardProps> = ({\n children,\n raised,\n sx,\n className,\n onClick,\n onBlur,\n \"data-testid\": dataTestId\n}) => {\n return (\n <MuiCard\n raised={raised}\n sx={sx}\n className={className}\n data-testid={dataTestId}\n onClick={onClick}\n onBlur={onBlur}\n\n >\n\n {children}\n\n </MuiCard>\n );\n};\n\nexport default Card;"],"names":["MuiCard"],"mappings":";;AAiBO,MAAM,OAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACnB,MAAM;AACF,SACI;AAAA,IAACA;AAAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA;AAAA,MAIC;AAAA,IAAA;AAAA,EAAA;AAIb;"}
|
|
1
|
+
{"version":3,"file":"Card.js","sources":["../../../src/components/Card/Card.sx.ts","../../../src/components/Card/Card.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles';\n\nexport type CardVariant = 'elevated' | 'outlined' | 'plain';\nexport type CardPadding = 'none' | 'dense' | 'normal' | 'loose';\n\nexport interface BuildCardSxArgs {\n variant: CardVariant;\n padding: CardPadding;\n clickable: boolean;\n}\n\nconst paddingMap: Record<CardPadding, number> = {\n none: 0,\n dense: 1.5,\n normal: 2.5,\n loose: 4,\n};\n\n/**\n * Estilo base del Card (root). La props `sx` del consumer se compone encima\n * junto al preset resuelto (en Card.tsx). Este builder solo se ocupa del\n * variant + padding, para que siga siendo predecible.\n */\nexport function buildCardSx({\n variant,\n padding,\n clickable,\n}: BuildCardSxArgs): SxProps<Theme> {\n return (theme) => ({\n borderRadius: 2,\n backgroundColor: 'background.paper',\n boxShadow:\n variant === 'elevated'\n ? theme.shadows[1]\n : 'none',\n border:\n variant === 'outlined'\n ? `1px solid ${theme.palette.divider}`\n : 'none',\n transition: theme.transitions.create(\n ['box-shadow', 'transform', 'border-color'],\n { duration: theme.transitions.duration.shorter },\n ),\n cursor: clickable ? 'pointer' : 'default',\n ...(clickable && {\n '&:hover': {\n boxShadow:\n variant === 'elevated'\n ? theme.shadows[3]\n : variant === 'outlined'\n ? theme.shadows[1]\n : 'none',\n transform: variant !== 'plain' ? 'translateY(-1px)' : 'none',\n },\n '&:active': {\n transform: 'translateY(0)',\n },\n }),\n // Body padding (cuando no hay header/footer envolventes). Para el caso\n // compuesto los slots manejan su propio padding, dejamos el root en 0.\n p: paddingMap[padding],\n });\n}\n\nexport function buildCardHeaderSx(): SxProps<Theme> {\n return (theme) => ({\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n px: 2.5,\n py: 1.75,\n borderBottom: `1px solid ${theme.palette.divider}`,\n '& .card-header-text': {\n flex: 1,\n minWidth: 0,\n },\n '& .card-header-actions': {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n flexShrink: 0,\n },\n });\n}\n\nexport function buildCardBodySx(padding: CardPadding): SxProps<Theme> {\n return {\n px: padding === 'none' ? 0 : padding === 'dense' ? 1.5 : padding === 'loose' ? 4 : 2.5,\n py: padding === 'none' ? 0 : padding === 'dense' ? 1.5 : padding === 'loose' ? 4 : 2.5,\n };\n}\n\nexport function buildCardFooterSx(): SxProps<Theme> {\n return (theme) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 1,\n px: 2.5,\n py: 1.5,\n borderTop: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.action.hover,\n });\n}\n","import React, { type ReactNode } from 'react';\nimport { Box, Card as MuiCard, Typography, useTheme } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nimport { resolvePreset } from '../_shared/resolvePreset';\nimport {\n buildCardSx,\n buildCardHeaderSx,\n buildCardBodySx,\n buildCardFooterSx,\n type CardVariant,\n type CardPadding,\n} from './Card.sx';\n\nexport interface CardProps {\n /** Contenido principal. */\n children?: ReactNode;\n /**\n * Título del Card. Si se provee, renderiza un header con separador. Puede\n * ser string o cualquier ReactNode para permitir iconos / chips.\n */\n title?: ReactNode;\n /** Texto secundario debajo del título. */\n subtitle?: ReactNode;\n /**\n * Acciones del header (botones, ActionMenu, etc). Se renderizan alineadas\n * a la derecha.\n */\n actions?: ReactNode;\n /**\n * Header totalmente custom. Si se provee, ignora `title`/`subtitle`/`actions`\n * y toma control del slot entero.\n */\n header?: ReactNode;\n /** Footer custom (botones, mensajes, etc). */\n footer?: ReactNode;\n /**\n * Variante visual.\n * - `elevated` (default): sombra sutil.\n * - `outlined`: borde sin sombra.\n * - `plain`: sin borde ni sombra, útil para layouts con nesting.\n */\n variant?: CardVariant;\n /**\n * Densidad del padding interno. Solo aplica al body cuando hay header/footer;\n * cuando no hay slots, aplica al root.\n */\n padding?: CardPadding;\n /** Si `true`, muestra feedback de hover/active (cursor, sombra). */\n clickable?: boolean;\n /**\n * Preset registrado en `theme.styles.Card`. `\"default\"` usa el estilo\n * built-in sin preset extra.\n */\n preset?: string;\n /**\n * MUI `raised` legacy — mantenido por backward-compat. Equivale a\n * `variant=\"elevated\"` con sombra mayor. Ignora `variant` si se usa.\n */\n raised?: boolean;\n /** sx del root. Se compone sobre el base + preset. */\n sx?: SxProps<Theme>;\n /** sx custom del slot body. */\n bodySx?: SxProps<Theme>;\n /** sx custom del slot header. */\n headerSx?: SxProps<Theme>;\n /** sx custom del slot footer. */\n footerSx?: SxProps<Theme>;\n onClick?: () => void;\n onBlur?: () => void;\n className?: string;\n 'data-testid'?: string;\n}\n\n/**\n * Card semántico con slots `title` / `subtitle` / `actions` / `footer`.\n * Reemplaza el patrón `<div class=\"card\"><div class=\"card-header\">...</div>...`\n * de Metronic/Bootstrap con composición declarativa.\n *\n * Backward-compat: si solo se pasa `children`, se comporta como el Card\n * original (MUI Card + body padding).\n *\n * ```tsx\n * <Card\n * title=\"Datos del cliente\"\n * subtitle=\"Última actualización: hace 2h\"\n * actions={<ActionMenu items={menuItems} />}\n * footer={<Button>Guardar</Button>}\n * >\n * <CustomerForm />\n * </Card>\n * ```\n */\nexport function Card({\n children,\n title,\n subtitle,\n actions,\n header,\n footer,\n variant,\n padding = 'normal',\n clickable = false,\n preset,\n raised,\n sx,\n bodySx,\n headerSx,\n footerSx,\n onClick,\n onBlur,\n className,\n 'data-testid': dataTestId,\n}: CardProps) {\n const theme = useTheme();\n\n // Back-compat: `raised` legacy => elevated. Si no vienen ni `raised` ni\n // `variant`, default a 'elevated'.\n const resolvedVariant: CardVariant = raised\n ? 'elevated'\n : (variant ?? 'elevated');\n\n const hasHeader = Boolean(header || title || subtitle || actions);\n const hasFooter = Boolean(footer);\n const isCompound = hasHeader || hasFooter;\n\n // Cuando hay slots, el root no lleva padding (lo llevan los slots).\n const rootPadding: CardPadding = isCompound ? 'none' : padding;\n\n const presetSx = resolvePreset('Card', preset, theme);\n\n const rootSx: SxProps<Theme> = [\n buildCardSx({\n variant: resolvedVariant,\n padding: rootPadding,\n clickable: clickable || Boolean(onClick),\n }),\n ...(presetSx ? [presetSx] : []),\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ];\n\n const renderHeader = () => {\n if (header) return <Box sx={[buildCardHeaderSx(), ...(Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : [])]}>{header}</Box>;\n if (!title && !subtitle && !actions) return null;\n return (\n <Box sx={[buildCardHeaderSx(), ...(Array.isArray(headerSx) ? headerSx : headerSx ? [headerSx] : [])]}>\n <Box className=\"card-header-text\">\n {title && (\n <Typography\n variant=\"subtitle1\"\n component=\"div\"\n sx={{ fontWeight: 600, lineHeight: 1.3 }}\n noWrap\n >\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n component=\"div\"\n noWrap\n >\n {subtitle}\n </Typography>\n )}\n </Box>\n {actions && <Box className=\"card-header-actions\">{actions}</Box>}\n </Box>\n );\n };\n\n return (\n <MuiCard\n sx={rootSx}\n className={className}\n data-testid={dataTestId}\n onClick={onClick}\n onBlur={onBlur}\n elevation={0} // sombra la maneja buildCardSx\n >\n {renderHeader()}\n {isCompound ? (\n <Box sx={[buildCardBodySx(padding), ...(Array.isArray(bodySx) ? bodySx : bodySx ? [bodySx] : [])]}>\n {children}\n </Box>\n ) : (\n children\n )}\n {hasFooter && (\n <Box sx={[buildCardFooterSx(), ...(Array.isArray(footerSx) ? footerSx : footerSx ? [footerSx] : [])]}>\n {footer}\n </Box>\n )}\n </MuiCard>\n );\n}\n\nexport default Card;\n"],"names":["MuiCard"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SxProps, Theme } from '@mui/material/styles';
|
|
2
|
+
export type CardVariant = 'elevated' | 'outlined' | 'plain';
|
|
3
|
+
export type CardPadding = 'none' | 'dense' | 'normal' | 'loose';
|
|
4
|
+
export interface BuildCardSxArgs {
|
|
5
|
+
variant: CardVariant;
|
|
6
|
+
padding: CardPadding;
|
|
7
|
+
clickable: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Estilo base del Card (root). La props `sx` del consumer se compone encima
|
|
11
|
+
* junto al preset resuelto (en Card.tsx). Este builder solo se ocupa del
|
|
12
|
+
* variant + padding, para que siga siendo predecible.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildCardSx({ variant, padding, clickable, }: BuildCardSxArgs): SxProps<Theme>;
|
|
15
|
+
export declare function buildCardHeaderSx(): SxProps<Theme>;
|
|
16
|
+
export declare function buildCardBodySx(padding: CardPadding): SxProps<Theme>;
|
|
17
|
+
export declare function buildCardFooterSx(): SxProps<Theme>;
|
|
@@ -1 +1,4 @@
|
|
|
1
|
-
export { default
|
|
1
|
+
export { Card, default } from './Card';
|
|
2
|
+
export type { CardProps } from './Card';
|
|
3
|
+
export type { CardVariant, CardPadding } from './Card.sx';
|
|
4
|
+
export { buildCardSx, buildCardHeaderSx, buildCardBodySx, buildCardFooterSx, } from './Card.sx';
|