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