Skip to content

packages/core/src/features/viz/inspection/capture.ts

Read as Markdown

This is the source snapshot used to build these API details. View this revision on GitHub.

Back to reference

1 import { invertNumericPosition } from "../lib/series-position.js";
2 import { useRenderedRef } from "./owned-ref.js";
3 import type { HoverSeries } from "../lib/hover-types.js";
4 import type {
5   NumericSeriesCapture,
6   NumericInspectionRef,
7   PointInspectionRef,
8   PointRenderedSeries,
9 } from "./capture-types.js";
10 
11 function useCapture<D>(): PointInspectionRef<D> {
12   return useRenderedRef<NumericSeriesCapture<D>, PointRenderedSeries<D>>(
13     "numericSeriesInspection",
14     (candidate, geometry) => {
15       const rows = candidate.observations.map((row) =>
16         Object.freeze({
17           ...row,
18           anchorLocal: Object.freeze({ ...row.anchorLocal }),
19           anchorRoot: geometry.rootAtLocal(row.anchorLocal),
20         }),
21       );
22       return Object.freeze({
23         observations: Object.freeze(rows),
24         marks: Object.freeze(candidate.observations.slice()),
25         assertLive: geometry.assertLive,
26         localAtRoot: geometry.localAtRoot,
27         anchorInsideClips: geometry.anchorInsideClips,
28         domainXAtRoot(point: Readonly<{ x: number; y: number }>) {
29           const local = geometry.localAtRoot(point);
30           return local
31             ? invertNumericPosition(candidate.xScale, local.x)
32             : undefined;
33         },
34         anchorAtDomain(point: Readonly<{ domainX: number; domainY: number }>) {
35           geometry.assertLive();
36           const anchorLocal = Object.freeze({
37             x: candidate.xScale.map(point.domainX),
38             y: candidate.yScale.map(point.domainY),
39           });
40           return Object.freeze({
41             anchorLocal,
42             anchorRoot: geometry.rootAtLocal(anchorLocal),
43           });
44         },
45       });
46     },
47   );
48 }
49 
50 /**
51  * Owns optional numeric capture without reading signals or executing queries.
52  * @param _series - Typed descriptor used for datum inference; not observed or registered.
53  * @returns A stable mount-owned capture ref; pass it to one numeric series' inspection prop.
54  * @see {@link NumericInspectionRef}
55  */
56 export function useNumericInspection<D>(
57   _series: HoverSeries<D>,
58 ): NumericInspectionRef<D> {
59   return useCapture<D>();
60 }
61 
62 /**
63  * Owns optional circle/ring capture for one PointSeries; O(n) retained geometry when enabled.
64  * @param _series - Typed descriptor used for datum inference; not observed or registered.
65  * @returns A stable point inspection ref. Rendered records are borrowed until replacement/disposal.
66  * @see {@link PointInspectionRef}
67  */
68 export function usePointInspection<D>(
69   _series: HoverSeries<D>,
70 ): PointInspectionRef<D> {
71   return useCapture<D>();
72 }
73 

Documentation built with @pibbl/core 0.0.2, revision dd39ce2. ALPHA — NOT FOR PRODUCTION USE.