import type { HTMLAttributes } from 'react'; import { type LucideIcon } from 'lucide-react'; import type { CalendarEventStatus } from '../calendar/calendar'; export declare const STATUS_ICON: Record; export declare const STATUS_LABEL_KEYS: Record; export declare const EVENT_FLAGS: readonly [{ readonly field: "hasUnassignedPatient"; readonly Icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly labelKey: "calendarWorkspace.details.indicators.unassignedPatient"; readonly tone: "warning"; }, { readonly field: "hasHighlightedAnamnesis"; readonly Icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly labelKey: "calendarWorkspace.details.indicators.anamnesis"; readonly tone: "accent"; }, { readonly field: "hasBillableAmount"; readonly Icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly labelKey: "calendarWorkspace.details.indicators.billable"; readonly tone: "warning"; }, { readonly field: "isBookedOnline"; readonly Icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly labelKey: "calendarWorkspace.details.indicators.bookedOnline"; readonly tone: "info"; }, { readonly field: "isTelehealth"; readonly Icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly labelKey: "calendarWorkspace.details.indicators.telehealth"; readonly tone: "info"; }, { readonly field: "isRecurring"; readonly Icon: import("react").ForwardRefExoticComponent & import("react").RefAttributes>; readonly labelKey: "calendarWorkspace.details.indicators.recurring"; readonly tone: "info"; }]; /** * The single painted surface of a calendar event. * * Colour model (platform parity): the caller's picker hex * (`backgroundColor` / `textColor` / `borderColor`) is the ONLY thing that * paints the card. `status` never paints the surface — it selects an icon * and (for `cancelled`) a line-through. * * Non-interactive by design: inside FullCalendar the outer harness anchor * owns click/drag/focus; standalone consumers wrap the card in their own * button/link. No onClick in the contract. */ export interface CalendarEventCardProps extends Omit, 'title'> { /** * Primary line. Pass the ALREADY-MASKED title when privacy applies — the * card never receives a name it must not render, so it cannot leak it * (visually or via the composed aria-label). */ title: string; /** Optional surname/short form for slivers. Ignored when privacyMasked. */ shortTitle?: string; /** Localised start time for narrow cards. No parsing of rangeText. */ startText?: string; /** Month keeps one line; flow preserves intrinsic height in lists/timelines. */ layout?: 'grid' | 'month' | 'flow'; /** Opposite resource axis: operator initials or chair, on tall cards. */ contextLabel?: string; /** * Full name behind `contextLabel`, used in the accessible name instead of * it, so initials such as "DA" are not read out letter by letter. Never * rendered visually. */ contextName?: string; /** * Secondary description, clamped to the lines the card can hold. Note: the * Calendar's privacy mode does NOT mask the suffix (current behaviour, * preserved deliberately). */ suffix?: string; /** * Pre-formatted, localised time range (e.g. "09:00 – 09:45"). The * Calendar adapter computes it via Intl.DateTimeFormat.formatRange. * Included in the composed aria-label whenever present (even when the * visual time line is suppressed via showTime/allDay — matches today's * Calendar behaviour byte-for-byte). */ rangeText?: string; /** * Gates the VISUAL time line only (aria keeps rangeText). Mirrors * CalendarProps.showTime. @default true */ showTime?: boolean; /** * All-day events suppress the visual time line (aria keeps rangeText). * @default false */ allDay?: boolean; /** * Lifecycle state (6-state, matches the platform DoctorAppointment * lifecycle) → status icon + line-through for `cancelled` + * localised label in the aria-label. NEVER paints the * card surface. */ status?: CalendarEventStatus; /** * Runtime hex (#rgb or #rrggbb) from the consumer's colour picker — THE * painted surface. Injected as `--calendar-event-bg` via the sanctioned * inline custom-property pattern (23-constraints §inline-style exception). */ backgroundColor?: string; /** * Runtime hex paired with backgroundColor. When omitted while * backgroundColor is set, the card auto-derives black/white ink by * luminance (provably WCAG AA ≥ 4.58:1 for any opaque colour). */ textColor?: string; /** * Runtime hex border for delineating light surfaces. The platform sends * '#cccccc' when backgroundColor is '#ffffff' and omits it otherwise. * Falls back to transparent; appointments have a 4px start edge and * a 1px border elsewhere (tasks and drafts have 1px on every side), so toggling never shifts layout and event boundaries * survive forced-colors / Windows High Contrast for free. */ borderColor?: string; /** Globe icon + diagonal stripe overlay. */ isBookedOnline?: boolean; /** AlertTriangle icon. */ hasUnassignedPatient?: boolean; /** HeartPulse icon. */ hasHighlightedAnamnesis?: boolean; /** Euro icon. */ hasBillableAmount?: boolean; /** Video icon. */ isTelehealth?: boolean; /** * Repeat icon — this event belongs to a REPEATING SERIES. Set it on * every occurrence, not only the first: the flag answers "will moving * or deleting this touch other appointments?", which is true of a * modified occurrence too. Series ROLE (which row owns the rule) is a * separate concern — see `CalendarEvent.isRecurrenceParent`. */ isRecurring?: boolean; /** * Task treatment — a calendar-scheduled to-do renders distinctly from an * appointment: dashed outline (derived from the resolved ink when no * `borderColor` is supplied), muted default surface (an explicit * `backgroundColor`/`textColor` still wins), a leading clipboard glyph, * and a localised "task" word appended to the accessible name. Emitted as * `data-kind="task"` for DOM hooks. */ isTask?: boolean; /** * Draft treatment — a placeholder for an appointment being composed: * the slot the user just picked, mirrored on the grid while the editor * is open. Dashed outline over a light primary tint, with a localised * "draft" word appended to the accessible name. Emitted as * `data-kind="draft"`. Takes precedence over `isTask`, and like a task * it forces the solid paint path so exactly one class-level assignment * of each paint custom property exists per render. */ isDraft?: boolean; /** * Details-pending treatment — a REAL booked appointment an * occupancy-first host drew from the slot it occupies while it still * fetches whose it is. The card keeps its colour and size and renders an * `aria-hidden` skeleton bar where the title goes, with the localised * "loading details" word in the accessible name and * `data-kind="pending-details"` as the hook. Wins over `isDraft`/`isTask`. */ detailsPending?: boolean; /** * Colour scheme for the picker colour. `'solid'` (default) is the * platform model — the hex paints the whole surface, ink auto-derived. * `'tinted'` is the chip-family scheme: the hex becomes a SOLID BORDER * over a light tint of itself (theme-aware via color-mix with `--card`), * with text on the theme's foreground tokens — `textColor` and * `borderColor` are ignored under it. Tasks keep their muted dashed * treatment regardless. */ colorStyle?: 'solid' | 'tinted'; /** * Resource title (chair/operator) woven into the composed aria-label * only — never rendered visually. The Calendar adapter resolves * resourceId → title before passing it. */ resourceLabel?: string; /** * The title is a privacy MASK (the Calendar's privacy mode swapped the * patient name for `privacyModeTitle`). Renders a crossed-out-eye glyph * beside the mask so the redaction is legible as deliberate, with its * own breathing room after the time. */ privacyMasked?: boolean; /** * Stable event id → emitted as `data-event-id` (Calendar.focusEvent * targets it) and used as the contrast-warning dedup context. */ eventId?: string; } export declare const CalendarEventCard: import("react").ForwardRefExoticComponent>; //# sourceMappingURL=calendar-event-card.d.ts.map