import { ReactNode } from 'react';
import { AnimationAlert, SizeAlert, VariantAlert } from '../../../shared/types/alert';
/**
 * Intención semántica alineada con variantes «📚 intención» en Figma (Notification).
 * Incluye `brand` y `neutral` para el stack de `notify` / `NotificationItem`.
 * Se mapea al color del `Alert` interno.
 */
export type NotificationIntent = 'informativa' | 'confirmacion' | 'preventiva' | 'critica' | 'brand' | 'neutral';
/**
 * Origen / tipo de elemento destacado («🎭 tipo» en Figma): icono genérico, persona o marca.
 */
export type NotificationSource = 'general' | 'usuario' | 'sistema';
/**
 * Presentación:
 * - `popup`: tarjeta elevada, cierre y pila.
 * - `item`: fila con hora y punto no leída (decorativo).
 * - `list-item`: como ítem de panel ([Figma style=item](https://www.figma.com/design/aWDHIXKjf82m6udooBUeZG/Notification?node-id=182-3679)): sin borde ni cerrar; el punto no leída es interactivo (`events.onMarkAsRead`).
 */
export type NotificationPresentation = 'popup' | 'item' | 'list-item';
/**
 * Variante del bloque de cuerpo bajo cabecera ([Figma Content](https://www.figma.com/design/aWDHIXKjf82m6udooBUeZG/Notification?node-id=151-1635&m=dev)).
 * - `default`: `description` se envía al `Alert` como texto de cuerpo.
 * - Resto: panel o acciones renderizados como hijos del `Alert`.
 */
export type NotificationContentKind = 'default' | 'message' | 'file' | 'link' | 'cta';
/** Metadatos del bloque archivo (`kind: 'file'`). */
export interface NotificationContentFileProps {
    /** Nombre del archivo. */
    fileName: string;
    /** Etiqueta de tamaño (p. ej. «2 MB»). */
    sizeLabel?: string;
    /** Clic en descarga. */
    onDownloadClick?: () => void;
}
/** Metadatos del bloque enlace (`kind: 'link'`). */
export interface NotificationContentLinkProps {
    /** URL de destino del enlace. */
    href: string;
    /** Texto visible; si se omite, se usa `content.description`. */
    label?: string;
    /** Añade `rel`/`target` de enlace externo. */
    external?: boolean;
}
/** Etiquetas de botones del bloque CTA (`kind: 'cta'`). */
export interface NotificationContentCtaProps {
    /** Texto del botón secundario (acción `events.onSecondaryClick`). */
    secondaryLabel?: string;
    /** Texto del botón primario (acción `events.onPrimaryClick`). */
    primaryLabel?: string;
}
/** Textos: título, subtítulo y cuerpo (mapeados al `Alert`). */
export interface NotificationContentProps {
    /** Título principal. */
    title: string;
    /** Subtítulo (`message` del Alert). */
    subtitle?: string;
    /**
     * Texto de cuerpo.
     * Con `kind: 'default'` va a `description` del `Alert`.
     * Con `link` / `message` puede servir de fallback de texto o etiqueta de enlace.
     */
    description?: string;
    /**
     * Tipo de contenido del cuerpo (Figma `content`: default | message | file | link | CTA).
     * @default 'default'
     */
    kind?: NotificationContentKind;
    /** Configuración cuando `kind === 'file'`. */
    file?: Partial<NotificationContentFileProps>;
    /** Configuración cuando `kind === 'link'`. */
    link?: Partial<NotificationContentLinkProps>;
    /** Etiquetas cuando `kind === 'cta'` (clics en `events.onPrimaryClick` / `onSecondaryClick`). */
    cta?: Partial<NotificationContentCtaProps>;
    /** Texto citado cuando `kind === 'message'`; por defecto `description`. */
    messageText?: string;
}
/**
 * Medallón izquierdo: icono único (`general`) o imagen (`usuario` / `sistema`).
 * Con imagen, Figma muestra un badge de intención superpuesto (ver `showIntentBadge`).
 */
