{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "sprint-timeline",
  "title": "Sprint Timeline",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/sprint-timeline/sprint-timeline.component.ts",
      "content": "// Agile sprint tracking timeline block: 2-week deliverable Gantt schedule with story\n// point burndown indicators, milestone demos, dependency handoffs, and assignee tags.\n// Port of the Vue block 1:1.\nimport { ChangeDetectionStrategy, Component, Input, computed } from '@angular/core'\nimport { Clock, LucideAngularModule, Target, Zap } from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent } from '@/ui/badge/badge.component'\nimport { UiGanttComponent, UiGanttTimelineComponent, UiGanttTreeComponent } from '@/ui/gantt/gantt.component'\nimport type { GanttTask } from '@/ui/gantt/types'\n\nconst defaultTasks: GanttTask[] = [\n  {\n    id: 'sp-1',\n    name: 'Gantt Component Specs & Tokens',\n    startDate: '2026-08-10',\n    endDate: '2026-08-13',\n    progress: 100,\n    status: 'done',\n    priority: 'high',\n    assignee: { name: 'Sarah Connor', initials: 'SC' },\n  },\n  {\n    id: 'sp-2',\n    name: 'Vue 3.5 SFC Implementation',\n    startDate: '2026-08-12',\n    endDate: '2026-08-18',\n    progress: 90,\n    status: 'in-progress',\n    priority: 'urgent',\n    dependencies: ['sp-1'],\n    assignee: { name: 'Marcus Rivera', initials: 'MR' },\n  },\n  {\n    id: 'sp-3',\n    name: 'React 19 Parity Mirror',\n    startDate: '2026-08-14',\n    endDate: '2026-08-19',\n    progress: 80,\n    status: 'in-progress',\n    priority: 'high',\n    dependencies: ['sp-1'],\n    assignee: { name: 'Priya Nair', initials: 'PN' },\n  },\n  {\n    id: 'sp-4',\n    name: 'Mid-Sprint Review & Demo',\n    startDate: '2026-08-17',\n    endDate: '2026-08-17',\n    isMilestone: true,\n    status: 'done',\n  },\n  {\n    id: 'sp-5',\n    name: 'Composed Roadmap & Sprint Blocks',\n    startDate: '2026-08-18',\n    endDate: '2026-08-22',\n    progress: 40,\n    status: 'in-progress',\n    priority: 'medium',\n    dependencies: ['sp-2', 'sp-3'],\n    assignee: { name: 'Sundar Krishnan', initials: 'SK' },\n  },\n  {\n    id: 'sp-6',\n    name: 'Sprint Retrospective & Release',\n    startDate: '2026-08-24',\n    endDate: '2026-08-24',\n    isMilestone: true,\n    status: 'todo',\n    dependencies: ['sp-5'],\n  },\n]\n\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-sprint-timeline, [ui-sprint-timeline]',\n  standalone: true,\n  // Vue renders the root <div> itself: the host stays out of layout and `class` goes to the root.\n  host: { '[attr.class]': '\"contents\"' },\n  imports: [LucideAngularModule, UiBadgeComponent, UiGanttComponent, UiGanttTimelineComponent, UiGanttTreeComponent],\n  template: `\n    <div data-uipkge data-slot=\"sprint-timeline\" [class]=\"rootClass\">\n      <!-- Sprint Header Info -->\n      <div class=\"border-border/60 flex flex-col gap-4 border-b pb-4 sm:flex-row sm:items-center sm:justify-between\">\n        <div class=\"space-y-1\">\n          <div class=\"flex items-center gap-2\">\n            <span ui-badge variant=\"outline\" class=\"text-primary border-primary/30\">\n              <lucide-icon [img]=\"Zap\" class=\"mr-1 size-3\" />\n              Active Sprint\n            </span>\n            <span class=\"text-muted-foreground font-mono text-xs\">{{ startDate }} &rarr; {{ endDate }}</span>\n          </div>\n          <h3 class=\"text-foreground text-lg font-bold\">{{ sprintName }}</h3>\n        </div>\n\n        <div class=\"flex items-center gap-4 font-mono text-xs\">\n          <div class=\"flex items-center gap-1.5\">\n            <lucide-icon [img]=\"Target\" class=\"text-muted-foreground size-4\" />\n            <span>{{ completedPoints }} / {{ totalPoints }} Story Points</span>\n          </div>\n          <div class=\"text-warning flex items-center gap-1.5 font-semibold\">\n            <lucide-icon [img]=\"Clock\" class=\"size-4\" />\n            <span>{{ daysRemaining }} Days Left</span>\n          </div>\n        </div>\n      </div>\n\n      <!-- Sprint Gantt Grid -->\n      <ui-gantt [tasks]=\"tasks()\" scale=\"day\" [rowHeight]=\"38\" [treeWidth]=\"260\" class=\"h-72 border-none shadow-none\">\n        <div class=\"flex min-h-0 flex-1 overflow-hidden\">\n          <ui-gantt-tree [showPriority]=\"true\" />\n          <ui-gantt-timeline [showTodayLine]=\"true\" [showDependencies]=\"true\" />\n        </div>\n      </ui-gantt>\n    </div>\n  `,\n})\nexport class UiSprintTimelineComponent {\n  protected readonly Clock = Clock\n  protected readonly Target = Target\n  protected readonly Zap = Zap\n\n  @Input() sprintName = 'Sprint 42: UI Registry 2.3'\n  @Input() startDate = '2026-08-10'\n  @Input() endDate = '2026-08-24'\n  @Input() initialTasks?: GanttTask[]\n  @Input('class') className?: string\n\n  readonly completedPoints = 28\n  readonly totalPoints = 35\n  readonly daysRemaining = 6\n\n  readonly tasks = computed<GanttTask[]>(() => this.initialTasks ?? defaultTasks)\n\n  get rootClass(): string {\n    return cn('border-border bg-card space-y-5 rounded-xl border p-5 shadow-xs', this.className)\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/sprint-timeline/sprint-timeline.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/sprint-timeline/index.ts",
      "content": "export { UiSprintTimelineComponent } from './sprint-timeline.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/sprint-timeline/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/gantt.json",
    "https://uipkge.dev/r/angular/badge.json"
  ],
  "description": "Agile sprint tracking timeline block: 2-week deliverable Gantt schedule with story point burndown indicators, milestone demos, dependency handoffs, and assignee tags.",
  "categories": [
    "productivity",
    "dashboard",
    "data"
  ]
}