@ggts-sh/svelte 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +97 -0
- package/bin/ggts-codemod.js +47 -0
- package/dist/GGPlot.svelte +491 -0
- package/dist/GGPlot.svelte.d.ts +67 -0
- package/dist/a11y/CanvasA11y.svelte +115 -0
- package/dist/a11y/CanvasA11y.svelte.d.ts +15 -0
- package/dist/a11y/canvas-a11y.d.ts +1 -0
- package/dist/a11y/canvas-a11y.js +2 -0
- package/dist/assembly/assemble.d.ts +1 -0
- package/dist/assembly/assemble.js +1 -0
- package/dist/assembly/labels.d.ts +43 -0
- package/dist/assembly/labels.js +126 -0
- package/dist/assembly/layout.d.ts +158 -0
- package/dist/assembly/layout.js +175 -0
- package/dist/chrome/StatusChrome.svelte +125 -0
- package/dist/chrome/StatusChrome.svelte.d.ts +16 -0
- package/dist/chrome/ToolRail.svelte +293 -0
- package/dist/chrome/ToolRail.svelte.d.ts +26 -0
- package/dist/chrome/chrome-state.svelte.d.ts +63 -0
- package/dist/chrome/chrome-state.svelte.js +158 -0
- package/dist/chrome/theme-css.d.ts +16 -0
- package/dist/chrome/theme-css.js +16 -0
- package/dist/codemod/cli.d.ts +16 -0
- package/dist/codemod/cli.js +150 -0
- package/dist/codemod/edits.d.ts +28 -0
- package/dist/codemod/edits.js +36 -0
- package/dist/codemod/index.d.ts +10 -0
- package/dist/codemod/index.js +10 -0
- package/dist/codemod/migrate-plot-props-rewrite.d.ts +86 -0
- package/dist/codemod/migrate-plot-props-rewrite.js +228 -0
- package/dist/codemod/migrate-plot-props.d.ts +38 -0
- package/dist/codemod/migrate-plot-props.js +159 -0
- package/dist/coord/Coord.svelte +21 -0
- package/dist/coord/Coord.svelte.d.ts +16 -0
- package/dist/coord/CoordCartesian.svelte +11 -0
- package/dist/coord/CoordCartesian.svelte.d.ts +18 -0
- package/dist/coord/CoordFixed.svelte +17 -0
- package/dist/coord/CoordFixed.svelte.d.ts +10 -0
- package/dist/coord/CoordFlip.svelte +11 -0
- package/dist/coord/CoordFlip.svelte.d.ts +18 -0
- package/dist/coord/CoordPolar.svelte +16 -0
- package/dist/coord/CoordPolar.svelte.d.ts +9 -0
- package/dist/coord/CoordRadial.svelte +16 -0
- package/dist/coord/CoordRadial.svelte.d.ts +9 -0
- package/dist/coord/CoordSf.svelte +16 -0
- package/dist/coord/CoordSf.svelte.d.ts +9 -0
- package/dist/coord/CoordTransform.svelte +16 -0
- package/dist/coord/CoordTransform.svelte.d.ts +9 -0
- package/dist/data/index.d.ts +1 -0
- package/dist/data/index.js +2 -0
- package/dist/diagnostics/composition.d.ts +112 -0
- package/dist/diagnostics/composition.js +203 -0
- package/dist/diagnostics/deprecation.d.ts +58 -0
- package/dist/diagnostics/deprecation.js +27 -0
- package/dist/diagnostics/plot-engine-diagnostics.svelte.d.ts +44 -0
- package/dist/diagnostics/plot-engine-diagnostics.svelte.js +193 -0
- package/dist/facet/Facet.svelte +23 -0
- package/dist/facet/Facet.svelte.d.ts +16 -0
- package/dist/facet/FacetGrid.svelte +32 -0
- package/dist/facet/FacetGrid.svelte.d.ts +16 -0
- package/dist/facet/FacetWrap.svelte +32 -0
- package/dist/facet/FacetWrap.svelte.d.ts +16 -0
- package/dist/fonts/RobotoCondensed-Bold.ttf +0 -0
- package/dist/fonts/RobotoCondensed-Light.ttf +0 -0
- package/dist/fonts/RobotoCondensed-Regular.ttf +0 -0
- package/dist/fonts/THIRD_PARTY_NOTICES.txt +416 -0
- package/dist/geoms/GeomAbline.svelte +25 -0
- package/dist/geoms/GeomAbline.svelte.d.ts +7 -0
- package/dist/geoms/GeomArea.svelte +12 -0
- package/dist/geoms/GeomArea.svelte.d.ts +7 -0
- package/dist/geoms/GeomBar.svelte +12 -0
- package/dist/geoms/GeomBar.svelte.d.ts +7 -0
- package/dist/geoms/GeomBin2d.svelte +21 -0
- package/dist/geoms/GeomBin2d.svelte.d.ts +7 -0
- package/dist/geoms/GeomBlank.svelte +12 -0
- package/dist/geoms/GeomBlank.svelte.d.ts +7 -0
- package/dist/geoms/GeomBoxplot.svelte +25 -0
- package/dist/geoms/GeomBoxplot.svelte.d.ts +7 -0
- package/dist/geoms/GeomCol.svelte +12 -0
- package/dist/geoms/GeomCol.svelte.d.ts +7 -0
- package/dist/geoms/GeomContour.svelte +25 -0
- package/dist/geoms/GeomContour.svelte.d.ts +7 -0
- package/dist/geoms/GeomCount.svelte +12 -0
- package/dist/geoms/GeomCount.svelte.d.ts +7 -0
- package/dist/geoms/GeomCrossbar.svelte +25 -0
- package/dist/geoms/GeomCrossbar.svelte.d.ts +7 -0
- package/dist/geoms/GeomCurve.svelte +21 -0
- package/dist/geoms/GeomCurve.svelte.d.ts +7 -0
- package/dist/geoms/GeomDensity.svelte +25 -0
- package/dist/geoms/GeomDensity.svelte.d.ts +7 -0
- package/dist/geoms/GeomDensity2d.svelte +25 -0
- package/dist/geoms/GeomDensity2d.svelte.d.ts +7 -0
- package/dist/geoms/GeomDensity2dFilled.svelte +25 -0
- package/dist/geoms/GeomDensity2dFilled.svelte.d.ts +7 -0
- package/dist/geoms/GeomDotplot.svelte +25 -0
- package/dist/geoms/GeomDotplot.svelte.d.ts +7 -0
- package/dist/geoms/GeomErrorbar.svelte +25 -0
- package/dist/geoms/GeomErrorbar.svelte.d.ts +7 -0
- package/dist/geoms/GeomFreqpoly.svelte +25 -0
- package/dist/geoms/GeomFreqpoly.svelte.d.ts +7 -0
- package/dist/geoms/GeomFunction.svelte +25 -0
- package/dist/geoms/GeomFunction.svelte.d.ts +7 -0
- package/dist/geoms/GeomHex.svelte +21 -0
- package/dist/geoms/GeomHex.svelte.d.ts +7 -0
- package/dist/geoms/GeomHistogram.svelte +25 -0
- package/dist/geoms/GeomHistogram.svelte.d.ts +7 -0
- package/dist/geoms/GeomHline.svelte +12 -0
- package/dist/geoms/GeomHline.svelte.d.ts +7 -0
- package/dist/geoms/GeomJitter.svelte +35 -0
- package/dist/geoms/GeomJitter.svelte.d.ts +13 -0
- package/dist/geoms/GeomLabel.svelte +12 -0
- package/dist/geoms/GeomLabel.svelte.d.ts +7 -0
- package/dist/geoms/GeomLine.svelte +12 -0
- package/dist/geoms/GeomLine.svelte.d.ts +7 -0
- package/dist/geoms/GeomLinerange.svelte +25 -0
- package/dist/geoms/GeomLinerange.svelte.d.ts +7 -0
- package/dist/geoms/GeomMap.svelte +21 -0
- package/dist/geoms/GeomMap.svelte.d.ts +7 -0
- package/dist/geoms/GeomPath.svelte +12 -0
- package/dist/geoms/GeomPath.svelte.d.ts +7 -0
- package/dist/geoms/GeomPoint.svelte +12 -0
- package/dist/geoms/GeomPoint.svelte.d.ts +7 -0
- package/dist/geoms/GeomPointrange.svelte +25 -0
- package/dist/geoms/GeomPointrange.svelte.d.ts +7 -0
- package/dist/geoms/GeomPolygon.svelte +25 -0
- package/dist/geoms/GeomPolygon.svelte.d.ts +7 -0
- package/dist/geoms/GeomQq.svelte +21 -0
- package/dist/geoms/GeomQq.svelte.d.ts +7 -0
- package/dist/geoms/GeomQqLine.svelte +25 -0
- package/dist/geoms/GeomQqLine.svelte.d.ts +7 -0
- package/dist/geoms/GeomQuantile.svelte +25 -0
- package/dist/geoms/GeomQuantile.svelte.d.ts +7 -0
- package/dist/geoms/GeomRaster.svelte +25 -0
- package/dist/geoms/GeomRaster.svelte.d.ts +7 -0
- package/dist/geoms/GeomRect.svelte +12 -0
- package/dist/geoms/GeomRect.svelte.d.ts +7 -0
- package/dist/geoms/GeomRibbon.svelte +16 -0
- package/dist/geoms/GeomRibbon.svelte.d.ts +7 -0
- package/dist/geoms/GeomRug.svelte +21 -0
- package/dist/geoms/GeomRug.svelte.d.ts +7 -0
- package/dist/geoms/GeomRule.svelte +12 -0
- package/dist/geoms/GeomRule.svelte.d.ts +7 -0
- package/dist/geoms/GeomSegment.svelte +16 -0
- package/dist/geoms/GeomSegment.svelte.d.ts +7 -0
- package/dist/geoms/GeomSf.svelte +21 -0
- package/dist/geoms/GeomSf.svelte.d.ts +7 -0
- package/dist/geoms/GeomSfLabel.svelte +25 -0
- package/dist/geoms/GeomSfLabel.svelte.d.ts +7 -0
- package/dist/geoms/GeomSfText.svelte +25 -0
- package/dist/geoms/GeomSfText.svelte.d.ts +7 -0
- package/dist/geoms/GeomSmooth.svelte +25 -0
- package/dist/geoms/GeomSmooth.svelte.d.ts +7 -0
- package/dist/geoms/GeomSpoke.svelte +21 -0
- package/dist/geoms/GeomSpoke.svelte.d.ts +7 -0
- package/dist/geoms/GeomStep.svelte +12 -0
- package/dist/geoms/GeomStep.svelte.d.ts +7 -0
- package/dist/geoms/GeomText.svelte +12 -0
- package/dist/geoms/GeomText.svelte.d.ts +7 -0
- package/dist/geoms/GeomTile.svelte +21 -0
- package/dist/geoms/GeomTile.svelte.d.ts +7 -0
- package/dist/geoms/GeomViolin.svelte +25 -0
- package/dist/geoms/GeomViolin.svelte.d.ts +7 -0
- package/dist/geoms/GeomVline.svelte +12 -0
- package/dist/geoms/GeomVline.svelte.d.ts +7 -0
- package/dist/geoms/factory.svelte.d.ts +41 -0
- package/dist/geoms/factory.svelte.js +60 -0
- package/dist/geoms/registry.svelte.d.ts +71 -0
- package/dist/geoms/registry.svelte.js +177 -0
- package/dist/guides/GuideAxis.svelte +20 -0
- package/dist/guides/GuideAxis.svelte.d.ts +14 -0
- package/dist/guides/GuideColorbar.svelte +22 -0
- package/dist/guides/GuideColorbar.svelte.d.ts +13 -0
- package/dist/guides/GuideColorsteps.svelte +22 -0
- package/dist/guides/GuideColorsteps.svelte.d.ts +13 -0
- package/dist/guides/GuideLegend.svelte +90 -0
- package/dist/guides/GuideLegend.svelte.d.ts +37 -0
- package/dist/guides/GuideNone.svelte +19 -0
- package/dist/guides/GuideNone.svelte.d.ts +7 -0
- package/dist/guides/Guides.svelte +14 -0
- package/dist/guides/Guides.svelte.d.ts +13 -0
- package/dist/guides/factory.svelte.d.ts +36 -0
- package/dist/guides/factory.svelte.js +15 -0
- package/dist/index.d.ts +418 -0
- package/dist/index.js +376 -0
- package/dist/inspection/Inspect.svelte +71 -0
- package/dist/inspection/Inspect.svelte.d.ts +36 -0
- package/dist/inspection/Tooltip.svelte +439 -0
- package/dist/inspection/Tooltip.svelte.d.ts +32 -0
- package/dist/inspection/apply.d.ts +120 -0
- package/dist/inspection/apply.js +99 -0
- package/dist/inspection/coordinator.d.ts +51 -0
- package/dist/inspection/coordinator.js +354 -0
- package/dist/inspection/display-members.d.ts +1 -0
- package/dist/inspection/display-members.js +2 -0
- package/dist/inspection/frame.d.ts +90 -0
- package/dist/inspection/frame.js +76 -0
- package/dist/inspection/group-total.d.ts +1 -0
- package/dist/inspection/group-total.js +2 -0
- package/dist/inspection/inspect-guide-axes.d.ts +10 -0
- package/dist/inspection/inspect-guide-axes.js +24 -0
- package/dist/inspection/inspection-reconcile.svelte.d.ts +37 -0
- package/dist/inspection/inspection-reconcile.svelte.js +33 -0
- package/dist/inspection/inspection-state.svelte.d.ts +86 -0
- package/dist/inspection/inspection-state.svelte.js +347 -0
- package/dist/inspection/inspection-traversal.svelte.d.ts +29 -0
- package/dist/inspection/inspection-traversal.svelte.js +52 -0
- package/dist/inspection/pointer-inspect.d.ts +74 -0
- package/dist/inspection/pointer-inspect.js +158 -0
- package/dist/inspection/resolver.d.ts +3 -0
- package/dist/inspection/resolver.js +4 -0
- package/dist/inspection/teardown.d.ts +199 -0
- package/dist/inspection/teardown.js +181 -0
- package/dist/inspection/tooltip-chrome.d.ts +19 -0
- package/dist/inspection/tooltip-chrome.js +17 -0
- package/dist/inspection/tooltip-motion.d.ts +25 -0
- package/dist/inspection/tooltip-motion.js +32 -0
- package/dist/inspection/tooltip-presence.svelte.d.ts +49 -0
- package/dist/inspection/tooltip-presence.svelte.js +110 -0
- package/dist/inspection/tooltip-total.d.ts +1 -0
- package/dist/inspection/tooltip-total.js +2 -0
- package/dist/interaction/capability-resolution.svelte.d.ts +42 -0
- package/dist/interaction/capability-resolution.svelte.js +40 -0
- package/dist/interaction/capability.d.ts +129 -0
- package/dist/interaction/capability.js +134 -0
- package/dist/interaction/controller.svelte.d.ts +4 -0
- package/dist/interaction/controller.svelte.js +43 -0
- package/dist/interaction/inspect-geom-advisories.d.ts +10 -0
- package/dist/interaction/inspect-geom-advisories.js +10 -0
- package/dist/interaction/interaction-context.svelte.d.ts +57 -0
- package/dist/interaction/interaction-context.svelte.js +4 -0
- package/dist/interaction/interaction-diagnostics.d.ts +11 -0
- package/dist/interaction/interaction-diagnostics.js +173 -0
- package/dist/interaction/interaction-states.svelte.d.ts +84 -0
- package/dist/interaction/interaction-states.svelte.js +55 -0
- package/dist/interaction/interaction.d.ts +304 -0
- package/dist/interaction/interaction.js +7 -0
- package/dist/interaction/normalize-interaction-config.d.ts +9 -0
- package/dist/interaction/normalize-interaction-config.js +112 -0
- package/dist/interaction/reducer.d.ts +97 -0
- package/dist/interaction/reducer.js +117 -0
- package/dist/interaction/resolve-inspect-capability.d.ts +40 -0
- package/dist/interaction/resolve-inspect-capability.js +50 -0
- package/dist/interaction/scoped-store.svelte.d.ts +73 -0
- package/dist/interaction/scoped-store.svelte.js +93 -0
- package/dist/interaction/target.d.ts +91 -0
- package/dist/interaction/target.js +68 -0
- package/dist/interaction/transition-owner.d.ts +19 -0
- package/dist/interaction/transition-owner.js +10 -0
- package/dist/interaction/wiring-advisories.d.ts +33 -0
- package/dist/interaction/wiring-advisories.js +46 -0
- package/dist/interval/BoundsEditor.svelte +332 -0
- package/dist/interval/BoundsEditor.svelte.d.ts +10 -0
- package/dist/interval/bounds-editor.d.ts +1 -0
- package/dist/interval/bounds-editor.js +2 -0
- package/dist/interval/consumption.d.ts +1 -0
- package/dist/interval/consumption.js +2 -0
- package/dist/interval/interval-bounds-state.svelte.d.ts +53 -0
- package/dist/interval/interval-bounds-state.svelte.js +117 -0
- package/dist/interval/interval-state-helpers.d.ts +10 -0
- package/dist/interval/interval-state-helpers.js +34 -0
- package/dist/interval/interval-state.svelte.d.ts +60 -0
- package/dist/interval/interval-state.svelte.js +360 -0
- package/dist/interval/interval.d.ts +1 -0
- package/dist/interval/interval.js +2 -0
- package/dist/interval/precise-bounds.d.ts +1 -0
- package/dist/interval/precise-bounds.js +2 -0
- package/dist/interval/query.d.ts +1 -0
- package/dist/interval/query.js +2 -0
- package/dist/labs/Labs.svelte +29 -0
- package/dist/labs/Labs.svelte.d.ts +16 -0
- package/dist/layers/fold.d.ts +2 -0
- package/dist/layers/fold.js +1 -0
- package/dist/layers/grammar-families.d.ts +2 -0
- package/dist/layers/grammar-families.js +1 -0
- package/dist/layers/plot-layer-contract.d.ts +1 -0
- package/dist/layers/plot-layer-contract.js +29 -0
- package/dist/layers/plot-layer.svelte.d.ts +42 -0
- package/dist/layers/plot-layer.svelte.js +34 -0
- package/dist/layers/types.d.ts +2 -0
- package/dist/layers/types.js +1 -0
- package/dist/legend/Legend.svelte +24 -0
- package/dist/legend/Legend.svelte.d.ts +5 -0
- package/dist/legend/LegendFilters.svelte +196 -0
- package/dist/legend/LegendFilters.svelte.d.ts +8 -0
- package/dist/legend/LegendTargets.svelte +393 -0
- package/dist/legend/LegendTargets.svelte.d.ts +31 -0
- package/dist/legend/entry-key-index.d.ts +1 -0
- package/dist/legend/entry-key-index.js +2 -0
- package/dist/legend/entry-key-index.svelte.d.ts +34 -0
- package/dist/legend/entry-key-index.svelte.js +35 -0
- package/dist/legend/filter-state.svelte.d.ts +66 -0
- package/dist/legend/filter-state.svelte.js +284 -0
- package/dist/legend/filter.d.ts +1 -0
- package/dist/legend/filter.js +2 -0
- package/dist/legend/focus-emphasis.d.ts +72 -0
- package/dist/legend/focus-emphasis.js +91 -0
- package/dist/legend/focus-plans.d.ts +89 -0
- package/dist/legend/focus-plans.js +72 -0
- package/dist/legend/focus-reconcile.svelte.d.ts +53 -0
- package/dist/legend/focus-reconcile.svelte.js +113 -0
- package/dist/legend/focus-state.svelte.d.ts +73 -0
- package/dist/legend/focus-state.svelte.js +338 -0
- package/dist/legend/focus.d.ts +1 -0
- package/dist/legend/focus.js +2 -0
- package/dist/legend/resolve-legend-capability.d.ts +52 -0
- package/dist/legend/resolve-legend-capability.js +68 -0
- package/dist/legend/resolve-legend-filter.d.ts +65 -0
- package/dist/legend/resolve-legend-filter.js +54 -0
- package/dist/legend/resolve-legend-focus.d.ts +58 -0
- package/dist/legend/resolve-legend-focus.js +36 -0
- package/dist/legend/surface.d.ts +190 -0
- package/dist/legend/surface.js +158 -0
- package/dist/plot-engine-deriveds.svelte.d.ts +75 -0
- package/dist/plot-engine-deriveds.svelte.js +166 -0
- package/dist/plot-engine.svelte.d.ts +116 -0
- package/dist/plot-engine.svelte.js +316 -0
- package/dist/plot-props.d.ts +144 -0
- package/dist/plot-props.js +81 -0
- package/dist/runtime/announcer.svelte.d.ts +17 -0
- package/dist/runtime/announcer.svelte.js +28 -0
- package/dist/runtime/paint.d.ts +38 -0
- package/dist/runtime/paint.js +45 -0
- package/dist/runtime/resolve-datum-key.d.ts +53 -0
- package/dist/runtime/resolve-datum-key.js +73 -0
- package/dist/runtime/runtime.svelte.d.ts +37 -0
- package/dist/runtime/runtime.svelte.js +233 -0
- package/dist/runtime/semantic-candidate-projection.svelte.d.ts +29 -0
- package/dist/runtime/semantic-candidate-projection.svelte.js +137 -0
- package/dist/runtime/semantic-data-identity.d.ts +64 -0
- package/dist/runtime/semantic-data-identity.js +153 -0
- package/dist/runtime/semantic-keys-projection.d.ts +22 -0
- package/dist/runtime/semantic-keys-projection.js +40 -0
- package/dist/runtime/semantic-keys-resolve.d.ts +69 -0
- package/dist/runtime/semantic-keys-resolve.js +122 -0
- package/dist/runtime/semantic-keys.svelte.d.ts +30 -0
- package/dist/runtime/semantic-keys.svelte.js +69 -0
- package/dist/runtime/semantic-source-identity.d.ts +9 -0
- package/dist/runtime/semantic-source-identity.js +16 -0
- package/dist/scale/Scale.svelte +26 -0
- package/dist/scale/Scale.svelte.d.ts +21 -0
- package/dist/scale/ScaleAlphaBinned.svelte +14 -0
- package/dist/scale/ScaleAlphaBinned.svelte.d.ts +4 -0
- package/dist/scale/ScaleAlphaContinuous.svelte +14 -0
- package/dist/scale/ScaleAlphaContinuous.svelte.d.ts +4 -0
- package/dist/scale/ScaleAlphaDate.svelte +15 -0
- package/dist/scale/ScaleAlphaDate.svelte.d.ts +5 -0
- package/dist/scale/ScaleAlphaDatetime.svelte +15 -0
- package/dist/scale/ScaleAlphaDatetime.svelte.d.ts +5 -0
- package/dist/scale/ScaleAlphaDiscrete.svelte +14 -0
- package/dist/scale/ScaleAlphaDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleAlphaIdentity.svelte +14 -0
- package/dist/scale/ScaleAlphaIdentity.svelte.d.ts +4 -0
- package/dist/scale/ScaleAlphaManual.svelte +14 -0
- package/dist/scale/ScaleAlphaManual.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorBinned.svelte +14 -0
- package/dist/scale/ScaleColorBinned.svelte.d.ts +3 -0
- package/dist/scale/ScaleColorBrewer.svelte +14 -0
- package/dist/scale/ScaleColorBrewer.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorContinuous.svelte +14 -0
- package/dist/scale/ScaleColorContinuous.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorDate.svelte +15 -0
- package/dist/scale/ScaleColorDate.svelte.d.ts +5 -0
- package/dist/scale/ScaleColorDatetime.svelte +15 -0
- package/dist/scale/ScaleColorDatetime.svelte.d.ts +5 -0
- package/dist/scale/ScaleColorDiscrete.svelte +14 -0
- package/dist/scale/ScaleColorDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorDistiller.svelte +14 -0
- package/dist/scale/ScaleColorDistiller.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorFermenter.svelte +14 -0
- package/dist/scale/ScaleColorFermenter.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorGradient.svelte +11 -0
- package/dist/scale/ScaleColorGradient.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorGradient2.svelte +14 -0
- package/dist/scale/ScaleColorGradient2.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorGradientn.svelte +14 -0
- package/dist/scale/ScaleColorGradientn.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorGrey.svelte +11 -0
- package/dist/scale/ScaleColorGrey.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorHue.svelte +11 -0
- package/dist/scale/ScaleColorHue.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorIdentity.svelte +14 -0
- package/dist/scale/ScaleColorIdentity.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorLog10.svelte +14 -0
- package/dist/scale/ScaleColorLog10.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorManual.svelte +14 -0
- package/dist/scale/ScaleColorManual.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorOrdinal.svelte +14 -0
- package/dist/scale/ScaleColorOrdinal.svelte.d.ts +3 -0
- package/dist/scale/ScaleColorSqrt.svelte +14 -0
- package/dist/scale/ScaleColorSqrt.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorSteps.svelte +11 -0
- package/dist/scale/ScaleColorSteps.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorSteps2.svelte +11 -0
- package/dist/scale/ScaleColorSteps2.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorStepsn.svelte +11 -0
- package/dist/scale/ScaleColorStepsn.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorViridisB.svelte +11 -0
- package/dist/scale/ScaleColorViridisB.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorViridisC.svelte +11 -0
- package/dist/scale/ScaleColorViridisC.svelte.d.ts +4 -0
- package/dist/scale/ScaleColorViridisD.svelte +11 -0
- package/dist/scale/ScaleColorViridisD.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillBinned.svelte +11 -0
- package/dist/scale/ScaleFillBinned.svelte.d.ts +3 -0
- package/dist/scale/ScaleFillBrewer.svelte +11 -0
- package/dist/scale/ScaleFillBrewer.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillContinuous.svelte +14 -0
- package/dist/scale/ScaleFillContinuous.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillDate.svelte +12 -0
- package/dist/scale/ScaleFillDate.svelte.d.ts +5 -0
- package/dist/scale/ScaleFillDatetime.svelte +15 -0
- package/dist/scale/ScaleFillDatetime.svelte.d.ts +5 -0
- package/dist/scale/ScaleFillDiscrete.svelte +14 -0
- package/dist/scale/ScaleFillDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillDistiller.svelte +14 -0
- package/dist/scale/ScaleFillDistiller.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillFermenter.svelte +14 -0
- package/dist/scale/ScaleFillFermenter.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillGradient.svelte +11 -0
- package/dist/scale/ScaleFillGradient.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillGradient2.svelte +14 -0
- package/dist/scale/ScaleFillGradient2.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillGradientn.svelte +14 -0
- package/dist/scale/ScaleFillGradientn.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillGrey.svelte +11 -0
- package/dist/scale/ScaleFillGrey.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillHue.svelte +11 -0
- package/dist/scale/ScaleFillHue.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillIdentity.svelte +14 -0
- package/dist/scale/ScaleFillIdentity.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillLog10.svelte +14 -0
- package/dist/scale/ScaleFillLog10.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillManual.svelte +11 -0
- package/dist/scale/ScaleFillManual.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillOrdinal.svelte +14 -0
- package/dist/scale/ScaleFillOrdinal.svelte.d.ts +3 -0
- package/dist/scale/ScaleFillSqrt.svelte +14 -0
- package/dist/scale/ScaleFillSqrt.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillSteps.svelte +11 -0
- package/dist/scale/ScaleFillSteps.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillSteps2.svelte +11 -0
- package/dist/scale/ScaleFillSteps2.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillStepsn.svelte +11 -0
- package/dist/scale/ScaleFillStepsn.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillViridisB.svelte +11 -0
- package/dist/scale/ScaleFillViridisB.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillViridisC.svelte +11 -0
- package/dist/scale/ScaleFillViridisC.svelte.d.ts +4 -0
- package/dist/scale/ScaleFillViridisD.svelte +11 -0
- package/dist/scale/ScaleFillViridisD.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinetypeBinned.svelte +15 -0
- package/dist/scale/ScaleLinetypeBinned.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinetypeDiscrete.svelte +15 -0
- package/dist/scale/ScaleLinetypeDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinetypeIdentity.svelte +15 -0
- package/dist/scale/ScaleLinetypeIdentity.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinetypeManual.svelte +15 -0
- package/dist/scale/ScaleLinetypeManual.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinewidthBinned.svelte +14 -0
- package/dist/scale/ScaleLinewidthBinned.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinewidthContinuous.svelte +14 -0
- package/dist/scale/ScaleLinewidthContinuous.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinewidthDate.svelte +15 -0
- package/dist/scale/ScaleLinewidthDate.svelte.d.ts +5 -0
- package/dist/scale/ScaleLinewidthDatetime.svelte +15 -0
- package/dist/scale/ScaleLinewidthDatetime.svelte.d.ts +5 -0
- package/dist/scale/ScaleLinewidthDiscrete.svelte +14 -0
- package/dist/scale/ScaleLinewidthDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinewidthIdentity.svelte +14 -0
- package/dist/scale/ScaleLinewidthIdentity.svelte.d.ts +4 -0
- package/dist/scale/ScaleLinewidthManual.svelte +14 -0
- package/dist/scale/ScaleLinewidthManual.svelte.d.ts +4 -0
- package/dist/scale/ScaleRadius.svelte +11 -0
- package/dist/scale/ScaleRadius.svelte.d.ts +4 -0
- package/dist/scale/ScaleShapeBinned.svelte +15 -0
- package/dist/scale/ScaleShapeBinned.svelte.d.ts +4 -0
- package/dist/scale/ScaleShapeDiscrete.svelte +15 -0
- package/dist/scale/ScaleShapeDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleShapeIdentity.svelte +15 -0
- package/dist/scale/ScaleShapeIdentity.svelte.d.ts +4 -0
- package/dist/scale/ScaleShapeManual.svelte +15 -0
- package/dist/scale/ScaleShapeManual.svelte.d.ts +4 -0
- package/dist/scale/ScaleSizeArea.svelte +11 -0
- package/dist/scale/ScaleSizeArea.svelte.d.ts +4 -0
- package/dist/scale/ScaleSizeBinned.svelte +14 -0
- package/dist/scale/ScaleSizeBinned.svelte.d.ts +4 -0
- package/dist/scale/ScaleSizeBinnedArea.svelte +14 -0
- package/dist/scale/ScaleSizeBinnedArea.svelte.d.ts +4 -0
- package/dist/scale/ScaleSizeContinuous.svelte +14 -0
- package/dist/scale/ScaleSizeContinuous.svelte.d.ts +4 -0
- package/dist/scale/ScaleSizeDate.svelte +15 -0
- package/dist/scale/ScaleSizeDate.svelte.d.ts +5 -0
- package/dist/scale/ScaleSizeDatetime.svelte +15 -0
- package/dist/scale/ScaleSizeDatetime.svelte.d.ts +5 -0
- package/dist/scale/ScaleSizeDiscrete.svelte +14 -0
- package/dist/scale/ScaleSizeDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleSizeIdentity.svelte +14 -0
- package/dist/scale/ScaleSizeIdentity.svelte.d.ts +4 -0
- package/dist/scale/ScaleSizeManual.svelte +14 -0
- package/dist/scale/ScaleSizeManual.svelte.d.ts +4 -0
- package/dist/scale/ScaleXBinned.svelte +14 -0
- package/dist/scale/ScaleXBinned.svelte.d.ts +4 -0
- package/dist/scale/ScaleXContinuous.svelte +14 -0
- package/dist/scale/ScaleXContinuous.svelte.d.ts +4 -0
- package/dist/scale/ScaleXDate.svelte +12 -0
- package/dist/scale/ScaleXDate.svelte.d.ts +5 -0
- package/dist/scale/ScaleXDatetime.svelte +12 -0
- package/dist/scale/ScaleXDatetime.svelte.d.ts +5 -0
- package/dist/scale/ScaleXDiscrete.svelte +14 -0
- package/dist/scale/ScaleXDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleXLog10.svelte +14 -0
- package/dist/scale/ScaleXLog10.svelte.d.ts +4 -0
- package/dist/scale/ScaleXMonthDay.svelte +12 -0
- package/dist/scale/ScaleXMonthDay.svelte.d.ts +5 -0
- package/dist/scale/ScaleXReverse.svelte +15 -0
- package/dist/scale/ScaleXReverse.svelte.d.ts +4 -0
- package/dist/scale/ScaleXSqrt.svelte +14 -0
- package/dist/scale/ScaleXSqrt.svelte.d.ts +4 -0
- package/dist/scale/ScaleXTime.svelte +12 -0
- package/dist/scale/ScaleXTime.svelte.d.ts +5 -0
- package/dist/scale/ScaleYBinned.svelte +14 -0
- package/dist/scale/ScaleYBinned.svelte.d.ts +4 -0
- package/dist/scale/ScaleYContinuous.svelte +14 -0
- package/dist/scale/ScaleYContinuous.svelte.d.ts +4 -0
- package/dist/scale/ScaleYDate.svelte +12 -0
- package/dist/scale/ScaleYDate.svelte.d.ts +5 -0
- package/dist/scale/ScaleYDatetime.svelte +12 -0
- package/dist/scale/ScaleYDatetime.svelte.d.ts +5 -0
- package/dist/scale/ScaleYDiscrete.svelte +14 -0
- package/dist/scale/ScaleYDiscrete.svelte.d.ts +4 -0
- package/dist/scale/ScaleYLog10.svelte +14 -0
- package/dist/scale/ScaleYLog10.svelte.d.ts +4 -0
- package/dist/scale/ScaleYMonthDay.svelte +12 -0
- package/dist/scale/ScaleYMonthDay.svelte.d.ts +5 -0
- package/dist/scale/ScaleYReverse.svelte +15 -0
- package/dist/scale/ScaleYReverse.svelte.d.ts +4 -0
- package/dist/scale/ScaleYSqrt.svelte +14 -0
- package/dist/scale/ScaleYSqrt.svelte.d.ts +4 -0
- package/dist/scale/ScaleYTime.svelte +12 -0
- package/dist/scale/ScaleYTime.svelte.d.ts +5 -0
- package/dist/scene/Axis.svelte +159 -0
- package/dist/scene/Axis.svelte.d.ts +12 -0
- package/dist/scene/Batch.svelte +252 -0
- package/dist/scene/Batch.svelte.d.ts +23 -0
- package/dist/scene/InteractionOverlay.svelte +402 -0
- package/dist/scene/InteractionOverlay.svelte.d.ts +44 -0
- package/dist/scene/Legend.svelte +278 -0
- package/dist/scene/Legend.svelte.d.ts +8 -0
- package/dist/scene/MarkStrata.svelte +129 -0
- package/dist/scene/MarkStrata.svelte.d.ts +15 -0
- package/dist/scene/SceneOverlays.svelte +118 -0
- package/dist/scene/SceneOverlays.svelte.d.ts +49 -0
- package/dist/scene/SceneView.svelte +478 -0
- package/dist/scene/SceneView.svelte.d.ts +32 -0
- package/dist/scene/batch-presentation.svelte.d.ts +111 -0
- package/dist/scene/batch-presentation.svelte.js +207 -0
- package/dist/scene/geometry.d.ts +2 -0
- package/dist/scene/geometry.js +3 -0
- package/dist/scene/stratum-paint.d.ts +25 -0
- package/dist/scene/stratum-paint.js +40 -0
- package/dist/selection/selection-state.svelte.d.ts +23 -0
- package/dist/selection/selection-state.svelte.js +73 -0
- package/dist/selection/selection.d.ts +1 -0
- package/dist/selection/selection.js +2 -0
- package/dist/surface/CaptureSurface.svelte +109 -0
- package/dist/surface/CaptureSurface.svelte.d.ts +27 -0
- package/dist/surface/area-brush.d.ts +48 -0
- package/dist/surface/area-brush.js +44 -0
- package/dist/surface/brush-finish.d.ts +49 -0
- package/dist/surface/brush-finish.js +44 -0
- package/dist/surface/keyboard.d.ts +97 -0
- package/dist/surface/keyboard.js +105 -0
- package/dist/surface/pointer.d.ts +241 -0
- package/dist/surface/pointer.js +179 -0
- package/dist/surface/surface-description.d.ts +10 -0
- package/dist/surface/surface-description.js +11 -0
- package/dist/surface/surface-handlers.svelte.d.ts +53 -0
- package/dist/surface/surface-handlers.svelte.js +418 -0
- package/dist/surface/surface-state.svelte.d.ts +90 -0
- package/dist/surface/surface-state.svelte.js +161 -0
- package/dist/theme/Theme.svelte +27 -0
- package/dist/theme/Theme.svelte.d.ts +23 -0
- package/dist/theme/ThemeBase.svelte +13 -0
- package/dist/theme/ThemeBase.svelte.d.ts +8 -0
- package/dist/theme/ThemeBw.svelte +13 -0
- package/dist/theme/ThemeBw.svelte.d.ts +8 -0
- package/dist/theme/ThemeClassic.svelte +13 -0
- package/dist/theme/ThemeClassic.svelte.d.ts +8 -0
- package/dist/theme/ThemeClean.svelte +13 -0
- package/dist/theme/ThemeClean.svelte.d.ts +8 -0
- package/dist/theme/ThemeDark.svelte +13 -0
- package/dist/theme/ThemeDark.svelte.d.ts +8 -0
- package/dist/theme/ThemeDefault.svelte +13 -0
- package/dist/theme/ThemeDefault.svelte.d.ts +8 -0
- package/dist/theme/ThemeEconomist.svelte +13 -0
- package/dist/theme/ThemeEconomist.svelte.d.ts +8 -0
- package/dist/theme/ThemeEconomistwhite.svelte +13 -0
- package/dist/theme/ThemeEconomistwhite.svelte.d.ts +8 -0
- package/dist/theme/ThemeFew.svelte +13 -0
- package/dist/theme/ThemeFew.svelte.d.ts +8 -0
- package/dist/theme/ThemeFivethirtyeight.svelte +14 -0
- package/dist/theme/ThemeFivethirtyeight.svelte.d.ts +9 -0
- package/dist/theme/ThemeGgplot2.svelte +13 -0
- package/dist/theme/ThemeGgplot2.svelte.d.ts +8 -0
- package/dist/theme/ThemeGray.svelte +13 -0
- package/dist/theme/ThemeGray.svelte.d.ts +8 -0
- package/dist/theme/ThemeGrey.svelte +13 -0
- package/dist/theme/ThemeGrey.svelte.d.ts +8 -0
- package/dist/theme/ThemeHc.svelte +13 -0
- package/dist/theme/ThemeHc.svelte.d.ts +8 -0
- package/dist/theme/ThemeHcdark.svelte +13 -0
- package/dist/theme/ThemeHcdark.svelte.d.ts +8 -0
- package/dist/theme/ThemeHrbr.svelte +13 -0
- package/dist/theme/ThemeHrbr.svelte.d.ts +8 -0
- package/dist/theme/ThemeIgray.svelte +13 -0
- package/dist/theme/ThemeIgray.svelte.d.ts +8 -0
- package/dist/theme/ThemeLight.svelte +13 -0
- package/dist/theme/ThemeLight.svelte.d.ts +8 -0
- package/dist/theme/ThemeLinedraw.svelte +13 -0
- package/dist/theme/ThemeLinedraw.svelte.d.ts +8 -0
- package/dist/theme/ThemeMap.svelte +13 -0
- package/dist/theme/ThemeMap.svelte.d.ts +8 -0
- package/dist/theme/ThemeMinimal.svelte +13 -0
- package/dist/theme/ThemeMinimal.svelte.d.ts +8 -0
- package/dist/theme/ThemePander.svelte +13 -0
- package/dist/theme/ThemePander.svelte.d.ts +8 -0
- package/dist/theme/ThemeSolarized.svelte +13 -0
- package/dist/theme/ThemeSolarized.svelte.d.ts +8 -0
- package/dist/theme/ThemeSolarized2.svelte +13 -0
- package/dist/theme/ThemeSolarized2.svelte.d.ts +8 -0
- package/dist/theme/ThemeSolarized2dark.svelte +13 -0
- package/dist/theme/ThemeSolarized2dark.svelte.d.ts +8 -0
- package/dist/theme/ThemeSolarizeddark.svelte +14 -0
- package/dist/theme/ThemeSolarizeddark.svelte.d.ts +9 -0
- package/dist/theme/ThemeSolid.svelte +13 -0
- package/dist/theme/ThemeSolid.svelte.d.ts +8 -0
- package/dist/theme/ThemeStata.svelte +13 -0
- package/dist/theme/ThemeStata.svelte.d.ts +8 -0
- package/dist/theme/ThemeStatas1color.svelte +13 -0
- package/dist/theme/ThemeStatas1color.svelte.d.ts +8 -0
- package/dist/theme/ThemeTest.svelte +14 -0
- package/dist/theme/ThemeTest.svelte.d.ts +9 -0
- package/dist/theme/ThemeTufte.svelte +13 -0
- package/dist/theme/ThemeTufte.svelte.d.ts +8 -0
- package/dist/theme/ThemeVoid.svelte +14 -0
- package/dist/theme/ThemeVoid.svelte.d.ts +9 -0
- package/dist/theme/ThemeWsj.svelte +13 -0
- package/dist/theme/ThemeWsj.svelte.d.ts +8 -0
- package/dist/theme/factory.svelte.d.ts +36 -0
- package/dist/theme/factory.svelte.js +100 -0
- package/dist/zoom/zoom-state.svelte.d.ts +44 -0
- package/dist/zoom/zoom-state.svelte.js +121 -0
- package/dist/zoom/zoom.d.ts +1 -0
- package/dist/zoom/zoom.js +2 -0
- package/package.json +83 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plot runtime: container sizing, model production (runPipeline + scale gate),
|
|
3
|
+
* strata plan, paint ledger, and readiness. Extracted from GGPlot for S1.
|
|
4
|
+
*
|
|
5
|
+
* Effects register at construction (#627)
|
|
6
|
+
* so relative order vs host effects is preserved.
|
|
7
|
+
*/
|
|
8
|
+
import { installCandidates, planStrata, registerBasic, runPipeline } from "@ggts-sh/core";
|
|
9
|
+
import { untrack } from "svelte";
|
|
10
|
+
// GGPlot default registration contract (#1420): basic geoms/stats +
|
|
11
|
+
// interaction candidates (#1421), so identity charts and hit-testing work out
|
|
12
|
+
// of the box. Temporal scale children self-register full temporal support;
|
|
13
|
+
// spec-driven apps call registerAll(). Calls (not the /render side effect)
|
|
14
|
+
// keep one @ggts-sh/core entry in dev-server prebundles — a /render + barrel
|
|
15
|
+
// split would fork the registries.
|
|
16
|
+
registerBasic();
|
|
17
|
+
installCandidates();
|
|
18
|
+
import { isContainerWidthProp, resolvePlotSize } from "../assembly/layout.js";
|
|
19
|
+
import { createPaintLedger, isPlotReady } from "./paint.js";
|
|
20
|
+
/**
|
|
21
|
+
* Create the plot runtime. Construction registers ResizeObserver, model
|
|
22
|
+
* dispose/onrender, and clientFlush effects (#627). Dep getters must not be
|
|
23
|
+
* invoked during construction for construction-time deriveds.
|
|
24
|
+
*/
|
|
25
|
+
export function createPlotRuntime(deps) {
|
|
26
|
+
// ------------------------------------------------- container width (RO)
|
|
27
|
+
let containerWidth = $state(null);
|
|
28
|
+
let containerHasPositiveWidth = $state(false);
|
|
29
|
+
$effect(() => {
|
|
30
|
+
// No-op cleanup keeps every code path returning a teardown (consistent-return).
|
|
31
|
+
if (!isContainerWidthProp(deps.widthProp()) || deps.root() === null)
|
|
32
|
+
return () => { };
|
|
33
|
+
const el = deps.root();
|
|
34
|
+
let frame = 0;
|
|
35
|
+
const commitWidth = (nextWidth) => {
|
|
36
|
+
// Commit readiness and the measured model width in one reactive turn so
|
|
37
|
+
// data-gg-ready does not flip true on a stale pre-measure fallback.
|
|
38
|
+
containerHasPositiveWidth = nextWidth > 0;
|
|
39
|
+
if (nextWidth > 0)
|
|
40
|
+
containerWidth = nextWidth;
|
|
41
|
+
};
|
|
42
|
+
// Synchronous first measure: do not wait a frame (or a late RO delivery)
|
|
43
|
+
// when the host already has a laid-out width.
|
|
44
|
+
const initial = Math.round(el.getBoundingClientRect().width);
|
|
45
|
+
if (initial > 0)
|
|
46
|
+
commitWidth(initial);
|
|
47
|
+
const observer = new ResizeObserver((entries) => {
|
|
48
|
+
// Debounce resize storms through rAF; the pipeline's run-id gate
|
|
49
|
+
// guarantees only the newest result commits regardless.
|
|
50
|
+
const nextWidth = Math.round(entries[0]?.contentRect.width ?? 0);
|
|
51
|
+
cancelAnimationFrame(frame);
|
|
52
|
+
frame = requestAnimationFrame(() => {
|
|
53
|
+
commitWidth(nextWidth);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
observer.observe(el);
|
|
57
|
+
return () => {
|
|
58
|
+
cancelAnimationFrame(frame);
|
|
59
|
+
observer.disconnect();
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
const resolvedSize = $derived(resolvePlotSize({
|
|
63
|
+
width: deps.widthProp(),
|
|
64
|
+
height: deps.heightProp(),
|
|
65
|
+
containerWidth,
|
|
66
|
+
assembledWidth: deps.assembled()?.width,
|
|
67
|
+
assembledHeight: deps.assembled()?.height,
|
|
68
|
+
}));
|
|
69
|
+
const resolvedWidth = $derived(resolvedSize.width);
|
|
70
|
+
const resolvedHeight = $derived(resolvedSize.height);
|
|
71
|
+
// Authoritative committed scale state: a plain non-reactive box + run-id
|
|
72
|
+
// gate. Committing only monotonically newer runs keeps stale results from
|
|
73
|
+
// clobbering the value-stable color assignments. scaleEpoch exists so
|
|
74
|
+
// resetScales() can force a re-run after clearing the box.
|
|
75
|
+
const scaleBox = { runId: -1, scales: undefined };
|
|
76
|
+
let scaleEpoch = $state(0);
|
|
77
|
+
function resolveModel() {
|
|
78
|
+
void scaleEpoch;
|
|
79
|
+
const effectiveSpec = deps.effectiveSpec();
|
|
80
|
+
if (effectiveSpec === null)
|
|
81
|
+
return null;
|
|
82
|
+
const rowFilters = deps.effectiveLegendFilters();
|
|
83
|
+
const assembled = deps.assembled();
|
|
84
|
+
let baselineDomains;
|
|
85
|
+
let effectivePrevScales = scaleBox.scales;
|
|
86
|
+
if (deps.effectiveZoomDomains() !== null && assembled !== null) {
|
|
87
|
+
// Scale limits now censor before stats. Train the unzoomed spec in a
|
|
88
|
+
// separate pure run so Reset keeps the latest natural data/stat domain;
|
|
89
|
+
// effective zoom rendering still re-stats only the limited subset.
|
|
90
|
+
const baseline = runPipeline(assembled, {
|
|
91
|
+
width: resolvedWidth,
|
|
92
|
+
height: resolvedHeight,
|
|
93
|
+
...(scaleBox.scales !== undefined && { prevScales: scaleBox.scales }),
|
|
94
|
+
...(rowFilters.length > 0 && { rowFilters }),
|
|
95
|
+
});
|
|
96
|
+
baselineDomains = baseline.domains.effective;
|
|
97
|
+
effectivePrevScales = baseline.scales.state;
|
|
98
|
+
baseline.dispose();
|
|
99
|
+
}
|
|
100
|
+
const m = runPipeline(effectiveSpec, {
|
|
101
|
+
width: resolvedWidth,
|
|
102
|
+
height: resolvedHeight,
|
|
103
|
+
...(effectivePrevScales !== undefined && { prevScales: effectivePrevScales }),
|
|
104
|
+
...(baselineDomains !== undefined && { baselineDomains }),
|
|
105
|
+
...(rowFilters.length > 0 && { rowFilters }),
|
|
106
|
+
});
|
|
107
|
+
if (m.runId > scaleBox.runId) {
|
|
108
|
+
scaleBox.runId = m.runId;
|
|
109
|
+
scaleBox.scales = m.scales.state;
|
|
110
|
+
}
|
|
111
|
+
return m;
|
|
112
|
+
}
|
|
113
|
+
const model = $derived.by(resolveModel);
|
|
114
|
+
// SSR: one lazy memo for the whole server pass (#1328). Recomputing on every
|
|
115
|
+
// model/strata/hasCanvas read re-ran the full pipeline ~20× per render.
|
|
116
|
+
// Client keeps $derived caching.
|
|
117
|
+
//
|
|
118
|
+
// Never latch a null model: Svelte's one-pass SSR can evaluate plot getters
|
|
119
|
+
// before declaration children register (same reason as ssrSafeDerived). An
|
|
120
|
+
// early null must not freeze a blank chart for the rest of the pass; only a
|
|
121
|
+
// non-null result is memoized. Memo is instance-local (one runtime = one
|
|
122
|
+
// SSR render) and cleared by resetScales.
|
|
123
|
+
let ssrModel;
|
|
124
|
+
let ssrStrata;
|
|
125
|
+
const currentModel = () => {
|
|
126
|
+
if (typeof window !== "undefined")
|
|
127
|
+
return model;
|
|
128
|
+
if (ssrModel !== undefined)
|
|
129
|
+
return ssrModel;
|
|
130
|
+
const next = resolveModel();
|
|
131
|
+
if (next !== null)
|
|
132
|
+
ssrModel = next;
|
|
133
|
+
return next;
|
|
134
|
+
};
|
|
135
|
+
// ---------------------------------------------------------- strata plan
|
|
136
|
+
const resolveStrata = () => {
|
|
137
|
+
const current = currentModel();
|
|
138
|
+
return current === null ? [] : planStrata(current.scene, current.layerBackends);
|
|
139
|
+
};
|
|
140
|
+
const strata = $derived(resolveStrata());
|
|
141
|
+
const currentStrata = () => {
|
|
142
|
+
if (typeof window !== "undefined")
|
|
143
|
+
return strata;
|
|
144
|
+
// Freeze strata only once the model memo is set — otherwise an early empty
|
|
145
|
+
// plan would stick after children register and model resolves.
|
|
146
|
+
if (ssrStrata !== undefined)
|
|
147
|
+
return ssrStrata;
|
|
148
|
+
const next = resolveStrata();
|
|
149
|
+
if (ssrModel !== undefined)
|
|
150
|
+
ssrStrata = next;
|
|
151
|
+
return next;
|
|
152
|
+
};
|
|
153
|
+
const canvasCount = $derived(currentStrata().filter((s) => s.backend === "canvas").length);
|
|
154
|
+
const hasCanvas = $derived(canvasCount > 0);
|
|
155
|
+
// Canvas first-paint tracking: data-gg-ready waits for every distinct
|
|
156
|
+
// canvas stratum of the CURRENT model to have painted at least once.
|
|
157
|
+
// paintEpoch bumps so readiness re-derives when the non-reactive ledger
|
|
158
|
+
// mutates (ledger itself must not be $state — set mutations are invisible).
|
|
159
|
+
const paintLedger = createPaintLedger();
|
|
160
|
+
let paintEpoch = $state(0);
|
|
161
|
+
function notifyPainted(runId, stratumKey) {
|
|
162
|
+
paintLedger.notify(runId, stratumKey);
|
|
163
|
+
paintEpoch += 1;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Clear the committed scale state (grow-mode recovery: dropped categories
|
|
167
|
+
* lose their reserved colors) and any brush zoom. The next render trains
|
|
168
|
+
* scales fresh from the current data.
|
|
169
|
+
*/
|
|
170
|
+
function resetScales() {
|
|
171
|
+
scaleBox.runId = -1;
|
|
172
|
+
scaleBox.scales = undefined;
|
|
173
|
+
ssrModel = undefined;
|
|
174
|
+
ssrStrata = undefined;
|
|
175
|
+
deps.resetZoom();
|
|
176
|
+
scaleEpoch++;
|
|
177
|
+
}
|
|
178
|
+
// Readiness: clientFlush flips true on first client effect flush (SSR stays false).
|
|
179
|
+
let clientFlush = $state(false);
|
|
180
|
+
const ready = $derived.by(() => {
|
|
181
|
+
void paintEpoch;
|
|
182
|
+
if (!clientFlush)
|
|
183
|
+
return false;
|
|
184
|
+
return isPlotReady({
|
|
185
|
+
hasModel: model !== null,
|
|
186
|
+
widthMode: isContainerWidthProp(deps.widthProp()) ? "container" : "fixed",
|
|
187
|
+
containerHasPositiveWidth,
|
|
188
|
+
hasCanvas,
|
|
189
|
+
paintComplete: model !== null && paintLedger.isComplete(model.runId, canvasCount),
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
// Memory ownership: dispose the previous model once the DOM has moved on
|
|
193
|
+
// (effect cleanup runs post-flush), and the last model on unmount.
|
|
194
|
+
$effect(() => {
|
|
195
|
+
const m = model;
|
|
196
|
+
return () => m?.dispose();
|
|
197
|
+
});
|
|
198
|
+
$effect(() => {
|
|
199
|
+
const m = model;
|
|
200
|
+
const assembled = deps.assembled();
|
|
201
|
+
if (m !== null && assembled !== null)
|
|
202
|
+
untrack(() => deps.onrender()?.(m, assembled));
|
|
203
|
+
});
|
|
204
|
+
// clientFlush via $effect: never runs during SSR → prerender stays
|
|
205
|
+
// data-gg-ready="false" until the first client committed flush (decision 0009)
|
|
206
|
+
$effect(() => {
|
|
207
|
+
clientFlush = true;
|
|
208
|
+
});
|
|
209
|
+
return {
|
|
210
|
+
get model() {
|
|
211
|
+
return currentModel();
|
|
212
|
+
},
|
|
213
|
+
get resolvedWidth() {
|
|
214
|
+
return resolvedWidth;
|
|
215
|
+
},
|
|
216
|
+
get resolvedHeight() {
|
|
217
|
+
return resolvedHeight;
|
|
218
|
+
},
|
|
219
|
+
get strata() {
|
|
220
|
+
return currentStrata();
|
|
221
|
+
},
|
|
222
|
+
get hasCanvas() {
|
|
223
|
+
return typeof window === "undefined"
|
|
224
|
+
? currentStrata().some((s) => s.backend === "canvas")
|
|
225
|
+
: hasCanvas;
|
|
226
|
+
},
|
|
227
|
+
get ready() {
|
|
228
|
+
return ready;
|
|
229
|
+
},
|
|
230
|
+
notifyPainted,
|
|
231
|
+
resetScales,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type BatchInteractionMask, type CandidateFacts, type RenderModel } from "@ggts-sh/core";
|
|
2
|
+
import type { PlotInteractionInterval } from "../interaction/interaction.js";
|
|
3
|
+
import type { IntervalConsumptionCandidate } from "../interval/consumption.js";
|
|
4
|
+
import { type PresentationAnchor, type PresentationInspectionFocus } from "../selection/selection.js";
|
|
5
|
+
export type SemanticCandidateProjectionDeps = {
|
|
6
|
+
model: () => RenderModel | null;
|
|
7
|
+
candidateSemanticKeys: (candidate: CandidateFacts) => readonly PropertyKey[];
|
|
8
|
+
selectedKeys: () => readonly PropertyKey[];
|
|
9
|
+
intervalKeys: () => readonly PropertyKey[];
|
|
10
|
+
intervals: () => readonly PlotInteractionInterval<PropertyKey>[];
|
|
11
|
+
emphasisKeys: () => readonly PropertyKey[];
|
|
12
|
+
/**
|
|
13
|
+
* When true, rect inspection builds sibling-mute masks (#386 opt-in).
|
|
14
|
+
* Default off — tooltip-only hover (#633).
|
|
15
|
+
*/
|
|
16
|
+
muteSiblingsOnInspect?: () => boolean;
|
|
17
|
+
inspectionFocus: () => PresentationInspectionFocus | null;
|
|
18
|
+
};
|
|
19
|
+
export type SemanticCandidateProjection = {
|
|
20
|
+
readonly selectedAnchors: PresentationAnchor[];
|
|
21
|
+
readonly emphasizedAnchors: PresentationAnchor[];
|
|
22
|
+
readonly interactionMasks: readonly (BatchInteractionMask | null)[];
|
|
23
|
+
readonly intervalConsumptionCandidates: readonly IntervalConsumptionCandidate<PropertyKey>[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Own the one semantic walk over CandidateStore and all presentation shapes
|
|
27
|
+
* derived from it. Counts gate the walk so key-only changes reuse projection.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createSemanticCandidateProjection(deps: SemanticCandidateProjectionDeps): SemanticCandidateProjection;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { buildInteractionMasks, buildPrimitiveInteractionMasks, } from "@ggts-sh/core";
|
|
2
|
+
import { anchorsFromCandidateKeys, applyEmphasisRingDensityGate, collectCandidates, mergePresentationFocusKeys, } from "../selection/selection.js";
|
|
3
|
+
/** Stable empty masks — avoid fresh `[]` identity churn on tooltip-only hover. */
|
|
4
|
+
const EMPTY_INTERACTION_MASKS = Object.freeze([]);
|
|
5
|
+
/** OR two mask projections per batch (focused if either side is focused). */
|
|
6
|
+
function unionInteractionMasks(left, right) {
|
|
7
|
+
const length = Math.max(left.length, right.length);
|
|
8
|
+
const out = [];
|
|
9
|
+
for (let i = 0; i < length; i++) {
|
|
10
|
+
const a = left[i] ?? null;
|
|
11
|
+
const b = right[i] ?? null;
|
|
12
|
+
if (a === null) {
|
|
13
|
+
out.push(b);
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (b === null) {
|
|
17
|
+
out.push(a);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const count = Math.max(a.primitiveCount, b.primitiveCount);
|
|
21
|
+
const values = new Uint8Array(count);
|
|
22
|
+
let focusedCount = 0;
|
|
23
|
+
for (let p = 0; p < count; p++) {
|
|
24
|
+
const focused = (p < a.primitiveCount && a.isFocused(p)) || (p < b.primitiveCount && b.isFocused(p));
|
|
25
|
+
if (focused) {
|
|
26
|
+
values[p] = 1;
|
|
27
|
+
focusedCount++;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
out.push(Object.freeze({
|
|
31
|
+
primitiveCount: count,
|
|
32
|
+
focusedCount,
|
|
33
|
+
isFocused(primitiveIndex) {
|
|
34
|
+
return values[primitiveIndex] === 1;
|
|
35
|
+
},
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
return Object.freeze(out);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Own the one semantic walk over CandidateStore and all presentation shapes
|
|
42
|
+
* derived from it. Counts gate the walk so key-only changes reuse projection.
|
|
43
|
+
*/
|
|
44
|
+
export function createSemanticCandidateProjection(deps) {
|
|
45
|
+
const muteSiblingsOnInspect = $derived(deps.muteSiblingsOnInspect?.() === true);
|
|
46
|
+
const presentationFocusKeys = $derived(mergePresentationFocusKeys(deps.emphasisKeys(), deps.inspectionFocus(), {
|
|
47
|
+
muteSiblings: muteSiblingsOnInspect,
|
|
48
|
+
}));
|
|
49
|
+
const selectedKeyCount = $derived(deps.selectedKeys().length);
|
|
50
|
+
const emphasisKeyCount = $derived(deps.emphasisKeys().length);
|
|
51
|
+
const presentationFocusKeyCount = $derived(presentationFocusKeys.length);
|
|
52
|
+
const needIntervalConsumptionWalk = $derived(deps.intervals().length > 0 && deps.intervals()[0]?.preset !== "union");
|
|
53
|
+
// Non-union interval keys consume this projection, so do not read them until
|
|
54
|
+
// the non-union gate has been handled.
|
|
55
|
+
const intervalKeyCount = $derived(deps.intervalKeys().length);
|
|
56
|
+
const sharedCandidateProjection = $derived.by(() => {
|
|
57
|
+
if (!needIntervalConsumptionWalk &&
|
|
58
|
+
selectedKeyCount + intervalKeyCount + emphasisKeyCount + presentationFocusKeyCount === 0) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
const model = deps.model();
|
|
62
|
+
if (model === null)
|
|
63
|
+
return [];
|
|
64
|
+
return collectCandidates(model.candidates, (candidate) => {
|
|
65
|
+
const batch = model.scene.batches[candidate.batchIndex];
|
|
66
|
+
const width = batch?.kind === "glyphs" ? batch.boxWidths?.[candidate.primitiveIndex] : undefined;
|
|
67
|
+
const height = batch?.kind === "glyphs" ? batch.boxHeights?.[candidate.primitiveIndex] : undefined;
|
|
68
|
+
const textAnchor = batch?.kind === "glyphs" ? batch.anchor : undefined;
|
|
69
|
+
return {
|
|
70
|
+
x: candidate.x,
|
|
71
|
+
y: candidate.y,
|
|
72
|
+
kind: candidate.kind,
|
|
73
|
+
batchIndex: candidate.batchIndex,
|
|
74
|
+
primitiveIndex: candidate.primitiveIndex,
|
|
75
|
+
panelId: candidate.panelId,
|
|
76
|
+
keys: deps.candidateSemanticKeys(candidate),
|
|
77
|
+
...(candidate.xValue !== undefined && { xValue: candidate.xValue }),
|
|
78
|
+
...(candidate.yValue !== undefined && { yValue: candidate.yValue }),
|
|
79
|
+
...(width !== undefined &&
|
|
80
|
+
height !== undefined && {
|
|
81
|
+
width,
|
|
82
|
+
height,
|
|
83
|
+
...(textAnchor !== undefined && { textAnchor }),
|
|
84
|
+
}),
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
const intervalConsumptionCandidates = $derived.by(() => needIntervalConsumptionWalk ? sharedCandidateProjection : []);
|
|
89
|
+
// Selection: point rings stay on even for large sets (D2).
|
|
90
|
+
const selectedAnchors = $derived(anchorsFromCandidateKeys(sharedCandidateProjection, [
|
|
91
|
+
...new Set([...deps.selectedKeys(), ...deps.intervalKeys()]),
|
|
92
|
+
]));
|
|
93
|
+
// Legend/controller emphasis: density-gate rings so dense point series mute
|
|
94
|
+
// without a dashed-ring field; paths/rects already use chrome "none".
|
|
95
|
+
const emphasizedAnchors = $derived(applyEmphasisRingDensityGate(anchorsFromCandidateKeys(sharedCandidateProjection, deps.emphasisKeys())));
|
|
96
|
+
const interactionMasks = $derived.by(() => {
|
|
97
|
+
const model = deps.model();
|
|
98
|
+
if (model === null)
|
|
99
|
+
return EMPTY_INTERACTION_MASKS;
|
|
100
|
+
const focus = deps.inspectionFocus();
|
|
101
|
+
// Rect inspection primitives: muteSiblings opt-in, or layer under active
|
|
102
|
+
// legend/controller emphasis so the seed bar stays focused (#386 / #633).
|
|
103
|
+
const applyRectInspectionMask = muteSiblingsOnInspect || emphasisKeyCount > 0;
|
|
104
|
+
const rectPrimitives = applyRectInspectionMask &&
|
|
105
|
+
focus?.kind === "rects" &&
|
|
106
|
+
focus.primitives !== undefined &&
|
|
107
|
+
focus.primitives.length > 0
|
|
108
|
+
? focus.primitives
|
|
109
|
+
: null;
|
|
110
|
+
let keyMasks = null;
|
|
111
|
+
if (presentationFocusKeys.length > 0) {
|
|
112
|
+
keyMasks = buildInteractionMasks(model.scene.batches, presentationFocusKeys, sharedCandidateProjection);
|
|
113
|
+
}
|
|
114
|
+
// Keyless rect inspection: layer seed primitives so legend/controller
|
|
115
|
+
// emphasis keys do not suppress the hovered bar's de-emphasis (#386).
|
|
116
|
+
if (rectPrimitives === null)
|
|
117
|
+
return keyMasks ?? EMPTY_INTERACTION_MASKS;
|
|
118
|
+
const primitiveMasks = buildPrimitiveInteractionMasks(model.scene.batches, rectPrimitives);
|
|
119
|
+
if (keyMasks === null)
|
|
120
|
+
return primitiveMasks;
|
|
121
|
+
return unionInteractionMasks(keyMasks, primitiveMasks);
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
get selectedAnchors() {
|
|
125
|
+
return selectedAnchors;
|
|
126
|
+
},
|
|
127
|
+
get emphasizedAnchors() {
|
|
128
|
+
return emphasizedAnchors;
|
|
129
|
+
},
|
|
130
|
+
get interactionMasks() {
|
|
131
|
+
return interactionMasks;
|
|
132
|
+
},
|
|
133
|
+
get intervalConsumptionCandidates() {
|
|
134
|
+
return intervalConsumptionCandidates;
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure data/spec identity epoch tokens for inspection reconcile.
|
|
3
|
+
*
|
|
4
|
+
* Host-owned source identity comes from semantic-source-identity.ts (or any
|
|
5
|
+
* stable id function). No runes.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* O(R) order fingerprint for plot data — row *references* and length, not
|
|
9
|
+
* deep cell values. In-place reverse bumps the token; in-place cell edits on
|
|
10
|
+
* the same row objects do not (hosts should replace rows/arrays for identity).
|
|
11
|
+
*
|
|
12
|
+
* Avoids the former O(R·F) `JSON.stringify` of every cell on each epoch read.
|
|
13
|
+
*/
|
|
14
|
+
export declare function dataContentOrderToken(data: unknown, sourceIdentity: (value: unknown) => string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Input bag for {@link dataIdentityEpochToken}. Built by the host (or
|
|
17
|
+
* {@link buildDataIdentityEpochInput}) so epoch construction stays pure.
|
|
18
|
+
*/
|
|
19
|
+
export type DataIdentityEpochTokenInput = {
|
|
20
|
+
readonly ready: boolean;
|
|
21
|
+
readonly dataToken: string;
|
|
22
|
+
readonly specToken: string;
|
|
23
|
+
readonly data: unknown;
|
|
24
|
+
readonly datasets: unknown;
|
|
25
|
+
readonly layers?: readonly {
|
|
26
|
+
readonly data?: unknown;
|
|
27
|
+
}[];
|
|
28
|
+
readonly sourceIdentity: (value: unknown) => string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Host-side assembly of {@link DataIdentityEpochTokenInput} from plot props.
|
|
32
|
+
*
|
|
33
|
+
* Pure: no runes, no assembled PortableSpec. Owns the markLayers-vs-layers-prop
|
|
34
|
+
* guard (#609), the ready-without-assembled rule, and the explicit-spec content
|
|
35
|
+
* pick (prop `data` is ignored when `spec` is an object — matches
|
|
36
|
+
* assemblePortableSpec).
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildDataIdentityEpochInput(input: {
|
|
39
|
+
readonly data: unknown;
|
|
40
|
+
readonly spec: unknown;
|
|
41
|
+
readonly layers: readonly {
|
|
42
|
+
readonly data?: unknown;
|
|
43
|
+
}[] | undefined;
|
|
44
|
+
readonly registryMarkLayers: readonly {
|
|
45
|
+
readonly data?: unknown;
|
|
46
|
+
}[];
|
|
47
|
+
readonly sourceIdentity: (value: unknown) => string;
|
|
48
|
+
}): DataIdentityEpochTokenInput;
|
|
49
|
+
/**
|
|
50
|
+
* Stable data/spec identity token for inspection reconcile epochs.
|
|
51
|
+
*
|
|
52
|
+
* Host supplies:
|
|
53
|
+
* - `dataToken` / `specToken` — WeakMap identity of the raw `data` / `spec` props
|
|
54
|
+
* - `data` / `datasets` — content to order-fingerprint (prefer **prop** values,
|
|
55
|
+
* not a freshly assembled PortableSpec shell, so theme/labs respecs do not
|
|
56
|
+
* force a re-walk)
|
|
57
|
+
* - `layers` — optional geom-child descriptors whose `data` must also bump the
|
|
58
|
+
* epoch when plot-level data/spec are absent (#609)
|
|
59
|
+
* - `sourceIdentity` — stable object ids for the O(R) order fingerprint
|
|
60
|
+
*
|
|
61
|
+
* Ready=false (no plot yet) → `"no-data"`. Complexity: O(R) over row refs,
|
|
62
|
+
* not O(R·F) deep cell serialization.
|
|
63
|
+
*/
|
|
64
|
+
export declare function dataIdentityEpochToken(input: DataIdentityEpochTokenInput): string;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure data/spec identity epoch tokens for inspection reconcile.
|
|
3
|
+
*
|
|
4
|
+
* Host-owned source identity comes from semantic-source-identity.ts (or any
|
|
5
|
+
* stable id function). No runes.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* O(R) order fingerprint for a row array — length + per-row source ids.
|
|
9
|
+
* Builds via `join` (one final string) rather than `token +=` growth (#1329).
|
|
10
|
+
*/
|
|
11
|
+
function rowRefOrderToken(rows, sourceIdentity) {
|
|
12
|
+
if (rows.length === 0)
|
|
13
|
+
return "v:0";
|
|
14
|
+
const parts = [`v:${String(rows.length)}`];
|
|
15
|
+
for (let index = 0; index < rows.length; index++)
|
|
16
|
+
parts.push(sourceIdentity(rows[index]));
|
|
17
|
+
return parts.join(":");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* O(R) order fingerprint for plot data — row *references* and length, not
|
|
21
|
+
* deep cell values. In-place reverse bumps the token; in-place cell edits on
|
|
22
|
+
* the same row objects do not (hosts should replace rows/arrays for identity).
|
|
23
|
+
*
|
|
24
|
+
* Avoids the former O(R·F) `JSON.stringify` of every cell on each epoch read.
|
|
25
|
+
*/
|
|
26
|
+
export function dataContentOrderToken(data, sourceIdentity) {
|
|
27
|
+
if (data === null || data === undefined)
|
|
28
|
+
return "null";
|
|
29
|
+
if (Array.isArray(data))
|
|
30
|
+
return rowRefOrderToken(data, sourceIdentity);
|
|
31
|
+
if (typeof data === "object")
|
|
32
|
+
return objectDataOrderToken(data, sourceIdentity);
|
|
33
|
+
if (typeof data === "string" || typeof data === "number" || typeof data === "boolean")
|
|
34
|
+
return `p:${String(data)}`;
|
|
35
|
+
if (typeof data === "bigint")
|
|
36
|
+
return `p:${data.toString()}`;
|
|
37
|
+
return `p:${sourceIdentity(data)}`;
|
|
38
|
+
}
|
|
39
|
+
function objectDataOrderToken(data, sourceIdentity) {
|
|
40
|
+
const record = data;
|
|
41
|
+
const fieldKeys = Object.keys(record);
|
|
42
|
+
// DataRef shapes only when single-key (matches packages/spec isDataRef).
|
|
43
|
+
// A bare column map may own a field named `values`/`columns` alongside
|
|
44
|
+
// other arrays and must not short-circuit (Codex P2).
|
|
45
|
+
if (fieldKeys.length === 1 && fieldKeys[0] === "values" && Array.isArray(record["values"])) {
|
|
46
|
+
return rowRefOrderToken(record["values"], sourceIdentity);
|
|
47
|
+
}
|
|
48
|
+
const columns = record["columns"];
|
|
49
|
+
if (fieldKeys.length === 1 &&
|
|
50
|
+
fieldKeys[0] === "columns" &&
|
|
51
|
+
columns !== null &&
|
|
52
|
+
typeof columns === "object" &&
|
|
53
|
+
!Array.isArray(columns))
|
|
54
|
+
return `c:${columnMapOrderToken(columns, sourceIdentity)}`;
|
|
55
|
+
if (fieldKeys.length === 1 && fieldKeys[0] === "name" && typeof record["name"] === "string")
|
|
56
|
+
return `n:${record["name"]}`;
|
|
57
|
+
// Bare column-oriented object (gg() wraps as { columns }) — fingerprint
|
|
58
|
+
// each field's array identity so in-place column replacement bumps epoch.
|
|
59
|
+
if (fieldKeys.length > 0 && fieldKeys.every((key) => Array.isArray(record[key])))
|
|
60
|
+
return `c:${columnMapOrderToken(record, sourceIdentity)}`;
|
|
61
|
+
return `o:${sourceIdentity(data)}`;
|
|
62
|
+
}
|
|
63
|
+
/** O(fields) fingerprint: each column array's identity (+ length), not cells. */
|
|
64
|
+
function columnMapOrderToken(columns, sourceIdentity) {
|
|
65
|
+
const keys = Object.keys(columns).toSorted();
|
|
66
|
+
let token = `${keys.length}`;
|
|
67
|
+
for (const key of keys) {
|
|
68
|
+
const column = columns[key];
|
|
69
|
+
token += `|${key}=${sourceIdentity(column)}`;
|
|
70
|
+
if (Array.isArray(column))
|
|
71
|
+
token += `@${column.length}`;
|
|
72
|
+
}
|
|
73
|
+
return token;
|
|
74
|
+
}
|
|
75
|
+
function datasetsOrderToken(datasets, sourceIdentity) {
|
|
76
|
+
if (datasets === null || datasets === undefined)
|
|
77
|
+
return "null";
|
|
78
|
+
if (typeof datasets !== "object")
|
|
79
|
+
return sourceIdentity(datasets);
|
|
80
|
+
const keys = Object.keys(datasets).toSorted();
|
|
81
|
+
let token = `d:${keys.length}`;
|
|
82
|
+
for (const key of keys) {
|
|
83
|
+
token += `|${key}=${dataContentOrderToken(datasets[key], sourceIdentity)}`;
|
|
84
|
+
}
|
|
85
|
+
return token;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* O(layers) fingerprint of geom-child / layer-local data props.
|
|
89
|
+
* Missing `layers` → `"null"` so legacy callers keep a stable suffix.
|
|
90
|
+
*/
|
|
91
|
+
function layersDataOrderToken(layers, sourceIdentity) {
|
|
92
|
+
if (layers === undefined)
|
|
93
|
+
return "null";
|
|
94
|
+
let token = `L:${layers.length}`;
|
|
95
|
+
for (let index = 0; index < layers.length; index++) {
|
|
96
|
+
token += `|${index}=${dataContentOrderToken(layers[index]?.data, sourceIdentity)}`;
|
|
97
|
+
}
|
|
98
|
+
return token;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Host-side assembly of {@link DataIdentityEpochTokenInput} from plot props.
|
|
102
|
+
*
|
|
103
|
+
* Pure: no runes, no assembled PortableSpec. Owns the markLayers-vs-layers-prop
|
|
104
|
+
* guard (#609), the ready-without-assembled rule, and the explicit-spec content
|
|
105
|
+
* pick (prop `data` is ignored when `spec` is an object — matches
|
|
106
|
+
* assemblePortableSpec).
|
|
107
|
+
*/
|
|
108
|
+
export function buildDataIdentityEpochInput(input) {
|
|
109
|
+
// MUST use markLayers when layers prop is absent: the widened Layer union
|
|
110
|
+
// has no `.data` at the top level, so reading registry.layers would silently
|
|
111
|
+
// drop layer-local data from the #609 epoch.
|
|
112
|
+
const layerDescriptors = input.layers === undefined
|
|
113
|
+
? input.registryMarkLayers
|
|
114
|
+
: input.layers.map((layer) => ({ data: layer.data }));
|
|
115
|
+
const ready = input.spec !== undefined || layerDescriptors.length > 0;
|
|
116
|
+
// assemblePortableSpec: explicit `spec` wins and ignores the data prop —
|
|
117
|
+
// fingerprint the rendered source only.
|
|
118
|
+
const contentData = input.spec !== undefined && typeof input.spec === "object"
|
|
119
|
+
? input.spec.data
|
|
120
|
+
: input.data;
|
|
121
|
+
const contentDatasets = input.spec !== undefined && typeof input.spec === "object"
|
|
122
|
+
? input.spec.datasets
|
|
123
|
+
: undefined;
|
|
124
|
+
return {
|
|
125
|
+
ready,
|
|
126
|
+
dataToken: input.sourceIdentity(input.data),
|
|
127
|
+
specToken: input.sourceIdentity(input.spec),
|
|
128
|
+
data: contentData ?? null,
|
|
129
|
+
datasets: contentDatasets ?? null,
|
|
130
|
+
layers: layerDescriptors,
|
|
131
|
+
sourceIdentity: input.sourceIdentity,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Stable data/spec identity token for inspection reconcile epochs.
|
|
136
|
+
*
|
|
137
|
+
* Host supplies:
|
|
138
|
+
* - `dataToken` / `specToken` — WeakMap identity of the raw `data` / `spec` props
|
|
139
|
+
* - `data` / `datasets` — content to order-fingerprint (prefer **prop** values,
|
|
140
|
+
* not a freshly assembled PortableSpec shell, so theme/labs respecs do not
|
|
141
|
+
* force a re-walk)
|
|
142
|
+
* - `layers` — optional geom-child descriptors whose `data` must also bump the
|
|
143
|
+
* epoch when plot-level data/spec are absent (#609)
|
|
144
|
+
* - `sourceIdentity` — stable object ids for the O(R) order fingerprint
|
|
145
|
+
*
|
|
146
|
+
* Ready=false (no plot yet) → `"no-data"`. Complexity: O(R) over row refs,
|
|
147
|
+
* not O(R·F) deep cell serialization.
|
|
148
|
+
*/
|
|
149
|
+
export function dataIdentityEpochToken(input) {
|
|
150
|
+
if (!input.ready)
|
|
151
|
+
return "no-data";
|
|
152
|
+
return `${input.dataToken}:${input.specToken}:${dataContentOrderToken(input.data, input.sourceIdentity)}:${datasetsOrderToken(input.datasets, input.sourceIdentity)}:${layersDataOrderToken(input.layers, input.sourceIdentity)}`;
|
|
153
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type CandidateKeysProjectionCache = {
|
|
2
|
+
/** Repeat lookup for the same candidate id. */
|
|
3
|
+
readonly byCandidate: Map<number, PropertyKey[]>;
|
|
4
|
+
/** Expanded lineage membership (rows + Set) once per lineage id. */
|
|
5
|
+
readonly lineageRows: Map<number, {
|
|
6
|
+
rows: readonly number[];
|
|
7
|
+
set: ReadonlySet<number>;
|
|
8
|
+
}>;
|
|
9
|
+
/** Key bag for a membership identity string. */
|
|
10
|
+
readonly byMembership: Map<string, PropertyKey[]>;
|
|
11
|
+
};
|
|
12
|
+
export declare function createCandidateKeysProjectionCache(): CandidateKeysProjectionCache;
|
|
13
|
+
export type CandidateKeysMembershipRef = {
|
|
14
|
+
readonly id: number;
|
|
15
|
+
readonly lineage: number;
|
|
16
|
+
readonly rowIndex: number | null;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Resolve semantic keys for one candidate via the epoch cache.
|
|
20
|
+
* `lineageKeys` is invoked at most once per distinct lineage id in the cache.
|
|
21
|
+
*/
|
|
22
|
+
export declare function candidateSemanticKeysFromCache(candidate: CandidateKeysMembershipRef, cache: CandidateKeysProjectionCache, lineageKeys: (lineageId: number) => Iterable<number>, keyForRow: (rowIndex: number) => PropertyKey | null): PropertyKey[];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Epoch-local cache for projecting candidates into semantic key bags.
|
|
3
|
+
* Smooth eval-grid marks share one lineage of L rows across C candidates —
|
|
4
|
+
* membership is computed once per (lineage, extra-row) bag, not once per mark.
|
|
5
|
+
*/
|
|
6
|
+
import { uniqueKeysFromRowIndexes } from "../selection/selection.js";
|
|
7
|
+
export function createCandidateKeysProjectionCache() {
|
|
8
|
+
return {
|
|
9
|
+
byCandidate: new Map(),
|
|
10
|
+
lineageRows: new Map(),
|
|
11
|
+
byMembership: new Map(),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve semantic keys for one candidate via the epoch cache.
|
|
16
|
+
* `lineageKeys` is invoked at most once per distinct lineage id in the cache.
|
|
17
|
+
*/
|
|
18
|
+
export function candidateSemanticKeysFromCache(candidate, cache, lineageKeys, keyForRow) {
|
|
19
|
+
const hit = cache.byCandidate.get(candidate.id);
|
|
20
|
+
if (hit !== undefined)
|
|
21
|
+
return hit;
|
|
22
|
+
let bag = cache.lineageRows.get(candidate.lineage);
|
|
23
|
+
if (bag === undefined) {
|
|
24
|
+
const rows = [...lineageKeys(candidate.lineage)];
|
|
25
|
+
bag = { rows, set: new Set(rows) };
|
|
26
|
+
cache.lineageRows.set(candidate.lineage, bag);
|
|
27
|
+
}
|
|
28
|
+
const rowIndex = candidate.rowIndex;
|
|
29
|
+
const membershipKey = rowIndex === null || bag.set.has(rowIndex)
|
|
30
|
+
? `L${String(candidate.lineage)}`
|
|
31
|
+
: `L${String(candidate.lineage)}+${String(rowIndex)}`;
|
|
32
|
+
let keys = cache.byMembership.get(membershipKey);
|
|
33
|
+
if (keys === undefined) {
|
|
34
|
+
const rowList = rowIndex === null || bag.set.has(rowIndex) ? bag.rows : [...bag.rows, rowIndex];
|
|
35
|
+
keys = uniqueKeysFromRowIndexes(rowList, keyForRow);
|
|
36
|
+
cache.byMembership.set(membershipKey, keys);
|
|
37
|
+
}
|
|
38
|
+
cache.byCandidate.set(candidate.id, keys);
|
|
39
|
+
return keys;
|
|
40
|
+
}
|