export interface NotificationLeadingProps {
    /** `general`: icono semántico del color; `usuario` / `sistema`: `imageUrl` como `avatar` del Alert. */
    source?: NotificationSource;
    /** URL de avatar o logo / marca. */
    imageUrl?: string;
    /**
     * Badge circular con icono de intención sobre la imagen (Figma `icon content` en el avatar).
     * Por defecto se muestra si hay `imageUrl` y `source` no es `general`.
     */
    showIntentBadge?: boolean;
}
/** Apariencia de la tarjeta y flags de UI (mapeados al `Alert` interno). */
export interface NotificationAppearanceProps {
    /** Intención semántica; define el color del `Alert` (ver {@link NotificationIntent}). */
    intent?: NotificationIntent;
    /** Escala táctil y preset tipográfico del `Alert`. */
    size?: SizeAlert;
    /** Variante de superficie del `Alert` (p. ej. `outlined` / `contained`). */
    variant?: VariantAlert;
    /** Animación de entrada o salida del `Alert`. */
    animation?: AnimationAlert;
    /** Clases Tailwind extra en la superficie de la notificación (se componen con el preset del `Alert`). */
    className?: string;
    /**
     * Forzar botón cerrar.
     * Por defecto: `true` si `meta.presentation === "popup"`, si no `false`.
     */
    showCloseButton?: boolean;
    /** Estado de salida animada (mismo contrato que `Alert.isLeaving`). */
    isLeaving?: boolean;
}
/** Presentación, pila, tiempo y barra de auto-cierre. */
export interface NotificationMetaProps {
    /** Modo de layout: popup con sombra vs filas `item` / `list-item` (véase {@link NotificationPresentation}). */
    presentation?: NotificationPresentation;
    /** Texto bajo el contenido (p. ej. «5 notificaciones más»), típico de popup. */
    stackSummary?: string;
    /** ms para auto-cierre y barra (solo popup útil). */
    duration?: number;
    /**
     * Clases en el contenedor de la barra del `Alert` (p. ej. `opacity` / `max-height` con hover en el mazo).
     * No altera el temporizador del servicio: solo atenúa la barra visualmente.
     */
    progressBarClassName?: string;
    /** Hora en cabecera (solo `item`; va en `endAdornment` del Alert). */
    timestamp?: string;
    /** Punto no leída junto a `timestamp` (`item`: solo visual; `list-item`: clicable si hay `events.onMarkAsRead`). */
    unread?: boolean;
}
/** Callbacks y textos de acciones (cierre, botones, clic en tarjeta, punto «leída»). */
export interface NotificationEventsProps {
    /** Cierre vía botón «X» (pasa al `Alert` como `onClose`). */
    onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void;
    /** Click en botón primario cuando el cuerpo no es tipo CTA (`content.kind !== 'cta'`). */
    onPrimaryClick?: () => void;
    /** Click en botón secundario cuando el cuerpo no es tipo CTA (`content.kind !== 'cta'`). */
    onSecondaryClick?: () => void;
    /** Etiqueta del botón primario del `Alert` cuando `content.kind !== 'cta'`. Con `kind: 'cta'` usan etiquetas {@link NotificationContentCtaProps}. */
    primaryButtonText?: string;
    /** Etiqueta del botón secundario del `Alert` cuando `content.kind !== 'cta'`. Con `kind: 'cta'` usan etiquetas {@link NotificationContentCtaProps}. */
    secondaryButtonText?: string;
    /** Clic en la superficie de la tarjeta (equivale a `Alert.onClick`). */
    onClick?: () => void;
    /**
     * Solo `presentation: 'list-item'` con `meta.unread`: clic en el punto marca como leída (el padre suele poner `unread` a `false`).
     */
    onMarkAsRead?: () => void;
}
/**
 * Props del componente {@link Notification} (API agrupada según `imj-ui-guidance-grouped-props`).
 *
 * Cada bloque se fusiona con valores por defecto; los conjuntos son opcionales salvo `content`.
 */
export interface NotificationCardProps {
    /** Si la notificación está visible (pasa a {@link Alert} como `open`). */
    open: boolean;
    /** Textos y variante del cuerpo; único bloque obligatorio (fusionado sin defaults en código). */
    content: NotificationContentProps;
    /** Medallón izquierdo: icono o imagen (se fusiona con defaults `source: 'general'`, badge de intención, etc.). */
    leading?: Partial<NotificationLeadingProps>;
    /** Tamaño, variante, intención y flags del `Alert` (se fusiona con defaults de apariencia). */
    appearance?: Partial<NotificationAppearanceProps>;
    /** Popup vs fila, duración, pila, marca de no leída (se fusiona con `presentation: 'popup'` por defecto). */
    meta?: Partial<NotificationMetaProps>;
    /** Cierre, clics en botones / tarjeta y marcar leída en list-item (opcional; sin objeto no hay callbacks). */
    events?: Partial<NotificationEventsProps>;
    /**
     * Contenido adicional bajo el cuerpo (p. ej. resumen de pila con icono), dentro del `Alert`.
     * Distinto de `meta.stackSummary` (texto centrado tipo Figma).
     */
    footer?: ReactNode;
}
//# sourceMappingURL=notification.d.ts.map