feat (timeline-layers): example - #379
Conversation
|
Hey @charlieforward9, thanks for the tag. I'm not really familiar with the context behind this PR. Can you help me understad why you would make the timeline as a layer instead of using a canvas, for example? What does making it in Deck accomplish? Also what's the use case for hundreds of thousands of clips? Are you really looking at all of those clips at the same time? |
In our NoodlesGL / New Heat conversation, we basically concluded that sharing UI frameworks between apps was a non-starter — different shells, different UX.
I plan on displaying many thousands of events and view state keyframes and I'd like to support a very granular level of detail. Right now, my DOM-based solution is lagging at a few hundred. |
|
Separately from the discussion whether this is a good fit for noodles.gl / clip timelines... I am currently building a couple of visualizations for very big timeline data and I find that this type of layers can be quite useful. I have even played with the idea of creating a "timeline-layers" module if we collect a sufficient amount of support for this use case. We already have the HorizonGraphLayer and TimelineAxisLayer etc in the infovis-layers module so this would land in good company |
|
@ibgreen how much support for the use case are you looking for? This is something I definitely need so I am planning to move forward with it. I'd deeply appreciate your guidance and contribution if you already have opinions / samples in the scope. Short term it feels easiest to continue down this path and build it as an example within infovis-layers, and once the kinks get flushed, consider splitting it out? |
ibgreen
left a comment
There was a problem hiding this comment.
Is the idea to add a new CompositeLayer to the infovis-module?
As it stands all the timeline layer code is in the example, not very reusable.
Exactly.
Needed a quick demonstration to get a conversation going. Do you have any snippets that you've experimented with to assist with the initial build of this, or do you recommend I take what I have and package it up myself? |
9b37f9b to
25ddfa5
Compare
yes it is all there, in module/infovis-layers/src/layers/... |
|
Heres where I was able to land: Recording.2025-11-25.023418.mp4A lot of pending work, I would appreciate a review and some support with the interaction logic. Still feels like there's too many keyboard and mouse events external to the component that I need to understand how to abstract better. |
ibgreen
left a comment
There was a problem hiding this comment.
- I created a new module timeline-layers
- updated this PR to add the new layer to that module
- updated the example to import from the module.
In terms of next steps
- I feel that the important thing here is the data model you have defined, mainly in timeline-types.
- For this layer to be reasonably easy to use by others, that data model needs to be well documented (reference and usage guide).
- We could also easily have the LLM add tests for all the non-layer utility functions. No excuse not to have tests.
If those criteria is met we could land this as an experimental layer (export as _TimelineLayer). I would want to feel that there is some level of commitment to doing the work needed to get this out of experimental status.
In terms of an "API audit" for taking this out of experimental status.
- TimelineLayer is probably not the best name as this module will grow to contain a lot of timeline related layers.
- this is a layer focused around a specific data model (tracks?) and perhaps could be named accordingly (TrackLayer).
- the layer is quite specialized / omposite (axis + multiple lines of tracks) maybe composable pieces could also be offered?
- There is also some overlap with the existing time axis functionality in the timeline-layers module. I am not sure if either is better or if they could be unified, but it should be looked into.
…tay in modules/ Separates in-progress work from the published modules tree. All npm-published 9.2.8 packages remain untouched in modules/. Moved to dev/ (flat): - modules/timeline-layers -> dev/timeline-layers (in progress, refs #517 #379) - examples/timeline-layers/horizon-graph-layer -> dev/timeline-layers/examples/ - examples/arrow-layers-wip -> dev/arrow-layers (renamed, drop -wip suffix) Config: - package.json + lerna.json: add dev/* to workspaces/packages - tsconfig.json: add dev/ to include, add timeline-layers path alias - vitest.config.ts: include dev/ in node/browser/headless globs and coverage - keep modules/basemap-props/** excluded from node tests (uses global describe) Rationale from #512: dev/ keeps WIP visible without polluting docs search or the published modules tree. Design proposals live in GitHub Issues/Discussions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…etup - Add dev/timeline-layers/examples/* to root workspace glob so yarn resolves the package correctly - Add vite.config.local.mjs (aliases @deck.gl-community/timeline-layers to src/ so dist/ is never stale during dev) - Fix tsconfig.json extends depth (examples/ moved one level deeper vs original PR path) - Update example README with prototype video + end-goal screenshot from PR #379, start-local instructions, and context links to #379/#517/#38 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ng (#544) * fix(website): remove three/wild-forest from sidebar until doc page exists Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ci): add PR test workflow, vitest coverage, and unit tests Closes a degree of #82 by establishing an automated test baseline for every PR. Applies reviewer feedback from #512 re: dev/ directory for WIP/RFC content. ## CI workflow (.github/workflows/test.yml) - Triggers on push to master and all pull_request events - lint job: runs yarn lint (no build required) - test-node job: builds, runs vitest node project with v8 coverage, uploads to Coveralls - test-headless job: installs Playwright Chromium, runs headless browser tests Modeled after deck.gl's test.yml (see visgl/deck.gl vitest-migration-rfc) using @vitest/browser + Playwright as first-class visgl testing utilities. ## Coverage (vitest.config.ts + package.json) - Added test.coverage block: provider v8, reporters text + lcov (for Coveralls) - Scoped to modules/*/src/**, excludes basemap-props* and template - Added test-ci script: vitest run --project node --coverage - Added @vitest/coverage-v8 devDependency ## New unit tests (all 308 pass, 60 test files) - modules/editable-layers/test/immutable-feature-collection.node.spec.ts ImmutableFeatureCollection: add/delete/replace/removePosition, polygon ring wrapping, 3D elevation preservation, immutability guarantees (17 tests) - modules/editable-layers/test/imports.node.spec.ts Public API surface smoke test: draw, alter, and measurement mode exports (6 tests) - modules/layers/test/imports.node.spec.ts (2 tests) - modules/widgets/test/imports.node.spec.ts (4 tests) - modules/geo-layers/test/imports.node.spec.ts (3 tests) ## dev/ directory Per ibgreen's feedback in #512: establishes dev/ as the canonical home for RFCs and WIP content that should NOT be indexed by the docs site search. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: remove dev/ directory — RFCs move to GitHub Issues/Discussions Per discussion: RFCs are better tracked as GitHub Issues or Discussions where commenting and cross-linking are native. The docs tree stays focused on true usability docs and basic rationale only. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: flat dev/ for WIP modules and examples, published modules stay in modules/ Separates in-progress work from the published modules tree. All npm-published 9.2.8 packages remain untouched in modules/. Moved to dev/ (flat): - modules/timeline-layers -> dev/timeline-layers (in progress, refs #517 #379) - examples/timeline-layers/horizon-graph-layer -> dev/timeline-layers/examples/ - examples/arrow-layers-wip -> dev/arrow-layers (renamed, drop -wip suffix) Config: - package.json + lerna.json: add dev/* to workspaces/packages - tsconfig.json: add dev/ to include, add timeline-layers path alias - vitest.config.ts: include dev/ in node/browser/headless globs and coverage - keep modules/basemap-props/** excluded from node tests (uses global describe) Rationale from #512: dev/ keeps WIP visible without polluting docs search or the published modules tree. Design proposals live in GitHub Issues/Discussions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: update yarn.lock after timeline-layers workspace path change Moving timeline-layers from modules/ to dev/ changed its workspace identifier. Yarn 4 hardened mode on public PRs treats installs as --immutable, so the lockfile must be committed with the updated path. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(website): update horizon-graph-layer path after move to dev/timeline-layers The example was moved from examples/timeline-layers/horizon-graph-layer to dev/timeline-layers/examples/horizon-graph-layer. Update the website component require() and code link to match. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(website): update timeline-layers webpack alias to dev/ path Follows the move of modules/timeline-layers → dev/timeline-layers. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add TimelineLayer to timeline-layers module with example Co-authored-by: charlieforward9 <62311337+charlieforward9@users.noreply.github.com> * fix(timeline-layers): resolve TS2345 - move ClipWithSubtrack to timeline-types, use in TrackWithSubtracks Co-authored-by: charlieforward9 <62311337+charlieforward9@users.noreply.github.com> * test(timeline-layers): add unit tests for TimelineLayer, collision detection, time utils Co-authored-by: charlieforward9 <62311337+charlieforward9@users.noreply.github.com> * chore(dev/timeline-layers): wire example into workspace + local dev setup - Add dev/timeline-layers/examples/* to root workspace glob so yarn resolves the package correctly - Add vite.config.local.mjs (aliases @deck.gl-community/timeline-layers to src/ so dist/ is never stale during dev) - Fix tsconfig.json extends depth (examples/ moved one level deeper vs original PR path) - Update example README with prototype video + end-goal screenshot from PR #379, start-local instructions, and context links to #379/#517/#38 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ci): grant pull-requests+checks write for Coveralls PR comment The global permissions block only had contents:read. Coveralls needs pull-requests:write to post a coverage comment and checks:write for the status check. Scoped to test-node job only. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ci): post coverage summary directly as PR comment Replace Coveralls upload (which requires the Coveralls GitHub App to be installed on the org to post PR comments) with an actions/github-script step that reads the vitest coverage table from stdout and posts/updates it as a PR comment directly. No external service setup needed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(ci): remove duplicate test.yaml superseded by test.yml test.yaml was the original single-job workflow. test.yml replaced it with parallel lint/test-node/test-headless jobs. Both were running on every PR causing duplicate test-node checks. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ci): compact coverage comment to overall % only Replace verbose per-file table with a single "All files" totals line. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(ci): show coverage delta vs master in PR comment - Save "All files" line as artifact on master pushes - On PRs, find + download latest master baseline artifact - Show delta (▲/▼/●) next to each metric vs master Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
In need of a big-data timeline for a project that can support hundreds of thousands of datapoints. Current solution is DOM-driven and lags out with a few hundred.
A timeline solution as a deck.gl composite layer introduces a performant interactive no-low-code tool supporting direct track integration with all Deck props including projection, viewState, any layer...
Current (DOM-driven)
Prototype
Screen.Recording.2025-11-08.at.1.16.55.AM.mov
End Goal
Ref: joby-aviation/noodles.gl#50 (reply in thread)
CC: @akre54 @ibgreen