{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "progress",
  "title": "Progress",
  "description": "Displays an indicator showing the completion progress of a task",
  "dependencies": [
    "@radix-ui/react-progress"
  ],
  "registryDependencies": [
    "@boldkit/utils",
    "@boldkit/motion"
  ],
  "files": [
    {
      "path": "registry/default/ui/progress.tsx",
      "content": "import * as React from 'react'\nimport * as ProgressPrimitive from '@radix-ui/react-progress'\nimport { cn } from '@/lib/utils'\n\ntype ProgressVariant =\n  /** Continuous fill. The pre-v3.5 default. */\n  | 'smooth'\n  /** Fill snaps forward in ten discrete notches. */\n  | 'stepped'\n  /** Indeterminate — a block travelling the track. Ignores `value`. */\n  | 'marquee'\n\nexport interface ProgressProps\n  extends React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> {\n  variant?: ProgressVariant\n}\n\nconst Progress = React.forwardRef<\n  React.ElementRef<typeof ProgressPrimitive.Root>,\n  ProgressProps\n>(({ className, value, variant = 'smooth', max = 100, ...props }, ref) => {\n  const indeterminate = variant === 'marquee'\n  // Clamp against `max`, not a hard 100 — otherwise a max of 200 renders a full\n  // bar while aria-valuenow reports half. Percent drives the fill; the raw\n  // clamped value is what Radix exposes to AT.\n  const safeMax = max > 0 ? max : 100\n  const clampedValue = Math.max(0, Math.min(safeMax, value ?? 0))\n  const percent = (clampedValue / safeMax) * 100\n  // Radix reads null as indeterminate and drops aria-valuenow. Pass the clamped\n  // value so an out-of-range `value` can't trip Radix's range warning, and keep\n  // an omitted value indeterminate the way it was before v3.5.\n  const ariaValue = indeterminate || value == null ? null : clampedValue\n  return (\n    <ProgressPrimitive.Root\n      ref={ref}\n      value={ariaValue}\n      max={safeMax}\n      className={cn(\n        'relative h-5 w-full overflow-hidden border-3 border-foreground bg-muted shadow-[4px_4px_0px_hsl(var(--shadow-color))]',\n        className\n      )}\n      {...props}\n    >\n      <ProgressPrimitive.Indicator\n        className={cn(\n          'h-full w-full flex-1 bg-primary transition duration-500 ease-out',\n          variant === 'stepped' && 'bk-progress-stepped',\n          indeterminate && 'bk-progress-marquee'\n        )}\n        style={\n          indeterminate ? undefined : { transform: `translateX(-${100 - percent}%)` }\n        }\n      />\n    </ProgressPrimitive.Root>\n  )\n})\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\nexport type { ProgressVariant }\n",
      "type": "registry:ui",
      "target": "components/ui/progress.tsx"
    }
  ],
  "type": "registry:ui"
}