{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "terminal-ui",
  "dependencies": [],
  "devDependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "./registry/components/terminal-ui.tsx",
      "content": "'use client';\nimport { ShimmerLoader } from '@/components/ui/shimmer-loader';\nimport { TypeWritter } from '@/components/ui/typing-writter';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\ntype Phase =\n  | { type: 'divider' }\n  | {\n      type: 'bar';\n      labels: string[];\n      icons: string[];\n      duration: number;\n      tokenTarget?: number; // omit -> no token counter\n      showPercent?: boolean; // default true\n    }\n  | { type: 'lines'; lines: string[] }\n  | { type: 'message'; text: string };\n\nexport interface IntroSequenceProps {\n  onComplete?: () => void;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\ninterface RenderedItem {\n  id: string;\n  phase: Phase;\n  lineIndex?: number;\n}\n// ── divider ──────────────────────────────────────────────────────────────────\n\nfunction Divider() {\n  return (\n    <div\n      style={{\n        color: 'rgba(210,190,255,0.2)',\n        fontSize: 13,\n        letterSpacing: '1px',\n        fontFamily: \"'Cascadia Code', 'Fira Code', 'Consolas', monospace\",\n      }}\n    >\n      {'─'.repeat(44)}\n    </div>\n  );\n}\n\n// ── sequence runner ──────────────────────────────────────────────────────────\n\nconst SEQUENCE: Phase[] = [\n  { type: 'divider' },\n  {\n    type: 'bar',\n    labels: ['Scanning…', 'Analysing…', 'Detecting…', 'Profiling…'],\n    icons: ['✦', '◆', '✶', '❋', '✸'],\n    duration: 3000,\n    tokenTarget: 0.6, // shows \"0.6k\" counter\n    showPercent: true,\n  },\n  {\n    type: 'lines',\n    lines: ['New Role Detected', 'New Team Detected', 'New Challenges'],\n  },\n  { type: 'divider' },\n  {\n    type: 'bar',\n    labels: ['Booting…', 'Loading…', 'Preparing…', 'Initializing…'],\n    icons: ['✦', '◆', '✶', '❋', '✸'],\n    duration: 3000,\n    showPercent: false, // no percent, no tokens — clean spinner\n  },\n  { type: 'message', text: \"Let's build something great 🚀\" },\n  { type: 'divider' },\n  {\n    type: 'bar',\n    labels: ['Syncing…', 'Configuring…', 'Setting up…', 'Onboarding…'],\n    icons: ['◈', '◉', '⬡', '⬢', '◍'],\n    duration: 3000,\n    tokenTarget: 0.8, // tokens but no percent\n    showPercent: false,\n  },\n];\n\nexport function NewIntroSequence({ onComplete, className, style }: IntroSequenceProps) {\n  const [items, setItems] = useState<RenderedItem[]>([]);\n  const phaseRef = useRef(0);\n  const lineRef = useRef(0);\n  const completedRef = useRef(false);\n\n  const advance = useCallback(() => {\n    const phase = SEQUENCE[phaseRef.current];\n    if (!phase) {\n      if (!completedRef.current) {\n        completedRef.current = true;\n        onComplete?.();\n      }\n      return;\n    }\n\n    if (phase.type === 'divider') {\n      setItems((prev) => [...prev, { id: `divider-${phaseRef.current}`, phase }]);\n      phaseRef.current++;\n      setTimeout(advance, 80);\n      return;\n    }\n\n    if (phase.type === 'bar') {\n      setItems((prev) => [...prev, { id: `bar-${phaseRef.current}`, phase }]);\n      phaseRef.current++;\n      return;\n    }\n\n    if (phase.type === 'lines') {\n      lineRef.current = 0;\n      phaseRef.current++;\n      typeNextLine(phase.lines);\n      return;\n    }\n\n    if (phase.type === 'message') {\n      setItems((prev) => [...prev, { id: `msg-${phaseRef.current}`, phase }]);\n      phaseRef.current++;\n      setTimeout(advance, 400);\n      return;\n    }\n  }, [onComplete]);\n\n  function typeNextLine(lines: string[]) {\n    const idx = lineRef.current;\n    if (idx >= lines.length) {\n      setTimeout(advance, 200);\n      return;\n    }\n    setItems((prev) => [\n      ...prev,\n      {\n        id: `line-${phaseRef.current - 1}-${idx}`,\n        phase: { type: 'lines', lines },\n        lineIndex: idx,\n      },\n    ]);\n    lineRef.current++;\n  }\n\n  useEffect(() => {\n    setTimeout(advance, 300);\n  }, []);\n\n  return (\n    <>\n      <style>{`@keyframes blink { 0%,100%{opacity:1} 50%{opacity:0} }`}</style>\n      <div\n        className={className}\n        style={{\n          background: '#0f0e17',\n          padding: '24px 28px',\n          display: 'flex',\n          flexDirection: 'column',\n          gap: 10,\n          fontFamily: \"'Cascadia Code', 'Fira Code', 'Consolas', monospace\",\n          minWidth: 520,\n          ...style,\n        }}\n      >\n        {items.map((item) => {\n          const { id, phase } = item;\n\n          if (phase.type === 'divider') return <Divider key={id} />;\n\n          if (phase.type === 'bar') {\n            return (\n              <ShimmerLoader\n                key={id}\n                labels={phase.labels}\n                icons={phase.icons}\n                duration={phase.duration}\n                tokenTarget={phase.tokenTarget}\n                showPercent={phase.showPercent}\n                onComplete={() => {\n                  setTimeout(advance, 150);\n                }}\n              />\n            );\n          }\n\n          if (phase.type === 'lines' && item.lineIndex !== undefined) {\n            const isLast = item.lineIndex === phase.lines.length - 1;\n            return (\n              <TypeWritter\n                key={id}\n                text={phase.lines[item.lineIndex]}\n                onComplete={() => {\n                  setTimeout(() => typeNextLine(phase.lines), isLast ? 0 : 200);\n                }}\n              />\n            );\n          }\n\n          if (phase.type === 'message') {\n            return (\n              <div\n                key={id}\n                style={{\n                  color: 'rgb(160,130,255)',\n                  fontWeight: 700,\n                  fontSize: 14,\n                  paddingLeft: 4,\n                }}\n              >\n                {phase.text}\n              </div>\n            );\n          }\n\n          return null;\n        })}\n      </div>\n    </>\n  );\n}\n",
      "type": "registry:component"
    }
  ],
  "type": "registry:component"
}