Cal.comdesign-system

Booker Event Information

Anatomy, states, and display conditions for the month-view Booker's event-information pane.

This page is a migration blueprint for the month-view Booker's left event-information pane. The current Cal Booker defines component order and display conditions; the previews show the target UI. Week and column layouts are outside this page's scope.

Anatomy

The map shows order and spacing. Labels link to each component. Conditional components are combined for reference; no booking flow renders all of them.

Only the event-information pane is included; the calendar, time slots, and booking form are outside this page's scope. The loading state replaces the information body, while hideEventTypeDetails removes the complete pane.

On mobile, the pane is the full-width top section with 16px body padding and two rounded banner corners. On desktop, these previews show it as a 280px left rail with 24px padding and a square trailing edge.

Availability badges beneath each component heading summarize where the behavior is possible. Web app means the current Cal Booker supports it. API v2 means the API exposes the data needed to reproduce it, while Partial means some required data is missing. Local state and Component API identify behavior that is not owned by either backend. Exact fields and differences are listed in Data contracts.

Web appAPI v2 · Partial

The header displays the event type's banner. When the event type has no banner, Cal falls back to the organization banner. Nothing is rendered when event details are hidden or neither banner is available.

Banner
Abstract layered event cover

Host identity

Web appAPI v2

The host identity appears before the event title and identifies the person or team responsible for the event.

Individual event

Shows the user's avatar and name.

Individual event
AR

Alex Rivera

Collective event

Cal displays at most four avatars and replaces the remaining identities with a +N avatar. A configured team or organization avatar appears first and counts toward that limit.

Team avatar and members

For the target UI, when no shared team or profile name is available, use the first member's name and the remaining count instead of Cal's current unbounded list. The +N avatar opens the hidden member names.

Members only

Round robin event

Hides the possible member avatars and shows the team or profile identity instead.

Round robin event
PT

Product Team

Round robin without an avatar

When a round-robin event hides the organization or team avatar, Cal displays only the profile name.

When roundRobinHideOrgAndTeam is enabled, Cal hides both the avatar and profile name; the current Booker retains a small vertical spacer in their place.

Profile name only

Product Team

Event title

Web appAPI v2 · Partial

The event title appears after the host identity whenever event information is visible. Cal uses the translated title for the attendee's locale when one is available.

Default title

Default title

30 Minute Meeting

Long title

Long titles wrap within the pane instead of being truncated.

Long title

Planning and strategy session for a new product launch

Event description

Web appAPI v2 · Partial

The event description appears below the title when a description is available. Cal prefers the translated description for the attendee's locale and renders nothing when the description is empty.

Short description

Short description

Long description

Long descriptions remain within a 180px scrollable region. A gradient indicates when more content is available above or below the visible area.

Long description

Rich formatting

Descriptions can combine headings, links, ordered and unordered lists, emphasis, quotes, and inline code. The content remains constrained by the same scrollable region.

Rich formatting

Former time

Web appAPI v2

The former time appears only while rescheduling, when Cal has both the reschedule identifier and the original booking data. It shows the original date and time with a strikethrough before the newly selected time.

Former time
Former time
Tuesday, September 8, 2026
10:00 am

Selected time

Web appAPI v2Local state

The selected time appears once a timeslot has been chosen. During rescheduling it follows the former time. Cal formats it using the attendee's timezone, locale, time format, and selected duration.

Selected time
Tuesday, September 15, 2026
10:00 am–10:30 am

Confirmation requirement

Web appAPI v2

This row appears when the event type requires the host to confirm new bookings manually.

Requires confirmation
Requires confirmation

Duration

Web appAPI v2Local state

The duration row is always present. Its content changes according to the event type's duration configuration and the current Booker step.

Static duration

A single-duration event displays its formatted length. Multiple-duration and dynamic events use the same static presentation during the booking step or when the duration selector is hidden.

Static duration
30 min

Selectable duration

Before the booking step, multiple-duration and dynamic events allow the attendee to choose a duration unless the selector is hidden.

Selectable duration

Recurrence

Web appAPI v2Local state

The recurrence row appears for recurring events, except while rescheduling. Its content changes when the Booker moves from time selection to the booking step.

Occurrence count

Before a time is selected, the attendee can choose how many occurrences to book, up to the event type's configured maximum.

Occurrence count
occurrences

Invalid occurrence count

Cal keeps an out-of-range entry visible, uses the configured maximum for the booking state, and displays validation feedback.

Invalid occurrence count
occurrences
Please enter a number between 1 and 12

Resolved dates

During the booking step, Cal replaces the count control with the resolved occurrence dates. It shows the first five dates, exposes any remaining dates in a popover, and marks daylight-saving time shifts.

Resolved dates

Tue, Sep 15, 10:00 am

Tue, Sep 22, 10:00 am

Tue, Sep 29, 10:00 am

Tue, Oct 6, 10:00 am

Tue, Oct 13, 11:00 amTime shift

Location

Web appAPI v2 · Partial

The location row is hidden when an event has no locations, is an instant meeting, or lets each host provide their own location.

Single location

A single configured location is displayed directly with its provider or location icon.

