{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "progress",
  "type": "registry:ui",
  "dependencies": [
    "class-variance-authority"
  ],
  "registryDependencies": [
    "https://ui.getlyse.com/r/lyse-tokens.json"
  ],
  "files": [
    {
      "path": "registry/new-york/ui/progress/progress.tsx",
      "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport \"./progress.css\"\n\nconst progressItemVariants = cva(\n  \"progress-item-base flex-[1_0_0] min-w-0\",\n  {\n    variants: {\n      size: {\n        sm: \"h-1.5\",\n        md: \"h-2\",\n      },\n      position: {\n        left: \"\",\n        middle: \"\",\n        right: \"\",\n      },\n    },\n    compoundVariants: [\n      { size: \"sm\", position: \"left\", className: \"rounded-l-[var(--layout-radius-xs)]\" },\n      { size: \"sm\", position: \"right\", className: \"rounded-r-[var(--layout-radius-xs)]\" },\n      { size: \"md\", position: \"left\", className: \"rounded-l-[var(--layout-radius-sm)]\" },\n      { size: \"md\", position: \"right\", className: \"rounded-r-[var(--layout-radius-sm)]\" },\n    ],\n    defaultVariants: {\n      size: \"md\",\n      position: \"middle\",\n    },\n  }\n)\n\nfunction ProgressItem({\n  className,\n  size,\n  position,\n  active = false,\n  ...props\n}: Omit<React.ComponentProps<\"div\">, \"active\"> &\n  VariantProps<typeof progressItemVariants> & {\n    active?: boolean\n  }) {\n  return (\n    <div\n      data-slot=\"progress-item\"\n      className={cn(\n        progressItemVariants({ size, position, className }),\n        active ? \"progress-item-active\" : \"progress-item-inactive\"\n      )}\n      {...props}\n    />\n  )\n}\n\nconst progressIndicatorVariants = cva(\n  \"flex w-full\",\n  {\n    variants: {\n      labelPosition: {\n        none: \"items-center\",\n        right: \"items-center gap-[var(--layout-gap-lg)]\",\n        bottom: \"flex-col items-end gap-[var(--layout-gap-md)]\",\n      },\n    },\n    defaultVariants: {\n      labelPosition: \"none\",\n    },\n  }\n)\n\nfunction ProgressIndicator({\n  className,\n  value = 0,\n  steps = 5,\n  size = \"md\",\n  labelPosition = \"none\",\n  label = \"Progress\",\n  ...props\n}: Omit<React.ComponentProps<\"div\">, \"value\"> &\n  VariantProps<typeof progressIndicatorVariants> & {\n    value?: number\n    steps?: number\n    size?: \"sm\" | \"md\"\n    label?: string\n  }) {\n  const clampedValue = Math.max(0, Math.min(100, value))\n  const safeSteps = Math.max(1, steps)\n  const activeSteps = Math.round((clampedValue / 100) * safeSteps)\n\n  const getPosition = (index: number): \"left\" | \"middle\" | \"right\" => {\n    if (activeSteps === 0 || activeSteps === safeSteps) return \"middle\"\n    if (index === activeSteps - 1) return \"right\"\n    if (index === activeSteps) return \"left\"\n    return \"middle\"\n  }\n\n  return (\n    <div\n      data-slot=\"progress-indicator\"\n      className={cn(progressIndicatorVariants({ labelPosition, className }))}\n      {...props}\n    >\n      <div\n        className={cn(\n          \"progress-track flex items-center overflow-hidden\",\n          size === \"sm\"\n            ? \"rounded-[var(--layout-radius-xs)]\"\n            : \"rounded-[var(--layout-radius-sm)]\",\n          labelPosition === \"bottom\" ? \"shrink-0 w-full\" : \"flex-1 min-w-0\"\n        )}\n        role=\"progressbar\"\n        aria-valuenow={clampedValue}\n        aria-valuemin={0}\n        aria-valuemax={100}\n        aria-label={label}\n      >\n        {Array.from({ length: safeSteps }, (_, i) => (\n          <ProgressItem\n            key={i}\n            size={size}\n            position={getPosition(i)}\n            active={i < activeSteps}\n          />\n        ))}\n      </div>\n      {labelPosition !== \"none\" && (\n        <p className=\"progress-label text-content-note font-accent shrink-0 whitespace-nowrap text-right\">\n          {clampedValue}%\n        </p>\n      )}\n    </div>\n  )\n}\n\nexport {\n  ProgressItem,\n  ProgressIndicator,\n  progressItemVariants,\n  progressIndicatorVariants,\n}\n",
      "type": "registry:ui"
    },
    {
      "path": "registry/new-york/ui/progress/progress.css",
      "content": "/* ================================================================\n * PROGRESS — Progress Item & Progress Indicator\n * Structure (flex, height, radius) lives in progress.tsx via cva.\n * Theming (colors, transitions) lives here via tokens.\n * ================================================================ */\n\n/* --------------------------------\n * Progress Item — transition\n * -------------------------------- */\n@media (prefers-reduced-motion: no-preference) {\n  .progress-item-base {\n    transition: background-color 150ms ease;\n  }\n}\n\n/* --------------------------------\n * Progress Item — active / inactive colors\n * -------------------------------- */\n.progress-item-active {\n  background-color: var(--background-brand-strong-default);\n}\n\n.progress-item-inactive {\n  background-color: var(--background-neutral-medium-default);\n}\n\n/* --------------------------------\n * Progress Track — background fallback\n * -------------------------------- */\n.progress-track {\n  background-color: var(--background-neutral-medium-default);\n}\n\n/* --------------------------------\n * Progress Label — text color\n * Typography (size, weight) set via Tailwind utilities in TSX.\n * -------------------------------- */\n.progress-label {\n  color: var(--text-base-bolder);\n}\n",
      "type": "registry:ui"
    }
  ]
}