@kymoscope/sdk 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/LICENSE.md +69 -0
  2. package/README.md +138 -2
  3. package/dist/assets/duckdb-browser-eh.worker--3HUwN9R.js +14 -0
  4. package/dist/assets/duckdb-eh-D-nnNw7L.wasm.gz +0 -0
  5. package/dist/assets/h5wasmModule-BCQWU2Gw.js +24295 -0
  6. package/dist/assets/importer.worker-D4is7BLf.js +6 -0
  7. package/dist/assets/offscreenLineWorker-mShhnyXX.js +79 -0
  8. package/dist/assets/parseDataset.worker-PynRsPD8.js +5 -0
  9. package/dist/importers-DivmF3tx.js +5 -0
  10. package/dist/krc-CbE28CjD.js +9 -0
  11. package/dist/kymoscope-embed.js +633 -0
  12. package/dist/kymoscope-sdk.js +616 -0
  13. package/dist/react.js +2 -0
  14. package/dist/styles/charts.css +207 -0
  15. package/dist/styles/fonts/OFL.txt +93 -0
  16. package/dist/styles/fonts/plus-jakarta-sans-italic-latin-ext.woff2 +0 -0
  17. package/dist/styles/fonts/plus-jakarta-sans-italic-latin.woff2 +0 -0
  18. package/dist/styles/fonts/plus-jakarta-sans-latin-ext.woff2 +0 -0
  19. package/dist/styles/fonts/plus-jakarta-sans-latin.woff2 +0 -0
  20. package/dist/styles/tokens.css +218 -0
  21. package/dist/types/charts/AlarmOverlay.d.ts +11 -0
  22. package/dist/types/charts/AnnotationLayer.d.ts +29 -0
  23. package/dist/types/charts/ChartBody.d.ts +52 -0
  24. package/dist/types/charts/PerfHud.d.ts +20 -0
  25. package/dist/types/charts/beacon.d.ts +27 -0
  26. package/dist/types/charts/chartWindow.d.ts +31 -0
  27. package/dist/types/charts/liveOverlay.d.ts +16 -0
  28. package/dist/types/charts/runtime.d.ts +63 -0
  29. package/dist/types/charts/useWorksheetData.d.ts +159 -0
  30. package/dist/types/components/AreaChart.d.ts +21 -0
  31. package/dist/types/components/BarChart.d.ts +30 -0
  32. package/dist/types/components/BoxPlotChart.d.ts +16 -0
  33. package/dist/types/components/BubbleChart.d.ts +24 -0
  34. package/dist/types/components/CalibrationChart.d.ts +15 -0
  35. package/dist/types/components/CdfChart.d.ts +15 -0
  36. package/dist/types/components/ConfusionChart.d.ts +11 -0
  37. package/dist/types/components/ControlChart.d.ts +17 -0
  38. package/dist/types/components/DuckDbMultiBandPanel.d.ts +35 -0
  39. package/dist/types/components/EmbeddingChart.d.ts +25 -0
  40. package/dist/types/components/FlameGraphChart.d.ts +15 -0
  41. package/dist/types/components/GanttChart.d.ts +15 -0
  42. package/dist/types/components/GaugeChart.d.ts +27 -0
  43. package/dist/types/components/HeatmapChart.d.ts +41 -0
  44. package/dist/types/components/HistogramChart.d.ts +15 -0
  45. package/dist/types/components/LossCurveChart.d.ts +17 -0
  46. package/dist/types/components/MultiBandCanvasChart.d.ts +156 -0
  47. package/dist/types/components/ParallelCoordsChart.d.ts +21 -0
  48. package/dist/types/components/PolarChart.d.ts +17 -0
  49. package/dist/types/components/QQPlotChart.d.ts +16 -0
  50. package/dist/types/components/RadarChart.d.ts +17 -0
  51. package/dist/types/components/RocChart.d.ts +12 -0
  52. package/dist/types/components/SankeyChart.d.ts +15 -0
  53. package/dist/types/components/SpectrogramChart.d.ts +16 -0
  54. package/dist/types/components/SpectrogramWaterfall.d.ts +14 -0
  55. package/dist/types/components/SpectrumChart.d.ts +17 -0
  56. package/dist/types/components/TreemapChart.d.ts +14 -0
  57. package/dist/types/components/ViolinChart.d.ts +17 -0
  58. package/dist/types/components/XYScatterChart.d.ts +47 -0
  59. package/dist/types/components/XYZMeshChart.d.ts +68 -0
  60. package/dist/types/components/dashboardGridLayout.d.ts +50 -0
  61. package/dist/types/components/liveFollowEase.d.ts +10 -0
  62. package/dist/types/components/liveWindow.d.ts +63 -0
  63. package/dist/types/components/multiBandHover.d.ts +44 -0
  64. package/dist/types/embed/Attribution.d.ts +5 -0
  65. package/dist/types/embed/license.d.ts +29 -0
  66. package/dist/types/embed/standalone.d.ts +5 -0
  67. package/dist/types/engine/columns.d.ts +44 -0
  68. package/dist/types/engine/createEngine.d.ts +394 -0
  69. package/dist/types/engine/derive.d.ts +27 -0
  70. package/dist/types/engine/emitter.d.ts +6 -0
  71. package/dist/types/engine/errors.d.ts +7 -0
  72. package/dist/types/engine/history.d.ts +29 -0
  73. package/dist/types/engine/kinds.d.ts +9 -0
  74. package/dist/types/engine/liveController.d.ts +27 -0
  75. package/dist/types/engine/store.d.ts +8 -0
  76. package/dist/types/engine/types.d.ts +194 -0
  77. package/dist/types/index.d.ts +69 -0
  78. package/dist/types/lib/annotations.d.ts +37 -0
  79. package/dist/types/lib/beacon.d.ts +62 -0
  80. package/dist/types/lib/colorScheme.d.ts +5 -0
  81. package/dist/types/lib/colormap.d.ts +9 -0
  82. package/dist/types/lib/columnTable.d.ts +37 -0
  83. package/dist/types/lib/data/arrowDecimation.d.ts +11 -0
  84. package/dist/types/lib/data/binnedHeatmap.d.ts +27 -0
  85. package/dist/types/lib/data/columnCaches.d.ts +6 -0
  86. package/dist/types/lib/data/columnarDataSource.d.ts +34 -0
  87. package/dist/types/lib/data/createDataSource.d.ts +23 -0
  88. package/dist/types/lib/data/dataSource.d.ts +75 -0
  89. package/dist/types/lib/data/decimate.d.ts +25 -0
  90. package/dist/types/lib/data/duckDbDataSource.d.ts +42 -0
  91. package/dist/types/lib/data/envelope.d.ts +16 -0
  92. package/dist/types/lib/data/inMemoryDataSource.d.ts +25 -0
  93. package/dist/types/lib/data/liveDataSource.d.ts +77 -0
  94. package/dist/types/lib/data/lruCache.d.ts +11 -0
  95. package/dist/types/lib/data/openDataset.d.ts +24 -0
  96. package/dist/types/lib/data/opfsParquet.d.ts +4 -0
  97. package/dist/types/lib/data/pointColumns.d.ts +59 -0
  98. package/dist/types/lib/data/schemaColumns.d.ts +5 -0
  99. package/dist/types/lib/data/useSeriesPoints.d.ts +48 -0
  100. package/dist/types/lib/data/xyColumns.d.ts +77 -0
  101. package/dist/types/lib/dataBounds.d.ts +10 -0
  102. package/dist/types/lib/datasetColors.d.ts +19 -0
  103. package/dist/types/lib/datasetColumns.d.ts +3 -0
  104. package/dist/types/lib/datasetMerge.d.ts +8 -0
  105. package/dist/types/lib/duckdb/duckdbInstance.d.ts +7 -0
  106. package/dist/types/lib/duckdb/fileIdentity.d.ts +9 -0
  107. package/dist/types/lib/duckdb/sql.d.ts +124 -0
  108. package/dist/types/lib/fft.d.ts +15 -0
  109. package/dist/types/lib/folderTree.d.ts +29 -0
  110. package/dist/types/lib/gaugeColors.d.ts +32 -0
  111. package/dist/types/lib/importers/arrowSink.d.ts +35 -0
  112. package/dist/types/lib/importers/blobReader.d.ts +22 -0
  113. package/dist/types/lib/importers/bytes.d.ts +11 -0
  114. package/dist/types/lib/importers/combine.d.ts +30 -0
  115. package/dist/types/lib/importers/comtrade/format.d.ts +2 -0
  116. package/dist/types/lib/importers/comtrade/importer.d.ts +25 -0
  117. package/dist/types/lib/importers/dbc.d.ts +45 -0
  118. package/dist/types/lib/importers/edf/format.d.ts +2 -0
  119. package/dist/types/lib/importers/edf/importer.d.ts +7 -0
  120. package/dist/types/lib/importers/expr.d.ts +10 -0
  121. package/dist/types/lib/importers/formats.d.ts +23 -0
  122. package/dist/types/lib/importers/hdf5/format.d.ts +4 -0
  123. package/dist/types/lib/importers/hdf5/h5.d.ts +76 -0
  124. package/dist/types/lib/importers/hdf5/h5wasmModule.d.ts +1 -0
  125. package/dist/types/lib/importers/hdf5/importer.d.ts +2 -0
  126. package/dist/types/lib/importers/importer.worker.d.ts +5 -0
  127. package/dist/types/lib/importers/importers.d.ts +4 -0
  128. package/dist/types/lib/importers/limits.d.ts +28 -0
  129. package/dist/types/lib/importers/mat/format.d.ts +2 -0
  130. package/dist/types/lib/importers/mat/group.d.ts +19 -0
  131. package/dist/types/lib/importers/mat/importer.d.ts +2 -0
  132. package/dist/types/lib/importers/mat/v5.d.ts +24 -0
  133. package/dist/types/lib/importers/mat/v73.d.ts +13 -0
  134. package/dist/types/lib/importers/mdf/blocks3.d.ts +3 -0
  135. package/dist/types/lib/importers/mdf/blocks4.d.ts +7 -0
  136. package/dist/types/lib/importers/mdf/bus.d.ts +59 -0
  137. package/dist/types/lib/importers/mdf/conversion.d.ts +48 -0
  138. package/dist/types/lib/importers/mdf/decode.d.ts +15 -0
  139. package/dist/types/lib/importers/mdf/format.d.ts +2 -0
  140. package/dist/types/lib/importers/mdf/importer.d.ts +19 -0
  141. package/dist/types/lib/importers/mdf/model.d.ts +75 -0
  142. package/dist/types/lib/importers/mdf/records.d.ts +31 -0
  143. package/dist/types/lib/importers/mdf/stream.d.ts +42 -0
  144. package/dist/types/lib/importers/memorySink.d.ts +11 -0
  145. package/dist/types/lib/importers/names.d.ts +2 -0
  146. package/dist/types/lib/importers/openImport.d.ts +33 -0
  147. package/dist/types/lib/importers/registry.d.ts +24 -0
  148. package/dist/types/lib/importers/run.d.ts +35 -0
  149. package/dist/types/lib/importers/session.d.ts +28 -0
  150. package/dist/types/lib/importers/tdms/format.d.ts +2 -0
  151. package/dist/types/lib/importers/tdms/importer.d.ts +10 -0
  152. package/dist/types/lib/importers/types.d.ts +172 -0
  153. package/dist/types/lib/importers/workerCore.d.ts +44 -0
  154. package/dist/types/lib/importers/xdf/format.d.ts +2 -0
  155. package/dist/types/lib/importers/xdf/importer.d.ts +2 -0
  156. package/dist/types/lib/importers/zlib.d.ts +13 -0
  157. package/dist/types/lib/kde.d.ts +2 -0
  158. package/dist/types/lib/live/buffer.d.ts +265 -0
  159. package/dist/types/lib/live/columnsWire.d.ts +24 -0
  160. package/dist/types/lib/live/crypto.d.ts +157 -0
  161. package/dist/types/lib/live/liveMathChannels.d.ts +11 -0
  162. package/dist/types/lib/live/recorder.d.ts +32 -0
  163. package/dist/types/lib/live/stream.d.ts +33 -0
  164. package/dist/types/lib/live/timeBuckets.d.ts +71 -0
  165. package/dist/types/lib/live/types.d.ts +72 -0
  166. package/dist/types/lib/live/wire.d.ts +25 -0
  167. package/dist/types/lib/mathChannels/compile.d.ts +22 -0
  168. package/dist/types/lib/mathChannels/evaluator.d.ts +40 -0
  169. package/dist/types/lib/mathChannels/functions/conditional.d.ts +2 -0
  170. package/dist/types/lib/mathChannels/functions/filters.d.ts +7 -0
  171. package/dist/types/lib/mathChannels/functions/index.d.ts +3 -0
  172. package/dist/types/lib/mathChannels/functions/reference.d.ts +7 -0
  173. package/dist/types/lib/mathChannels/functions/windowOps.d.ts +11 -0
  174. package/dist/types/lib/mathChannels/index.d.ts +13 -0
  175. package/dist/types/lib/mathChannels/io.d.ts +18 -0
  176. package/dist/types/lib/mathChannels/mathjsSetup.d.ts +7 -0
  177. package/dist/types/lib/mathChannels/parseMath.d.ts +12 -0
  178. package/dist/types/lib/mathChannels/parser.d.ts +22 -0
  179. package/dist/types/lib/mathChannels/types.d.ts +34 -0
  180. package/dist/types/lib/mathChannels/usedChannels.d.ts +14 -0
  181. package/dist/types/lib/moduleWorker.d.ts +7 -0
  182. package/dist/types/lib/panelChartSettings.d.ts +438 -0
  183. package/dist/types/lib/parseDataset.d.ts +74 -0
  184. package/dist/types/lib/parseDataset.worker.d.ts +1 -0
  185. package/dist/types/lib/parseDatasetWorkerClient.d.ts +32 -0
  186. package/dist/types/lib/perfLog.d.ts +4 -0
  187. package/dist/types/lib/quantiles.d.ts +10 -0
  188. package/dist/types/lib/recordings/csvWriter.d.ts +10 -0
  189. package/dist/types/lib/recordings/export.d.ts +26 -0
  190. package/dist/types/lib/recordings/importer.d.ts +2 -0
  191. package/dist/types/lib/recordings/keys.d.ts +23 -0
  192. package/dist/types/lib/recordings/krc.d.ts +38 -0
  193. package/dist/types/lib/recordings/mf4Writer.d.ts +20 -0
  194. package/dist/types/lib/render/chartFonts.d.ts +10 -0
  195. package/dist/types/lib/render/colorBucket.d.ts +6 -0
  196. package/dist/types/lib/render/contours.d.ts +16 -0
  197. package/dist/types/lib/render/cssColor.d.ts +2 -0
  198. package/dist/types/lib/render/frames.d.ts +46 -0
  199. package/dist/types/lib/render/gl3d.d.ts +63 -0
  200. package/dist/types/lib/render/glLines.d.ts +62 -0
  201. package/dist/types/lib/render/glPlot.d.ts +36 -0
  202. package/dist/types/lib/render/glPoints.d.ts +37 -0
  203. package/dist/types/lib/render/glSeries.d.ts +67 -0
  204. package/dist/types/lib/render/heatGrid.d.ts +9 -0
  205. package/dist/types/lib/render/hitGrid.d.ts +16 -0
  206. package/dist/types/lib/render/liveZoomBus.d.ts +18 -0
  207. package/dist/types/lib/render/margins.d.ts +14 -0
  208. package/dist/types/lib/render/offscreenLineRenderer.d.ts +53 -0
  209. package/dist/types/lib/render/offscreenLineWorker.d.ts +1 -0
  210. package/dist/types/lib/render/plotFrame.d.ts +36 -0
  211. package/dist/types/lib/render/resample.d.ts +18 -0
  212. package/dist/types/lib/render/sharedGl.d.ts +38 -0
  213. package/dist/types/lib/render/useGlPlot.d.ts +7 -0
  214. package/dist/types/lib/savedLayout.d.ts +45 -0
  215. package/dist/types/lib/stft.d.ts +37 -0
  216. package/dist/types/lib/workspaces/encrypted.d.ts +50 -0
  217. package/dist/types/lib/workspaces/io.d.ts +120 -0
  218. package/dist/types/lib/xyFit.d.ts +14 -0
  219. package/dist/types/lib/yAxisTicks.d.ts +28 -0
  220. package/dist/types/react/index.d.ts +32 -0
  221. package/dist/types/types/loadedDataset.d.ts +42 -0
  222. package/dist/types/types/plotSeries.d.ts +27 -0
  223. 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>;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shown on every chart of an unlicensed page (TradingView-style attribution). Never blocks
3
+ * use. Styled inline so it renders the same in React hosts and shadow roots.
4
+ */
5
+ export declare function Attribution(): import("react/jsx-runtime").JSX.Element;