import { type HTMLAttributes, type ReactNode } from 'react';
import { type VariantProps } from 'class-variance-authority';
export interface NotificationItem {
/** Unique identifier for the notification. */
id: string;
/** Notification title — rendered on the first line. */
title: string;
/** Notification body — rendered as plain text. */
description?: string;
/** Optional leading glyph — a React node (usually a Lucide icon). */
icon?: ReactNode;
/** Optional action URL — when present the card title is an anchor. */
url?: string;
/** ISO-8601 timestamp of when the notification was created. */
createdAt: string;
/** Whether the notification has been seen. Unread items get accent styling. */
read?: boolean;
}
export interface NotificationCardProps extends Omit, 'onClick' | 'role' | 'title'>, VariantProps {
/** The notification to render. */
item: NotificationItem;
/**
* Layout shape.
* - `compact` — single-line row with the whole card clickable (used by
* NotificationTray).
* - `dashboard` — alert-style block with explicit CTA and mark-as-read
* controls (used by dashboards / sidebars).
*/
variant?: 'compact' | 'dashboard';
/**
* Row chrome for the `compact` variant (ignored for `dashboard`, which
* always carries its own card border). `'flat'` (default) — chrome-less row
* for use inside a bordered tray. `'elevated'` — each row carries its own
* card chrome (border + `--shadow-sm`), matching `AppointmentCard` /
* `ClinicalNoteCard` for placing rows directly on a rail (e.g. the Inbox).
*/
surface?: 'flat' | 'elevated';
/** Visual density. */
size?: 'sm' | 'md';
/** Fires when the card title / body is activated. */
onActivate?: (item: NotificationItem) => void;
/**
* Fires when the read/unread status ball (the corner badge on the category
* icon) is activated. Supply to make the ball an interactive toggle; omit and
* it renders as a static read-state indicator.
*/
onToggleRead?: (item: NotificationItem) => void;
/** Fires when the dismiss control is activated. */
onDismiss?: (item: NotificationItem) => void;
/**
* Label for the dashboard-variant CTA. Only rendered when `variant` is
* `'dashboard'` and the item has a `url`.
*/
ctaLabel?: string;
/**
* Label for the dashboard-variant mark-as-read link. Only rendered when
* `variant` is `'dashboard'` and `onDismiss` is supplied.
*/
dismissLabel?: string;
/**
* External exit-animation control. When supplied the card plays its
* fade-out when this turns `true` and the consumer owns the subsequent
* unmount (see NotificationTray). If omitted, the card self-manages the
* exit on internal dismiss.
*/
leaving?: boolean;
}
declare const cardVariants: (props?: ({
variant?: "compact" | "dashboard" | null | undefined;
size?: "sm" | "md" | null | undefined;
state?: "read" | "unread" | null | undefined;
surface?: "elevated" | "flat" | null | undefined;
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
export declare function isSafeNotificationUrl(url: string): boolean;
export declare const NotificationCard: import("react").ForwardRefExoticComponent>;
export {};
//# sourceMappingURL=notification-card.d.ts.map