@pibbl/core 0.0.2 → 0.0.3-alpha.85.1
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/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +15 -20
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +39 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/viz/index.d.ts +55 -6
- package/dist/features/viz/index.js +107 -2
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis.js +1 -1
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +16 -1
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +148 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +5 -2
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +124 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/scale-context.d.ts +1 -1
- package/dist/features/viz/lib/scale-ticks.js +21 -6
- package/dist/features/viz/lib/scale-ticks.js.map +2 -2
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +20 -4
- package/dist/features/viz/lib/use-continuous-scale.js +6 -1
- package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +106 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +2 -0
- package/dist/filters.js +2 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +2 -0
- package/dist/internal.js +4 -0
- package/dist/internal.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +13 -0
- package/dist/lib/events/event-facade.js +23 -0
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/propagation.js +19 -14
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/execute-render.js +13 -0
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-transaction.d.ts +5 -2
- package/dist/lib/render-transaction.js +23 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/types.d.ts +6 -0
- package/package.json +10 -2
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { jsx } from "@pibbl/core/jsx-runtime";
|
|
2
2
|
import { Path, resolveSignalValue } from "@pibbl/core";
|
|
3
3
|
import { useInternalValueMemoSlot } from "@pibbl/core/internal";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
appendCurveForward,
|
|
6
|
+
curveGeometry,
|
|
7
|
+
resolveSeriesCurve
|
|
8
|
+
} from "./curve-definition.js";
|
|
9
|
+
import {
|
|
10
|
+
useSeriesPosition,
|
|
11
|
+
seriesAccessor,
|
|
12
|
+
mapSeriesPosition
|
|
13
|
+
} from "./series-position.js";
|
|
5
14
|
import { width, opacity } from "./paint.js";
|
|
6
|
-
function accessor(input) {
|
|
7
|
-
return typeof input === "function" ? input : (datum) => datum[input];
|
|
8
|
-
}
|
|
9
15
|
function LineSeries({
|
|
10
16
|
data: dataInput,
|
|
11
17
|
x: xInput,
|
|
@@ -13,20 +19,24 @@ function LineSeries({
|
|
|
13
19
|
xScale: xId,
|
|
14
20
|
yScale: yId,
|
|
15
21
|
defined,
|
|
22
|
+
inspection,
|
|
16
23
|
curve,
|
|
17
24
|
style: styleInput,
|
|
18
25
|
...eventProps
|
|
19
26
|
}) {
|
|
20
|
-
const xScale =
|
|
21
|
-
const yScale =
|
|
22
|
-
const x = useInternalValueMemoSlot(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const xScale = useSeriesPosition(xId);
|
|
28
|
+
const yScale = useSeriesPosition(yId);
|
|
29
|
+
const x = useInternalValueMemoSlot(
|
|
30
|
+
"vizXAccessor",
|
|
31
|
+
() => seriesAccessor(xInput),
|
|
32
|
+
[xInput]
|
|
33
|
+
);
|
|
34
|
+
const y = useInternalValueMemoSlot(
|
|
35
|
+
"vizYAccessor",
|
|
36
|
+
() => seriesAccessor(yInput),
|
|
37
|
+
[yInput]
|
|
38
|
+
);
|
|
39
|
+
const curveDefinition = resolveSeriesCurve(curve);
|
|
30
40
|
const data = resolveSignalValue(dataInput);
|
|
31
41
|
if (!Array.isArray(data))
|
|
32
42
|
throw new TypeError(
|
|
@@ -45,29 +55,38 @@ function LineSeries({
|
|
|
45
55
|
"LineSeries"
|
|
46
56
|
);
|
|
47
57
|
const path = new Path2D();
|
|
48
|
-
|
|
49
|
-
let
|
|
58
|
+
const captured = inspection ? [] : void 0;
|
|
59
|
+
let runId = 0;
|
|
60
|
+
if (inspection && (xScale.type === "point" || yScale.type === "point")) throw new TypeError("Numeric line inspection requires numeric continuous scales.");
|
|
61
|
+
let run = [];
|
|
62
|
+
const flushRun = () => {
|
|
63
|
+
if (run.length >= 2) {
|
|
64
|
+
const geometry = curveGeometry(curveDefinition, run);
|
|
65
|
+
path.moveTo(geometry.start[0], geometry.start[1]);
|
|
66
|
+
appendCurveForward(path, geometry);
|
|
67
|
+
}
|
|
68
|
+
run = [];
|
|
69
|
+
};
|
|
50
70
|
for (let i = 0; i < data.length; i++) {
|
|
51
71
|
const datum = data[i];
|
|
52
72
|
if (defined && !defined(datum, i, data)) {
|
|
53
|
-
|
|
54
|
-
|
|
73
|
+
flushRun();
|
|
74
|
+
runId++;
|
|
55
75
|
continue;
|
|
56
76
|
}
|
|
57
77
|
const xv = x(datum, i, data), yv = y(datum, i, data);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
78
|
+
const px = mapSeriesPosition(xScale, xv), py = mapSeriesPosition(yScale, yv);
|
|
79
|
+
if (px === void 0 || py === void 0) {
|
|
80
|
+
flushRun();
|
|
81
|
+
runId++;
|
|
61
82
|
continue;
|
|
62
83
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
path.lineTo(point[0], point[1]);
|
|
67
|
-
inRun = true;
|
|
68
|
-
}
|
|
69
|
-
previous = point;
|
|
84
|
+
captured?.push(Object.freeze({ datum, sourceIndex: i, domainX: xv, domainY: yv, anchorLocal: Object.freeze({ x: px, y: py }), run: runId }));
|
|
85
|
+
const point = [px, py];
|
|
86
|
+
run.push(point);
|
|
70
87
|
}
|
|
88
|
+
flushRun();
|
|
89
|
+
if (inspection && xScale.type !== "point" && yScale.type !== "point") inspection.capture({ observations: captured, xScale, yScale });
|
|
71
90
|
return /* @__PURE__ */ jsx(
|
|
72
91
|
Path,
|
|
73
92
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/features/viz/lib/line-series.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Path, resolveSignalValue } from \"@pibbl/core\";\nimport { useInternalValueMemoSlot } from \"@pibbl/core/internal\";\nimport type {
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { Path, resolveSignalValue } from \"@pibbl/core\";\nimport { useInternalValueMemoSlot } from \"@pibbl/core/internal\";\nimport type { LineSeriesProps } from \"./types.js\";\nimport {\n appendCurveForward,\n curveGeometry,\n resolveSeriesCurve,\n} from \"./curve-definition.js\";\nimport {\n useSeriesPosition,\n seriesAccessor,\n mapSeriesPosition,\n} from \"./series-position.js\";\nimport { width, opacity } from \"./paint.js\";\n/**\n * Draws a scaled line through defined data values, leaving gaps for undefined values.\n *\n * @param props - Data, coordinate accessors, scales, and line styling. See {@link LineSeriesProps}\n * .\n * @returns Pibbl nodes drawing the data as a line series.\n *\n * @see {@link LineSeriesProps}\n */\nexport function LineSeries<D>({\n data: dataInput,\n x: xInput,\n y: yInput,\n xScale: xId,\n yScale: yId,\n defined,\n inspection,\n curve,\n style: styleInput,\n ...eventProps\n}: LineSeriesProps<D>) {\n const xScale = useSeriesPosition(xId);\n const yScale = useSeriesPosition(yId);\n const x = useInternalValueMemoSlot(\n \"vizXAccessor\",\n () => seriesAccessor(xInput),\n [xInput],\n );\n const y = useInternalValueMemoSlot(\n \"vizYAccessor\",\n () => seriesAccessor(yInput),\n [yInput],\n );\n const curveDefinition = resolveSeriesCurve(curve);\n const data = resolveSignalValue(dataInput);\n if (!Array.isArray(data))\n throw new TypeError(\n \"LineSeries data must be an array or a signal containing an array.\",\n );\n const style = resolveSignalValue(styleInput) ?? {};\n const stroke = resolveSignalValue(style.stroke) ?? \"#2563eb\";\n const strokeWidth = width(\n resolveSignalValue(style.strokeWidth) ?? 2,\n \"LineSeries\",\n );\n const alpha = opacity(resolveSignalValue(style.opacity) ?? 1, \"LineSeries\");\n const cursor = resolveSignalValue(style.cursor);\n const lineInteractionWidth = width(\n resolveSignalValue(style.lineInteractionWidth) ?? strokeWidth,\n \"LineSeries\",\n );\n const path = new Path2D();\n const captured: import(\"../inspection/capture-types.js\").CapturedNumericObservation<D>[] | undefined = inspection ? [] : undefined;\n let runId = 0;\n if (inspection && (xScale.type === \"point\" || yScale.type === \"point\")) throw new TypeError(\"Numeric line inspection requires numeric continuous scales.\");\n let run: (readonly [number, number])[] = [];\n const flushRun = () => {\n if (run.length >= 2) {\n const geometry = curveGeometry(curveDefinition, run);\n path.moveTo(geometry.start[0], geometry.start[1]);\n appendCurveForward(path, geometry);\n }\n run = [];\n };\n for (let i = 0; i < data.length; i++) {\n const datum = data[i];\n if (defined && !defined(datum, i, data)) {\n flushRun();\n runId++;\n continue;\n }\n const xv = x(datum, i, data),\n yv = y(datum, i, data);\n const px = mapSeriesPosition(xScale, xv),\n py = mapSeriesPosition(yScale, yv);\n if (px === undefined || py === undefined) {\n flushRun();\n runId++;\n continue;\n }\n captured?.push(Object.freeze({datum,sourceIndex:i,domainX:xv as number,domainY:yv as number,anchorLocal:Object.freeze({x:px,y:py}),run:runId}));\n const point = [px, py] as const;\n run.push(point);\n }\n flushRun();\n if (inspection && xScale.type !== \"point\" && yScale.type !== \"point\") inspection.capture({observations:captured!,xScale,yScale});\n return (\n <Path\n {...eventProps}\n style={{\n d: path,\n stroke,\n strokeWidth,\n opacity: alpha,\n cursor,\n lineInteractionWidth,\n }}\n />\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -61,7 +61,7 @@ function resolveLinearScale(domainInput, rangeInput, reverse, width, height) {
|
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
function equalScale(a, b) {
|
|
64
|
-
return a.type === b.type && (a.type !== "symlog" || b.type === "symlog" && a.constant === b.constant) && (a.type !== "point" || b.type === "point" && a.padding === b.padding) && (a.type !== "log" || b.type === "log" && a.base === b.base) && a.domain.length === b.domain.length && a.domain.every((value, index) => Object.is(value, b.domain[index])) && (a.type !== "band" || b.type === "band" && a.bandwidth === b.bandwidth && a.step === b.step) && Object.is(a.range[0], b.range[0]) && Object.is(a.range[1], b.range[1]) && Object.is(a.frame.width, b.frame.width) && Object.is(a.frame.height, b.frame.height);
|
|
64
|
+
return a.type === b.type && (a.type !== "trading-time" || b.type === "trading-time" && a.logicalRange.every((v, i) => v === b.logicalRange[i])) && (a.type !== "symlog" || b.type === "symlog" && a.constant === b.constant) && (a.type !== "point" || b.type === "point" && a.padding === b.padding) && (a.type !== "log" || b.type === "log" && a.base === b.base) && a.domain.length === b.domain.length && a.domain.every((value, index) => Object.is(value, b.domain[index])) && (a.type !== "band" || b.type === "band" && a.bandwidth === b.bandwidth && a.step === b.step) && Object.is(a.range[0], b.range[0]) && Object.is(a.range[1], b.range[1]) && Object.is(a.frame.width, b.frame.width) && Object.is(a.frame.height, b.frame.height);
|
|
65
65
|
}
|
|
66
66
|
export {
|
|
67
67
|
equalScale,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/features/viz/lib/linear-scale.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n LinearDomain,\n ResolvedLinearScale,\n ResolvedScale,\n ScaleRange,\n} from \"./types.js\";\nfunction finite(value: number, field: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw new RangeError(`Scale ${field} must be finite.`);\n return value;\n}\nfunction pair(\n value: readonly number[],\n field: string,\n): readonly [number, number] {\n if (!Array.isArray(value) || value.length !== 2)\n throw new RangeError(`Scale ${field} requires two finite endpoints.`);\n return Object.freeze([finite(value[0], field), finite(value[1], field)]);\n}\nexport function resolveLinearScale(\n domainInput: LinearDomain,\n rangeInput: ScaleRange,\n reverse: boolean,\n width: number,\n height: number,\n): ResolvedLinearScale {\n finite(width, \"frame.width\");\n finite(height, \"frame.height\");\n if (width < 0 || height < 0)\n throw new RangeError(\"Scale allocation must be nonnegative.\");\n if (typeof reverse !== \"boolean\")\n throw new TypeError(\"Scale reverse must be boolean.\");\n const domain = pair(domainInput, \"domain\");\n if (domain[0] === domain[1])\n throw new RangeError(\"Scale domain endpoints must differ.\");\n const original = pair(\n rangeInput === \"width\"\n ? [0, width]\n : rangeInput === \"height\"\n ? [0, height]\n : (rangeInput as readonly number[]),\n \"range\",\n );\n const range = reverse ? pair([original[1], original[0]], \"range\") : original;\n const domainSpan = finite(domain[1] - domain[0], \"domain span\");\n const rangeSpan = finite(range[1] - range[0], \"range span\");\n return Object.freeze({\n type: \"linear\",\n domain,\n range,\n frame: Object.freeze({ x: 0, y: 0, width, height }),\n map(value: number) {\n return finite(\n range[0] +\n ((finite(value, \"map input\") - domain[0]) / domainSpan) * rangeSpan,\n \"mapped output\",\n );\n },\n invert(pixel: number) {\n if (rangeSpan === 0)\n throw new RangeError(\n \"Scale cannot invert a collapsed range; supply a nonzero extent.\",\n );\n return finite(\n domain[0] +\n ((finite(pixel, \"invert input\") - range[0]) / rangeSpan) * domainSpan,\n \"inverted output\",\n );\n },\n ticks(count = 5) {\n if (!Number.isInteger(count) || count < 2 || count > 100)\n throw new RangeError(\n \"Scale ticks count must be an integer from 2 to 100.\",\n );\n return Object.freeze(\n Array.from({ length: count }, (_, i) =>\n i === count - 1\n ? domain[1]\n : finite(domain[0] + (domainSpan * i) / (count - 1), \"tick\"),\n ),\n );\n },\n });\n}\nexport function equalScale(a: ResolvedScale, b: ResolvedScale): boolean {\n return (\n a.type === b.type &&\n (a.type !== \"
|
|
5
|
-
"mappings": "AAMA,SAAS,OAAO,OAAe,OAAuB;AACpD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK;AACrD,UAAM,IAAI,WAAW,SAAS,KAAK,kBAAkB;AACvD,SAAO;AACT;AACA,SAAS,KACP,OACA,OAC2B;AAC3B,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAC5C,UAAM,IAAI,WAAW,SAAS,KAAK,iCAAiC;AACtE,SAAO,OAAO,OAAO,CAAC,OAAO,MAAM,CAAC,GAAG,KAAK,GAAG,OAAO,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;AACzE;AACO,SAAS,mBACd,aACA,YACA,SACA,OACA,QACqB;AACrB,SAAO,OAAO,aAAa;AAC3B,SAAO,QAAQ,cAAc;AAC7B,MAAI,QAAQ,KAAK,SAAS;AACxB,UAAM,IAAI,WAAW,uCAAuC;AAC9D,MAAI,OAAO,YAAY;AACrB,UAAM,IAAI,UAAU,gCAAgC;AACtD,QAAM,SAAS,KAAK,aAAa,QAAQ;AACzC,MAAI,OAAO,CAAC,MAAM,OAAO,CAAC;AACxB,UAAM,IAAI,WAAW,qCAAqC;AAC5D,QAAM,WAAW;AAAA,IACf,eAAe,UACX,CAAC,GAAG,KAAK,IACT,eAAe,WACb,CAAC,GAAG,MAAM,IACT;AAAA,IACP;AAAA,EACF;AACA,QAAM,QAAQ,UAAU,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,OAAO,IAAI;AACpE,QAAM,aAAa,OAAO,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,aAAa;AAC9D,QAAM,YAAY,OAAO,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY;AAC1D,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO,OAAO,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,CAAC;AAAA,IAClD,IAAI,OAAe;AACjB,aAAO;AAAA,QACL,MAAM,CAAC,KACH,OAAO,OAAO,WAAW,IAAI,OAAO,CAAC,KAAK,aAAc;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,OAAe;AACpB,UAAI,cAAc;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,aAAO;AAAA,QACL,OAAO,CAAC,KACJ,OAAO,OAAO,cAAc,IAAI,MAAM,CAAC,KAAK,YAAa;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,GAAG;AACf,UAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ;AACnD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,aAAO,OAAO;AAAA,QACZ,MAAM;AAAA,UAAK,EAAE,QAAQ,MAAM;AAAA,UAAG,CAAC,GAAG,MAChC,MAAM,QAAQ,IACV,OAAO,CAAC,IACR,OAAO,OAAO,CAAC,IAAK,aAAa,KAAM,QAAQ,IAAI,MAAM;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AACO,SAAS,WAAW,GAAkB,GAA2B;AACtE,SACE,EAAE,SAAS,EAAE,SACZ,EAAE,SAAS,
|
|
4
|
+
"sourcesContent": ["import type {\n LinearDomain,\n ResolvedLinearScale,\n ResolvedScale,\n ScaleRange,\n} from \"./types.js\";\nfunction finite(value: number, field: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw new RangeError(`Scale ${field} must be finite.`);\n return value;\n}\nfunction pair(\n value: readonly number[],\n field: string,\n): readonly [number, number] {\n if (!Array.isArray(value) || value.length !== 2)\n throw new RangeError(`Scale ${field} requires two finite endpoints.`);\n return Object.freeze([finite(value[0], field), finite(value[1], field)]);\n}\nexport function resolveLinearScale(\n domainInput: LinearDomain,\n rangeInput: ScaleRange,\n reverse: boolean,\n width: number,\n height: number,\n): ResolvedLinearScale {\n finite(width, \"frame.width\");\n finite(height, \"frame.height\");\n if (width < 0 || height < 0)\n throw new RangeError(\"Scale allocation must be nonnegative.\");\n if (typeof reverse !== \"boolean\")\n throw new TypeError(\"Scale reverse must be boolean.\");\n const domain = pair(domainInput, \"domain\");\n if (domain[0] === domain[1])\n throw new RangeError(\"Scale domain endpoints must differ.\");\n const original = pair(\n rangeInput === \"width\"\n ? [0, width]\n : rangeInput === \"height\"\n ? [0, height]\n : (rangeInput as readonly number[]),\n \"range\",\n );\n const range = reverse ? pair([original[1], original[0]], \"range\") : original;\n const domainSpan = finite(domain[1] - domain[0], \"domain span\");\n const rangeSpan = finite(range[1] - range[0], \"range span\");\n return Object.freeze({\n type: \"linear\",\n domain,\n range,\n frame: Object.freeze({ x: 0, y: 0, width, height }),\n map(value: number) {\n return finite(\n range[0] +\n ((finite(value, \"map input\") - domain[0]) / domainSpan) * rangeSpan,\n \"mapped output\",\n );\n },\n invert(pixel: number) {\n if (rangeSpan === 0)\n throw new RangeError(\n \"Scale cannot invert a collapsed range; supply a nonzero extent.\",\n );\n return finite(\n domain[0] +\n ((finite(pixel, \"invert input\") - range[0]) / rangeSpan) * domainSpan,\n \"inverted output\",\n );\n },\n ticks(count = 5) {\n if (!Number.isInteger(count) || count < 2 || count > 100)\n throw new RangeError(\n \"Scale ticks count must be an integer from 2 to 100.\",\n );\n return Object.freeze(\n Array.from({ length: count }, (_, i) =>\n i === count - 1\n ? domain[1]\n : finite(domain[0] + (domainSpan * i) / (count - 1), \"tick\"),\n ),\n );\n },\n });\n}\nexport function equalScale(a: ResolvedScale, b: ResolvedScale): boolean {\n return (\n a.type === b.type &&\n (a.type !== \"trading-time\" ||\n (b.type === \"trading-time\" &&\n a.logicalRange.every((v, i) => v === b.logicalRange[i]))) &&\n (a.type !== \"symlog\" ||\n (b.type === \"symlog\" && a.constant === b.constant)) &&\n (a.type !== \"point\" || (b.type === \"point\" && a.padding === b.padding)) &&\n (a.type !== \"log\" || (b.type === \"log\" && a.base === b.base)) &&\n a.domain.length === b.domain.length &&\n a.domain.every((value, index) => Object.is(value, b.domain[index])) &&\n (a.type !== \"band\" ||\n (b.type === \"band\" &&\n a.bandwidth === b.bandwidth &&\n a.step === b.step)) &&\n Object.is(a.range[0], b.range[0]) &&\n Object.is(a.range[1], b.range[1]) &&\n Object.is(a.frame.width, b.frame.width) &&\n Object.is(a.frame.height, b.frame.height)\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type SeriesCurve } from "./curve-definition.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns the immutable monotone-X cubic Hermite definition.
|
|
4
|
+
*
|
|
5
|
+
* It uses weighted harmonic interior slopes and limited one-sided endpoint slopes, preserving every observation,
|
|
6
|
+
* flat segment, and local extremum without sorting data. Each run must have strictly ascending
|
|
7
|
+
* or strictly descending x coordinates.
|
|
8
|
+
*
|
|
9
|
+
* @returns The named {@link SeriesCurve} definition.
|
|
10
|
+
*/
|
|
11
|
+
export declare function monotoneX(): SeriesCurve;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSeriesCurve
|
|
3
|
+
} from "./curve-definition.js";
|
|
4
|
+
function endpointSlope(h0, h1, first, second) {
|
|
5
|
+
let slope = ((2 * h0 + h1) * first - h0 * second) / (h0 + h1);
|
|
6
|
+
if (Math.sign(slope) !== Math.sign(first)) return 0;
|
|
7
|
+
if (Math.sign(first) !== Math.sign(second) && Math.abs(slope) > Math.abs(3 * first))
|
|
8
|
+
slope = 3 * first;
|
|
9
|
+
return slope;
|
|
10
|
+
}
|
|
11
|
+
function monotoneSegments(points) {
|
|
12
|
+
if (points.length < 2) return [];
|
|
13
|
+
const direction = points[1][0] > points[0][0] ? 1 : -1;
|
|
14
|
+
const x = points.map((point) => direction * point[0]);
|
|
15
|
+
const h = [];
|
|
16
|
+
const delta = [];
|
|
17
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
18
|
+
const width = x[i + 1] - x[i];
|
|
19
|
+
if (!Number.isFinite(width) || width <= 0)
|
|
20
|
+
throw new RangeError(
|
|
21
|
+
"monotoneX requires strictly ascending or descending finite x coordinates."
|
|
22
|
+
);
|
|
23
|
+
h.push(width);
|
|
24
|
+
delta.push((points[i + 1][1] - points[i][1]) / width);
|
|
25
|
+
}
|
|
26
|
+
const slopes = new Array(points.length);
|
|
27
|
+
if (points.length === 2) slopes[0] = slopes[1] = delta[0];
|
|
28
|
+
else {
|
|
29
|
+
slopes[0] = endpointSlope(h[0], h[1], delta[0], delta[1]);
|
|
30
|
+
slopes[points.length - 1] = endpointSlope(
|
|
31
|
+
h.at(-1),
|
|
32
|
+
h.at(-2),
|
|
33
|
+
delta.at(-1),
|
|
34
|
+
delta.at(-2)
|
|
35
|
+
);
|
|
36
|
+
for (let i = 1; i < points.length - 1; i++) {
|
|
37
|
+
const previous = delta[i - 1], next = delta[i];
|
|
38
|
+
slopes[i] = previous === 0 || next === 0 || Math.sign(previous) !== Math.sign(next) ? 0 : 3 * (h[i - 1] + h[i]) / ((2 * h[i] + h[i - 1]) / previous + (h[i] + 2 * h[i - 1]) / next);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return points.slice(1).map((end, index) => {
|
|
42
|
+
const start = points[index], width = h[index];
|
|
43
|
+
const control1 = [
|
|
44
|
+
start[0] + (end[0] - start[0]) / 3,
|
|
45
|
+
start[1] + slopes[index] * width / 3
|
|
46
|
+
];
|
|
47
|
+
const control2 = [
|
|
48
|
+
end[0] - (end[0] - start[0]) / 3,
|
|
49
|
+
end[1] - slopes[index + 1] * width / 3
|
|
50
|
+
];
|
|
51
|
+
if (![...control1, ...control2, ...end].every(Number.isFinite))
|
|
52
|
+
throw new RangeError("monotoneX generated non-finite cubic controls.");
|
|
53
|
+
return Object.freeze({ end, control1, control2 });
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const monotone = /* @__PURE__ */ createSeriesCurve(monotoneSegments);
|
|
57
|
+
function monotoneX() {
|
|
58
|
+
return monotone;
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
monotoneX
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=monotone-curve.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/viz/lib/monotone-curve.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n createSeriesCurve,\n type SeriesCurve,\n type SeriesCurvePoint,\n} from \"./curve-definition.js\";\n\nfunction endpointSlope(\n h0: number,\n h1: number,\n first: number,\n second: number,\n): number {\n let slope = ((2 * h0 + h1) * first - h0 * second) / (h0 + h1);\n if (Math.sign(slope) !== Math.sign(first)) return 0;\n if (\n Math.sign(first) !== Math.sign(second) &&\n Math.abs(slope) > Math.abs(3 * first)\n )\n slope = 3 * first;\n return slope;\n}\n\nfunction monotoneSegments(points: readonly SeriesCurvePoint[]) {\n if (points.length < 2) return [];\n const direction = points[1][0] > points[0][0] ? 1 : -1;\n const x = points.map((point) => direction * point[0]);\n const h: number[] = [];\n const delta: number[] = [];\n for (let i = 0; i < points.length - 1; i++) {\n const width = x[i + 1] - x[i];\n if (!Number.isFinite(width) || width <= 0)\n throw new RangeError(\n \"monotoneX requires strictly ascending or descending finite x coordinates.\",\n );\n h.push(width);\n delta.push((points[i + 1][1] - points[i][1]) / width);\n }\n const slopes = new Array<number>(points.length);\n if (points.length === 2) slopes[0] = slopes[1] = delta[0];\n else {\n slopes[0] = endpointSlope(h[0], h[1], delta[0], delta[1]);\n slopes[points.length - 1] = endpointSlope(\n h.at(-1)!,\n h.at(-2)!,\n delta.at(-1)!,\n delta.at(-2)!,\n );\n for (let i = 1; i < points.length - 1; i++) {\n const previous = delta[i - 1],\n next = delta[i];\n slopes[i] =\n previous === 0 || next === 0 || Math.sign(previous) !== Math.sign(next)\n ? 0\n : (3 * (h[i - 1] + h[i])) /\n ((2 * h[i] + h[i - 1]) / previous + (h[i] + 2 * h[i - 1]) / next);\n }\n }\n return points.slice(1).map((end, index) => {\n const start = points[index],\n width = h[index];\n const control1: SeriesCurvePoint = [\n start[0] + (end[0] - start[0]) / 3,\n start[1] + (slopes[index] * width) / 3,\n ];\n const control2: SeriesCurvePoint = [\n end[0] - (end[0] - start[0]) / 3,\n end[1] - (slopes[index + 1] * width) / 3,\n ];\n if (![...control1, ...control2, ...end].every(Number.isFinite))\n throw new RangeError(\"monotoneX generated non-finite cubic controls.\");\n return Object.freeze({ end, control1, control2 });\n });\n}\n\nconst monotone = /* @__PURE__ */ createSeriesCurve(monotoneSegments);\n\n/**\n * Returns the immutable monotone-X cubic Hermite definition.\n *\n * It uses weighted harmonic interior slopes and limited one-sided endpoint slopes, preserving every observation,\n * flat segment, and local extremum without sorting data. Each run must have strictly ascending\n * or strictly descending x coordinates.\n *\n * @returns The named {@link SeriesCurve} definition.\n */\nexport function monotoneX(): SeriesCurve {\n return monotone;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NumericDomain } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Linearly interpolates both endpoints of a finite numeric range.
|
|
4
|
+
*
|
|
5
|
+
* The returned pair is frozen. It preserves ascending, descending, and flat
|
|
6
|
+
* endpoint order for progress within zero through one. Progress outside that
|
|
7
|
+
* interval deliberately extrapolates, matching Pibbl's numeric tween behavior.
|
|
8
|
+
*
|
|
9
|
+
* @param from - Starting finite endpoint pair.
|
|
10
|
+
* @param to - Ending finite endpoint pair.
|
|
11
|
+
* @param progress - Finite interpolation progress supplied by an animation definition.
|
|
12
|
+
* @returns A frozen finite endpoint pair.
|
|
13
|
+
* @see {@link NumericDomain}
|
|
14
|
+
*/
|
|
15
|
+
export declare function interpolateNumericRange(from: NumericDomain, to: NumericDomain, progress: number): NumericDomain;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
function endpoint(value, name) {
|
|
2
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
3
|
+
throw new RangeError(`Numeric range ${name} must be finite.`);
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
function range(value, name) {
|
|
7
|
+
if (!Array.isArray(value) || value.length !== 2)
|
|
8
|
+
throw new TypeError(`Numeric range ${name} requires two endpoints.`);
|
|
9
|
+
return [endpoint(value[0], `${name}[0]`), endpoint(value[1], `${name}[1]`)];
|
|
10
|
+
}
|
|
11
|
+
function interpolateEndpoint(from, to, progress) {
|
|
12
|
+
if (progress === 0 || from === to) return from;
|
|
13
|
+
if (progress === 1) return to;
|
|
14
|
+
const difference = to - from;
|
|
15
|
+
const direct = from + difference * progress;
|
|
16
|
+
if (Number.isFinite(direct)) return direct;
|
|
17
|
+
const scale = Math.max(Math.abs(from), Math.abs(to));
|
|
18
|
+
const scaled = (from / scale + (to / scale - from / scale) * progress) * scale;
|
|
19
|
+
if (!Number.isFinite(scaled))
|
|
20
|
+
throw new RangeError("Numeric range interpolation must produce finite endpoints.");
|
|
21
|
+
return scaled;
|
|
22
|
+
}
|
|
23
|
+
function interpolateNumericRange(from, to, progress) {
|
|
24
|
+
const start = range(from, "from");
|
|
25
|
+
const end = range(to, "to");
|
|
26
|
+
if (typeof progress !== "number" || !Number.isFinite(progress))
|
|
27
|
+
throw new RangeError("Numeric range interpolation progress must be finite.");
|
|
28
|
+
return Object.freeze([
|
|
29
|
+
interpolateEndpoint(start[0], end[0], progress),
|
|
30
|
+
interpolateEndpoint(start[1], end[1], progress)
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
interpolateNumericRange
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=numeric-range-interpolation.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/viz/lib/numeric-range-interpolation.ts"],
|
|
4
|
+
"sourcesContent": ["import type { NumericDomain } from \"./types.js\";\n\nfunction endpoint(value: unknown, name: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw new RangeError(`Numeric range ${name} must be finite.`);\n return value;\n}\n\nfunction range(value: NumericDomain, name: string): readonly [number, number] {\n if (!Array.isArray(value) || value.length !== 2)\n throw new TypeError(`Numeric range ${name} requires two endpoints.`);\n return [endpoint(value[0], `${name}[0]`), endpoint(value[1], `${name}[1]`)];\n}\n\nfunction interpolateEndpoint(from: number, to: number, progress: number): number {\n if (progress === 0 || from === to) return from;\n if (progress === 1) return to;\n const difference = to - from;\n const direct = from + difference * progress;\n if (Number.isFinite(direct)) return direct;\n\n // Scaling avoids overflow in the subtraction for opposite, very large endpoints.\n const scale = Math.max(Math.abs(from), Math.abs(to));\n const scaled =\n (from / scale + (to / scale - from / scale) * progress) * scale;\n if (!Number.isFinite(scaled))\n throw new RangeError(\"Numeric range interpolation must produce finite endpoints.\");\n return scaled;\n}\n\n/**\n * Linearly interpolates both endpoints of a finite numeric range.\n *\n * The returned pair is frozen. It preserves ascending, descending, and flat\n * endpoint order for progress within zero through one. Progress outside that\n * interval deliberately extrapolates, matching Pibbl's numeric tween behavior.\n *\n * @param from - Starting finite endpoint pair.\n * @param to - Ending finite endpoint pair.\n * @param progress - Finite interpolation progress supplied by an animation definition.\n * @returns A frozen finite endpoint pair.\n * @see {@link NumericDomain}\n */\nexport function interpolateNumericRange(\n from: NumericDomain,\n to: NumericDomain,\n progress: number,\n): NumericDomain {\n const start = range(from, \"from\");\n const end = range(to, \"to\");\n if (typeof progress !== \"number\" || !Number.isFinite(progress))\n throw new RangeError(\"Numeric range interpolation progress must be finite.\");\n return Object.freeze([\n interpolateEndpoint(start[0], end[0], progress),\n interpolateEndpoint(start[1], end[1], progress),\n ]);\n}\n"],
|
|
5
|
+
"mappings": "AAEA,SAAS,SAAS,OAAgB,MAAsB;AACtD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK;AACrD,UAAM,IAAI,WAAW,iBAAiB,IAAI,kBAAkB;AAC9D,SAAO;AACT;AAEA,SAAS,MAAM,OAAsB,MAAyC;AAC5E,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAC5C,UAAM,IAAI,UAAU,iBAAiB,IAAI,0BAA0B;AACrE,SAAO,CAAC,SAAS,MAAM,CAAC,GAAG,GAAG,IAAI,KAAK,GAAG,SAAS,MAAM,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC;AAC5E;AAEA,SAAS,oBAAoB,MAAc,IAAY,UAA0B;AAC/E,MAAI,aAAa,KAAK,SAAS,GAAI,QAAO;AAC1C,MAAI,aAAa,EAAG,QAAO;AAC3B,QAAM,aAAa,KAAK;AACxB,QAAM,SAAS,OAAO,aAAa;AACnC,MAAI,OAAO,SAAS,MAAM,EAAG,QAAO;AAGpC,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;AACnD,QAAM,UACH,OAAO,SAAS,KAAK,QAAQ,OAAO,SAAS,YAAY;AAC5D,MAAI,CAAC,OAAO,SAAS,MAAM;AACzB,UAAM,IAAI,WAAW,4DAA4D;AACnF,SAAO;AACT;AAeO,SAAS,wBACd,MACA,IACA,UACe;AACf,QAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,QAAM,MAAM,MAAM,IAAI,IAAI;AAC1B,MAAI,OAAO,aAAa,YAAY,CAAC,OAAO,SAAS,QAAQ;AAC3D,UAAM,IAAI,WAAW,sDAAsD;AAC7E,SAAO,OAAO,OAAO;AAAA,IACnB,oBAAoB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ;AAAA,IAC9C,oBAAoB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ;AAAA,EAChD,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type PibblEventHandlers, type PibblEventParticipationOptions, type PibblNode, type SignalValue, type StrokeStyle } from "@pibbl/core";
|
|
2
|
+
import type { OhlcBarInspectionRef } from "../inspection/ohlc-bar.js";
|
|
3
|
+
import type { LineAccessor, ScaleId } from "./types.js";
|
|
4
|
+
/** Shared stroke presentation for an OHLC bar.
|
|
5
|
+
* @see {@link OhlcBarSeries}
|
|
6
|
+
*/
|
|
7
|
+
export interface OhlcBarSeriesStyle {
|
|
8
|
+
/** Positive total width, or automatic 70% spacing capped at 12; singleton fallback 8. */ readonly bandwidth?: number | "auto";
|
|
9
|
+
/** Stem and tick stroke; defaults to dark teal. Empty string disables painting. */ readonly stroke?: StrokeStyle;
|
|
10
|
+
/** Nonnegative local stroke width; default 1. */ readonly strokeWidth?: number;
|
|
11
|
+
/** Paint opacity from zero through one; default 1. */ readonly opacity?: number;
|
|
12
|
+
/** Cursor while the series owns targeting. */ readonly cursor?: string;
|
|
13
|
+
}
|
|
14
|
+
/** Source-ordered OHLC records rendered as a high/low stem with open/close ticks.
|
|
15
|
+
* @see {@link OhlcBarSeries}
|
|
16
|
+
*/
|
|
17
|
+
export interface OhlcBarSeriesProps<D> extends PibblEventHandlers, PibblEventParticipationOptions {
|
|
18
|
+
/** Original records or signal; never sorted or mutated. */
|
|
19
|
+
readonly data: SignalValue<readonly D[]>;
|
|
20
|
+
/** UTC-millisecond property or callback. */
|
|
21
|
+
readonly time: LineAccessor<D>;
|
|
22
|
+
/** Opening price property or callback. */
|
|
23
|
+
readonly open: LineAccessor<D>;
|
|
24
|
+
/** High price property or callback. */
|
|
25
|
+
readonly high: LineAccessor<D>;
|
|
26
|
+
/** Low price property or callback. */
|
|
27
|
+
readonly low: LineAccessor<D>;
|
|
28
|
+
/** Closing price property or callback. */
|
|
29
|
+
readonly close: LineAccessor<D>;
|
|
30
|
+
/** Numeric, UTC, or trading-time horizontal mapping identity. */
|
|
31
|
+
readonly xScale: ScaleId;
|
|
32
|
+
/** Continuous price mapping identity. */
|
|
33
|
+
readonly yScale: ScaleId;
|
|
34
|
+
/** Tests original rows before accessor evaluation.
|
|
35
|
+
* @param datum - Original row.
|
|
36
|
+
* @param index - Source index including skipped rows.
|
|
37
|
+
* @param data - Complete source array.
|
|
38
|
+
* @returns Whether the bar participates.
|
|
39
|
+
*/
|
|
40
|
+
readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;
|
|
41
|
+
/** Shared presentation or a hook-free original-row resolver.
|
|
42
|
+
* @param datum - Original row.
|
|
43
|
+
* @param index - Source index.
|
|
44
|
+
* @param data - Complete source array.
|
|
45
|
+
* @returns Plain OHLC-bar style.
|
|
46
|
+
*/
|
|
47
|
+
readonly style?: SignalValue<OhlcBarSeriesStyle> | ((datum: D, index: number, data: readonly D[]) => OhlcBarSeriesStyle);
|
|
48
|
+
/** Optional committed capture; the renderer does not execute inspection queries. */ readonly inspection?: OhlcBarInspectionRef<D>;
|
|
49
|
+
}
|
|
50
|
+
/** Paints source-ordered OHLC bars with a high/low stem, left open tick, and right close tick.
|
|
51
|
+
* @param props - Original OHLC accessors, scales, styles, events, and optional capture.
|
|
52
|
+
* @returns Ordinary Pibbl composition; equal disjoint styles share paths.
|
|
53
|
+
* @see {@link OhlcBarSeriesProps}
|
|
54
|
+
*/
|
|
55
|
+
export declare function OhlcBarSeries<D>({ data: input, time: timeInput, open: openInput, high: highInput, low: lowInput, close: closeInput, xScale, yScale, defined, style: styleInput, inspection, pointerEvents, ...events }: OhlcBarSeriesProps<D>): PibblNode;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { jsx, jsxs } from "@pibbl/core/jsx-runtime";
|
|
2
|
+
import {
|
|
3
|
+
Group,
|
|
4
|
+
Path,
|
|
5
|
+
resolveSignalValue
|
|
6
|
+
} from "@pibbl/core";
|
|
7
|
+
import { withHooksForbidden } from "@pibbl/core/internal";
|
|
8
|
+
import { financialMarkWidth } from "./financial-geometry.js";
|
|
9
|
+
import { opacity, width } from "./paint.js";
|
|
10
|
+
import { finiteCoordinate, pointAccessor, pointData } from "./point-data.js";
|
|
11
|
+
import { useNumericPosition } from "./series-position.js";
|
|
12
|
+
import { useContinuousScale } from "./use-continuous-scale.js";
|
|
13
|
+
function OhlcBarSeries({
|
|
14
|
+
data: input,
|
|
15
|
+
time: timeInput,
|
|
16
|
+
open: openInput,
|
|
17
|
+
high: highInput,
|
|
18
|
+
low: lowInput,
|
|
19
|
+
close: closeInput,
|
|
20
|
+
xScale,
|
|
21
|
+
yScale,
|
|
22
|
+
defined,
|
|
23
|
+
style: styleInput,
|
|
24
|
+
inspection,
|
|
25
|
+
pointerEvents,
|
|
26
|
+
...events
|
|
27
|
+
}) {
|
|
28
|
+
const xs = useNumericPosition(xScale), ys = useContinuousScale(yScale).get();
|
|
29
|
+
const data = pointData(resolveSignalValue(input), "OhlcBarSeries");
|
|
30
|
+
const time = pointAccessor(timeInput), open = pointAccessor(openInput), high = pointAccessor(highInput), low = pointAccessor(lowInput), close = pointAccessor(closeInput);
|
|
31
|
+
const rows = [];
|
|
32
|
+
for (let i = 0; i < data.length; i++) {
|
|
33
|
+
const datum = data[i];
|
|
34
|
+
if (defined && !defined(datum, i, data)) continue;
|
|
35
|
+
const t = time(datum, i, data), o = open(datum, i, data), h = high(datum, i, data), l = low(datum, i, data), c = close(datum, i, data);
|
|
36
|
+
if (!finiteCoordinate(t) || !finiteCoordinate(o) || !finiteCoordinate(h) || !finiteCoordinate(l) || !finiteCoordinate(c))
|
|
37
|
+
continue;
|
|
38
|
+
if (l > Math.min(o, c) || h < Math.max(o, c))
|
|
39
|
+
throw new RangeError(
|
|
40
|
+
`OhlcBarSeries: malformed OHLC at source index ${i}; require low <= open/close <= high.`
|
|
41
|
+
);
|
|
42
|
+
rows.push({
|
|
43
|
+
datum,
|
|
44
|
+
sourceIndex: i,
|
|
45
|
+
time: t,
|
|
46
|
+
open: o,
|
|
47
|
+
high: h,
|
|
48
|
+
low: l,
|
|
49
|
+
close: c,
|
|
50
|
+
x: xs.map(t)
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const defaultWidth = financialMarkWidth(rows.map((row) => row.x));
|
|
54
|
+
const specified = typeof styleInput === "function" ? styleInput : resolveSignalValue(styleInput);
|
|
55
|
+
const marks = inspection ? [] : void 0;
|
|
56
|
+
const batches = [];
|
|
57
|
+
for (const row of rows) {
|
|
58
|
+
const style = typeof specified === "function" ? withHooksForbidden(
|
|
59
|
+
"OhlcBarSeries style callback",
|
|
60
|
+
() => specified(row.datum, row.sourceIndex, data)
|
|
61
|
+
) : specified ?? {};
|
|
62
|
+
const markWidth = style.bandwidth === void 0 || style.bandwidth === "auto" ? defaultWidth : financialMarkWidth([], { width: style.bandwidth });
|
|
63
|
+
const halfWidth = markWidth / 2;
|
|
64
|
+
const stemLocal = Object.freeze({
|
|
65
|
+
x: row.x,
|
|
66
|
+
highY: ys.map(row.high),
|
|
67
|
+
lowY: ys.map(row.low)
|
|
68
|
+
});
|
|
69
|
+
const openTickLocal = Object.freeze({
|
|
70
|
+
x1: row.x - halfWidth,
|
|
71
|
+
x2: row.x,
|
|
72
|
+
y: ys.map(row.open)
|
|
73
|
+
});
|
|
74
|
+
const closeTickLocal = Object.freeze({
|
|
75
|
+
x1: row.x,
|
|
76
|
+
x2: row.x + halfWidth,
|
|
77
|
+
y: ys.map(row.close)
|
|
78
|
+
});
|
|
79
|
+
const stroke = style.stroke ?? "#173a35", strokeWidth = width(style.strokeWidth ?? 1, "OhlcBarSeries"), alpha = opacity(style.opacity ?? 1, "OhlcBarSeries");
|
|
80
|
+
marks?.push(
|
|
81
|
+
Object.freeze({
|
|
82
|
+
datum: row.datum,
|
|
83
|
+
sourceIndex: row.sourceIndex,
|
|
84
|
+
time: row.time,
|
|
85
|
+
open: row.open,
|
|
86
|
+
high: row.high,
|
|
87
|
+
low: row.low,
|
|
88
|
+
close: row.close,
|
|
89
|
+
anchorLocal: Object.freeze({ x: row.x, y: closeTickLocal.y }),
|
|
90
|
+
stemLocal,
|
|
91
|
+
openTickLocal,
|
|
92
|
+
closeTickLocal,
|
|
93
|
+
strokeWidthLocal: stroke && alpha > 0 ? strokeWidth : 0
|
|
94
|
+
})
|
|
95
|
+
);
|
|
96
|
+
if (alpha === 0 || !stroke) continue;
|
|
97
|
+
const xPad = strokeWidth / 2, minX = row.x - halfWidth - xPad, maxX = row.x + halfWidth + xPad;
|
|
98
|
+
let batch = batches.at(-1);
|
|
99
|
+
if (!batch || minX < batch.maxX && maxX > batch.minX || batch.stroke !== stroke || batch.strokeWidth !== strokeWidth || batch.opacity !== alpha || batch.cursor !== style.cursor) {
|
|
100
|
+
batch = {
|
|
101
|
+
stem: new Path2D(),
|
|
102
|
+
openTick: new Path2D(),
|
|
103
|
+
closeTick: new Path2D(),
|
|
104
|
+
stroke,
|
|
105
|
+
strokeWidth,
|
|
106
|
+
opacity: alpha,
|
|
107
|
+
cursor: style.cursor,
|
|
108
|
+
minX,
|
|
109
|
+
maxX
|
|
110
|
+
};
|
|
111
|
+
batches.push(batch);
|
|
112
|
+
}
|
|
113
|
+
batch.minX = Math.min(batch.minX, minX);
|
|
114
|
+
batch.maxX = Math.max(batch.maxX, maxX);
|
|
115
|
+
batch.stem.moveTo(stemLocal.x, stemLocal.highY);
|
|
116
|
+
batch.stem.lineTo(stemLocal.x, stemLocal.lowY);
|
|
117
|
+
batch.openTick.moveTo(openTickLocal.x1, openTickLocal.y);
|
|
118
|
+
batch.openTick.lineTo(openTickLocal.x2, openTickLocal.y);
|
|
119
|
+
batch.closeTick.moveTo(closeTickLocal.x1, closeTickLocal.y);
|
|
120
|
+
batch.closeTick.lineTo(closeTickLocal.x2, closeTickLocal.y);
|
|
121
|
+
}
|
|
122
|
+
inspection?.capture({ marks, xScale: xs, yScale: ys });
|
|
123
|
+
return /* @__PURE__ */ jsx(Group, { ...events, children: batches.map((batch, index) => /* @__PURE__ */ jsxs(Group, { children: [
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
Path,
|
|
126
|
+
{
|
|
127
|
+
pointerEvents,
|
|
128
|
+
style: {
|
|
129
|
+
d: batch.stem,
|
|
130
|
+
stroke: batch.stroke,
|
|
131
|
+
strokeWidth: batch.strokeWidth,
|
|
132
|
+
opacity: batch.opacity,
|
|
133
|
+
cursor: batch.cursor
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
),
|
|
137
|
+
/* @__PURE__ */ jsx(
|
|
138
|
+
Path,
|
|
139
|
+
{
|
|
140
|
+
pointerEvents,
|
|
141
|
+
style: {
|
|
142
|
+
d: batch.openTick,
|
|
143
|
+
stroke: batch.stroke,
|
|
144
|
+
strokeWidth: batch.strokeWidth,
|
|
145
|
+
opacity: batch.opacity,
|
|
146
|
+
cursor: batch.cursor
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
),
|
|
150
|
+
/* @__PURE__ */ jsx(
|
|
151
|
+
Path,
|
|
152
|
+
{
|
|
153
|
+
pointerEvents,
|
|
154
|
+
style: {
|
|
155
|
+
d: batch.closeTick,
|
|
156
|
+
stroke: batch.stroke,
|
|
157
|
+
strokeWidth: batch.strokeWidth,
|
|
158
|
+
opacity: batch.opacity,
|
|
159
|
+
cursor: batch.cursor
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
)
|
|
163
|
+
] }, index)) });
|
|
164
|
+
}
|
|
165
|
+
export {
|
|
166
|
+
OhlcBarSeries
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=ohlc-bar-series.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/viz/lib/ohlc-bar-series.tsx"],
|
|
4
|
+
"sourcesContent": ["import {\n Group,\n Path,\n resolveSignalValue,\n type PibblEventHandlers,\n type PibblEventParticipationOptions,\n type PibblNode,\n type SignalValue,\n type StrokeStyle,\n} from \"@pibbl/core\";\nimport { withHooksForbidden } from \"@pibbl/core/internal\";\nimport type {\n OhlcBarInspectionRef,\n CapturedOhlcBarMark,\n} from \"../inspection/ohlc-bar.js\";\nimport { financialMarkWidth } from \"./financial-geometry.js\";\nimport { opacity, width } from \"./paint.js\";\nimport { finiteCoordinate, pointAccessor, pointData } from \"./point-data.js\";\nimport { useNumericPosition } from \"./series-position.js\";\nimport type { LineAccessor, ScaleId } from \"./types.js\";\nimport { useContinuousScale } from \"./use-continuous-scale.js\";\n\n/** Shared stroke presentation for an OHLC bar.\n * @see {@link OhlcBarSeries}\n */\nexport interface OhlcBarSeriesStyle {\n /** Positive total width, or automatic 70% spacing capped at 12; singleton fallback 8. */ readonly bandwidth?:\n number | \"auto\";\n /** Stem and tick stroke; defaults to dark teal. Empty string disables painting. */ readonly stroke?: StrokeStyle;\n /** Nonnegative local stroke width; default 1. */ readonly strokeWidth?: number;\n /** Paint opacity from zero through one; default 1. */ readonly opacity?: number;\n /** Cursor while the series owns targeting. */ readonly cursor?: string;\n}\n\n/** Source-ordered OHLC records rendered as a high/low stem with open/close ticks.\n * @see {@link OhlcBarSeries}\n */\nexport interface OhlcBarSeriesProps<D>\n extends PibblEventHandlers, PibblEventParticipationOptions {\n /** Original records or signal; never sorted or mutated. */\n readonly data: SignalValue<readonly D[]>;\n /** UTC-millisecond property or callback. */\n readonly time: LineAccessor<D>;\n /** Opening price property or callback. */\n readonly open: LineAccessor<D>;\n /** High price property or callback. */\n readonly high: LineAccessor<D>;\n /** Low price property or callback. */\n readonly low: LineAccessor<D>;\n /** Closing price property or callback. */\n readonly close: LineAccessor<D>;\n /** Numeric, UTC, or trading-time horizontal mapping identity. */\n readonly xScale: ScaleId;\n /** Continuous price mapping identity. */\n readonly yScale: ScaleId;\n /** Tests original rows before accessor evaluation.\n * @param datum - Original row.\n * @param index - Source index including skipped rows.\n * @param data - Complete source array.\n * @returns Whether the bar participates.\n */\n readonly defined?: (datum: D, index: number, data: readonly D[]) => boolean;\n /** Shared presentation or a hook-free original-row resolver.\n * @param datum - Original row.\n * @param index - Source index.\n * @param data - Complete source array.\n * @returns Plain OHLC-bar style.\n */\n readonly style?:\n | SignalValue<OhlcBarSeriesStyle>\n | ((datum: D, index: number, data: readonly D[]) => OhlcBarSeriesStyle);\n /** Optional committed capture; the renderer does not execute inspection queries. */ readonly inspection?: OhlcBarInspectionRef<D>;\n}\n\n/** Paints source-ordered OHLC bars with a high/low stem, left open tick, and right close tick.\n * @param props - Original OHLC accessors, scales, styles, events, and optional capture.\n * @returns Ordinary Pibbl composition; equal disjoint styles share paths.\n * @see {@link OhlcBarSeriesProps}\n */\nexport function OhlcBarSeries<D>({\n data: input,\n time: timeInput,\n open: openInput,\n high: highInput,\n low: lowInput,\n close: closeInput,\n xScale,\n yScale,\n defined,\n style: styleInput,\n inspection,\n pointerEvents,\n ...events\n}: OhlcBarSeriesProps<D>): PibblNode {\n const xs = useNumericPosition(xScale),\n ys = useContinuousScale(yScale).get();\n const data = pointData(resolveSignalValue(input), \"OhlcBarSeries\");\n const time = pointAccessor(timeInput),\n open = pointAccessor(openInput),\n high = pointAccessor(highInput),\n low = pointAccessor(lowInput),\n close = pointAccessor(closeInput);\n const rows: {\n datum: D;\n sourceIndex: number;\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n x: number;\n }[] = [];\n for (let i = 0; i < data.length; i++) {\n const datum = data[i];\n if (defined && !defined(datum, i, data)) continue;\n const t = time(datum, i, data),\n o = open(datum, i, data),\n h = high(datum, i, data),\n l = low(datum, i, data),\n c = close(datum, i, data);\n if (\n !finiteCoordinate(t) ||\n !finiteCoordinate(o) ||\n !finiteCoordinate(h) ||\n !finiteCoordinate(l) ||\n !finiteCoordinate(c)\n )\n continue;\n if (l > Math.min(o, c) || h < Math.max(o, c))\n throw new RangeError(\n `OhlcBarSeries: malformed OHLC at source index ${i}; require low <= open/close <= high.`,\n );\n rows.push({\n datum,\n sourceIndex: i,\n time: t,\n open: o,\n high: h,\n low: l,\n close: c,\n x: xs.map(t),\n });\n }\n const defaultWidth = financialMarkWidth(rows.map((row) => row.x));\n const specified =\n typeof styleInput === \"function\"\n ? styleInput\n : resolveSignalValue(styleInput);\n const marks: CapturedOhlcBarMark<D>[] | undefined = inspection\n ? []\n : undefined;\n const batches: {\n stem: Path2D;\n openTick: Path2D;\n closeTick: Path2D;\n stroke: StrokeStyle;\n strokeWidth: number;\n opacity: number;\n cursor: string | undefined;\n minX: number;\n maxX: number;\n }[] = [];\n for (const row of rows) {\n const style =\n typeof specified === \"function\"\n ? withHooksForbidden(\"OhlcBarSeries style callback\", () =>\n specified(row.datum, row.sourceIndex, data),\n )\n : (specified ?? {});\n const markWidth =\n style.bandwidth === undefined || style.bandwidth === \"auto\"\n ? defaultWidth\n : financialMarkWidth([], { width: style.bandwidth });\n const halfWidth = markWidth / 2;\n const stemLocal = Object.freeze({\n x: row.x,\n highY: ys.map(row.high),\n lowY: ys.map(row.low),\n });\n const openTickLocal = Object.freeze({\n x1: row.x - halfWidth,\n x2: row.x,\n y: ys.map(row.open),\n });\n const closeTickLocal = Object.freeze({\n x1: row.x,\n x2: row.x + halfWidth,\n y: ys.map(row.close),\n });\n const stroke = style.stroke ?? \"#173a35\",\n strokeWidth = width(style.strokeWidth ?? 1, \"OhlcBarSeries\"),\n alpha = opacity(style.opacity ?? 1, \"OhlcBarSeries\");\n marks?.push(\n Object.freeze({\n datum: row.datum,\n sourceIndex: row.sourceIndex,\n time: row.time,\n open: row.open,\n high: row.high,\n low: row.low,\n close: row.close,\n anchorLocal: Object.freeze({ x: row.x, y: closeTickLocal.y }),\n stemLocal,\n openTickLocal,\n closeTickLocal,\n strokeWidthLocal: stroke && alpha > 0 ? strokeWidth : 0,\n }),\n );\n if (alpha === 0 || !stroke) continue;\n const xPad = strokeWidth / 2,\n minX = row.x - halfWidth - xPad,\n maxX = row.x + halfWidth + xPad;\n let batch = batches.at(-1);\n if (\n !batch ||\n (minX < batch.maxX && maxX > batch.minX) ||\n batch.stroke !== stroke ||\n batch.strokeWidth !== strokeWidth ||\n batch.opacity !== alpha ||\n batch.cursor !== style.cursor\n ) {\n batch = {\n stem: new Path2D(),\n openTick: new Path2D(),\n closeTick: new Path2D(),\n stroke,\n strokeWidth,\n opacity: alpha,\n cursor: style.cursor,\n minX,\n maxX,\n };\n batches.push(batch);\n }\n batch.minX = Math.min(batch.minX, minX);\n batch.maxX = Math.max(batch.maxX, maxX);\n batch.stem.moveTo(stemLocal.x, stemLocal.highY);\n batch.stem.lineTo(stemLocal.x, stemLocal.lowY);\n batch.openTick.moveTo(openTickLocal.x1, openTickLocal.y);\n batch.openTick.lineTo(openTickLocal.x2, openTickLocal.y);\n batch.closeTick.moveTo(closeTickLocal.x1, closeTickLocal.y);\n batch.closeTick.lineTo(closeTickLocal.x2, closeTickLocal.y);\n }\n inspection?.capture({ marks: marks!, xScale: xs, yScale: ys });\n return (\n <Group {...events}>\n {batches.map((batch, index) => (\n <Group key={index}>\n <Path\n pointerEvents={pointerEvents}\n style={{\n d: batch.stem,\n stroke: batch.stroke,\n strokeWidth: batch.strokeWidth,\n opacity: batch.opacity,\n cursor: batch.cursor,\n }}\n />\n <Path\n pointerEvents={pointerEvents}\n style={{\n d: batch.openTick,\n stroke: batch.stroke,\n strokeWidth: batch.strokeWidth,\n opacity: batch.opacity,\n cursor: batch.cursor,\n }}\n />\n <Path\n pointerEvents={pointerEvents}\n style={{\n d: batch.closeTick,\n stroke: batch.stroke,\n strokeWidth: batch.strokeWidth,\n opacity: batch.opacity,\n cursor: batch.cursor,\n }}\n />\n </Group>\n ))}\n </Group>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|