Single location
Cal.com HQ, San Francisco

Provider location

A conferencing location displays the provider's own icon instead of the generic location icon.

Provider location
Cal Video

Multiple locations

Multiple locations are summarized as options. Hovering or focusing the row reveals the choices, which the attendee selects during the booking step.

Multiple locations

Price

Web appAPI v2

The price row appears only when the event's resolved payment amount is greater than zero.

Standard currency

Standard currencies use the localized amount and credit-card icon.

Standard currency
$25.00

Bitcoin

Bitcoin prices are displayed in satoshis with the dedicated sats symbol.

Bitcoin
21000 sats

Timezone

Web appAPI v2 · PartialLocal state

The timezone row is always present with visible event details. During time selection it is editable unless the event locks the booking-page timezone; during the booking step it becomes static text.

Selectable timezone

Implementation note: Refactor TimezoneCombobox to accept a custom trigger before migrating this state. The Booker should reuse its timezone options, canonicalization, search, and popup while preserving the compact trigger shown below.

Selectable timezone

Static timezone

After a time is selected, the timezone becomes static text. Use the same target treatment for locked events; current Cal instead disables the selector. Resolve the value from the event's locked timezone, its schedule timezone, or the current timezone.

Static timezone
Europe/Rome

Reschedule host preference

Web appAPI v2Local state

This is the post-choice editor for a round-robin reschedule that allows host choice. It appears after the person rescheduling completes the mandatory initial-choice dialog. It is hidden for fresh bookings, non-round-robin events, events where host choice is disabled, and rerouting flows. When event details are hidden or the separate mobile slot dialog owns the controls, move this same component into the time-slot pane and make it fill the available row.

Reschedule host preference

Seat availability

Web appAPI v2

Seat availability appears during the booking step when the event has a seat limit and at least one seat is already booked. The event type decides whether Cal exposes the exact count.

Exact availability

Exact availability
6 / 10 Seats available

Available

When exact counts are hidden and fewer than half the seats are booked, Cal displays a neutral availability message.

Available
Seats available

Filling fast

When exact counts are hidden, Cal shows this warning after at least half the seats are booked.

Filling fast
Seats availableFilling fast

Almost full

The stronger warning appears after at least 83% of the seats are booked.

Almost full
Seats availableAlmost full

Loading state

Web appLocal state

While event information is pending, the pane replaces its content with placeholders that preserve the loaded layout's structure.

Loading

Custom content slot

Web appComponent API

Cal accepts caller-owned React content after the standard event-information rows through eventMetaChildren. There is no current in-app usage or fixed visual composition to preview, so consumers should treat this as an extension point rather than another standard Booker component.

Complete examples

These examples show the shell populated with a representative subset of components. Refer to the component map and the individual sections above for the complete set of possible content.

With a banner

When a banner is available, it sits flush against the top edge and the padded information body overlaps its lower edge.

With banner
Abstract layered event cover
AR

Alex Rivera

30 Minute Meeting

A focused conversation about your goals and the next steps we can take together.

30 min
Cal Video

Without a banner

Without a banner, the same information body starts at the shell's standard top padding.

Without banner
AR

Alex Rivera

30 Minute Meeting

A focused conversation about your goals and the next steps we can take together.

30 min
Cal Video

Profile name only

A round-robin event can hide the team or organization avatar and retain only the shared profile name.

Profile name only
Abstract layered event cover

Product Team

30 Minute Meeting

A focused conversation about your goals and the next steps we can take together.

30 min
Cal Video

Multiple avatars

A collective event can show its shared identity followed by member avatars. The stack displays at most four avatars; +N opens the hidden member names.

Multiple avatars
Abstract layered event cover

30 Minute Meeting

A focused conversation about your goals and the next steps we can take together.

30 min
Cal Video

Data contracts

Use this map when wiring either Booker. Unless a row says otherwise, the Cal fields come from the PublicEventType returned by viewer.public.event; production booking routes may server-load the same model. API v2 event fields refer to GET /v2/event-types (2024-06-14), while slot fields refer to GET /v2/slots (2024-09-04). Local state is part of the Booker adapter, not either transport.

The current atom normalizes the basic identity, title, description, duration, location, and selected-slot fields. Its hand-written event type omits several fields that the API already returns. It also fetches banner and public display-name data from tRPC because the generic event-types response does not provide the full public identity.

Cal also has an internal GET /v2/atoms/event-types/{eventSlug}/public endpoint that returns the same PublicEventType used by tRPC. The current atom does not use it. It would make most event rows direct and remove the separate tRPC banner request, but it is excluded from the public API documentation and must be explicitly adopted as a supported atom contract before the atom depends on it. Slots, bookings, and local interaction state would still remain separate contracts.

In the Coss repository, the current normalization lives in apps/ui/registry/default/atoms/lib/booker/use-booker.ts and apps/ui/registry/default/atoms/lib/booker/utils.ts; its API clients live in apps/ui/registry/default/lib/cal-api/.

Implementation references

These files define the documented component order, display conditions, and transport contracts.

Example URLs

Not exhaustive—open these paths locally to see the event-information pane in the complete Booker.