Omarchy Desktop Panel

block

A keyboard-first overview combining workspaces, service state, and shortcuts.

bunx --bun shadcn@latest add yamz8/omarchy-shadcn-registry/omarchy-desktop-panel

Preview

Desktop
A keyboard-first overview of workspaces and services.

Workspaces

Services

  • Network
  • Audio
  • Night light
Workspace 1

Dependencies

registry
card, yamz8/omarchy-shadcn-registry/omarchy-keycap, yamz8/omarchy-shadcn-registry/omarchy-status, yamz8/omarchy-shadcn-registry/omarchy-workspace-switcher

Source

registry/blocks/omarchy-desktop-panel.tsx
"use client"

import * as React from "react"

import {
  Card,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from "@/components/ui/card"
import { OmarchyShortcut } from "@/components/ui/omarchy-keycap"
import { OmarchyStatus } from "@/components/ui/omarchy-status"
import {
  OmarchyWorkspaceSwitcher,
  type OmarchyWorkspace,
} from "@/components/ui/omarchy-workspace-switcher"

const workspaces: readonly OmarchyWorkspace[] = [
  { id: "1", occupied: true },
  { id: "2", occupied: true },
  { id: "3" },
  { id: "4", urgent: true },
  { id: "5" },
]

export function OmarchyDesktopPanel() {
  const [workspace, setWorkspace] = React.useState("1")
  const workspaceHeadingId = React.useId()
  const servicesHeadingId = React.useId()

  return (
    <Card className="w-full max-w-lg">
      <CardHeader>
        <CardTitle>Desktop</CardTitle>
        <CardDescription>
          A keyboard-first overview of workspaces and services.
        </CardDescription>
      </CardHeader>
      <CardContent className="flex flex-col gap-5">
        <section
          className="flex flex-col gap-2"
          aria-labelledby={workspaceHeadingId}
        >
          <h3
            id={workspaceHeadingId}
            className="text-sm font-medium text-muted-foreground"
          >
            Workspaces
          </h3>
          <OmarchyWorkspaceSwitcher
            workspaces={workspaces}
            value={workspace}
            onValueChange={setWorkspace}
          />
        </section>

        <section
          className="flex flex-col gap-2"
          aria-labelledby={servicesHeadingId}
        >
          <h3
            id={servicesHeadingId}
            className="text-sm font-medium text-muted-foreground"
          >
            Services
          </h3>
          <ul className="flex flex-wrap gap-2">
            <li>
              <OmarchyStatus status="active">Network</OmarchyStatus>
            </li>
            <li>
              <OmarchyStatus status="active">Audio</OmarchyStatus>
            </li>
            <li>
              <OmarchyStatus status="idle">Night light</OmarchyStatus>
            </li>
          </ul>
        </section>
      </CardContent>
      <CardFooter className="justify-between gap-4">
        <span className="text-sm text-muted-foreground">
          Workspace {workspace}
        </span>
        <OmarchyShortcut keys={["Super", workspace]} />
      </CardFooter>
    </Card>
  )
}