waveform-analysis 0.1.71 → 0.1.73

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 (122) hide show
  1. package/README.md +260 -40
  2. package/dist/assets/{workerRuntime-o5An0M-W.js → workerRuntime-5p-EI-GL.js} +1 -1
  3. package/dist/index.cjs +2 -1
  4. package/dist/index.js +3874 -2778
  5. package/dist/style.css +1 -1
  6. package/dist/types/components/WaveformChart.vue.d.ts +24 -6
  7. package/dist/types/components/annotation/WaveformAnnotationLayer.vue.d.ts +2 -0
  8. package/dist/types/components/annotation/useWaveformChartAnnotations.d.ts +0 -1
  9. package/dist/types/components/controls/WaveformToolbar.vue.d.ts +7 -0
  10. package/dist/types/components/controls/chartExportOptions.d.ts +5 -0
  11. package/dist/types/components/controls/chartSnapshot.d.ts +2 -0
  12. package/dist/types/components/controls/snapshotTitle.d.ts +2 -0
  13. package/dist/types/components/controls/toolbarRegistry.d.ts +21 -0
  14. package/dist/types/components/controls/useChartCommands.d.ts +42 -0
  15. package/dist/types/components/controls/useChartImageExport.d.ts +17 -0
  16. package/dist/types/components/controls/useControlMode.d.ts +8 -0
  17. package/dist/types/components/core/latestTaskScheduler.d.ts +1 -1
  18. package/dist/types/components/core/layout.d.ts +6 -3
  19. package/dist/types/components/core/niceScale.d.ts +34 -0
  20. package/dist/types/components/core/trackLayoutBuilder.d.ts +4 -1
  21. package/dist/types/components/core/trackPagination.d.ts +1 -1
  22. package/dist/types/components/core/types.d.ts +5 -0
  23. package/dist/types/components/core/useWaveformChartController.d.ts +24 -6
  24. package/dist/types/components/core/useWaveformChartLifecycle.d.ts +2 -2
  25. package/dist/types/components/core/useWaveformData.d.ts +2 -0
  26. package/dist/types/components/core/useWaveformLayout.d.ts +4 -1
  27. package/dist/types/components/core/useWaveformMeasurements.d.ts +2 -0
  28. package/dist/types/components/core/useWaveformRenderSampling.d.ts +1 -0
  29. package/dist/types/components/core/useWaveformViewportRestore.d.ts +5 -0
  30. package/dist/types/components/core/waveformChartTypes.d.ts +5 -0
  31. package/dist/types/components/core/waveformSamplingSession.d.ts +24 -0
  32. package/dist/types/components/core/yAxisLabelStyle.d.ts +3 -0
  33. package/dist/types/components/core/yAxisLayoutMetrics.d.ts +2 -1
  34. package/dist/types/components/core/yAxisPadding.d.ts +7 -0
  35. package/dist/types/components/core/yAxisTitleLayout.d.ts +2 -0
  36. package/dist/types/components/interaction/useExtremaTickViewport.d.ts +5 -0
  37. package/dist/types/components/interaction/useWaveformViewport.d.ts +1 -0
  38. package/dist/types/components/rendering/WaveformLegend.vue.d.ts +2 -2
  39. package/dist/types/components/rendering/WaveformTrack.vue.d.ts +2 -3
  40. package/dist/types/components/rendering/WaveformTrackAxes.vue.d.ts +1 -1
  41. package/dist/types/components/rendering/WaveformTrackBackdrop.vue.d.ts +1 -0
  42. package/dist/types/components/rendering/compactFrame.d.ts +5 -0
  43. package/dist/types/components/rendering/yAxisTickVisibility.d.ts +11 -0
  44. package/dist/types/core/lineBoundary.d.ts +4 -0
  45. package/dist/types/core/rendering.d.ts +4 -0
  46. package/dist/types/core/renderingStrategies.d.ts +2 -0
  47. package/dist/types/core/workerSampling/outputBoundaries.d.ts +4 -0
  48. package/dist/types/data/simulatedWaveforms.d.ts +1 -1
  49. package/dist/types/data/sx2Channel.d.ts +10 -0
  50. package/dist/types/demo/DemoYAxisPaddingControls.vue.d.ts +11 -0
  51. package/dist/types/demo/types.d.ts +7 -0
  52. package/dist/types/index.d.ts +2 -1
  53. package/dist/types/types/chart.d.ts +32 -8
  54. package/dist/types/types/controls.d.ts +69 -0
  55. package/dist/types/types/index.d.ts +2 -1
  56. package/dist/types/utils/formatters.d.ts +1 -0
  57. package/package.json +7 -6
  58. package/src/App.vue +61 -14
  59. package/src/components/WaveformChart.css +10 -1
  60. package/src/components/WaveformChart.vue +6 -0
  61. package/src/components/WaveformChartView.vue +27 -26
  62. package/src/components/annotation/WaveformAnnotationLayer.vue +6 -1
  63. package/src/components/annotation/useWaveformChartAnnotations.ts +7 -18
  64. package/src/components/controls/WaveformToolbar.vue +247 -0
  65. package/src/components/controls/chartExportOptions.ts +32 -0
  66. package/src/components/controls/chartSnapshot.ts +132 -0
  67. package/src/components/controls/snapshotTitle.ts +73 -0
  68. package/src/components/controls/toolbarRegistry.ts +92 -0
  69. package/src/components/controls/useChartCommands.ts +294 -0
  70. package/src/components/controls/useChartImageExport.ts +155 -0
  71. package/src/components/controls/useControlMode.ts +30 -0
  72. package/src/components/core/latestTaskScheduler.ts +14 -2
  73. package/src/components/core/layout.ts +49 -36
  74. package/src/components/core/niceScale.ts +151 -0
  75. package/src/components/core/trackLayoutBuilder.ts +41 -17
  76. package/src/components/core/trackPagination.ts +3 -3
  77. package/src/components/core/types.ts +5 -0
  78. package/src/components/core/useWaveformChartController.ts +94 -3
  79. package/src/components/core/useWaveformChartLifecycle.ts +11 -111
  80. package/src/components/core/useWaveformData.ts +4 -0
  81. package/src/components/core/useWaveformLayout.ts +25 -5
  82. package/src/components/core/useWaveformMeasurements.ts +63 -0
  83. package/src/components/core/useWaveformRenderSampling.ts +80 -59
  84. package/src/components/core/useWaveformViewportRestore.ts +105 -0
  85. package/src/components/core/useWaveformYAxisLayout.ts +3 -2
  86. package/src/components/core/waveformChartTypes.ts +5 -0
  87. package/src/components/core/waveformSamplingSession.ts +49 -0
  88. package/src/components/core/workerSamplingClient.ts +38 -6
  89. package/src/components/core/yAxisLabelStyle.ts +10 -0
  90. package/src/components/core/yAxisLayoutMetrics.ts +11 -9
  91. package/src/components/core/yAxisPadding.ts +60 -0
  92. package/src/components/core/yAxisTitleLayout.ts +11 -12
  93. package/src/components/interaction/useExtremaTickViewport.ts +43 -0
  94. package/src/components/interaction/useWaveformViewport.ts +11 -2
  95. package/src/components/rendering/WaveformTrack.css +1 -2
  96. package/src/components/rendering/WaveformTrack.vue +5 -12
  97. package/src/components/rendering/WaveformTrackAxes.vue +66 -19
  98. package/src/components/rendering/WaveformTrackBackdrop.vue +8 -3
  99. package/src/components/rendering/compactFrame.ts +31 -0
  100. package/src/components/rendering/yAxisTickVisibility.ts +156 -0
  101. package/src/core/lineBoundary.ts +24 -0
  102. package/src/core/rendering.ts +48 -25
  103. package/src/core/renderingStrategies.ts +19 -13
  104. package/src/core/waveformPointSource.ts +23 -1
  105. package/src/core/workerSampling/outputBoundaries.ts +32 -0
  106. package/src/core/workerSampling/repository.ts +26 -18
  107. package/src/core/workerSampling/repositoryDataset.ts +33 -1
  108. package/src/core/workerSampling/workerRuntime.ts +13 -3
  109. package/src/data/simulatedWaveforms.ts +67 -2
  110. package/src/data/sx2Channel.ts +315 -0
  111. package/src/demo/DemoChartHost.vue +5 -1
  112. package/src/demo/DemoGridFrameControls.vue +2 -0
  113. package/src/demo/DemoViewControls.vue +5 -2
  114. package/src/demo/DemoYAxisPaddingControls.vue +53 -0
  115. package/src/demo/embedBridge.ts +85 -0
  116. package/src/demo/types.ts +7 -0
  117. package/src/index.ts +19 -0
  118. package/src/types/chart.ts +34 -8
  119. package/src/types/controls.ts +80 -0
  120. package/src/types/index.ts +18 -0
  121. package/src/utils/formatters.ts +2 -1
  122. package/src/views/WasmSamplingDemo.vue +8 -1
