Status Updates
openstatus/status-updatesFreeBlock
Popover with copy-link primitives for RSS, Atom, JSON, Slack, and SSH subscription channels. Flat exports — caller composes layout (tabs, sections, etc.)
Install it
npx shadcn@latest add https://openstatus.dev/r/status-updates.jsonSource
1"use client";23import { useStatusBlocksLabels } from "@/components/blocks/status-i18n";4import { Button } from "@/components/ui/button";5import { Input } from "@/components/ui/input";6import {7 Popover,8 PopoverContent,9 PopoverTrigger,10} from "@/components/ui/popover";11import { Separator } from "@/components/ui/separator";12import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard";13import { cn } from "@/lib/utils";14import { Check, Copy } from "lucide-react";1516/**17 * StatusUpdates — popover root for "Get updates" controls.18 *19 * Flat exports. Compose `StatusUpdatesTrigger` + `StatusUpdatesContent` and20 * pick whichever channel children apply (`StatusUpdatesRss`,21 * `StatusUpdatesJson`, `StatusUpdatesSlack`, `StatusUpdatesSsh`, or your own22 * email form). The block does not enforce a tab structure — callers wrap23 * children with `Tabs` themselves if needed.24 */25export function StatusUpdates({26 children,27 ...props28}: React.ComponentProps<typeof Popover>) {29 return <Popover {...props}>{children}</Popover>;30}3132export function StatusUpdatesTrigger({33 children,34 className,35 ...props36}: React.ComponentProps<typeof Button>) {37 const labels = useStatusBlocksLabels();38 return (39 <PopoverTrigger asChild>40 <Button41 data-slot="status-updates-trigger"42 size="sm"43 variant="outline"44 className={cn(className)}45 {...props}46 >47 {children ?? labels.subscribe}48 </Button>49 </PopoverTrigger>50 );51}5253export function StatusUpdatesContent({54 className,55 ...props56}: React.ComponentProps<typeof PopoverContent>) {57 return (58 <PopoverContent59 data-slot="status-updates-content"60 align="end"61 className={cn("w-80 overflow-hidden p-0", className)}62 {...props}63 />64 );65}6667/**68 * StatusUpdatesSection — single channel description + content slot.69 * Use to compose custom channels; the built-in `StatusUpdatesRss`/`Json`/70 * `Slack`/`Ssh` children render this internally.71 */72export function StatusUpdatesSection({73 description,74 children,75 className,76 ...props77}: React.ComponentProps<"div"> & {78 description?: React.ReactNode;79}) {80 return (81 <div82 data-slot="status-updates-section"83 className={cn("flex flex-col gap-2 px-2 py-2", className)}84 {...props}85 >86 {description ? <div className="text-sm">{description}</div> : null}87 {children}88 </div>89 );90}9192export function StatusUpdatesCopyInput({93 value,94 className,95 onClick,96 ...props97// … 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 Barstatus-bar | openstatus | Blocks | Free | 1 dep | |
| 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 |
