WeekView
Standalone schedule week view component
Source
LLM docs
Docs
Package
Usage
WeekView displays events for an entire week with time slots. It supports all-day events, overlapping events, drag and drop, custom time ranges, and more.
Controlled date
Control the date displayed by WeekView externally using date and onDateChange props.
Mar 29 – Apr 4, 2026
Time range
Use startTime and endTime props to set the visible time range. Times should be in HH:mm:ss format.
Start scroll time
Use startScrollTime prop to set the initial scroll position to a specific time.
The value should be in HH:mm:ss format. This is useful when you want the view to
open at a specific time (e.g., business hours start) instead of midnight.
Interval minutes
intervalMinutes prop controls the granularity of time slots. Default is 60 minutes.
First day of week
Set firstDayOfWeek to control which day starts the week. 0 is Sunday, 1 is Monday (default), etc.
Weekday format
Use weekdayFormat prop to customize the weekday names display. It accepts dayjs format strings.
Without weekend days
Set withWeekendDays={false} to hide Saturday and Sunday columns.
Highlight today
Set highlightToday to visually distinguish today's column:
Without week number
Set withWeekNumber={false} to hide the week number in the top-left corner.
Current time indicator
Set withCurrentTimeIndicator to display a line showing the current time on today's column.
Without all-day slots
Set withAllDaySlots={false} to hide the all-day events section at the top.
All-day events
All-day events are displayed in a separate section at the top of the week view. Events that span midnight or cover a full day are automatically placed in this section.
Without header
Set withHeader={false} to hide the header controls.
View change callback
Use onViewChange callback to be notified when the user selects a different view from the header dropdown.
Selected view: week
Custom header
You can build a custom header using ScheduleHeader compound components combined with your own controls.
Set withHeader={false} on the view and compose the header externally.
Week label format
Use weekLabelFormat prop to customize the week range display in the header.
Slot label format
slotLabelFormat prop controls the format of time labels.
Slot height
Customize the height of time slots and the all-day section using slotHeight and
allDaySlotHeight props.
Radius
Use radius prop to customize the border radius of events.
Business hours
Use highlightBusinessHours and businessHours props to visually distinguish business hours.
Custom time slot props
Use getTimeSlotProps to add custom props to individual time slots based on their time range.
The function receives { start, end } datetime strings in YYYY-MM-DD HH:mm:ss format
and should return an object of props to spread onto the slot element, or undefined.
This is useful for setting data-business-hours on a custom range that differs from the
default 9:00–17:00, or for attaching custom event handlers to specific slots.
Event handlers like onClick returned by getTimeSlotProps are composed with internal handlers
(onTimeSlotClick) – both will fire without overriding each other.
Overlapping events
When multiple events overlap in time, they are automatically positioned side by side.
Drag and drop
Enable drag and drop by setting withDragDrop prop. Events can be dragged to different days and times.
Restrict draggable events
Use canDragEvent callback to control which events can be dragged.
Events that return false will not be draggable.
External drag and drop
Use onExternalEventDrop to allow dragging items from outside the component into
the schedule. External items must set data in dataTransfer during their onDragStart.
The callback receives the DataTransfer object and the drop target datetime.
Drag to schedule
Quick Sync
30 min
Workshop
120 min
One-on-One
60 min
Bidirectional drag and drop
Combine onExternalEventDrop with withEventsDragAndDrop to enable bidirectional
drag and drop. Items dragged from the sidebar are removed from the list and added
to the schedule. Events dragged from the schedule back to the sidebar are removed
from the schedule. The schedule sets application/json with { eventId } in
dataTransfer when an event is dragged, which the sidebar drop zone reads to
identify the event.
Unscheduled
Quick Sync
30 min
Workshop
120 min
One-on-One
60 min
Event resize
Enable event resizing by setting withEventResize prop. Users can drag the top or bottom
edge of an event to adjust its start or end time. Use onEventResize callback to handle
the resize. Use canResizeEvent to control which events can be resized.
Restrict resizable events
Use canResizeEvent callback to control which events can be resized.
Events that return false will not show resize handles.
Full event customization
Use renderEvent prop to fully customize event rendering. This function receives the event
data as the first argument and all props that would be passed to the event root element
(including children) as the second argument, allowing you to wrap events in custom components
like HoverCard, Tooltip, or custom wrappers.
Custom event body
Use renderEventBody prop to customize the content inside events without replacing
the event wrapper. This is useful for adding icons, additional text, or custom layouts.
Recurring events
WeekView automatically expands recurring events for the visible week. See Recurring events guide for full documentation.
Background events
Set display="background" on an event to render it as a full-width, semi-transparent,
non-interactive block behind regular events. Background events are useful for marking
unavailability, lunch breaks, focus time, or other blocked periods.
Custom background event styles with drag and drop blocking
Use Styles API to customize background event appearance and prevent dropping regular events into blocked time ranges. This example uses diagonal red lines to indicate lunch breaks across the entire week and rejects drops that overlap with background events.
Static mode
Set mode="static" to disable all interactions.
Localization
Use locale prop to set the dayjs locale for date formatting.
Combine it with labels prop to translate all UI text.
Create and update events
Set withDragSlotSelect prop to allow users to drag across time slots to select a time range.
When the drag ends, the onSlotDragEnd callback is called with the range start and end dates.
The drag is constrained to a single day column. Combined with onTimeSlotClick, onAllDaySlotClick,
and onEventClick callbacks, this enables a complete event creation and editing experience.
Responsive styles
WeekView uses @container queries for responsive styles. The component automatically adjusts its layout based on the container width, hiding labels and reducing padding on smaller screens. Container queries are supported in all modern browsers.
Accessibility
Focus management
In the WeekView component, focus is managed to provide an efficient keyboard navigation experience:
- The weekdays row, all-day slots row, and time slots grid each have their first element in the tab order (
tabIndex={0}) - All other elements have
tabIndex={-1}and can only be reached via arrow key navigation - This approach reduces the number of tab stops when navigating through the schedule
Keyboard interactions
Weekdays row:
All-day slots (when enabled):
Time slots:
Slot labels
Each time slot button has an aria-label attribute with the complete slot information including the date and time range (e.g., "Time slot 2025-11-03 08:00:00 - 09:00:00"). All-day slots have labels like "All day 2025-11-03", and weekday buttons have labels like "Weekday 2025-11-03". This provides screen reader users with complete context about each element.