@kymoscope/sdk 0.0.0-stage → 0.1.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/LICENSE.md +69 -0
- package/README.md +138 -2
- package/dist/assets/duckdb-browser-eh.worker--3HUwN9R.js +14 -0
- package/dist/assets/duckdb-eh-D-nnNw7L.wasm.gz +0 -0
- package/dist/assets/h5wasmModule-BCQWU2Gw.js +24295 -0
- package/dist/assets/importer.worker-D4is7BLf.js +6 -0
- package/dist/assets/offscreenLineWorker-mShhnyXX.js +79 -0
- package/dist/assets/parseDataset.worker-PynRsPD8.js +5 -0
- package/dist/importers-DivmF3tx.js +5 -0
- package/dist/krc-CbE28CjD.js +9 -0
- package/dist/kymoscope-embed.js +633 -0
- package/dist/kymoscope-sdk.js +616 -0
- package/dist/react.js +2 -0
- package/dist/styles/charts.css +207 -0
- package/dist/styles/fonts/OFL.txt +93 -0
- package/dist/styles/fonts/plus-jakarta-sans-italic-latin-ext.woff2 +0 -0
- package/dist/styles/fonts/plus-jakarta-sans-italic-latin.woff2 +0 -0
- package/dist/styles/fonts/plus-jakarta-sans-latin-ext.woff2 +0 -0
- package/dist/styles/fonts/plus-jakarta-sans-latin.woff2 +0 -0
- package/dist/styles/tokens.css +218 -0
- package/dist/types/charts/AlarmOverlay.d.ts +11 -0
- package/dist/types/charts/AnnotationLayer.d.ts +29 -0
- package/dist/types/charts/ChartBody.d.ts +52 -0
- package/dist/types/charts/PerfHud.d.ts +20 -0
- package/dist/types/charts/beacon.d.ts +27 -0
- package/dist/types/charts/chartWindow.d.ts +31 -0
- package/dist/types/charts/liveOverlay.d.ts +16 -0
- package/dist/types/charts/runtime.d.ts +63 -0
- package/dist/types/charts/useWorksheetData.d.ts +159 -0
- package/dist/types/components/AreaChart.d.ts +21 -0
- package/dist/types/components/BarChart.d.ts +30 -0
- package/dist/types/components/BoxPlotChart.d.ts +16 -0
- package/dist/types/components/BubbleChart.d.ts +24 -0
- package/dist/types/components/CalibrationChart.d.ts +15 -0
- package/dist/types/components/CdfChart.d.ts +15 -0
- package/dist/types/components/ConfusionChart.d.ts +11 -0
- package/dist/types/components/ControlChart.d.ts +17 -0
- package/dist/types/components/DuckDbMultiBandPanel.d.ts +35 -0
- package/dist/types/components/EmbeddingChart.d.ts +25 -0
- package/dist/types/components/FlameGraphChart.d.ts +15 -0
- package/dist/types/components/GanttChart.d.ts +15 -0
- package/dist/types/components/GaugeChart.d.ts +27 -0
- package/dist/types/components/HeatmapChart.d.ts +41 -0
- package/dist/types/components/HistogramChart.d.ts +15 -0
- package/dist/types/components/LossCurveChart.d.ts +17 -0
- package/dist/types/components/MultiBandCanvasChart.d.ts +156 -0
- package/dist/types/components/ParallelCoordsChart.d.ts +21 -0
- package/dist/types/components/PolarChart.d.ts +17 -0
- package/dist/types/components/QQPlotChart.d.ts +16 -0
- package/dist/types/components/RadarChart.d.ts +17 -0
- package/dist/types/components/RocChart.d.ts +12 -0
- package/dist/types/components/SankeyChart.d.ts +15 -0
- package/dist/types/components/SpectrogramChart.d.ts +16 -0
- package/dist/types/components/SpectrogramWaterfall.d.ts +14 -0
- package/dist/types/components/SpectrumChart.d.ts +17 -0
- package/dist/types/components/TreemapChart.d.ts +14 -0
- package/dist/types/components/ViolinChart.d.ts +17 -0
- package/dist/types/components/XYScatterChart.d.ts +47 -0
- package/dist/types/components/XYZMeshChart.d.ts +68 -0
- package/dist/types/components/dashboardGridLayout.d.ts +50 -0
- package/dist/types/components/liveFollowEase.d.ts +10 -0
- package/dist/types/components/liveWindow.d.ts +63 -0
- package/dist/types/components/multiBandHover.d.ts +44 -0
- package/dist/types/embed/Attribution.d.ts +5 -0
- package/dist/types/embed/license.d.ts +29 -0
- package/dist/types/embed/standalone.d.ts +5 -0
- package/dist/types/engine/columns.d.ts +44 -0
- package/dist/types/engine/createEngine.d.ts +394 -0
- package/dist/types/engine/derive.d.ts +27 -0
- package/dist/types/engine/emitter.d.ts +6 -0
- package/dist/types/engine/errors.d.ts +7 -0
- package/dist/types/engine/history.d.ts +29 -0
- package/dist/types/engine/kinds.d.ts +9 -0
- package/dist/types/engine/liveController.d.ts +27 -0
- package/dist/types/engine/store.d.ts +8 -0
- package/dist/types/engine/types.d.ts +194 -0
- package/dist/types/index.d.ts +69 -0
- package/dist/types/lib/annotations.d.ts +37 -0
- package/dist/types/lib/beacon.d.ts +62 -0
- package/dist/types/lib/colorScheme.d.ts +5 -0
- package/dist/types/lib/colormap.d.ts +9 -0
- package/dist/types/lib/columnTable.d.ts +37 -0
- package/dist/types/lib/data/arrowDecimation.d.ts +11 -0
- package/dist/types/lib/data/binnedHeatmap.d.ts +27 -0
- package/dist/types/lib/data/columnCaches.d.ts +6 -0
- package/dist/types/lib/data/columnarDataSource.d.ts +34 -0
- package/dist/types/lib/data/createDataSource.d.ts +23 -0
- package/dist/types/lib/data/dataSource.d.ts +75 -0
- package/dist/types/lib/data/decimate.d.ts +25 -0
- package/dist/types/lib/data/duckDbDataSource.d.ts +42 -0
- package/dist/types/lib/data/envelope.d.ts +16 -0
- package/dist/types/lib/data/inMemoryDataSource.d.ts +25 -0
- package/dist/types/lib/data/liveDataSource.d.ts +77 -0
- package/dist/types/lib/data/lruCache.d.ts +11 -0
- package/dist/types/lib/data/openDataset.d.ts +24 -0
- package/dist/types/lib/data/opfsParquet.d.ts +4 -0
- package/dist/types/lib/data/pointColumns.d.ts +59 -0
- package/dist/types/lib/data/schemaColumns.d.ts +5 -0
- package/dist/types/lib/data/useSeriesPoints.d.ts +48 -0
- package/dist/types/lib/data/xyColumns.d.ts +77 -0
- package/dist/types/lib/dataBounds.d.ts +10 -0
- package/dist/types/lib/datasetColors.d.ts +19 -0
- package/dist/types/lib/datasetColumns.d.ts +3 -0
- package/dist/types/lib/datasetMerge.d.ts +8 -0
- package/dist/types/lib/duckdb/duckdbInstance.d.ts +7 -0
- package/dist/types/lib/duckdb/fileIdentity.d.ts +9 -0
- package/dist/types/lib/duckdb/sql.d.ts +124 -0
- package/dist/types/lib/fft.d.ts +15 -0
- package/dist/types/lib/folderTree.d.ts +29 -0
- package/dist/types/lib/gaugeColors.d.ts +32 -0
- package/dist/types/lib/importers/arrowSink.d.ts +35 -0
- package/dist/types/lib/importers/blobReader.d.ts +22 -0
- package/dist/types/lib/importers/bytes.d.ts +11 -0
- package/dist/types/lib/importers/combine.d.ts +30 -0
- package/dist/types/lib/importers/comtrade/format.d.ts +2 -0
- package/dist/types/lib/importers/comtrade/importer.d.ts +25 -0
- package/dist/types/lib/importers/dbc.d.ts +45 -0
- package/dist/types/lib/importers/edf/format.d.ts +2 -0
- package/dist/types/lib/importers/edf/importer.d.ts +7 -0
- package/dist/types/lib/importers/expr.d.ts +10 -0
- package/dist/types/lib/importers/formats.d.ts +23 -0
- package/dist/types/lib/importers/hdf5/format.d.ts +4 -0
- package/dist/types/lib/importers/hdf5/h5.d.ts +76 -0
- package/dist/types/lib/importers/hdf5/h5wasmModule.d.ts +1 -0
- package/dist/types/lib/importers/hdf5/importer.d.ts +2 -0
- package/dist/types/lib/importers/importer.worker.d.ts +5 -0
- package/dist/types/lib/importers/importers.d.ts +4 -0
- package/dist/types/lib/importers/limits.d.ts +28 -0
- package/dist/types/lib/importers/mat/format.d.ts +2 -0
- package/dist/types/lib/importers/mat/group.d.ts +19 -0
- package/dist/types/lib/importers/mat/importer.d.ts +2 -0
- package/dist/types/lib/importers/mat/v5.d.ts +24 -0
- package/dist/types/lib/importers/mat/v73.d.ts +13 -0
- package/dist/types/lib/importers/mdf/blocks3.d.ts +3 -0
- package/dist/types/lib/importers/mdf/blocks4.d.ts +7 -0
- package/dist/types/lib/importers/mdf/bus.d.ts +59 -0
- package/dist/types/lib/importers/mdf/conversion.d.ts +48 -0
- package/dist/types/lib/importers/mdf/decode.d.ts +15 -0
- package/dist/types/lib/importers/mdf/format.d.ts +2 -0
- package/dist/types/lib/importers/mdf/importer.d.ts +19 -0
- package/dist/types/lib/importers/mdf/model.d.ts +75 -0
- package/dist/types/lib/importers/mdf/records.d.ts +31 -0
- package/dist/types/lib/importers/mdf/stream.d.ts +42 -0
- package/dist/types/lib/importers/memorySink.d.ts +11 -0
- package/dist/types/lib/importers/names.d.ts +2 -0
- package/dist/types/lib/importers/openImport.d.ts +33 -0
- package/dist/types/lib/importers/registry.d.ts +24 -0
- package/dist/types/lib/importers/run.d.ts +35 -0
- package/dist/types/lib/importers/session.d.ts +28 -0
- package/dist/types/lib/importers/tdms/format.d.ts +2 -0
- package/dist/types/lib/importers/tdms/importer.d.ts +10 -0
- package/dist/types/lib/importers/types.d.ts +172 -0
- package/dist/types/lib/importers/workerCore.d.ts +44 -0
- package/dist/types/lib/importers/xdf/format.d.ts +2 -0
- package/dist/types/lib/importers/xdf/importer.d.ts +2 -0
- package/dist/types/lib/importers/zlib.d.ts +13 -0
- package/dist/types/lib/kde.d.ts +2 -0
- package/dist/types/lib/live/buffer.d.ts +265 -0
- package/dist/types/lib/live/columnsWire.d.ts +24 -0
- package/dist/types/lib/live/crypto.d.ts +157 -0
- package/dist/types/lib/live/liveMathChannels.d.ts +11 -0
- package/dist/types/lib/live/recorder.d.ts +32 -0
- package/dist/types/lib/live/stream.d.ts +33 -0
- package/dist/types/lib/live/timeBuckets.d.ts +71 -0
- package/dist/types/lib/live/types.d.ts +72 -0
- package/dist/types/lib/live/wire.d.ts +25 -0
- package/dist/types/lib/mathChannels/compile.d.ts +22 -0
- package/dist/types/lib/mathChannels/evaluator.d.ts +40 -0
- package/dist/types/lib/mathChannels/functions/conditional.d.ts +2 -0
- package/dist/types/lib/mathChannels/functions/filters.d.ts +7 -0
- package/dist/types/lib/mathChannels/functions/index.d.ts +3 -0
- package/dist/types/lib/mathChannels/functions/reference.d.ts +7 -0
- package/dist/types/lib/mathChannels/functions/windowOps.d.ts +11 -0
- package/dist/types/lib/mathChannels/index.d.ts +13 -0
- package/dist/types/lib/mathChannels/io.d.ts +18 -0
- package/dist/types/lib/mathChannels/mathjsSetup.d.ts +7 -0
- package/dist/types/lib/mathChannels/parseMath.d.ts +12 -0
- package/dist/types/lib/mathChannels/parser.d.ts +22 -0
- package/dist/types/lib/mathChannels/types.d.ts +34 -0
- package/dist/types/lib/mathChannels/usedChannels.d.ts +14 -0
- package/dist/types/lib/moduleWorker.d.ts +7 -0
- package/dist/types/lib/panelChartSettings.d.ts +438 -0
- package/dist/types/lib/parseDataset.d.ts +74 -0
- package/dist/types/lib/parseDataset.worker.d.ts +1 -0
- package/dist/types/lib/parseDatasetWorkerClient.d.ts +32 -0
- package/dist/types/lib/perfLog.d.ts +4 -0
- package/dist/types/lib/quantiles.d.ts +10 -0
- package/dist/types/lib/recordings/csvWriter.d.ts +10 -0
- package/dist/types/lib/recordings/export.d.ts +26 -0
- package/dist/types/lib/recordings/importer.d.ts +2 -0
- package/dist/types/lib/recordings/keys.d.ts +23 -0
- package/dist/types/lib/recordings/krc.d.ts +38 -0
- package/dist/types/lib/recordings/mf4Writer.d.ts +20 -0
- package/dist/types/lib/render/chartFonts.d.ts +10 -0
- package/dist/types/lib/render/colorBucket.d.ts +6 -0
- package/dist/types/lib/render/contours.d.ts +16 -0
- package/dist/types/lib/render/cssColor.d.ts +2 -0
- package/dist/types/lib/render/frames.d.ts +46 -0
- package/dist/types/lib/render/gl3d.d.ts +63 -0
- package/dist/types/lib/render/glLines.d.ts +62 -0
- package/dist/types/lib/render/glPlot.d.ts +36 -0
- package/dist/types/lib/render/glPoints.d.ts +37 -0
- package/dist/types/lib/render/glSeries.d.ts +67 -0
- package/dist/types/lib/render/heatGrid.d.ts +9 -0
- package/dist/types/lib/render/hitGrid.d.ts +16 -0
- package/dist/types/lib/render/liveZoomBus.d.ts +18 -0
- package/dist/types/lib/render/margins.d.ts +14 -0
- package/dist/types/lib/render/offscreenLineRenderer.d.ts +53 -0
- package/dist/types/lib/render/offscreenLineWorker.d.ts +1 -0
- package/dist/types/lib/render/plotFrame.d.ts +36 -0
- package/dist/types/lib/render/resample.d.ts +18 -0
- package/dist/types/lib/render/sharedGl.d.ts +38 -0
- package/dist/types/lib/render/useGlPlot.d.ts +7 -0
- package/dist/types/lib/savedLayout.d.ts +45 -0
- package/dist/types/lib/stft.d.ts +37 -0
- package/dist/types/lib/workspaces/encrypted.d.ts +50 -0
- package/dist/types/lib/workspaces/io.d.ts +120 -0
- package/dist/types/lib/xyFit.d.ts +14 -0
- package/dist/types/lib/yAxisTicks.d.ts +28 -0
- package/dist/types/react/index.d.ts +32 -0
- package/dist/types/types/loadedDataset.d.ts +42 -0
- package/dist/types/types/plotSeries.d.ts +27 -0
- package/package.json +63 -4
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { AxisLineStyle } from '../lib/panelChartSettings';
|
|
2
|
+
import type { PlotSeries } from '../types/plotSeries';
|
|
3
|
+
import { type PointColumns } from '../lib/data/pointColumns';
|
|
4
|
+
import type { LiveZoomBus } from '../lib/render/liveZoomBus';
|
|
5
|
+
/**
|
|
6
|
+
* A live feed the chart pulls straight from, every animation frame, on its own
|
|
7
|
+
* rAF loop — bypassing React entirely so incoming samples never re-render the app
|
|
8
|
+
* (the per-sample App re-render was the dominant main-thread stall). `pull`
|
|
9
|
+
* returns min/max-decimated points (keyed by column) for the requested window;
|
|
10
|
+
* `xBounds` is the buffer's current full x-extent (drives the auto-scroll target).
|
|
11
|
+
*/
|
|
12
|
+
export interface LiveChartSource {
|
|
13
|
+
/**
|
|
14
|
+
* The points to draw, as layers (`cutX`: the display edge, see latestT; live
|
|
15
|
+
* points past it are left out). A layer that comes back as the same object as
|
|
16
|
+
* last time (datasets under a live overlay, a beacon's reference) is measured
|
|
17
|
+
* and handed to the line renderer once; the others every time the data changes.
|
|
18
|
+
*/
|
|
19
|
+
pull: (x0: number, x1: number, maxPoints: number, cutX?: number) => PointColumns[];
|
|
20
|
+
xBounds: () => [number, number] | null;
|
|
21
|
+
/** X of the newest sample (the live position). Lets "follow" track a channel
|
|
22
|
+
* that is not monotonic, like lap distance. Defaults to the max of `xBounds`. */
|
|
23
|
+
latestX?: () => number | null;
|
|
24
|
+
/** Changes whenever the source's data does (e.g. samples received). When the
|
|
25
|
+
* data and the view are unchanged the chart skips the pull: on an X that is
|
|
26
|
+
* not the time axis (lap distance) and in beacon views a pull re-decimates
|
|
27
|
+
* the whole buffer, and data arrives in bursts (~10 per second), so pulling
|
|
28
|
+
* every frame recomputed the same points ~50 times a second. */
|
|
29
|
+
version?: () => number;
|
|
30
|
+
/** Newest received value of each column it carries (the legend's idle read-out).
|
|
31
|
+
* Columns it doesn't carry (e.g. a beacon reference) read their value at the
|
|
32
|
+
* newest sample's X. Without it the chart scans the points from the right,
|
|
33
|
+
* which only finds the newest sample when X is time. */
|
|
34
|
+
latestValues?: (columns: string[]) => Map<string, number>;
|
|
35
|
+
/** X span covered by the newest `seconds` of samples, so a seconds window can
|
|
36
|
+
* follow a channel that is not time (lap distance). Without it the window's
|
|
37
|
+
* seconds are X units (right for a time X). */
|
|
38
|
+
spanForSeconds?: (seconds: number) => number;
|
|
39
|
+
/** Seconds of data buffered: the widest seconds window. Defaults to the X extent. */
|
|
40
|
+
bufferedSeconds?: () => number;
|
|
41
|
+
/** Time of the newest sample, and X at a given time. Together they enable
|
|
42
|
+
* smooth playout (see advancePlayout): the trace advances every frame instead
|
|
43
|
+
* of in a step per received message. */
|
|
44
|
+
latestT?: () => number;
|
|
45
|
+
xAtTime?: (t: number) => number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Per-series X gap threshold: consecutive valid points farther apart than this
|
|
49
|
+
* are not joined by a line. Derived from the series' OWN median spacing so a
|
|
50
|
+
* co-plotted source at a different sample rate can't shrink it — a global
|
|
51
|
+
* threshold lets a dense live feed collapse the bound below an imported
|
|
52
|
+
* dataset's spacing and shatter that line into disconnected dots.
|
|
53
|
+
*/
|
|
54
|
+
export declare function joinGapThresholdForColumn(pts: PointColumns, column: string, xSpan: number): number;
|
|
55
|
+
/** A series' min–max envelope across datasets: shaded under its traces, in its band and scale. */
|
|
56
|
+
export interface MultibandEnvelope {
|
|
57
|
+
/** The base series (its per-dataset copies have ids `${seriesId}__N`). */
|
|
58
|
+
seriesId: string;
|
|
59
|
+
color: string;
|
|
60
|
+
x: Float64Array;
|
|
61
|
+
lo: Float64Array;
|
|
62
|
+
hi: Float64Array;
|
|
63
|
+
}
|
|
64
|
+
export interface MultiBandCanvasChartProps {
|
|
65
|
+
/** Min–max envelopes shaded under the traces. */
|
|
66
|
+
envelopes?: MultibandEnvelope[];
|
|
67
|
+
xLabel: string;
|
|
68
|
+
series: PlotSeries[];
|
|
69
|
+
/** The points, as layers (each a source: a dataset, a live stream, a reference). */
|
|
70
|
+
points: PointColumns[];
|
|
71
|
+
/** Physical units per column name (from file); shown next to scale values on the right. */
|
|
72
|
+
columnUnits?: Record<string, string>;
|
|
73
|
+
height?: number;
|
|
74
|
+
onPlotContextMenu?: (e: {
|
|
75
|
+
clientX: number;
|
|
76
|
+
clientY: number;
|
|
77
|
+
/** Set after a right-drag on the plot area; horizontal span → X zoom. */
|
|
78
|
+
zoomXRange?: [number, number] | null;
|
|
79
|
+
}) => void;
|
|
80
|
+
/** When this value changes (e.g. custom plot background), styles are re-read from CSS. */
|
|
81
|
+
backgroundToken?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Externally controlled X zoom range (in data coordinates). `null` = full extent.
|
|
84
|
+
* Pair with `onViewXRangeChange` to sync zoom across multiple charts.
|
|
85
|
+
*/
|
|
86
|
+
viewXRange?: [number, number] | null;
|
|
87
|
+
onViewXRangeChange?: (range: [number, number] | null) => void;
|
|
88
|
+
/** Real-time linked-zoom bus: while one chart is being zoomed it broadcasts its
|
|
89
|
+
* live X view so siblings follow each frame (not just on commit). */
|
|
90
|
+
liveZoom?: LiveZoomBus;
|
|
91
|
+
/** This chart's id on the bus (so it ignores its own broadcasts). */
|
|
92
|
+
liveZoomId?: string;
|
|
93
|
+
/**
|
|
94
|
+
* True full data x-extent. Provide when `points` are a decimated SUBSET of the
|
|
95
|
+
* data (out-of-core), so zoom-out is bounded by the real dataset extent instead
|
|
96
|
+
* of the current view — otherwise zoom-out snaps straight to full. When omitted
|
|
97
|
+
* the extent is derived from `points` (correct for fully in-memory data).
|
|
98
|
+
*/
|
|
99
|
+
fullXRange?: [number, number] | null;
|
|
100
|
+
/** When set, left-drag shifts the named dataset along X. */
|
|
101
|
+
shiftMode?: {
|
|
102
|
+
label: string;
|
|
103
|
+
onDragStart: () => void;
|
|
104
|
+
onDragOffset: (deltaDataX: number) => void;
|
|
105
|
+
};
|
|
106
|
+
/** X axis: vertical interior grid lines only. null color = use theme. */
|
|
107
|
+
xAxisLine?: AxisLineStyle;
|
|
108
|
+
/** Y axis: horizontal interior grid lines only. null color = use theme. */
|
|
109
|
+
yAxisLine?: AxisLineStyle;
|
|
110
|
+
/** Grid: outer plot border only. null color = use theme. */
|
|
111
|
+
gridLine?: AxisLineStyle;
|
|
112
|
+
/** Data trace thickness in CSS px. */
|
|
113
|
+
lineWidth?: number;
|
|
114
|
+
/**
|
|
115
|
+
* Show each channel's newest value in the legend while nothing is hovered.
|
|
116
|
+
* Set for panels fed by a live stream, where "the latest sample" is the
|
|
117
|
+
* current reading; a static file has no current value, so it keeps the dash.
|
|
118
|
+
*/
|
|
119
|
+
showLatestValues?: boolean;
|
|
120
|
+
/**
|
|
121
|
+
* When set, the chart is fed by a live stream: it pulls decimated points from
|
|
122
|
+
* this source every animation frame (no React at data rate) and auto-scrolls
|
|
123
|
+
* the X window to the live edge, eased at refresh rate. Auto-scroll yields the
|
|
124
|
+
* moment the user zooms (a manual `viewXRange`) but the live pull continues, so
|
|
125
|
+
* a zoomed live chart still updates. Overrides the `points` prop for rendering.
|
|
126
|
+
*/
|
|
127
|
+
liveSource?: LiveChartSource;
|
|
128
|
+
/**
|
|
129
|
+
* Fixed live-scroll window in SECONDS (on a non-time X, the span the newest N
|
|
130
|
+
* seconds cover — see LiveChartSource.spanForSeconds). With `null`/undefined
|
|
131
|
+
* the auto-scroll tracks the whole buffer extent, which WIDENS as the ring fills
|
|
132
|
+
* (a continuous zoom-out that collapses the scroll speed ~100× — see
|
|
133
|
+
* {@link liveWindowTarget}). A fixed value pins the window to the last N seconds
|
|
134
|
+
* so the trace scrolls at a constant rate.
|
|
135
|
+
*/
|
|
136
|
+
liveWindowSeconds?: number | null;
|
|
137
|
+
/**
|
|
138
|
+
* While auto-scrolling, the wheel zooms by changing the
|
|
139
|
+
* live window (seconds) instead of freezing a manual range, so the view keeps
|
|
140
|
+
* following the newest samples. Called once the gesture settles; `null` = All.
|
|
141
|
+
*/
|
|
142
|
+
onLiveWindowChange?: (seconds: number | null) => void;
|
|
143
|
+
/**
|
|
144
|
+
* How the wheel zooms a live chart. 'follow': the window stays on the newest
|
|
145
|
+
* sample and the wheel resizes it (the global seconds window on a time axis via
|
|
146
|
+
* `onLiveWindowChange`, a per-chart span in X units on any other channel).
|
|
147
|
+
* 'free': the wheel freezes a manual range (data inside it keeps updating).
|
|
148
|
+
* Defaults to 'follow' when `onLiveWindowChange` is given, else 'free'.
|
|
149
|
+
*/
|
|
150
|
+
liveZoomMode?: 'follow' | 'free';
|
|
151
|
+
/** Reports the chart's CSS pixel width (the wrap's clientWidth) on mount and
|
|
152
|
+
* whenever it changes. Lets an out-of-core parent size its decimation budget
|
|
153
|
+
* to the actual on-screen resolution instead of a fixed overdrawn count. */
|
|
154
|
+
onPlotWidthCss?: (cssWidth: number) => void;
|
|
155
|
+
}
|
|
156
|
+
export declare function MultiBandCanvasChart({ xLabel, series, points, columnUnits, height, onPlotContextMenu, backgroundToken, viewXRange, onViewXRangeChange, liveZoom, liveZoomId, fullXRange, shiftMode, xAxisLine, yAxisLine, gridLine, lineWidth, envelopes, showLatestValues, liveSource, liveWindowSeconds, onLiveWindowChange, liveZoomMode, onPlotWidthCss, }: MultiBandCanvasChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** One column per axis (rows aligned), with an optional colour per row: a value or a category. */
|
|
2
|
+
export interface ParallelColumns {
|
|
3
|
+
length: number;
|
|
4
|
+
columns: ArrayLike<number>[];
|
|
5
|
+
colorValue?: ArrayLike<number>;
|
|
6
|
+
/** A category per row: an index into `colorLabels`. */
|
|
7
|
+
colorIndex?: ArrayLike<number>;
|
|
8
|
+
colorLabels?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface ParallelCoordsChartProps {
|
|
11
|
+
rows: ParallelColumns;
|
|
12
|
+
axes: string[];
|
|
13
|
+
color?: string;
|
|
14
|
+
colorByNumeric?: boolean;
|
|
15
|
+
backgroundToken?: string;
|
|
16
|
+
onPlotContextMenu?: (e: {
|
|
17
|
+
clientX: number;
|
|
18
|
+
clientY: number;
|
|
19
|
+
}) => void;
|
|
20
|
+
}
|
|
21
|
+
export declare function ParallelCoordsChart({ rows, axes, color, colorByNumeric, backgroundToken, onPlotContextMenu, }: ParallelCoordsChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface PolarChartProps {
|
|
2
|
+
angles: ArrayLike<number>;
|
|
3
|
+
radii: ArrayLike<number>;
|
|
4
|
+
angleLabel: string;
|
|
5
|
+
radiusLabel: string;
|
|
6
|
+
color?: string;
|
|
7
|
+
mode?: 'waveform' | 'rose';
|
|
8
|
+
radiusMin?: number;
|
|
9
|
+
radiusMax?: number;
|
|
10
|
+
height?: number;
|
|
11
|
+
backgroundToken?: string;
|
|
12
|
+
onPlotContextMenu?: (e: {
|
|
13
|
+
clientX: number;
|
|
14
|
+
clientY: number;
|
|
15
|
+
}) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function PolarChart({ angles, radii, angleLabel, radiusLabel, color, mode, radiusMin, radiusMax, height, backgroundToken, onPlotContextMenu, }: PolarChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Q-Q pairs as columns, both ascending. */
|
|
2
|
+
export interface QQColumns {
|
|
3
|
+
length: number;
|
|
4
|
+
theoretical: ArrayLike<number>;
|
|
5
|
+
sample: ArrayLike<number>;
|
|
6
|
+
}
|
|
7
|
+
export interface QQPlotChartProps {
|
|
8
|
+
points: QQColumns;
|
|
9
|
+
color?: string;
|
|
10
|
+
backgroundToken?: string;
|
|
11
|
+
onPlotContextMenu?: (e: {
|
|
12
|
+
clientX: number;
|
|
13
|
+
clientY: number;
|
|
14
|
+
}) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function QQPlotChart({ points, color, backgroundToken, onPlotContextMenu, }: QQPlotChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface RadarSeries {
|
|
2
|
+
name: string;
|
|
3
|
+
values: number[];
|
|
4
|
+
}
|
|
5
|
+
export interface RadarChartProps {
|
|
6
|
+
axes: string[];
|
|
7
|
+
series: RadarSeries[];
|
|
8
|
+
fill?: boolean;
|
|
9
|
+
/** The first series' color (the others follow the palette). */
|
|
10
|
+
color?: string;
|
|
11
|
+
backgroundToken?: string;
|
|
12
|
+
onPlotContextMenu?: (e: {
|
|
13
|
+
clientX: number;
|
|
14
|
+
clientY: number;
|
|
15
|
+
}) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function RadarChart({ axes, series, fill, color, backgroundToken, onPlotContextMenu, }: RadarChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface RocChartProps {
|
|
2
|
+
scores: ArrayLike<number>;
|
|
3
|
+
labels: ArrayLike<number>;
|
|
4
|
+
mode?: 'roc' | 'pr';
|
|
5
|
+
color?: string;
|
|
6
|
+
backgroundToken?: string;
|
|
7
|
+
onPlotContextMenu?: (e: {
|
|
8
|
+
clientX: number;
|
|
9
|
+
clientY: number;
|
|
10
|
+
}) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function RocChart({ scores, labels, mode, color, backgroundToken, onPlotContextMenu, }: RocChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface SankeyLink {
|
|
2
|
+
source: string;
|
|
3
|
+
target: string;
|
|
4
|
+
value: number;
|
|
5
|
+
}
|
|
6
|
+
export interface SankeyChartProps {
|
|
7
|
+
nodeNames: string[];
|
|
8
|
+
links: SankeyLink[];
|
|
9
|
+
backgroundToken?: string;
|
|
10
|
+
onPlotContextMenu?: (e: {
|
|
11
|
+
clientX: number;
|
|
12
|
+
clientY: number;
|
|
13
|
+
}) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function SankeyChart({ nodeNames, links, backgroundToken, onPlotContextMenu, }: SankeyChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface SpectrogramChartProps {
|
|
2
|
+
signal: ArrayLike<number>;
|
|
3
|
+
sampleRate?: number;
|
|
4
|
+
windowSize?: number;
|
|
5
|
+
overlap?: number;
|
|
6
|
+
winFunc?: 'hann' | 'rectangular';
|
|
7
|
+
yMode?: 'amplitude' | 'db';
|
|
8
|
+
logFreq?: boolean;
|
|
9
|
+
label?: string;
|
|
10
|
+
backgroundToken?: string;
|
|
11
|
+
onPlotContextMenu?: (e: {
|
|
12
|
+
clientX: number;
|
|
13
|
+
clientY: number;
|
|
14
|
+
}) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function SpectrogramChart({ signal, sampleRate, windowSize, overlap, winFunc, yMode, logFreq, label, backgroundToken, onPlotContextMenu, }: SpectrogramChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SpectrogramWaterfallProps {
|
|
2
|
+
signal: ArrayLike<number>;
|
|
3
|
+
sampleRate: number;
|
|
4
|
+
windowSize: number;
|
|
5
|
+
overlap: number;
|
|
6
|
+
winFunc: 'hann' | 'rectangular';
|
|
7
|
+
yMode: 'db' | 'amplitude';
|
|
8
|
+
backgroundToken?: string;
|
|
9
|
+
onPlotContextMenu?: (e: {
|
|
10
|
+
clientX: number;
|
|
11
|
+
clientY: number;
|
|
12
|
+
}) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function SpectrogramWaterfall({ signal, sampleRate, windowSize, overlap, winFunc, yMode, backgroundToken, onPlotContextMenu }: SpectrogramWaterfallProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface SpectrumChartProps {
|
|
2
|
+
signal: ArrayLike<number>;
|
|
3
|
+
sampleRate?: number;
|
|
4
|
+
label: string;
|
|
5
|
+
xMode?: 'hz' | 'order';
|
|
6
|
+
yMode?: 'amplitude' | 'db';
|
|
7
|
+
window?: 'hann' | 'rectangular';
|
|
8
|
+
color?: string;
|
|
9
|
+
logX?: boolean;
|
|
10
|
+
height?: number;
|
|
11
|
+
backgroundToken?: string;
|
|
12
|
+
onPlotContextMenu?: (e: {
|
|
13
|
+
clientX: number;
|
|
14
|
+
clientY: number;
|
|
15
|
+
}) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function SpectrumChart({ signal, sampleRate, label, xMode, yMode, window: winProp, color, logX, height, backgroundToken, onPlotContextMenu, }: SpectrumChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface TreemapNode {
|
|
2
|
+
name: string;
|
|
3
|
+
parent: string;
|
|
4
|
+
value: number;
|
|
5
|
+
}
|
|
6
|
+
export interface TreemapChartProps {
|
|
7
|
+
nodes: TreemapNode[];
|
|
8
|
+
backgroundToken?: string;
|
|
9
|
+
onPlotContextMenu?: (e: {
|
|
10
|
+
clientX: number;
|
|
11
|
+
clientY: number;
|
|
12
|
+
}) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function TreemapChart({ nodes, backgroundToken, onPlotContextMenu, }: TreemapChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ViolinGroup {
|
|
2
|
+
label: string;
|
|
3
|
+
values: ArrayLike<number>;
|
|
4
|
+
}
|
|
5
|
+
export interface ViolinChartProps {
|
|
6
|
+
groups: ViolinGroup[];
|
|
7
|
+
color?: string;
|
|
8
|
+
showBox?: boolean;
|
|
9
|
+
bandwidth?: number;
|
|
10
|
+
orientation?: 'vertical' | 'horizontal';
|
|
11
|
+
backgroundToken?: string;
|
|
12
|
+
onPlotContextMenu?: (e: {
|
|
13
|
+
clientX: number;
|
|
14
|
+
clientY: number;
|
|
15
|
+
}) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function ViolinChart({ groups, color, showBox, bandwidth, orientation, backgroundToken, onPlotContextMenu, }: ViolinChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { AxisLineStyle, XyAxisScaleSettings, XyFitSettings } from '../lib/panelChartSettings';
|
|
2
|
+
import { type XYColumns } from '../lib/data/xyColumns';
|
|
3
|
+
export interface XYPoint {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
/** Optional color value for colormap mode. Normalized to [0,1] by App.tsx. */
|
|
7
|
+
c?: number;
|
|
8
|
+
/** Optional dataset index for per-dataset coloring (multi-dataset mode). */
|
|
9
|
+
d?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface XYScatterChartProps {
|
|
12
|
+
/** Every point to draw: columns (drawn as they are, on the GPU) or XYPoint objects. */
|
|
13
|
+
points: XYPoint[] | XYColumns;
|
|
14
|
+
xLabel: string;
|
|
15
|
+
yLabel: string;
|
|
16
|
+
color?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Per-dataset colors (index === point.d). When present (multi-dataset mode),
|
|
19
|
+
* points are colored by their dataset and this takes precedence over the
|
|
20
|
+
* colormap `c` values.
|
|
21
|
+
*/
|
|
22
|
+
datasetColors?: string[];
|
|
23
|
+
/** Label for the color axis (shown in legend). */
|
|
24
|
+
colorLabel?: string;
|
|
25
|
+
/** Raw min/max of the color column for the legend labels. */
|
|
26
|
+
colorRange?: [number, number];
|
|
27
|
+
height?: number;
|
|
28
|
+
/** Scatter dot radius in CSS pixels. Default 1.8. */
|
|
29
|
+
pointRadius?: number;
|
|
30
|
+
/** Points, a line through them in data order, or both. Default points. */
|
|
31
|
+
drawMode?: 'points' | 'lines' | 'both';
|
|
32
|
+
/** Line width in CSS px (lines). Default 1. */
|
|
33
|
+
lineWidth?: number;
|
|
34
|
+
/** When this value changes (e.g. custom plot background), styles are re-read from CSS. */
|
|
35
|
+
backgroundToken?: string;
|
|
36
|
+
onPlotContextMenu?: (e: {
|
|
37
|
+
clientX: number;
|
|
38
|
+
clientY: number;
|
|
39
|
+
}) => void;
|
|
40
|
+
xAxisLine?: AxisLineStyle;
|
|
41
|
+
yAxisLine?: AxisLineStyle;
|
|
42
|
+
gridLine?: AxisLineStyle;
|
|
43
|
+
fitSettings?: XyFitSettings | null;
|
|
44
|
+
xScale?: XyAxisScaleSettings | null;
|
|
45
|
+
yScale?: XyAxisScaleSettings | null;
|
|
46
|
+
}
|
|
47
|
+
export declare function XYScatterChart({ points, xLabel, yLabel, color, datasetColors, colorLabel, colorRange, height, pointRadius, drawMode, lineWidth, backgroundToken, onPlotContextMenu, xAxisLine, yAxisLine, gridLine, fitSettings, xScale, yScale, }: XYScatterChartProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export interface XYZPoint {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
z: number;
|
|
5
|
+
}
|
|
6
|
+
/** Points as columns: one array per axis, `length` long. */
|
|
7
|
+
export interface XYZColumns {
|
|
8
|
+
length: number;
|
|
9
|
+
x: ArrayLike<number>;
|
|
10
|
+
y: ArrayLike<number>;
|
|
11
|
+
z: ArrayLike<number>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Heights over a uniform grid: `w` × `h` values row by row, column c at
|
|
15
|
+
* x[0] + c·(x[1] − x[0])/(w − 1), row r at y[0] + r·(y[1] − y[0])/(h − 1).
|
|
16
|
+
* NaN leaves a hole.
|
|
17
|
+
*/
|
|
18
|
+
export interface XYZSurface {
|
|
19
|
+
w: number;
|
|
20
|
+
h: number;
|
|
21
|
+
values: ArrayLike<number>;
|
|
22
|
+
x: [number, number];
|
|
23
|
+
y: [number, number];
|
|
24
|
+
}
|
|
25
|
+
export type XYZViewMode = '3d' | 'xy' | 'xz' | 'yz';
|
|
26
|
+
export interface XYZAlarmPlane {
|
|
27
|
+
axis: 'x' | 'y' | 'z';
|
|
28
|
+
value: number;
|
|
29
|
+
color: string;
|
|
30
|
+
style: 'solid' | 'dashed' | 'dotted';
|
|
31
|
+
width: number;
|
|
32
|
+
}
|
|
33
|
+
export interface XYZMeshChartProps {
|
|
34
|
+
points: XYZPoint[] | XYZColumns;
|
|
35
|
+
/** A surface over a uniform grid, drawn with (or instead of) the points. */
|
|
36
|
+
surface?: XYZSurface;
|
|
37
|
+
xLabel: string;
|
|
38
|
+
yLabel: string;
|
|
39
|
+
zLabel: string;
|
|
40
|
+
height?: number;
|
|
41
|
+
/** When this value changes (e.g. custom plot background), styles are re-read from CSS. */
|
|
42
|
+
backgroundToken?: string;
|
|
43
|
+
/** Optional per-axis data ranges. Points outside are filtered; axes use these bounds. */
|
|
44
|
+
xRange?: [number, number];
|
|
45
|
+
yRange?: [number, number];
|
|
46
|
+
zRange?: [number, number];
|
|
47
|
+
/** 3D perspective (default) or 2D projection onto a chosen plane. */
|
|
48
|
+
viewMode?: XYZViewMode;
|
|
49
|
+
/** Radius of sample markers in CSS pixels (2D views and 3D). Default 4. */
|
|
50
|
+
pointRadius?: number;
|
|
51
|
+
/** Alarm planes — each renders as a semi-transparent plane in 3D or a line in 2D projections. */
|
|
52
|
+
alarms?: XYZAlarmPlane[];
|
|
53
|
+
/** Show Delaunay triangulated surface. Default false. */
|
|
54
|
+
showMesh?: boolean;
|
|
55
|
+
/** Mesh rendering style. Default 'filled'. */
|
|
56
|
+
meshStyle?: 'filled' | 'wireframe' | 'both';
|
|
57
|
+
/** Triangle fill opacity 0–1. Default 0.85. */
|
|
58
|
+
meshOpacity?: number;
|
|
59
|
+
onPlotContextMenu?: (e: {
|
|
60
|
+
clientX: number;
|
|
61
|
+
clientY: number;
|
|
62
|
+
}) => void;
|
|
63
|
+
}
|
|
64
|
+
export type XYZMeshChartHandle = {
|
|
65
|
+
/** Reset camera to the default framing (same as double‑click on the chart). */
|
|
66
|
+
autoscale: () => void;
|
|
67
|
+
};
|
|
68
|
+
export declare const XYZMeshChart: import("react").ForwardRefExoticComponent<XYZMeshChartProps & import("react").RefAttributes<XYZMeshChartHandle>>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Horizontal virtual columns (was 12; finer = smoother drag/resize). */
|
|
2
|
+
export declare const DASHBOARD_GRID_COLS = 96;
|
|
3
|
+
/** Virtual rows for the dashboard area; rows use 1fr so they fill the viewport. */
|
|
4
|
+
export declare const DASHBOARD_GRID_ROWS = 96;
|
|
5
|
+
/** Fallback row height (only used if grid-template-rows isn't applied). */
|
|
6
|
+
export declare const DASHBOARD_ROW_HEIGHT_PX = 4;
|
|
7
|
+
export declare const DASHBOARD_GRID_GAP_PX = 2;
|
|
8
|
+
/** Hard cap on the number of charts we auto-arrange. */
|
|
9
|
+
export declare const MAX_DASHBOARD_PANELS = 16;
|
|
10
|
+
export type DashboardPanelKind = 'multiband' | 'xyscatter' | 'xyzmesh' | 'histogram' | 'polar' | 'spectrum' | 'boxplot' | 'spectrogram' | 'heatmap' | 'violin' | 'confusion' | 'roc' | 'losscurve' | 'controlchart' | 'parallelcoords' | 'embedding' | 'flamegraph' | 'barchart' | 'radar' | 'areachart' | 'cdfchart' | 'bubblechart' | 'treemap' | 'sankey' | 'calibration' | 'qqplot' | 'gantt' | 'gauge';
|
|
11
|
+
export interface DashboardGridRect {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
w: number;
|
|
15
|
+
h: number;
|
|
16
|
+
}
|
|
17
|
+
export interface DashboardPanel {
|
|
18
|
+
id: string;
|
|
19
|
+
kind: DashboardPanelKind;
|
|
20
|
+
rect: DashboardGridRect;
|
|
21
|
+
/** User-defined chart title. When empty/undefined the kind label is used. */
|
|
22
|
+
title?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Legacy 12-col grid → current scale (96 / 12 = 8). */
|
|
25
|
+
export declare const LEGACY_GRID_SCALE = 8;
|
|
26
|
+
export declare const MIN_PANEL_W: Record<DashboardPanelKind, number>;
|
|
27
|
+
export declare const MIN_PANEL_H: Record<DashboardPanelKind, number>;
|
|
28
|
+
export declare function rectsOverlap(a: DashboardGridRect, b: DashboardGridRect): boolean;
|
|
29
|
+
export declare function clampRectForKind(kind: DashboardPanelKind, r: DashboardGridRect, cols: number, rows?: number): DashboardGridRect;
|
|
30
|
+
/**
|
|
31
|
+
* A chart's grid rectangle after a pointer drag of (dxPx, dyPx) on a board of
|
|
32
|
+
* `board` CSS pixels: 'move' shifts it, 'resize' moves its bottom-right corner.
|
|
33
|
+
* The result stays on the grid and never shrinks below the kind's minimum; a
|
|
34
|
+
* move past an edge trims the chart rather than stopping it. Call
|
|
35
|
+
* it on pointermove with the rectangle from pointerdown, then store the result
|
|
36
|
+
* with `charts.setLayout`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function dragLayout(kind: DashboardPanelKind, start: DashboardGridRect, mode: 'move' | 'resize', dxPx: number, dyPx: number, board: {
|
|
39
|
+
width: number;
|
|
40
|
+
height: number;
|
|
41
|
+
}, cols?: number, rows?: number): DashboardGridRect;
|
|
42
|
+
export declare function layoutPanelsValid(panels: DashboardPanel[], cols?: number, rows?: number): boolean;
|
|
43
|
+
/** Place a new panel without overlapping existing ones. */
|
|
44
|
+
export declare function suggestNewPanelRect(kind: DashboardPanelKind, existing: DashboardPanel[], cols?: number): DashboardGridRect;
|
|
45
|
+
export declare function newPanel(kind: DashboardPanelKind, existing: DashboardPanel[]): DashboardPanel;
|
|
46
|
+
/**
|
|
47
|
+
* Reposition every panel onto the recursive split layout. Order in the input
|
|
48
|
+
* array decides which slot each panel takes.
|
|
49
|
+
*/
|
|
50
|
+
export declare function arrangeAutoLayout(panels: DashboardPanel[], cols?: number, rows?: number): DashboardPanel[];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fraction of the remaining gap to close this animation frame for an exponential
|
|
3
|
+
* (critically-damped) follow: `value += (target - value) * factor`.
|
|
4
|
+
*
|
|
5
|
+
* Derived from the frame time so the motion is frame-rate independent — the same
|
|
6
|
+
* wall-clock easing whether the display runs at 60, 120 or 360 Hz. Two 8 ms
|
|
7
|
+
* steps close the same gap as one 16 ms step. `tauMs` is the time constant: the
|
|
8
|
+
* gap shrinks by 1/e every `tauMs` of real time.
|
|
9
|
+
*/
|
|
10
|
+
export declare function followEaseFactor(dtMs: number, tauMs: number): number;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute the live auto-scroll X target from the buffer's extent and an optional
|
|
3
|
+
* fixed time window (seconds).
|
|
4
|
+
*
|
|
5
|
+
* WHY: with no window the chart tracks the whole extent `[oldest, newest]`. While
|
|
6
|
+
* a live stream fills the ring, `oldest` is pinned (nothing evicts yet) and
|
|
7
|
+
* `newest` grows, so the window WIDENS from ~0 to the full buffer span (~120 s) —
|
|
8
|
+
* a continuous zoom-out. Since scroll speed = plotWidth / span, that collapses the
|
|
9
|
+
* left-ward motion ~100× as it fills (measured 1788 → 16 px/s), so near-full the
|
|
10
|
+
* trace crawls. A FIXED window keeps the span constant → constant scroll speed.
|
|
11
|
+
*
|
|
12
|
+
* The left edge clamps to `oldest`, so the window still grows with the data until
|
|
13
|
+
* it reaches `windowSeconds` (no empty gutter early), then pins to
|
|
14
|
+
* `[newest - windowSeconds, newest]` and scrolls at a steady rate. `null`/≤0 keeps
|
|
15
|
+
* the full-extent ("All") behaviour.
|
|
16
|
+
*/
|
|
17
|
+
export declare function liveWindowTarget(oldest: number, newest: number, windowSeconds: number | null, latest?: number): [number, number];
|
|
18
|
+
/**
|
|
19
|
+
* How many decimation buckets the live pull should request: ~2 per DEVICE pixel
|
|
20
|
+
* of the plot, clamped to a sane range.
|
|
21
|
+
*
|
|
22
|
+
* WHY: a fixed low budget (2000) left the bucket wider than the sample spacing at
|
|
23
|
+
* common windows, so most buckets held 2+ samples and rendered as min→max
|
|
24
|
+
* vertical bars ~1 px apart — on fast channels (RPM, throttle, gear) the trace
|
|
25
|
+
* became a comb that flickered as it slid sub-pixel, and looked low-resolution.
|
|
26
|
+
* Sizing to the actual plot pixels makes buckets ≤ one sample at typical windows
|
|
27
|
+
* (a plain continuous polyline through the real samples) while denser views
|
|
28
|
+
* (All/2 m) pack the bars sub-pixel into an honest solid envelope. The floor
|
|
29
|
+
* covers the not-yet-measured first frame; the cap bounds the per-frame pull and
|
|
30
|
+
* point-array cost on very large displays.
|
|
31
|
+
*/
|
|
32
|
+
export declare function livePullMaxPoints(plotWCss: number, dpr: number): number;
|
|
33
|
+
/** Narrowest live window a wheel zoom-in can reach, in seconds. */
|
|
34
|
+
export declare const LIVE_MIN_WINDOW_S = 0.5;
|
|
35
|
+
/**
|
|
36
|
+
* Next live window (seconds) after one wheel tick on a live time axis. The span
|
|
37
|
+
* changes but the window stays pinned to the live edge, so zooming shows more or
|
|
38
|
+
* less history while the newest samples keep scrolling in. The current span is
|
|
39
|
+
* clamped to what is actually buffered (`extent`), so a 30 s window over 10 s of
|
|
40
|
+
* data zooms from 10 s, not from an invisible 30 s. Zooming out to the whole
|
|
41
|
+
* buffer returns `null` ("All").
|
|
42
|
+
*/
|
|
43
|
+
export declare function liveZoomWindow(windowSeconds: number | null, extent: number, zoomIn: boolean, minSpan?: number): number | null;
|
|
44
|
+
/**
|
|
45
|
+
* Smooth playout of a bursty live feed. Samples arrive in messages (10–30 per
|
|
46
|
+
* second, capped by plan), each carrying a burst of samples, so drawing up to
|
|
47
|
+
* the newest sample moves the trace in steps at the message rate however fast
|
|
48
|
+
* the chart repaints. Instead the drawn edge is a display time that advances
|
|
49
|
+
* with the wall clock every frame, held about one message behind the newest
|
|
50
|
+
* sample (the burst length, smoothed), with a gentle pull toward that lag so a
|
|
51
|
+
* feed faster or slower than real time is followed too.
|
|
52
|
+
*/
|
|
53
|
+
export interface Playout {
|
|
54
|
+
/** Display time; null until the first sample. */
|
|
55
|
+
d: number | null;
|
|
56
|
+
/** Newest sample time seen. */
|
|
57
|
+
lastT: number;
|
|
58
|
+
/** Smoothed burst length (data seconds per message). */
|
|
59
|
+
burst: number;
|
|
60
|
+
}
|
|
61
|
+
export declare function createPlayout(): Playout;
|
|
62
|
+
/** Advance `p` one frame (`dtMs`) given the newest sample time `t`; the display time. */
|
|
63
|
+
export declare function advancePlayout(p: Playout, t: number, dtMs: number): number;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { PointColumns } from '../lib/data/pointColumns';
|
|
2
|
+
/** X in data units under a cursor pixel, for the current view. */
|
|
3
|
+
export declare function dataXAtPx(px: number, left: number, plotW: number, xmin: number, xmax: number): number;
|
|
4
|
+
/**
|
|
5
|
+
* Value of each channel under the cursor, keyed by column.
|
|
6
|
+
*
|
|
7
|
+
* Resolved from the cursor's X in data units — never from a point index. A live
|
|
8
|
+
* stream rebuilds its points several times a second off a rolling buffer, so an
|
|
9
|
+
* index walks to ever newer samples and the readout drifts away from where the
|
|
10
|
+
* user pointed.
|
|
11
|
+
*
|
|
12
|
+
* Each column is searched independently, across every layer: in multi-dataset
|
|
13
|
+
* mode a layer carries only its own source's columns (`Speed__0` or
|
|
14
|
+
* `Speed__1`, never both), so the globally nearest point says nothing about the
|
|
15
|
+
* others.
|
|
16
|
+
*
|
|
17
|
+
* `columns` are the plotted columns to resolve — nothing else is read.
|
|
18
|
+
*
|
|
19
|
+
* `reachByCol` bounds how far that column's nearest sample may be, in data
|
|
20
|
+
* units — pass its line-join threshold so a channel reads out exactly where its
|
|
21
|
+
* line is drawn, and stays absent over a gap or over chart a live feed has not
|
|
22
|
+
* reached yet. A column with no entry is unbounded.
|
|
23
|
+
*
|
|
24
|
+
* The scan is linear because points are in SAMPLE order, which is sorted by X
|
|
25
|
+
* only when X is a monotonic channel. Plotted against lap distance, a live
|
|
26
|
+
* buffer spanning a lap boundary runs 3900→4897 and then restarts at 0; a
|
|
27
|
+
* bisection lands in the wrong branch and reports no data over half the chart.
|
|
28
|
+
*/
|
|
29
|
+
export declare function valuesUnderCursor(layers: PointColumns[], targetX: number, columns: string[], reachByCol?: Map<string, number>): Map<string, number>;
|
|
30
|
+
/**
|
|
31
|
+
* Value of each column at the point nearest to `x` that has it (each layer
|
|
32
|
+
* sorted by X). Binary search, then a short walk outwards: O(log n), not a full
|
|
33
|
+
* scan. Across layers, the nearest one wins.
|
|
34
|
+
*/
|
|
35
|
+
export declare function valuesNearX(layers: PointColumns[], columns: string[], x: number, maxWalk?: number): Map<string, number>;
|
|
36
|
+
/**
|
|
37
|
+
* Newest numeric value of each requested column — the live edge of the feed.
|
|
38
|
+
* Shown in the legend while nothing is hovered, so an untouched chart reads out
|
|
39
|
+
* the current value of every channel instead of a placeholder. Scans backwards
|
|
40
|
+
* (last layer first) and stops as soon as every column is resolved, so trailing
|
|
41
|
+
* gaps (a signal missing from the last few frames) fall back to its last real
|
|
42
|
+
* sample.
|
|
43
|
+
*/
|
|
44
|
+
export declare function latestValuesByColumn(layers: PointColumns[], columns: string[]): Map<string, number>;
|