Skip to content
shadcn.io

shadcn.io is not affiliated with official shadcn/ui

Planned Maintenance Progress Error Block for React Aria

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 React Aria. 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.