My App
RoomKitFrontend

Components

Pre-built React components for room booking UIs

Overview

RoomKit ships 10 pre-built React components. All components use inline styles by default and accept a className prop for custom styling.

import {
    AvailabilitySearch,
    BookingForm,
    BookingStatusBadge,
    BookingTimeline,
    BulkImportProgress,
    ConflictBanner,
    ExamScheduleView,
    LocationBrowser,
    RecurrenceEditor,
    RoomCard,
} from '@roomkit/react';

AvailabilitySearch

A search form with fields for time range, minimum capacity, capacity type, required equipment, accessibility requirements, and location scope. Emits filter changes with debouncing.

<AvailabilitySearch
    equipmentOptions={['projector', 'whiteboard', 'microphone']}
    accessibilityOptions={['wheelchair', 'hearing_loop']}
    locationOptions={[
        { id: 'campus-a', displayName: 'Campus A' },
        { id: 'campus-b', displayName: 'Campus B' },
    ]}
    debounceMs={300}
    onChange={(filters) => console.log(filters)}
/>

Props

PropTypeRequiredDescription
classNamestringNoCSS class name
equipmentOptionsstring[]NoEquipment tags shown as checkboxes
accessibilityOptionsstring[]NoAccessibility attributes shown as checkboxes
locationOptions{ id: string; displayName: string }[]NoLocation options for the scope dropdown
debounceMsnumberNoDebounce delay (default: 300)
onChange(filters: AvailabilityFilter) => voidNoCalled when any filter changes

BookingForm

A form for creating or editing bookings with fields for title, description, time range, purpose type, and delegation.

<BookingForm
    roomId="room-123"
    onSubmit={(data) => createBooking.mutate(data)}
    isSubmitting={createBooking.isLoading}
/>

Props

PropTypeRequiredDescription
classNamestringNoCSS class name
roomIdstringYesTarget room ID
initialDataPartial<CreateBookingInput>NoPre-fill form fields
onSubmit(data: CreateBookingInput) => voidYesCalled on form submission
isSubmittingbooleanNoDisables the submit button

BookingStatusBadge

Displays a booking status with color-coded styling.

<BookingStatusBadge status="confirmed" />

Props

PropTypeRequiredDescription
statusBookingStatusYesThe booking status to display
classNamestringNoCSS class name

BookingTimeline

A visual timeline displaying bookings for a room or person within a time range.

<BookingTimeline
    bookings={bookings}
    startsAt={new Date('2026-03-02T08:00:00Z')}
    endsAt={new Date('2026-03-02T20:00:00Z')}
    onBookingClick={(booking) => console.log(booking.id)}
/>

Props

PropTypeRequiredDescription
bookingsBooking[]YesBookings to display
startsAtDateYesTimeline start
endsAtDateYesTimeline end
onBookingClick(booking: Booking) => voidNoClick handler
classNamestringNoCSS class name

BulkImportProgress

A progress bar for displaying bulk operation status.

<BulkImportProgress operation={bulkOperation} />

Props

PropTypeRequiredDescription
operationBulkOperationYesThe bulk operation data
classNamestringNoCSS class name

ConflictBanner

A notification banner shown when a booking conflict is detected. Displays conflict details and alternative suggestions.

<ConflictBanner
    conflict={conflictResult}
    alternatives={alternatives}
    onSelectAlternative={(alt) => console.log('Selected:', alt)}
/>

Props

PropTypeRequiredDescription
conflictConflictCheckResultYesConflict detection result
alternativesAlternativeSuggestion[]NoAlternative slots
onSelectAlternative(alt: AlternativeSuggestion) => voidNoSelection handler
classNamestringNoCSS class name

ExamScheduleView

Displays exam sessions for a cohort or room.

<ExamScheduleView
    sessions={examSessions}
    onSessionClick={(session) => console.log(session.id)}
/>

Props

PropTypeRequiredDescription
sessionsExamSession[]YesExam sessions to display
onSessionClick(session: ExamSession) => voidNoClick handler
classNamestringNoCSS class name

LocationBrowser

A hierarchical tree browser for navigating the location hierarchy.

<LocationBrowser
    tree={locationTree}
    onSelect={(node) => console.log('Selected:', node.id)}
/>

Props

PropTypeRequiredDescription
treeLocationTreeNode[]YesThe location tree data
onSelect(node: LocationTreeNode) => voidNoSelection handler
classNamestringNoCSS class name

RecurrenceEditor

A form for creating and editing recurrence rules with frequency, day-of-week, and calendar week inputs.

<RecurrenceEditor
    value={recurrenceRule}
    onChange={(rule) => setRecurrenceRule(rule)}
/>

Props

PropTypeRequiredDescription
valuePartial<RecurrenceRule>NoCurrent rule values
onChange(rule: Partial<RecurrenceRule>) => voidYesChange handler
classNamestringNoCSS class name

RoomCard

A summary card showing room details, capacity, and equipment.

<RoomCard
    room={room}
    score={0.85}
    onClick={() => router.push(`/rooms/${room.id}`)}
/>

Props

PropTypeRequiredDescription
roomRoom & { equipment?: RoomEquipment[]; accessibility?: RoomAccessibility[] }YesRoom data
scorenumberNoAvailability score (0-1)
onClick() => voidNoClick handler
classNamestringNoCSS class name

On this page