You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Gantt feature parity, Phases 1–5: dependency links, real time scales, hierarchy, interaction polish, and virtualization.
6
+
7
+
-**Dependency links** — `task.dependencies` renders as orthogonal arrows in an SVG overlay, with all four MS-Project link types (`fs`/`ss`/`ff`/`sf`) via the object form `{ id, type }`. Arrows follow bars live during drag/resize; hovering a bar highlights its links. `normalizeDependencies` (exported) accepts CSV strings, id arrays, and object arrays with id/type aliases. New dependencies can be created by dragging from a bar's link dot onto another bar (`onDependencyCreate`).
8
+
-**Real time scales** — day/week/month/quarter modes with a two-row header (group row + unit row), weekend tinting, zoom in/out, and a jump-to-today button.
9
+
-**Hierarchy** — `parent` builds a tree: collapsible summary rows with bracket-style summary bars aggregated from descendants, milestone diamonds, indent guides, and `aria-expanded`/`role="treeitem"` semantics. Dragging a summary bar moves its whole subtree by the same offset (live preview + one `onTaskUpdate` per task); the summary's displayed range rolls up from children, so moving a child past the parent's edge stretches the parent automatically.
10
+
-**Interaction polish** — progress drag handle, hover tooltip, context menu (including delete), keyboard navigation/editing, inline title editing, and row drag-reorder (`onTaskReorder`).
11
+
-**Scale** — virtualized rows *and* columns (spacer-based windowing; only the visible window is in the DOM, verified: 5,000 tasks render in ~27 ms with 26 rows in the DOM), a fullscreen toggle, and custom timeline `markers` (`{ date, label?, color? }`).
12
+
13
+
Colors that the prebuilt components stylesheet doesn't emit utilities for use theme CSS variables inline, so everything renders correctly in consuming apps.
-[x] Render dependency arrows as an SVG overlay in `GanttView` (orthogonal elbow routing, arrowhead markers, backward-link detour)
19
+
-[x] Support the 4 link types: finish-to-start (default), start-to-start, finish-to-finish, start-to-finish — per-dependency `{ id, type }` object form; `normalizeDependencies` accepts CSV strings, id arrays, object arrays with id/type aliases
20
+
-[x] Recompute arrow paths live during bar drag/resize preview
21
+
-[x] Highlight a task's links on hover (and while dragging)
22
+
-[x] Tests: link parsing (string id, array, `{id, type}` object), path anchors per type, hover highlight, drag re-render, backward links (8 new GanttView tests + 6 normalizeDependencies tests)
23
+
24
+
## Phase 2 — Real Time Scales (resurrect `viewMode`) ✅
25
+
26
+
-[x] Implement day/week/month/quarter column generation in `timeColumns` — calendar-true column widths over one linear ms→px mapping (`pxPerDay = columnWidth / nominalDays`), so bars, grid, links and the Today marker stay aligned in every mode
27
+
-[x] Two-row scale header: month groups over day/week units, year groups over month/quarter units
28
+
-[x] Restore the view-mode segmented control in the toolbar; zoom buttons fall through to the next coarser/finer granularity at min/max column width
29
+
-[x] Drag snapping respects active granularity (day/week columns, calendar-clamped month/quarter shifts preserving duration on move)
30
+
-[x] Tests: column generation per mode, header groups/labels, bar geometry per granularity, week + month snap behavior (8 new tests)
31
+
32
+
## Phase 3 — Task Hierarchy & Types ✅
33
+
34
+
-[x]`parentField` (+ `task.parent`) → task tree, depth-indented rows, expand/collapse chevrons in the task list; orphans and parent cycles surface as roots instead of dropping rows
35
+
-[x] Summary (parent) bars: bracket-style slim bar with end caps spanning the children rollup range; read-only (children drive it)
36
+
-[x] Milestone type: diamond marker via `typeField`/`task.type` or the `end <= start` heuristic; movable, not resizable; links anchor at the diamond center
37
+
-[x] Auto-rollup: summary dates = min/max of descendants, progress = duration-weighted child progress (client-side, display via `data-progress`)
38
+
-[x] Tests: tree building, orphan + cycle handling, collapse hides rows/links, summary range/progress math, milestone rendering + link anchors (9 new tests)
39
+
40
+
## Phase 4 — Interaction Polish ✅
41
+
42
+
-[x] Progress drag handle on the bar — grip at the progress boundary, 1% snapping, live fill preview, commits `onTaskUpdate({progress})`
43
+
-[x] Rich hover tooltip (title, dates, duration, progress) on task bars, milestones and summary brackets
44
+
-[x] Context menu on bar/row — View details / Edit inline / Delete; closes on outside click or Escape (add-dependency is covered by drag-to-create)
45
+
-[x] Keyboard support: focusable gantt body, ArrowUp/Down row navigation, Enter to open, Delete to delete, ArrowLeft/Right collapse/expand; `tree`/`treeitem` roles with aria-level/-selected/-expanded
46
+
-[x] Drag-to-create dependency — connector dot on bar edge, dashed rubber band, drop-target highlight; fires `onDependencyCreate(source, target, 'fs')`, `ObjectGantt` appends to the dependencies field preserving its shape (CSV ↔ array)
47
+
-[x] Row drag-to-reorder — HTML5 drag in the task list, sibling-scoped, fires `onTaskReorder(task, before)` for the host to persist (sort-field wiring is host-specific)
48
+
-[x] Tests: progress drag + clamping, tooltip, context menu routing/Escape, keyboard nav + collapse, link create + empty-space release, reorder + cross-parent guard (11 new tests)
49
+
50
+
## Phase 5 — Scale & Performance ✅
51
+
52
+
-[x] Virtualized row rendering (windowing) for both task list and timeline — spacer-div windowing over flattened rows (≈viewport + 6-row overscan rendered), driven by scroll position + ResizeObserver-measured viewport; dependency-link SVG keeps absolute row coordinates and skips links fully outside the window
53
+
-[x] Virtualized timeline columns for multi-year ranges — prefix-sum column offsets + binary-free linear `visibleRange` scan; header groups, header units and the background grid render as absolutely-positioned cells inside the ±240px overscan window
54
+
-[x] Fullscreen mode toggle — toolbar button drives the native Fullscreen API on the Gantt container, icon/aria reflect `fullscreenchange`
55
+
-[x] Custom vertical markers — `markers` prop (`{date, label?, color?}`), rendered like the Today line on the shared ms→px mapping; out-of-range/invalid dates dropped; passed through `ObjectGantt` via `schema.markers`
56
+
-[x] Tests: 1000-row windowing + spacer heights, scroll window shift, windowed link anchoring, multi-year column windowing, fullscreen enter/exit, marker mapping/fallback color (8 new tests)
57
+
58
+
## Phase 6 — Advanced (SVAR PRO territory, differentiators)
0 commit comments