shadcn.io is not affiliated with official shadcn/ui
Content Scheduler Dialog Block for React
A social scheduler's content calendar with its scheduling dialog shown open: a month to pick a day, best times plus any half hour, a zone that restates the time elsewhere, three channel switches, and a Schedule post button that drops a chip into the week behind it.
Installation
Overview
Put a post in a slot, with this scheduling dialog for React with Base UI. It opens from the Content calendar of Queuebird, a social scheduler: the header holds an outline Button, and the week of posts is drawn under a soft scrim inside a hairline frame with a plus mark on each corner. The dialog has three panes. A Calendar closes every day before the page's typed today. A Toggle Group offers the best times for the audience, with a Select of every half hour for any other. The summary reads the time in a chosen zone, restates it in the other two, and switches three channels on or off with Switches, each named in text with a two-letter tile. Schedule post, the only Shine Button, adds a chip to that day's column in the week behind the dialog. For preview the dialog is drawn open in place when the page loads; the header button opens the real Dialog, with the same state. For social tools, newsletters, editorial calendars and any app that queues work for later.
FAQ
Why is the dialog already open, and what do I keep?
So you can see it without a click. On load the dialog is a copy drawn in place over the page: a native dialog element that isn't modal, so nothing is trapped, hidden or focused, and the page around the preview keeps working. The header's Schedule post button opens the real Dialog, modal, with its focus trap, Escape and focus return, and the copy stays closed until a reload. Both show the same SlotFields component and share the block's state, so what you set in the copy is there in the real one. In your app keep the Dialog and drop the copy: the "in-place" state, the scrim and the dialog element inside the frame.
What stays local, and how do I wire it for real?
Everything. Scheduling adds a chip to the drawn week in local state and says in a polite status message that nothing was posted; no request goes out and no clock is read. In your app send the date, the time, the zone and the channel ids to your queue in schedule, have the server turn them into one instant, and draw the chip from its response. Keep the checks that live in the dialog: at least one channel, and no slot in the past.
How does the zone restate the time?
Each zone has its offset from UTC on the typed day: Lisbon plus one, New York minus four, Tokyo plus nine. The time you pick is read in the chosen zone, and the two others are worked out by adding the difference in hours, with a note when the day changes, such as "04:30 (day before)". Offsets are typed rather than read from the browser so the sentence is the same everywhere; in your app use your date library's zone data, because offsets change with daylight saving.
What stops a post being scheduled in the past?
Days before the typed today (Friday 9 October 2026) are closed in the calendar. For today itself the block compares the slot, in its zone, with the typed present, 14:30 in Lisbon, and shows "That time has already passed." under the summary instead of scheduling. Turning every channel off shows "Choose at least one channel." in the same line. Schedule post does nothing while a line shows.
Is it accessible from the keyboard?
Yes. The real dialog is named by its title and described by its sentence, focus is trapped while it is open, and Escape, Cancel and the close button return focus to the header button. The trigger is passed to DialogTrigger through render, and the dialog is controlled with open and onOpenChange. The copy shown on load moves no focus; Escape inside it and its close button close it and put focus back on the header button. The calendar's days, the best times and the half-hour list are all reachable with the keyboard, and each switch is named for the channel it controls.
How does it look on a phone?
The three panes become one column in the order you use them: the day, the time, then the summary and channels. The copy shown on load docks to the foot of the page as a bottom sheet with Schedule post pinned at the bottom and the panes scrolling above it; the best times lie in a row. The real dialog keeps the Dialog's own phone layout: a sheet stuck to the bottom of the screen.
Related
- Pro
Schedule Meeting Dialog
Time and schedulingA month page with its new event dialog shown open: a title, a day from a folded calendar, a start time and length, guest emails as tags, and a day timeline that moves with the time and warns when the meeting clashes.
- Pro
Set Reminder Dialog
Time and schedulingA to-do list with its reminder dialog shown open: five quick chips, an inline calendar and a time in quarter hours, repeat and notify choices, and one plain sentence that always reads the choice back.
- Pro
Time Zone Picker Dialog
Time and schedulingA preferences page with its time zone dialog shown open: a search over 14 zones in four regions, each row with its city, UTC offset and the time there at one typed moment, a button that reads this device's zone on a press, and the chosen zone printed back on the page.
- Pro
Meeting RSVP Dialog
Time and schedulingA team calendar's week with its reply dialog shown open: the event, a three-way Going, Maybe or Can't go answer, an optional note, and the guests by answer with their counts, moving as you choose.
- Pro
Recurring Payment Dialog
Payments and plansA rent page with its autopay dialog shown open: an amount, how often, a start day from a folded inline calendar, when it ends, and the next four payment dates worked out under the fields.
- Pro
Assign Task Dialog
Side sheetsA sprint board with a side sheet that assigns its one unowned task shown open: five people with their open tasks and load, a priority, a due date from chips or an inline calendar, and a switch to notify the assignee.