{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "fragcap",
  "homepage": "https://fragcap.com",
  "description": "fragcap registry.",
  "items": [
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "theme",
      "type": "registry:theme",
      "title": "fragcap Theme",
      "description": "fragcap design tokens. Dark-first, WCAG AA, and brand-contract compliant.",
      "cssVars": {
        "theme": {
          "radius-sm": "6px",
          "radius-md": "8px",
          "radius-lg": "10px",
          "radius-xl": "12px",
          "radius-2xl": "16px",
          "font-display": "var(--font-display-role)"
        },
        "light": {
          "background": "oklch(0.9786 0.0026 106.45)",
          "foreground": "oklch(0.1448 0 0)",
          "card": "oklch(1.0000 0 0)",
          "card-foreground": "oklch(0.1448 0 0)",
          "popover": "oklch(1.0000 0 0)",
          "popover-foreground": "oklch(0.1448 0 0)",
          "primary": "oklch(0.4986 0.0881 214.99)",
          "primary-foreground": "oklch(1.0000 0 0)",
          "secondary": "oklch(0.9523 0.0029 84.56)",
          "secondary-foreground": "oklch(0.1448 0 0)",
          "muted": "oklch(0.9523 0.0029 84.56)",
          "muted-foreground": "oklch(0.5278 0 0)",
          "accent": "oklch(0.9523 0.0029 84.56)",
          "accent-foreground": "oklch(0.1448 0 0)",
          "destructive": "oklch(0.5308 0.1857 20.87)",
          "border": "oklch(0.6264 0.0015 106.44)",
          "input": "oklch(0.6264 0.0015 106.44)",
          "ring": "oklch(0.4986 0.0881 214.99)",
          "chart-1": "oklch(0.4986 0.0881 214.99)",
          "chart-2": "oklch(0.4983 0.0820 287.44)",
          "chart-3": "oklch(0.4978 0.0818 358.39)",
          "chart-4": "oklch(0.4980 0.0813 70.33)",
          "chart-5": "oklch(0.4994 0.0812 143.21)",
          "sidebar": "oklch(1.0000 0 0)",
          "sidebar-foreground": "oklch(0.1448 0 0)",
          "sidebar-primary": "oklch(0.4986 0.0881 214.99)",
          "sidebar-primary-foreground": "oklch(1.0000 0 0)",
          "sidebar-accent": "oklch(0.9523 0.0029 84.56)",
          "sidebar-accent-foreground": "oklch(0.1448 0 0)",
          "sidebar-border": "oklch(0.6264 0.0015 106.44)",
          "sidebar-ring": "oklch(0.4986 0.0881 214.99)",
          "brand-accent-deep": "oklch(0.4986 0.0881 214.99)",
          "brand-emphasis": "oklch(0.5519 0.1759 39.26)",
          "brand-cta": "oklch(0.5519 0.1759 39.26)",
          "brand-cta-foreground": "oklch(1.0000 0 0)",
          "brand-cta-outline-foreground": "oklch(0.5519 0.1759 39.26)"
        },
        "dark": {
          "background": "oklch(0.1260 0.0054 226.05)",
          "foreground": "oklch(1.0000 0 0)",
          "card": "oklch(0.1733 0.0125 237.64)",
          "card-foreground": "oklch(1.0000 0 0)",
          "popover": "oklch(0.1260 0.0054 226.05)",
          "popover-foreground": "oklch(1.0000 0 0)",
          "primary": "oklch(0.7665 0.1293 215.73)",
          "primary-foreground": "oklch(0.0000 0 0)",
          "secondary": "oklch(0.2110 0.0188 235.18)",
          "secondary-foreground": "oklch(1.0000 0 0)",
          "muted": "oklch(0.2110 0.0188 235.18)",
          "muted-foreground": "oklch(0.6862 0 0)",
          "accent": "oklch(0.2514 0.0245 234.11)",
          "accent-foreground": "oklch(1.0000 0 0)",
          "destructive": "oklch(0.6437 0.1882 18.59)",
          "border": "oklch(0.2686 0 0)",
          "input": "oklch(0.2686 0 0)",
          "ring": "oklch(0.7665 0.1293 215.73)",
          "chart-1": "oklch(0.6797 0.1205 215.67)",
          "chart-2": "oklch(0.6806 0.1180 287.93)",
          "chart-3": "oklch(0.6792 0.1197 359.22)",
          "chart-4": "oklch(0.6796 0.1185 71.90)",
          "chart-5": "oklch(0.6796 0.1189 143.50)",
          "sidebar": "oklch(0.1260 0.0054 226.05)",
          "sidebar-foreground": "oklch(1.0000 0 0)",
          "sidebar-primary": "oklch(0.7665 0.1293 215.73)",
          "sidebar-primary-foreground": "oklch(0.0000 0 0)",
          "sidebar-accent": "oklch(0.2514 0.0245 234.11)",
          "sidebar-accent-foreground": "oklch(1.0000 0 0)",
          "sidebar-border": "oklch(0.2686 0 0)",
          "sidebar-ring": "oklch(0.7665 0.1293 215.73)",
          "brand-accent-deep": "oklch(0.4986 0.0881 214.99)",
          "brand-emphasis": "oklch(0.6738 0.2190 38.33)",
          "brand-cta": "oklch(0.5519 0.1759 39.26)",
          "brand-cta-foreground": "oklch(1.0000 0 0)",
          "brand-cta-outline-foreground": "oklch(1.0000 0 0)"
        }
      },
      "css": {
        "@layer base": {
          ":focus-visible": {
            "outline": "2px solid var(--ring)",
            "outline-offset": "2px"
          }
        }
      },
      "docs": "Dark-first. Set defaultTheme=\"dark\" in your theme provider. The bright accent is never text on a light surface; the light block already substitutes the accessible variant. The parent kit's color-roles.json names approved identity combinations and measured interface cues with non-color signals."
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "capture-row",
      "type": "registry:ui",
      "title": "fragcap Capture Row",
      "description": "A static data row for fragcap surfaces. Place it in a suitable grid or table.",
      "files": [
        {
          "path": "components/fragcap/capture-row.tsx",
          "target": "@components/fragcap/capture-row.tsx",
          "type": "registry:ui",
          "content": "import type { ReactNode } from \"react\";\n\nexport type CaptureRowProps = {\n  \"timestamp\": ReactNode;\n  \"process\": ReactNode;\n  \"endpoint\": ReactNode;\n  \"protocol\": ReactNode;\n  \"bytes\": ReactNode;\n  \"state\": ReactNode;\n};\n\nexport function CaptureRow(props: CaptureRowProps) {\n  return <div className=\"fr-capture-row\" role=\"row\"><div className=\"fr-capture-row__timestamp\" role=\"cell\">{props[\"timestamp\"]}</div><div className=\"fr-capture-row__process\" role=\"cell\">{props[\"process\"]}</div><div className=\"fr-capture-row__endpoint\" role=\"cell\">{props[\"endpoint\"]}</div><div className=\"fr-capture-row__protocol\" role=\"cell\">{props[\"protocol\"]}</div><div className=\"fr-capture-row__bytes\" role=\"cell\">{props[\"bytes\"]}</div><div className=\"fr-capture-row__state\" role=\"cell\">{props[\"state\"]}</div></div>;\n}\n"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "packet-row",
      "type": "registry:ui",
      "title": "fragcap Packet Row",
      "description": "A static data row for fragcap surfaces. Place it in a suitable grid or table.",
      "files": [
        {
          "path": "components/fragcap/packet-row.tsx",
          "target": "@components/fragcap/packet-row.tsx",
          "type": "registry:ui",
          "content": "import type { ReactNode } from \"react\";\n\nexport type PacketRowProps = {\n  \"direction\": ReactNode;\n  \"source\": ReactNode;\n  \"destination\": ReactNode;\n  \"length\": ReactNode;\n  \"decode\": ReactNode;\n};\n\nexport function PacketRow(props: PacketRowProps) {\n  return <div className=\"fr-packet-row\" role=\"row\"><div className=\"fr-packet-row__direction\" role=\"cell\">{props[\"direction\"]}</div><div className=\"fr-packet-row__source\" role=\"cell\">{props[\"source\"]}</div><div className=\"fr-packet-row__destination\" role=\"cell\">{props[\"destination\"]}</div><div className=\"fr-packet-row__length\" role=\"cell\">{props[\"length\"]}</div><div className=\"fr-packet-row__decode\" role=\"cell\">{props[\"decode\"]}</div></div>;\n}\n"
        }
      ]
    },
    {
      "$schema": "https://ui.shadcn.com/schema/registry-item.json",
      "name": "session-row",
      "type": "registry:ui",
      "title": "fragcap Session Row",
      "description": "A static data row for fragcap surfaces. Place it in a suitable grid or table.",
      "files": [
        {
          "path": "components/fragcap/session-row.tsx",
          "target": "@components/fragcap/session-row.tsx",
          "type": "registry:ui",
          "content": "import type { ReactNode } from \"react\";\n\nexport type SessionRowProps = {\n  \"interface\": ReactNode;\n  \"filter\": ReactNode;\n  \"started_at\": ReactNode;\n  \"packet_count\": ReactNode;\n  \"file\": ReactNode;\n};\n\nexport function SessionRow(props: SessionRowProps) {\n  return <div className=\"fr-session-row\" role=\"row\"><div className=\"fr-session-row__interface\" role=\"cell\">{props[\"interface\"]}</div><div className=\"fr-session-row__filter\" role=\"cell\">{props[\"filter\"]}</div><div className=\"fr-session-row__started_at\" role=\"cell\">{props[\"started_at\"]}</div><div className=\"fr-session-row__packet_count\" role=\"cell\">{props[\"packet_count\"]}</div><div className=\"fr-session-row__file\" role=\"cell\">{props[\"file\"]}</div></div>;\n}\n"
        }
      ]
    }
  ]
}
