@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,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pointer-inspect queue ownership for InspectionState.
|
|
3
|
+
*
|
|
4
|
+
* Owns queued payload + frame token + pending-pin stash, nearest schedule,
|
|
5
|
+
* typed cancel, and onInspectPointerFrame routing. Pure frame tables stay in
|
|
6
|
+
* frame.ts; the host owns $state inspection snapshot, setInspection, dismiss,
|
|
7
|
+
* and scene-reconcile orchestration.
|
|
8
|
+
*
|
|
9
|
+
* Construction must not invoke deps.model / deps.reducer / deps.setInspection
|
|
10
|
+
* (armed-getter construction discipline on the host factory).
|
|
11
|
+
*
|
|
12
|
+
* onFrame may re-enter the host via setInspection (apply-pending). Snapshot
|
|
13
|
+
* then clear queue fields before pure routing so re-entrant cancel sees empty
|
|
14
|
+
* queue fields — load-bearing for touch-tap override of a pending rAF.
|
|
15
|
+
*/
|
|
16
|
+
import { resolveTarget } from "../interaction/target.js";
|
|
17
|
+
import { buildQueuedInspectFrame, resolveQueuedInspectFrameAction, } from "./frame.js";
|
|
18
|
+
/**
|
|
19
|
+
* hitTest resurrection when nearest misses.
|
|
20
|
+
*
|
|
21
|
+
* nearest under axis modes measures distance to the **anchor**, not painted
|
|
22
|
+
* geometry. hitTest finds whatever mark is under the pointer:
|
|
23
|
+
* - **rects** (bars/tiles): containment of the bar body — keep rescuing so
|
|
24
|
+
* wide columns under mode x still tooltips when the pointer is on the fill
|
|
25
|
+
* but farther than maxDistance from the centre anchor.
|
|
26
|
+
* - **paths/segments** (lines, areas, qq_line): stroke/fill can hit far from
|
|
27
|
+
* vertex anchors; on a two-vertex path that teleports between ends
|
|
28
|
+
* mid-stroke. Drop those under axis modes (and auto→axis autoMode).
|
|
29
|
+
*
|
|
30
|
+
* Exact always keeps geometric hits. Auto→exact marks (points, default bars)
|
|
31
|
+
* keep full hitTest. Flip-safe: no re-implementation of nearest's axis swap.
|
|
32
|
+
*/
|
|
33
|
+
function hitTestFallback(model, input) {
|
|
34
|
+
const hit = model.candidates.hitTest(input.point.x, input.point.y);
|
|
35
|
+
if (hit === null)
|
|
36
|
+
return null;
|
|
37
|
+
if (input.mode === "exact")
|
|
38
|
+
return hit;
|
|
39
|
+
const resolved = input.mode === "auto" ? (hit.autoMode ?? "exact") : input.mode;
|
|
40
|
+
if (resolved === "exact")
|
|
41
|
+
return hit;
|
|
42
|
+
// Axis mode (explicit or auto→x/y): rect containment only.
|
|
43
|
+
return hit.kind === "rects" ? hit : null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create the pointer-inspect queue. Does not invoke deps at construction.
|
|
47
|
+
*/
|
|
48
|
+
export function createPointerInspectQueue(deps) {
|
|
49
|
+
let queuedPointerToken = null;
|
|
50
|
+
let queuedPointerInspection = null;
|
|
51
|
+
let pendingPinnedPointer = null;
|
|
52
|
+
function schedule(input) {
|
|
53
|
+
const model = deps.model();
|
|
54
|
+
// Resolved target owns panel-scoped nearest + hover distance policy (#1080 / #787).
|
|
55
|
+
// panelAtOrOnly keeps single-panel axis-margin hover working.
|
|
56
|
+
const target = model === null
|
|
57
|
+
? null
|
|
58
|
+
: resolveTarget({
|
|
59
|
+
model,
|
|
60
|
+
point: input.point,
|
|
61
|
+
intent: "hover",
|
|
62
|
+
inspect: { mode: input.mode, maxDistance: input.maxDistance },
|
|
63
|
+
});
|
|
64
|
+
const match = target?.match ?? null;
|
|
65
|
+
const frame = buildQueuedInspectFrame({
|
|
66
|
+
match,
|
|
67
|
+
source: input.source,
|
|
68
|
+
epoch: model?.runId ?? 0,
|
|
69
|
+
fallbackCandidate: () => (model === null ? null : hitTestFallback(model, input)),
|
|
70
|
+
});
|
|
71
|
+
const reducer = deps.reducer();
|
|
72
|
+
queuedPointerInspection = frame.queued;
|
|
73
|
+
queuedPointerToken = reducer.frameToken();
|
|
74
|
+
try {
|
|
75
|
+
reducer.queuePointer({
|
|
76
|
+
type: "inspect",
|
|
77
|
+
candidate: frame.candidate,
|
|
78
|
+
source: input.source,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
// No orphan payload if scheduling throws.
|
|
83
|
+
queuedPointerInspection = null;
|
|
84
|
+
queuedPointerToken = null;
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function cancel(policy) {
|
|
89
|
+
queuedPointerInspection = null;
|
|
90
|
+
if (policy.pendingPinned === "discard")
|
|
91
|
+
pendingPinnedPointer = null;
|
|
92
|
+
deps.reducer().cancelScheduledPointer("inspect");
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Inspect branch of onPointerFrame.
|
|
96
|
+
*
|
|
97
|
+
* Snapshot then clear before pure routing — re-entrant setInspection cancel
|
|
98
|
+
* must observe empty queue fields.
|
|
99
|
+
*
|
|
100
|
+
* Boolean return is retained for symmetry with move-area's onPointerFrame
|
|
101
|
+
* contract. For `type === "inspect"` the reducer never dispatches the frame
|
|
102
|
+
* payload (inspection is single-authority in InspectionState); callers that
|
|
103
|
+
* gate on false still get the pure-table "drop" signal for stale tokens.
|
|
104
|
+
*/
|
|
105
|
+
function onFrame(action) {
|
|
106
|
+
const pending = queuedPointerInspection;
|
|
107
|
+
const token = queuedPointerToken;
|
|
108
|
+
queuedPointerInspection = null;
|
|
109
|
+
queuedPointerToken = null;
|
|
110
|
+
// Short-circuit tokenAccepted when no pending so accepts() is not
|
|
111
|
+
// called for empty frames.
|
|
112
|
+
const frameAction = resolveQueuedInspectFrameAction({
|
|
113
|
+
hasPending: pending !== null,
|
|
114
|
+
tokenAccepted: pending === null || token === null || deps.reducer().accepts(token),
|
|
115
|
+
currentState: deps.inspectionState(),
|
|
116
|
+
candidateEpochMismatch: action.candidate !== null && action.candidate.epoch !== deps.model()?.runId,
|
|
117
|
+
});
|
|
118
|
+
switch (frameAction.type) {
|
|
119
|
+
case "none":
|
|
120
|
+
// Empty frame (payload already cleared; scheduled inspect still flushed).
|
|
121
|
+
return true;
|
|
122
|
+
case "drop":
|
|
123
|
+
// Stale token / epoch mismatch — pure-table drop signal.
|
|
124
|
+
return false;
|
|
125
|
+
case "stash-pending":
|
|
126
|
+
if (pending !== null)
|
|
127
|
+
pendingPinnedPointer = pending;
|
|
128
|
+
return true;
|
|
129
|
+
case "apply-pending":
|
|
130
|
+
if (pending !== null) {
|
|
131
|
+
deps.setInspection(pending.candidate, pending.source, "transient", pending.concreteMode);
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
function peekPendingPinned() {
|
|
138
|
+
return pendingPinnedPointer;
|
|
139
|
+
}
|
|
140
|
+
function takePendingPinned() {
|
|
141
|
+
const pending = pendingPinnedPointer;
|
|
142
|
+
pendingPinnedPointer = null;
|
|
143
|
+
return pending;
|
|
144
|
+
}
|
|
145
|
+
function clearForSceneInvalidate() {
|
|
146
|
+
queuedPointerInspection = null;
|
|
147
|
+
pendingPinnedPointer = null;
|
|
148
|
+
queuedPointerToken = null;
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
schedule,
|
|
152
|
+
cancel,
|
|
153
|
+
onFrame,
|
|
154
|
+
peekPendingPinned,
|
|
155
|
+
takePendingPinned,
|
|
156
|
+
clearForSceneInvalidate,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { type ResolveInspectionInput, type InspectionSnapshotCompleteness, TRANSIENT_MEMBER_LIMIT, selectTransientMembers, resolvedTarget, resolveInspection, materializeInspection, } from "@ggts-sh/core/interaction";
|
|
2
|
+
export { clearInspectionFingerprint } from "./coordinator.js";
|
|
3
|
+
export { createInspectionCoordinator } from "./coordinator.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Shared pure behavior used by React and Svelte.
|
|
2
|
+
export { TRANSIENT_MEMBER_LIMIT, selectTransientMembers, resolvedTarget, resolveInspection, materializeInspection, } from "@ggts-sh/core/interaction";
|
|
3
|
+
export { clearInspectionFingerprint } from "./coordinator.js";
|
|
4
|
+
export { createInspectionCoordinator } from "./coordinator.js";
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision tables and scene-reconcile apply for capture-surface inspection
|
|
3
|
+
* *teardown* policy: blur/outside dismiss, scene-run reconcile (plan + bag
|
|
4
|
+
* apply), emit fingerprint, escape/close plan.
|
|
5
|
+
*
|
|
6
|
+
* Plan helpers are pure. `applySceneInspectReconcile` only calls the host bag
|
|
7
|
+
* (reducer, coordinator, queue, field writes) — no $effect registration.
|
|
8
|
+
*/
|
|
9
|
+
import type { CandidateFacts, CellValue, RenderModel } from "@ggts-sh/core";
|
|
10
|
+
import type { InteractionSource, PlotInspectionChange } from "../interaction/interaction.js";
|
|
11
|
+
import type { InspectionHostState } from "./frame.js";
|
|
12
|
+
type InspectionChangeSnapshot = PlotInspectionChange<Record<string, CellValue>, PropertyKey>;
|
|
13
|
+
export type SurfaceBlurAction = {
|
|
14
|
+
readonly type: "ignore";
|
|
15
|
+
} | {
|
|
16
|
+
readonly type: "blur-keep-pinned";
|
|
17
|
+
} | {
|
|
18
|
+
readonly type: "blur-clear-inspection";
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Pure decision for capture-surface `blur`.
|
|
22
|
+
*
|
|
23
|
+
* Host on non-ignore (ordering is load-bearing):
|
|
24
|
+
* 1. activeTraversalIndex = -1
|
|
25
|
+
* 2. reducer.dispatch set-active null
|
|
26
|
+
* 3. only blur-clear-inspection → setInspection(null, "keyboard")
|
|
27
|
+
*
|
|
28
|
+
* Host must pass `relatedTargetInsideRoot: root?.contains(related) === true`.
|
|
29
|
+
* `"none"` and `"transient"` both clear inspection; `"pinned"` keeps it.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveSurfaceBlurAction(input: {
|
|
32
|
+
readonly relatedTargetInsideRoot: boolean;
|
|
33
|
+
/** Host: `inspection === null ? "none" : inspection.state`. */
|
|
34
|
+
readonly inspectionState: InspectionHostState;
|
|
35
|
+
}): SurfaceBlurAction;
|
|
36
|
+
/**
|
|
37
|
+
* Whether a window pointerdown outside the plot should close a pinned
|
|
38
|
+
* inspection. Host: only when `surfaceInteractive` effect is installed.
|
|
39
|
+
* Host must pass `targetInsideRoot: root?.contains(target) === true`.
|
|
40
|
+
*
|
|
41
|
+
* Takes domain `inspectionState` (not a pre-derived `isPinned` boolean) so
|
|
42
|
+
* hosts pass `inspection?.state` directly — same shape as `isTooltipDocked`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function shouldClosePinnedOnOutsidePointer(input: {
|
|
45
|
+
readonly inspectionState: "transient" | "pinned" | "none" | null | undefined;
|
|
46
|
+
readonly targetInsideRoot: boolean;
|
|
47
|
+
}): boolean;
|
|
48
|
+
export type SceneInspectReconcilePlan = {
|
|
49
|
+
readonly type: "noop";
|
|
50
|
+
} | {
|
|
51
|
+
readonly type: "clear-disabled";
|
|
52
|
+
} | {
|
|
53
|
+
readonly type: "skip";
|
|
54
|
+
} | {
|
|
55
|
+
readonly type: "invalidate-clear-transient";
|
|
56
|
+
} | {
|
|
57
|
+
readonly type: "invalidate-idle";
|
|
58
|
+
} | {
|
|
59
|
+
readonly type: "invalidate-reconcile-pinned";
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Priority table for the model-run inspection reconcile effect.
|
|
63
|
+
*
|
|
64
|
+
* 1. inspect off → clear-disabled when live inspection exists, else noop
|
|
65
|
+
* 2. no model / same runId as reconciledRun → skip
|
|
66
|
+
* 3. run advanced + transient → invalidate-clear-transient
|
|
67
|
+
* 4. run advanced + pinned → invalidate-reconcile-pinned
|
|
68
|
+
* 5. run advanced + none → invalidate-idle
|
|
69
|
+
*
|
|
70
|
+
* Host on every invalidate-*: clear queues, cancel scheduled pointer, set
|
|
71
|
+
* reconciledRun to the new model runId, then branch-specific side effects.
|
|
72
|
+
*
|
|
73
|
+
* `getInspectionState` is a thunk so the host `$effect` can avoid reading
|
|
74
|
+
* hover `inspection` state on the skip path (same runId) — otherwise every
|
|
75
|
+
* transient pointer update would re-run this effect only to hit skip.
|
|
76
|
+
*/
|
|
77
|
+
export declare function planSceneInspectReconcile(input: {
|
|
78
|
+
readonly inspectionEnabled: boolean;
|
|
79
|
+
/** Host: `() => (inspection === null ? "none" : inspection.state)`. */
|
|
80
|
+
readonly getInspectionState: () => InspectionHostState;
|
|
81
|
+
readonly modelRunId: number | null;
|
|
82
|
+
readonly reconciledRun: number;
|
|
83
|
+
}): SceneInspectReconcilePlan;
|
|
84
|
+
/**
|
|
85
|
+
* Host mutators for `applySceneInspectReconcile`. The `$effect` shell owns
|
|
86
|
+
* plan + bag wiring; this bag owns field writes and coordinator/queue/reducer.
|
|
87
|
+
*/
|
|
88
|
+
export type SceneInspectReconcileBag = {
|
|
89
|
+
/**
|
|
90
|
+
* Current model when the effect ran. Required non-null for invalidate-*
|
|
91
|
+
* plans (plan guarantees run advanced). clear-disabled / noop / skip may
|
|
92
|
+
* pass null.
|
|
93
|
+
*/
|
|
94
|
+
readonly model: RenderModel | null;
|
|
95
|
+
readonly dataIdentityEpoch: () => PropertyKey;
|
|
96
|
+
/** Clear live inspection + seed (transient clear, disabled clear, failed pin). */
|
|
97
|
+
clearInspection(): void;
|
|
98
|
+
/** Commit a successful pinned reconcile (snapshot + seed). */
|
|
99
|
+
setInspectionFromReconcile(input: {
|
|
100
|
+
readonly snapshot: InspectionChangeSnapshot;
|
|
101
|
+
readonly seed: CandidateFacts;
|
|
102
|
+
}): void;
|
|
103
|
+
setActiveCandidateId(id: number | null): void;
|
|
104
|
+
clearDismissedLatch(): void;
|
|
105
|
+
setReconciledRun(runId: number): void;
|
|
106
|
+
/** Reducer `{ type: "invalidate", reason: "scene" }` (cancels all scheduled pointer). */
|
|
107
|
+
dispatchSceneInvalidate(): void;
|
|
108
|
+
/** clear-disabled: discard pending pin stash; inspect-only cancel. */
|
|
109
|
+
cancelPointerDiscardPending(): void;
|
|
110
|
+
/** invalidate-*: clear queue fields only (after dispatchSceneInvalidate). */
|
|
111
|
+
clearPointerForSceneInvalidate(): void;
|
|
112
|
+
coordinatorInvalidate(): void;
|
|
113
|
+
releaseTransient(): void;
|
|
114
|
+
reconcilePinned(input: {
|
|
115
|
+
readonly model: RenderModel;
|
|
116
|
+
readonly identityEpoch: PropertyKey;
|
|
117
|
+
readonly layoutEpoch: PropertyKey;
|
|
118
|
+
}): {
|
|
119
|
+
readonly snapshot: InspectionChangeSnapshot;
|
|
120
|
+
readonly seed: CandidateFacts;
|
|
121
|
+
readonly semanticChanged: boolean;
|
|
122
|
+
readonly semanticFingerprint: string;
|
|
123
|
+
} | null;
|
|
124
|
+
emitClearProgrammatic(): void;
|
|
125
|
+
emitSemanticChange(snapshot: InspectionChangeSnapshot, semanticFingerprint: string): void;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Apply a scene-run inspection reconcile plan via host mutators.
|
|
129
|
+
*
|
|
130
|
+
* Keeps the factory `$effect` as plan → apply. Ordering is load-bearing:
|
|
131
|
+
* invalidate-* dispatches reducer invalidate before queue field clears; pinned
|
|
132
|
+
* reconcile failure emits programmatic clear then clears fields.
|
|
133
|
+
*/
|
|
134
|
+
export declare function applySceneInspectReconcile(plan: SceneInspectReconcilePlan, bag: SceneInspectReconcileBag): void;
|
|
135
|
+
export type InspectionEmitAction = {
|
|
136
|
+
readonly type: "skip";
|
|
137
|
+
} | {
|
|
138
|
+
readonly type: "emit";
|
|
139
|
+
/**
|
|
140
|
+
* When non-null, host assigns `lastInspectionFingerprint = updateFingerprint`
|
|
141
|
+
* before callbacks. When null, host must not mutate the last fingerprint
|
|
142
|
+
* (undefined semantic path on change — always emit without update).
|
|
143
|
+
*/
|
|
144
|
+
readonly updateFingerprint: string | null;
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* Pure gate for host `emitInspection`: resolve fingerprint then skip/emit.
|
|
148
|
+
*
|
|
149
|
+
* Fingerprint production:
|
|
150
|
+
* clear → `clearInspectionFingerprint(source)` (`clear:${source}`)
|
|
151
|
+
* change → `semanticFingerprint` (coordinator token; may be undefined)
|
|
152
|
+
*
|
|
153
|
+
* `semanticFingerprint` is meaningful only when `phase === "change"`.
|
|
154
|
+
*
|
|
155
|
+
* Emit rules after fingerprint is resolved:
|
|
156
|
+
* undefined fingerprint → emit, do not update last
|
|
157
|
+
* fingerprint === last → skip (includes equal empty string; host inits last to "")
|
|
158
|
+
* otherwise → emit and update last to fingerprint
|
|
159
|
+
*/
|
|
160
|
+
export declare function resolveInspectionEmitAction(input: {
|
|
161
|
+
readonly phase: "clear" | "change";
|
|
162
|
+
readonly source: InteractionSource;
|
|
163
|
+
/** Coordinator semantic fingerprint; ignored when phase is clear. */
|
|
164
|
+
readonly semanticFingerprint: string | undefined;
|
|
165
|
+
readonly lastFingerprint: string;
|
|
166
|
+
}): InspectionEmitAction;
|
|
167
|
+
export type InspectionDismissKind = "escape" | "close";
|
|
168
|
+
/**
|
|
169
|
+
* Host side-effect plan for dismissing inspection.
|
|
170
|
+
* Used by a single host `dismissInspection` that Escape and closeInspection share.
|
|
171
|
+
*
|
|
172
|
+
* Escape (keyboard): invalidate coordinator, clear brush, optional returnToInspect;
|
|
173
|
+
* discards pending pin stash so a later re-pin cannot restore a pre-Escape
|
|
174
|
+
* candidate (#856). Close: release pinned, clear pending, optional restore
|
|
175
|
+
* focus to capture surface.
|
|
176
|
+
*/
|
|
177
|
+
export type InspectionDismissPlan = {
|
|
178
|
+
readonly emitClear: boolean;
|
|
179
|
+
readonly clearPendingPinned: boolean;
|
|
180
|
+
readonly coordinator: "invalidate" | "release-pinned";
|
|
181
|
+
readonly clearBrush: boolean;
|
|
182
|
+
readonly clearTooltipHovered: boolean;
|
|
183
|
+
readonly restoreFocus: boolean;
|
|
184
|
+
readonly returnToInspect: boolean;
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Pure plan for unified inspection dismiss.
|
|
188
|
+
* Host always dispatches reducer `{ type: "escape", source }` first, then applies
|
|
189
|
+
* this plan for field clears / coordinator / focus / tool.
|
|
190
|
+
*/
|
|
191
|
+
export declare function planInspectionDismiss(input: {
|
|
192
|
+
readonly kind: InspectionDismissKind;
|
|
193
|
+
readonly hasInspection: boolean;
|
|
194
|
+
/** Close only; defaults to true when omitted (matches closeInspection default). */
|
|
195
|
+
readonly restoreFocus?: boolean;
|
|
196
|
+
/** Escape only; from `resolveSurfaceKeyAction` escape.returnToInspect. */
|
|
197
|
+
readonly returnToInspect?: boolean;
|
|
198
|
+
}): InspectionDismissPlan;
|
|
199
|
+
export {};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision tables and scene-reconcile apply for capture-surface inspection
|
|
3
|
+
* *teardown* policy: blur/outside dismiss, scene-run reconcile (plan + bag
|
|
4
|
+
* apply), emit fingerprint, escape/close plan.
|
|
5
|
+
*
|
|
6
|
+
* Plan helpers are pure. `applySceneInspectReconcile` only calls the host bag
|
|
7
|
+
* (reducer, coordinator, queue, field writes) — no $effect registration.
|
|
8
|
+
*/
|
|
9
|
+
import { clearInspectionFingerprint } from "./coordinator.js";
|
|
10
|
+
/**
|
|
11
|
+
* Pure decision for capture-surface `blur`.
|
|
12
|
+
*
|
|
13
|
+
* Host on non-ignore (ordering is load-bearing):
|
|
14
|
+
* 1. activeTraversalIndex = -1
|
|
15
|
+
* 2. reducer.dispatch set-active null
|
|
16
|
+
* 3. only blur-clear-inspection → setInspection(null, "keyboard")
|
|
17
|
+
*
|
|
18
|
+
* Host must pass `relatedTargetInsideRoot: root?.contains(related) === true`.
|
|
19
|
+
* `"none"` and `"transient"` both clear inspection; `"pinned"` keeps it.
|
|
20
|
+
*/
|
|
21
|
+
export function resolveSurfaceBlurAction(input) {
|
|
22
|
+
if (input.relatedTargetInsideRoot)
|
|
23
|
+
return { type: "ignore" };
|
|
24
|
+
if (input.inspectionState === "pinned")
|
|
25
|
+
return { type: "blur-keep-pinned" };
|
|
26
|
+
return { type: "blur-clear-inspection" };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Whether a window pointerdown outside the plot should close a pinned
|
|
30
|
+
* inspection. Host: only when `surfaceInteractive` effect is installed.
|
|
31
|
+
* Host must pass `targetInsideRoot: root?.contains(target) === true`.
|
|
32
|
+
*
|
|
33
|
+
* Takes domain `inspectionState` (not a pre-derived `isPinned` boolean) so
|
|
34
|
+
* hosts pass `inspection?.state` directly — same shape as `isTooltipDocked`.
|
|
35
|
+
*/
|
|
36
|
+
export function shouldClosePinnedOnOutsidePointer(input) {
|
|
37
|
+
return input.inspectionState === "pinned" && !input.targetInsideRoot;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Priority table for the model-run inspection reconcile effect.
|
|
41
|
+
*
|
|
42
|
+
* 1. inspect off → clear-disabled when live inspection exists, else noop
|
|
43
|
+
* 2. no model / same runId as reconciledRun → skip
|
|
44
|
+
* 3. run advanced + transient → invalidate-clear-transient
|
|
45
|
+
* 4. run advanced + pinned → invalidate-reconcile-pinned
|
|
46
|
+
* 5. run advanced + none → invalidate-idle
|
|
47
|
+
*
|
|
48
|
+
* Host on every invalidate-*: clear queues, cancel scheduled pointer, set
|
|
49
|
+
* reconciledRun to the new model runId, then branch-specific side effects.
|
|
50
|
+
*
|
|
51
|
+
* `getInspectionState` is a thunk so the host `$effect` can avoid reading
|
|
52
|
+
* hover `inspection` state on the skip path (same runId) — otherwise every
|
|
53
|
+
* transient pointer update would re-run this effect only to hit skip.
|
|
54
|
+
*/
|
|
55
|
+
export function planSceneInspectReconcile(input) {
|
|
56
|
+
if (!input.inspectionEnabled) {
|
|
57
|
+
return input.getInspectionState() === "none" ? { type: "noop" } : { type: "clear-disabled" };
|
|
58
|
+
}
|
|
59
|
+
if (input.modelRunId === null || input.modelRunId === input.reconciledRun) {
|
|
60
|
+
return { type: "skip" };
|
|
61
|
+
}
|
|
62
|
+
const inspectionState = input.getInspectionState();
|
|
63
|
+
if (inspectionState === "transient") {
|
|
64
|
+
return { type: "invalidate-clear-transient" };
|
|
65
|
+
}
|
|
66
|
+
if (inspectionState === "pinned") {
|
|
67
|
+
return { type: "invalidate-reconcile-pinned" };
|
|
68
|
+
}
|
|
69
|
+
return { type: "invalidate-idle" };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Apply a scene-run inspection reconcile plan via host mutators.
|
|
73
|
+
*
|
|
74
|
+
* Keeps the factory `$effect` as plan → apply. Ordering is load-bearing:
|
|
75
|
+
* invalidate-* dispatches reducer invalidate before queue field clears; pinned
|
|
76
|
+
* reconcile failure emits programmatic clear then clears fields.
|
|
77
|
+
*/
|
|
78
|
+
export function applySceneInspectReconcile(plan, bag) {
|
|
79
|
+
switch (plan.type) {
|
|
80
|
+
case "noop":
|
|
81
|
+
case "skip":
|
|
82
|
+
return;
|
|
83
|
+
case "clear-disabled":
|
|
84
|
+
bag.coordinatorInvalidate();
|
|
85
|
+
bag.clearInspection();
|
|
86
|
+
bag.clearDismissedLatch();
|
|
87
|
+
// Inspect-only cancel: move-area schedules must survive.
|
|
88
|
+
bag.cancelPointerDiscardPending();
|
|
89
|
+
return;
|
|
90
|
+
case "invalidate-clear-transient":
|
|
91
|
+
case "invalidate-idle":
|
|
92
|
+
case "invalidate-reconcile-pinned": {
|
|
93
|
+
// Plan requires run advance → model is non-null for invalidate-*.
|
|
94
|
+
const model = bag.model;
|
|
95
|
+
if (model === null)
|
|
96
|
+
return;
|
|
97
|
+
const runId = model.runId;
|
|
98
|
+
// invalidate dispatch already cancels all scheduled pointer work.
|
|
99
|
+
bag.dispatchSceneInvalidate();
|
|
100
|
+
bag.clearPointerForSceneInvalidate();
|
|
101
|
+
bag.clearDismissedLatch();
|
|
102
|
+
bag.setReconciledRun(runId);
|
|
103
|
+
if (plan.type === "invalidate-clear-transient") {
|
|
104
|
+
bag.releaseTransient();
|
|
105
|
+
bag.clearInspection();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (plan.type === "invalidate-idle")
|
|
109
|
+
return;
|
|
110
|
+
const reconciled = bag.reconcilePinned({
|
|
111
|
+
model,
|
|
112
|
+
identityEpoch: bag.dataIdentityEpoch(),
|
|
113
|
+
layoutEpoch: runId,
|
|
114
|
+
});
|
|
115
|
+
if (reconciled === null) {
|
|
116
|
+
// Failed pinned reconcile: clear inspection only (not area Escape).
|
|
117
|
+
bag.emitClearProgrammatic();
|
|
118
|
+
bag.clearInspection();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
bag.setInspectionFromReconcile({
|
|
122
|
+
snapshot: reconciled.snapshot,
|
|
123
|
+
seed: reconciled.seed,
|
|
124
|
+
});
|
|
125
|
+
bag.setActiveCandidateId(reconciled.seed.id);
|
|
126
|
+
if (reconciled.semanticChanged) {
|
|
127
|
+
bag.emitSemanticChange(reconciled.snapshot, reconciled.semanticFingerprint);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Pure gate for host `emitInspection`: resolve fingerprint then skip/emit.
|
|
135
|
+
*
|
|
136
|
+
* Fingerprint production:
|
|
137
|
+
* clear → `clearInspectionFingerprint(source)` (`clear:${source}`)
|
|
138
|
+
* change → `semanticFingerprint` (coordinator token; may be undefined)
|
|
139
|
+
*
|
|
140
|
+
* `semanticFingerprint` is meaningful only when `phase === "change"`.
|
|
141
|
+
*
|
|
142
|
+
* Emit rules after fingerprint is resolved:
|
|
143
|
+
* undefined fingerprint → emit, do not update last
|
|
144
|
+
* fingerprint === last → skip (includes equal empty string; host inits last to "")
|
|
145
|
+
* otherwise → emit and update last to fingerprint
|
|
146
|
+
*/
|
|
147
|
+
export function resolveInspectionEmitAction(input) {
|
|
148
|
+
const fingerprint = input.phase === "clear" ? clearInspectionFingerprint(input.source) : input.semanticFingerprint;
|
|
149
|
+
if (fingerprint === undefined)
|
|
150
|
+
return { type: "emit", updateFingerprint: null };
|
|
151
|
+
if (fingerprint === input.lastFingerprint)
|
|
152
|
+
return { type: "skip" };
|
|
153
|
+
return { type: "emit", updateFingerprint: fingerprint };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Pure plan for unified inspection dismiss.
|
|
157
|
+
* Host always dispatches reducer `{ type: "escape", source }` first, then applies
|
|
158
|
+
* this plan for field clears / coordinator / focus / tool.
|
|
159
|
+
*/
|
|
160
|
+
export function planInspectionDismiss(input) {
|
|
161
|
+
if (input.kind === "escape") {
|
|
162
|
+
return {
|
|
163
|
+
emitClear: input.hasInspection,
|
|
164
|
+
clearPendingPinned: true,
|
|
165
|
+
coordinator: "invalidate",
|
|
166
|
+
clearBrush: true,
|
|
167
|
+
clearTooltipHovered: true,
|
|
168
|
+
restoreFocus: false,
|
|
169
|
+
returnToInspect: input.returnToInspect === true,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
emitClear: input.hasInspection,
|
|
174
|
+
clearPendingPinned: true,
|
|
175
|
+
coordinator: "release-pinned",
|
|
176
|
+
clearBrush: false,
|
|
177
|
+
clearTooltipHovered: true,
|
|
178
|
+
restoreFocus: input.restoreFocus !== false,
|
|
179
|
+
returnToInspect: false,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooltip chrome policy for theme-aware default content (#1069).
|
|
3
|
+
*
|
|
4
|
+
* Visual roles (paper / ink / border) live on the theme. This helper decides
|
|
5
|
+
* whether the default instructional footer ("Click to pin", overflow pin hint)
|
|
6
|
+
* belongs with that chrome — flat (gridless) themes drop to text on paper and
|
|
7
|
+
* stay silent; pinned-disabled inspect configs never advertise pinning.
|
|
8
|
+
*/
|
|
9
|
+
export type TooltipPinHintInput = {
|
|
10
|
+
/** Whether inspect pinning is enabled on the plot. */
|
|
11
|
+
readonly pin: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Resolved theme tooltip keyline. Gridless themes derive `"transparent"`;
|
|
14
|
+
* a concrete color means the theme still wants a boxed panel.
|
|
15
|
+
*/
|
|
16
|
+
readonly tooltipBorder: string;
|
|
17
|
+
};
|
|
18
|
+
/** True when the default tooltip should show pin-related instructional footers. */
|
|
19
|
+
export declare function shouldShowTooltipPinHint(input: TooltipPinHintInput): boolean;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooltip chrome policy for theme-aware default content (#1069).
|
|
3
|
+
*
|
|
4
|
+
* Visual roles (paper / ink / border) live on the theme. This helper decides
|
|
5
|
+
* whether the default instructional footer ("Click to pin", overflow pin hint)
|
|
6
|
+
* belongs with that chrome — flat (gridless) themes drop to text on paper and
|
|
7
|
+
* stay silent; pinned-disabled inspect configs never advertise pinning.
|
|
8
|
+
*/
|
|
9
|
+
/** True when the default tooltip should show pin-related instructional footers. */
|
|
10
|
+
export function shouldShowTooltipPinHint(input) {
|
|
11
|
+
if (!input.pin)
|
|
12
|
+
return false;
|
|
13
|
+
const border = input.tooltipBorder.trim().toLowerCase();
|
|
14
|
+
if (border === "transparent" || border === "none")
|
|
15
|
+
return false;
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooltip first-appear / last-leave motion policy.
|
|
3
|
+
*
|
|
4
|
+
* Hover follow and miss-between-marks stay instant. Short opacity is the
|
|
5
|
+
* only allowed chart-chrome motion (DESIGN.md). Scale is not used.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TOOLTIP_MOTION_MS = 160;
|
|
8
|
+
export declare const TOOLTIP_EASE = "cubic-bezier(0.23, 1, 0.32, 1)";
|
|
9
|
+
export type TooltipMotionReason = "hit" | "miss-on-plot" | "leave-plot" | "close";
|
|
10
|
+
export type TooltipMotionPhase = "enter" | "none" | "exit";
|
|
11
|
+
export declare function prefersReducedMotion(media: {
|
|
12
|
+
readonly matches: boolean;
|
|
13
|
+
} | null | undefined): boolean;
|
|
14
|
+
export declare function resolveTooltipDismissReason(input: {
|
|
15
|
+
readonly explicitClose: boolean;
|
|
16
|
+
readonly pointerOnCapture: boolean;
|
|
17
|
+
}): "miss-on-plot" | "leave-plot" | "close";
|
|
18
|
+
export declare function resolveTooltipMotion(input: {
|
|
19
|
+
readonly reason: TooltipMotionReason;
|
|
20
|
+
readonly sessionActive: boolean;
|
|
21
|
+
readonly reducedMotion: boolean;
|
|
22
|
+
}): {
|
|
23
|
+
readonly phase: TooltipMotionPhase;
|
|
24
|
+
readonly sessionActive: boolean;
|
|
25
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooltip first-appear / last-leave motion policy.
|
|
3
|
+
*
|
|
4
|
+
* Hover follow and miss-between-marks stay instant. Short opacity is the
|
|
5
|
+
* only allowed chart-chrome motion (DESIGN.md). Scale is not used.
|
|
6
|
+
*/
|
|
7
|
+
export const TOOLTIP_MOTION_MS = 160;
|
|
8
|
+
export const TOOLTIP_EASE = "cubic-bezier(0.23, 1, 0.32, 1)";
|
|
9
|
+
export function prefersReducedMotion(media) {
|
|
10
|
+
return media?.matches === true;
|
|
11
|
+
}
|
|
12
|
+
export function resolveTooltipDismissReason(input) {
|
|
13
|
+
if (input.explicitClose)
|
|
14
|
+
return "close";
|
|
15
|
+
if (input.pointerOnCapture)
|
|
16
|
+
return "miss-on-plot";
|
|
17
|
+
return "leave-plot";
|
|
18
|
+
}
|
|
19
|
+
export function resolveTooltipMotion(input) {
|
|
20
|
+
if (input.reason === "hit") {
|
|
21
|
+
if (input.reducedMotion || input.sessionActive)
|
|
22
|
+
return { phase: "none", sessionActive: true };
|
|
23
|
+
return { phase: "enter", sessionActive: true };
|
|
24
|
+
}
|
|
25
|
+
if (input.reason === "miss-on-plot") {
|
|
26
|
+
return { phase: "none", sessionActive: input.sessionActive };
|
|
27
|
+
}
|
|
28
|
+
// leave-plot | close
|
|
29
|
+
if (input.sessionActive && !input.reducedMotion)
|
|
30
|
+
return { phase: "exit", sessionActive: false };
|
|
31
|
+
return { phase: "none", sessionActive: false };
|
|
32
|
+
}
|