/** * Variante semántica del empty/error state. * * - `empty` — la fuente devolvió cero resultados (lista vacía, sin notifs). * Icono neutro, sin alarma. * - `error` — la fuente falló por un error de la app/servidor (500, parse). * Icono de alerta. * - `offline` — la fuente falló por red caída / Firestore unreachable. * Icono cloud-offline. * * Cada variante mapea a un icono default si `icon` no se especifica. */ export type EmptyStateVariant = 'empty' | 'error' | 'offline'; /** * Acción CTA opcional del state (típicamente "Reintentar" / "Recargar"). * * Si se omite, el componente no renderiza botón. El `handler` ya viene * traducido — el componente NO resuelve i18n internamente. */ export interface EmptyStateAction { label: string; handler: () => void | Promise; /** Si `true`, el botón pasa a estado WORKING (spinner). Útil mientras re-fetcha. */ loading?: boolean; } /** * Metadata para `` — molecule que renderiza un estado * declarativo de "no hay datos / hubo error / sin red" con título, descripción * opcional y CTA opcional. Reemplaza el patrón ad-hoc (ion-icon + val-title + * val-text + val-button) que cada página venía improvisando. * * I18n: los strings (`title`, `description`, `action.label`) los resuelve la * página antes de construir las props. Esto mantiene el componente agnóstico * a namespaces y consistente con el resto de la lib (FormMetadata, etc.). */ export interface EmptyStateMetadata { /** Título principal. Requerido. */ title: string; /** Descripción opcional (1-2 líneas) debajo del título. */ description?: string; /** Variante semántica. Default `'empty'`. */ variant?: EmptyStateVariant; /** * Nombre del icono Ionicons (kebab-case). Si se omite, el componente usa * el default de la variante: * - empty → `document-outline` * - error → `alert-circle-outline` * - offline → `cloud-offline-outline` * * Si pasás un icono custom, importalo + registralo con `addIcons({ ... })` * en el componente consumidor (Ionic standalone no auto-registra). */ icon?: string; /** Tamaño del icono en píxeles. Default `64`. */ iconSize?: number; /** Acción CTA opcional. Si se omite, no se muestra botón. */ action?: EmptyStateAction; }