{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "progress", "title": "Integrated Progress", "description": "Thin labeled percentage Progress wrapper with SSR-stable naming, primitive-derived determinate and indeterminate states, visible value formatting, and explicit root, label, and value class ownership.", "registryDependencies": [ "progress" ], "files": [ { "path": "registry/ui/progress.tsx", "content": "\"use client\";\n\nimport type { ClassValue } from \"clsx\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport {\n Progress as ProgressControl,\n ProgressLabel,\n ProgressValue,\n} from \"@/components/ui/progress\";\nimport { cn } from \"@/lib/utils\";\n\ntype ProgressControlProps = ComponentProps;\n\nconst WHITESPACE_PATTERN = /\\s+/;\n\nconst hasNode = (node: ReactNode): boolean =>\n node !== null && node !== undefined && typeof node !== \"boolean\";\n\nconst mergeIds = (...values: (string | undefined)[]): string | undefined => {\n const tokens = values\n .flatMap((value) => value?.split(WHITESPACE_PATTERN) ?? [])\n .filter(Boolean);\n const merged = [...new Set(tokens)].join(\" \");\n\n return merged || undefined;\n};\n\nexport interface ProgressProps\n extends Omit<\n ProgressControlProps,\n | \"aria-valuemax\"\n | \"aria-valuemin\"\n | \"aria-valuenow\"\n | \"children\"\n | \"className\"\n | \"dangerouslySetInnerHTML\"\n | \"format\"\n | \"getAriaValueText\"\n | \"locale\"\n | \"max\"\n | \"min\"\n | \"render\"\n | \"role\"\n | \"value\"\n > {\n /** Compose owns the progress range derived from value. */\n \"aria-valuemax\"?: never;\n /** Compose owns the progress range derived from value. */\n \"aria-valuemin\"?: never;\n /** Compose owns the numeric value derived from value. */\n \"aria-valuenow\"?: never;\n /** Class override for the progressbar root. */\n className?: ClassValue;\n /** Raw HTML conflicts with Compose-owned descendants. */\n dangerouslySetInnerHTML?: never;\n /** Compose owns primitive-derived completion state. */\n \"data-complete\"?: never;\n /** Compose owns primitive-derived indeterminate state. */\n \"data-indeterminate\"?: never;\n /** Compose owns primitive-derived progressing state. */\n \"data-progressing\"?: never;\n /** Compose owns the primitive root slot marker. */\n \"data-slot\"?: never;\n /** Required caller-owned content that names the progressbar. */\n label: ReactNode;\n /** Class override for the label content. */\n labelClassName?: ClassValue;\n /** Whether to render the primitive-formatted visual value. @default true */\n showValue?: boolean;\n /**\n * Supported values are finite percentages from 0 to 100, or null.\n * Invalid values are not clamped, coerced, or validated; their behavior is\n * unspecified.\n */\n value: number | null;\n /** Class override for the visual value. */\n valueClassName?: ClassValue;\n}\n\nexport const Progress = ({\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-valuetext\": ariaValueText,\n className,\n \"data-complete\": _ignoredComplete,\n \"data-indeterminate\": _ignoredIndeterminate,\n \"data-progressing\": _ignoredProgressing,\n dangerouslySetInnerHTML: _ignoredDangerouslySetInnerHTML,\n label,\n labelClassName,\n showValue = true,\n value,\n valueClassName,\n ...rootProps\n}: ProgressProps) => {\n const autoId = useId();\n const labelId = `${autoId}-label`;\n const hasLabel = hasNode(label);\n\n return (\n \n {hasLabel ? (\n \n {label}\n \n ) : null}\n {showValue ? : null}\n \n );\n};\n\nexport default Progress;\n", "type": "registry:component", "target": "components/easy/progress.tsx" } ], "type": "registry:component" }