Skip to content

feat (timeline-layers): example - #379

Closed
charlieforward9 wants to merge 5 commits into
masterfrom
example-timeline
Closed

feat (timeline-layers): example#379
charlieforward9 wants to merge 5 commits into
masterfrom
example-timeline

Conversation

@charlieforward9

@charlieforward9 charlieforward9 commented Nov 8, 2025

Copy link
Copy Markdown
Member

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)

image

Prototype

Screen.Recording.2025-11-08.at.1.16.55.AM.mov

End Goal

image

Ref: joby-aviation/noodles.gl#50 (reply in thread)

CC: @akre54 @ibgreen

@charlieforward9 charlieforward9 self-assigned this Nov 8, 2025
@akre54

akre54 commented Nov 9, 2025

Copy link
Copy Markdown

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?

@charlieforward9

charlieforward9 commented Nov 23, 2025

Copy link
Copy Markdown
Member Author

@akre54

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?

In our NoodlesGL / New Heat conversation, we basically concluded that sharing UI frameworks between apps was a non-starter — different shells, different UX.
But we can realistically share deck layers. That’s the main motivation for putting the timeline in deck instead of writing a totally custom canvas:
• NoodlesGL can host it as a alternative to theatre studio's timeline.
• New Heat Studio can also mount the same Layer type inside its deck-based editor.
• Both get the same core behavior, but each app wraps it in its own React/DOM chrome around it.

Also what's the use case for hundreds of thousands of clips?

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.

@charlieforward9 charlieforward9 changed the title demo: deck.gl timeline demo: TimelineLayer Nov 23, 2025
@charlieforward9 charlieforward9 changed the title demo: TimelineLayer demo/rfc: TimelineLayer Nov 23, 2025
@ibgreen

ibgreen commented Nov 23, 2025

Copy link
Copy Markdown
Collaborator

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

@charlieforward9

Copy link
Copy Markdown
Member Author

@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 ibgreen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread examples/editable-layers/advanced/src/example.tsx Outdated
Comment thread examples/infovis-layers/timeline/app.tsx Outdated
Comment thread examples/infovis-layers/timeline/tsconfig.json
@charlieforward9

Copy link
Copy Markdown
Member Author

Is the idea to add a new CompositeLayer to the infovis-module?

Exactly.

As it stands all the timeline layer code is in the example, not very reusable.

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?

@ibgreen

ibgreen commented Nov 24, 2025

Copy link
Copy Markdown
Collaborator

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?

yes it is all there, in module/infovis-layers/src/layers/...

@charlieforward9 charlieforward9 changed the title demo/rfc: TimelineLayer demo/rfc (infovis-layers): TimelineLayer Nov 25, 2025
@charlieforward9

Copy link
Copy Markdown
Member Author

Heres where I was able to land:

Recording.2025-11-25.023418.mp4

A 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.

@charlieforward9 charlieforward9 added enhancement New feature or request help wanted Extra attention is needed labels Nov 25, 2025
@charlieforward9 charlieforward9 changed the title demo/rfc (infovis-layers): TimelineLayer feat (infovis-layers): TimelineLayer Nov 27, 2025

@ibgreen ibgreen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 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.

@charlieforward9 charlieforward9 changed the title feat (infovis-layers): TimelineLayer feat (chrono.gl): TimelineLayer Feb 20, 2026
@charlieforward9 charlieforward9 changed the title feat (chrono.gl): TimelineLayer feat (temp.gl): TimelineLayer Feb 20, 2026
@charlieforward9 charlieforward9 changed the title feat (temp.gl): TimelineLayer feat (tempo.gl): TimelineLayer Feb 20, 2026
@charlieforward9 charlieforward9 changed the title feat (tempo.gl): TimelineLayer feat (tempo.gl): example Feb 20, 2026
@charlieforward9
charlieforward9 marked this pull request as ready for review February 20, 2026 13:53
@charlieforward9 charlieforward9 added this to the 9.3-release milestone Feb 20, 2026
@charlieforward9 charlieforward9 changed the title feat (tempo.gl): example feat (timeline-layers): example Feb 23, 2026
charlieforward9 added a commit that referenced this pull request Mar 5, 2026
…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>
@charlieforward9

Copy link
Copy Markdown
Member Author

Superseded by #517, which rewrote this based on ib's review feedback. All work from #517 has been applied to dev/timeline-layers in #544 — authorship preserved via git format-patch | git am. Closing in favour of the cleaner implementation.

charlieforward9 added a commit that referenced this pull request Mar 5, 2026
…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>
charlieforward9 added a commit that referenced this pull request Mar 5, 2026
…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>
@charlieforward9
charlieforward9 deleted the example-timeline branch March 13, 2026 22:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request help wanted Extra attention is needed timeline-layers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants