Status Bar
openstatus/status-barFreeBlock
Interactive status timeline with hover, keyboard navigation, and event display
Install it
npx shadcn@latest add https://openstatus.dev/r/status-bar.jsonSource
1"use client";23import { useStatusBlocksLabels } from "@/components/blocks/status-i18n";4import type {5 StatusBarData,6 StatusEventType,7 StatusReportImpact,8 StatusType,9} from "@/components/blocks/status.types";10import { statusColors } from "@/components/blocks/status.utils";11import {12 HoverCard,13 HoverCardContent,14 HoverCardTrigger,15} from "@/components/ui/hover-card";16import { Separator } from "@/components/ui/separator";17import { Skeleton } from "@/components/ui/skeleton";18import { useMediaQuery } from "@/hooks/use-media-query";19import { cn } from "@/lib/utils";20import { formatDistanceStrict } from "date-fns";21import { forwardRef, useCallback, useEffect, useRef, useState } from "react";2223interface StatusBarProps {24 data: StatusBarData[];25 renderCard?: (26 data: StatusBarData["card"][number],27 index: number,28 ) => React.ReactNode;29 renderBar?: (30 data: StatusBarData["bar"][number],31 index: number,32 ) => React.ReactNode;33 renderEvent?: (34 data: StatusBarData["events"][number],35 index: number,36 ) => React.ReactNode;37 /**38 * Optional Radix Portal container for the day hover-card. Defaults to39 * `document.body`. Pass a ref when the bar is rendered inside a scoped40 * subtree (e.g. a status-page preview that overrides `--radius` and other41 * CSS vars on a wrapper) so the portaled card inherits the same context.42 */43 container?: HTMLElement | null;44}4546interface UseStatusBarProps {47 dataLength: number;48 isTouch: boolean;49}5051type InteractionType = "pin" | "hover" | "focus" | null;5253/**54 * useStatusBar - Headless hook for managing status bar interactions and keyboard navigation55 *56 * This hook provides the core logic for StatusBar interactions, implementing a57 * headless UI pattern that separates state management from presentation. It handles:58 *59 * **Interaction Modes**:60 * - **hover**: Desktop hover state (shows card on mouse hover, auto-hides on leave)61 * - **pin**: Pinned state (click to pin card open, click again or Esc to close)62 * - **focus**: Keyboard focus state (shows card while focused, hides on blur)63 *64 * **Keyboard Navigation**:65 * - **Arrow Left/Right**: Navigate between bars in the same timeline66 * - **Arrow Up/Down**: Navigate between timelines (different monitors)67 * - **Enter/Space**: Pin/unpin the active bar68 * - **Escape**: Close pinned card and remove focus69 *70 * **Touch Device Support**:71 * - Disables hover state on touch devices (detected via `(hover: none)` media query)72// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from openstatus
All 26 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Status Bannerstatus-banner | openstatus | Blocks | Free | no deps | |
| Status Blank Statesstatus-blank | openstatus | Blocks | Free | no deps | |
| Status Calendarstatus-calendar | openstatus | Blocks | Free | 3 deps | |
| Status Page Chromestatus-chrome | openstatus | Blocks | Free | no deps | |
| Status Page (Complete)status-complete | openstatus | Blocks | Free | no deps | |
| Status Componentstatus-component | openstatus | Blocks | Free | 2 deps | |
| Status Component Groupstatus-component-group | openstatus | Blocks | Free | no deps | |
| Status Page (Essentials)status-essentials | openstatus | Blocks | Free | no deps |
