@ggts-sh/react 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/README.md +66 -0
- package/dist/GGPlot.d.ts +6 -0
- package/dist/GGPlot.d.ts.map +1 -0
- package/dist/GGPlot.js +18 -0
- package/dist/GGPlot.js.map +1 -0
- package/dist/datum-key.d.ts +21 -0
- package/dist/datum-key.d.ts.map +1 -0
- package/dist/datum-key.js +60 -0
- package/dist/datum-key.js.map +1 -0
- package/dist/defined-props.d.ts +3 -0
- package/dist/defined-props.d.ts.map +1 -0
- package/dist/defined-props.js +11 -0
- package/dist/defined-props.js.map +1 -0
- package/dist/geom-factory.d.ts +17 -0
- package/dist/geom-factory.d.ts.map +1 -0
- package/dist/geom-factory.js +63 -0
- package/dist/geom-factory.js.map +1 -0
- package/dist/geoms/GeomAbline.d.ts +8 -0
- package/dist/geoms/GeomAbline.d.ts.map +1 -0
- package/dist/geoms/GeomAbline.js +8 -0
- package/dist/geoms/GeomAbline.js.map +1 -0
- package/dist/geoms/GeomArea.d.ts +8 -0
- package/dist/geoms/GeomArea.d.ts.map +1 -0
- package/dist/geoms/GeomArea.js +6 -0
- package/dist/geoms/GeomArea.js.map +1 -0
- package/dist/geoms/GeomBar.d.ts +8 -0
- package/dist/geoms/GeomBar.d.ts.map +1 -0
- package/dist/geoms/GeomBar.js +6 -0
- package/dist/geoms/GeomBar.js.map +1 -0
- package/dist/geoms/GeomBin2d.d.ts +8 -0
- package/dist/geoms/GeomBin2d.d.ts.map +1 -0
- package/dist/geoms/GeomBin2d.js +8 -0
- package/dist/geoms/GeomBin2d.js.map +1 -0
- package/dist/geoms/GeomBlank.d.ts +8 -0
- package/dist/geoms/GeomBlank.d.ts.map +1 -0
- package/dist/geoms/GeomBlank.js +6 -0
- package/dist/geoms/GeomBlank.js.map +1 -0
- package/dist/geoms/GeomBoxplot.d.ts +8 -0
- package/dist/geoms/GeomBoxplot.d.ts.map +1 -0
- package/dist/geoms/GeomBoxplot.js +8 -0
- package/dist/geoms/GeomBoxplot.js.map +1 -0
- package/dist/geoms/GeomCol.d.ts +8 -0
- package/dist/geoms/GeomCol.d.ts.map +1 -0
- package/dist/geoms/GeomCol.js +6 -0
- package/dist/geoms/GeomCol.js.map +1 -0
- package/dist/geoms/GeomContour.d.ts +8 -0
- package/dist/geoms/GeomContour.d.ts.map +1 -0
- package/dist/geoms/GeomContour.js +8 -0
- package/dist/geoms/GeomContour.js.map +1 -0
- package/dist/geoms/GeomCount.d.ts +8 -0
- package/dist/geoms/GeomCount.d.ts.map +1 -0
- package/dist/geoms/GeomCount.js +6 -0
- package/dist/geoms/GeomCount.js.map +1 -0
- package/dist/geoms/GeomCrossbar.d.ts +8 -0
- package/dist/geoms/GeomCrossbar.d.ts.map +1 -0
- package/dist/geoms/GeomCrossbar.js +8 -0
- package/dist/geoms/GeomCrossbar.js.map +1 -0
- package/dist/geoms/GeomCurve.d.ts +8 -0
- package/dist/geoms/GeomCurve.d.ts.map +1 -0
- package/dist/geoms/GeomCurve.js +8 -0
- package/dist/geoms/GeomCurve.js.map +1 -0
- package/dist/geoms/GeomDensity.d.ts +8 -0
- package/dist/geoms/GeomDensity.d.ts.map +1 -0
- package/dist/geoms/GeomDensity.js +8 -0
- package/dist/geoms/GeomDensity.js.map +1 -0
- package/dist/geoms/GeomDensity2d.d.ts +8 -0
- package/dist/geoms/GeomDensity2d.d.ts.map +1 -0
- package/dist/geoms/GeomDensity2d.js +8 -0
- package/dist/geoms/GeomDensity2d.js.map +1 -0
- package/dist/geoms/GeomDensity2dFilled.d.ts +8 -0
- package/dist/geoms/GeomDensity2dFilled.d.ts.map +1 -0
- package/dist/geoms/GeomDensity2dFilled.js +8 -0
- package/dist/geoms/GeomDensity2dFilled.js.map +1 -0
- package/dist/geoms/GeomDotplot.d.ts +8 -0
- package/dist/geoms/GeomDotplot.d.ts.map +1 -0
- package/dist/geoms/GeomDotplot.js +8 -0
- package/dist/geoms/GeomDotplot.js.map +1 -0
- package/dist/geoms/GeomErrorbar.d.ts +8 -0
- package/dist/geoms/GeomErrorbar.d.ts.map +1 -0
- package/dist/geoms/GeomErrorbar.js +8 -0
- package/dist/geoms/GeomErrorbar.js.map +1 -0
- package/dist/geoms/GeomFreqpoly.d.ts +8 -0
- package/dist/geoms/GeomFreqpoly.d.ts.map +1 -0
- package/dist/geoms/GeomFreqpoly.js +8 -0
- package/dist/geoms/GeomFreqpoly.js.map +1 -0
- package/dist/geoms/GeomFunction.d.ts +8 -0
- package/dist/geoms/GeomFunction.d.ts.map +1 -0
- package/dist/geoms/GeomFunction.js +8 -0
- package/dist/geoms/GeomFunction.js.map +1 -0
- package/dist/geoms/GeomHex.d.ts +8 -0
- package/dist/geoms/GeomHex.d.ts.map +1 -0
- package/dist/geoms/GeomHex.js +8 -0
- package/dist/geoms/GeomHex.js.map +1 -0
- package/dist/geoms/GeomHistogram.d.ts +8 -0
- package/dist/geoms/GeomHistogram.d.ts.map +1 -0
- package/dist/geoms/GeomHistogram.js +8 -0
- package/dist/geoms/GeomHistogram.js.map +1 -0
- package/dist/geoms/GeomHline.d.ts +8 -0
- package/dist/geoms/GeomHline.d.ts.map +1 -0
- package/dist/geoms/GeomHline.js +6 -0
- package/dist/geoms/GeomHline.js.map +1 -0
- package/dist/geoms/GeomJitter.d.ts +11 -0
- package/dist/geoms/GeomJitter.d.ts.map +1 -0
- package/dist/geoms/GeomJitter.js +15 -0
- package/dist/geoms/GeomJitter.js.map +1 -0
- package/dist/geoms/GeomLabel.d.ts +8 -0
- package/dist/geoms/GeomLabel.d.ts.map +1 -0
- package/dist/geoms/GeomLabel.js +6 -0
- package/dist/geoms/GeomLabel.js.map +1 -0
- package/dist/geoms/GeomLine.d.ts +8 -0
- package/dist/geoms/GeomLine.d.ts.map +1 -0
- package/dist/geoms/GeomLine.js +6 -0
- package/dist/geoms/GeomLine.js.map +1 -0
- package/dist/geoms/GeomLinerange.d.ts +8 -0
- package/dist/geoms/GeomLinerange.d.ts.map +1 -0
- package/dist/geoms/GeomLinerange.js +8 -0
- package/dist/geoms/GeomLinerange.js.map +1 -0
- package/dist/geoms/GeomMap.d.ts +8 -0
- package/dist/geoms/GeomMap.d.ts.map +1 -0
- package/dist/geoms/GeomMap.js +8 -0
- package/dist/geoms/GeomMap.js.map +1 -0
- package/dist/geoms/GeomPath.d.ts +8 -0
- package/dist/geoms/GeomPath.d.ts.map +1 -0
- package/dist/geoms/GeomPath.js +6 -0
- package/dist/geoms/GeomPath.js.map +1 -0
- package/dist/geoms/GeomPoint.d.ts +8 -0
- package/dist/geoms/GeomPoint.d.ts.map +1 -0
- package/dist/geoms/GeomPoint.js +6 -0
- package/dist/geoms/GeomPoint.js.map +1 -0
- package/dist/geoms/GeomPointrange.d.ts +8 -0
- package/dist/geoms/GeomPointrange.d.ts.map +1 -0
- package/dist/geoms/GeomPointrange.js +8 -0
- package/dist/geoms/GeomPointrange.js.map +1 -0
- package/dist/geoms/GeomPolygon.d.ts +8 -0
- package/dist/geoms/GeomPolygon.d.ts.map +1 -0
- package/dist/geoms/GeomPolygon.js +8 -0
- package/dist/geoms/GeomPolygon.js.map +1 -0
- package/dist/geoms/GeomQq.d.ts +8 -0
- package/dist/geoms/GeomQq.d.ts.map +1 -0
- package/dist/geoms/GeomQq.js +8 -0
- package/dist/geoms/GeomQq.js.map +1 -0
- package/dist/geoms/GeomQqLine.d.ts +8 -0
- package/dist/geoms/GeomQqLine.d.ts.map +1 -0
- package/dist/geoms/GeomQqLine.js +8 -0
- package/dist/geoms/GeomQqLine.js.map +1 -0
- package/dist/geoms/GeomQuantile.d.ts +8 -0
- package/dist/geoms/GeomQuantile.d.ts.map +1 -0
- package/dist/geoms/GeomQuantile.js +8 -0
- package/dist/geoms/GeomQuantile.js.map +1 -0
- package/dist/geoms/GeomRaster.d.ts +8 -0
- package/dist/geoms/GeomRaster.d.ts.map +1 -0
- package/dist/geoms/GeomRaster.js +8 -0
- package/dist/geoms/GeomRaster.js.map +1 -0
- package/dist/geoms/GeomRect.d.ts +8 -0
- package/dist/geoms/GeomRect.d.ts.map +1 -0
- package/dist/geoms/GeomRect.js +6 -0
- package/dist/geoms/GeomRect.js.map +1 -0
- package/dist/geoms/GeomRibbon.d.ts +8 -0
- package/dist/geoms/GeomRibbon.d.ts.map +1 -0
- package/dist/geoms/GeomRibbon.js +6 -0
- package/dist/geoms/GeomRibbon.js.map +1 -0
- package/dist/geoms/GeomRug.d.ts +8 -0
- package/dist/geoms/GeomRug.d.ts.map +1 -0
- package/dist/geoms/GeomRug.js +8 -0
- package/dist/geoms/GeomRug.js.map +1 -0
- package/dist/geoms/GeomRule.d.ts +8 -0
- package/dist/geoms/GeomRule.d.ts.map +1 -0
- package/dist/geoms/GeomRule.js +6 -0
- package/dist/geoms/GeomRule.js.map +1 -0
- package/dist/geoms/GeomSegment.d.ts +8 -0
- package/dist/geoms/GeomSegment.d.ts.map +1 -0
- package/dist/geoms/GeomSegment.js +6 -0
- package/dist/geoms/GeomSegment.js.map +1 -0
- package/dist/geoms/GeomSf.d.ts +8 -0
- package/dist/geoms/GeomSf.d.ts.map +1 -0
- package/dist/geoms/GeomSf.js +8 -0
- package/dist/geoms/GeomSf.js.map +1 -0
- package/dist/geoms/GeomSfLabel.d.ts +8 -0
- package/dist/geoms/GeomSfLabel.d.ts.map +1 -0
- package/dist/geoms/GeomSfLabel.js +8 -0
- package/dist/geoms/GeomSfLabel.js.map +1 -0
- package/dist/geoms/GeomSfText.d.ts +8 -0
- package/dist/geoms/GeomSfText.d.ts.map +1 -0
- package/dist/geoms/GeomSfText.js +8 -0
- package/dist/geoms/GeomSfText.js.map +1 -0
- package/dist/geoms/GeomSmooth.d.ts +8 -0
- package/dist/geoms/GeomSmooth.d.ts.map +1 -0
- package/dist/geoms/GeomSmooth.js +8 -0
- package/dist/geoms/GeomSmooth.js.map +1 -0
- package/dist/geoms/GeomSpoke.d.ts +8 -0
- package/dist/geoms/GeomSpoke.d.ts.map +1 -0
- package/dist/geoms/GeomSpoke.js +8 -0
- package/dist/geoms/GeomSpoke.js.map +1 -0
- package/dist/geoms/GeomStep.d.ts +8 -0
- package/dist/geoms/GeomStep.d.ts.map +1 -0
- package/dist/geoms/GeomStep.js +6 -0
- package/dist/geoms/GeomStep.js.map +1 -0
- package/dist/geoms/GeomText.d.ts +8 -0
- package/dist/geoms/GeomText.d.ts.map +1 -0
- package/dist/geoms/GeomText.js +6 -0
- package/dist/geoms/GeomText.js.map +1 -0
- package/dist/geoms/GeomTile.d.ts +8 -0
- package/dist/geoms/GeomTile.d.ts.map +1 -0
- package/dist/geoms/GeomTile.js +8 -0
- package/dist/geoms/GeomTile.js.map +1 -0
- package/dist/geoms/GeomViolin.d.ts +8 -0
- package/dist/geoms/GeomViolin.d.ts.map +1 -0
- package/dist/geoms/GeomViolin.js +8 -0
- package/dist/geoms/GeomViolin.js.map +1 -0
- package/dist/geoms/GeomVline.d.ts +8 -0
- package/dist/geoms/GeomVline.d.ts.map +1 -0
- package/dist/geoms/GeomVline.js +6 -0
- package/dist/geoms/GeomVline.js.map +1 -0
- package/dist/geoms/index.d.ts +50 -0
- package/dist/geoms/index.d.ts.map +1 -0
- package/dist/geoms/index.js +51 -0
- package/dist/geoms/index.js.map +1 -0
- package/dist/grammar.d.ts +59 -0
- package/dist/grammar.d.ts.map +1 -0
- package/dist/grammar.js +134 -0
- package/dist/grammar.js.map +1 -0
- package/dist/host-effect.d.ts +3 -0
- package/dist/host-effect.d.ts.map +1 -0
- package/dist/host-effect.js +3 -0
- package/dist/host-effect.js.map +1 -0
- package/dist/host-init.d.ts +2 -0
- package/dist/host-init.d.ts.map +1 -0
- package/dist/host-init.js +4 -0
- package/dist/host-init.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction.d.ts +9 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/interaction.js +2 -0
- package/dist/interaction.js.map +1 -0
- package/dist/plot-accessibility.d.ts +23 -0
- package/dist/plot-accessibility.d.ts.map +1 -0
- package/dist/plot-accessibility.js +68 -0
- package/dist/plot-accessibility.js.map +1 -0
- package/dist/plot-assemble.d.ts +5 -0
- package/dist/plot-assemble.d.ts.map +1 -0
- package/dist/plot-assemble.js +14 -0
- package/dist/plot-assemble.js.map +1 -0
- package/dist/plot-controls.d.ts +20 -0
- package/dist/plot-controls.d.ts.map +1 -0
- package/dist/plot-controls.js +119 -0
- package/dist/plot-controls.js.map +1 -0
- package/dist/plot-gesture.d.ts +15 -0
- package/dist/plot-gesture.d.ts.map +1 -0
- package/dist/plot-gesture.js +55 -0
- package/dist/plot-gesture.js.map +1 -0
- package/dist/plot-host-identity.d.ts +5 -0
- package/dist/plot-host-identity.d.ts.map +1 -0
- package/dist/plot-host-identity.js +30 -0
- package/dist/plot-host-identity.js.map +1 -0
- package/dist/plot-inputs.d.ts +41 -0
- package/dist/plot-inputs.d.ts.map +1 -0
- package/dist/plot-inputs.js +147 -0
- package/dist/plot-inputs.js.map +1 -0
- package/dist/plot-interactions.d.ts +45 -0
- package/dist/plot-interactions.d.ts.map +1 -0
- package/dist/plot-interactions.js +447 -0
- package/dist/plot-interactions.js.map +1 -0
- package/dist/plot-legends.d.ts +20 -0
- package/dist/plot-legends.d.ts.map +1 -0
- package/dist/plot-legends.js +200 -0
- package/dist/plot-legends.js.map +1 -0
- package/dist/plot-overlay.d.ts +15 -0
- package/dist/plot-overlay.d.ts.map +1 -0
- package/dist/plot-overlay.js +69 -0
- package/dist/plot-overlay.js.map +1 -0
- package/dist/plot-props.d.ts +49 -0
- package/dist/plot-props.d.ts.map +1 -0
- package/dist/plot-props.js +2 -0
- package/dist/plot-props.js.map +1 -0
- package/dist/plot-runtime.d.ts +15 -0
- package/dist/plot-runtime.d.ts.map +1 -0
- package/dist/plot-runtime.js +59 -0
- package/dist/plot-runtime.js.map +1 -0
- package/dist/plot-surface.d.ts +3 -0
- package/dist/plot-surface.d.ts.map +1 -0
- package/dist/plot-surface.js +285 -0
- package/dist/plot-surface.js.map +1 -0
- package/dist/registry.d.ts +28 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +164 -0
- package/dist/registry.js.map +1 -0
- package/dist/scales.d.ts +132 -0
- package/dist/scales.d.ts.map +1 -0
- package/dist/scales.js +434 -0
- package/dist/scales.js.map +1 -0
- package/dist/strata-sync.d.ts +7 -0
- package/dist/strata-sync.d.ts.map +1 -0
- package/dist/strata-sync.js +158 -0
- package/dist/strata-sync.js.map +1 -0
- package/dist/themes.d.ts +38 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +141 -0
- package/dist/themes.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { encodeKey } from "@ggts-sh/core";
|
|
4
|
+
import { buildInteractiveLegendEntries, buildLegendEntryKeyIndexForPlot, isLegendValueVisible, legendIdentityKey, nextLegendFilterValues, samePropertyKeySet, } from "@ggts-sh/core/interaction";
|
|
5
|
+
const same = (state, entry) => state !== null &&
|
|
6
|
+
state.scale === entry.legend.scale &&
|
|
7
|
+
state.value === encodeKey(entry.entry.value);
|
|
8
|
+
export function usePlotLegends(input) {
|
|
9
|
+
const { model, registry, revision, props, scope, keyForRow, filters } = input;
|
|
10
|
+
const [committed, setCommitted] = useState(null);
|
|
11
|
+
const [preview, setPreview] = useState(null);
|
|
12
|
+
const capability = useMemo(() => {
|
|
13
|
+
const focus = new Map();
|
|
14
|
+
const filter = new Map();
|
|
15
|
+
for (const layer of registry.layers) {
|
|
16
|
+
if (layer.kind === "legendFocus" && layer.value !== null) {
|
|
17
|
+
focus.set(layer.value.channel, layer.value.input === true || layer.value.input.preview !== false);
|
|
18
|
+
}
|
|
19
|
+
if (layer.kind === "legendFilter" && layer.value !== null) {
|
|
20
|
+
const options = layer.value.input === true ? {} : layer.value.input;
|
|
21
|
+
if (options.mode !== undefined && options.mode !== "include" && options.mode !== "exclude")
|
|
22
|
+
throw new TypeError("Legend filter mode must be include or exclude");
|
|
23
|
+
filter.set(layer.value.channel, {
|
|
24
|
+
mode: options.mode ?? "exclude",
|
|
25
|
+
multiple: options.multiple ?? true,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return { focus, filter };
|
|
30
|
+
}, [registry, revision]);
|
|
31
|
+
const allEntries = useMemo(() => (model === null ? [] : buildInteractiveLegendEntries(model.scene.legends)), [model]);
|
|
32
|
+
const entries = allEntries.filter((entry) => capability.focus.has(entry.legend.scale) ||
|
|
33
|
+
capability.filter.has(entry.legend.scale) ||
|
|
34
|
+
Boolean(props.legendFocus) ||
|
|
35
|
+
Boolean(props.legendFilter));
|
|
36
|
+
const index = useMemo(() => buildLegendEntryKeyIndexForPlot({
|
|
37
|
+
model: entries.length === 0 ? null : model,
|
|
38
|
+
semanticKey: keyForRow,
|
|
39
|
+
}), [model, keyForRow, entries.length]);
|
|
40
|
+
const focusEnabled = capability.focus.size > 0 || Boolean(props.legendFocus);
|
|
41
|
+
const selectedEntry = entries.find((entry) => same(preview, entry));
|
|
42
|
+
const controllerKeys = props.interaction?.emphasized(scope);
|
|
43
|
+
const localKeys = committed?.keys ?? [];
|
|
44
|
+
const previewKeys = selectedEntry === undefined
|
|
45
|
+
? null
|
|
46
|
+
: (index.get(legendIdentityKey(selectedEntry.identity)) ?? []);
|
|
47
|
+
const emphasis = focusEnabled
|
|
48
|
+
? (previewKeys ?? controllerKeys ?? localKeys)
|
|
49
|
+
: (controllerKeys ?? []);
|
|
50
|
+
const isPressed = (entry) => {
|
|
51
|
+
const keys = controllerKeys ?? localKeys;
|
|
52
|
+
return (keys.length > 0 &&
|
|
53
|
+
samePropertyKeySet(keys, index.get(legendIdentityKey(entry.identity)) ?? []));
|
|
54
|
+
};
|
|
55
|
+
const emit = (event) => {
|
|
56
|
+
props.onlegendfocus?.(event);
|
|
57
|
+
props.oninteraction?.(event);
|
|
58
|
+
};
|
|
59
|
+
const focusEntry = (entry, source, commit) => {
|
|
60
|
+
if (!capability.focus.has(entry.legend.scale) &&
|
|
61
|
+
(props.legendFocus === undefined || props.legendFocus === false))
|
|
62
|
+
return;
|
|
63
|
+
const previewAllowed = capability.focus.get(entry.legend.scale) ??
|
|
64
|
+
(typeof props.legendFocus === "object" ? (props.legendFocus.preview ?? true) : true);
|
|
65
|
+
if (!commit && !previewAllowed)
|
|
66
|
+
return;
|
|
67
|
+
const clear = commit && isPressed(entry);
|
|
68
|
+
const keys = clear ? [] : (index.get(legendIdentityKey(entry.identity)) ?? []);
|
|
69
|
+
const state = clear
|
|
70
|
+
? null
|
|
71
|
+
: { scale: entry.legend.scale, value: encodeKey(entry.entry.value), keys };
|
|
72
|
+
if (commit) {
|
|
73
|
+
setCommitted(state);
|
|
74
|
+
setPreview(null);
|
|
75
|
+
}
|
|
76
|
+
else
|
|
77
|
+
setPreview(state);
|
|
78
|
+
if (commit)
|
|
79
|
+
props.interaction?.setEmphasis(keys, { scope, source });
|
|
80
|
+
emit(clear
|
|
81
|
+
? { type: "legend-focus", phase: "clear", source }
|
|
82
|
+
: {
|
|
83
|
+
type: "legend-focus",
|
|
84
|
+
phase: "change",
|
|
85
|
+
state: commit ? "committed" : "transient",
|
|
86
|
+
source,
|
|
87
|
+
scale: entry.legend.scale,
|
|
88
|
+
value: entry.entry.value,
|
|
89
|
+
label: entry.entry.fullLabel ?? entry.entry.label,
|
|
90
|
+
keys,
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
const clearPreview = (source) => {
|
|
94
|
+
if (preview === null)
|
|
95
|
+
return;
|
|
96
|
+
setPreview(null);
|
|
97
|
+
if (committed === null)
|
|
98
|
+
emit({ type: "legend-focus", phase: "clear", source });
|
|
99
|
+
};
|
|
100
|
+
const clearFocus = (source = "programmatic") => {
|
|
101
|
+
setPreview(null);
|
|
102
|
+
setCommitted(null);
|
|
103
|
+
props.interaction?.clearEmphasis({ scope, source });
|
|
104
|
+
emit({ type: "legend-focus", phase: "clear", source });
|
|
105
|
+
};
|
|
106
|
+
const fieldFor = (entry) => model?.layerFields
|
|
107
|
+
.flat()
|
|
108
|
+
.find((field) => field.channel === entry.legend.scale && field.source !== "stat")?.field;
|
|
109
|
+
const filterEntry = (entry, source) => {
|
|
110
|
+
const field = fieldFor(entry);
|
|
111
|
+
if (field === undefined)
|
|
112
|
+
return;
|
|
113
|
+
const options = capability.filter.get(entry.legend.scale) ??
|
|
114
|
+
(typeof props.legendFilter === "object" ? props.legendFilter : {});
|
|
115
|
+
const mode = options.mode ?? "exclude";
|
|
116
|
+
const prior = filters.find((clause) => clause.scale === entry.legend.scale && clause.field === field);
|
|
117
|
+
const catalog = entry.legend.entries.map((value) => value.value);
|
|
118
|
+
const values = nextLegendFilterValues(prior?.values ?? (mode === "include" ? catalog : []), entry.entry.value, catalog, mode, options.multiple ?? true);
|
|
119
|
+
const clause = { scale: entry.legend.scale, field, values, mode };
|
|
120
|
+
input.setFilters([
|
|
121
|
+
...filters.filter((value) => value.scale !== clause.scale || value.field !== field),
|
|
122
|
+
clause,
|
|
123
|
+
]);
|
|
124
|
+
const event = { type: "legend-filter", phase: "change", source, clause };
|
|
125
|
+
props.onlegendfilter?.(event);
|
|
126
|
+
props.oninteraction?.(event);
|
|
127
|
+
};
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
if (committed === null)
|
|
130
|
+
return;
|
|
131
|
+
const entry = entries.find((item) => same(committed, item));
|
|
132
|
+
const keys = entry === undefined ? [] : (index.get(legendIdentityKey(entry.identity)) ?? []);
|
|
133
|
+
if (!samePropertyKeySet(keys, committed.keys)) {
|
|
134
|
+
setCommitted(null);
|
|
135
|
+
if (props.interaction === undefined)
|
|
136
|
+
emit({ type: "legend-focus", phase: "clear", source: "programmatic" });
|
|
137
|
+
}
|
|
138
|
+
}, [model, index]);
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
if (focusEnabled)
|
|
141
|
+
return;
|
|
142
|
+
setPreview(null);
|
|
143
|
+
setCommitted(null);
|
|
144
|
+
}, [focusEnabled]);
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
if (filters.every((clause) => capability.filter.has(clause.scale) || Boolean(props.legendFilter)))
|
|
147
|
+
return;
|
|
148
|
+
// Reset atomically, matching the Svelte host: removed controls cannot
|
|
149
|
+
// leave hidden row filters behind, including when another guide remains.
|
|
150
|
+
input.setFilters([]);
|
|
151
|
+
const event = {
|
|
152
|
+
type: "legend-filter",
|
|
153
|
+
phase: "clear",
|
|
154
|
+
source: "programmatic",
|
|
155
|
+
clause: null,
|
|
156
|
+
};
|
|
157
|
+
props.onlegendfilter?.(event);
|
|
158
|
+
props.oninteraction?.(event);
|
|
159
|
+
}, [capability.filter, props.legendFilter, filters]);
|
|
160
|
+
return {
|
|
161
|
+
emphasis,
|
|
162
|
+
entries,
|
|
163
|
+
clearFocus,
|
|
164
|
+
controls: entries.length === 0 ? null : (_jsxs("div", { className: "gg-legend-controls", "aria-label": "Legend controls", style: { display: "flex", flexWrap: "wrap", gap: 8, lineHeight: 1.4 }, children: [entries.map((entry) => {
|
|
165
|
+
const identity = legendIdentityKey(entry.identity);
|
|
166
|
+
const filter = capability.filter.has(entry.legend.scale) || Boolean(props.legendFilter);
|
|
167
|
+
const focus = capability.focus.has(entry.legend.scale) || Boolean(props.legendFocus);
|
|
168
|
+
const field = fieldFor(entry);
|
|
169
|
+
const clause = filters.find((value) => value.scale === entry.legend.scale && value.field === field);
|
|
170
|
+
const visible = clause === undefined ||
|
|
171
|
+
isLegendValueVisible(clause.values, entry.entry.value, clause.mode);
|
|
172
|
+
return (_jsxs("div", { children: [focus && (_jsxs("button", { type: "button", "aria-pressed": isPressed(entry), onPointerEnter: () => {
|
|
173
|
+
focusEntry(entry, "pointer", false);
|
|
174
|
+
}, onPointerLeave: () => {
|
|
175
|
+
clearPreview("pointer");
|
|
176
|
+
}, onFocus: () => {
|
|
177
|
+
focusEntry(entry, "keyboard", false);
|
|
178
|
+
}, onBlur: () => {
|
|
179
|
+
clearPreview("keyboard");
|
|
180
|
+
}, onClick: (event) => {
|
|
181
|
+
focusEntry(entry, event.detail === 0 ? "keyboard" : "pointer", true);
|
|
182
|
+
}, style: { minHeight: 44, minWidth: 44 }, children: ["Focus ", entry.entry.fullLabel ?? entry.entry.label] })), filter && field !== undefined && (_jsxs("label", { style: { display: "inline-flex", alignItems: "center", minHeight: 44, gap: 6 }, children: [_jsx("input", { type: "checkbox", checked: visible, onChange: (event) => {
|
|
183
|
+
filterEntry(entry, event.nativeEvent instanceof PointerEvent ? "pointer" : "keyboard");
|
|
184
|
+
} }), "Show ", entry.entry.fullLabel ?? entry.entry.label] }))] }, identity));
|
|
185
|
+
}), committed !== null && (_jsx("button", { type: "button", onClick: () => {
|
|
186
|
+
clearFocus("pointer");
|
|
187
|
+
}, children: "Clear legend focus" })), filters.length > 0 && (_jsx("button", { type: "button", onClick: () => {
|
|
188
|
+
input.setFilters([]);
|
|
189
|
+
const event = {
|
|
190
|
+
type: "legend-filter",
|
|
191
|
+
phase: "clear",
|
|
192
|
+
source: "pointer",
|
|
193
|
+
clause: null,
|
|
194
|
+
};
|
|
195
|
+
props.onlegendfilter?.(event);
|
|
196
|
+
props.oninteraction?.(event);
|
|
197
|
+
}, children: "Reset legend filters" }))] })),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=plot-legends.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot-legends.js","sourceRoot":"","sources":["../src/plot-legends.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CandidateFacts, CellValue, PlotRect, RenderModel } from "@ggts-sh/core";
|
|
2
|
+
import type { PlotInspectionChange } from "@ggts-sh/core/interaction";
|
|
3
|
+
export declare function PlotOverlay({ model, inspection, seed, candidates, selected, emphasized, rectangles, flipped, }: {
|
|
4
|
+
model: RenderModel;
|
|
5
|
+
inspection: PlotInspectionChange<Record<string, CellValue>, PropertyKey> | null;
|
|
6
|
+
seed: CandidateFacts | null;
|
|
7
|
+
candidates: readonly (CandidateFacts & {
|
|
8
|
+
keys: readonly PropertyKey[];
|
|
9
|
+
})[];
|
|
10
|
+
selected: readonly PropertyKey[];
|
|
11
|
+
emphasized: readonly PropertyKey[];
|
|
12
|
+
rectangles: readonly PlotRect[];
|
|
13
|
+
flipped: boolean;
|
|
14
|
+
}): import("react").JSX.Element | null;
|
|
15
|
+
//# sourceMappingURL=plot-overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot-overlay.d.ts","sourceRoot":"","sources":["../src/plot-overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAYtF,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AA+E1F,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,UAAU,EACV,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,OAAO,GACR,EAAE;IACD,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;IAChF,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,SAAS,CAAC,cAAc,GAAG;QAAE,IAAI,EAAE,SAAS,WAAW,EAAE,CAAA;KAAE,CAAC,EAAE,CAAC;IAC3E,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,UAAU,EAAE,SAAS,WAAW,EAAE,CAAC;IACnC,UAAU,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB,sCAuDA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { anchorsFromCandidateKeys, applyEmphasisRingDensityGate, crosshairGapForBox, crosshairGlyphObstacles, glyphExtentsFromBatch, gappedCrosshairSegmentsWithObstacles, glyphHoverBox, hoverChromeForKind, HOVER_CROSSHAIR_GAP_RADIUS, } from "@ggts-sh/core/interaction";
|
|
3
|
+
function Anchor({ anchor, className, radius, }) {
|
|
4
|
+
if (anchor.chrome === "none")
|
|
5
|
+
return null;
|
|
6
|
+
if (anchor.chrome === "ring")
|
|
7
|
+
return (_jsx("circle", { className: className, cx: anchor.x, cy: anchor.y, r: radius, fill: "none", stroke: "Highlight", strokeWidth: 2 }));
|
|
8
|
+
const box = glyphHoverBox(anchor, {
|
|
9
|
+
width: anchor.width,
|
|
10
|
+
height: anchor.height,
|
|
11
|
+
textAnchor: anchor.textAnchor,
|
|
12
|
+
});
|
|
13
|
+
return (_jsx("rect", { className: className, ...box, rx: 2, fill: "none", stroke: "Highlight", strokeWidth: 2 }));
|
|
14
|
+
}
|
|
15
|
+
function candidateExtent(model, candidate) {
|
|
16
|
+
const batch = model.scene.batches[candidate.batchIndex];
|
|
17
|
+
return batch?.kind === "glyphs" ? glyphExtentsFromBatch(batch, candidate.primitiveIndex) : null;
|
|
18
|
+
}
|
|
19
|
+
function hoverGuides(model, inspection, seed, flipped) {
|
|
20
|
+
if (inspection === null)
|
|
21
|
+
return { hover: null, lines: [] };
|
|
22
|
+
const focus = inspection.focus;
|
|
23
|
+
const panel = model.viewport.panelAtOrOnly(focus.anchor);
|
|
24
|
+
const chrome = hoverChromeForKind(seed?.kind);
|
|
25
|
+
const dimensions = seed === null ? null : candidateExtent(model, seed);
|
|
26
|
+
const hover = { ...focus.anchor, chrome, ...dimensions };
|
|
27
|
+
if (panel === null)
|
|
28
|
+
return { hover, lines: [] };
|
|
29
|
+
const obstacles = crosshairGlyphObstacles(model.scene.batches, model.scene.panels, panel.id);
|
|
30
|
+
const gap = chrome === "ring"
|
|
31
|
+
? HOVER_CROSSHAIR_GAP_RADIUS
|
|
32
|
+
: chrome === "box"
|
|
33
|
+
? crosshairGapForBox(dimensions?.width ?? 12, dimensions?.height ?? 12)
|
|
34
|
+
: 0;
|
|
35
|
+
const mode = inspection.mode;
|
|
36
|
+
const vertical = mode === "xy" || mode === (flipped ? "y" : "x");
|
|
37
|
+
const horizontal = mode === "xy" || mode === (flipped ? "x" : "y");
|
|
38
|
+
const bounds = {
|
|
39
|
+
x: panel.bounds.x0,
|
|
40
|
+
y: panel.bounds.y0,
|
|
41
|
+
width: panel.bounds.x1 - panel.bounds.x0,
|
|
42
|
+
height: panel.bounds.y1 - panel.bounds.y0,
|
|
43
|
+
};
|
|
44
|
+
const lines = [
|
|
45
|
+
...(vertical
|
|
46
|
+
? gappedCrosshairSegmentsWithObstacles("vertical", focus.anchor, bounds, gap, obstacles)
|
|
47
|
+
: []),
|
|
48
|
+
...(horizontal
|
|
49
|
+
? gappedCrosshairSegmentsWithObstacles("horizontal", focus.anchor, bounds, gap, obstacles)
|
|
50
|
+
: []),
|
|
51
|
+
];
|
|
52
|
+
return { hover, lines };
|
|
53
|
+
}
|
|
54
|
+
export function PlotOverlay({ model, inspection, seed, candidates, selected, emphasized, rectangles, flipped, }) {
|
|
55
|
+
const presented = candidates.map((candidate) => ({
|
|
56
|
+
...candidate,
|
|
57
|
+
...candidateExtent(model, candidate),
|
|
58
|
+
}));
|
|
59
|
+
const anchors = anchorsFromCandidateKeys(presented, selected);
|
|
60
|
+
const emphasis = applyEmphasisRingDensityGate(anchorsFromCandidateKeys(presented, emphasized));
|
|
61
|
+
const { hover, lines } = hoverGuides(model, inspection, seed, flipped);
|
|
62
|
+
if (inspection === null &&
|
|
63
|
+
anchors.length === 0 &&
|
|
64
|
+
emphasis.length === 0 &&
|
|
65
|
+
rectangles.length === 0)
|
|
66
|
+
return null;
|
|
67
|
+
return (_jsxs("svg", { className: "gg-interaction-overlay", "aria-hidden": "true", width: model.scene.width, height: model.scene.height, style: { position: "absolute", inset: 0, pointerEvents: "none" }, children: [lines.map((line, index) => (_jsx("line", { className: "gg-crosshair", ...line, stroke: "currentColor", strokeOpacity: 0.5, strokeDasharray: "3 3" }, index))), hover !== null && _jsx(Anchor, { anchor: hover, className: "gg-hover-ring", radius: 6 }), anchors.map((anchor, index) => (_jsx(Anchor, { anchor: anchor, className: "gg-selected-ring", radius: 8 }, index))), emphasis.map((anchor, index) => (_jsx(Anchor, { anchor: anchor, className: "gg-emphasis-ring", radius: 7 }, index))), rectangles.map((rect, index) => (_jsx("rect", { className: "gg-brush", x: rect.x0, y: rect.y0, width: rect.x1 - rect.x0, height: rect.y1 - rect.y0, fill: "Highlight", fillOpacity: 0.12, stroke: "Highlight" }, index)))] }));
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=plot-overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot-overlay.js","sourceRoot":"","sources":["../src/plot-overlay.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,oCAAoC,EACpC,aAAa,EACb,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AAGnC,SAAS,MAAM,CAAC,EACd,MAAM,EACN,SAAS,EACT,MAAM,GAKP;IACC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAC1B,OAAO,CACL,iBACE,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,CAAC,CAAC,EACZ,EAAE,EAAE,MAAM,CAAC,CAAC,EACZ,CAAC,EAAE,MAAM,EACT,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,WAAW,EAClB,WAAW,EAAE,CAAC,GACd,CACH,CAAC;IACJ,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE;QAChC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC;IACH,OAAO,CACL,eAAM,SAAS,EAAE,SAAS,KAAM,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,WAAW,EAAC,WAAW,EAAE,CAAC,GAAI,CAC9F,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAkB,EAAE,SAAyB;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxD,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClG,CAAC;AAED,SAAS,WAAW,CAClB,KAAkB,EAClB,UAA+E,EAC/E,IAA2B,EAC3B,OAAgB;IAEhB,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7F,MAAM,GAAG,GACP,MAAM,KAAK,MAAM;QACf,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,MAAM,KAAK,KAAK;YAChB,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;YACvE,CAAC,CAAC,CAAC,CAAC;IACV,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG;QACb,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;QAClB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;QAClB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE;QACxC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE;KAC1C,CAAC;IACF,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,QAAQ;YACV,CAAC,CAAC,oCAAoC,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC;YACxF,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU;YACZ,CAAC,CAAC,oCAAoC,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC;YAC1F,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,UAAU,EACV,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,OAAO,GAUR;IACC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,GAAG,SAAS;QACZ,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC;KACrC,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,wBAAwB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,4BAA4B,CAAC,wBAAwB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/F,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvE,IACE,UAAU,KAAK,IAAI;QACnB,OAAO,CAAC,MAAM,KAAK,CAAC;QACpB,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,UAAU,CAAC,MAAM,KAAK,CAAC;QAEvB,OAAO,IAAI,CAAC;IACd,OAAO,CACL,eACE,SAAS,EAAC,wBAAwB,iBACtB,MAAM,EAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EACxB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,aAE/D,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,eAEE,SAAS,EAAC,cAAc,KACpB,IAAI,EACR,MAAM,EAAC,cAAc,EACrB,aAAa,EAAE,GAAG,EAClB,eAAe,EAAC,KAAK,IALhB,KAAK,CAMV,CACH,CAAC,EACD,KAAK,KAAK,IAAI,IAAI,KAAC,MAAM,IAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAC,eAAe,EAAC,MAAM,EAAE,CAAC,GAAI,EAChF,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC9B,KAAC,MAAM,IAAa,MAAM,EAAE,MAAM,EAAE,SAAS,EAAC,kBAAkB,EAAC,MAAM,EAAE,CAAC,IAA7D,KAAK,CAA4D,CAC/E,CAAC,EACD,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC/B,KAAC,MAAM,IAAa,MAAM,EAAE,MAAM,EAAE,SAAS,EAAC,kBAAkB,EAAC,MAAM,EAAE,CAAC,IAA7D,KAAK,CAA4D,CAC/E,CAAC,EACD,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC/B,eAEE,SAAS,EAAC,UAAU,EACpB,CAAC,EAAE,IAAI,CAAC,EAAE,EACV,CAAC,EAAE,IAAI,CAAC,EAAE,EACV,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,EACxB,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,EACzB,IAAI,EAAC,WAAW,EAChB,WAAW,EAAE,IAAI,EACjB,MAAM,EAAC,WAAW,IARb,KAAK,CASV,CACH,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { CompositionDiagnostic } from "@ggts-sh/compose";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import type { CellValue, RenderModel } from "@ggts-sh/core";
|
|
4
|
+
import type { InteractionDiagnostic, LegendFocusEvent, LegendFocusInput, LegendFilterEvent, LegendFilterInput } from "@ggts-sh/core/interaction";
|
|
5
|
+
import type { A11yMode, AesInput, DataInput, LayerInput, PortableSpec, SpecInput } from "@ggts-sh/spec";
|
|
6
|
+
import type { InspectInput, InteractionTool, PlotInteractionController, PlotInteractionEvent, PlotInteractionScope, PlotSelection, SelectInput, ZoomDomains, ZoomEvent, ZoomInput } from "./interaction.js";
|
|
7
|
+
import type { PlotInspection } from "./interaction.js";
|
|
8
|
+
export interface GGPlotHandle {
|
|
9
|
+
resetScales(): void;
|
|
10
|
+
setZoom(domains: Partial<ZoomDomains>): void;
|
|
11
|
+
}
|
|
12
|
+
export interface GGPlotProps<Row extends Record<string, CellValue> = Record<string, CellValue>> {
|
|
13
|
+
spec?: SpecInput;
|
|
14
|
+
data?: DataInput | readonly Row[];
|
|
15
|
+
aes?: AesInput;
|
|
16
|
+
layers?: LayerInput[];
|
|
17
|
+
a11y?: A11yMode;
|
|
18
|
+
width?: number | "container";
|
|
19
|
+
height?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Durable row identity. Use this in JSX — React does not pass `key` through
|
|
22
|
+
* as a plot prop. Inspect / select / createPlotInteraction identity still win.
|
|
23
|
+
*/
|
|
24
|
+
identity?: PropertyKey | ((row: Row, index: number) => PropertyKey);
|
|
25
|
+
/** @deprecated since 0.21.0 — React strips JSX `key`; use `identity`. */
|
|
26
|
+
key?: PropertyKey | ((row: Row, index: number) => PropertyKey);
|
|
27
|
+
inspect?: InspectInput<Row>;
|
|
28
|
+
/** Legacy shorthand; prefer <GuideLegend focus>. */
|
|
29
|
+
legendFocus?: LegendFocusInput;
|
|
30
|
+
/** Legacy shorthand; prefer <GuideLegend filter>. */
|
|
31
|
+
legendFilter?: LegendFilterInput;
|
|
32
|
+
select?: SelectInput;
|
|
33
|
+
zoom?: ZoomInput;
|
|
34
|
+
tool?: InteractionTool;
|
|
35
|
+
interaction?: PlotInteractionController;
|
|
36
|
+
interactionScope?: PlotInteractionScope;
|
|
37
|
+
oninspect?: (inspection: PlotInspection<Row>) => void;
|
|
38
|
+
onselect?: (selection: PlotSelection) => void;
|
|
39
|
+
onzoom?: (event: ZoomEvent) => void;
|
|
40
|
+
oninteraction?: (event: PlotInteractionEvent<Row>) => void;
|
|
41
|
+
onlegendfocus?: (event: LegendFocusEvent) => void;
|
|
42
|
+
onlegendfilter?: (event: LegendFilterEvent) => void;
|
|
43
|
+
ontoolchange?: (tool: InteractionTool) => void;
|
|
44
|
+
ondiagnostic?: (diagnostic: InteractionDiagnostic | CompositionDiagnostic) => void;
|
|
45
|
+
onrender?: (model: RenderModel, spec: PortableSpec) => void;
|
|
46
|
+
ariaLabel?: string;
|
|
47
|
+
children?: ReactNode;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=plot-props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot-props.d.ts","sourceRoot":"","sources":["../src/plot-props.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot-props.js","sourceRoot":"","sources":["../src/plot-props.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RenderModel, RuntimeRowFilterClause } from "@ggts-sh/core";
|
|
2
|
+
import type { PortableSpec } from "@ggts-sh/spec";
|
|
3
|
+
/** The pipeline is memoized by chart inputs, never by transient UI state. */
|
|
4
|
+
export declare function usePlotModel(input: {
|
|
5
|
+
spec: PortableSpec | null;
|
|
6
|
+
baselineSpec: PortableSpec | null;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
rowFilters: readonly RuntimeRowFilterClause[];
|
|
10
|
+
}): {
|
|
11
|
+
model: RenderModel | null;
|
|
12
|
+
strata: import("@ggts-sh/core").Stratum[];
|
|
13
|
+
resetScales(): void;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=plot-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot-runtime.d.ts","sourceRoot":"","sources":["../src/plot-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAc,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC/C;;;;EAqDA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useMemo, useRef, useState } from "react";
|
|
2
|
+
import { planStrata, runPipeline } from "@ggts-sh/core";
|
|
3
|
+
import { useHostLayoutEffect } from "./host-effect.js";
|
|
4
|
+
/** The pipeline is memoized by chart inputs, never by transient UI state. */
|
|
5
|
+
export function usePlotModel(input) {
|
|
6
|
+
const scales = useRef(null);
|
|
7
|
+
const [epoch, setEpoch] = useState(0);
|
|
8
|
+
const model = useMemo(() => {
|
|
9
|
+
if (input.spec === null)
|
|
10
|
+
return null;
|
|
11
|
+
let previous = scales.current ?? undefined;
|
|
12
|
+
let baselineDomains;
|
|
13
|
+
if (input.baselineSpec !== null && input.baselineSpec !== input.spec) {
|
|
14
|
+
const baseline = runPipeline(input.baselineSpec, {
|
|
15
|
+
width: input.width,
|
|
16
|
+
height: input.height,
|
|
17
|
+
...(previous !== undefined && { prevScales: previous }),
|
|
18
|
+
...(input.rowFilters.length > 0 && { rowFilters: input.rowFilters }),
|
|
19
|
+
});
|
|
20
|
+
baselineDomains = baseline.domains.effective;
|
|
21
|
+
previous = baseline.scales.state;
|
|
22
|
+
baseline.dispose();
|
|
23
|
+
}
|
|
24
|
+
return runPipeline(input.spec, {
|
|
25
|
+
width: input.width,
|
|
26
|
+
height: input.height,
|
|
27
|
+
...(previous !== undefined && { prevScales: previous }),
|
|
28
|
+
...(baselineDomains !== undefined && { baselineDomains }),
|
|
29
|
+
...(input.rowFilters.length > 0 && { rowFilters: input.rowFilters }),
|
|
30
|
+
});
|
|
31
|
+
}, [input.spec, input.baselineSpec, input.width, input.height, input.rowFilters, epoch]);
|
|
32
|
+
const strata = useMemo(() => (model === null ? [] : planStrata(model.scene, model.layerBackends)), [model]);
|
|
33
|
+
const pendingDisposal = useRef(new Set());
|
|
34
|
+
useHostLayoutEffect(() => {
|
|
35
|
+
if (model === null)
|
|
36
|
+
return () => { };
|
|
37
|
+
pendingDisposal.current.delete(model);
|
|
38
|
+
scales.current = model.scales.state;
|
|
39
|
+
return () => {
|
|
40
|
+
const pending = pendingDisposal.current;
|
|
41
|
+
pending.add(model);
|
|
42
|
+
// StrictMode replays effect setup without remounting the memoized model.
|
|
43
|
+
// The second setup cancels disposal; a replaced/unmounted model is released.
|
|
44
|
+
queueMicrotask(() => {
|
|
45
|
+
if (pending.delete(model))
|
|
46
|
+
model.dispose();
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
}, [model]);
|
|
50
|
+
return {
|
|
51
|
+
model,
|
|
52
|
+
strata,
|
|
53
|
+
resetScales() {
|
|
54
|
+
scales.current = null;
|
|
55
|
+
setEpoch((value) => value + 1);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=plot-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot-runtime.js","sourceRoot":"","sources":["../src/plot-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plot-surface.d.ts","sourceRoot":"","sources":["../src/plot-surface.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAuV1B,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,+BAE9C"}
|