facet_chart: add opt-in linked panel interactions#105
Merged
Alek99 merged 5 commits intoJul 20, 2026
Conversation
Merging this PR will not alter performance
Comparing Footnotes
|
Alek99
reviewed
Jul 20, 2026
Alek99
left a comment
Member
There was a problem hiding this comment.
Review findings:
- [P1]
python/xy/components.py:3306:link=Noneremoves the runtime linking that existingshare_x=True/share_y=Truefacets receive today. This is a breaking change against the prior tests/docs; preserve it or provide an explicit migration/versioning path. - [P1]
js/src/50_chartview.js:442: incoming linked selections use_selectLocal*, which skips density traces and cannot select drilled GPU data. Receiver facets do not highlight, and selection callbacks only see the source facet rather than the requested cross-panel result. - [P2]
js/src/50_chartview.js:458: selection-only links still broadcast/apply view events with an emptylink_axes, producing redundant LOD requests and callbacks on untouched facets. Avoid broadcasting view updates when no axes are linked.
Alek99
added a commit
that referenced
this pull request
Jul 21, 2026
The move in this PR promoted docs/engineering/ to spec/ and CLAUDE.md declares that tree the source of truth. An audit of all 24 documents against the code found the tree had drifted at PR #96: five behavior PRs (#103, #105, #106, #108, #115) had landed with no spec update, and ~100 claims contradicted shipped code. Accuracy: correct claims that no longer match the implementation, including the Rust ABI version (v31 -> v36), the "zero-crate cdylib" claim (png is a real dependency), the pyramid ABI function names, the panic-shield status, the R2/VAO claim in the renderer doc, the WASM/Web-Worker architecture in dossier §3/§8 (superseded by §32's C-ABI cdylib), the count-only tier rule, the matplotlib shim overhead figures (the cited guardrail says +60% at 10k, not +9%), and the Plotly Scattergl 10M figure that appeared as two different numbers from the same run. Coverage: add spec/api/export.md, spec/api/interaction.md and spec/design/wire-protocol.md for three surfaces that had no coverage at all, plus the config.py threshold table, full JS and Rust module inventories, and the hexbin centers-only wire contract that three renderers must expand identically. Structure: group 15 top-level files into api/, design/, matplotlib/, benchmarks/ and process/, and rewrite spec/README.md as a real index (it previously listed only the two SVG assets, leaving 21 of 22 docs unreachable). All 150 consumer references repointed, including the CI --emit-md target and the compat-matrix generator. Guard: verify_sdist.py pinned only 5 top-level spec files, so the sdist could silently lose spec/design/ or spec/assets/ and still pass; it now asserts markdown under every subdirectory and both SVGs.
Alek99
added a commit
that referenced
this pull request
Jul 21, 2026
…roup the tree (#122) * Move engineering docs to root spec directory * Resync spec/ with the implementation and group the tree The move in this PR promoted docs/engineering/ to spec/ and CLAUDE.md declares that tree the source of truth. An audit of all 24 documents against the code found the tree had drifted at PR #96: five behavior PRs (#103, #105, #106, #108, #115) had landed with no spec update, and ~100 claims contradicted shipped code. Accuracy: correct claims that no longer match the implementation, including the Rust ABI version (v31 -> v36), the "zero-crate cdylib" claim (png is a real dependency), the pyramid ABI function names, the panic-shield status, the R2/VAO claim in the renderer doc, the WASM/Web-Worker architecture in dossier §3/§8 (superseded by §32's C-ABI cdylib), the count-only tier rule, the matplotlib shim overhead figures (the cited guardrail says +60% at 10k, not +9%), and the Plotly Scattergl 10M figure that appeared as two different numbers from the same run. Coverage: add spec/api/export.md, spec/api/interaction.md and spec/design/wire-protocol.md for three surfaces that had no coverage at all, plus the config.py threshold table, full JS and Rust module inventories, and the hexbin centers-only wire contract that three renderers must expand identically. Structure: group 15 top-level files into api/, design/, matplotlib/, benchmarks/ and process/, and rewrite spec/README.md as a real index (it previously listed only the two SVG assets, leaving 21 of 22 docs unreachable). All 150 consumer references repointed, including the CI --emit-md target and the compat-matrix generator. Guard: verify_sdist.py pinned only 5 top-level spec files, so the sdist could silently lose spec/design/ or spec/assets/ and still pass; it now asserts markdown under every subdirectory and both SVGs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
Description
link: Optional[str] = Noneandlink_select: bool = Falsetofacet_chart/FacetChartwith eager validation of allowed values (None,"x","y", "both").link_group+link_axeson per-panelFigureinstances when linking is requested, preserving existingshare_x/share_ybehavior for initial-domain alignment.BroadcastChannel, add_broadcastLinkedSelection, and update selection handlers to acceptoptsthat suppress duplicate dispatch/broadcast when applying incoming linked selections.docs/guides/dashboards-and-linked-views.md) and add/adjust tests covering independent defaults, explicit link choices, link-implied domain sharing, invalidlinkvalues, and selection linking logic.Testing
node js/build.mjsand ran targeted suitesPYTHONPATH=python pytest -q tests/test_facets.py tests/test_components.py tests/test_static_client_security.py, which all passed (138 tests).PYTHONPATH=python pytest -q, which succeeded (1,835 passed, 77 skipped).Closes #92