waveform-analysis 0.1.47 → 0.1.50

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 +127 -5
  2. package/dist/assets/workerRuntime-Dt94jbqq.js +1 -0
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.js +2701 -1165
  5. package/dist/style.css +1 -1
  6. package/dist/types/components/WaveformChart.vue.d.ts +14 -0
  7. package/dist/types/components/annotation/WaveformAnnotationEditor.vue.d.ts +0 -1
  8. package/dist/types/components/annotation/markup.d.ts +5 -6
  9. package/dist/types/components/annotation/types.d.ts +2 -0
  10. package/dist/types/components/core/latestTaskScheduler.d.ts +19 -0
  11. package/dist/types/components/core/layout.d.ts +2 -2
  12. package/dist/types/components/core/trackLayoutBuilder.d.ts +4 -1
  13. package/dist/types/components/core/types.d.ts +2 -0
  14. package/dist/types/components/core/useWaveformChartController.d.ts +1 -0
  15. package/dist/types/components/core/useWaveformData.d.ts +2 -0
  16. package/dist/types/components/core/useWaveformLayout.d.ts +2 -0
  17. package/dist/types/components/core/useWaveformRenderSampling.d.ts +19 -0
  18. package/dist/types/components/core/waveformChartTypes.d.ts +8 -1
  19. package/dist/types/components/core/workerSamplingClient.d.ts +8 -0
  20. package/dist/types/components/data/types.d.ts +1 -1
  21. package/dist/types/components/interaction/zoomConstraints.d.ts +2 -0
  22. package/dist/types/components/waveform.d.ts +1 -1
  23. package/dist/types/core/compactSamplePointSource.d.ts +3 -0
  24. package/dist/types/core/data.d.ts +7 -1
  25. package/dist/types/core/index.d.ts +2 -1
  26. package/dist/types/core/rendering.d.ts +3 -1
  27. package/dist/types/core/renderingOptions.d.ts +11 -1
  28. package/dist/types/core/samplingReference.d.ts +36 -0
  29. package/dist/types/core/samplingReferenceValues.d.ts +4 -0
  30. package/dist/types/core/samplingReferenceVectors.d.ts +17 -0
  31. package/dist/types/core/wasmSampling.d.ts +48 -0
  32. package/dist/types/core/waveformPointSource.d.ts +53 -0
  33. package/dist/types/core/workerSampling/index.d.ts +5 -0
  34. package/dist/types/core/workerSampling/javascriptBackend.d.ts +3 -0
  35. package/dist/types/core/workerSampling/multiresolution.d.ts +29 -0
  36. package/dist/types/core/workerSampling/protocol.d.ts +153 -0
  37. package/dist/types/core/workerSampling/repository.d.ts +36 -0
  38. package/dist/types/core/workerSampling/repositoryDataset.d.ts +29 -0
  39. package/dist/types/core/workerSampling/repositorySupport.d.ts +27 -0
  40. package/dist/types/core/workerSampling/samplingCache.d.ts +24 -0
  41. package/dist/types/core/workerSampling/workerRuntime.d.ts +1 -0
  42. package/dist/types/index.d.ts +2 -2
  43. package/dist/types/types/chart.d.ts +58 -0
  44. package/dist/types/types/data.d.ts +20 -2
  45. package/dist/types/types/index.d.ts +2 -2
  46. package/dist/types/views/WasmSamplingDemo.vue.d.ts +3 -0
  47. package/package.json +5 -4
  48. package/src/App.test.ts +11 -7
  49. package/src/App.vue +2 -2
  50. package/src/DemoRouterApp.vue +1 -0
  51. package/src/components/WaveformChart.css +2 -0
  52. package/src/components/annotation/WaveformAnnotationEditor.css +2 -2
  53. package/src/components/annotation/WaveformAnnotationEditor.vue +8 -4
  54. package/src/components/annotation/markup.ts +45 -26
  55. package/src/components/annotation/types.ts +2 -0
  56. package/src/components/annotation/useWaveformChartAnnotations.ts +12 -15
  57. package/src/components/core/latestTaskScheduler.test.ts +51 -0
  58. package/src/components/core/latestTaskScheduler.ts +75 -0
  59. package/src/components/core/layout.ts +15 -6
  60. package/src/components/core/trackLayoutBuilder.ts +8 -2
  61. package/src/components/core/types.ts +2 -0
  62. package/src/components/core/useWaveformChartController.ts +14 -0
  63. package/src/components/core/useWaveformData.test.ts +95 -0
  64. package/src/components/core/useWaveformData.ts +23 -32
  65. package/src/components/core/useWaveformLayout.ts +16 -10
  66. package/src/components/core/useWaveformRenderSampling.test.ts +17 -0
  67. package/src/components/core/useWaveformRenderSampling.ts +394 -0
  68. package/src/components/core/waveformChartTypes.ts +13 -0
  69. package/src/components/core/workerSamplingClient.ts +148 -0
  70. package/src/components/core/yAxisNice.test.ts +174 -0
  71. package/src/components/data/types.ts +9 -0
  72. package/src/components/interaction/WaveformTooltip.test.ts +1 -3
  73. package/src/components/interaction/WaveformTooltip.vue +13 -12
  74. package/src/components/interaction/useWaveformHover.ts +7 -7
  75. package/src/components/interaction/zoomConstraints.ts +5 -1
  76. package/src/components/waveform.ts +9 -0
  77. package/src/components/waveformChartCases/compactAndSharedHover.test.ts +15 -4
  78. package/src/components/waveformChartCases/dataAndHoverPerformance.test.ts +11 -6
  79. package/src/components/waveformChartCases/dataLifecycle.test.ts +1 -3
  80. package/src/components/waveformChartCases/trackOrder.test.ts +130 -0
  81. package/src/components/waveformChartCases/workerSamplingIntegration.test.ts +117 -0
  82. package/src/components/waveformChartCases/xDomainStrategy.test.ts +14 -2
  83. package/src/core/compactSamplePointSource.ts +76 -0
  84. package/src/core/data.test.ts +114 -0
  85. package/src/core/data.ts +177 -75
  86. package/src/core/index.ts +11 -0
  87. package/src/core/rendering.test.ts +87 -12
  88. package/src/core/rendering.ts +35 -1
  89. package/src/core/renderingOptions.ts +124 -15
  90. package/src/core/samplingReference.test.ts +124 -0
  91. package/src/core/samplingReference.ts +243 -0
  92. package/src/core/samplingReferenceValues.ts +169 -0
  93. package/src/core/samplingReferenceVectors.ts +46 -0
  94. package/src/core/wasmSampling.test.ts +205 -0
  95. package/src/core/wasmSampling.ts +230 -0
  96. package/src/core/waveformPointSource.ts +395 -0
  97. package/src/core/workerSampling/index.ts +30 -0
  98. package/src/core/workerSampling/javascriptBackend.ts +15 -0
  99. package/src/core/workerSampling/multiresolution.test.ts +69 -0
  100. package/src/core/workerSampling/multiresolution.ts +300 -0
  101. package/src/core/workerSampling/protocol.test.ts +34 -0
  102. package/src/core/workerSampling/protocol.ts +207 -0
  103. package/src/core/workerSampling/repository.test.ts +400 -0
  104. package/src/core/workerSampling/repository.ts +400 -0
  105. package/src/core/workerSampling/repositoryCache.test.ts +163 -0
  106. package/src/core/workerSampling/repositoryDataset.ts +194 -0
  107. package/src/core/workerSampling/repositorySupport.ts +225 -0
  108. package/src/core/workerSampling/repositoryTypedDataset.test.ts +89 -0
  109. package/src/core/workerSampling/repositoryWasmDataset.test.ts +70 -0
  110. package/src/core/workerSampling/samplingCache.ts +94 -0
  111. package/src/core/workerSampling/workerRuntime.ts +40 -0
  112. package/src/data/simulatedWaveforms.test.ts +19 -0
  113. package/src/data/simulatedWaveforms.ts +11 -8
  114. package/src/demo/xAxisLabelControls.test.ts +1 -1
  115. package/src/demoRoutes.css +177 -0
  116. package/src/index.ts +18 -0
  117. package/src/router.ts +5 -0
  118. package/src/types/chart.ts +65 -0
  119. package/src/types/data.ts +24 -1
  120. package/src/types/index.ts +9 -0
  121. package/src/views/WasmSamplingDemo.test.ts +13 -0
  122. package/src/views/WasmSamplingDemo.vue +180 -0
