{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "progress-steps", "title": "Progress Steps", "description": "Multi-step pipeline with sequentially activating nodes and filling lines.", "dependencies": [ "remotion" ], "files": [ { "path": "registry/remocn/progress-steps/index.tsx", "content": "\"use client\";\n\nimport {\n interpolate,\n interpolateColors,\n spring,\n useCurrentFrame,\n useVideoConfig,\n} from \"remotion\";\n\nexport interface ProgressStepsProps {\n steps?: Array<{ label: string }>;\n orientation?: \"horizontal\" | \"vertical\";\n activeColor?: string;\n inactiveColor?: string;\n background?: string;\n textColor?: string;\n stepDuration?: number;\n speed?: number;\n className?: string;\n}\n\nexport function ProgressSteps({\n steps = [{ label: \"Connect\" }, { label: \"Process\" }, { label: \"Deploy\" }],\n orientation = \"horizontal\",\n activeColor = \"#22c55e\",\n inactiveColor = \"#27272a\",\n background = \"#0a0a0a\",\n textColor = \"white\",\n stepDuration = 30,\n speed = 1,\n className,\n}: ProgressStepsProps) {\n const frame = useCurrentFrame() * speed;\n const { fps } = useVideoConfig();\n\n const isHorizontal = orientation === \"horizontal\";\n const trackLength = isHorizontal ? 920 : 520;\n const segmentLength = trackLength / Math.max(steps.length - 1, 1);\n const nodeRadius = 22;\n\n return (\n \n \n {/* SVG layer for connecting lines */}\n \n {steps.slice(0, -1).map((_, i) => {\n const lineStart = (i + 1) * stepDuration;\n const fillProgress = interpolate(\n frame,\n [lineStart, lineStart + stepDuration],\n [segmentLength, 0],\n { extrapolateLeft: \"clamp\", extrapolateRight: \"clamp\" },\n );\n return (\n \n );\n })}\n {/* Background track */}\n {steps.slice(0, -1).map((_, i) => (\n \n ))}\n \n\n {steps.map((step, i) => {\n const activateAt = i * stepDuration;\n const localFrame = frame - activateAt;\n const popScale = spring({\n frame: localFrame,\n fps,\n config: { damping: 10, stiffness: 180, mass: 0.6 },\n });\n const scale = interpolate(popScale, [0, 1], [0.8, 1]);\n const fill = interpolateColors(\n frame,\n [activateAt, activateAt + 8],\n [inactiveColor, activeColor],\n );\n const showCheck = interpolate(\n frame,\n [activateAt + 6, activateAt + 14],\n [0, 1],\n { extrapolateLeft: \"clamp\", extrapolateRight: \"clamp\" },\n );\n\n return (\n \n \n \n \n \n \n \n {step.label}\n \n \n );\n })}\n \n \n );\n}\n", "type": "registry:component", "target": "components/remocn/progress-steps.tsx" } ], "type": "registry:component" }