{
  "name": "skeleton",
  "type": "registry:ui",
  "title": "Skeleton",
  "description": "A flat fill breathing opacity (1 → 0.55, 1.8s) — no shimmer wash. Spinners are banned outside buttons.",
  "dependencies": [
    "@candlelight-ds/tokens",
    "clsx",
    "tailwind-merge"
  ],
  "files": [
    {
      "path": "components/ui/Skeleton.tsx",
      "type": "registry:ui",
      "content": "'use client'\n\n/**\n * Skeleton — a flat fill breathing opacity (1 → 0.55, 1.8s). No shimmer\n * wash. Spinners are banned outside buttons; a loading area shows its\n * future shape instead. The loop dies under prefers-reduced-motion\n * (the .skeleton class handles it).\n *\n * Use when: a pane is fetching content with a known rough shape.\n * Don't use when: an action button is pending (use its disabled state).\n */\n\nimport { cn } from '@/lib/utils'\n\nexport function Skeleton({ className }: { className?: string }) {\n  return <div aria-hidden className={cn('skeleton rounded-sm', className)} />\n}\n\ninterface SkeletonRowsProps {\n  rows?: number\n  /** Row height in px (bench density default). */\n  height?: number\n  /** Copy (§9) — the status word reaches your copy module. */\n  label?: string\n  className?: string\n}\n\nexport function SkeletonRows({ rows = 5, height = 44, label = 'Loading', className }: SkeletonRowsProps) {\n  return (\n    <div role=\"status\" aria-label={label} className={cn('space-y-2', className)}>\n      {Array.from({ length: rows }, (_, index) => (\n        <div key={index} style={{ height }} className=\"skeleton w-full rounded-sm\" />\n      ))}\n    </div>\n  )\n}\n",
      "target": "components/ui/Skeleton.tsx"
    }
  ],
  "meta": {
    "candlelight": {
      "category": "primitive",
      "gRules": [
        "G5"
      ],
      "useWhen": "A pane is fetching content with a known rough shape.",
      "dontUseWhen": "An action button is pending — use its disabled state.",
      "states": [
        "breathing",
        "static under reduced motion"
      ],
      "keyboard": [],
      "acceptanceTests": [
        "The breathe loop dies under prefers-reduced-motion.",
        "SkeletonRows carries role=status aria-label for screen readers."
      ]
    }
  },
  "registryDependencies": [
    "utils"
  ]
}