package/dist/style.css CHANGED
@@ -1,2 +1,2 @@
1
- .waveform-annotation-layer[data-v-7254383e]{pointer-events:none}.waveform-annotation-layer--interactive .waveform-annotation[data-v-7254383e]{pointer-events:auto;cursor:grab;touch-action:none}.waveform-annotation-layer--interactive .waveform-annotation[data-v-7254383e]:active{cursor:grabbing}.waveform-annotation__arrow[data-v-7254383e]{stroke-width:2px;stroke-linecap:round;pointer-events:none}.waveform-annotation__box[data-v-7254383e]{stroke-width:1px;rx:3}.waveform-annotation-layer--interactive .waveform-annotation__box[data-v-7254383e]{pointer-events:auto}.waveform-annotation__text[data-v-7254383e]{pointer-events:none;-webkit-user-select:none;user-select:none}.waveform-annotation-context-menu[data-v-c70c98a1]{z-index:30;background:#fff;border:1px solid #dfe5ef;border-radius:4px;min-width:112px;padding:4px;display:grid;position:absolute;box-shadow:0 4px 14px #10182829}.waveform-annotation-context-menu button[data-v-c70c98a1]{color:#344054;text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:3px;padding:7px 10px;font-size:12px}.waveform-annotation-context-menu button[data-v-c70c98a1]:hover{background:#f2f4f7}.waveform-annotation-editor-root,.waveform-annotation-editor-root *{box-sizing:border-box}.waveform-annotation-editor-root{color:#344054;text-align:left;text-transform:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;line-height:1.5715}.waveform-annotation-editor-root button,.waveform-annotation-editor-root input,.waveform-annotation-editor-root select,.waveform-annotation-editor-root textarea{letter-spacing:normal;text-transform:none;font-family:inherit}.waveform-annotation-editor-root button{appearance:auto}.waveform-annotation-editor__content[data-v-42466cf9]{color:#344054;gap:20px;font-size:13px;display:grid}.waveform-annotation-editor__coordinates[data-v-42466cf9]{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.waveform-annotation-editor__coordinates span[data-v-42466cf9],.waveform-annotation-editor__series[data-v-42466cf9]{background:#f8fafc;border:1px solid #eaecf0;border-radius:7px;align-items:center;gap:8px;min-width:0;padding:9px 10px;display:flex}.waveform-annotation-editor__coordinates span[data-v-42466cf9]{color:#667085}.waveform-annotation-editor__coordinate-input[data-v-42466cf9]{color:#667085;background:#f8fafc;border:1px solid #eaecf0;border-radius:7px;align-items:center;gap:8px;min-width:0;padding:9px 10px;display:flex}.waveform-annotation-editor__coordinate-input[data-v-42466cf9] .ant-input-number{color:#344054;width:auto;min-width:96px;font-family:SFMono-Regular,Consolas,monospace}.waveform-annotation-editor__coordinate-value[data-v-42466cf9]{display:none}.waveform-annotation-editor__coordinate-error[data-v-42466cf9]{color:#d92d20;grid-column:1/-1;margin:-12px 0 0;font-size:11px;line-height:1.4}.waveform-annotation-editor__coordinate-hint[data-v-42466cf9]{color:#98a2b3;margin:-12px 0 0;font-size:11px;line-height:1.4}.waveform-annotation-editor__coordinates b[data-v-42466cf9]{color:#1677ff;font-size:11px}.waveform-annotation-editor__coordinates code[data-v-42466cf9]{color:#344054;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:SFMono-Regular,Consolas,monospace;font-size:11px;overflow:hidden}.waveform-annotation-editor__series[data-v-42466cf9]{gap:10px}.waveform-annotation-editor__series i[data-v-42466cf9]{border:1px solid #0000001f;border-radius:2px;flex:0 0 12px;width:12px;height:12px}.waveform-annotation-editor__series-label[data-v-42466cf9]{gap:1px;min-width:0;display:grid}.waveform-annotation-editor__series select[data-v-42466cf9]{color:#344054;min-width:0;max-width:190px;font:inherit;background:#fff;border:1px solid #d0d5dd;border-radius:5px;margin-left:auto;padding:5px 7px}.waveform-annotation-editor__series small[data-v-42466cf9]{color:#667085;font-size:10px}.waveform-annotation-editor__series b[data-v-42466cf9]{color:#344054;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.waveform-annotation-editor__series code[data-v-42466cf9]{color:#667085;margin-left:auto;font-size:11px}.waveform-annotation-editor__field[data-v-42466cf9],.waveform-annotation-editor__color-field[data-v-42466cf9]{gap:4px;display:grid}.waveform-annotation-editor__label-row[data-v-42466cf9]{justify-content:space-between;align-items:center;gap:8px;display:flex}.waveform-annotation-editor__label-row b[data-v-42466cf9],.waveform-annotation-editor__colors legend[data-v-42466cf9]{color:#344054;font-size:12px;font-weight:600}.waveform-annotation-editor__label-row small[data-v-42466cf9]{color:#98a2b3;font-size:11px}.waveform-annotation-editor textarea[data-v-42466cf9]{box-sizing:border-box;color:#1d2939;width:100%;min-height:92px;font:inherit;resize:vertical;background:#fff;border:1px solid #d0d5dd;border-radius:7px;padding:10px 11px;line-height:1.5}.waveform-annotation-editor textarea[data-v-42466cf9]:focus{border-color:#1677ff;outline:3px solid #1677ff24}.waveform-annotation-editor__colors[data-v-42466cf9]{border:0;border-top:1px solid #eaecf0;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;min-width:0;margin:0;padding:14px 0 0;display:grid}.waveform-annotation-editor__colors legend[data-v-42466cf9]{grid-column:1/-1;padding:0}.waveform-annotation-editor__color-field[data-v-42466cf9]{color:#667085;text-align:left;place-items:stretch stretch;min-width:0;font-size:11px}.waveform-annotation-editor__color-field[data-v-42466cf9] .vc-color-wrap{border:1px solid #cfd5df;border-radius:6px;width:100%;height:34px;margin-right:0;box-shadow:inset 0 0 0 1px #ffffff61}.waveform-annotation-editor__color-field[data-v-42466cf9] .vc-color-wrap:hover{border-color:#98a2b3;box-shadow:0 0 0 3px #1677ff1f}@media (width<=420px){.waveform-annotation-editor__content[data-v-42466cf9]{gap:16px}.waveform-annotation-editor__coordinates[data-v-42466cf9]{grid-template-columns:1fr}}.waveform-tooltip[data-v-b9ed144d]{box-sizing:border-box;z-index:2;color:#505050;pointer-events:none;background:#fff;border:1px solid #e3e7eb;border-radius:4px;gap:2px;width:max-content;max-width:min(560px,100% - 16px);padding:9px 12px;font:14px/1.35 Arial,sans-serif;display:grid;position:absolute;box-shadow:0 3px 10px #10182826}.waveform-tooltip__series[data-v-b9ed144d]{grid-template-columns:8px minmax(0,1fr);align-items:start;gap:6px;display:grid}.waveform-tooltip__series i[data-v-b9ed144d]{border-radius:50%;flex:none;width:8px;height:8px;margin-top:4px}.waveform-tooltip__series-content[data-v-b9ed144d]{flex-wrap:nowrap;align-items:baseline;gap:12px;min-width:0;display:flex}.waveform-tooltip__series-label[data-v-b9ed144d]{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.waveform-tooltip__value[data-v-b9ed144d]{white-space:nowrap;flex:none}.waveform-tooltip__series strong[data-v-b9ed144d]{font-weight:600}.waveform-tooltip__value[data-v-b9ed144d]{color:#555}.waveform-tooltip__series small[data-v-b9ed144d]{color:#667085}.waveform-track__line[data-v-42a3fd47]{fill:none;stroke-width:1.5px;stroke-linejoin:round;stroke-linecap:round}.waveform-track__error-bar[data-v-42a3fd47]{fill:none}.waveform-track__point[data-v-42a3fd47],.waveform-track__error-bar[data-v-42a3fd47]{pointer-events:none}.waveform-track{isolation:isolate;pointer-events:none}.waveform-track__y-axis-label-bg{fill:#fff;opacity:.9;pointer-events:none}.waveform-track__y-axis-label{pointer-events:none;font-size:12px;font-weight:500}.waveform-track__grid{pointer-events:none}.waveform-track__grid--major line{stroke:#dfe5ef;stroke-width:1px}.waveform-track__grid--minor line{stroke:#f2f5fa;stroke-width:1px}.waveform-track__plot-frame,.waveform-track__plot-background{pointer-events:none}.waveform-track__watermark{fill:#1677ff1a;pointer-events:none;-webkit-user-select:none;user-select:none;font-family:Consolas,Monaco,Courier New,monospace}.waveform-track__overlay{fill:#0000;cursor:crosshair;pointer-events:all;touch-action:none}.waveform-track__no-visible-series{fill:#8c8c8c;pointer-events:none;font:13px sans-serif}.waveform-track__overlay.is-zoomable{cursor:grab}.waveform-track__overlay.is-zoomable:active{cursor:grabbing}.waveform-track__overlay.is-annotating{cursor:crosshair}.waveform-track__overlay.is-presentation{cursor:default;pointer-events:none}.waveform-track__zero-line{fill:none;pointer-events:none}.waveform-track__axis-endpoint{fill:#667085;pointer-events:none;font-size:11px}.waveform-track__axis-exponent{fill:#666;font-family:sans-serif;font-size:10px}.waveform-track__axis path,.waveform-track__axis line{stroke:#1f2937}.waveform-track__axis text{fill:#667085;font-size:11px}.waveform-legend[data-v-2ae12e71]{pointer-events:none;overflow:hidden}.waveform-legend__viewport[data-v-2ae12e71]{box-sizing:border-box;width:100%;height:100%;padding:8px;display:flex;overflow:hidden}.waveform-legend__viewport--top-left[data-v-2ae12e71]{justify-content:flex-start;align-items:flex-start}.waveform-legend__viewport--top[data-v-2ae12e71]{justify-content:center;align-items:flex-start}.waveform-legend__viewport--top-right[data-v-2ae12e71]{justify-content:flex-end;align-items:flex-start}.waveform-legend__viewport--right[data-v-2ae12e71]{justify-content:flex-end;align-items:center}.waveform-legend__viewport--bottom-right[data-v-2ae12e71]{justify-content:flex-end;align-items:flex-end}.waveform-legend__viewport--bottom[data-v-2ae12e71]{justify-content:center;align-items:flex-end}.waveform-legend__viewport--bottom-left[data-v-2ae12e71]{justify-content:flex-start;align-items:flex-end}.waveform-legend__viewport--left[data-v-2ae12e71]{justify-content:flex-start;align-items:center}.waveform-legend__panel[data-v-2ae12e71]{color:#344054;border:1px solid #d0d5dde6;border-radius:4px;flex:0 auto;gap:5px 12px;max-width:100%;max-height:100%;padding:5px 7px;font:12px/1.35 sans-serif;display:flex;overflow:hidden}.waveform-legend__panel--interactive[data-v-2ae12e71]{pointer-events:auto}.waveform-legend__panel--horizontal[data-v-2ae12e71]{flex-flow:wrap;align-items:center}.waveform-legend__panel--vertical[data-v-2ae12e71]{flex-flow:column;align-items:stretch}.waveform-legend__item[data-v-2ae12e71]{min-width:0;max-width:160px;color:inherit;font:inherit;text-align:left;white-space:nowrap;appearance:none;background:0 0;border:0;align-items:center;gap:6px;padding:0;display:flex}.waveform-legend__item[data-v-2ae12e71]:disabled{opacity:1}.waveform-legend__panel--interactive .waveform-legend__item[data-v-2ae12e71]{cursor:pointer}.waveform-legend__panel--interactive .waveform-legend__item[data-v-2ae12e71]:focus-visible{outline-offset:2px;outline:2px solid #1677ff}.waveform-legend__item.is-hidden[data-v-2ae12e71]{opacity:.45}.waveform-legend__item.is-hidden .waveform-legend__label[data-v-2ae12e71]{text-decoration:line-through}.waveform-legend__swatch[data-v-2ae12e71]{stroke-linecap:round;stroke-linejoin:round;flex:0 0 26px;width:26px;height:16px;overflow:visible}.waveform-legend__label[data-v-2ae12e71]{text-overflow:ellipsis;min-width:0;overflow:hidden}.waveform-track__crosshair[data-v-044318c2]{pointer-events:none}.waveform-track__crosshair line[data-v-044318c2]{stroke:#57617b;stroke-width:1px;stroke-dasharray:4 3}.waveform-chart{box-sizing:border-box;color:#475467;background:#fff;border:1.2px solid #00000014;border-radius:6px;min-width:0;min-height:180px;position:relative;overflow:hidden}.waveform-chart--clean{border-color:#0000}.waveform-chart__pagination{z-index:2;position:absolute;bottom:6px;right:10px}.waveform-chart__title-area{background:#fff;align-items:center;width:100%;min-width:0;padding:0 24px;display:flex;position:relative;overflow:hidden}.waveform-chart__title-measure{visibility:hidden;pointer-events:none;display:block;position:absolute}.waveform-chart__title-visual{flex:none;min-width:0;position:relative;overflow:visible}.waveform-chart__title-text{transform-origin:50%;line-height:1.2;display:block;position:absolute;top:50%;left:50%;overflow:visible}.waveform-chart__pagination .ant-pagination-item,.waveform-chart__pagination .ant-pagination-prev .ant-pagination-item-link,.waveform-chart__pagination .ant-pagination-next .ant-pagination-item-link{background:#fff;border-color:#d9d9d9}.waveform-chart__pagination .ant-pagination-item-active{border-color:#1677ff}.waveform-chart__grid-slot-placeholder{fill:#fafbfc;stroke:#e4e7ec;stroke-dasharray:4 4;pointer-events:none}.waveform-chart__svg{max-width:100%;display:block}.waveform-chart__overlay{fill:#0000;cursor:crosshair;touch-action:none}.waveform-chart__overlay.is-zoomable{cursor:crosshair}.waveform-chart--panning .waveform-chart__overlay.is-zoomable{cursor:grabbing}.waveform-chart__zoom-selection{fill:#1677ff24;stroke:#1677ff;stroke-width:1px;pointer-events:none}.waveform-chart__overlay.is-annotating{cursor:crosshair}.waveform-chart--presentation .waveform-chart__overlay{cursor:default;pointer-events:none}.waveform-chart__label,.waveform-chart__empty{fill:#595959;font-size:12px}
1
+ .waveform-annotation-layer[data-v-7254383e]{pointer-events:none}.waveform-annotation-layer--interactive .waveform-annotation[data-v-7254383e]{pointer-events:auto;cursor:grab;touch-action:none}.waveform-annotation-layer--interactive .waveform-annotation[data-v-7254383e]:active{cursor:grabbing}.waveform-annotation__arrow[data-v-7254383e]{stroke-width:2px;stroke-linecap:round;pointer-events:none}.waveform-annotation__box[data-v-7254383e]{stroke-width:1px;rx:3}.waveform-annotation-layer--interactive .waveform-annotation__box[data-v-7254383e]{pointer-events:auto}.waveform-annotation__text[data-v-7254383e]{pointer-events:none;-webkit-user-select:none;user-select:none}.waveform-annotation-context-menu[data-v-c70c98a1]{z-index:30;background:#fff;border:1px solid #dfe5ef;border-radius:4px;min-width:112px;padding:4px;display:grid;position:absolute;box-shadow:0 4px 14px #10182829}.waveform-annotation-context-menu button[data-v-c70c98a1]{color:#344054;text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:3px;padding:7px 10px;font-size:12px}.waveform-annotation-context-menu button[data-v-c70c98a1]:hover{background:#f2f4f7}.waveform-annotation-editor-root,.waveform-annotation-editor-root *{box-sizing:border-box}.waveform-annotation-editor-root{color:#344054;text-align:left;text-transform:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif;line-height:1.5715}.waveform-annotation-editor-root button,.waveform-annotation-editor-root input,.waveform-annotation-editor-root select,.waveform-annotation-editor-root textarea{letter-spacing:normal;text-transform:none;font-family:inherit}.waveform-annotation-editor-root button{appearance:auto}.waveform-annotation-editor__content[data-v-01ecd3a4]{color:#344054;gap:20px;font-size:13px;display:grid}.waveform-annotation-editor__coordinates[data-v-01ecd3a4]{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}.waveform-annotation-editor__coordinates span[data-v-01ecd3a4],.waveform-annotation-editor__series[data-v-01ecd3a4]{background:#f8fafc;border:1px solid #eaecf0;border-radius:7px;align-items:center;gap:8px;min-width:0;padding:9px 10px;display:flex}.waveform-annotation-editor__coordinates span[data-v-01ecd3a4]{color:#667085}.waveform-annotation-editor__coordinate-input[data-v-01ecd3a4]{color:#667085;background:#f8fafc;border:1px solid #eaecf0;border-radius:7px;align-items:center;gap:8px;min-width:0;padding:9px 10px;display:flex}.waveform-annotation-editor__coordinate-input[data-v-01ecd3a4] .ant-input-number{color:#344054;width:auto;min-width:96px;font-family:SFMono-Regular,Consolas,monospace}.waveform-annotation-editor__coordinate-value[data-v-01ecd3a4]{display:none}.waveform-annotation-editor__coordinate-error[data-v-01ecd3a4]{color:#d92d20;grid-column:1/-1;margin:-12px 0 0;font-size:11px;line-height:1.4}.waveform-annotation-editor__coordinate-hint[data-v-01ecd3a4]{color:#98a2b3;margin:-12px 0 0;font-size:11px;line-height:1.4}.waveform-annotation-editor__coordinates b[data-v-01ecd3a4]{color:#1677ff;font-size:11px}.waveform-annotation-editor__coordinates code[data-v-01ecd3a4]{color:#344054;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:SFMono-Regular,Consolas,monospace;font-size:11px;overflow:hidden}.waveform-annotation-editor__series[data-v-01ecd3a4]{gap:10px}.waveform-annotation-editor__series i[data-v-01ecd3a4]{border:1px solid #0000001f;border-radius:2px;flex:0 0 12px;width:12px;height:12px}.waveform-annotation-editor__series-label[data-v-01ecd3a4]{gap:1px;min-width:0;display:grid}.waveform-annotation-editor__series select[data-v-01ecd3a4]{color:#344054;min-width:0;max-width:190px;font:inherit;background:#fff;border:1px solid #d0d5dd;border-radius:5px;margin-left:auto;padding:5px 7px}.waveform-annotation-editor__series small[data-v-01ecd3a4]{color:#667085;font-size:10px}.waveform-annotation-editor__series b[data-v-01ecd3a4]{color:#344054;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.waveform-annotation-editor__series code[data-v-01ecd3a4]{color:#667085;margin-left:auto;font-size:11px}.waveform-annotation-editor__field[data-v-01ecd3a4],.waveform-annotation-editor__color-field[data-v-01ecd3a4]{gap:4px;display:grid}.waveform-annotation-editor__label-row[data-v-01ecd3a4]{justify-content:space-between;align-items:center;gap:8px;display:flex}.waveform-annotation-editor__label-row b[data-v-01ecd3a4],.waveform-annotation-editor__colors legend[data-v-01ecd3a4]{color:#344054;font-size:12px;font-weight:600}.waveform-annotation-editor__label-row small[data-v-01ecd3a4]{color:#98a2b3;font-size:11px}.waveform-annotation-editor textarea[data-v-01ecd3a4]{box-sizing:border-box;color:#1d2939;width:100%;min-height:92px;font:inherit;resize:vertical;background:#fff;border:1px solid #d0d5dd;border-radius:7px;padding:10px 11px;line-height:1.5}.waveform-annotation-editor textarea[data-v-01ecd3a4]:focus{border-color:#1677ff;outline:3px solid #1677ff24}.waveform-annotation-editor__colors[data-v-01ecd3a4]{border:0;border-top:1px solid #eaecf0;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;min-width:0;margin:0;padding:14px 0 0;display:grid}.waveform-annotation-editor__colors legend[data-v-01ecd3a4]{grid-column:1/-1;padding:0}.waveform-annotation-editor__color-field[data-v-01ecd3a4]{color:#667085;text-align:left;place-items:stretch stretch;min-width:0;font-size:11px}.waveform-annotation-editor__color-field[data-v-01ecd3a4] .vc-color-wrap{border:1px solid #cfd5df;border-radius:6px;width:100%;height:34px;margin-right:0;box-shadow:inset 0 0 0 1px #ffffff61}.waveform-annotation-editor__color-field[data-v-01ecd3a4] .vc-color-wrap:hover{border-color:#98a2b3;box-shadow:0 0 0 3px #1677ff1f}@media (width<=420px){.waveform-annotation-editor__content[data-v-01ecd3a4]{gap:16px}.waveform-annotation-editor__coordinates[data-v-01ecd3a4]{grid-template-columns:1fr}}.waveform-tooltip[data-v-1ae3316b]{box-sizing:border-box;z-index:2;color:#505050;pointer-events:none;background:#fff;border:1px solid #e3e7eb;border-radius:4px;gap:2px;width:max-content;max-width:min(560px,100% - 16px);padding:9px 12px;font:14px/1.35 Arial,sans-serif;display:grid;position:absolute;box-shadow:0 3px 10px #10182826}.waveform-tooltip__series[data-v-1ae3316b]{grid-template-columns:8px minmax(0,1fr);align-items:start;gap:6px;display:grid}.waveform-tooltip__series i[data-v-1ae3316b]{border-radius:50%;flex:none;width:8px;height:8px;margin-top:4px}.waveform-tooltip__series-content[data-v-1ae3316b]{flex-wrap:nowrap;align-items:baseline;gap:12px;min-width:0;display:flex}.waveform-tooltip__series-label[data-v-1ae3316b]{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.waveform-tooltip__value[data-v-1ae3316b]{white-space:nowrap;flex:none}.waveform-tooltip__series strong[data-v-1ae3316b]{font-weight:600}.waveform-tooltip__value[data-v-1ae3316b]{color:#555}.waveform-tooltip__series small[data-v-1ae3316b]{color:#667085}.waveform-track__line[data-v-42a3fd47]{fill:none;stroke-width:1.5px;stroke-linejoin:round;stroke-linecap:round}.waveform-track__error-bar[data-v-42a3fd47]{fill:none}.waveform-track__point[data-v-42a3fd47],.waveform-track__error-bar[data-v-42a3fd47]{pointer-events:none}.waveform-track{isolation:isolate;pointer-events:none}.waveform-track__y-axis-label-bg{fill:#fff;opacity:.9;pointer-events:none}.waveform-track__y-axis-label{pointer-events:none;font-size:12px;font-weight:500}.waveform-track__grid{pointer-events:none}.waveform-track__grid--major line{stroke:#dfe5ef;stroke-width:1px}.waveform-track__grid--minor line{stroke:#f2f5fa;stroke-width:1px}.waveform-track__plot-frame,.waveform-track__plot-background{pointer-events:none}.waveform-track__watermark{fill:#1677ff1a;pointer-events:none;-webkit-user-select:none;user-select:none;font-family:Consolas,Monaco,Courier New,monospace}.waveform-track__overlay{fill:#0000;cursor:crosshair;pointer-events:all;touch-action:none}.waveform-track__no-visible-series{fill:#8c8c8c;pointer-events:none;font:13px sans-serif}.waveform-track__overlay.is-zoomable{cursor:grab}.waveform-track__overlay.is-zoomable:active{cursor:grabbing}.waveform-track__overlay.is-annotating{cursor:crosshair}.waveform-track__overlay.is-presentation{cursor:default;pointer-events:none}.waveform-track__zero-line{fill:none;pointer-events:none}.waveform-track__axis-endpoint{fill:#667085;pointer-events:none;font-size:11px}.waveform-track__axis-exponent{fill:#666;font-family:sans-serif;font-size:10px}.waveform-track__axis path,.waveform-track__axis line{stroke:#1f2937}.waveform-track__axis text{fill:#667085;font-size:11px}.waveform-legend[data-v-2ae12e71]{pointer-events:none;overflow:hidden}.waveform-legend__viewport[data-v-2ae12e71]{box-sizing:border-box;width:100%;height:100%;padding:8px;display:flex;overflow:hidden}.waveform-legend__viewport--top-left[data-v-2ae12e71]{justify-content:flex-start;align-items:flex-start}.waveform-legend__viewport--top[data-v-2ae12e71]{justify-content:center;align-items:flex-start}.waveform-legend__viewport--top-right[data-v-2ae12e71]{justify-content:flex-end;align-items:flex-start}.waveform-legend__viewport--right[data-v-2ae12e71]{justify-content:flex-end;align-items:center}.waveform-legend__viewport--bottom-right[data-v-2ae12e71]{justify-content:flex-end;align-items:flex-end}.waveform-legend__viewport--bottom[data-v-2ae12e71]{justify-content:center;align-items:flex-end}.waveform-legend__viewport--bottom-left[data-v-2ae12e71]{justify-content:flex-start;align-items:flex-end}.waveform-legend__viewport--left[data-v-2ae12e71]{justify-content:flex-start;align-items:center}.waveform-legend__panel[data-v-2ae12e71]{color:#344054;border:1px solid #d0d5dde6;border-radius:4px;flex:0 auto;gap:5px 12px;max-width:100%;max-height:100%;padding:5px 7px;font:12px/1.35 sans-serif;display:flex;overflow:hidden}.waveform-legend__panel--interactive[data-v-2ae12e71]{pointer-events:auto}.waveform-legend__panel--horizontal[data-v-2ae12e71]{flex-flow:wrap;align-items:center}.waveform-legend__panel--vertical[data-v-2ae12e71]{flex-flow:column;align-items:stretch}.waveform-legend__item[data-v-2ae12e71]{min-width:0;max-width:160px;color:inherit;font:inherit;text-align:left;white-space:nowrap;appearance:none;background:0 0;border:0;align-items:center;gap:6px;padding:0;display:flex}.waveform-legend__item[data-v-2ae12e71]:disabled{opacity:1}.waveform-legend__panel--interactive .waveform-legend__item[data-v-2ae12e71]{cursor:pointer}.waveform-legend__panel--interactive .waveform-legend__item[data-v-2ae12e71]:focus-visible{outline-offset:2px;outline:2px solid #1677ff}.waveform-legend__item.is-hidden[data-v-2ae12e71]{opacity:.45}.waveform-legend__item.is-hidden .waveform-legend__label[data-v-2ae12e71]{text-decoration:line-through}.waveform-legend__swatch[data-v-2ae12e71]{stroke-linecap:round;stroke-linejoin:round;flex:0 0 26px;width:26px;height:16px;overflow:visible}.waveform-legend__label[data-v-2ae12e71]{text-overflow:ellipsis;min-width:0;overflow:hidden}.waveform-track__crosshair[data-v-044318c2]{pointer-events:none}.waveform-track__crosshair line[data-v-044318c2]{stroke:#57617b;stroke-width:1px;stroke-dasharray:4 3}.small-alpha-slider{height:10px!important}.small-alpha-slider .small-bar{width:10px!important;height:10px!important}.small-alpha-slider .small-bar div{transform:translate(-6px,-2px);border-radius:5px!important;width:12px!important;height:12px!important;margin-top:1px!important}.bee-alpha-slider{border-radius:15px;width:100%;height:14px;margin-bottom:15px;position:relative;box-shadow:2px 0 8px #00000014}.bee-alpha-slider.is-vertical{width:14px;height:100%;display:inline-block;transform:rotate(180deg)}.bee-alpha-slider.transparent{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.bee-alpha-slider__bar{border-radius:15px;width:100%;height:100%;position:relative}.bee-alpha-slider__bar-pointer{width:14px;height:14px;position:absolute}.bee-alpha-slider__bar-handle{cursor:pointer;background-color:#f8f8f8;border-radius:6px;width:14px;height:14px;margin-top:2px;transform:translate(-7px,-2px);box-shadow:0 1px 4px #0000005e}.bee-alpha-slider__bar-handle.vertical{margin-top:0;transform:translateY(-7px)}.bee-compact{width:auto;margin-bottom:15px;display:inline-block;box-shadow:3px 0 5px #00000014}.bee-compact__row{width:100%;margin:0;position:relative}.bee-compact__row>*{vertical-align:middle;display:inline-block}.bee-compact__color_cube{width:100%;height:100%}.bee-compact__color_cube.transparent:before{content:"";background:#fff;width:100%;height:100%;position:absolute;top:0;left:0}.bee-compact__color_cube.transparent:after{content:"";transform-origin:0 0;background:red;width:35px;height:1px;position:absolute;top:100%;left:0;transform:rotate(-45deg)}.bee-compact__color_cube.advance{background:url(data:image/png;base64,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)}.bee-compact__color_cube .alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.bee-compact__color-cube--wrap{cursor:pointer;width:25px;height:25px;position:relative;overflow:hidden}.bee-compact__color-cube--wrap:hover{z-index:299;transition:transform .2s;transform:scale(1.2)}.bee-colorPicker__record{align-items:center;margin-top:20px;display:flex}.bee-colorPicker__record .text{text-align:right;color:#666;width:48px;margin-right:10px;font-size:12px}.bee-colorPicker__record .color-list{width:auto;margin:0;display:flex;position:relative}.bee-colorPicker__record .color-list .color-item{cursor:pointer;vertical-align:middle;width:25px;height:25px;margin-right:1px;display:inline-block;position:relative;overflow:hidden;box-shadow:3px 0 5px #00000014}.bee-colorPicker__record .color-list .color-item__round{border-radius:50%}.bee-colorPicker__record .color-list .color-item.transparent{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.bee-colorPicker__record .color-list .color-item:hover{z-index:299;transition:transform .2s;transform:scale(1.2)}.bee-colorPicker__record .color-list .color-item__display{width:100%;height:100%}.small-hue-slider{height:10px!important}.small-hue-slider .small-bar{width:10px!important;height:10px!important}.small-hue-slider .small-bar div{transform:translate(-6px,-2px);border-radius:5px!important;width:12px!important;height:12px!important;margin-top:1px!important}.bee-hue-colorPicker{border-radius:15px;width:100%;height:14px;margin-bottom:15px;position:relative;box-shadow:2px 0 8px #00000014}.bee-hue-colorPicker.is-vertical{width:14px;height:100%;display:inline-block;transform:rotate(180deg)}.bee-hue-colorPicker.transparent{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.bee-hue-colorPicker__inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMkAAAAdCAYAAAAAaUg8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKtJREFUeNrs09EKgjAUgOGzEFfv/7CVBceiLiJiLnf7fSAbDoUj/iWnyKgRcXxf9Wtt7Vvntf8854jLY3uN19qzf67nH/e2nmmdZ8xjg2x+sI533qf9g4wM/3GvLPumOHVMWf/4SiWWsUG6/6bG+/NWDgE0iQREAiIBkYBIQCQgEhAJiAQQCYgERAIiAZGASEAkIBJAJCASEAmIBEQCIgGRgEgAkYBIYNAqwAD5oWo3bpsiKwAAAABJRU5ErkJggg==);background-size:100%;border-radius:15px;width:100%;height:100%;position:relative}.bee-hue-colorPicker__inner-pointer{width:14px;height:14px;position:absolute}.bee-hue-colorPicker__inner-handle{cursor:pointer;background-color:#f8f8f8;border-radius:6px;width:14px;height:14px;margin-top:2px;transform:translate(-7px,-2px);box-shadow:0 1px 4px #0000005e}.bee-hue-colorPicker__inner-handle.vertical{margin-top:0;transform:translate(-1px,-7px)}.small-light-slider{height:10px!important}.small-light-slider .small-bar{width:10px!important;height:10px!important}.small-light-slider .small-bar div{transform:translate(-6px,-2px);border-radius:5px!important;width:12px!important;height:12px!important;margin-top:1px!important}.bee-light-colorPicker{border-radius:15px;width:100%;height:14px;margin-bottom:15px;position:relative;box-shadow:2px 0 8px #00000014}.bee-light-colorPicker.is-vertical{width:14px;height:100%;display:inline-block;transform:rotate(180deg)}.bee-light-colorPicker.transparent{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.bee-light-colorPicker__inner{border-radius:15px;width:100%;height:100%;position:relative}.bee-light-colorPicker__inner-pointer{width:14px;height:14px;position:absolute}.bee-light-colorPicker__inner-handle{cursor:pointer;background-color:#f8f8f8;border-radius:6px;width:14px;height:14px;margin-top:2px;transform:translate(-7px,-2px);box-shadow:0 1px 4px #0000005e}.bee-light-colorPicker__inner-handle.vertical{margin-top:0;transform:translateY(-7px)}.bee-saturation{width:100%;height:125px;margin-bottom:15px;position:relative}.bee-saturation__chrome{border-color:#0000;border-top-left-radius:5px;border-top-right-radius:5px}.bee-saturation__hidden{overflow:hidden}.bee-saturation__white,.bee-saturation__black{position:absolute;inset:0}.bee-saturation__black{background:linear-gradient(#0000,#000)}.bee-saturation__white{background:linear-gradient(90deg,#fff,#fff0)}.bee-saturation__cursor{position:absolute}.bee-saturation__cursor div{cursor:pointer;border:1px solid #fff;border-radius:50%;width:10px;height:10px;transform:translate(-5px,-5px);box-shadow:0 1px 4px #0000005e}.inputs-controls{margin-bottom:5px;font-size:16px;display:flex}.inputs-controls .formatBtn{text-align:center;cursor:pointer;background-color:#0000;border:0;outline:none;justify-content:center;align-items:center;margin-right:5px;padding:1px;font-weight:700;display:inline-flex;position:relative}.inputs-controls .formatBtn:hover{color:#1a3aff}.inputs-controls .format-group{flex-grow:1;display:flex}.inputs-controls .format-group input{text-align:center;appearance:none;-moz-appearance:textfield;border-width:0 0 1px;outline:none;flex:1;min-width:0;margin:0 3px;padding:5px}.inputs-controls .format-group input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none!important}.inputs-controls .format-group input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none!important}.bee-fk-colorPicker{box-sizing:border-box;-webkit-user-select:none;user-select:none;background-color:#fff;border-radius:3px;width:249px;padding-bottom:10px;position:relative;box-shadow:0 0 10px #00000026}.bee-fk-colorPicker__inner{padding:12px}.bee-fk-colorPicker__header{z-index:999;text-align:left;margin-bottom:12px}.bee-fk-colorPicker__header .back{border:1px solid #000;border-width:0 1px 1px 0;margin-left:2px;padding:4px;display:inline-block;transform:rotate(135deg)}.bee-fk-colorPicker__display{text-align:left;width:100%;margin:0;position:relative}.bee-fk-colorPicker__display .transparent{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.bee-fk-colorPicker__display .current-color{cursor:pointer;vertical-align:middle;width:50px;height:24px;margin-right:10px;display:inline-block;position:relative;overflow:hidden;box-shadow:3px 0 5px #00000014}.bee-fk-colorPicker__display .current-color .color-cube{width:100%;height:100%}.bee-fk-colorPicker__display .hexColor-prefix{vertical-align:middle;padding:0 4px;font-size:14px;display:inline-block;position:relative}.bee-fk-colorPicker__display input{text-align:center;vertical-align:middle;border-top:0;border-bottom:1px solid #e3e2e8;border-left:none;border-right:0;outline:0;width:25px;padding-bottom:3px;display:inline-block}.bee-fk-colorPicker__display .hexColor-input{width:64px}.bee-fk-colorPicker__display .action{float:right;vertical-align:middle}.bee-fk-colorPicker__display .action .clear-btn{color:#409eff;vertical-align:middle;cursor:pointer;background:0 0;border-color:#0000;padding-left:0;padding-right:0;display:inline-block}.bee-fk-colorPicker__display .action .copy-btn{color:#13ce66cc;vertical-align:middle;cursor:pointer;background:0 0;border-color:#0000;margin-left:10px;padding-left:0;padding-right:0;display:inline-block}.bee-ele-colorPicker{box-sizing:border-box;-webkit-user-select:none;user-select:none;background-color:#fff;border-radius:3px;width:300px;padding:10px;position:relative;box-shadow:0 0 10px #00000026}.bee-ele-colorPicker .bee-ele-row{display:flex}.bee-ele-colorPicker .bee-ele-row .bee-ele-saturation{width:280px;height:180px}.bee-ele-colorPicker .bee-ele-row .bee-ele-hue{height:180px;margin-left:10px}.bee-chrome-colorPicker{box-sizing:border-box;-webkit-user-select:none;user-select:none;background-color:#fff;border-radius:3px;width:250px;padding-bottom:20px;position:relative;box-shadow:0 0 10px #00000026}.bee-chrome-colorPicker-body{background-color:#fff;padding:0 12px}.bee-chrome-colorPicker-body .chrome-controls{display:flex}.bee-chrome-colorPicker-body .chrome-controls .chrome-color-wrap{z-index:1;border-radius:50%;width:36px;height:36px;position:relative;overflow:hidden}.bee-chrome-colorPicker-body .chrome-controls .chrome-color-wrap .current-color{width:100%;height:100%}.bee-chrome-colorPicker-body .chrome-controls .chrome-sliders{flex:1;margin-left:10px}.bee-color-wrap{cursor:pointer;vertical-align:middle;width:50px;height:24px;margin-right:10px;display:inline-block;position:relative;overflow:hidden;box-shadow:3px 0 5px #00000014}.bee-color-wrap.transparent{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.bee-color-wrap.round{border:1px solid #d8d8d8;border-radius:50%;width:22px;height:22px}.bee-color-wrap .current-color{width:100%;height:100%}.vc-alpha-slider[data-v-18925ba6]{border-radius:15px;width:100%;height:14px;margin-bottom:15px;position:relative;box-shadow:2px 0 8px #00000014}.vc-alpha-slider.is-vertical[data-v-18925ba6]{width:14px;height:100%;display:inline-block;transform:rotate(180deg)}.vc-alpha-slider.transparent[data-v-18925ba6]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-alpha-slider__bar[data-v-18925ba6]{border-radius:15px;width:100%;height:100%;position:relative}.vc-alpha-slider__bar-pointer[data-v-18925ba6]{width:14px;height:14px;position:absolute}.vc-alpha-slider__bar-handle[data-v-18925ba6]{cursor:pointer;background-color:#f8f8f8;border-radius:6px;width:14px;height:14px;margin-top:2px;transform:translate(-7px,-2px);box-shadow:0 1px 4px #0000005e}.vc-alpha-slider__bar-handle.vertical[data-v-18925ba6]{margin-top:0;transform:translateY(-7px)}.vc-alpha-slider.small-slider[data-v-18925ba6]{height:10px!important}.vc-alpha-slider.small-slider .small-bar[data-v-18925ba6]{width:10px!important;height:10px!important}.vc-alpha-slider.small-slider .small-bar div[data-v-18925ba6]{transform:translate(-6px,-2px);border-radius:5px!important;width:12px!important;height:12px!important;margin-top:1px!important}.vc-compact[data-v-b969fd48]{width:auto;margin-bottom:15px;display:inline-block;box-shadow:3px 0 5px #00000014}.vc-compact__row[data-v-b969fd48]{width:100%;height:27px;margin:0;position:relative}.vc-compact__row>[data-v-b969fd48]{vertical-align:middle;display:inline-block}.vc-compact__color_cube[data-v-b969fd48]{width:100%;height:100%}.vc-compact__color_cube.transparent[data-v-b969fd48]:before{content:"";background:#fff;width:100%;height:100%;position:absolute;top:0;left:0}.vc-compact__color_cube.transparent[data-v-b969fd48]:after{content:"";transform-origin:0 0;background:red;width:35px;height:1px;position:absolute;top:100%;left:0;transform:rotate(-45deg)}.vc-compact__color_cube.advance[data-v-b969fd48]{background:url(data:image/png;base64,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)}.vc-compact__color_cube .alpha[data-v-b969fd48]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-compact__color-cube--wrap[data-v-b969fd48]{cursor:pointer;width:27px;height:27px;position:relative;overflow:hidden}.vc-compact__color-cube--wrap[data-v-b969fd48]:hover{z-index:299;transition:transform .2s;transform:scale(1.2)}.vc-saturation[data-v-7f0cdcdf]{width:100%;height:125px;margin-bottom:15px;position:relative}.vc-saturation__chrome[data-v-7f0cdcdf]{border-color:#0000;border-top-left-radius:5px;border-top-right-radius:5px}.vc-saturation__hidden[data-v-7f0cdcdf]{overflow:hidden}.vc-saturation__white[data-v-7f0cdcdf],.vc-saturation__black[data-v-7f0cdcdf]{position:absolute;inset:0}.vc-saturation__black[data-v-7f0cdcdf]{background:linear-gradient(#0000,#000)}.vc-saturation__white[data-v-7f0cdcdf]{background:linear-gradient(90deg,#fff,#fff0)}.vc-saturation__cursor[data-v-7f0cdcdf]{position:absolute}.vc-saturation__cursor div[data-v-7f0cdcdf]{cursor:pointer;border:1px solid #fff;border-radius:50%;width:10px;height:10px;transform:translate(-5px,-5px);box-shadow:0 1px 4px #0000005e}.vc-hue-slider[data-v-e1a08576]{border-radius:15px;width:100%;height:14px;margin-bottom:15px;position:relative;box-shadow:2px 0 8px #00000014}.vc-hue-slider.is-vertical[data-v-e1a08576]{width:14px;height:100%;display:inline-block;transform:rotate(180deg)}.vc-hue-slider.transparent[data-v-e1a08576]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-hue-slider__bar[data-v-e1a08576]{background:-moz-linear-gradient(270deg,red 0%,#ff0 16.66%,#0f0 33.33%,#0ff 50%,#00f 66.66%,#f0f 83.33%,red 100%);background:-ms-linear-gradient(left,red 0%,#ff0 16.66%,#0f0 33.33%,#0ff 50%,#00f 66.66%,#f0f 83.33%,red 100%);background:-webkit-linear-gradient(270deg,red 0%,#ff0 16.66%,#0f0 33.33%,#0ff 50%,#00f 66.66%,#f0f 83.33%,red 100%);border-radius:15px;width:100%;height:100%;position:relative}.vc-hue-slider__bar-pointer[data-v-e1a08576]{width:14px;height:14px;position:absolute}.vc-hue-slider__bar-handle[data-v-e1a08576]{cursor:pointer;background-color:#f8f8f8;border-radius:6px;width:14px;height:14px;margin-top:2px;transform:translate(-7px,-2px);box-shadow:0 1px 4px #0000005e}.vc-hue-slider__bar-handle.vertical[data-v-e1a08576]{margin-top:0;transform:translateY(-7px)}.vc-hue-slider.small-slider[data-v-e1a08576]{height:10px!important}.vc-hue-slider.small-slider .small-bar[data-v-e1a08576]{width:10px!important;height:10px!important}.vc-hue-slider.small-slider .small-bar div[data-v-e1a08576]{transform:translate(-6px,-2px);border-radius:5px!important;width:12px!important;height:12px!important;margin-top:1px!important}.vc-lightness-slider[data-v-94a50a9e]{border-radius:15px;width:100%;height:14px;margin-bottom:15px;position:relative;box-shadow:2px 0 8px #00000014}.vc-lightness-slider.is-vertical[data-v-94a50a9e]{width:14px;height:100%;display:inline-block;transform:rotate(180deg)}.vc-lightness-slider.transparent[data-v-94a50a9e]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-lightness-slider__bar[data-v-94a50a9e]{border-radius:15px;width:100%;height:100%;position:relative}.vc-lightness-slider__bar-pointer[data-v-94a50a9e]{width:14px;height:14px;position:absolute}.vc-lightness-slider__bar-handle[data-v-94a50a9e]{cursor:pointer;background-color:#f8f8f8;border-radius:6px;width:14px;height:14px;margin-top:2px;transform:translate(-7px,-2px);box-shadow:0 1px 4px #0000005e}.vc-lightness-slider__bar-handle.vertical[data-v-94a50a9e]{margin-top:0;transform:translateY(-7px)}.vc-lightness-slider.small-slider[data-v-94a50a9e]{height:10px!important}.vc-lightness-slider.small-slider .small-bar[data-v-94a50a9e]{width:10px!important;height:10px!important}.vc-lightness-slider.small-slider .small-bar div[data-v-94a50a9e]{transform:translate(-6px,-2px);border-radius:5px!important;width:12px!important;height:12px!important;margin-top:1px!important}.vc-colorPicker__record[data-v-0f657238]{align-items:center;margin-top:15px;display:flex}.vc-colorPicker__record .text[data-v-0f657238]{text-align:right;color:#666;width:48px;margin-right:10px;font-size:12px}.vc-colorPicker__record .color-list[data-v-0f657238]{gap:2px;width:100%;margin:0;display:flex;position:relative}.vc-colorPicker__record .color-list .color-item[data-v-0f657238]{cursor:pointer;vertical-align:middle;border-radius:2px;flex:1;max-width:26px;height:26px;display:inline-block;position:relative;overflow:hidden;box-shadow:3px 0 5px #0000001a}.vc-colorPicker__record .color-list .color-item__round[data-v-0f657238]{border-radius:50%}.vc-colorPicker__record .color-list .color-item.transparent[data-v-0f657238]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-colorPicker__record .color-list .color-item[data-v-0f657238]:hover{z-index:299;transition:transform .2s;transform:scale(1.2)}.vc-colorPicker__record .color-list .color-item__display[data-v-0f657238]{width:100%;height:100%}.vc-display[data-v-7334ac20]{align-items:center;gap:8px;height:28px;display:flex}.vc-display .vc-current-color[data-v-7334ac20]{cursor:pointer;vertical-align:middle;border-radius:2px;width:50px;height:100%;display:inline-block;position:relative;overflow:hidden;box-shadow:3px 0 5px #00000014}.vc-display .vc-current-color.vc-transparent[data-v-7334ac20]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-display .vc-current-color .color-cube[data-v-7334ac20]{text-align:center;width:100%;height:100%}.vc-display .vc-color-input[data-v-7334ac20]{box-sizing:border-box;flex:1 0;height:100%;position:relative}.vc-display .vc-color-input input[data-v-7334ac20]{cursor:pointer;text-align:center;box-sizing:border-box;color:#666;background-color:#c8c8c840;border:0;border-radius:2px;outline:none;width:100%;height:100%;padding:0;font-size:14px}.vc-display .vc-rgb-input[data-v-7334ac20]{color:#666;text-align:center;flex:1;font-size:12px}.vc-display .vc-rgb-input input[data-v-7334ac20]{cursor:pointer;text-align:center;color:#666;background-color:#c8c8c840;border:0;border-radius:2px;outline:none;width:100%;margin-bottom:2px;padding:4px 0;font-size:14px}.vc-display .vc-alpha-input[data-v-7334ac20]{background-color:#c8c8c840;border:none;border-radius:2px;justify-content:center;align-items:center;width:48px;height:100%;padding:0 2px;font-size:14px;display:flex}.vc-display .vc-alpha-input>input[data-v-7334ac20]{text-align:center;width:100%;height:100%;font-size:inherit;background-color:#0000;padding:0}.vc-display .vc-alpha-input__inner[data-v-7334ac20]{color:#000;box-sizing:border-box;cursor:pointer;border:none;border-radius:4px;outline:none;padding:10px 12px;font-size:14px;line-height:20px;display:block}.vc-display .vc-input-toggle[data-v-7334ac20]{cursor:pointer;border-radius:4px;width:24px;padding:2px;font-size:12px;line-height:12px}.vc-display .vc-input-toggle[data-v-7334ac20]:hover{background-color:#efefef}.vc-display .vc-input-toggle[data-v-7334ac20]:before{content:"";border-bottom:4px solid #888;border-left:4px solid #0000;border-right:4px solid #0000;width:0;height:0;margin:auto auto 2px;display:block}.vc-display .vc-input-toggle[data-v-7334ac20]:after{content:"";border-top:4px solid #888;border-left:4px solid #0000;border-right:4px solid #0000;width:0;height:0;margin:2px auto auto;display:block}.vc-display .copy-text[data-v-7334ac20]{text-align:center;font-size:12px;line-height:28px;display:inline-block;transform:scale(.8)}.vc-fk-colorPicker[data-v-48e3c224]{box-sizing:border-box;-webkit-user-select:none;user-select:none;background-color:initial;border-radius:3px;position:relative}.vc-fk-colorPicker__inner[data-v-48e3c224]{position:relative}.vc-fk-colorPicker__header[data-v-48e3c224]{z-index:999;text-align:left}.vc-fk-colorPicker__header .back[data-v-48e3c224]{border:2px solid #96969699;border-width:0 2px 2px 0;margin-bottom:12px;margin-left:2px;padding:4px;display:inline-block;transform:rotate(135deg)}.vc-fk-colorPicker__display[data-v-48e3c224]{text-align:left;width:100%;margin:0;position:relative}.vc-fk-colorPicker__display .transparent[data-v-48e3c224]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-fk-colorPicker__display .current-color[data-v-48e3c224]{cursor:pointer;vertical-align:middle;width:50px;height:24px;margin-right:10px;display:inline-block;position:relative;overflow:hidden;box-shadow:3px 0 5px #00000014}.vc-fk-colorPicker__display .current-color .color-cube[data-v-48e3c224]{width:100%;height:100%}.vc-fk-colorPicker__display .hexColor-prefix[data-v-48e3c224]{vertical-align:middle;padding:0 4px;font-size:14px;display:inline-block;position:relative}.vc-fk-colorPicker__display input[data-v-48e3c224]{text-align:center;vertical-align:middle;border-top:0;border-bottom:1px solid #e3e2e8;border-left:none;border-right:0;outline:0;width:25px;padding-bottom:3px;display:inline-block}.vc-fk-colorPicker__display .hexColor-input[data-v-48e3c224]{width:64px}.vc-fk-colorPicker__display .action[data-v-48e3c224]{float:right;vertical-align:middle}.vc-fk-colorPicker__display .action .clear-btn[data-v-48e3c224]{color:#409eff;vertical-align:middle;cursor:pointer;background:0 0;border-color:#0000;padding-left:0;padding-right:0;display:inline-block}.vc-fk-colorPicker__display .action .copy-btn[data-v-48e3c224]{color:#13ce66cc;vertical-align:middle;cursor:pointer;background:0 0;border-color:#0000;margin-left:10px;padding-left:0;padding-right:0;display:inline-block}.vc-chrome-colorPicker[data-v-2611d66c]{box-sizing:border-box;-webkit-user-select:none;user-select:none;background-color:initial;border-radius:3px;position:relative}.vc-chrome-colorPicker-body[data-v-2611d66c]{position:relative}.vc-chrome-colorPicker-body .chrome-controls[data-v-2611d66c]{display:flex}.vc-chrome-colorPicker-body .chrome-controls .chrome-color-wrap[data-v-2611d66c]{z-index:1;border-radius:50%;width:36px;height:36px;position:relative;overflow:hidden}.vc-chrome-colorPicker-body .chrome-controls .chrome-color-wrap.transparent[data-v-2611d66c]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-chrome-colorPicker-body .chrome-controls .chrome-color-wrap .current-color[data-v-2611d66c]{width:100%;height:100%}.vc-chrome-colorPicker-body .chrome-controls .chrome-sliders[data-v-2611d66c]{flex:1;margin-left:10px}.bee-angle{transform:rotate(90deg)}.bee-angle>*{vertical-align:middle;display:inline-block}.bee-angle.zero-right{transform:rotate(180deg)}.bee-angle.zero-bottom{transform:rotate(270deg)}.bee-angle__round{cursor:pointer;vertical-align:middle;border:1px solid #666;border-radius:50%;width:16px;height:16px;display:inline-block;position:relative}.bee-angle__round:before{content:"";background-color:#666;width:50%;height:1px;position:absolute;top:50%;left:0;transform:translateY(-50%)}.vc-gradient-picker[data-v-c4d6d6ea]{position:relative}.vc-gradient-picker__header[data-v-c4d6d6ea]{z-index:999;text-align:left;justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.vc-gradient-picker__header .back[data-v-c4d6d6ea]{border:2px solid #969696a6;border-width:0 2px 2px 0;margin-left:2px;margin-right:8px;padding:4px;display:inline-block;transform:rotate(135deg)}.vc-gradient-picker .vc-gradient__types[data-v-c4d6d6ea]{justify-content:space-between;width:100%;display:flex}.vc-gradient-picker .vc-gradient__types .vc-gradient-wrap__types[data-v-c4d6d6ea]{background-color:#c8c8c840;border-radius:4px;align-items:center;display:flex;overflow:hidden}.vc-gradient-picker .vc-gradient__types .vc-gradient__type[data-v-c4d6d6ea]{color:#666;cursor:pointer;padding:4px 8px;font-size:12px}.vc-gradient-picker .vc-gradient__types .vc-gradient__type.active[data-v-c4d6d6ea]{color:#000;background-color:#c8c8c8cc}.vc-gradient-picker__body[data-v-c4d6d6ea]{align-items:center;margin-bottom:12px;display:flex}.vc-gradient-picker__body .vc-color-range[data-v-c4d6d6ea]{flex:1}.vc-gradient-picker__body .vc-color-range__container[data-v-c4d6d6ea]{border-radius:5px;height:16px;position:relative}.vc-gradient-picker__body .vc-color-range__container .vc-background[data-v-c4d6d6ea]{border-radius:4px;height:100%;box-shadow:inset 0 0 0 1px #0000000f}.vc-gradient-picker__body .vc-color-range__container .vc-gradient__stop__container[data-v-c4d6d6ea]{width:100%;height:100%;position:absolute;top:0;left:0}.vc-gradient-picker__body .vc-color-range__container .vc-gradient__stop__container .vc-gradient__stop[data-v-c4d6d6ea]{cursor:pointer;box-sizing:content-box;border:2px solid #fff;border-radius:2px;width:14px;height:16px;position:absolute;top:-2px;overflow:hidden;transform:translate(-9px);box-shadow:0 0 2px 1px #00000059}.vc-gradient-picker__body .vc-color-range__container .vc-gradient__stop__container .vc-gradient__stop--inner[data-v-c4d6d6ea]{height:100%;display:inline-block}.vc-gradient-picker__body .vc-color-range__container .vc-gradient__stop__container .vc-gradient__stop--current[data-v-c4d6d6ea]{z-index:1;position:relative;box-shadow:0 0 2px 2px #2253f4,0 0 1px 1px #2253f480}.vc-gradient-picker .vc-degree-input[data-v-c4d6d6ea]{z-index:2;border-radius:4px;font-size:12px;display:flex;position:relative}.vc-gradient-picker .vc-degree-input:hover .vc-degree-input__panel[data-v-c4d6d6ea]{display:block}.vc-gradient-picker .vc-degree-input__control[data-v-c4d6d6ea]{color:#666;background-color:#c8c8c840;border-radius:4px;justify-content:center;align-items:center;width:100%;height:100%;padding:0 6px 0 0;display:flex}.vc-gradient-picker .vc-degree-input__control input[data-v-c4d6d6ea]{text-align:center;color:#666;max-width:28px;font-size:inherit;background-color:#0000;border:none;outline:none;overflow:visible}.vc-gradient-picker .vc-degree-input__panel[data-v-c4d6d6ea]{z-index:10;display:none;position:absolute;top:20px;left:0}.vc-gradient-picker .vc-degree-input__panel .vc-degree-input__disk[data-v-c4d6d6ea]{background-color:#f1f1f1;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex;position:relative;transform:translate(0);box-shadow:0 0 2px #00000029,0 1px 8px #0000000f,0 4px 12px #00000014}.vc-gradient-picker .vc-picker-degree-input[data-v-c4d6d6ea]{margin-left:8px}.vc-colorpicker[data-v-0492277d]{box-sizing:border-box;-webkit-user-select:none;user-select:none;z-index:10000;border-radius:3px;width:276px;position:relative;box-shadow:0 0 10px #00000026}.vc-colorpicker [data-v-0492277d]{outline:none;line-height:1}.vc-colorpicker--container[data-v-0492277d]{padding:16px}.vc-colorpicker--tabs[data-v-0492277d]{background:#f6f7f9;border-radius:6px;margin-bottom:12px;padding:2px;position:relative}.vc-colorpicker--tabs__inner[data-v-0492277d]{box-sizing:border-box;background:#f6f7f9;border-bottom:none;justify-content:space-between;padding:0;display:flex;position:relative}.vc-colorpicker--tabs__btn[data-v-0492277d]{z-index:2;color:#636c78;cursor:pointer;border-radius:4px;flex:1;font-size:14px}.vc-colorpicker--tabs__btn.vc-btn-active[data-v-0492277d]{color:#33383e;font-weight:600}.vc-colorpicker--tabs__btn button[data-v-0492277d]{background-color:initial;color:#636c78;cursor:pointer;appearance:none;width:100%;font-size:14px;line-height:20px;font-weight:inherit;border:0;border-radius:0;outline:0;padding:6px 0}.vc-colorpicker--tabs__btn button .vc-btn__content[data-v-0492277d]{white-space:nowrap;position:relative}.vc-colorpicker--tabs__bg[data-v-0492277d]{z-index:1;background:#fff;border-radius:4px;transition:left .2s ease-in-out;position:absolute;top:0;bottom:0;box-shadow:0 1px 4px #0000001f}.vc-colorpicker.black[data-v-0492277d]{color:#fff;background-color:#000}.vc-colorpicker.white[data-v-0492277d]{color:#333;background-color:#fff}.vc-color-wrap[data-v-354ca836]{cursor:pointer;vertical-align:middle;width:50px;height:24px;margin-right:10px;display:inline-block;position:relative;overflow:hidden;box-shadow:3px 0 5px #00000014}.vc-color-wrap.transparent[data-v-354ca836]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);background-repeat:repeat}.vc-color-wrap.round[data-v-354ca836]{border:1px solid #d8d8d8;border-radius:50%;width:22px;height:22px}.vc-color-wrap .current-color[data-v-354ca836]{width:100%;height:100%}.vc-color-extra[data-v-354ca836]{margin-top:10px}.waveform-chart{box-sizing:border-box;color:#475467;background:#fff;border:1.2px solid #00000014;border-radius:6px;min-width:0;min-height:180px;position:relative;overflow:hidden}.waveform-chart--clean{border-color:#0000}.waveform-chart__pagination{z-index:2;position:absolute;bottom:6px;right:10px}.waveform-chart__title-area{background:#fff;align-items:center;width:100%;min-width:0;padding:0 24px;display:flex;position:relative;overflow:hidden}.waveform-chart__title-measure{visibility:hidden;pointer-events:none;display:block;position:absolute}.waveform-chart__title-visual{flex:none;min-width:0;position:relative;overflow:visible}.waveform-chart__title-text{transform-origin:50%;line-height:1.2;display:block;position:absolute;top:50%;left:50%;overflow:visible}.waveform-chart__pagination .ant-pagination-item,.waveform-chart__pagination .ant-pagination-prev .ant-pagination-item-link,.waveform-chart__pagination .ant-pagination-next .ant-pagination-item-link{background:#fff;border-color:#d9d9d9}.waveform-chart__pagination .ant-pagination-item-active{border-color:#1677ff}.waveform-chart__grid-slot-placeholder{fill:#fafbfc;stroke:#e4e7ec;stroke-dasharray:4 4;pointer-events:none}.waveform-chart__svg{max-width:100%;display:block}.waveform-chart__overlay{fill:#0000;cursor:crosshair;touch-action:none}.waveform-chart__overlay.is-zoomable{cursor:crosshair}.waveform-chart--panning .waveform-chart__overlay.is-zoomable{cursor:grabbing}.waveform-chart__zoom-selection{fill:#1677ff24;stroke:#1677ff;stroke-width:1px;pointer-events:none}.waveform-chart__overlay.is-annotating{cursor:crosshair}.waveform-chart--presentation .waveform-chart__overlay{cursor:default;pointer-events:none}.waveform-chart__label,.waveform-chart__empty{fill:#595959;font-size:12px}
2
2
  /*$vite$:1*/
@@ -18,6 +18,13 @@ declare const __VLS_export: import("vue").DefineComponent<WaveformChartProps, {
18
18
  "annotation-update": (annotation: import("..").WaveformAnnotation, previous: import("..").WaveformAnnotation) => any;
19
19
  "annotation-delete": (annotation: import("..").WaveformAnnotation) => any;
20
20
  "page-change": (page: number, pageCount: number) => any;
21
+ "sampling-complete": (diagnostics: import("..").WaveformSamplingDiagnostics) => any;
22
+ "sampling-backend-change": (payload: {
23
+ seriesId: string;
24
+ previous: import("..").WaveformSamplingBackend;
25
+ current: import("..").WaveformSamplingBackend;
26
+ }) => any;
27
+ "sampling-error": (error: import("..").WaveformSamplingError) => any;
21
28
  }, string, import("vue").PublicProps, Readonly<WaveformChartProps> & Readonly<{
22
29
  "onPoint-hover"?: ((point: import("..").WaveformPoint | null) => any) | undefined;
23
30
  "onZoom-change"?: ((domain: [number, number]) => any) | undefined;
@@ -34,6 +41,13 @@ declare const __VLS_export: import("vue").DefineComponent<WaveformChartProps, {
34
41
  "onAnnotation-update"?: ((annotation: import("..").WaveformAnnotation, previous: import("..").WaveformAnnotation) => any) | undefined;
35
42
  "onAnnotation-delete"?: ((annotation: import("..").WaveformAnnotation) => any) | undefined;
36
43
  "onPage-change"?: ((page: number, pageCount: number) => any) | undefined;
44
+ "onSampling-complete"?: ((diagnostics: import("..").WaveformSamplingDiagnostics) => any) | undefined;
45
+ "onSampling-backend-change"?: ((payload: {
46
+ seriesId: string;
47
+ previous: import("..").WaveformSamplingBackend;
48
+ current: import("..").WaveformSamplingBackend;
49
+ }) => any) | undefined;
50
+ "onSampling-error"?: ((error: import("..").WaveformSamplingError) => any) | undefined;
37
51
  }>, {
38
52
  legend: import("..").WaveformLegendOptions;
39
53
  annotations: import("..").WaveformAnnotation[];
@@ -1,4 +1,3 @@
1
- import 'vue3-colorpicker/style.css';
2
1
  import type { WaveformAnnotation } from '../../types';
3
2
  import { type TimeUnit } from '../../utils';
4
3
  import type { AnnotationSeriesCandidate, AnnotationSeriesInfo } from './types';
@@ -1,4 +1,5 @@
1
1
  import type { WaveformAnnotation, WaveformAnnotationStyle, WaveformLineType } from '../../types';
2
+ import { type WaveformPointSource } from '../../core/waveformPointSource';
2
3
  import type { AnnotationHit, AnnotationSeriesCandidate, AnnotationTrackLayout } from './types';
3
4
  export declare const DEFAULT_ANNOTATION_STYLE: {
4
5
  readonly borderColor: "#1677ff";
@@ -18,17 +19,15 @@ export declare const ANNOTATION_TEXT_LINE_HEIGHT = 16;
18
19
  export declare const ANNOTATION_TEXT_GLYPH_HEIGHT = 14;
19
20
  export declare const ANNOTATION_TEXT_FONT = "12px Arial, sans-serif";
20
21
  export declare const ANNOTATION_CONNECTOR_LENGTH = 32;
21
- export declare function findNearestPointByX(points: Array<{
22
+ type PointCollection = Array<{
22
23
  x: number;
23
24
  y: number;
24
- }>, xValue: number): {
25
+ }> | WaveformPointSource;
26
+ export declare function findNearestPointByX(points: PointCollection, xValue: number): {
25
27
  x: number;
26
28
  y: number;
27
29
  } | null;
28
- export declare function interpolateAnnotationPoint(points: Array<{
29
- x: number;
30
- y: number;
31
- }>, xValue: number, lineType?: WaveformLineType): {
30
+ export declare function interpolateAnnotationPoint(points: PointCollection, xValue: number, lineType?: WaveformLineType): {
32
31
  x: number;
33
32
  y: number;
34
33
  } | null;
@@ -1,5 +1,6 @@
1
1
  import type { ScaleLinear } from 'd3';
2
2
  import type { WaveformAnnotation, WaveformLineType, WaveformPoint } from '../../types';
3
+ import type { WaveformPointSource } from '../../core/waveformPointSource';
3
4
  export interface AnnotationTrackLayout {
4
5
  index: number;
5
6
  series: {
@@ -9,6 +10,7 @@ export interface AnnotationTrackLayout {
9
10
  unit?: string;
10
11
  lineType?: WaveformLineType;
11
12
  points: WaveformPoint[];
13
+ source?: WaveformPointSource;
12
14
  };
13
15
  left?: number;
14
16
  top: number;
@@ -0,0 +1,19 @@
1
+ export interface LatestTaskSchedulerMetrics {
2
+ scheduled: number;
3
+ coalesced: number;
4
+ maxPending: number;
5
+ }
6
+ export declare function resolveAutoSelectedMode(visiblePointCount: number, threshold: number, hysteresis: number, previousSelectedMode?: 'raw' | 'sampled'): 'raw' | 'sampled';
7
+ interface ScheduledTask {
8
+ generation: number;
9
+ run: (generation: number) => Promise<void>;
10
+ }
11
+ /** Runs at most one task at a time and retains only the newest pending task. */
12
+ export declare function createLatestTaskScheduler(): {
13
+ schedule(run: ScheduledTask["run"]): number;
14
+ isCurrent(candidate: number): boolean;
15
+ cancelPending(): void;
16
+ dispose(): void;
17
+ metrics: LatestTaskSchedulerMetrics;
18
+ };
19
+ export {};
@@ -15,8 +15,8 @@ export declare function resolveYAxisSeriesGroups(track: DisplayTrack, overlayMod
15
15
  export declare function axisTextMetrics(domain: [number, number], nice?: boolean, tickValues?: number[], unit?: string, tickCount?: number): {
16
16
  tickTextWidth: number;
17
17
  };
18
- export declare function measureYAxisGroupClearance(group: YAxisSeriesGroup, tickCount?: number): number;
19
- export declare function measureTrackYAxisClearance(track: DisplayTrack, overlayMode: WaveformOverlayMode, yDomain?: WaveformYDomain, yDomains?: Record<string, WaveformYDomain>, tickCount?: number): {
18
+ export declare function measureYAxisGroupClearance(group: YAxisSeriesGroup, tickCount?: number, nice?: boolean): number;
19
+ export declare function measureTrackYAxisClearance(track: DisplayTrack, overlayMode: WaveformOverlayMode, yDomain?: WaveformYDomain, yDomains?: Record<string, WaveformYDomain>, tickCount?: number, nice?: boolean): {
20
20
  left: number;
21
21
  right: number;
22
22
  };
@@ -1,6 +1,6 @@
1
1
  import { type ZoomTransform } from 'd3';
2
2
  import { type ResolvedWaveformRenderingOptions } from '../../core/rendering';
3
- import type { WaveformDisplayMode, WaveformOverlayMode, WaveformXDomainStrategy, WaveformXAxisLabelFormatter } from '../../types';
3
+ import type { WaveformDisplayMode, WaveformOverlayMode, WaveformPoint, WaveformXDomainStrategy, WaveformXAxisLabelFormatter } from '../../types';
4
4
  import { type GridCellGeometry, type NormalizedWaveformGridOptions } from './grid';
5
5
  import type { DisplayTrack, TrackLayout } from './types';
6
6
  interface SeriesGridCell extends GridCellGeometry {
@@ -22,7 +22,10 @@ export interface BuildTrackLayoutsOptions {
22
22
  timeUnit: 's' | 'ms';
23
23
  xAxisLabelFormatter?: WaveformXAxisLabelFormatter;
24
24
  yAxisSplitNumber?: number;
25
+ yAxisNice?: boolean;
25
26
  rendering: ResolvedWaveformRenderingOptions;
27
+ /** Latest sampling result for SVG lines only; source series remain complete for interaction. */
28
+ linePointOverrides?: Readonly<Record<string, WaveformPoint[]>>;
26
29
  hideSecondaryLabels: boolean;
27
30
  yAxisLabelX: number;
28
31
  showCompactEmptyTracks: boolean;
@@ -1,5 +1,6 @@
1
1
  import type { ScaleLinear } from 'd3';
2
2
  import type { ResolvedWaveformErrorBarOptions, WaveformLineType, WaveformLineStyle, WaveformPoint, WaveformPointType } from '../../types';
3
+ import type { WaveformPointSource } from '../../core/waveformPointSource';
3
4
  import type { NormalizedWaveformGridLineOptions } from './grid';
4
5
  /**
5
6
  * 显示系列
@@ -16,6 +17,7 @@ export interface DisplaySeries {
16
17
  pointType: WaveformPointType;
17
18
  errorBar: ResolvedWaveformErrorBarOptions;
18
19
  points: WaveformPoint[];
20
+ source?: WaveformPointSource;
19
21
  xDomain: [number, number];
20
22
  yDomain: [number, number];
21
23
  hasErrorPoints: boolean;
@@ -246,6 +246,7 @@ export declare function useWaveformChartController(props: ResolvedWaveformChartP
246
246
  confirmAnnotation: (annotation: import("..").WaveformAnnotation) => void;
247
247
  chartSeries: import("./types").DisplaySeries[];
248
248
  chartTracks: import("./types").DisplayTrack[];
249
+ renderingOptions: import("../..").ResolvedWaveformRenderingOptions;
249
250
  gridOptions: import("./grid").NormalizedWaveformGridOptions;
250
251
  pageCount: number;
251
252
  pagedTracks: import("./types").DisplayTrack[];
@@ -1,3 +1,4 @@
1
+ import { type WaveformPointSource } from '../../core/waveformPointSource';
1
2
  import type { ResolvedWaveformErrorBarOptions, WaveformData, WaveformLineType, WaveformLineStyle, WaveformPoint, WaveformPointType } from '../../types';
2
3
  export interface PreparedWaveformSeries {
3
4
  id: string;
@@ -10,6 +11,7 @@ export interface PreparedWaveformSeries {
10
11
  pointType: WaveformPointType;
11
12
  errorBar: ResolvedWaveformErrorBarOptions;
12
13
  points: WaveformPoint[];
14
+ source: WaveformPointSource;
13
15
  xDomain: [number, number];
14
16
  yDomain: [number, number];
15
17
  hasErrorPoints: boolean;
@@ -18,10 +18,12 @@ interface LayoutContext {
18
18
  sharedYDomains: Ref<Record<string, [number, number]>>;
19
19
  independentYDomains: Ref<Record<number, [number, number]>>;
20
20
  annotationInteraction: ReturnType<typeof useWaveformAnnotationInteraction>;
21
+ linePointOverrides?: ShallowRef<Readonly<Record<string, import('../../types').WaveformPoint[]>>>;
21
22
  }
22
23
  export declare function useWaveformLayout(context: LayoutContext): {
23
24
  chartSeries: ComputedRef<DisplaySeries[]>;
24
25
  chartTracks: ComputedRef<DisplayTrack[]>;
26
+ renderingOptions: ComputedRef<import("../..").ResolvedWaveformRenderingOptions>;
25
27
  gridOptions: ComputedRef<import("./grid").NormalizedWaveformGridOptions>;
26
28
  pageCount: ComputedRef<number>;
27
29
  pagedTracks: ComputedRef<DisplayTrack[]>;
@@ -0,0 +1,19 @@
1
+ import { type ComputedRef, type ShallowRef } from 'vue';
2
+ import type { WaveformPoint } from '../../types';
3
+ import type { ResolvedWaveformRenderingOptions } from '../../core';
4
+ import type { PreparedWaveformSeries } from './useWaveformData';
5
+ import type { TrackLayout } from './types';
6
+ import type { ResolvedWaveformChartProps, WaveformChartEmit } from './waveformChartTypes';
7
+ interface SamplingContext {
8
+ props: ResolvedWaveformChartProps;
9
+ emit: WaveformChartEmit;
10
+ instanceId: string;
11
+ preparedSeries: ShallowRef<PreparedWaveformSeries[]>;
12
+ sourceTrackLayouts: ComputedRef<TrackLayout[]>;
13
+ renderingOptions: ComputedRef<ResolvedWaveformRenderingOptions>;
14
+ linePointOverrides: ShallowRef<Record<string, WaveformPoint[]>>;
15
+ }
16
+ export declare function useWaveformRenderSampling(context: SamplingContext): {
17
+ linePointOverrides: ShallowRef<Record<string, WaveformPoint[]>>;
18
+ };
19
+ export {};
@@ -1,4 +1,4 @@
1
- import type { WaveformAnnotation, WaveformAxesOptions, WaveformData, WaveformDisplayMode, WaveformFrameStyle, WaveformInteractionMode, WaveformLegendOptions, WaveformOverlayMode, WaveformPlotMargin, WaveformPoint, WaveformRenderingOptions, WaveformTitleOptions, WaveformXDomainStrategy, WaveformZeroLineOptions, WaveformZoomEndPayload, WaveformZoomResetPayload } from '../data/types';
1
+ import type { WaveformAnnotation, WaveformAxesOptions, WaveformData, WaveformDisplayMode, WaveformFrameStyle, WaveformInteractionMode, WaveformLegendOptions, WaveformOverlayMode, WaveformPlotMargin, WaveformPoint, WaveformRenderingOptions, WaveformSamplingBackend, WaveformSamplingDiagnostics, WaveformSamplingError, WaveformTitleOptions, WaveformXDomainStrategy, WaveformZeroLineOptions, WaveformZoomEndPayload, WaveformZoomResetPayload } from '../data/types';
2
2
  import type { WaveformGridOptions } from './grid';
3
3
  export interface WaveformChartProps {
4
4
  data: WaveformData;
@@ -55,6 +55,13 @@ export interface WaveformChartEmit {
55
55
  (event: 'annotation-update', annotation: WaveformAnnotation, previous: WaveformAnnotation): void;
56
56
  (event: 'annotation-delete', annotation: WaveformAnnotation): void;
57
57
  (event: 'page-change', page: number, pageCount: number): void;
58
+ (event: 'sampling-complete', diagnostics: WaveformSamplingDiagnostics): void;
59
+ (event: 'sampling-backend-change', payload: {
60
+ seriesId: string;
61
+ previous: WaveformSamplingBackend;
62
+ current: WaveformSamplingBackend;
63
+ }): void;
64
+ (event: 'sampling-error', error: WaveformSamplingError): void;
58
65
  }
59
66
  interface ViewportSelectionBase {
60
67
  trackIndex: number;
@@ -0,0 +1,8 @@
1
+ import type { DatasetResponse, WorkerSamplingRequest, WorkerSamplingResponse } from '../../core/workerSampling';
2
+ export interface WorkerSamplingClient {
3
+ readonly workerFailureReason: string | undefined;
4
+ send(request: WorkerSamplingRequest): Promise<WorkerSamplingResponse>;
5
+ dispose(): void;
6
+ }
7
+ export declare function createWorkerSamplingClient(): WorkerSamplingClient;
8
+ export declare function isDatasetResponse(response: WorkerSamplingResponse): response is DatasetResponse;
@@ -2,6 +2,6 @@
2
2
  * 数据系统类型定义
3
3
  * 重新导出 src/types 中的类型,方便组件内部使用
4
4
  */
5
- export type { WaveformPoint, WaveformDisplayMode, WaveformOverlayMode, WaveformInteractionMode, WaveformXDomainStrategy, WaveformZoomEndPayload, WaveformZoomResetPayload, WaveformAnnotationStyle, WaveformAnnotation, WaveformRenderingOptions, WaveformPlotMargin, WaveformTitleTextStyle, WaveformTitleOptions, WaveformLegendPosition, WaveformLegendOrientation, WaveformLegendOptions, WaveformFrameStyle, WaveformAxesOptions, WaveformZeroLineOptions, SingleWaveformData, WaveformLineType, WaveformLineStyle, WaveformPointType, WaveformErrorBarOptions, ResolvedWaveformErrorBarOptions, WaveformSeries, WaveformData, NormalizedWaveformSeries, } from '../../types';
5
+ export type { WaveformPoint, WaveformDisplayMode, WaveformOverlayMode, WaveformInteractionMode, WaveformXDomainStrategy, WaveformZoomEndPayload, WaveformZoomResetPayload, WaveformAnnotationStyle, WaveformAnnotation, WaveformSamplingMode, WaveformSamplingStrategy, WaveformSamplingOptions, WaveformSamplingBackend, WaveformSamplingDiagnostics, WaveformSamplingError, WaveformRenderingOptions, WaveformPlotMargin, WaveformTitleTextStyle, WaveformTitleOptions, WaveformLegendPosition, WaveformLegendOrientation, WaveformLegendOptions, WaveformFrameStyle, WaveformAxesOptions, WaveformZeroLineOptions, SingleWaveformData, WaveformLineType, WaveformLineStyle, WaveformPointType, WaveformErrorBarOptions, ResolvedWaveformErrorBarOptions, WaveformTypedValues, TypedSampleData, TypedPointData, WaveformSeries, WaveformData, NormalizedWaveformSeries, } from '../../types';
6
6
  export type { WaveformGridOptions, WaveformGridLineOptions, WaveformGridTrackLines, } from '../core/grid';
7
7
  export { normalizeWaveformData, normalizeWaveformSeries } from '../../core';
@@ -1,7 +1,9 @@
1
1
  import { type ZoomTransform } from 'd3';
2
2
  import type { WaveformPoint } from '../../types';
3
+ import { type WaveformPointSource } from '../../core/waveformPointSource';
3
4
  interface PointSeriesSource {
4
5
  points: WaveformPoint[];
6
+ source?: WaveformPointSource;
5
7
  }
6
8
  export type ZoomSeriesGroup = readonly PointSeriesSource[];
7
9
  interface ZoomConstraintOptions {
@@ -2,5 +2,5 @@
2
2
  * 向后兼容的导出文件
3
3
  * 保留原有导入路径,内部从新的模块结构导出
4
4
  */
5
- export type { WaveformPoint, WaveformDisplayMode, WaveformOverlayMode, WaveformInteractionMode, WaveformXDomainStrategy, WaveformAnnotationStyle, WaveformAnnotation, WaveformRenderingOptions, WaveformPlotMargin, WaveformTitleTextStyle, WaveformTitleOptions, WaveformFrameStyle, SingleWaveformData, WaveformSeries, WaveformLineStyle, WaveformData, NormalizedWaveformSeries, } from '../types';
5
+ export type { WaveformPoint, WaveformDisplayMode, WaveformOverlayMode, WaveformInteractionMode, WaveformXDomainStrategy, WaveformAnnotationStyle, WaveformAnnotation, WaveformSamplingMode, WaveformSamplingStrategy, WaveformSamplingOptions, WaveformSamplingBackend, WaveformSamplingDiagnostics, WaveformSamplingError, WaveformRenderingOptions, WaveformPlotMargin, WaveformTitleTextStyle, WaveformTitleOptions, WaveformFrameStyle, SingleWaveformData, WaveformTypedValues, TypedSampleData, TypedPointData, WaveformSeries, WaveformLineStyle, WaveformData, NormalizedWaveformSeries, } from '../types';
6
6
  export { normalizeWaveformData, normalizeWaveformSeries } from '../core';
@@ -0,0 +1,3 @@
1
+ import type { WaveformTypedValues } from '../types';
2
+ import type { WaveformPointSource } from './waveformPointSource';
3
+ export declare function createCompactSamplePointSource(y: WaveformTypedValues, sampleRate: number, startTime: number, sourceIndexes?: Uint32Array): WaveformPointSource;
@@ -1,14 +1,20 @@
1
1
  import type { SingleWaveformData, WaveformData, WaveformPoint, NormalizedWaveformSeries } from '../types';
2
+ import { type WaveformPointSource } from './waveformPointSource';
2
3
  export declare function resolveWaveformPointErrors(point: WaveformPoint): {
3
4
  lower: number;
4
5
  upper: number;
5
6
  };
6
7
  /**
7
8
  * 规范化单波形数据
8
- * @param data 输入数据(samples 或 points 格式)
9
+ * @param data 输入数据(对象数组或 TypedArray 格式)
9
10
  * @returns 规范化后的点数组
10
11
  */
11
12
  export declare function normalizeWaveformData(data: SingleWaveformData): WaveformPoint[];
13
+ export interface NormalizedWaveformSourceSeries extends Omit<NormalizedWaveformSeries, 'points'> {
14
+ source: WaveformPointSource;
15
+ }
16
+ /** Internal normalized series which preserves compact TypedArray storage for chart rendering. */
17
+ export declare function normalizeWaveformSeriesSources(data: WaveformData): NormalizedWaveformSourceSeries[];
12
18
  /**
13
19
  * 规范化波形系列数据
14
20
  * @param data 输入数据(单波形或多通道)
@@ -2,4 +2,5 @@
2
2
  * 核心引擎模块统一导出
3
3
  */
4
4
  export { normalizeWaveformData, normalizeWaveformSeries, resolveWaveformPointErrors } from './data';
5
- export { DEFAULT_WAVEFORM_RENDERING_OPTIONS, resolveWaveformRenderingOptions, selectDecorationPoints, selectRenderablePoints, type ResolvedWaveformRenderingOptions, } from './rendering';
5
+ export { DEFAULT_WAVEFORM_RENDERING_OPTIONS, resolveWaveformRenderingOptions, selectDecorationPoints, selectRenderablePoints, type ResolvedWaveformRenderingOptions, type ResolvedWaveformSamplingOptions, } from './rendering';
6
+ export { calculateWasmRange, findWasmVisibleRange, initializeWasmSampling, sampleWaveformWasm, type WasmRangeMetrics, type WasmSamplingRequest, type WasmSamplingResult, type WasmSamplingStrategy, } from './wasmSampling';
@@ -1,12 +1,14 @@
1
1
  import type { WaveformPoint } from '@/types';
2
2
  import type { ResolvedWaveformRenderingOptions } from './renderingOptions';
3
3
  import { type VisiblePointRange } from './renderingStrategies';
4
- export { DEFAULT_WAVEFORM_RENDERING_OPTIONS, resolveWaveformRenderingOptions, type ResolvedWaveformRenderingOptions, } from './renderingOptions';
4
+ export { DEFAULT_WAVEFORM_RENDERING_OPTIONS, resolveWaveformRenderingOptions, type ResolvedWaveformRenderingOptions, type ResolvedWaveformSamplingOptions, } from './renderingOptions';
5
5
  interface PointSeriesSource {
6
6
  points: WaveformPoint[];
7
7
  }
8
8
  interface SeriesRenderSelectionOptions {
9
9
  lineVisible: boolean;
10
+ /** A current Worker result used only for the SVG line. */
11
+ linePointOverride?: WaveformPoint[];
10
12
  pointVisible: boolean;
11
13
  errorBarVisible: boolean;
12
14
  hasErrorPoints: boolean;
@@ -1,10 +1,20 @@
1
- import type { WaveformRenderingOptions } from '@/types';
1
+ import type { WaveformRenderingOptions, WaveformSamplingMode, WaveformSamplingStrategy } from '@/types';
2
+ export interface ResolvedWaveformSamplingOptions {
3
+ mode: WaveformSamplingMode;
4
+ autoThreshold: number;
5
+ autoHysteresis: number;
6
+ strategy: WaveformSamplingStrategy;
7
+ maxPointsPerPixel: number;
8
+ rawPointLimit: number;
9
+ wasmFailureFallback: 'error' | 'javascript';
10
+ }
2
11
  export interface ResolvedWaveformRenderingOptions {
3
12
  downsample: boolean;
4
13
  downsampleThreshold: number;
5
14
  maxPointsPerPixel: number;
6
15
  pointMinSpacing: number;
7
16
  errorBarMinSpacing: number;
17
+ sampling: ResolvedWaveformSamplingOptions;
8
18
  }
9
19
  export declare const DEFAULT_WAVEFORM_RENDERING_OPTIONS: ResolvedWaveformRenderingOptions;
10
20
  export declare function resolveWaveformRenderingOptions(options?: WaveformRenderingOptions): ResolvedWaveformRenderingOptions;
@@ -0,0 +1,36 @@
1
+ import type { WaveformPoint } from '../types';
2
+ /** Sampling algorithms that can be implemented equivalently by the future WASM core. */
3
+ export type ReferenceSamplingStrategy = 'none' | 'peak' | 'lttb' | 'average' | 'min' | 'max' | 'minmax' | 'sum';
4
+ /**
5
+ * A pure TypeScript reference request. Source indexes in the result address the original
6
+ * `points` array, after filtering non-finite points and applying a stable ascending-X order.
7
+ */
8
+ export interface ReferenceSamplingRequest {
9
+ points: readonly WaveformPoint[];
10
+ strategy: ReferenceSamplingStrategy;
11
+ targetPointCount: number;
12
+ }
13
+ interface ReferenceSamplingResultBase {
14
+ strategy: ReferenceSamplingStrategy;
15
+ inputPointCount: number;
16
+ validPointCount: number;
17
+ }
18
+ /** A result made of real points from the input sequence. */
19
+ export interface SourceIndexSamplingResult extends ReferenceSamplingResultBase {
20
+ kind: 'source-indexes';
21
+ sourceIndexes: Uint32Array;
22
+ }
23
+ /** A result whose points are synthesized from a contiguous source bucket. */
24
+ export interface AggregateSamplingResult extends ReferenceSamplingResultBase {
25
+ kind: 'aggregates';
26
+ x: Float64Array;
27
+ y: Float64Array;
28
+ }
29
+ export type ReferenceSamplingResult = SourceIndexSamplingResult | AggregateSamplingResult;
30
+ /**
31
+ * Samples an immutable point sequence without changing its objects or order. Aggregate X values
32
+ * are the arithmetic mean of each contiguous bucket's X values; extrema ties select the earliest
33
+ * source point. Source-point strategies preserve first and last points whenever the target is 2+.
34
+ */
35
+ export declare function sampleWaveformReference(request: ReferenceSamplingRequest): ReferenceSamplingResult;
36
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { ReferenceSamplingStrategy } from './samplingReference';
2
+ import type { WorkerSamplingOutput } from './workerSampling/protocol';
3
+ /** Numeric JavaScript fallback matching the WASM source-index and aggregate contracts. */
4
+ export declare function sampleWaveformReferenceValues(x: Float64Array, y: Float64Array, strategy: ReferenceSamplingStrategy, targetPointCount: number): WorkerSamplingOutput;
@@ -0,0 +1,17 @@
1
+ import type { WaveformPoint } from '../types';
2
+ import type { ReferenceSamplingStrategy } from './samplingReference';
3
+ /** Stable source data shared by the TypeScript reference and future WASM conformance suites. */
4
+ export declare const REFERENCE_SAMPLING_POINTS: readonly WaveformPoint[];
5
+ export interface SourceIndexSamplingVector {
6
+ strategy: Exclude<ReferenceSamplingStrategy, 'average' | 'sum'>;
7
+ targetPointCount: number;
8
+ expectedSourceIndexes: readonly number[];
9
+ }
10
+ export declare const REFERENCE_SOURCE_INDEX_VECTORS: readonly SourceIndexSamplingVector[];
11
+ export interface AggregateSamplingVector {
12
+ strategy: Extract<ReferenceSamplingStrategy, 'average' | 'sum'>;
13
+ targetPointCount: number;
14
+ expectedX: readonly number[];
15
+ expectedY: readonly number[];
16
+ }
17
+ export declare const REFERENCE_AGGREGATE_VECTORS: readonly AggregateSamplingVector[];
@@ -0,0 +1,48 @@
1
+ import type { InitInput } from '../../wasm/pkg/waveform_sampling_wasm';
2
+ import type { ReferenceSamplingStrategy } from './samplingReference';
3
+ import type { WorkerSamplingBackend, WorkerSamplingOutput } from './workerSampling/protocol';
4
+ export type WasmSamplingStrategy = ReferenceSamplingStrategy;
5
+ export interface WasmSamplingRequest {
6
+ x: Float64Array;
7
+ y: Float64Array;
8
+ strategy: WasmSamplingStrategy;
9
+ targetPointCount: number;
10
+ }
11
+ export interface WasmSourceIndexSamplingResult {
12
+ kind: 'source-indexes';
13
+ sourceIndexes: Uint32Array;
14
+ }
15
+ export interface WasmAggregateSamplingResult {
16
+ kind: 'aggregates';
17
+ x: Float64Array;
18
+ y: Float64Array;
19
+ }
20
+ export type WasmSamplingResult = WasmSourceIndexSamplingResult | WasmAggregateSamplingResult;
21
+ export interface WasmDatasetSamplingBackend extends WorkerSamplingBackend {
22
+ registerDataset(x: Float64Array, y: Float64Array, indexMaxBytes?: number): number;
23
+ registerSamples(y: Float64Array, sourceIndexes: Uint32Array | undefined, startTime: number, sampleRate: number, indexMaxBytes?: number): number;
24
+ disposeDataset(handle: number): void;
25
+ disposeAllDatasets(): void;
26
+ datasetIndexBytes(handle: number): number;
27
+ sampleDataset(handle: number, start: number, end: number, strategy: WasmSamplingStrategy, targetPointCount: number): WorkerSamplingOutput;
28
+ }
29
+ export interface WasmRangeMetrics {
30
+ x: [number, number];
31
+ y: [number, number];
32
+ }
33
+ /** Initializes the bundled WebAssembly module once for the current JavaScript realm. */
34
+ export declare function initializeWasmSampling(input?: InitInput | Promise<InitInput>): Promise<void>;
35
+ /**
36
+ * Runs the pure numeric sampler on flat Float64Array coordinates. The caller owns source-data
37
+ * normalization and receives either original input indexes or newly allocated aggregate arrays.
38
+ */
39
+ export declare function sampleWaveformWasm(request: WasmSamplingRequest): Promise<WasmSamplingResult>;
40
+ /**
41
+ * Creates the synchronous backend used only after this realm has finished WASM initialization.
42
+ * Worker code calls `initializeWasmSampling` before exposing this backend to its repository.
43
+ */
44
+ export declare function createInitializedWasmSamplingBackend(): WasmDatasetSamplingBackend;
45
+ /** Calculates domains from valid points without changing the input arrays. */
46
+ export declare function calculateWasmRange(x: Float64Array, y: Float64Array): Promise<WasmRangeMetrics | undefined>;
47
+ /** Locates a half-open visible range in the filtered, stable ascending-X point sequence. */
48
+ export declare function findWasmVisibleRange(x: Float64Array, y: Float64Array, domain: [number, number]): Promise<[number, number]>;