/** The event/task/call record a Notification card renders; startDate/dueDate/endDate drive its countdown text. */ export type NotificationData = { /** Echoed back to onClick together with `type`. */ id: number; /** Card heading; also the avatar's initials when `host` is empty. */ title: string; /** Avatar image; initials from `host` or `title` show without it. */ avatarUrl?: string; /** Date-parsable string shown in en-US; meetings add the time, others the year. */ startDate: string; /** Countdown target, preferred over endDate; the label refreshes every minute. */ dueDate?: string; /** Countdown target used only when dueDate is absent. */ endDate?: string; /** Shown in the footer and used for the avatar's initials. */ host?: string; description?: string; /** @deprecated Never read; the status dot colour comes from dueDate/endDate date math. */ status?: string; /** Prefixes the countdown label ("Task due in 3 days") and is echoed to onClick. */ type: "task" | "meeting" | "call"; }; /** Props for the `Notification` countdown card. */ export type NotificationProps = { notification: NotificationData; /** Shows a dismiss control (also Enter/Space); the card never hides itself. */ onClose?: () => void; /** Adds a dot coloured by urgency: overdue, under an hour, under a day, later. */ showStatus?: boolean; /** Fires only when the title text is clicked — the avatar, description and card body are not clickable. */ onClick?: (id: number, type: "task" | "meeting" | "call") => void; /** Renders a skeleton card in place of the notification. */ isLoading?: boolean; /** Per-card colour overrides; raw values here do not follow dark mode. */ colors?: NotificationColor; }; /** Optional per-card palette override for Notification; any field left unset falls back to theme tokens. */ export type NotificationColor = { /** Card surface; the default title, due-label and meta inks are contrast-lifted against it. */ bgColor?: string; /** Card border and both dividers. */ borderColor?: string; /** Description text only. */ textColor?: string; /** Replaces the contrast-lifted title ink, so check AA contrast yourself. */ titleColor?: string; /** warningColor/errorColor/successColor only paint the status dot, and only when showStatus is true — otherwise inert. */ warningColor?: string; errorColor?: string; successColor?: string; };