velo-plot 3.1.0 → 4.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChartCore-AnR_3Xkb.js → ChartCore-KYG2HTcK.js} +1349 -1213
- package/dist/ChartCore-KYG2HTcK.js.map +1 -0
- package/dist/{PluginRegistry-CzMHebYP.js → PluginRegistry-CDf_jcnp.js} +2 -2
- package/dist/{PluginRegistry-CzMHebYP.js.map → PluginRegistry-CDf_jcnp.js.map} +1 -1
- package/dist/SVGDocumentBuilder-C-uLkcFW.js +83 -0
- package/dist/SVGDocumentBuilder-C-uLkcFW.js.map +1 -0
- package/dist/angular-hooks.js +1 -1
- package/dist/angular.js +4 -4
- package/dist/{chartSyncBridge-D_rCtbFq.js → chartSyncBridge-C1uRy0ZS.js} +3 -3
- package/dist/{chartSyncBridge-D_rCtbFq.js.map → chartSyncBridge-C1uRy0ZS.js.map} +1 -1
- package/dist/core/chart/ChartCore.d.ts +7 -3
- package/dist/core/chart/ChartRenderLoop.d.ts +5 -0
- package/dist/core/chart/ChartRenderer.d.ts +9 -0
- package/dist/core/chart/ChartSetup.d.ts +1 -0
- package/dist/core/chart/exporter/SVGExporter.d.ts +9 -7
- package/dist/core/chart/exporter/svg/SVGDocumentBuilder.d.ts +27 -0
- package/dist/core/chart/exporter/svg/SVGExportContext.d.ts +147 -0
- package/dist/core/chart/exporter/svg/SVGOrchestrator.d.ts +3 -0
- package/dist/core/chart/exporter/svg/SVGThemeAdapter.d.ts +22 -0
- package/dist/core/chart/exporter/svg/__tests__/testFixtures.d.ts +46 -0
- package/dist/core/chart/exporter/svg/__tests__/visualTestUtils.d.ts +12 -0
- package/dist/core/chart/exporter/svg/overlay/axes.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/border.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/errorBars.d.ts +7 -0
- package/dist/core/chart/exporter/svg/overlay/grid.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/index.d.ts +12 -0
- package/dist/core/chart/exporter/svg/overlay/legend.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/pluginCharts.d.ts +6 -0
- package/dist/core/chart/exporter/svg/overlay/polarGrid.d.ts +4 -0
- package/dist/core/chart/exporter/svg/overlay/specialChart.d.ts +15 -0
- package/dist/core/chart/exporter/svg/overlay/title.d.ts +4 -0
- package/dist/core/chart/exporter/svg/plugins/annotations.d.ts +5 -0
- package/dist/core/chart/exporter/svg/plugins/brokenAxis.d.ts +20 -0
- package/dist/core/chart/exporter/svg/plugins/latex.d.ts +9 -0
- package/dist/core/chart/exporter/svg/plugins/register.d.ts +8 -0
- package/dist/core/chart/exporter/svg/plugins/regression.d.ts +33 -0
- package/dist/core/chart/exporter/svg/plugins/roi.d.ts +12 -0
- package/dist/core/chart/exporter/svg/plugins/tradeMarkers.d.ts +3 -0
- package/dist/core/chart/exporter/svg/plugins/types.d.ts +28 -0
- package/dist/core/chart/exporter/svg/plugins/watermark.d.ts +13 -0
- package/dist/core/chart/exporter/svg/series/band.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/bar.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/boxplot.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/candlestick.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/finitePoints.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/gauge.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/heatmap.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/indicator.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/line.d.ts +12 -0
- package/dist/core/chart/exporter/svg/series/polar.d.ts +6 -0
- package/dist/core/chart/exporter/svg/series/radar.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/registry.d.ts +10 -0
- package/dist/core/chart/exporter/svg/series/sankey.d.ts +5 -0
- package/dist/core/chart/exporter/svg/series/scatter.d.ts +1 -0
- package/dist/core/chart/exporter/svg/series/ternary.d.ts +7 -0
- package/dist/core/chart/exporter/svg/series/waterfall.d.ts +6 -0
- package/dist/core/chart/exporter/svg/seriesAtTimestamp.d.ts +4 -0
- package/dist/core/chart/exporter/svg/seriesUtils.d.ts +3 -0
- package/dist/core/chart/exporter/svg/symbols.d.ts +5 -0
- package/dist/core/chart/exporter/svg/tickUtils.d.ts +9 -0
- package/dist/core/chart/mountSVGString.d.ts +5 -0
- package/dist/core/chart/types.d.ts +2 -2
- package/dist/core/stacked/StackSVGComposer.d.ts +14 -0
- package/dist/core/stacked/index.d.ts +3 -2
- package/dist/core/stacked/types.d.ts +12 -4
- package/dist/createStackedChart-DjA3aJAu.js +2761 -0
- package/dist/createStackedChart-DjA3aJAu.js.map +1 -0
- package/dist/{hooks-DH-3bewj.js → hooks-4wQH27r9.js} +3 -3
- package/dist/{hooks-DH-3bewj.js.map → hooks-4wQH27r9.js.map} +1 -1
- package/dist/index-Bj-xyXY6.js +582 -0
- package/dist/index-Bj-xyXY6.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +5 -0
- package/dist/plugins/annotations.js +8 -7
- package/dist/plugins/annotations.js.map +1 -1
- package/dist/plugins/broken-axis.js +198 -152
- package/dist/plugins/broken-axis.js.map +1 -1
- package/dist/plugins/forecasting.js +273 -258
- package/dist/plugins/forecasting.js.map +1 -1
- package/dist/plugins/ml-integration.js +107 -93
- package/dist/plugins/ml-integration.js.map +1 -1
- package/dist/plugins/radar/types.d.ts +11 -0
- package/dist/plugins/radar.js +64 -53
- package/dist/plugins/radar.js.map +1 -1
- package/dist/plugins/roi/index.d.ts +2 -0
- package/dist/plugins/roi.js +184 -145
- package/dist/plugins/roi.js.map +1 -1
- package/dist/plugins/snapshot.js +20 -15
- package/dist/plugins/snapshot.js.map +1 -1
- package/dist/plugins/types.d.ts +4 -0
- package/dist/react.js +2 -2
- package/dist/regression-HNdyk1Dm.js +28 -0
- package/dist/regression-HNdyk1Dm.js.map +1 -0
- package/dist/renderer/ChartSeriesRenderer.d.ts +3 -2
- package/dist/renderer/SVGChartRenderer.d.ts +15 -0
- package/dist/renderer/SankeyRenderer.d.ts +1 -0
- package/dist/renderer/registerSVG.d.ts +5 -0
- package/dist/renderer/sankeyLayout.d.ts +29 -0
- package/dist/scientific.js +2 -2
- package/dist/solid.js +2 -2
- package/dist/svelte.js +2 -2
- package/dist/tickUtils-B_X-ha13.js +41 -0
- package/dist/tickUtils-B_X-ha13.js.map +1 -0
- package/dist/trading.js +3 -3
- package/dist/types.d.ts +2 -1
- package/dist/velo-plot.full.js +1107 -1292
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +2 -2
- package/dist/vue/VeloPlot.vue.d.ts +1 -1
- package/dist/vue/index.d.ts +33 -33
- package/dist/vue.js +2 -2
- package/package.json +6 -1
- package/dist/ChartCore-AnR_3Xkb.js.map +0 -1
- package/dist/createStackedChart-DqcLCFGS.js +0 -1338
- package/dist/createStackedChart-DqcLCFGS.js.map +0 -1
- package/dist/index-Cv6ZDLWf.js +0 -521
- package/dist/index-Cv6ZDLWf.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broken-axis.js","sources":["../../src/plugins/broken-axis/BrokenAxisScale.ts","../../src/plugins/broken-axis/index.ts"],"sourcesContent":["import type { Scale } from \"../../scales\";\nimport type { AxisBreak } from \"./types\";\n\nexport class BrokenAxisScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\"; // Compatible with linear for renderer selection\n\n private underlying: Scale;\n private sortedBreaks: AxisBreak[] = [];\n private visibleRanges: { start: number; end: number; pixelOffset: number; pixelScale: number }[] = [];\n private availableVisualRatio: number = 1.0;\n\n constructor(originalScale: Scale, private breaks: AxisBreak[]) {\n this.underlying = originalScale;\n this.domain = [...originalScale.domain];\n this.range = [...originalScale.range];\n this.refresh();\n }\n\n setDomain(min: number, max: number): void {\n this.domain = [min, max];\n this.underlying.setDomain(min, max);\n this.refresh();\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n this.underlying.setRange(min, max);\n this.refresh();\n }\n\n updateBreaks(breaks: AxisBreak[]) {\n this.breaks = breaks;\n this.refresh();\n }\n\n private refresh() {\n const [min, max] = this.domain;\n \n // 1. Sort and filter breaks within [min, max]\n this.sortedBreaks = this.breaks\n .filter(b => b.start < max && b.end > min)\n .map(b => ({\n ...b,\n start: Math.max(min, b.start),\n end: Math.min(max, b.end),\n visualRatio: b.visualRatio ?? 0.02\n }))\n .sort((a, b) => a.start - b.start);\n\n // 2. Identify visible data segments\n const segments: { start: number; end: number }[] = [];\n let current = min;\n\n for (const b of this.sortedBreaks) {\n if (b.start > current) {\n segments.push({ start: current, end: b.start });\n }\n current = b.end;\n }\n if (current < max) {\n segments.push({ start: current, end: max });\n }\n\n // 3. Calculate total data span of visible segments\n const totalVisibleDataWidth = segments.reduce((sum, s) => sum + (s.end - s.start), 0) || 1e-10;\n const totalBreakVisualRatio = this.sortedBreaks.reduce((sum, b) => sum + (b.visualRatio || 0.02), 0);\n this.availableVisualRatio = Math.max(0.1, 1.0 - totalBreakVisualRatio);\n\n // 4. Calculate mapping for each segment (in 0-1 ratio space)\n let currentRatioOffset = 0;\n this.visibleRanges = segments.map(s => {\n const dataWidth = s.end - s.start;\n const visualWidth = (dataWidth / totalVisibleDataWidth) * this.availableVisualRatio;\n const range = {\n start: s.start,\n end: s.end,\n pixelOffset: currentRatioOffset,\n pixelScale: visualWidth / dataWidth\n };\n \n // Find following break if any to advance offset\n const nextBreak = this.sortedBreaks.find(b => Math.abs(b.start - s.end) < 1e-10);\n currentRatioOffset += visualWidth + (nextBreak?.visualRatio ?? 0);\n \n return range;\n });\n }\n\n transform(value: number): number {\n const [min, max] = this.domain;\n const [r0, r1] = this.range;\n const isReverse = r1 < r0;\n \n let ratio = 0;\n if (value <= min) ratio = 0;\n else if (value >= max) ratio = 1;\n else {\n let found = false;\n // Check visible segments\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n ratio = range.pixelOffset + (value - range.start) * range.pixelScale;\n found = true;\n break;\n }\n }\n \n // If in break\n if (!found) {\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n ratio = offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n found = true;\n break;\n }\n }\n }\n \n if (!found) ratio = 0;\n }\n\n // Map ratio to pixels\n return isReverse ? r0 - ratio * (r0 - r1) : r0 + ratio * (r1 - r0);\n }\n\n /** Map data value to 0-1 ratio space (handles breaks) */\n mapToRatio(value: number): number {\n const [min, max] = this.domain;\n if (value <= min) return 0;\n if (value >= max) return 1;\n\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n return range.pixelOffset + (value - range.start) * range.pixelScale;\n }\n }\n\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n return offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n }\n }\n\n return 0;\n }\n\n invert(pixel: number): number {\n const [r0, r1] = this.range;\n const ratio = (pixel - r0) / (r1 - r0);\n \n const r = Math.max(0, Math.min(1, ratio));\n\n for (const range of this.visibleRanges) {\n const visualEnd = range.pixelOffset + (range.end - range.start) * range.pixelScale;\n if (r >= range.pixelOffset && r <= visualEnd) {\n return range.start + (r - range.pixelOffset) / range.pixelScale;\n }\n }\n\n // In break, return nearest segment boundary\n for (let i = 0; i < this.sortedBreaks.length; i++) {\n const b = this.sortedBreaks[i];\n const prevRange = this.visibleRanges.find(range => Math.abs(range.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n if (r >= offset && r <= offset + (b.visualRatio ?? 0.02)) {\n return b.start;\n }\n }\n\n return this.domain[0];\n }\n\n ticks(count: number = 10): number[] {\n // Generate ticks for each visible segment based on their visual weight\n const allTicks: number[] = [];\n \n for (const range of this.visibleRanges) {\n const visualWeight = (range.end - range.start) / (this.domain[1] - this.domain[0]);\n const segmentCount = Math.max(2, Math.round(count * visualWeight / this.availableVisualRatio));\n \n // Use underlying logic for \"nice\" steps but restricted to this range\n const segmentTicks = this.generateSegmentTicks(range.start, range.end, segmentCount);\n allTicks.push(...segmentTicks);\n }\n\n // Remove duplicates and sort\n return Array.from(new Set(allTicks)).sort((a, b) => a - b);\n }\n\n private generateSegmentTicks(min: number, max: number, count: number): number[] {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return [];\n \n // Re-use niceStep logic\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n let step: number;\n if (normalized < 1.5) step = 1; else if (normalized < 3) step = 2; else if (normalized < 7) step = 5; else step = 10;\n step *= magnitude;\n\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n let t = start;\n while (t <= max + step * 0.1) {\n ticks.push(Math.round(t * 1e12) / 1e12);\n t += step;\n }\n return ticks;\n }\n}\n","/**\n * @fileoverview Broken Axis plugin for displaying discontinuous data ranges.\n * @module plugins/broken-axis\n */\n\nimport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\nimport { BrokenAxisScale } from './BrokenAxisScale';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-broken-axis',\n version: '1.0.1',\n description: 'Support for gaps/breaks in axes with visual indicators',\n provides: ['broken-axis', 'coordinate-transform'],\n tags: ['axis', 'layout', 'visualization'],\n};\n\nexport function PluginBrokenAxis(\n config: PluginBrokenAxisConfig = { axes: {} }\n): ChartPlugin<PluginBrokenAxisConfig> {\n // Default enabled to true if not specified\n if (config.enabled === undefined) config.enabled = true;\n \n let ctx: PluginContext | null = null;\n let originalXScale: any = null;\n let brokenXScale: BrokenAxisScale | null = null;\n\n // Storage for raw (un-warped) data of series to allow re-transformation.\n const rawDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n /** Union X-extent across all stored series — the domain breaks live in. */\n function computeWarpDomain(): [number, number] | null {\n let min = Infinity;\n let max = -Infinity;\n for (const raw of rawDataStore.values()) {\n for (let i = 0; i < raw.x.length; i++) {\n const v = raw.x[i];\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) return null;\n return [min, max];\n }\n\n function updateScales() {\n if (!ctx || !config.enabled) return;\n\n const options = config.axes.default || config.axes.xAxis;\n if (options && brokenXScale) {\n brokenXScale.updateBreaks(options.breaks);\n // On break change, we must re-transform everything\n applyTransformations({ syncView: true });\n }\n }\n\n /**\n * Re-warp every stored series into compressed (broken) space using the\n * data-derived warp domain, then align the chart's X view to that domain so\n * the axis ticks and break symbols (which the render pass computes from\n * viewBounds) line up with the warped data.\n */\n function applyTransformations(opts: { syncView?: boolean } = {}) {\n if (!ctx || !brokenXScale || !config.enabled) return;\n const chart = ctx.chart as any;\n\n const domain = computeWarpDomain();\n if (!domain) return;\n const [min, max] = domain;\n const range = max - min || 1;\n\n // Pin the scale to the warp domain so mapToRatio uses the correct segments,\n // independent of whatever sub-range the last render/zoom left behind.\n brokenXScale.setDomain(min, max);\n\n for (const [id, raw] of rawDataStore.entries()) {\n const transformedX = new Float32Array(raw.x.length);\n for (let i = 0; i < raw.x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(raw.x[i]) * range;\n }\n // Call the TRUE underlying updateSeries to avoid the hijacking loop.\n if (chart._originalUpdateSeries) {\n chart._originalUpdateSeries(id, { x: transformedX, y: raw.y });\n }\n }\n\n if (opts.syncView && typeof chart.zoom === 'function') {\n // Constrain X to the warped data domain (warped values also span\n // [min,max]). Y is left untouched so the caller's Y range is preserved.\n chart.zoom({ x: [min, max], animate: false });\n }\n }\n\n function drawBreakSymbols(pCtx: PluginContext) {\n const { render } = pCtx;\n const { ctx2d, plotArea } = render;\n if (!ctx2d || !brokenXScale) return;\n\n for (const [axisId, options] of Object.entries(config.axes)) {\n const orientation = (axisId === 'default' || axisId === 'xAxis') ? 'horizontal' : 'vertical';\n if (orientation !== 'horizontal') continue;\n\n options.breaks.forEach(b => {\n const pxStart = brokenXScale!.transform(b.start);\n const pxEnd = brokenXScale!.transform(b.end);\n const midPx = (pxStart + pxEnd) / 2;\n // Per-break symbol takes precedence, then the axis default.\n const symbol = b.symbol || options.defaultSymbol || 'diagonal';\n\n ctx2d.save();\n ctx2d.lineWidth = 1.5;\n ctx2d.strokeStyle = options.symbolColor || '#ff00ff';\n\n if (orientation === 'horizontal') {\n drawSymbol(ctx2d, midPx, plotArea.y, symbol, 'top');\n drawSymbol(ctx2d, midPx, plotArea.y + plotArea.height, symbol, 'bottom');\n }\n ctx2d.restore();\n });\n }\n }\n\n function drawSymbol(ctx: CanvasRenderingContext2D, x: number, y: number, type: string, edge: string) {\n const size = 6;\n ctx.beginPath();\n if (type === 'diagonal') {\n ctx.moveTo(x - size, y + size/2);\n ctx.lineTo(x + size, y - size/2);\n ctx.moveTo(x - size + 3, y + size/2);\n ctx.lineTo(x + size + 3, y - size/2);\n } else if (type === 'zigzag') {\n ctx.moveTo(x - size, y);\n ctx.lineTo(x - size/2, y - size/2);\n ctx.lineTo(x + size/2, y + size/2);\n ctx.lineTo(x + size, y);\n } else {\n if (edge === 'top' || edge === 'bottom') {\n ctx.moveTo(x - size, y - 2); ctx.lineTo(x + size, y + 2);\n ctx.moveTo(x - size, y - 6); ctx.lineTo(x + size, y - 2);\n } else {\n ctx.moveTo(x - 2, y - size); ctx.lineTo(x + 2, y + size);\n }\n }\n ctx.stroke();\n }\n\n const api: BrokenAxisAPI = {\n addBreak(axisId, b) {\n if (!config.axes[axisId]) config.axes[axisId] = { breaks: [] };\n config.axes[axisId].breaks.push(b);\n updateScales();\n ctx?.requestRender();\n },\n clearBreaks(axisId) {\n if (config.axes[axisId]) config.axes[axisId].breaks = [];\n updateScales();\n ctx?.requestRender();\n },\n setEnabled(enabled: boolean) {\n const wasEnabled = config.enabled;\n config.enabled = enabled;\n \n if (ctx && wasEnabled !== enabled) {\n const chart = ctx.chart;\n if (enabled) {\n originalXScale = (chart as any).xScale;\n brokenXScale = new BrokenAxisScale(originalXScale, (config.axes.default || config.axes.xAxis)?.breaks || []);\n chart.setXScale(brokenXScale);\n applyTransformations({ syncView: true });\n } else {\n if (originalXScale) {\n chart.setXScale(originalXScale);\n brokenXScale = null;\n // Restore original data to series\n for (const [id, raw] of rawDataStore.entries()) {\n (chart as any)._originalUpdateSeries(id, raw);\n }\n }\n }\n }\n ctx?.requestRender();\n },\n getBreaks(axisId: string): AxisBreak[] {\n return config.axes[axisId]?.breaks || [];\n },\n updateConfig(newConfig: Partial<PluginBrokenAxisConfig>) {\n Object.assign(config, newConfig);\n updateScales();\n ctx?.requestRender();\n }\n };\n\n const pluginApi: BrokenAxisAPI & Record<string, unknown> = api as any;\n\n return {\n manifest,\n onInit(pCtx) {\n ctx = pCtx;\n const chart = ctx.chart as any;\n // NOTE: `chart.brokenAxis` is a read-only getter on ChartCore that resolves\n // this plugin's `api` via the plugin bridge — do NOT assign to it (that\n // throws \"Cannot set property ... which has only a getter\" and aborts\n // plugin registration entirely).\n\n // Hijack and Save original methods\n chart._originalUpdateSeries = chart.updateSeries.bind(chart);\n chart._originalAddSeries = chart.addSeries.bind(chart);\n chart._originalAppendData = chart.appendData.bind(chart);\n\n const toF32 = (v: any): Float32Array =>\n v instanceof Float32Array ? v : new Float32Array(typeof v === 'number' ? [v] : v);\n\n chart.updateSeries = (id: string, data: any) => {\n if (data.x && data.y) {\n rawDataStore.set(id, { x: toF32(data.x), y: toF32(data.y) });\n }\n\n if (config.enabled && brokenXScale && data.x) {\n // Re-warp all series against the (possibly grown) data domain.\n applyTransformations({ syncView: true });\n } else {\n chart._originalUpdateSeries(id, data);\n }\n };\n\n chart.addSeries = (options: any) => {\n if (options.id && options.data?.x && options.data?.y) {\n rawDataStore.set(options.id, { x: toF32(options.data.x), y: toF32(options.data.y) });\n }\n\n if (config.enabled && brokenXScale && options.data?.x) {\n // Add the series (untransformed) so the chart registers it, then\n // warp every series consistently against the data-derived domain.\n chart._originalAddSeries(options);\n applyTransformations({ syncView: true });\n } else {\n chart._originalAddSeries(options);\n }\n };\n\n chart.appendData = (id: string, x: any, y: any) => {\n const raw = rawDataStore.get(id);\n if (raw) {\n const newX = toF32(x);\n const newY = toF32(y);\n const combinedX = new Float32Array(raw.x.length + newX.length);\n const combinedY = new Float32Array(raw.y.length + newY.length);\n combinedX.set(raw.x);\n combinedX.set(newX, raw.x.length);\n combinedY.set(raw.y);\n combinedY.set(newY, raw.y.length);\n rawDataStore.set(id, { x: combinedX, y: combinedY });\n }\n\n if (config.enabled && brokenXScale) {\n applyTransformations({ syncView: true });\n } else {\n chart._originalAppendData(id, x, y);\n }\n };\n\n if (config.enabled) {\n originalXScale = chart.xScale; \n const options = config.axes.default || config.axes.xAxis;\n brokenXScale = new BrokenAxisScale(originalXScale, options?.breaks || []);\n chart.setXScale(brokenXScale);\n }\n },\n onDestroy() {\n if (ctx) {\n const chart = (ctx.chart as any);\n if (originalXScale) {\n chart.setXScale(originalXScale);\n }\n // CLEANUP hijacked methods\n chart.updateSeries = chart._originalUpdateSeries;\n chart.addSeries = chart._originalAddSeries;\n chart.appendData = chart._originalAppendData;\n delete chart._originalUpdateSeries;\n delete chart._originalAddSeries;\n delete chart._originalAppendData;\n }\n ctx = null;\n rawDataStore.clear();\n },\n onRenderOverlay(pCtx) {\n if (config.enabled) drawBreakSymbols(pCtx);\n },\n onViewChange() {\n // Data is warped once against the fixed data-domain; a user zoom/pan is\n // just a linear view over the already-warped buffers, so we must NOT\n // re-warp here (doing so against the transient view domain is exactly\n // what collapsed the chart before). Nothing to do.\n },\n api: pluginApi\n };\n}\n\nexport default PluginBrokenAxis;\n\nexport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n BrokenAxisOptions,\n} from './types';\n"],"names":["BrokenAxisScale","originalScale","breaks","__publicField","min","max","b","a","segments","current","totalVisibleDataWidth","sum","s","totalBreakVisualRatio","currentRatioOffset","dataWidth","visualWidth","range","nextBreak","value","r0","r1","isReverse","ratio","found","prevRange","r","pixel","visualEnd","i","offset","count","allTicks","visualWeight","segmentCount","segmentTicks","rawStep","magnitude","normalized","step","start","ticks","t","manifest","PluginBrokenAxis","config","ctx","originalXScale","brokenXScale","rawDataStore","computeWarpDomain","raw","v","updateScales","options","applyTransformations","opts","chart","domain","id","transformedX","drawBreakSymbols","pCtx","render","ctx2d","plotArea","axisId","orientation","pxStart","pxEnd","midPx","symbol","drawSymbol","x","y","type","edge","toF32","data","_a","_b","_c","newX","newY","combinedX","combinedY","enabled","wasEnabled","newConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"broken-axis.js","sources":["../../src/plugins/broken-axis/BrokenAxisScale.ts","../../src/core/chart/exporter/svg/plugins/brokenAxis.ts","../../src/plugins/broken-axis/index.ts"],"sourcesContent":["import type { Scale } from \"../../scales\";\nimport type { AxisBreak } from \"./types\";\n\nexport class BrokenAxisScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\"; // Compatible with linear for renderer selection\n\n private underlying: Scale;\n private sortedBreaks: AxisBreak[] = [];\n private visibleRanges: { start: number; end: number; pixelOffset: number; pixelScale: number }[] = [];\n private availableVisualRatio: number = 1.0;\n\n constructor(originalScale: Scale, private breaks: AxisBreak[]) {\n this.underlying = originalScale;\n this.domain = [...originalScale.domain];\n this.range = [...originalScale.range];\n this.refresh();\n }\n\n setDomain(min: number, max: number): void {\n this.domain = [min, max];\n this.underlying.setDomain(min, max);\n this.refresh();\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n this.underlying.setRange(min, max);\n this.refresh();\n }\n\n updateBreaks(breaks: AxisBreak[]) {\n this.breaks = breaks;\n this.refresh();\n }\n\n private refresh() {\n const [min, max] = this.domain;\n \n // 1. Sort and filter breaks within [min, max]\n this.sortedBreaks = this.breaks\n .filter(b => b.start < max && b.end > min)\n .map(b => ({\n ...b,\n start: Math.max(min, b.start),\n end: Math.min(max, b.end),\n visualRatio: b.visualRatio ?? 0.02\n }))\n .sort((a, b) => a.start - b.start);\n\n // 2. Identify visible data segments\n const segments: { start: number; end: number }[] = [];\n let current = min;\n\n for (const b of this.sortedBreaks) {\n if (b.start > current) {\n segments.push({ start: current, end: b.start });\n }\n current = b.end;\n }\n if (current < max) {\n segments.push({ start: current, end: max });\n }\n\n // 3. Calculate total data span of visible segments\n const totalVisibleDataWidth = segments.reduce((sum, s) => sum + (s.end - s.start), 0) || 1e-10;\n const totalBreakVisualRatio = this.sortedBreaks.reduce((sum, b) => sum + (b.visualRatio || 0.02), 0);\n this.availableVisualRatio = Math.max(0.1, 1.0 - totalBreakVisualRatio);\n\n // 4. Calculate mapping for each segment (in 0-1 ratio space)\n let currentRatioOffset = 0;\n this.visibleRanges = segments.map(s => {\n const dataWidth = s.end - s.start;\n const visualWidth = (dataWidth / totalVisibleDataWidth) * this.availableVisualRatio;\n const range = {\n start: s.start,\n end: s.end,\n pixelOffset: currentRatioOffset,\n pixelScale: visualWidth / dataWidth\n };\n \n // Find following break if any to advance offset\n const nextBreak = this.sortedBreaks.find(b => Math.abs(b.start - s.end) < 1e-10);\n currentRatioOffset += visualWidth + (nextBreak?.visualRatio ?? 0);\n \n return range;\n });\n }\n\n transform(value: number): number {\n const [min, max] = this.domain;\n const [r0, r1] = this.range;\n const isReverse = r1 < r0;\n \n let ratio = 0;\n if (value <= min) ratio = 0;\n else if (value >= max) ratio = 1;\n else {\n let found = false;\n // Check visible segments\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n ratio = range.pixelOffset + (value - range.start) * range.pixelScale;\n found = true;\n break;\n }\n }\n \n // If in break\n if (!found) {\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n ratio = offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n found = true;\n break;\n }\n }\n }\n \n if (!found) ratio = 0;\n }\n\n // Map ratio to pixels\n return isReverse ? r0 - ratio * (r0 - r1) : r0 + ratio * (r1 - r0);\n }\n\n /** Map data value to 0-1 ratio space (handles breaks) */\n mapToRatio(value: number): number {\n const [min, max] = this.domain;\n if (value <= min) return 0;\n if (value >= max) return 1;\n\n for (const range of this.visibleRanges) {\n if (value >= range.start && value <= range.end) {\n return range.pixelOffset + (value - range.start) * range.pixelScale;\n }\n }\n\n for (const b of this.sortedBreaks) {\n if (value >= b.start && value <= b.end) {\n const prevRange = this.visibleRanges.find(r => Math.abs(r.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n return offset + (value - b.start) / (b.end - b.start) * (b.visualRatio ?? 0.02);\n }\n }\n\n return 0;\n }\n\n invert(pixel: number): number {\n const [r0, r1] = this.range;\n const ratio = (pixel - r0) / (r1 - r0);\n \n const r = Math.max(0, Math.min(1, ratio));\n\n for (const range of this.visibleRanges) {\n const visualEnd = range.pixelOffset + (range.end - range.start) * range.pixelScale;\n if (r >= range.pixelOffset && r <= visualEnd) {\n return range.start + (r - range.pixelOffset) / range.pixelScale;\n }\n }\n\n // In break, return nearest segment boundary\n for (let i = 0; i < this.sortedBreaks.length; i++) {\n const b = this.sortedBreaks[i];\n const prevRange = this.visibleRanges.find(range => Math.abs(range.end - b.start) < 1e-10);\n const offset = prevRange ? prevRange.pixelOffset + (prevRange.end - prevRange.start) * prevRange.pixelScale : 0;\n if (r >= offset && r <= offset + (b.visualRatio ?? 0.02)) {\n return b.start;\n }\n }\n\n return this.domain[0];\n }\n\n ticks(count: number = 10): number[] {\n // Generate ticks for each visible segment based on their visual weight\n const allTicks: number[] = [];\n \n for (const range of this.visibleRanges) {\n const visualWeight = (range.end - range.start) / (this.domain[1] - this.domain[0]);\n const segmentCount = Math.max(2, Math.round(count * visualWeight / this.availableVisualRatio));\n \n // Use underlying logic for \"nice\" steps but restricted to this range\n const segmentTicks = this.generateSegmentTicks(range.start, range.end, segmentCount);\n allTicks.push(...segmentTicks);\n }\n\n // Remove duplicates and sort\n return Array.from(new Set(allTicks)).sort((a, b) => a - b);\n }\n\n private generateSegmentTicks(min: number, max: number, count: number): number[] {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return [];\n \n // Re-use niceStep logic\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n let step: number;\n if (normalized < 1.5) step = 1; else if (normalized < 3) step = 2; else if (normalized < 7) step = 5; else step = 10;\n step *= magnitude;\n\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n let t = start;\n while (t <= max + step * 0.1) {\n ticks.push(Math.round(t * 1e12) / 1e12);\n t += step;\n }\n return ticks;\n }\n}\n","import type { SVGExportPluginContext } from \"./types\";\nimport { fmt } from \"../SVGDocumentBuilder\";\n\ntype BreakSymbol = \"diagonal\" | \"zigzag\" | \"wave\" | \"simple\";\n\nfunction breakSymbolPath(x: number, y: number, type: BreakSymbol, edge: \"top\" | \"bottom\"): string {\n const size = 6;\n if (type === \"diagonal\") {\n return `M ${fmt(x - size)} ${fmt(y + size / 2)} L ${fmt(x + size)} ${fmt(y - size / 2)} M ${fmt(x - size + 3)} ${fmt(y + size / 2)} L ${fmt(x + size + 3)} ${fmt(y - size / 2)}`;\n }\n if (type === \"zigzag\") {\n return `M ${fmt(x - size)} ${fmt(y)} L ${fmt(x - size / 2)} ${fmt(y - size / 2)} L ${fmt(x + size / 2)} ${fmt(y + size / 2)} L ${fmt(x + size)} ${fmt(y)}`;\n }\n if (edge === \"top\" || edge === \"bottom\") {\n return `M ${fmt(x - size)} ${fmt(y - 2)} L ${fmt(x + size)} ${fmt(y + 2)} M ${fmt(x - size)} ${fmt(y - 6)} L ${fmt(x + size)} ${fmt(y - 2)}`;\n }\n return `M ${fmt(x - size)} ${fmt(y)} L ${fmt(x)} ${fmt(y - size)} L ${fmt(x + size)} ${fmt(y)}`;\n}\n\nexport function exportBrokenAxisMarkers(\n ctx: SVGExportPluginContext,\n breaks: Array<{ axis: \"x\" | \"y\"; position: number; style?: BreakSymbol; color?: string }>,\n): void {\n if (!ctx.builder) return;\n const { plotArea } = ctx;\n\n for (const brk of breaks) {\n const color = brk.color ?? ctx.theme.xAxis.lineColor;\n const symbol = brk.style ?? \"diagonal\";\n if (brk.axis === \"x\") {\n const x = ctx.xScale.transform(brk.position);\n const topY = plotArea.y;\n const bottomY = plotArea.y + plotArea.height;\n ctx.builder.push(\n \"plugins\",\n `<path d=\"${breakSymbolPath(x, topY, symbol, \"top\")}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"1.5\"/>`,\n );\n ctx.builder.push(\n \"plugins\",\n `<path d=\"${breakSymbolPath(x, bottomY, symbol, \"bottom\")}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"1.5\"/>`,\n );\n } else {\n const yScale = ctx.yScales.values().next().value;\n if (!yScale) continue;\n const y = yScale.transform(brk.position);\n const x = plotArea.x;\n const size = 6;\n ctx.builder.push(\n \"plugins\",\n `<path d=\"M ${fmt(x)} ${fmt(y - size)} L ${fmt(x + size)} ${fmt(y)} L ${fmt(x)} ${fmt(y + size)}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"1.5\"/>`,\n );\n }\n }\n}\n\n/** Export breaks from PluginBrokenAxis config (data-space start/end). */\nexport function exportBrokenAxisFromConfig(\n ctx: SVGExportPluginContext,\n axes: Record<string, { breaks: Array<{ start: number; end: number; symbol?: BreakSymbol }>; defaultSymbol?: BreakSymbol; symbolColor?: string }>,\n): void {\n const breaks: Array<{ axis: \"x\" | \"y\"; position: number; style?: BreakSymbol; color?: string }> = [];\n\n for (const [axisId, options] of Object.entries(axes)) {\n const horizontal = axisId === \"default\" || axisId === \"xAxis\";\n if (!horizontal) continue;\n for (const b of options.breaks) {\n breaks.push({\n axis: \"x\",\n position: (b.start + b.end) / 2,\n style: b.symbol ?? options.defaultSymbol,\n color: options.symbolColor,\n });\n }\n }\n\n exportBrokenAxisMarkers(ctx, breaks);\n}\n","/**\n * @fileoverview Broken Axis plugin for displaying discontinuous data ranges.\n * @module plugins/broken-axis\n */\n\nimport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n} from './types';\nimport type {\n ChartPlugin,\n PluginContext,\n PluginManifest,\n} from '../types';\nimport { BrokenAxisScale } from './BrokenAxisScale';\nimport { exportBrokenAxisFromConfig } from '../../core/chart/exporter/svg/plugins/brokenAxis';\n\nconst manifest: PluginManifest = {\n name: 'velo-plot-broken-axis',\n version: '1.0.1',\n description: 'Support for gaps/breaks in axes with visual indicators',\n provides: ['broken-axis', 'coordinate-transform'],\n tags: ['axis', 'layout', 'visualization'],\n};\n\nexport function PluginBrokenAxis(\n config: PluginBrokenAxisConfig = { axes: {} }\n): ChartPlugin<PluginBrokenAxisConfig> {\n // Default enabled to true if not specified\n if (config.enabled === undefined) config.enabled = true;\n \n let ctx: PluginContext | null = null;\n let originalXScale: any = null;\n let brokenXScale: BrokenAxisScale | null = null;\n\n // Storage for raw (un-warped) data of series to allow re-transformation.\n const rawDataStore = new Map<string, { x: Float32Array; y: Float32Array }>();\n\n /** Union X-extent across all stored series — the domain breaks live in. */\n function computeWarpDomain(): [number, number] | null {\n let min = Infinity;\n let max = -Infinity;\n for (const raw of rawDataStore.values()) {\n for (let i = 0; i < raw.x.length; i++) {\n const v = raw.x[i];\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n if (!Number.isFinite(min) || !Number.isFinite(max) || min === max) return null;\n return [min, max];\n }\n\n function updateScales() {\n if (!ctx || !config.enabled) return;\n\n const options = config.axes.default || config.axes.xAxis;\n if (options && brokenXScale) {\n brokenXScale.updateBreaks(options.breaks);\n // On break change, we must re-transform everything\n applyTransformations({ syncView: true });\n }\n }\n\n /**\n * Re-warp every stored series into compressed (broken) space using the\n * data-derived warp domain, then align the chart's X view to that domain so\n * the axis ticks and break symbols (which the render pass computes from\n * viewBounds) line up with the warped data.\n */\n function applyTransformations(opts: { syncView?: boolean } = {}) {\n if (!ctx || !brokenXScale || !config.enabled) return;\n const chart = ctx.chart as any;\n\n const domain = computeWarpDomain();\n if (!domain) return;\n const [min, max] = domain;\n const range = max - min || 1;\n\n // Pin the scale to the warp domain so mapToRatio uses the correct segments,\n // independent of whatever sub-range the last render/zoom left behind.\n brokenXScale.setDomain(min, max);\n\n for (const [id, raw] of rawDataStore.entries()) {\n const transformedX = new Float32Array(raw.x.length);\n for (let i = 0; i < raw.x.length; i++) {\n transformedX[i] = min + brokenXScale.mapToRatio(raw.x[i]) * range;\n }\n // Call the TRUE underlying updateSeries to avoid the hijacking loop.\n if (chart._originalUpdateSeries) {\n chart._originalUpdateSeries(id, { x: transformedX, y: raw.y });\n }\n }\n\n if (opts.syncView && typeof chart.zoom === 'function') {\n // Constrain X to the warped data domain (warped values also span\n // [min,max]). Y is left untouched so the caller's Y range is preserved.\n chart.zoom({ x: [min, max], animate: false });\n }\n }\n\n function drawBreakSymbols(pCtx: PluginContext) {\n const { render } = pCtx;\n const { ctx2d, plotArea } = render;\n if (!ctx2d || !brokenXScale) return;\n\n for (const [axisId, options] of Object.entries(config.axes)) {\n const orientation = (axisId === 'default' || axisId === 'xAxis') ? 'horizontal' : 'vertical';\n if (orientation !== 'horizontal') continue;\n\n options.breaks.forEach(b => {\n const pxStart = brokenXScale!.transform(b.start);\n const pxEnd = brokenXScale!.transform(b.end);\n const midPx = (pxStart + pxEnd) / 2;\n // Per-break symbol takes precedence, then the axis default.\n const symbol = b.symbol || options.defaultSymbol || 'diagonal';\n\n ctx2d.save();\n ctx2d.lineWidth = 1.5;\n ctx2d.strokeStyle = options.symbolColor || '#ff00ff';\n\n if (orientation === 'horizontal') {\n drawSymbol(ctx2d, midPx, plotArea.y, symbol, 'top');\n drawSymbol(ctx2d, midPx, plotArea.y + plotArea.height, symbol, 'bottom');\n }\n ctx2d.restore();\n });\n }\n }\n\n function drawSymbol(ctx: CanvasRenderingContext2D, x: number, y: number, type: string, edge: string) {\n const size = 6;\n ctx.beginPath();\n if (type === 'diagonal') {\n ctx.moveTo(x - size, y + size/2);\n ctx.lineTo(x + size, y - size/2);\n ctx.moveTo(x - size + 3, y + size/2);\n ctx.lineTo(x + size + 3, y - size/2);\n } else if (type === 'zigzag') {\n ctx.moveTo(x - size, y);\n ctx.lineTo(x - size/2, y - size/2);\n ctx.lineTo(x + size/2, y + size/2);\n ctx.lineTo(x + size, y);\n } else {\n if (edge === 'top' || edge === 'bottom') {\n ctx.moveTo(x - size, y - 2); ctx.lineTo(x + size, y + 2);\n ctx.moveTo(x - size, y - 6); ctx.lineTo(x + size, y - 2);\n } else {\n ctx.moveTo(x - 2, y - size); ctx.lineTo(x + 2, y + size);\n }\n }\n ctx.stroke();\n }\n\n const api: BrokenAxisAPI = {\n addBreak(axisId, b) {\n if (!config.axes[axisId]) config.axes[axisId] = { breaks: [] };\n config.axes[axisId].breaks.push(b);\n updateScales();\n ctx?.requestRender();\n },\n clearBreaks(axisId) {\n if (config.axes[axisId]) config.axes[axisId].breaks = [];\n updateScales();\n ctx?.requestRender();\n },\n setEnabled(enabled: boolean) {\n const wasEnabled = config.enabled;\n config.enabled = enabled;\n \n if (ctx && wasEnabled !== enabled) {\n const chart = ctx.chart;\n if (enabled) {\n originalXScale = (chart as any).xScale;\n brokenXScale = new BrokenAxisScale(originalXScale, (config.axes.default || config.axes.xAxis)?.breaks || []);\n chart.setXScale(brokenXScale);\n applyTransformations({ syncView: true });\n } else {\n if (originalXScale) {\n chart.setXScale(originalXScale);\n brokenXScale = null;\n // Restore original data to series\n for (const [id, raw] of rawDataStore.entries()) {\n (chart as any)._originalUpdateSeries(id, raw);\n }\n }\n }\n }\n ctx?.requestRender();\n },\n getBreaks(axisId: string): AxisBreak[] {\n return config.axes[axisId]?.breaks || [];\n },\n updateConfig(newConfig: Partial<PluginBrokenAxisConfig>) {\n Object.assign(config, newConfig);\n updateScales();\n ctx?.requestRender();\n }\n };\n\n const pluginApi: BrokenAxisAPI & Record<string, unknown> = api as any;\n\n return {\n manifest,\n onInit(pCtx) {\n ctx = pCtx;\n const chart = ctx.chart as any;\n // NOTE: `chart.brokenAxis` is a read-only getter on ChartCore that resolves\n // this plugin's `api` via the plugin bridge — do NOT assign to it (that\n // throws \"Cannot set property ... which has only a getter\" and aborts\n // plugin registration entirely).\n\n // Hijack and Save original methods\n chart._originalUpdateSeries = chart.updateSeries.bind(chart);\n chart._originalAddSeries = chart.addSeries.bind(chart);\n chart._originalAppendData = chart.appendData.bind(chart);\n\n const toF32 = (v: any): Float32Array =>\n v instanceof Float32Array ? v : new Float32Array(typeof v === 'number' ? [v] : v);\n\n chart.updateSeries = (id: string, data: any) => {\n if (data.x && data.y) {\n rawDataStore.set(id, { x: toF32(data.x), y: toF32(data.y) });\n }\n\n if (config.enabled && brokenXScale && data.x) {\n // Re-warp all series against the (possibly grown) data domain.\n applyTransformations({ syncView: true });\n } else {\n chart._originalUpdateSeries(id, data);\n }\n };\n\n chart.addSeries = (options: any) => {\n if (options.id && options.data?.x && options.data?.y) {\n rawDataStore.set(options.id, { x: toF32(options.data.x), y: toF32(options.data.y) });\n }\n\n if (config.enabled && brokenXScale && options.data?.x) {\n // Add the series (untransformed) so the chart registers it, then\n // warp every series consistently against the data-derived domain.\n chart._originalAddSeries(options);\n applyTransformations({ syncView: true });\n } else {\n chart._originalAddSeries(options);\n }\n };\n\n chart.appendData = (id: string, x: any, y: any) => {\n const raw = rawDataStore.get(id);\n if (raw) {\n const newX = toF32(x);\n const newY = toF32(y);\n const combinedX = new Float32Array(raw.x.length + newX.length);\n const combinedY = new Float32Array(raw.y.length + newY.length);\n combinedX.set(raw.x);\n combinedX.set(newX, raw.x.length);\n combinedY.set(raw.y);\n combinedY.set(newY, raw.y.length);\n rawDataStore.set(id, { x: combinedX, y: combinedY });\n }\n\n if (config.enabled && brokenXScale) {\n applyTransformations({ syncView: true });\n } else {\n chart._originalAppendData(id, x, y);\n }\n };\n\n if (config.enabled) {\n originalXScale = chart.xScale; \n const options = config.axes.default || config.axes.xAxis;\n brokenXScale = new BrokenAxisScale(originalXScale, options?.breaks || []);\n chart.setXScale(brokenXScale);\n }\n },\n onDestroy() {\n if (ctx) {\n const chart = (ctx.chart as any);\n if (originalXScale) {\n chart.setXScale(originalXScale);\n }\n // CLEANUP hijacked methods\n chart.updateSeries = chart._originalUpdateSeries;\n chart.addSeries = chart._originalAddSeries;\n chart.appendData = chart._originalAppendData;\n delete chart._originalUpdateSeries;\n delete chart._originalAddSeries;\n delete chart._originalAppendData;\n }\n ctx = null;\n rawDataStore.clear();\n },\n onRenderOverlay(pCtx) {\n if (config.enabled) drawBreakSymbols(pCtx);\n },\n onExportSVG(svgCtx) {\n if (!config.enabled || !svgCtx.builder || svgCtx.exportContext?.options.includeOverlays === false) return;\n exportBrokenAxisFromConfig(svgCtx, config.axes);\n },\n onViewChange() {\n // Data is warped once against the fixed data-domain; a user zoom/pan is\n // just a linear view over the already-warped buffers, so we must NOT\n // re-warp here (doing so against the transient view domain is exactly\n // what collapsed the chart before). Nothing to do.\n },\n api: pluginApi\n };\n}\n\nexport default PluginBrokenAxis;\n\nexport type {\n PluginBrokenAxisConfig,\n BrokenAxisAPI,\n AxisBreak,\n BrokenAxisOptions,\n} from './types';\n"],"names":["BrokenAxisScale","originalScale","breaks","__publicField","min","max","b","a","segments","current","totalVisibleDataWidth","sum","s","totalBreakVisualRatio","currentRatioOffset","dataWidth","visualWidth","range","nextBreak","value","r0","r1","isReverse","ratio","found","prevRange","r","pixel","visualEnd","i","offset","count","allTicks","visualWeight","segmentCount","segmentTicks","rawStep","magnitude","normalized","step","start","ticks","t","breakSymbolPath","x","y","type","edge","fmt","exportBrokenAxisMarkers","ctx","plotArea","brk","color","symbol","topY","bottomY","yScale","size","exportBrokenAxisFromConfig","axes","axisId","options","manifest","PluginBrokenAxis","config","originalXScale","brokenXScale","rawDataStore","computeWarpDomain","raw","v","updateScales","applyTransformations","opts","chart","domain","id","transformedX","drawBreakSymbols","pCtx","render","ctx2d","orientation","pxStart","pxEnd","midPx","drawSymbol","toF32","data","_a","_b","_c","newX","newY","combinedX","combinedY","svgCtx","enabled","wasEnabled","newConfig"],"mappings":"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"}
|