Skip to content
shadcn.io

shadcn.io is not affiliated with official shadcn/ui

Planned Maintenance Progress Error Block for React

A full-height maintenance page for an online bank that shows a five-segment progress bar with the window's start and expected return, and a Check again button that reports a typed result.

Framework
UI library

Preview

Preview width

Installation

Part of Pro
Pro unlocks the code and one-line install of every Pro button and text effect, plus the MCP for your AI editor.
Have Pro already? Sign in to open it.Opens here as soon as you're Pro.

Overview

Keep members calm while a service is down on purpose, with this maintenance block for React with Base UI. It's the "back soon" page of Willowbank, a credit union's online banking: the page's rails run its full height and one band crosses the screen between two rules with a plus mark at each end. The product's mark, the heading and one sentence that says what is still working come first. Under them a ruled band runs from rail to rail and holds a Progress bar cut into five segments, how much of the window has passed, the time the work started and the time banking is expected back, all in UTC. Below it a Shine Button, the only colored control, says "Check again", and a ghost Button links to the status page. It's built from Progress, Shine Button, Button and Guides, with a CSS entrance only. For banks, billing portals and any app that announces its maintenance in advance.

FAQ

Where do the times and the percent come from?

They are typed. WINDOW_START and WINDOW_END are the maintenance window and AS_OF is the moment the page was drawn, all ISO times in UTC. The percent is worked out from those three, so the bar, the "65% done" text and the clock times always agree, and nothing reads the clock, so the page looks the same on the server and in every time zone. In your app, pass the real window, and use the current time for AS_OF if you want the bar to move.

What does Check again do?

It waits 600 ms behind a busy button, then says "Checked at 15:17 UTC: still in maintenance", the same typed result every time, and adds that this demo asked nothing. Focus moves to that line, which is a polite status region present from load, so a screen reader hears the result. Replace the wait with a request to your health endpoint and show what it answers.

Which status code should the server send?

A planned outage is a 503 Service Unavailable, ideally with a Retry-After header holding the expected return time. A 200 would let search engines index the notice as your page, and a 500 says something broke rather than something is planned. A component can't set the status: return it from your server or edge when the maintenance flag is on.

Does the bar show the real work done?

It shows how much of the window has passed, not the work finished, which a page seldom knows. That's why the copy says "Maintenance progress" next to the start and the expected return rather than promising a finish time. The bar is decorative for assistive technology; the percent and both times are in text beside it.

How does it look on a phone?

The heading, the bar and the times stay in one column, and Check again and the status link stack full width under them, so the button sits on the first screen. The rails and the ruled band keep their plus marks at the edges.

  • Pro

    A maintenance notice for a payroll service as one framed panel: a clock you scrub through the 02:00 to 06:00 UTC window drives the time left, a progress bar and four tasks that read Done, Running or Queued.

  • Pro

    A full-height status page for cloud storage moving an account between regions: a drawn move whose dashes run three cycles, and an accordion of five steps that each say what they do and what stays available.

  • Pro

    500 Server Error

    Server and outages

    A full-height 500 page for an event-ticketing site: the heading, a copyable reference and time, a Try again that honestly keeps failing, and a framed figure of the request's path with the failed stop marked.

  • Pro

    A full-height holding page for a marketplace that is not open yet: an email form that checks itself and notes the address in place, beside the four phases of the build as a vertical Steps with a bar for the schedule.

  • Pro

    A banner stack in an on-call console window: a critical banner that cannot be dismissed, a warning and an info banner that fold away, and a Dismissed row that restores them, in a window that never changes height.

  • Pro

    A full-height page for a web app tab running a retired version: a ruler of five releases with the supported range shaded and You are here marked, a radio group to read each release, three changes in 5.0 and a reload button.