Status page
A public status page with subscribe, uptime per service and incident history.
"use client";
import * as React from "react";
import { Bell, Check } from "lucide-react";
import { SystemStatus } from "@/components/blocks/system-status";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Popover } from "@/components/ui/popover";
/** A complete public status page: branded header, subscribe, status block and footer. */
export function StatusPage() {
const [email, setEmail] = React.useState("");
const [done, setDone] = React.useState(false);
return (
<div className="w-full overflow-hidden rounded-xl border border-border bg-muted/20">
<header className="flex items-center justify-between border-b border-border bg-background px-6 py-4">
<span className="font-semibold">Northwind <span className="font-normal text-muted-foreground">Status</span></span>
<Popover
align="end"
trigger={<Button size="sm" variant="outline"><Bell /> Subscribe</Button>}
>
{done ? (
<p className="flex items-center gap-2 text-sm"><Check className="size-4 text-emerald-500" /> You'll get incident updates.</p>
) : (
<form onSubmit={(e) => { e.preventDefault(); if (/^\S+@\S+\.\S+$/.test(email)) setDone(true); }} className="w-64 space-y-2">
<p className="text-sm font-medium">Get notified of incidents</p>
<Input type="email" value={email} onValueChange={setEmail} placeholder="you@company.com" aria-label="Email" size="sm" />
<Button type="submit" size="sm" className="w-full">Subscribe</Button>
</form>
)}
</Popover>
</header>
<main className="mx-auto max-w-3xl px-4 py-10">
<SystemStatus />
</main>
<footer className="border-t border-border px-6 py-5 text-center text-xs text-muted-foreground">Times shown in UTC · Powered by Northwind</footer>
</div>
);
}
export default StatusPage;What's inside
- Subscribe popover
- Uptime per service
- Incident history
When to use
- Hosting a status page on your own domain.
When not to use
- Internal dashboards.
Installation
pnpm dlx shadcn@latest add https://lodeui.com/r/status-page.jsonLands in components/templates/status-page.tsx with sample data you replace with your own.
The CLI also installs motion, lucide-react and every Lode component it's built from.
Usage
Import it from @/components/templates/status-page after installing. It ships with sample data, so it renders straight away; swap in your own data when you're ready.
// app/status/page.tsx
import { StatusPage } from "@/components/templates/status-page";
export default function Status() {
return <StatusPage />;
}API reference
StatusPage
A complete public status page: branded header, subscribe popover, status block and footer. Also the default export. No props: sample data sits at the top of the file, ready to swap for your own.
No props.
Keyboard interactions
| Keys | Action |
|---|---|
| Tab | Reach Subscribe |
| Esc | Close the subscribe popover |
Accessibility
- The subscribe field is labelled; the popover returns focus on close.
Motion
- Incidents stagger in.
Responsive behavior
- Fits 320px.
Performance
- Mostly static; render it on the server with your data.
Notes for AI
- Feed system-status with your monitoring data.
This page as Markdown, for assistants and coding agents:
/templates/status-page/markdownThe full library index for assistants is at /llms.txt.
Lode222 doc pagesllms.txt