{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "project-roadmap",
  "title": "Project Roadmap",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/project-roadmap/ProjectRoadmap.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { Plus, Search, Download } from 'lucide-react'\nimport { Button } from '@/components/ui/button'\nimport { Input, InputGroup, InputGroupAddon } from '@/components/ui/input'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport {\n  Gantt,\n  GanttHeader,\n  GanttTree,\n  GanttTimeline,\n  type GanttTask,\n  type GanttScale,\n  type GanttTaskStatus,\n  type GanttTaskPriority,\n} from '@/components/ui/gantt'\nimport { RoadmapMetrics } from './RoadmapMetrics'\nimport { RoadmapTaskDetail } from './RoadmapTaskDetail'\nimport { RoadmapAddTaskDialog } from './RoadmapAddTaskDialog'\n\nexport interface ProjectRoadmapProps {\n  initialTasks?: GanttTask[]\n  title?: string\n  description?: string\n}\n\nconst defaultTasks: GanttTask[] = [\n  {\n    id: 'task-1',\n    name: 'System Architecture & Database Schema',\n    startDate: '2026-08-01',\n    endDate: '2026-08-08',\n    progress: 100,\n    status: 'done',\n    priority: 'high',\n    assignee: { name: 'Sarah Connor', initials: 'SC' },\n  },\n  {\n    id: 'task-2',\n    name: 'Auth, RBAC & Multi-Tenant Session Engine',\n    startDate: '2026-08-06',\n    endDate: '2026-08-16',\n    progress: 85,\n    status: 'in-progress',\n    priority: 'urgent',\n    assignee: { name: 'Marcus Rivera', initials: 'MR' },\n  },\n  {\n    id: 'task-3',\n    name: 'Real-time WebSocket Notification Bus',\n    startDate: '2026-08-12',\n    endDate: '2026-08-22',\n    progress: 50,\n    status: 'in-progress',\n    priority: 'high',\n    assignee: { name: 'Priya Nair', initials: 'PN' },\n  },\n  {\n    id: 'task-4',\n    name: 'Alpha Core API Release Milestone',\n    startDate: '2026-08-23',\n    endDate: '2026-08-23',\n    isMilestone: true,\n    status: 'todo',\n    priority: 'urgent',\n  },\n  {\n    id: 'task-5',\n    name: 'Stripe Billing & Invoicing Integration',\n    startDate: '2026-08-24',\n    endDate: '2026-09-04',\n    progress: 15,\n    status: 'todo',\n    priority: 'medium',\n    assignee: { name: 'Sundar Krishnan', initials: 'SK' },\n  },\n  {\n    id: 'task-6',\n    name: 'End-to-End Playwright Automated Testing',\n    startDate: '2026-08-28',\n    endDate: '2026-09-08',\n    progress: 0,\n    status: 'todo',\n    priority: 'low',\n    assignee: { name: 'Diane Cho', initials: 'DC' },\n  },\n  {\n    id: 'task-7',\n    name: 'Production Cloudflare Pages Deployment',\n    startDate: '2026-09-10',\n    endDate: '2026-09-10',\n    isMilestone: true,\n    status: 'todo',\n  },\n]\n\nexport function ProjectRoadmap({\n  initialTasks = defaultTasks,\n  title = 'Engineering Q3 Deliverables',\n  description = 'Track roadmap work breakdown, sprint milestones, and cross-team dependencies.',\n}: ProjectRoadmapProps) {\n  const [tasks, setTasks] = React.useState<GanttTask[]>([...initialTasks])\n  const [searchQuery, setSearchQuery] = React.useState('')\n  const [statusFilter, setStatusFilter] = React.useState('all')\n  const [assigneeFilter, setAssigneeFilter] = React.useState('all')\n  const [scale, setScale] = React.useState<GanttScale>('day')\n\n  const [selectedTask, setSelectedTask] = React.useState<GanttTask | null>(null)\n  const [sheetOpen, setSheetOpen] = React.useState(false)\n  const [addDialogOpen, setAddDialogOpen] = React.useState(false)\n\n  const filteredTasks = React.useMemo(() => {\n    return tasks.filter((t) => {\n      const matchesSearch = !searchQuery || t.name.toLowerCase().includes(searchQuery.toLowerCase())\n      const matchesStatus = statusFilter === 'all' || t.status === statusFilter\n      const matchesAssignee = assigneeFilter === 'all' || t.assignee?.name === assigneeFilter\n      return matchesSearch && matchesStatus && matchesAssignee\n    })\n  }, [tasks, searchQuery, statusFilter, assigneeFilter])\n\n  const handleTaskClick = (task: GanttTask) => {\n    setSelectedTask(task)\n    setSheetOpen(true)\n  }\n\n  const handleAddTask = (newTask: GanttTask) => {\n    setTasks((prev) => [...prev, newTask])\n  }\n\n  const handleStatusChange = (task: GanttTask, status: GanttTaskStatus) => {\n    setTasks((prev) =>\n      prev.map((t) => (t.id === task.id ? { ...t, status, progress: status === 'done' ? 100 : t.progress } : t)),\n    )\n  }\n\n  const handlePriorityChange = (task: GanttTask, priority: GanttTaskPriority) => {\n    setTasks((prev) => prev.map((t) => (t.id === task.id ? { ...t, priority } : t)))\n  }\n\n  const handleDuplicate = (task: GanttTask) => {\n    const cloned: GanttTask = {\n      ...task,\n      id: `task-${Date.now()}`,\n      name: `${task.name} (Copy)`,\n    }\n    setTasks((prev) => [...prev, cloned])\n  }\n\n  const handleDelete = (task: GanttTask) => {\n    setTasks((prev) => prev.filter((t) => t.id !== task.id))\n  }\n\n  return (\n    <div data-uipkge=\"\" data-slot=\"project-roadmap\" className=\"space-y-6\">\n      <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n        <div>\n          <h2 className=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">{title}</h2>\n          <p className=\"text-muted-foreground mt-0.5 text-sm\">{description}</p>\n        </div>\n\n        <div className=\"flex items-center gap-2\">\n          <Button variant=\"outline\" size=\"sm\">\n            <Download className=\"mr-1 size-3.5\" />\n            Export\n          </Button>\n          <Button size=\"sm\" onClick={() => setAddDialogOpen(true)}>\n            <Plus className=\"mr-1 size-3.5\" />\n            Add Task\n          </Button>\n        </div>\n      </div>\n\n      <RoadmapMetrics tasks={tasks} />\n\n      <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n        <div className=\"flex max-w-lg flex-1 flex-wrap items-center gap-2\">\n          <InputGroup size=\"small\" className=\"w-56\">\n            <InputGroupAddon>\n              <Search className=\"size-3.5\" />\n            </InputGroupAddon>\n            <Input\n              value={searchQuery}\n              onChange={(e) => setSearchQuery(e.target.value)}\n              placeholder=\"Filter tasks by name...\"\n            />\n          </InputGroup>\n\n          <Select value={statusFilter} onValueChange={setStatusFilter}>\n            <SelectTrigger className=\"h-8 w-32 text-xs\">\n              <SelectValue placeholder=\"All Status\" />\n            </SelectTrigger>\n            <SelectContent>\n              <SelectItem value=\"all\">All Status</SelectItem>\n              <SelectItem value=\"done\">Completed</SelectItem>\n              <SelectItem value=\"in-progress\">In Progress</SelectItem>\n              <SelectItem value=\"todo\">To Do</SelectItem>\n            </SelectContent>\n          </Select>\n\n          <Select value={assigneeFilter} onValueChange={setAssigneeFilter}>\n            <SelectTrigger className=\"h-8 w-36 text-xs\">\n              <SelectValue placeholder=\"All Assignees\" />\n            </SelectTrigger>\n            <SelectContent>\n              <SelectItem value=\"all\">All Assignees</SelectItem>\n              <SelectItem value=\"Sarah Connor\">Sarah Connor</SelectItem>\n              <SelectItem value=\"Marcus Rivera\">Marcus Rivera</SelectItem>\n              <SelectItem value=\"Priya Nair\">Priya Nair</SelectItem>\n              <SelectItem value=\"Sundar Krishnan\">Sundar Krishnan</SelectItem>\n              <SelectItem value=\"Diane Cho\">Diane Cho</SelectItem>\n            </SelectContent>\n          </Select>\n        </div>\n\n        <p className=\"text-muted-foreground font-mono text-xs\">\n          Showing <span className=\"text-foreground font-bold\">{filteredTasks.length}</span> of {tasks.length}{' '}\n          deliverables\n          <span className=\"text-muted-foreground/60 ml-2\">(Right-click task for quick actions)</span>\n        </p>\n      </div>\n\n      <Gantt tasks={filteredTasks} scale={scale} onScaleChange={setScale} className=\"h-[480px]\">\n        <GanttHeader title={title} />\n        <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n          <GanttTree onTaskClick={handleTaskClick} />\n          <GanttTimeline onTaskClick={handleTaskClick} />\n        </div>\n      </Gantt>\n\n      <RoadmapTaskDetail open={sheetOpen} onOpenChange={setSheetOpen} task={selectedTask} />\n      <RoadmapAddTaskDialog open={addDialogOpen} onOpenChange={setAddDialogOpen} onAddTask={handleAddTask} />\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/project-roadmap/ProjectRoadmap.tsx"
    },
    {
      "path": "packages/registry-react/blocks/project-roadmap/RoadmapMetrics.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { CheckCircle2, Clock, AlertCircle, Milestone } from 'lucide-react'\nimport { Card, CardContent } from '@/components/ui/card'\nimport type { GanttTask } from '@/components/ui/gantt'\n\nexport interface RoadmapMetricsProps {\n  tasks: GanttTask[]\n}\n\nexport function RoadmapMetrics({ tasks }: RoadmapMetricsProps) {\n  const total = tasks.length\n  const completed = tasks.filter((t) => t.status === 'done').length\n  const inProgress = tasks.filter((t) => t.status === 'in-progress').length\n  const milestones = tasks.filter((t) => t.isMilestone).length\n  const progress = total === 0 ? 0 : Math.round(tasks.reduce((acc, t) => acc + (t.progress ?? 0), 0) / total)\n\n  return (\n    <div data-slot=\"roadmap-metrics\" className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n      <Card className=\"bg-card/50 border-border/80 shadow-none\">\n        <CardContent className=\"flex items-center justify-between p-3.5\">\n          <div>\n            <p className=\"text-muted-foreground text-xs font-medium\">Overall Progress</p>\n            <p className=\"text-foreground mt-0.5 font-mono text-xl font-bold\">{progress}%</p>\n          </div>\n          <div className=\"bg-primary/10 text-primary flex size-8 items-center justify-center rounded-full\">\n            <Clock className=\"size-4\" />\n          </div>\n        </CardContent>\n      </Card>\n\n      <Card className=\"bg-card/50 border-border/80 shadow-none\">\n        <CardContent className=\"flex items-center justify-between p-3.5\">\n          <div>\n            <p className=\"text-muted-foreground text-xs font-medium\">In Progress</p>\n            <p className=\"text-foreground mt-0.5 font-mono text-xl font-bold\">{inProgress}</p>\n          </div>\n          <div className=\"flex size-8 items-center justify-center rounded-full bg-blue-500/10 text-blue-500\">\n            <AlertCircle className=\"size-4\" />\n          </div>\n        </CardContent>\n      </Card>\n\n      <Card className=\"bg-card/50 border-border/80 shadow-none\">\n        <CardContent className=\"flex items-center justify-between p-3.5\">\n          <div>\n            <p className=\"text-muted-foreground text-xs font-medium\">Completed</p>\n            <p className=\"text-foreground mt-0.5 font-mono text-xl font-bold\">{completed}</p>\n          </div>\n          <div className=\"flex size-8 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-500\">\n            <CheckCircle2 className=\"size-4\" />\n          </div>\n        </CardContent>\n      </Card>\n\n      <Card className=\"bg-card/50 border-border/80 shadow-none\">\n        <CardContent className=\"flex items-center justify-between p-3.5\">\n          <div>\n            <p className=\"text-muted-foreground text-xs font-medium\">Milestones</p>\n            <p className=\"text-foreground mt-0.5 font-mono text-xl font-bold\">{milestones}</p>\n          </div>\n          <div className=\"flex size-8 items-center justify-center rounded-full bg-amber-500/10 text-amber-500\">\n            <Milestone className=\"size-4\" />\n          </div>\n        </CardContent>\n      </Card>\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/project-roadmap/RoadmapMetrics.tsx"
    },
    {
      "path": "packages/registry-react/blocks/project-roadmap/RoadmapTaskDetail.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { Calendar } from 'lucide-react'\nimport { Badge } from '@/components/ui/badge'\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from '@/components/ui/sheet'\nimport type { GanttTask } from '@/components/ui/gantt'\n\nexport interface RoadmapTaskDetailProps {\n  task: GanttTask | null\n  open: boolean\n  onOpenChange: (open: boolean) => void\n}\n\nexport function RoadmapTaskDetail({ task, open, onOpenChange }: RoadmapTaskDetailProps) {\n  if (!task) return null\n\n  const getStatusBadge = () => {\n    switch (task.status) {\n      case 'done':\n        return { label: 'Completed', variant: 'outline' as const, className: 'text-emerald-600 border-emerald-500/30' }\n      case 'in-progress':\n        return { label: 'In Progress', variant: 'default' as const, className: '' }\n      case 'blocked':\n        return { label: 'Blocked', variant: 'destructive' as const, className: '' }\n      default:\n        return { label: 'To Do', variant: 'secondary' as const, className: '' }\n    }\n  }\n\n  const badge = getStatusBadge()\n\n  return (\n    <Sheet open={open} onOpenChange={onOpenChange}>\n      <SheetContent className=\"sm:max-w-md\">\n        <SheetHeader className=\"border-border space-y-2 border-b pb-4\">\n          <div className=\"flex items-center gap-2\">\n            <Badge variant={badge.variant} className={badge.className}>\n              {badge.label}\n            </Badge>\n            {task.isMilestone ? (\n              <Badge variant=\"outline\" className=\"border-amber-500/30 text-amber-500\">\n                Milestone\n              </Badge>\n            ) : null}\n          </div>\n          <SheetTitle className=\"text-foreground text-lg font-semibold\">{task.name}</SheetTitle>\n          <SheetDescription className=\"text-muted-foreground text-xs\">\n            Task ID: <span className=\"font-mono\">{task.id}</span>\n          </SheetDescription>\n        </SheetHeader>\n\n        <div className=\"space-y-5 py-5 text-sm\">\n          <div className=\"space-y-1.5\">\n            <span className=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">Schedule</span>\n            <div className=\"text-foreground flex items-center gap-2 font-mono text-xs\">\n              <Calendar className=\"text-muted-foreground size-4\" />\n              <span>{task.startDate}</span>\n              <span>&rarr;</span>\n              <span>{task.endDate}</span>\n            </div>\n          </div>\n\n          {task.progress != null ? (\n            <div className=\"space-y-1.5\">\n              <div className=\"flex items-center justify-between text-xs\">\n                <span className=\"text-muted-foreground font-medium tracking-wider uppercase\">Completion</span>\n                <span className=\"font-mono font-bold\">{task.progress}%</span>\n              </div>\n              <div className=\"bg-muted h-2 w-full overflow-hidden rounded-full\">\n                <div\n                  style={{ width: `${task.progress}%` }}\n                  className=\"bg-primary h-full rounded-full transition-all duration-300\"\n                />\n              </div>\n            </div>\n          ) : null}\n\n          {task.assignee ? (\n            <div className=\"space-y-1.5\">\n              <span className=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">Owner</span>\n              <div className=\"flex items-center gap-2.5\">\n                <div className=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-full text-xs font-medium\">\n                  {task.assignee.initials || task.assignee.name.charAt(0)}\n                </div>\n                <span className=\"text-foreground text-sm font-medium\">{task.assignee.name}</span>\n              </div>\n            </div>\n          ) : null}\n        </div>\n      </SheetContent>\n    </Sheet>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/project-roadmap/RoadmapTaskDetail.tsx"
    },
    {
      "path": "packages/registry-react/blocks/project-roadmap/RoadmapAddTaskDialog.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { Plus } from 'lucide-react'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog'\nimport type { GanttTask } from '@/components/ui/gantt'\n\nexport interface RoadmapAddTaskDialogProps {\n  open: boolean\n  onOpenChange: (open: boolean) => void\n  onAddTask: (task: GanttTask) => void\n}\n\nexport function RoadmapAddTaskDialog({ open, onOpenChange, onAddTask }: RoadmapAddTaskDialogProps) {\n  const [name, setName] = React.useState('')\n  const [startDate, setStartDate] = React.useState('2026-08-20')\n  const [endDate, setEndDate] = React.useState('2026-08-28')\n  const [status, setStatus] = React.useState<'todo' | 'in-progress' | 'done'>('todo')\n  const [isMilestone, setIsMilestone] = React.useState(false)\n  const [assigneeName, setAssigneeName] = React.useState('Marcus Rivera')\n\n  const handleSubmit = (e: React.FormEvent) => {\n    e.preventDefault()\n    if (!name.trim()) return\n\n    const newTask: GanttTask = {\n      id: `task-${Date.now()}`,\n      name: name.trim(),\n      startDate,\n      endDate: isMilestone ? startDate : endDate,\n      status,\n      progress: isMilestone ? 100 : 0,\n      isMilestone,\n      assignee: {\n        name: assigneeName,\n        initials: assigneeName\n          .split(' ')\n          .map((p) => p[0])\n          .join(''),\n      },\n    }\n\n    onAddTask(newTask)\n    onOpenChange(false)\n    setName('')\n    setIsMilestone(false)\n  }\n\n  return (\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent className=\"sm:max-w-[480px]\">\n        <DialogHeader>\n          <DialogTitle>Add Roadmap Task</DialogTitle>\n          <DialogDescription>\n            Create a new scheduled deliverable or critical milestone in the project Gantt timeline.\n          </DialogDescription>\n        </DialogHeader>\n\n        <form onSubmit={handleSubmit} className=\"space-y-4 py-2\">\n          <div className=\"space-y-1.5\">\n            <Label htmlFor=\"task-name\">Task Name</Label>\n            <Input\n              id=\"task-name\"\n              value={name}\n              onChange={(e) => setName(e.target.value)}\n              placeholder=\"e.g. Design Token Hierarchy & Specs\"\n              required\n            />\n          </div>\n\n          <div className=\"grid grid-cols-2 gap-3\">\n            <div className=\"space-y-1.5\">\n              <Label htmlFor=\"start-date\">Start Date</Label>\n              <Input\n                id=\"start-date\"\n                type=\"date\"\n                value={startDate}\n                onChange={(e) => setStartDate(e.target.value)}\n                required\n              />\n            </div>\n            <div className=\"space-y-1.5\">\n              <Label htmlFor=\"end-date\">End Date</Label>\n              <Input\n                id=\"end-date\"\n                type=\"date\"\n                value={endDate}\n                disabled={isMilestone}\n                onChange={(e) => setEndDate(e.target.value)}\n                required\n              />\n            </div>\n          </div>\n\n          <div className=\"border-border/80 bg-muted/20 flex items-center space-x-2 rounded-md border p-3\">\n            <Checkbox\n              id=\"milestone-toggle\"\n              checked={isMilestone}\n              onCheckedChange={(checked) => setIsMilestone(!!checked)}\n            />\n            <div className=\"grid gap-0.5 leading-none\">\n              <label\n                htmlFor=\"milestone-toggle\"\n                className=\"text-foreground cursor-pointer text-xs font-semibold select-none\"\n              >\n                Key Project Milestone\n              </label>\n              <p className=\"text-muted-foreground text-[11px]\">\n                Marks a zero-duration target deliverable (e.g. Beta Release, Audit sign-off)\n              </p>\n            </div>\n          </div>\n\n          <div className=\"grid grid-cols-2 gap-3\">\n            <div className=\"space-y-1.5\">\n              <Label>Initial Status</Label>\n              <Select value={status} onValueChange={(val: any) => setStatus(val)}>\n                <SelectTrigger>\n                  <SelectValue placeholder=\"Status\" />\n                </SelectTrigger>\n                <SelectContent>\n                  <SelectItem value=\"todo\">To Do</SelectItem>\n                  <SelectItem value=\"in-progress\">In Progress</SelectItem>\n                  <SelectItem value=\"done\">Completed</SelectItem>\n                </SelectContent>\n              </Select>\n            </div>\n\n            <div className=\"space-y-1.5\">\n              <Label>Assignee</Label>\n              <Select value={assigneeName} onValueChange={setAssigneeName}>\n                <SelectTrigger>\n                  <SelectValue placeholder=\"Assignee\" />\n                </SelectTrigger>\n                <SelectContent>\n                  <SelectItem value=\"Marcus Rivera\">Marcus Rivera</SelectItem>\n                  <SelectItem value=\"Sarah Connor\">Sarah Connor</SelectItem>\n                  <SelectItem value=\"Priya Nair\">Priya Nair</SelectItem>\n                  <SelectItem value=\"Sundar Krishnan\">Sundar Krishnan</SelectItem>\n                  <SelectItem value=\"Diane Cho\">Diane Cho</SelectItem>\n                </SelectContent>\n              </Select>\n            </div>\n          </div>\n\n          <DialogFooter className=\"pt-4\">\n            <Button variant=\"outline\" type=\"button\" onClick={() => onOpenChange(false)}>\n              Cancel\n            </Button>\n            <Button type=\"submit\">\n              <Plus className=\"mr-1.5 size-3.5\" />\n              Create Task\n            </Button>\n          </DialogFooter>\n        </form>\n      </DialogContent>\n    </Dialog>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/project-roadmap/RoadmapAddTaskDialog.tsx"
    },
    {
      "path": "packages/registry-react/blocks/project-roadmap/types.ts",
      "content": "import type { GanttTask } from '@/components/ui/gantt'\n\nexport interface RoadmapProject {\n  id: string\n  name: string\n  description?: string\n  tasks: GanttTask[]\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/project-roadmap/types.ts"
    },
    {
      "path": "packages/registry-react/blocks/project-roadmap/index.ts",
      "content": "export { ProjectRoadmap, type ProjectRoadmapProps } from './ProjectRoadmap'\nexport { RoadmapMetrics, type RoadmapMetricsProps } from './RoadmapMetrics'\nexport { RoadmapTaskDetail, type RoadmapTaskDetailProps } from './RoadmapTaskDetail'\nexport { RoadmapAddTaskDialog, type RoadmapAddTaskDialogProps } from './RoadmapAddTaskDialog'\nexport * from './types'\n",
      "type": "registry:block",
      "target": "~/components/blocks/project-roadmap/index.ts"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/gantt.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/input.json",
    "https://uipkge.dev/r/react/select.json",
    "https://uipkge.dev/r/react/dialog.json",
    "https://uipkge.dev/r/react/sheet.json",
    "https://uipkge.dev/r/react/checkbox.json",
    "https://uipkge.dev/r/react/label.json"
  ],
  "description": "Full interactive project roadmap and deliverables surface: Gantt timeline with multi-scale zooming, work breakdown task tree, overall progress metrics, search and status/assignee filters, task detail slide-over Sheet, and Add Task modal dialog.",
  "categories": [
    "dashboard",
    "data"
  ]
}