Link booking

A React block (a whole screen) in Beamline's HR & payroll app.

A candidate's booking link for one stage of one job: a column with the job, the stage's length, who they meet (each with their role), where and what the interview covers (optional agenda, each part with its minutes); the month with only its open days; that day's times in the candidate's own zone (changeable) with the company's time beside each, and the day said when it differs; the chosen time from start to end in their zone and the company's, then their details (name, email for the invite, optional phone); then Book, which sends one booking however often it is pressed (the request carries a key formed with the draft, so a repeat is the same request). A time someone took meanwhile is struck where it stood on the warning tone with the nearest open times one tap each. Once booked: both clocks, a reference, and the calendar invite's delivery on a line of its own (sending, delivered, or bounced with Send again; the booking stands either way); Pick another time moves the booking with the same guard; Cancel the interview sits in the menu with a reason and a confirm; a cancelled booking can be booked again. A closed link says why.

Use it for

  • A link a person outside the team opens to book one meeting the team defined: an interview, a demo, a site visit.
  • Where the booker and the team are in different time zones and both clocks matter, and where a double submit must never double-book.

Not for

Anatomy

  • header: the tool's mark, Book your <stage> (Move your <stage> when rescheduling)
  • about (a column beside the choice): the job and company, the company's zone, length, who (initials, name, role), where, The interview (agenda with minutes)
  • when: the month with only open days, the zone choice, the day's times each with the company's time beside and the day said when it differs
  • summary: the chosen day, start–end in the candidate's zone and in the company's
  • details: name, email (the invite goes there), optional phone; a taken time with the nearest open ones; Book <day>, <time>
  • booked: status, reference, the menu (Cancel the interview), both clocks, the invite's delivery line, Pick another time
  • cancel: what happens, an optional reason, Keep it or Cancel the interview

States

  • picking mid-way, open times loading, failed with Try again, none this month
  • booking (Book busy; more presses send nothing new), booked, moved, failed to book (details kept)
  • taken meanwhile: struck, nearest offered
  • invite sending, delivered, bounced with Send again
  • cancelling, cancel failed, cancelled with Book again
  • link closed
  • phone: one column
  • right to left: mirrored
  • reduced motion: through the tokens

Keyboard

  • Tab through the calendar (arrows move days), the zone, each time, the details and Book; Enter or Space picks a time

Motion

Nothing runs at rest.

Props

PropTypeDefaultDescription
company (required)string—The hiring company, said beside its times and in the header.
productstring—The hiring tool's name, for the mark.
booked (required)BookedStage—
timezone (required)string—The company's IANA zone.
candidateTimezonestring—The candidate's zone at first (the browser's, or what the link knows); they can change it. Default: the company's.
zonesstring[]—More zones offered in the zone choice.
loadSlots (required)(span: { from: string; to: string; }) => Promise<OpenSlot[]>—Open starts between two days (YYYY-MM-DD, inclusive, in the candidate's zone). A rejection is said with its reason and Try again.
onBook (required)(request: LinkBookingRequest) => Promise<LinkBookingAnswer>—Books (or moves) the time. Must treat a repeated `key` as the same request. Reject only when nothing could be booked: the reason is said and the details kept.
bookingLinkBookingRecord | null—The booking this link already holds (controlled), or null before one is made.
defaultBookingLinkBookingRecord | null—
onBookingChange((booking: LinkBookingRecord | null) => void)—
inviteInviteDelivery | null—The invite's delivery for the current booking, as the host learns it.
onResendInvite(() => void)—
onCancel((bookingId: string, reason: string) => Promise<void>)—Cancels the booking; reject with the reason when it couldn't be cancelled.
contactPartial<LinkContact>—Details the link already knows.
phoneCountrystring—The country the phone field starts on (ISO code).
defaultDaystring—The day and start picked at first (a link reopened mid-way).
defaultSlotstring—
todaystring—Today in the candidate's zone (YYYY-MM-DD): no day before it is offered. Default: today.
closedstring | null—The link no longer books (used, expired, the stage closed): the reason.
timeFormat"12h" | "24h"—
classNamestring—Classes on the documented visual root; no override by default.
styleCSSProperties—Inline styles on the documented visual root; no overrides by default.
refRef<HTMLDivElement>—Receives the documented native target or imperative handle; omitted by default.

Built from

Dependencies

lucide-react

Import

import { LinkBooking } from "@beamline/link-booking";

Get it

Link booking is part of Beamline UI. Install the parts you need in your React app as compiled packages or editable source. Get Beamline · Connect your agent

More in HR & payroll

  • Shift planner: A workplace's week of staff shifts against what it needs: a row per person with their week's hours against their contract, each day a 24-hour track with…
  • Shift rotations: Rotating shift patterns from pattern to people: a pattern of one to four weeks painted day by day with a shift template, a rest day or nothing (pick the…
  • Roster publishing: The week's roster before it goes out: areas down the side and days across, each shift a chip with who works it and its hours, its state its tone (not…
  • My shift: The worker's own shift on their phone: today drawn to scale (the plan's areas as blocks on an hour axis, under them what was worked: on-plan time in…
  • Timesheet review: Timesheets for a manager: the day's counts at the head (scheduled, on shift, late, on break, to approve), the ones that filter being buttons, an…
  • Hours ledger: One worker's pay cycle of shifts, for the worker or their payroll admin: the wall-clock span and the paid hours as separate columns, a night shift…
  • Payroll run: A pay period from report to submission, one payroll account at a time (a worker on two accounts is on both runs, never combined): the workers on one…
  • Payroll cycles: The client's side of an outsourced payroll across countries: every entity's current cycle on one board, its stage drawn as steps, the one thing that…
  • Payroll approvals: Payroll approvals for a company paying through a payroll provider. Expenses are split by whose move it is (you, another approver, the employee answering…
  • Benefit changes: An employee's benefit changes after a life event. The centre puts their turn first: each task (a proof to upload, with its deadline in the warning tint…
  • Hiring pipeline: A recruiting team's pipeline across every open job. Stage groups (reviewing, interviewing, closing) are counted across jobs above job sections that fold…
  • Recruiter home: A recruiter's own work, in one place. Upcoming interviews with who sits in, today's first; feedback owed, overdue first and on the danger tone, written…
  • Stage reports: Reports on how applications move through stages, built from each application's stage intervals. By week: applications present in each stage (or from each…
  • Team & members: The people page of a workspace: seats used against the plan, members and pending invitations in one list with search and a role filter, role changes that…

Part of Beamline UI: polished, editable React components and complete screens for custom applications. Build your own style from any look; tokens, fonts, radii, motion; not only colours.