Repository navigation
feat(catalog): add Gantt recipe with nested phases and dependencies - #163
Conversation
Add conformance case 198: phase header lanes with indented task lanes on scaleBand and scaleUtc, progress fills, a go-live milestone, a status-date rule, and right-angle finish-to-start arrows routed by a case-local d3 curve on link. Connectors, progress, and the rule are decorative, so keyboard focus stops on every phase, task, and milestone. Observable Plot reference uses the same routing curve. Document the recipe in Intervals and Financial Charts, register the case in the catalog index, previews, navigation, and definition coverage records, and log F-310, F-313, and F-314 in the API friction log.
Use a focusNearestY-based strategy whose navigation sorts by y then x so arrow keys follow the lane tree, and assert the order in the unit test. Outline phase summaries with a light fill so crossing connectors stay visible in both themes. Note the fixed margin assumption in the gutter estimate and correct F-308.
|
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
Task data and schedule layout benchmarks/conformance/cases/198-gantt-dependencies/data.ts, benchmarks/conformance/cases/198-gantt-dependencies/plan.ts |
Adds revision-specific project tasks and derives phase summaries, task lanes, progress spans, dependency endpoints, and a date domain. |
Chart rendering and dependency routing benchmarks/conformance/cases/198-gantt-dependencies/example.tsx, benchmarks/conformance/cases/198-gantt-dependencies/route.ts, benchmarks/conformance/cases/198-gantt-dependencies/plot.ts, benchmarks/conformance/cases/198-gantt-dependencies/tanstack.ts, benchmarks/conformance/cases/198-gantt-dependencies/tanstack.test.ts |
Adds chart renderers, elbow-routed connectors, lane-ordered keyboard navigation, chart mounting, and tests for rendered items, lane scales, and focus order. |
Case registration and validation benchmarks/conformance/cases/198-gantt-dependencies/case.json, benchmarks/conformance/catalog-index.json, benchmarks/conformance/definition-coverage-roadmap.json, benchmarks/conformance/definition-coverage-roadmap.test.ts, benchmarks/conformance/previews/manifest.json, benchmarks/conformance/DEFINITION-COVERAGE-*, scripts/catalog-definition-shapes.test.mjs |
Registers case 198, updates coverage counts and validation expectations, and adds the preview asset. |
Usage documentation and API observations docs/config.json, docs/examples/intervals-and-financial.md, packages/charts-core/docs/config.json, packages/charts-core/docs/examples/intervals-and-financial.md, API-FRICTION.md, PLAN.md |
Adds chart navigation and Gantt guidance, records connector, keyboard traversal, and bar inset observations, and updates the roadmap entry. |
Estimated code review effort: 3 (Moderate) | ~25 minutes
Change: Other
Sequence Diagram(s)
sequenceDiagram
participant Example as createExampleChart
participant Data as planForRevision
participant Layout as planLayout
participant Chart as Chart marks
Example->>Data: Select revision-specific tasks
Example->>Layout: Build lanes, items, and dependencies
Layout-->>Example: Return chart layout
Example->>Chart: Compose marks and interaction settings
Suggested reviewers: tannerlinsley
Merge Risk: 
Minimal · up to 8fa28
-
No actionable merge-blocking risk is established for this change.
Pre-merge checks: 
5
-
Full details: Title check
-
Explanation
The title "feat(catalog): add Gantt recipe with nested phases and dependencies" names the main change. The PR adds catalog case 198, a Gantt recipe with nested phase and task lanes and finish-to-start dependency connectors. The changeset contains the case files, catalog entries, docs, and roadmap updates that match this title. It does not add core or published runtime changes, which the title does not claim. The title is specific and concise.
-
Finishing Touches
-
Generate unit tests (beta)
-
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
|
Thanks @greglum. The recipe keeps the new work out of the published runtime, which is a good fit here. I reviewed the source and the generated preview at One rebase detail to fix: the new entries in |
|
|
Thanks for updating the friction references. I checked the recipe independently against current main, and the recipe source is unchanged in 116d53c. The isolated Chromium checks covered initial and revised data at 320, 640 and 960 pixels in light and dark themes, then same-host updates down to 280 pixels and back. All 30 states kept 14 focusable items, 13 dependencies, finite SVG geometry and the expected keyboard order. Pointer movement at each item resolved the correct lane, and destroying each host removed its SVG. I also inspected narrow light and medium-width dark renders. This does not replace the full conformance comparison or repository checks. Those workflow gates still need approval before this can be merged. |
|
React follow-up on 116d53c: the example also passes isolated Chromium checks under React Strict Mode at 320, 640 and 960 px. All 14 keyboard stops show their expected descriptions, resizing to 280 px keeps valid SVG geometry and the accessible label, and unmounting leaves no SVG or tooltip behind. No browser errors were reported. This adds React mounting and cleanup coverage to the earlier scene checks. Full CI and reference-renderer conformance are still pending. |
|
Thanks @greglum, I completed another local verification slice at This complements the earlier interactive and React Strict Mode checks. It does not replace the pending full CI or reference-renderer conformance comparison, and I have not approved workflow execution or merged the PR. |
|
Thanks @greglum, the reference-renderer checks now pass at this same head. The repository visual assertions pass for both initial and revised data at 320, 640 and 960 pixels in light and dark themes, across Chromium, Firefox and WebKit. That covers geometry counts, guide containment, accessible naming and matching data-mark paints. An intentionally incorrect geometry count fails the verifier. The paired source/type build also passes. The full isolated package gate passes too, including bare React Native, Expo, seven adapters and the unified artifact. This is not a runtime timing benchmark or a replacement for the required CI, which remains pending. Verified head: |
|
Thanks @greglum. I merged current main into this branch at The normal generator produced all 189 previews. The 188 existing previews are byte-identical to main, and the Gantt preview is byte-identical to yours. The generated manifest check, TypeScript, catalog index and documentation contract all pass on the merged tree. No published runtime code or bundle budgets were changed by this resolution. GitHub now reports the PR as mergeable. The updated head still needs its CI results before merge; the earlier interactive and reference-renderer evidence remains recorded above. |
|
View your CI Pipeline Execution ↗ for commit 8fa28a4
☁️ Nx Cloud last updated this comment at |
This adds catalog case 198, a Gantt recipe for the pending PLAN.md item "Gantt/resource timeline with nested groups and dependencies". The conformance README asks for that item to arrive first as a recipe. There is no core change.
What it shows, using only public marks on
scaleBandlanes andscaleUtctime:linkand a small case-local d3 curve throughd3Curve. Each exits the right edge and enters the left. It routes back through the lane gutter when a successor starts before its predecessor ends.decorative, so keyboard focus stops only on phases, tasks and the milestone.focusNearestYwith a y-then-xnavigation), so arrow keys walk the plan top to bottom. Tooltips list dates, progress and predecessors.--ts-chart-*andcurrentColor.Verification:
pnpm conformance -- --case=198-gantt-dependenciespasses at 320, 640 and 960 px, light and dark, for initial and revised data. Geometry match against the Observable Plot reference is 98.7%.pnpm docs:checkandpnpm typecheckpass.Friction found while building it, logged as API entries with status monitoring:
resolvealso cannot reuse the default nearest-point lookup, because it receives points, not the scene.barXrejectsDatefields.These IDs will need renumbering if other friction entries land first. No changeset, because no published package changes.
Summary by CodeRabbit