import { ButtonColors, IconType, IconFontColor, VisualSlotType, AnyIconDefinition, TooltipPosition, TooltipAlignment } from './types'; import { SwitchOption, SwitchProps } from './switch'; import { InnerButtonProps } from './button'; import { IconProps } from './icon'; import { BadgeProps } from './badge'; /** * Configuración de un botón genérico del Modal * Sistema agnóstico que permite definir cualquier cantidad de botones con cualquier configuración * Extiende todas las props opcionales de InnerButton para máxima flexibilidad */ export interface ModalButton extends Pick { /** ID único del botón (opcional, útil para identificar el botón en callbacks) */ id?: string; /** Texto del botón (opcional para botones solo con icono) */ label?: string; /** Callback que se ejecuta al hacer clic en el botón */ onClick?: (event?: React.MouseEvent) => void; /** Color del botón */ color?: ButtonColors; /** Si el botón está deshabilitado */ disabled?: boolean; /** Icono del botón */ icon?: IconType | AnyIconDefinition; /** Icono a la izquierda del texto (para botones con texto) */ leftSlot?: VisualSlotType; /** Icono a la derecha del texto (para botones con texto) */ rightSlot?: VisualSlotType; /** Si el modal debe cerrarse automáticamente al hacer clic en este botón */ closeOnClick?: boolean; /** Si el botón debe mostrarse (útil para mostrar/ocultar condicionalmente) */ show?: boolean; /** Tema del botón (`icon` deprecado; preferir `solid` + solo icono sin `label`). */ theme?: 'solid' | 'icon'; /** Tamaño del botón */ size?: 'xs' | 'sm' | 'md' | 'lg'; /** Pill del botón */ pill?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'pill'; iconDuotonePrimary?: IconFontColor; iconDuotoneSecondary?: IconFontColor; iconDuotoneOpacityPrimary?: number; iconDuotoneOpacitySecondary?: number; } /** * Configuración de un badge del Modal * Sistema agnóstico que permite definir cualquier cantidad de badges * Extiende todas las props opcionales de Badge para máxima flexibilidad */ export interface ModalBadge extends Omit { /** ID único del badge (opcional) */ id?: string; /** Etiqueta del badge */ label: string; /** Si el badge debe mostrarse */ show?: boolean; } /** * Configuración del icono principal del Modal * Extiende todas las props opcionales de Icon para máxima flexibilidad */ export interface ModalIcon extends Omit { /** Icono a mostrar (mapeado desde IconProps.name) */ icon: IconType | AnyIconDefinition; /** Si el icono debe mostrarse */ show?: boolean; /** @deprecated Usar colorDuotonePrimary en su lugar */ iconDuotonePrimary?: IconFontColor; /** @deprecated Usar colorDuotoneSecondary en su lugar */ iconDuotoneSecondary?: IconFontColor; /** @deprecated Usar opacityDuotonePrimary en su lugar */ iconDuotoneOpacityPrimary?: number; /** @deprecated Usar opacityDuotoneSecondary en su lugar */ iconDuotoneOpacitySecondary?: number; } /** * Configuración de un botón del footer del Modal * @deprecated Usar ModalButton en su lugar. Se mantiene para retrocompatibilidad. */ export interface ModalFooterButton extends ModalButton { /** Texto del botón */ label: string; } /** * Props del `Switch` interno del header cuando se usan pestañas (`tabsConfig.switch`). */ export type ModalTabsSwitchProps = Pick; /** * Pestañas del modal agrupadas (misma idea que `iconConfig` / `headerButton`): opciones, callbacks y apariencia del Switch. */ export interface ModalTabsConfig { /** Opciones mostradas en el Switch del header. */ options: SwitchOption[]; /** Valor inicial de la pestaña activa (no controlado; el estado interno sigue en el proveedor del modal). */ defaultValueTab?: string; /** Callback al cambiar de pestaña. */ onChangeTab?: (value: string) => void; /** * Configuración del Switch: tamaño del control (`size`), color de iconos en slots, ancho completo y * tamaño uniforme de iconos (`slotIconSize`). Por pestaña se pueden usar `leftSlotIconSize` / `rightSlotIconSize` en cada opción. */ switch?: ModalTabsSwitchProps; } /** * Botón de cerrar (X) en la cabecera del modal — API agrupada (mismo criterio que `iconConfig`, `headerButton`, etc.). */ export interface ModalCloseButtonConfig { /** Muestra tooltip al pasar el cursor sobre la X. @default false */ tooltip?: boolean; /** Texto del tooltip. Solo aplica si `tooltip` es `true`. @default 'Cerrar' */ tooltipLabel?: string; /** * Posición del tooltip respecto al botón. Si se omite: **`bottom`** en `Modal`, **`left`** en `Drawer`. */ tooltipPosition?: TooltipPosition; /** Alineación del tooltip (eje perpendicular a `tooltipPosition`). @default 'center' */ tooltipAlignment?: TooltipAlignment; } export interface ModalProps { isOpen: boolean; onClose: () => void; size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'; children: React.ReactNode; disableEscapeClose?: boolean; disableOutsideTab?: boolean; disableOutsideClick?: boolean; closeAtCorner?: boolean; showCloseButton?: boolean; title?: string; /** * z-index del overlay raíz. Por defecto `52` (por encima de headers/celdas sticky de `Table`, hasta 51). * `50` y `60` (p. ej. AlertDialog anidado) usan tokens; cualquier otro número se aplica vía `style` * (p. ej. `1200` para quedar por encima de popovers en portal ~1000). */ zIndex?: number; hideFooter?: boolean; /** * Padding uniforme de cabecera, cuerpo y pie (`Modal.Header` / `Modal.Body` / `Modal.Footer`). * - `md` (por defecto): 16px — diálogo modal. * - `sm`: 8px — p. ej. `Popup` con `popoverStructured`. */ sectionPadding?: 'md' | 'sm'; /** * Sistema nuevo: Icono principal del Modal * Permite configurar el icono principal de forma más flexible * Si se proporciona, tiene prioridad sobre las props legacy (icon, iconDuotonePrimary, etc.) */ iconConfig?: ModalIcon; /** * Botón de cerrar (cabecera): tooltip opcional. Preferir este bloque frente a extender props sueltas en raíz. */ closeButton?: ModalCloseButtonConfig; /** * Sistema nuevo: Botón del header (modelo cerrado) * Solo existe un botón en el header actualmente * Si se proporciona, tiene prioridad sobre las props legacy (headerButtonIcon, headerButtonOnClick, etc.) * Para casos especiales con múltiples botones, usar headerButtons (array) */ headerButton?: ModalButton; /** * Sistema nuevo: Array de botones del header (para casos especiales) * Permite definir múltiples botones cuando se necesite más flexibilidad */ headerButtons?: ModalButton[]; /** * Sistema nuevo: Badge del header (modelo cerrado) * Solo existe un badge en el header actualmente * Si se proporciona, tiene prioridad sobre las props legacy (badgeIcon, badgeLabel, etc.) * Para casos especiales con múltiples badges, usar badges (array) */ badge?: ModalBadge; /** * Sistema nuevo: Array de badges del header (para casos especiales) * Permite definir múltiples badges cuando se necesite más flexibilidad */ badges?: ModalBadge[]; /** * Sistema nuevo: Botón auxiliar del footer (a la izquierda) * Solo existe un botón auxiliar en el footer actualmente * Si se proporciona, tiene prioridad sobre las props legacy (footerButtonIcon, footerButtonOnClick, etc.) */ footerAuxButton?: ModalButton; /** * Sistema nuevo: Botones del footer (modelo cerrado) * Define específicamente los botones principales del footer (primary = success, secondary = cancel) * Si se proporciona, tiene prioridad sobre las props legacy (cancelButtonText, successButtonText, etc.) * Para casos especiales con más botones, usar footerButtons (array) */ footerPrimaryButton?: ModalButton; footerSecondaryButton?: ModalButton; /** * Sistema nuevo: Array de botones del footer (para casos especiales) * Permite definir múltiples botones cuando se necesite más flexibilidad */ footerButtons?: ModalButton[]; /** * @deprecated Usar iconConfig en su lugar */ icon?: IconType | AnyIconDefinition; iconDuotonePrimary?: IconFontColor; iconDuotoneSecondary?: IconFontColor; iconDuotoneOpacityPrimary?: number; iconDuotoneOpacitySecondary?: number; /** * @deprecated Usar headerButton en su lugar */ headerButtonIcon?: IconType | AnyIconDefinition; headerButtonIconDuotonePrimary?: IconFontColor; headerButtonIconDuotoneSecondary?: IconFontColor; headerButtonIconDuotoneOpacityPrimary?: number; headerButtonIconDuotoneOpacitySecondary?: number; headerButtonOnClick?: () => void; /** * @deprecated Usar badge en su lugar */ badgeIcon?: IconType | AnyIconDefinition; badgeIconDuotonePrimary?: IconFontColor; badgeIconDuotoneSecondary?: IconFontColor; badgeIconDuotoneOpacityPrimary?: number; badgeIconDuotoneOpacitySecondary?: number; badgeLabel?: string; /** * @deprecated Usar footerAuxButton en su lugar */ footerButtonIcon?: IconType | AnyIconDefinition; footerButtonIconDuotonePrimary?: IconFontColor; footerButtonIconDuotoneSecondary?: IconFontColor; footerButtonIconDuotoneOpacityPrimary?: number; footerButtonIconDuotoneOpacitySecondary?: number; footerButtonOnClick?: () => void; /** * @deprecated Usar footerPrimaryButton (success) y footerSecondaryButton (cancel) en su lugar */ cancelButtonText?: string; successButtonText?: string; onCancel?: (event?: React.MouseEvent) => void; onSuccess?: (event?: React.MouseEvent) => void; showCancelButton?: boolean; showSuccessButton?: boolean; closeAtSuccess?: boolean; closeAtCancel?: boolean; cancelButtonSlotLeft?: VisualSlotType; successButtonSlotRight?: VisualSlotType; disableCancelButton?: boolean; disableSuccessButton?: boolean; successButtonColor?: ButtonColors; /** * Reparto de iconos en los botones legacy del footer (`cancelButtonSlotLeft` / `successButtonSlotRight`). * `spread` aplica `slotLayout={{ var: 'spread', textAlign: 'center' }}` en ambos y reparte el ancho en la fila del footer. */ footerSlotLayout?: 'inline' | 'spread'; /** * Pestañas del header: opciones, callbacks y props del Switch en un solo objeto (API recomendada). */ tabsConfig?: ModalTabsConfig; /** * @deprecated Usar `tabsConfig.options` en su lugar. */ tabs?: SwitchOption[]; /** * @deprecated Usar `tabsConfig.defaultValueTab` en su lugar. */ defaultValueTab?: string; /** * @deprecated Usar `tabsConfig.onChangeTab` en su lugar. */ onChangeTab?: (value: string) => void; } export interface ModalHeaderProps extends Pick { children?: React.ReactNode; title?: string; } export interface ModalBodyProps { children: React.ReactNode; withPadding?: boolean; } export interface ModalFooterProps extends Pick { children?: React.ReactNode; } export interface ModalContextType extends Omit { currentTab?: string; /** * Props efectivas del `Switch` de pestañas (fusión de defaults del modal con `tabsConfig.switch`). */ tabsSwitchProps: ModalTabsSwitchProps; /** Icono procesado (puede venir de iconConfig o de las props legacy) */ processedIcon?: ModalIcon; /** Botones procesados del header (pueden venir de headerButton, headerButtons o de las props legacy) */ processedHeaderButtons?: ModalButton[]; /** Badges procesados (pueden venir de badge, badges o de las props legacy) */ processedBadges?: ModalBadge[]; /** Botón auxiliar procesado del footer (puede venir de footerAuxButton o de las props legacy) */ processedFooterAuxButton?: ModalButton; /** Botones procesados del footer (pueden venir de footerPrimaryButton, footerSecondaryButton, footerButtons o de las props legacy) */ processedFooterButtons?: ModalButton[]; } //# sourceMappingURL=modal.d.ts.map