UI primitives
The components every bundled theme is composed from, and how to build your own page.
@heyo-sh/heyo-status/ui exports the components the bundled themes are built
from. Use them to assemble a page that does not match any bundled layout, or
to embed a single piece of a status page somewhere else.
Layout
The page container. Publishes data-slot="status-page" and data-theme,
and applies the theme's max-width token. Every layout renders into it.
Header chrome: brand mark, optional label, colour-mode toggle and the subscribe control.
generatedAt accepts a Date or an ISO string, so a snapshot fetched
over HTTP can be rendered without reviving it.
The quiet uppercase label shared by every bundled theme.
Status
The announced high-level state as a card, with a live indicator.
aria-live="polite".
The same announcement as a tinted banner, for themes that lead with one global verdict.
One monitor: name, description, latest state and latency, the day grid,
the uptime meters and the sparkline — filtered by metrics.
A group rendered as a native <details> disclosure, so it stays usable
without JavaScript.
A labelled meter that renders No data for null instead of 0%.
History
The uptime history bar: one flexed column per day, each carrying its aggregate in a native tooltip, so ninety days fit a phone with no horizontal scroller.
The latency sparkline, drawn from monitor.latencySeries.
Incidents and maintenance
Every active incident as a disclosure list.
One incident with its timeline, anchored at #incident-<id> — the anchor
the RSS and Atom entries link to.
A chronological update list with semantic status labels.
Upcoming and in-progress windows with their scheduled range.
Utilities
Switches the persisted preference. Must be inside StatusThemeProvider.
The UTC formatting used across the page, so server and client markup always agree.
Resolves a theme name to its { name, Layout } implementation.
Building a custom page
Keep StatusShell even in a custom page: it is what publishes data-theme
and the data-slot="status-page" hook that project-level CSS targets.
The subscribe dialog
It is deliberately not re-exported from /ui:
A static re-export would always beat the dynamic import <StatusPage /> uses,
pinning roughly 95 KB of modal, tabs and form code into the first chunk of
every page — more than the rest of the status page put together. Import it
from its own path, ideally lazily.
Which tabs to offer. Defaults to all three.
Defaults to "/api/heyo-status".
Overrides the derived POST target.
Feed links shown on the RSS tab.