@@ -2,7 +2,7 @@ import { type ComponentPublicInstance } from 'vue';
2
2
  import { getPageSize } from './grid';
3
3
  import type { WaveformHoverState } from './types';
4
4
  import type { ResolvedWaveformChartProps, ViewportSelectionState, WaveformChartEmit } from './waveformChartTypes';
5
- export declare function useWaveformChartController(props: ResolvedWaveformChartProps, emit: WaveformChartEmit): {
5
+ export declare function useWaveformChartController(inputProps: ResolvedWaveformChartProps, emit: WaveformChartEmit): {
6
6
  margin: {
7
7
  top: number;
8
8
  right: number;
@@ -209,6 +209,24 @@ export declare function useWaveformChartController(props: ResolvedWaveformChartP
209
209
  setSvgElement: (element: Element | ComponentPublicInstance | null) => void;
210
210
  setTitleMeasureElement: (element: Element | ComponentPublicInstance | null) => void;
211
211
  setSharedOverlayElement: (element: Element | ComponentPublicInstance | null) => void;
212
+ exportImage: (options?: import("../..").WaveformImageExportOptions) => Promise<Blob>;
213
+ controlState: import("../..").WaveformControlState;
214
+ getControlState: () => import("../..").WaveformControlState;
215
+ execute: (action: import("../..").WaveformControlAction, target?: import("../..").WaveformControlTarget, domain?: [number, number], source?: "toolbar" | "api") => import("../..").WaveformControlResult;
216
+ clearBoundaries: (index?: number) => void;
217
+ restoreInitialBoundaries: () => void;
218
+ resetViewport: {
219
+ (index?: number): void;
220
+ (target: import("../..").WaveformControlTarget): import("../..").WaveformControlResult;
221
+ };
222
+ setViewportDomain: {
223
+ (domain: [number, number], index?: number): void;
224
+ (domain: [number, number], target: import("../..").WaveformControlTarget): import("../..").WaveformControlResult;
225
+ };
226
+ zoomIn: (target?: import("../..").WaveformControlTarget) => import("../..").WaveformControlResult;
227
+ zoomOut: (target?: import("../..").WaveformControlTarget) => import("../..").WaveformControlResult;
228
+ fitToData: (target?: import("../..").WaveformControlTarget) => import("../..").WaveformControlResult;
229
+ setInteractionMode: (value: import("..").WaveformInteractionMode) => import("../..").WaveformControlResult;
212
230
  cancelPendingHover: () => void;
213
231
  clearHover: () => void;
214
232
  handlePointerLeave: () => void;
@@ -227,8 +245,6 @@ export declare function useWaveformChartController(props: ResolvedWaveformChartP
227
245
  updateViewportDrag: (event: PointerEvent) => void;
228
246
  finishViewportDrag: (event: PointerEvent) => void;
229
247
  cancelViewportDrag: (event?: PointerEvent) => void;
230
- resetViewport: (trackIndex?: number) => void;
231
- setViewportDomain: (domain: [number, number], trackIndex?: number) => void;
232
248
  requestViewportReset: (event: MouseEvent) => void;
233
249
  toggleSeriesVisibility: (seriesId: string) => void;
234
250
  changeDraftSeries: (seriesId: string) => void;
@@ -238,7 +254,6 @@ export declare function useWaveformChartController(props: ResolvedWaveformChartP
238
254
  resolveTrackAtPointer: (pointerX: number, pointerY: number, trackIndex?: number) => import("./types").TrackLayout | undefined;
239
255
  handleAnnotationClick: (event: MouseEvent, trackIndex?: number) => void;
240
256
  handleNativeContextMenu: (event: MouseEvent) => void;
241
- handleAnnotationContextMenu: (event: MouseEvent, trackIndex?: number) => void;
242
257
  handleExistingAnnotationContextMenu: (annotationId: string, event: MouseEvent) => void;
243
258
  handleAnnotationMove: (annotationId: string, offsetX: number, offsetY: number) => void;
244
259
  editContextAnnotation: () => void;
@@ -262,6 +277,8 @@ export declare function useWaveformChartController(props: ResolvedWaveformChartP
262
277
  activeInteractionMode: import("..").WaveformInteractionMode | undefined;
263
278
  isZoomMode: boolean;
264
279
  initialXDomain: [number, number];
280
+ originalXDomain: [number, number];
281
+ resolveOriginalTrackDomain: (track: import("./types").TrackLayout) => [number, number];
265
282
  sharedZoomDomain: [number, number];
266
283
  resolveInitialTrackDomain: (track: import("./types").TrackLayout) => [number, number];
267
284
  gridCells: {
@@ -284,7 +301,7 @@ export declare function useWaveformChartController(props: ResolvedWaveformChartP
284
301
  annotationTrackLayouts: import("../annotation").AnnotationTrackLayout[];
285
302
  renderedAnnotations: import("../annotation").RenderedAnnotation[];
286
303
  editorSeries: import("../annotation").AnnotationSeriesInfo | undefined;
287
- resolveFrameNumber: (trackId: string) => string | number | undefined;
304
+ resolveFrameNumber: (trackId: string, slotIndex?: number) => string | number | undefined;
288
305
  plotCenterX: number;
289
306
  titleAreaStyle: import("vue").CSSProperties;
290
307
  paginationVisible: boolean;
@@ -329,10 +346,11 @@ export declare function useWaveformChartController(props: ResolvedWaveformChartP
329
346
  innerHeight: number;
330
347
  titleVisualStyle: import("vue").CSSProperties;
331
348
  titleTextStyle: import("vue").CSSProperties;
349
+ toolbar?: (boolean | import("../..").WaveformToolbarOptions) | undefined;
332
350
  data: import("..").WaveformData;
333
351
  displayMode: "independent" | "separated" | "compact";
334
352
  overlayMode: "single-axis" | "multi-axis";
335
- unitDisplayMode: "axis" | "legend-single-series" | "channel-label-or-legend";
353
+ unitDisplayMode: "axis" | "legend-single-series" | "channel-label" | "channel-label-or-legend";
336
354
  layoutPreset: "default" | "edge-compact";
337
355
  width?: number | undefined;
338
356
  height?: number | undefined;
@@ -4,7 +4,8 @@ import type { AnnotationSeriesCandidate, useWaveformAnnotationInteraction } from
4
4
  import type { NormalizedWaveformGridOptions } from './grid';
5
5
  import type { DisplaySeries, DisplayTrack, TrackLayout } from './types';
6
6
  import type { ResolvedWaveformChartProps, WaveformChartEmit } from './waveformChartTypes';
7
- interface LifecycleContext {
7
+ export interface LifecycleContext {
8
+ preserveFullViewport?: () => boolean;
8
9
  props: ResolvedWaveformChartProps;
9
10
  emit: WaveformChartEmit;
10
11
  container: Ref<HTMLDivElement | undefined>;
@@ -53,4 +54,3 @@ export declare function useWaveformChartLifecycle(context: LifecycleContext): {
53
54
  handleBeforeDataReferenceChange: () => void;
54
55
  handleDataReferenceChange: () => void;
55
56
  };
56
- export {};
@@ -13,6 +13,8 @@ export interface PreparedWaveformSeries {
13
13
  points: WaveformPoint[];
14
14
  source: WaveformPointSource;
15
15
  xDomain: [number, number];
16
+ rawYMaximum?: number;
17
+ rawYMinimum?: number;
16
18
  yDomain: [number, number];
17
19
  hasErrorPoints: boolean;
18
20
  }
@@ -6,6 +6,7 @@ import type { PreparedWaveformSeries } from './useWaveformData';
6
6
  import type { ResolvedWaveformChartProps } from './waveformChartTypes';
7
7
  import type { useWaveformAnnotationInteraction } from '../annotation';
8
8
  interface LayoutContext {
9
+ boundaries?: ShallowRef<Record<string, [number, number]>>;
9
10
  props: ResolvedWaveformChartProps;
10
11
  preparedSeries: ShallowRef<PreparedWaveformSeries[]>;
11
12
  currentPage: Ref<number>;
@@ -39,6 +40,8 @@ export declare function useWaveformLayout(context: LayoutContext): {
39
40
  activeInteractionMode: ComputedRef<import("..").WaveformInteractionMode | undefined>;
40
41
  isZoomMode: ComputedRef<boolean>;
41
42
  initialXDomain: ComputedRef<[number, number]>;
43
+ originalXDomain: ComputedRef<[number, number]>;
44
+ resolveOriginalTrackDomain: (track: TrackLayout) => [number, number];
42
45
  sharedZoomDomain: ComputedRef<[number, number]>;
43
46
  resolveInitialTrackDomain: (track: TrackLayout) => [number, number];
44
47
  gridCells: ComputedRef<{
@@ -61,6 +64,6 @@ export declare function useWaveformLayout(context: LayoutContext): {
61
64
  annotationTrackLayouts: ComputedRef<AnnotationTrackLayout[]>;
62
65
  renderedAnnotations: ComputedRef<import("../annotation").RenderedAnnotation[]>;
63
66
  editorSeries: ComputedRef<AnnotationSeriesInfo | undefined>;
64
- resolveFrameNumber: (trackId: string) => string | number | undefined;
67
+ resolveFrameNumber: (trackId: string, slotIndex?: number) => string | number | undefined;
65
68
  };
66
69
  export {};
@@ -0,0 +1,2 @@
1
+ import type { LifecycleContext } from './useWaveformChartLifecycle';
2
+ export declare function useWaveformMeasurements(context: Pick<LifecycleContext, 'container' | 'titleMeasureElement' | 'resizeObserver' | 'observedWidth' | 'observedHeight' | 'measuredTitleWidth' | 'measuredTitleHeight' | 'resolvedTitleText' | 'titleAreaReserved' | 'titleMeasureStyle'>): void;
@@ -15,5 +15,6 @@ interface SamplingContext {
15
15
  }
16
16
  export declare function useWaveformRenderSampling(context: SamplingContext): {
17
17
  linePointOverrides: ShallowRef<Record<string, WaveformPoint[]>>;
18
+ ready: () => boolean;
18
19
  };
19
20
  export {};
@@ -0,0 +1,5 @@
1
+ import type { LifecycleContext } from './useWaveformChartLifecycle';
2
+ export declare function useWaveformViewportRestore(context: Pick<LifecycleContext, 'preserveFullViewport' | 'props' | 'trackLayouts' | 'resolveInitialTrackDomain' | 'sharedZoomDomain' | 'initialXDomain' | 'independentTransforms' | 'chartTracks' | 'clearHover' | 'editorSeriesOptions' | 'sharedTransform' | 'innerWidth' | 'configureZoom'>): {
3
+ handleBeforeDataReferenceChange: () => void;
4
+ handleDataReferenceChange: () => void;
5
+ };
@@ -1,6 +1,8 @@
1
+ import type { WaveformToolbarOptions, WaveformControlState } from '../../types/controls';
1
2
  import type { WaveformAnnotation, WaveformAxesOptions, WaveformData, WaveformDisplayMode, WaveformUnitDisplayMode, WaveformLayoutPreset, WaveformFrameStyle, WaveformInteractionMode, WaveformLegendOptions, WaveformOverlayMode, WaveformPlotMargin, WaveformPoint, WaveformRenderingOptions, WaveformSamplingBackend, WaveformSamplingDiagnostics, WaveformSamplingError, WaveformTitleOptions, WaveformXDomainStrategy, WaveformZeroLineOptions, WaveformZoomIntentPayload, WaveformZoomEndPayload, WaveformPanEndPayload, WaveformZoomResetPayload } from '../data/types';
2
3
  import type { WaveformGridOptions } from './grid';
3
4
  export interface WaveformChartProps {
5
+ toolbar?: boolean | WaveformToolbarOptions;
4
6
  data: WaveformData;
5
7
  displayMode?: WaveformDisplayMode;
6
8
  overlayMode?: WaveformOverlayMode;
@@ -51,6 +53,9 @@ export interface WaveformChartProps {
51
53
  type DefaultedProp = 'displayMode' | 'overlayMode' | 'unitDisplayMode' | 'layoutPreset' | 'yLabel' | 'lineColor' | 'showTooltip' | 'zoomable' | 'integerZoom' | 'pannable' | 'minVisiblePoints' | 'xDomainStrategy' | 'timeUnit' | 'annotations' | 'annotationsVisible' | 'grid' | 'rendering' | 'plotMargin' | 'legend' | 'defaultHiddenSeriesIds' | 'cleanView' | 'presentationMode' | 'zeroLine';
52
54
  export type ResolvedWaveformChartProps = Readonly<WaveformChartProps & Required<Pick<WaveformChartProps, DefaultedProp>>>;
53
55
  export interface WaveformChartEmit {
56
+ (event: 'update:interactionMode', mode: WaveformInteractionMode): void;
57
+ (event: 'interaction-mode-change', mode: WaveformInteractionMode): void;
58
+ (event: 'control-state-change', state: WaveformControlState): void;
54
59
  (event: 'point-hover', point: WaveformPoint | null): void;
55
60
  (event: 'zoom-intent', payload: WaveformZoomIntentPayload): void;
56
61
  (event: 'zoom-change', domain: [number, number]): void;
@@ -0,0 +1,24 @@
1
+ import { type WorkerSamplingClient } from './workerSamplingClient';
2
+ /** Owns resources for one immutable data reference. Invalidation cancels old work before reuse. */
3
+ export declare function createWaveformSamplingSession(): {
4
+ scheduler: {
5
+ schedule(run: (generation: number) => Promise<void>): number;
6
+ isCurrent(candidate: number): boolean;
7
+ cancelPending(): void;
8
+ dispose(): void;
9
+ metrics: import("./latestTaskScheduler").LatestTaskSchedulerMetrics;
10
+ };
11
+ revisions: Map<string, number>;
12
+ backendBySeries: Map<string, import("../..").WaveformSamplingBackend>;
13
+ selectedModeBySeries: Map<string, "raw" | "sampled">;
14
+ emittedErrors: Set<string>;
15
+ pendingDiagnostics: Map<string, import("../..").WaveformSamplingDiagnostics>;
16
+ client: WorkerSamplingClient | undefined;
17
+ requestId: number;
18
+ diagnosticsTimer: ReturnType<typeof setTimeout> | undefined;
19
+ autoModeSettleTimer: ReturnType<typeof setTimeout> | undefined;
20
+ hasInitialSamplingRun: boolean;
21
+ getClient(): WorkerSamplingClient;
22
+ invalidate(): void;
23
+ dispose(): void;
24
+ };
@@ -0,0 +1,3 @@
1
+ import type { WaveformYAxisLabelTextStyle } from '../../types';
2
+ export declare function resolveYAxisLabelFontSize(style?: WaveformYAxisLabelTextStyle): number;
3
+ export declare function resolveYAxisLabelBandWidth(style?: WaveformYAxisLabelTextStyle): number;
@@ -1,10 +1,11 @@
1
1
  import type { WaveformOverlayMode } from '../data/types';
2
2
  import type { DisplayTrack } from './types';
3
3
  import type { WaveformYDomain } from './yDomain';
4
+ import type { YAxisPaddingOptions } from './yAxisPadding';
4
5
  export interface YAxisLayoutMetrics {
5
6
  tickClearance: number;
6
7
  fullClearance: number;
7
8
  labelCenterX: number;
8
9
  }
9
10
  export declare function resolveViewportYDomains(displayMode: 'independent' | 'separated' | 'compact', chartTracks: DisplayTrack[], sharedYDomains: Record<string, [number, number]>, independentYDomains: Record<number, [number, number]>): Record<string, [number, number]>;
10
- export declare function resolveYAxisLayoutMetrics(chartTracks: DisplayTrack[], overlayMode: WaveformOverlayMode, yDomain: WaveformYDomain | undefined, yDomains: Record<string, WaveformYDomain> | undefined, viewportYDomains: Record<string, [number, number]>, nice: boolean, tickCount: number, compact: boolean, upperPaddingRatio?: number, showUnits?: boolean, measureTextWidth?: (text: string) => number): YAxisLayoutMetrics;
11
+ export declare function resolveYAxisLayoutMetrics(chartTracks: DisplayTrack[], overlayMode: WaveformOverlayMode, yDomain: WaveformYDomain | undefined, yDomains: Record<string, WaveformYDomain> | undefined, viewportYDomains: Record<string, [number, number]>, nice: boolean, tickCount: number, compact: boolean, padding?: YAxisPaddingOptions | number, showUnits?: boolean, measureTextWidth?: (text: string) => number): YAxisLayoutMetrics;
@@ -0,0 +1,7 @@
1
+ import type { WaveformAxesOptions } from '../../types';
2
+ import type { YAxisSeriesGroup } from './layout';
3
+ export type YAxisPaddingOptions = WaveformAxesOptions['y'];
4
+ export declare function paddingRatio(enabled?: boolean, ratio?: number): number;
5
+ export declare function applyYAxisPadding(group: YAxisSeriesGroup, viewport: [number, number] | undefined, options: YAxisPaddingOptions | number): YAxisSeriesGroup;
6
+ export declare function withMaximumTick(values: number[], maximum?: number, minimum?: number): number[];
7
+ export declare function sameTick(a: number, b: number): boolean;
@@ -1,5 +1,7 @@
1
1
  import type { TrackLayout } from './types';
2
+ import type { WaveformYAxisLabelTextStyle } from '../../types';
2
3
  interface TitleLayoutOptions {
4
+ labelTextStyle?: WaveformYAxisLabelTextStyle;
3
5
  showUnits?: boolean;
4
6
  compact?: boolean;
5
7
  measureTextWidth?: (text: string) => number;
@@ -0,0 +1,5 @@
1
+ import { type ComputedRef, type ShallowRef } from 'vue';
2
+ import type { ZoomTransform } from 'd3';
3
+ import type { TrackLayout } from '../core/types';
4
+ /** Keep X coordinates stable when toggling extrema changes the reserved Y-label width. */
5
+ export declare function useExtremaTickViewport(visible: () => boolean, innerWidth: ComputedRef<number>, tracks: ComputedRef<TrackLayout[]>, sharedTransform: ShallowRef<ZoomTransform>, independentTransforms: ShallowRef<ZoomTransform[]>): void;
@@ -5,6 +5,7 @@ import type { ResolvedWaveformChartProps, ViewportSelectionState } from '../core
5
5
  import type { WaveformChartEmit } from '../core/waveformChartTypes';
6
6
  import type { AnnotationSeriesCandidate } from '../annotation';
7
7
  export interface ViewportContext {
8
+ clearBoundaries?: (trackIndex?: number) => void;
8
9
  props: ResolvedWaveformChartProps;
9
10
  emit: WaveformChartEmit;
10
11
  selection: Ref<ViewportSelectionState | null>;
@@ -16,9 +16,9 @@ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {},
16
16
  }, string, import("vue").PublicProps, Readonly<Props> & Readonly<{
17
17
  onToggle?: ((seriesId: string) => any) | undefined;
18
18
  }>, {
19
- interactive: boolean;
20
- showUnits: boolean;
21
19
  hiddenSeriesIds: string[];
20
+ showUnits: boolean;
21
+ interactive: boolean;
22
22
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
23
23
  declare const _default: typeof __VLS_export;
24
24
  export default _default;
@@ -11,15 +11,14 @@ interface Props {
11
11
  interactionMode?: WaveformInteractionMode;
12
12
  frameNumber?: string | number;
13
13
  frameStyle?: WaveformFrameStyle;
14
+ framePath?: string;
14
15
  axes?: WaveformAxesOptions;
15
16
  timeUnit: 's' | 'ms';
16
17
  yLabel?: string;
17
18
  showAxisUnits?: boolean;
18
19
  showLabelUnits?: boolean;
19
20
  hideYAxisTitles?: boolean;
20
- containYAxisEndpoints?: boolean;
21
21
  containFrameStroke?: boolean;
22
- omitFrameTop?: boolean;
23
22
  cleanView?: boolean;
24
23
  zeroLine?: Required<WaveformZeroLineOptions>;
25
24
  }
@@ -40,10 +39,10 @@ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {},
40
39
  "onPointer-cancel"?: ((pointerEvent: PointerEvent) => any) | undefined;
41
40
  "onPointer-leave"?: (() => any) | undefined;
42
41
  }>, {
43
- interactive: boolean;
44
42
  cleanView: boolean;
45
43
  zeroLine: Required<WaveformZeroLineOptions>;
46
44
  interactionMode: WaveformInteractionMode;
45
+ interactive: boolean;
47
46
  showAxisUnits: boolean;
48
47
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
49
48
  declare const _default: typeof __VLS_export;
@@ -10,7 +10,7 @@ interface Props {
10
10
  showUnits?: boolean;
11
11
  showLabelUnits?: boolean;
12
12
  hideYAxisTitles?: boolean;
13
- containYAxisEndpoints?: boolean;
13
+ hideOverlappingMaximumLabel?: boolean;
14
14
  }
15
15
  declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
16
16
  showUnits: boolean;
@@ -4,6 +4,7 @@ interface Props {
4
4
  clipPathId: string;
5
5
  innerWidth: number;
6
6
  cleanView: boolean;
7
+ showEmptyFrame?: boolean;
7
8
  frameNumber?: string | number;
8
9
  frameStyle: {
9
10
  backgroundColor: string;
@@ -0,0 +1,5 @@
1
+ import type { TrackLayout } from '../core/types';
2
+ type Frame = Pick<TrackLayout, 'left' | 'top' | 'width' | 'height' | 'isEmpty'>;
3
+ /** Keep the lower frame's top edge as the single owner of a shared boundary. */
4
+ export declare function compactFramePath(track: Frame, tracks: Frame[], inset?: number): string | undefined;
5
+ export {};
@@ -0,0 +1,11 @@
1
+ interface Box {
2
+ left: number;
3
+ right: number;
4
+ top: number;
5
+ bottom: number;
6
+ }
7
+ export declare function labelsOverlap(a: Box, b: Box): boolean;
8
+ export declare function linesOverlap(a: number, b: number, widthA?: number, widthB?: number): boolean;
9
+ /** Apply after axes and grid are in the DOM; never feed the filtered set back into layout. */
10
+ export declare function updateMaximumTickVisibility(svg: SVGSVGElement): void;
11
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { WaveformPointRange } from './waveformPointSource';
2
+ /** Outside neighbors join the curve without changing visible-point statistics. */
3
+ export declare function lineBoundaryIndexes(range: WaveformPointRange, length: number): number[];
4
+ export declare function withLineBoundaries<T>(points: T[], range: WaveformPointRange, length: number, pointAt: (index: number) => T): T[];
@@ -1,9 +1,11 @@
1
+ import { type WaveformPointSource } from './waveformPointSource';
1
2
  import type { WaveformPoint } from '../types';
2
3
  import type { ResolvedWaveformRenderingOptions } from './renderingOptions';
3
4
  import { type VisiblePointRange } from './renderingStrategies';
4
5
  export { DEFAULT_WAVEFORM_RENDERING_OPTIONS, resolveWaveformRenderingOptions, type ResolvedWaveformRenderingOptions, type ResolvedWaveformSamplingOptions, } from './renderingOptions';
5
6
  interface PointSeriesSource {
6
7
  points: WaveformPoint[];
8
+ source?: WaveformPointSource;
7
9
  }
8
10
  interface SeriesRenderSelectionOptions {
9
11
  lineVisible: boolean;
@@ -27,4 +29,6 @@ export declare function hasMinimumVisibleXValues(seriesList: readonly PointSerie
27
29
  export declare function selectRenderablePoints(points: WaveformPoint[], domain: [number, number], width: number, options: ResolvedWaveformRenderingOptions): WaveformPoint[];
28
30
  /** Selects real source points for discrete decorations without using line-extrema sampling. */
29
31
  export declare function selectDecorationPoints(points: WaveformPoint[], domain: [number, number], width: number, minSpacing: number, downsample: boolean, predicate?: (point: WaveformPoint) => boolean, priorityPredicate?: (point: WaveformPoint) => boolean): WaveformPoint[];
32
+ export declare function selectSeriesRenderSourcePoints(points: WaveformPointSource, domain: [number, number], width: number, rendering: ResolvedWaveformRenderingOptions, selection: SeriesRenderSelectionOptions): SeriesRenderPointSelection;
33
+ /** Public array adapter; internal layout passes its normalized source directly. */
30
34
  export declare function selectSeriesRenderPoints(points: WaveformPoint[], domain: [number, number], width: number, rendering: ResolvedWaveformRenderingOptions, selection: SeriesRenderSelectionOptions): SeriesRenderPointSelection;
@@ -1,3 +1,4 @@
1
+ import { type WaveformPointSource } from './waveformPointSource';
1
2
  import type { WaveformPoint } from '../types';
2
3
  import type { ResolvedWaveformRenderingOptions } from './renderingOptions';
3
4
  export interface VisiblePointRange {
@@ -5,6 +6,7 @@ export interface VisiblePointRange {
5
6
  end: number;
6
7
  }
7
8
  export interface RenderablePointSelectionContext {
9
+ source?: WaveformPointSource;
8
10
  points: WaveformPoint[];
9
11
  range: VisiblePointRange;
10
12
  domain: [number, number];
@@ -0,0 +1,4 @@
1
+ import type { WaveformPointRange } from '../waveformPointSource';
2
+ import type { WorkerSamplingOutput } from './protocol';
3
+ import { type StoredDataset } from './repositoryDataset';
4
+ export declare function addOutputBoundaries(output: WorkerSamplingOutput, range: WaveformPointRange, dataset: StoredDataset): WorkerSamplingOutput;
@@ -1,2 +1,2 @@
1
1
  import type { WaveformData } from '../types';
2
- export declare function createSimulatedWaveformData(): WaveformData;
2
+ export declare function createSimulatedWaveformData(trackCount?: number): WaveformData;
@@ -0,0 +1,10 @@
1
+ export declare const sx2Channel: {
2
+ chnl: string;
3
+ chnl_id: number;
4
+ dat_unit: string;
5
+ dev: number;
6
+ shot: number;
7
+ time_unit: string;
8
+ data: number[];
9
+ time: number[];
10
+ };
@@ -0,0 +1,11 @@
1
+ import type { DemoControlPanelModel } from './types';
2
+ type __VLS_ModelProps = {
3
+ 'model': DemoControlPanelModel;
4
+ };
5
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
+ "update:model": (value: DemoControlPanelModel) => any;
7
+ }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
8
+ "onUpdate:model"?: ((value: DemoControlPanelModel) => any) | undefined;
9
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
10
+ declare const _default: typeof __VLS_export;
11
+ export default _default;
@@ -5,6 +5,7 @@ interface SelectOption<T> {
5
5
  value: T;
6
6
  }
7
7
  export interface DemoControlPanelModel {
8
+ toolbarVisible: boolean;
8
9
  controlsOpen: boolean;
9
10
  displayMode: WaveformDisplayMode;
10
11
  overlayMode: WaveformOverlayMode;
@@ -32,6 +33,11 @@ export interface DemoControlPanelModel {
32
33
  verticalGridColor: string;
33
34
  xAxisLineVisible: boolean;
34
35
  yAxisLineVisible: boolean;
36
+ upperPaddingEnabled: boolean;
37
+ lowerPaddingEnabled: boolean;
38
+ extremaTicksVisible: boolean;
39
+ upperPaddingPercent: number;
40
+ lowerPaddingPercent: number;
35
41
  xAxisLabelFormatterEnabled: boolean;
36
42
  xAxisLabelFormat: DemoXAxisLabelFormat;
37
43
  xAxisLabelFormatOptions: Array<SelectOption<DemoXAxisLabelFormat>>;
@@ -68,6 +74,7 @@ export interface DemoControlPanelModel {
68
74
  resetWaveformViewport: () => void;
69
75
  }
70
76
  export interface DemoChartModel {
77
+ toolbarVisible: boolean;
71
78
  data: WaveformData;
72
79
  initialXDomain?: [number, number];
73
80
  displayMode: WaveformDisplayMode;
@@ -4,9 +4,10 @@
4
4
  */
5
5
  export { default as WaveformChart } from './components/WaveformChart.vue';
6
6
  export type { WaveformChartProps } from './components/core/waveformChartTypes';
7
- export type { WaveformPoint, WaveformDisplayMode, WaveformUnitDisplayMode, WaveformLayoutPreset, WaveformOverlayMode, WaveformInteractionMode, WaveformXDomainStrategy, WaveformZoomIntentPayload, WaveformZoomEndPayload, WaveformPanEndPayload, WaveformZoomResetPayload, WaveformAnnotationStyle, WaveformAnnotation, WaveformSamplingMode, WaveformSamplingStrategy, WaveformSamplingOptions, WaveformSamplingBackend, WaveformSamplingDiagnostics, WaveformSamplingError, WaveformRenderingOptions, WaveformPlotMargin, WaveformTitleTextStyle, WaveformTitleOptions, WaveformLegendPosition, WaveformLegendOrientation, WaveformLegendOptions, WaveformFrameStyle, WaveformXAxisLabelKind, WaveformXAxisLabelFormatterContext, WaveformXAxisLabelFormatter, WaveformAxesOptions, WaveformZeroLineOptions, SingleWaveformData, WaveformLineType, WaveformLineStyle, WaveformPointType, WaveformErrorBarOptions, ResolvedWaveformErrorBarOptions, WaveformTypedValues, TypedSampleData, TypedPointData, WaveformSeries, WaveformData, NormalizedWaveformSeries, } from './types';
7
+ export type { WaveformPoint, WaveformDisplayMode, WaveformUnitDisplayMode, WaveformLayoutPreset, WaveformOverlayMode, WaveformInteractionMode, WaveformXDomainStrategy, WaveformZoomIntentPayload, WaveformZoomEndPayload, WaveformPanEndPayload, WaveformZoomResetPayload, WaveformAnnotationStyle, WaveformAnnotation, WaveformSamplingMode, WaveformSamplingStrategy, WaveformSamplingOptions, WaveformSamplingBackend, WaveformSamplingDiagnostics, WaveformSamplingError, WaveformRenderingOptions, WaveformPlotMargin, WaveformTitleTextStyle, WaveformTitleOptions, WaveformLegendPosition, WaveformLegendOrientation, WaveformLegendOptions, WaveformFrameStyle, WaveformXAxisLabelKind, WaveformXAxisLabelFormatterContext, WaveformXAxisLabelFormatter, WaveformAxesOptions, WaveformYAxisLabelTextStyle, WaveformZeroLineOptions, SingleWaveformData, WaveformLineType, WaveformLineStyle, WaveformPointType, WaveformErrorBarOptions, ResolvedWaveformErrorBarOptions, WaveformTypedValues, TypedSampleData, TypedPointData, WaveformSeries, WaveformData, NormalizedWaveformSeries, } from './types';
8
8
  export type { WaveformGridOptions, WaveformGridLineOptions, WaveformGridTrackLines, } from './components/core/grid';
9
9
  export { normalizeWaveformData, normalizeWaveformSeries } from './core';
10
10
  export { paddedDomain, buildMinorTicks, displayTime, formatEndpointTime, formatAxisTime, formatTooltipTime, resolveTrackGeometry, clamp, type TimeUnit, type TrackGeometry, } from './utils';
11
11
  export { calculateWasmRange, findWasmVisibleRange, DEFAULT_WAVEFORM_RENDERING_OPTIONS, resolveWaveformRenderingOptions, selectRenderablePoints, type ResolvedWaveformRenderingOptions, type ResolvedWaveformSamplingOptions, type WasmRangeMetrics, initializeWasmSampling, sampleWaveformWasm, type WasmSamplingRequest, type WasmSamplingResult, type WasmSamplingStrategy, } from './core';
12
12
  export { parseWaveformAnnotations, serializeWaveformAnnotations } from './components/annotation';
13
+ export type { WaveformToolbarItem, WaveformToolbarOptions, WaveformControlTarget, WaveformControlAction, WaveformCommandMetadata, WaveformTargetStatus, WaveformViewportSnapshot, WaveformTargetResult, WaveformControlResult, WaveformControlState, WaveformImageExportOptions, WaveformImageExportErrorCode, WaveformImageExportError, WaveformChartHandle, } from './types/controls';
@@ -1,3 +1,4 @@
1
+ import type { WaveformCommandMetadata } from './controls';
1
2
  /**
2
3
  * 波形数据点
3
4
  */
@@ -15,6 +16,8 @@ export interface WaveformPoint {
15
16
  export type WaveformLayoutPreset = 'default' | 'edge-compact';
16
17
  /** Controls unit placement without changing series metadata. */
17
18
  export type WaveformUnitDisplayMode = 'axis' | 'legend-single-series'
19
+ /** Append units to Y-axis names while retaining names on multi-series pages. */
20
+ | 'channel-label'
18
21
  /** Label and legend units; hide all channel titles on pages containing a multi-series track. */
19
22
  | 'channel-label-or-legend';
20
23
  /**
@@ -27,7 +30,7 @@ export type WaveformDisplayMode = 'independent' | 'separated' | 'compact';
27
30
  /** Controls whether overlaid series share one Y axis or use up to four value axes. */
28
31
  export type WaveformOverlayMode = 'single-axis' | 'multi-axis';
29
32
  /** 标注工具模式 */
30
- export type WaveformInteractionMode = 'zoom' | 'annotation';
33
+ export type WaveformInteractionMode = 'zoom' | 'annotation' | 'pan' | 'none';
31
34
  /** Controls how the initial X viewport is derived when no explicit domain is configured. */
32
35
  export interface WaveformXDomainStrategy {
33
36
  /** integer-ms rounds initial bounds outward to range-appropriate multiples of 10 ms. */
@@ -40,7 +43,7 @@ export interface WaveformXDomainStrategy {
40
43
  includeExplicit?: boolean;
41
44
  }
42
45
  /** Describes the X-axis viewport after a zoom gesture completes. */
43
- export interface WaveformZoomEndPayload {
46
+ export interface WaveformZoomEndPayload extends WaveformCommandMetadata {
44
47
  start: number;
45
48
  end: number;
46
49
  yStart?: number;
@@ -48,7 +51,7 @@ export interface WaveformZoomEndPayload {
48
51
  yRanges?: Record<string, [number, number]>;
49
52
  trackIndex?: number;
50
53
  seriesIds?: string[];
51
- gesture?: 'wheel' | 'box';
54
+ gesture?: 'wheel' | 'box' | 'command';
52
55
  }
53
56
  /** Final horizontal viewport after a pan; endpoints are always seconds. */
54
57
  export interface WaveformPanEndPayload {
@@ -58,15 +61,15 @@ export interface WaveformPanEndPayload {
58
61
  seriesIds?: string[];
59
62
  }
60
63
  /** Describes the X-axis viewport targeted by a user zoom gesture before rendering settles. */
61
- export interface WaveformZoomIntentPayload {
64
+ export interface WaveformZoomIntentPayload extends WaveformCommandMetadata {
62
65
  start: number;
63
66
  end: number;
64
- gesture: 'wheel' | 'box';
67
+ gesture: 'wheel' | 'box' | 'command';
65
68
  trackIndex?: number;
66
69
  seriesIds?: string[];
67
70
  }
68
71
  /** Identifies the viewport reset by a double-click gesture. */
69
- export interface WaveformZoomResetPayload {
72
+ export interface WaveformZoomResetPayload extends WaveformCommandMetadata {
70
73
  trackIndex?: number;
71
74
  seriesIds?: string[];
72
75
  }
@@ -221,7 +224,18 @@ export interface WaveformXAxisLabelFormatterContext {
221
224
  displayDomain: [number, number];
222
225
  }
223
226
  export type WaveformXAxisLabelFormatter = (value: number, context: WaveformXAxisLabelFormatterContext) => string;
224
- /** Controls axis baseline visibility while preserving tick marks and axis text. */
227
+ /** Styling for Y-axis series names, separate from numeric tick labels. */
228
+ export interface WaveformYAxisLabelTextStyle {
229
+ /** Positive font size in pixels. Defaults to 12. */
230
+ fontSize?: number;
231
+ /** CSS font weight; use 'normal' or 400 to disable bold. Defaults to 600. */
232
+ fontWeight?: number | string;
233
+ fontFamily?: string;
234
+ fontStyle?: 'normal' | 'italic';
235
+ /** CSS color. Defaults to the corresponding series color. */
236
+ color?: string;
237
+ }
238
+ /** Controls axis baselines, labels, and Y-axis range calculation. */
225
239
  export interface WaveformAxesOptions {
226
240
  x?: {
227
241
  lineVisible?: boolean;
@@ -230,12 +244,22 @@ export interface WaveformAxesOptions {
230
244
  };
231
245
  y?: {
232
246
  lineVisible?: boolean;
247
+ /** Styles series names on both left and right Y axes, without changing tick labels. */
248
+ labelTextStyle?: WaveformYAxisLabelTextStyle;
233
249
  /** Target total number of equal Y-axis ticks, including endpoints. Defaults to 5. */
234
250
  splitNumber?: number;
235
251
  /** Expands Y-axis domains to equal, human-friendly intervals. Defaults to true. */
236
252
  nice?: boolean;
237
- /** Adds this fraction of the automatic Y span above its maximum. Defaults to 0. */
253
+ /** Shows extra ticks for the full data extrema, independently of padding. Defaults to true. */
254
+ extremaTicksVisible?: boolean;
255
+ /** Fraction of the automatic Y span added above its maximum. Defaults to 0. */
238
256
  upperPaddingRatio?: number;
257
+ /** Fraction of the automatic Y span added below its minimum. Defaults to 0. */
258
+ lowerPaddingRatio?: number;
259
+ /** False disables upper padding; true defaults an omitted ratio to 0.1. */
260
+ upperPaddingEnabled?: boolean;
261
+ /** False disables lower padding; true defaults an omitted ratio to 0.1. */
262
+ lowerPaddingEnabled?: boolean;
239
263
  };
240
264
  }
241
265
  /** Styling and visibility options for the horizontal zero-value reference line. */
@@ -0,0 +1,69 @@
1
+ import type { WaveformInteractionMode } from './chart';
2
+ export type WaveformToolbarItem = 'zoom-box' | 'pan' | 'annotate' | 'zoom-in' | 'zoom-out' | 'reset' | 'fit' | 'export';
3
+ export interface WaveformToolbarOptions {
4
+ visible?: boolean;
5
+ display?: 'hover' | 'always';
6
+ position?: 'top-right' | 'top-left';
7
+ items?: WaveformToolbarItem[];
8
+ }
9
+ export interface WaveformControlTarget {
10
+ trackId?: string;
11
+ }
12
+ export type WaveformControlAction = 'zoom-in' | 'zoom-out' | 'set-domain' | 'fit' | 'reset';
13
+ export interface WaveformCommandMetadata {
14
+ commandId?: string;
15
+ source?: 'toolbar' | 'api';
16
+ action?: WaveformControlAction;
17
+ }
18
+ export type WaveformTargetStatus = 'applied' | 'unchanged' | 'disabled' | 'empty-data';
19
+ export interface WaveformViewportSnapshot {
20
+ xDomain: [number, number];
21
+ yDomains: Record<string, [number, number]>;
22
+ }
23
+ export interface WaveformTargetResult {
24
+ trackId: string;
25
+ status: WaveformTargetStatus;
26
+ before?: WaveformViewportSnapshot;
27
+ after?: WaveformViewportSnapshot;
28
+ }
29
+ export type WaveformControlResult = {
30
+ kind: 'viewport';
31
+ status: WaveformTargetStatus | 'invalid-target' | 'invalid-domain';
32
+ targets: WaveformTargetResult[];
33
+ } | {
34
+ kind: 'mode';
35
+ status: 'applied' | 'requested' | 'unchanged' | 'disabled';
36
+ targets: [];
37
+ };
38
+ export interface WaveformControlState {
39
+ mode: WaveformInteractionMode;
40
+ independent: boolean;
41
+ targets: Array<{
42
+ trackId: string;
43
+ label: string;
44
+ viewport: WaveformViewportSnapshot;
45
+ available: Record<WaveformControlAction, boolean>;
46
+ }>;
47
+ available: Record<WaveformToolbarItem, boolean>;
48
+ }
49
+ export interface WaveformImageExportOptions {
50
+ format?: 'png' | 'svg';
51
+ scale?: number;
52
+ backgroundColor?: string;
53
+ }
54
+ export type WaveformImageExportErrorCode = 'export-invalid-options' | 'export-unavailable' | 'export-busy' | 'export-cancelled' | 'export-render-failed' | 'export-stale' | 'export-timeout';
55
+ export interface WaveformImageExportError extends Error {
56
+ code: WaveformImageExportErrorCode;
57
+ }
58
+ export interface WaveformChartHandle {
59
+ zoomIn(target?: WaveformControlTarget): WaveformControlResult;
60
+ zoomOut(target?: WaveformControlTarget): WaveformControlResult;
61
+ fitToData(target?: WaveformControlTarget): WaveformControlResult;
62
+ resetViewport(trackIndex?: number): void;
63
+ resetViewport(target: WaveformControlTarget): WaveformControlResult;
64
+ setViewportDomain(domain: [number, number], trackIndex?: number): void;
65
+ setViewportDomain(domain: [number, number], target: WaveformControlTarget): WaveformControlResult;
66
+ setInteractionMode(mode: WaveformInteractionMode): WaveformControlResult;
67
+ getControlState(): WaveformControlState;
68
+ exportImage(options?: WaveformImageExportOptions): Promise<Blob>;
69
+ }