velo-plot 1.15.0 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChartCore-BimVvUEg.js → ChartCore-DQ691eXH.js} +1523 -996
- package/dist/ChartCore-DQ691eXH.js.map +1 -0
- package/dist/assets/downsample.worker-C70QJ04y.js +2 -0
- package/dist/assets/downsample.worker-C70QJ04y.js.map +1 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js +2 -0
- package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -0
- package/dist/core/OverlayRenderer.d.ts +2 -0
- package/dist/core/chart/ChartAlerts.d.ts +42 -0
- package/dist/core/chart/ChartCore.d.ts +19 -1
- package/dist/core/chart/ChartRenderLoop.d.ts +4 -2
- package/dist/core/chart/ChartRenderer.d.ts +3 -2
- package/dist/core/chart/candlestickMarkers.d.ts +23 -0
- package/dist/core/chart/heikinAshi.d.ts +10 -0
- package/dist/core/chart/series/types.d.ts +2 -2
- package/dist/core/chart/types.d.ts +7 -0
- package/dist/core/indicator/addIndicator.d.ts +36 -0
- package/dist/core/indicator/index.d.ts +2 -0
- package/dist/core/indicator/indicatorPresets.d.ts +37 -0
- package/dist/core/series/Series.d.ts +3 -0
- package/dist/core/stacked/types.d.ts +8 -0
- package/dist/core/time/TimeScale.d.ts +31 -0
- package/dist/createStackedChart-BPooTQ9z.js +1164 -0
- package/dist/createStackedChart-BPooTQ9z.js.map +1 -0
- package/dist/gpu/adapter/gpuRenderer.d.ts +21 -0
- package/dist/gpu/backends/webgpu/WebGPUBackend.d.ts +2 -1
- package/dist/gpuRenderer-BpaMYz-k.js +1848 -0
- package/dist/gpuRenderer-BpaMYz-k.js.map +1 -0
- package/dist/index-D7dTq6VB.js +503 -0
- package/dist/index-D7dTq6VB.js.map +1 -0
- package/dist/{index-Ce2JgkH_.js → index-DoYxf1cV.js} +86 -43
- package/dist/{index-Ce2JgkH_.js.map → index-DoYxf1cV.js.map} +1 -1
- package/dist/{index.core-C_-CFftD.js → index.core-BtGFYMOu.js} +2 -2
- package/dist/{index.core-C_-CFftD.js.map → index.core-BtGFYMOu.js.map} +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/indicators--eJGmVox.js +302 -0
- package/dist/indicators--eJGmVox.js.map +1 -0
- package/dist/plugins/analysis.js +530 -807
- package/dist/plugins/analysis.js.map +1 -1
- package/dist/plugins/caching.js +26 -21
- package/dist/plugins/caching.js.map +1 -1
- package/dist/plugins/drawing-tools/index.d.ts +16 -0
- package/dist/plugins/gpu.js +202 -1895
- package/dist/plugins/gpu.js.map +1 -1
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/keyboard/index.d.ts +1 -7
- package/dist/plugins/keyboard.js +1 -1
- package/dist/plugins/lazy-load/types.d.ts +7 -0
- package/dist/plugins/lazy-load.js +131 -108
- package/dist/plugins/lazy-load.js.map +1 -1
- package/dist/plugins/replay/index.d.ts +19 -0
- package/dist/plugins/virtualization/types.d.ts +12 -0
- package/dist/plugins/virtualization.js +1 -1
- package/dist/pool-15HMCNv8.js +88 -0
- package/dist/pool-15HMCNv8.js.map +1 -0
- package/dist/react.js +2 -2
- package/dist/renderer/CandlestickRenderer.d.ts +1 -1
- package/dist/renderer/ChartSeriesRenderer.d.ts +6 -0
- package/dist/renderer/GpuChartRenderer.d.ts +23 -0
- package/dist/renderer/index.d.ts +3 -0
- package/dist/renderer/spike/WebGLGridSpike.d.ts +40 -0
- package/dist/testing/baselines/v1.15.0.json.d.ts +51 -0
- package/dist/testing/gridSpikeBenchmark.d.ts +49 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/rendererBenchmark.d.ts +13 -0
- package/dist/testing/stage1BrowserBench.d.ts +42 -0
- package/dist/types.d.ts +21 -1
- package/dist/velo-plot.full.js +1322 -789
- package/dist/velo-plot.full.js.map +1 -1
- package/dist/velo-plot.js +20 -20
- package/dist/workers/downsample.d.ts +38 -0
- package/dist/workers/downsampleAsync.d.ts +6 -0
- package/dist/workers/indicator.worker.d.ts +32 -0
- package/dist/workers/indicatorsAsync.d.ts +26 -0
- package/dist/workers/pool.d.ts +36 -0
- package/package.json +11 -1
- package/dist/ChartCore-BimVvUEg.js.map +0 -1
- package/dist/createStackedChart-CjsKcOvX.js +0 -1088
- package/dist/createStackedChart-CjsKcOvX.js.map +0 -1
- package/dist/index-ChgIdk3N.js +0 -229
- package/dist/index-ChgIdk3N.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createStackedChart-BPooTQ9z.js","sources":["../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js","../src/react/useSciPlot.ts","../src/react/SciPlot.tsx","../src/core/stacked/types.ts","../src/core/stacked/stackExport.ts","../src/core/stacked/paneResize.ts","../src/core/stacked/paneAxis.ts","../src/core/stacked/createStackedChart.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * useSciPlot - React hook for Sci Plot\n *\n * Manages chart lifecycle and provides a clean React API.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useCallback,\n type RefObject,\n} from \"react\";\nimport { createChart, type Chart, type ChartOptions } from \"../core/Chart\";\nimport type {\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n Bounds,\n} from \"../types\";\n\nexport interface UseSciPlotOptions extends Omit<ChartOptions, \"container\"> {\n /** Auto-resize on container changes */\n autoResize?: boolean;\n}\n\nexport interface UseSciPlotReturn {\n /** Chart instance (null until initialized) */\n chart: Chart | null;\n /** Whether the chart is ready */\n isReady: boolean;\n /** Error during initialization */\n error: Error | null;\n /** Current view bounds */\n bounds: Bounds | null;\n /** Add a series */\n addSeries: (options: SeriesOptions) => void;\n /** Update series data */\n updateSeries: (id: string, data: SeriesUpdateData) => void;\n /** Remove a series */\n removeSeries: (id: string) => void;\n /** Set zoom range */\n zoom: (options: ZoomOptions) => void;\n /** Reset zoom to show all data */\n resetZoom: () => void;\n}\n\n/**\n * React hook for using Sci Plot\n *\n * @example\n * ```tsx\n * function MyChart() {\n * const canvasRef = useRef<HTMLCanvasElement>(null);\n * const { chart, isReady, addSeries, zoom } = useSciPlot(canvasRef, {\n * xAxis: { label: 'E / V' },\n * yAxis: { label: 'I / A' }\n * });\n *\n * useEffect(() => {\n * if (isReady) {\n * addSeries({\n * id: 'cv-1',\n * type: 'line',\n * data: { x: xData, y: yData },\n * style: { color: '#ff0055' }\n * });\n * }\n * }, [isReady]);\n *\n * return <canvas ref={canvasRef} />;\n * }\n * ```\n */\nexport function useSciPlot(\n containerRef: RefObject<HTMLDivElement>,\n options: UseSciPlotOptions = {}\n): UseSciPlotReturn {\n const [chart, setChart] = useState<Chart | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [bounds, setBounds] = useState<Bounds | null>(null);\n\n // Store options in ref to avoid re-creating chart on every render\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Initialize chart\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n try {\n const chartInstance = createChart({\n ...optionsRef.current,\n container,\n });\n\n // Listen to zoom events to update bounds\n chartInstance.on(\"zoom\", () => {\n setBounds(chartInstance.getViewBounds());\n });\n\n setChart(chartInstance);\n setIsReady(true);\n setBounds(chartInstance.getViewBounds());\n setError(null);\n\n } catch (err) {\n console.error(\"[useSciPlot] Failed to initialize chart:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsReady(false);\n }\n\n return () => {\n if (chart) {\n chart.destroy();\n setChart(null);\n setIsReady(false);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef]);\n\n // Memoized methods\n const addSeries = useCallback(\n (seriesOptions: SeriesOptions) => {\n if (chart) {\n chart.addSeries(seriesOptions);\n setBounds(chart.getViewBounds());\n }\n },\n [chart]\n );\n\n const updateSeries = useCallback(\n (id: string, data: SeriesUpdateData) => {\n if (chart) {\n chart.updateSeries(id, data);\n }\n },\n [chart]\n );\n\n const removeSeries = useCallback(\n (id: string) => {\n if (chart) {\n chart.removeSeries(id);\n }\n },\n [chart]\n );\n\n const zoom = useCallback(\n (zoomOptions: ZoomOptions) => {\n if (chart) {\n chart.zoom(zoomOptions);\n }\n },\n [chart]\n );\n\n const resetZoom = useCallback(() => {\n if (chart) {\n chart.resetZoom();\n setBounds(chart.getViewBounds());\n }\n }, [chart]);\n\n return {\n chart,\n isReady,\n error,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n zoom,\n resetZoom,\n };\n}\n","/**\n * SciPlot - React Component for Scientific Charts\n *\n * A declarative React component that wraps the Sci Plot.\n */\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useSciPlot, type UseSciPlotOptions } from \"./useSciPlot\";\nimport type {\n SeriesOptions,\n ZoomOptions,\n CursorOptions,\n Bounds,\n} from \"../types\";\nimport type { Chart } from \"../core/Chart\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface SciPlotSeries {\n id: string;\n x: Float32Array | Float64Array;\n y: Float32Array | Float64Array;\n color?: string;\n width?: number;\n visible?: boolean;\n}\n\nexport interface SciPlotProps extends UseSciPlotOptions {\n /** Series data to display */\n series?: SciPlotSeries[];\n /** Zoom state (controlled) */\n zoom?: ZoomOptions;\n /** Callback when zoom changes */\n onZoomChange?: (bounds: Bounds) => void;\n /** Cursor configuration */\n cursor?: CursorOptions;\n /** Container width */\n width?: number | string;\n /** Container height */\n height?: number | string;\n /** Additional class name */\n className?: string;\n /** Additional styles */\n style?: CSSProperties;\n /** Debug mode - shows FPS counter */\n debug?: boolean;\n}\n\nexport interface SciPlotRef {\n /** Get the chart instance */\n getChart: () => Chart | null;\n /** Reset zoom to show all data */\n resetZoom: () => void;\n /** Get current bounds */\n getBounds: () => Bounds | null;\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * SciPlot React Component\n *\n * @example\n * ```tsx\n * <SciPlot\n * series={[\n * { id: 'cv-1', x: potentialData, y: currentData, color: '#ff0055' }\n * ]}\n * xAxis={{ label: 'E / V' }}\n * yAxis={{ label: 'I / A' }}\n * height={400}\n * cursor={{ enabled: true, snap: true }}\n * onZoomChange={(bounds) => console.log('Zoom:', bounds)}\n * />\n * ```\n */\nexport const SciPlot = forwardRef<SciPlotRef, SciPlotProps>(\n function SciPlot(\n {\n series = [],\n zoom: zoomProp,\n onZoomChange,\n cursor,\n width = \"100%\",\n height = 400,\n className = \"\",\n style = {},\n debug = false,\n ...chartOptions\n },\n ref\n ) {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousSeriesRef = useRef<Map<string, SciPlotSeries>>(new Map());\n\n const {\n chart,\n isReady,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n resetZoom,\n } = useSciPlot(containerRef, chartOptions);\n\n // Expose methods via ref\n useImperativeHandle(\n ref,\n () => ({\n getChart: () => chart,\n resetZoom,\n getBounds: () => bounds,\n }),\n [chart, resetZoom, bounds]\n );\n\n // Handle series changes\n useEffect(() => {\n if (!isReady || !chart) return;\n\n const currentSeriesMap = new Map(series.map((s) => [s.id, s]));\n const previousSeriesMap = previousSeriesRef.current;\n\n // Remove series that no longer exist\n previousSeriesMap.forEach((_, id) => {\n if (!currentSeriesMap.has(id)) {\n removeSeries(id);\n }\n });\n\n // Add or update series\n currentSeriesMap.forEach((seriesData, id) => {\n const prevSeries = previousSeriesMap.get(id);\n\n if (!prevSeries) {\n // New series - add it\n const options: SeriesOptions = {\n id: seriesData.id,\n type: \"line\",\n data: { x: seriesData.x, y: seriesData.y },\n style: {\n color: seriesData.color ?? \"#ff0055\",\n width: seriesData.width ?? 1.5,\n },\n visible: seriesData.visible ?? true,\n };\n addSeries(options);\n // Force an initial autoscale if it's the first series\n if (currentSeriesMap.size === 1) {\n chart.autoScale();\n }\n } else if (\n prevSeries.x !== seriesData.x ||\n prevSeries.y !== seriesData.y\n ) {\n // Data changed - update\n updateSeries(id, {\n x: seriesData.x,\n y: seriesData.y,\n });\n }\n });\n\n previousSeriesRef.current = currentSeriesMap;\n }, [series, isReady, chart, addSeries, updateSeries, removeSeries]);\n\n // Handle controlled zoom\n useEffect(() => {\n if (!isReady || !chart || !zoomProp) return;\n chart.zoom(zoomProp);\n }, [isReady, chart, zoomProp]);\n\n // Handle zoom change callback\n useEffect(() => {\n if (!isReady || !chart || !onZoomChange) return;\n\n chart.on(\"zoom\", (event) => {\n onZoomChange({\n xMin: event.x[0],\n xMax: event.x[1],\n yMin: event.y[0],\n yMax: event.y[1],\n });\n });\n }, [isReady, chart, onZoomChange]);\n\n // Handle cursor\n useEffect(() => {\n if (!isReady || !chart) return;\n\n if (cursor?.enabled) {\n chart.enableCursor(cursor);\n } else {\n chart.disableCursor();\n }\n }, [isReady, chart, cursor]);\n\n // Container styles\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n position: \"relative\",\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n ...style,\n }),\n [width, height, style]\n );\n\n return (\n <div\n ref={containerRef}\n className={`velo-plot-container ${className}`}\n style={containerStyle}\n >\n {/* Debug overlay */}\n {debug && bounds && (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"rgba(0,0,0,0.7)\",\n color: \"#0f0\",\n padding: \"4px 8px\",\n borderRadius: 4,\n fontSize: 11,\n fontFamily: \"monospace\",\n }}\n >\n <div>\n X: [{bounds.xMin.toFixed(3)}, {bounds.xMax.toFixed(3)}]\n </div>\n <div>\n Y: [{bounds.yMin.toExponential(2)}, {bounds.yMax.toExponential(2)}\n ]\n </div>\n <div>Series: {series.length}</div>\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default SciPlot;\n","import type { Chart } from \"../chart/types\";\nimport type { ChartGroup } from \"../sync\";\nimport type { SyncAxis, SyncOptions } from \"../sync\";\nimport type { ChartOptions as RootChartOptions, Range, SeriesOptions } from \"../../types\";\nimport type { LayoutOptions } from \"../layout\";\nimport type { AddIndicatorResult } from \"../indicator/addIndicator\";\n\n/** Stack layout direction */\nexport type StackDirection = \"vertical\" | \"horizontal\";\n\n/** Per-pane configuration (max 5 panes per stack) */\nexport interface StackedPaneConfig {\n id: string;\n /** Flex ratio (e.g. 0.6) or CSS length (\"24%\", \"80px\") — height ratio when vertical, width ratio when horizontal */\n height: number | string;\n /** Chart options excluding container/id (series added via chart API or `series`) */\n chart?: Omit<RootChartOptions, \"container\" | \"id\">;\n /** Series to add immediately after pane chart is created */\n series?: SeriesOptions[];\n /** Show native X axis (default: only bottom pane when vertical + sharedXAxis; each pane when horizontal) */\n showXAxis?: boolean;\n /** Show native Y axis (default: only first pane when horizontal + sharedYAxis) */\n showYAxis?: boolean;\n /** Receive pan/zoom (default: true on every pane) */\n interactive?: boolean;\n /** Lock Y range — skips auto fit on Y for this pane */\n yRange?: Range | \"auto\";\n}\n\nexport interface StackedChartOptions {\n /** Root container (will be cleared and filled with pane layout) */\n container: HTMLDivElement;\n /** 1–5 stacked panes */\n panes: StackedPaneConfig[];\n /** Layout direction (default: vertical — panes top to bottom) */\n direction?: StackDirection;\n /** Pane that drives sync (default: first pane) */\n masterPaneId?: string;\n /** Shared date/time row on bottom pane only (vertical layout) */\n sharedXAxis?: \"bottom\" | \"none\";\n /** Shared Y axis on left pane only (horizontal layout) */\n sharedYAxis?: \"left\" | \"none\";\n /** Shared theme applied to every pane */\n theme?: string | object;\n devicePixelRatio?: number;\n /** Gap between panes in CSS pixels (default: 0) */\n gap?: number;\n /** Enable VS Code–style drag resize between panes (default: false) */\n resizable?:\n | boolean\n | {\n /** Min pane height as fraction of available stack height (default: 1/6) */\n minPaneRatio?: number;\n /** Absolute min pane height in px — overrides ratio when larger */\n minPanePx?: number;\n dividerSize?: number;\n };\n /** Show legend on panes (default: false — set true on stack or per-pane chart) */\n showLegend?: boolean;\n /**\n * Pan/zoom sync between panes.\n * Default: X-axis sync via master pane (`axis: 'x'`, Y independent).\n * Pass `false` for fully independent panes.\n */\n sync?: boolean | StackedSyncOptions;\n /** Shared margin overrides — left/right aligned automatically across panes */\n layout?: Partial<LayoutOptions>;\n}\n\nexport interface StackedChart {\n readonly container: HTMLDivElement;\n getPane(id: string): Chart | undefined;\n getPanes(): Chart[];\n getMaster(): Chart;\n getGroup(): ChartGroup;\n fitAll(options?: { x?: Range; padding?: number }): void;\n resetAll(): void;\n resize(): void;\n /** Current flex ratios keyed by pane id */\n getPaneRatios(): Record<string, number>;\n /** Set flex ratios (same keys as pane ids); triggers resize */\n setPaneRatios(ratios: Record<string, number>): void;\n /** Sync axis mode: `x` (default), `y`, `xy`, or `none` */\n setSyncAxis(axis: SyncAxis): void;\n getSyncAxis(): SyncAxis;\n /** Update pan/zoom/cursor sync options at runtime */\n setSyncOptions(options: Partial<StackedSyncOptions>): void;\n /** Resolves when all pane charts have started rendering */\n whenReady(): Promise<void>;\n /** Append a pane at runtime (max 5 panes) */\n addPane(pane: StackedPaneConfig): Chart;\n /** Calculate + mount indicator pane or overlay on master price chart */\n addIndicator(\n preset: import(\"../indicator/addIndicator\").IndicatorPresetName,\n options?: import(\"../indicator/addIndicator\").AddIndicatorOptions,\n ): Promise<AddIndicatorResult & { paneId?: string; chart?: Chart }>;\n /** Export the entire stack as one PNG/JPEG/WebP image (WYSIWYG layout) */\n exportImage(options?: StackSnapshotOptions): Promise<string>;\n /** Alias for exportImage */\n snapshot(options?: StackSnapshotOptions): Promise<string>;\n destroy(): void;\n}\n\nexport const STACKED_MAX_PANES = 5;\n/** Default minimum pane height as a fraction of available stack height (1/6). */\nexport const STACKED_DEFAULT_MIN_PANE_RATIO = 1 / 6;\nexport const STACKED_COMPACT_MARGIN = { top: 4, bottom: 8, left: 4 };\nexport const STACKED_FULL_X_MARGIN = { bottom: 55 };\nexport const STACKED_FULL_Y_MARGIN = { left: 55 };\n\n/** Options for full-stack image export */\nexport type StackSnapshotFormat = \"png\" | \"jpeg\" | \"webp\";\nexport type StackSnapshotResolution = \"standard\" | \"2k\" | \"4k\" | \"8k\" | number;\n\nexport interface StackSnapshotOptions {\n format?: StackSnapshotFormat;\n quality?: number;\n resolution?: StackSnapshotResolution;\n includeBackground?: boolean;\n includeDividers?: boolean;\n transparent?: boolean;\n download?: boolean;\n fileName?: string;\n}\n\n/** Pan/zoom sync between stacked panes (Y stays independent when axis is `x`). */\nexport type StackedSyncOptions = Pick<\n SyncOptions,\n | \"axis\"\n | \"syncCursor\"\n | \"syncSelection\"\n | \"syncZoom\"\n | \"syncPan\"\n | \"bidirectional\"\n | \"debounce\"\n>;\n","/**\n * Full-stack snapshot export — composes all pane charts at exact layout positions.\n */\n\nimport type { Chart } from \"../chart/types\";\n\nexport type StackExportFormat = \"png\" | \"jpeg\" | \"webp\";\nexport type StackExportResolution = \"standard\" | \"2k\" | \"4k\" | \"8k\" | number;\n\nexport interface StackExportOptions {\n format?: StackExportFormat;\n quality?: number;\n resolution?: StackExportResolution;\n includeBackground?: boolean;\n includeDividers?: boolean;\n transparent?: boolean;\n}\n\n/** @internal Exported for unit tests */\nexport function stackResolutionScale(res: StackExportResolution): number {\n if (typeof res === \"number\") return res;\n switch (res) {\n case \"8k\":\n return 8;\n case \"4k\":\n return 4;\n case \"2k\":\n return 2;\n default:\n return 1;\n }\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = src;\n });\n}\n\nfunction relativeRect(\n el: HTMLElement,\n containerRect: DOMRect,\n): { x: number; y: number; width: number; height: number } {\n const r = el.getBoundingClientRect();\n return {\n x: r.left - containerRect.left,\n y: r.top - containerRect.top,\n width: r.width,\n height: r.height,\n };\n}\n\n/**\n * Compose every pane chart into one raster image matching the on-screen stack layout.\n */\nexport async function exportStackImage(\n container: HTMLDivElement,\n paneWrappers: HTMLDivElement[],\n paneCharts: Chart[],\n dividers: HTMLDivElement[],\n backgroundColor: string,\n options: StackExportOptions = {},\n): Promise<string> {\n const {\n format = \"png\",\n quality = 0.92,\n resolution = \"standard\",\n includeBackground = true,\n includeDividers = true,\n transparent = false,\n } = options;\n\n const scale = stackResolutionScale(resolution);\n const baseDpr = paneCharts[0]?.getDPR() ?? (typeof window !== \"undefined\" ? window.devicePixelRatio : 1);\n const exportDpr = baseDpr * scale;\n const originalDprs = paneCharts.map((c) => c.getDPR());\n\n try {\n if (scale > 1) {\n for (const chart of paneCharts) {\n chart.setDPR(exportDpr);\n chart.render();\n }\n await new Promise((r) => requestAnimationFrame(r));\n await new Promise((r) => setTimeout(r, 50));\n }\n\n const containerRect = container.getBoundingClientRect();\n const outW = Math.max(1, Math.round(containerRect.width * exportDpr));\n const outH = Math.max(1, Math.round(containerRect.height * exportDpr));\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Failed to create export canvas\");\n\n if (!transparent && includeBackground) {\n ctx.fillStyle = backgroundColor || \"#ffffff\";\n ctx.fillRect(0, 0, outW, outH);\n }\n\n const imageType = format === \"jpeg\" ? \"jpeg\" : \"png\";\n\n for (let i = 0; i < paneWrappers.length; i++) {\n const rect = relativeRect(paneWrappers[i], containerRect);\n const dataUrl = paneCharts[i].exportImage(imageType);\n const img = await loadImage(dataUrl);\n ctx.drawImage(\n img,\n Math.round(rect.x * exportDpr),\n Math.round(rect.y * exportDpr),\n Math.round(rect.width * exportDpr),\n Math.round(rect.height * exportDpr),\n );\n }\n\n if (includeDividers && dividers.length) {\n ctx.fillStyle = \"rgba(128, 128, 128, 0.35)\";\n for (const divider of dividers) {\n const rect = relativeRect(divider, containerRect);\n ctx.fillRect(\n Math.round(rect.x * exportDpr),\n Math.round(rect.y * exportDpr),\n Math.max(1, Math.round(rect.width * exportDpr)),\n Math.max(1, Math.round(rect.height * exportDpr)),\n );\n }\n }\n\n const mime = format === \"jpeg\" ? \"image/jpeg\" : format === \"webp\" ? \"image/webp\" : \"image/png\";\n return canvas.toDataURL(mime, quality);\n } finally {\n if (scale > 1) {\n for (let i = 0; i < paneCharts.length; i++) {\n paneCharts[i].setDPR(originalDprs[i]);\n paneCharts[i].render();\n }\n }\n }\n}\n","/**\n * VS Code–style drag dividers between stacked chart panes (vertical or horizontal).\n */\n\nimport { STACKED_DEFAULT_MIN_PANE_RATIO } from \"./types\";\nimport type { StackDirection } from \"./types\";\n\nexport interface PaneResizeOptions {\n /** Stack layout direction */\n direction?: StackDirection;\n /** Min pane size as fraction of available stack dimension (default 1/6) */\n minPaneRatio?: number;\n /** Absolute min pane size in px */\n minPanePx?: number;\n /** Divider hit area size (default 6) */\n dividerSize?: number;\n onResize?: (ratiosById: Record<string, number>) => void;\n onDragStart?: (leadingIdx: number, trailingIdx: number) => number[];\n onDragMove?: (sizesPx: number[], leadingIdx: number, trailingIdx: number) => void;\n onDragEnd?: (finalSizesPx: number[]) => void;\n}\n\nconst DIVIDER_CLASS = \"velo-pane-divider\";\nconst RESIZING_CLASS = \"velo-pane-resizing\";\n\nfunction injectDividerStyles(direction: StackDirection): void {\n if (typeof document === \"undefined\") return;\n let style = document.getElementById(\"velo-pane-divider-styles\") as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"velo-pane-divider-styles\";\n document.head.appendChild(style);\n }\n\n const isHorizontal = direction === \"horizontal\";\n const cursor = isHorizontal ? \"ew-resize\" : \"ns-resize\";\n const handleGlyph = isHorizontal ? \"⇔\" : \"⇕\";\n\n style.textContent = `\n .${DIVIDER_CLASS} {\n flex: 0 0 var(--velo-divider-size, 6px);\n position: relative;\n cursor: ${cursor};\n touch-action: none;\n z-index: 20;\n background: transparent;\n user-select: none;\n }\n .${DIVIDER_CLASS}::after {\n content: \"\";\n position: absolute;\n background: rgba(128, 128, 128, 0.35);\n transition: background 0.15s;\n }\n .${DIVIDER_CLASS}[data-direction=\"vertical\"]::after {\n left: 0;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n height: 1px;\n }\n .${DIVIDER_CLASS}[data-direction=\"horizontal\"]::after {\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n width: 1px;\n }\n .${DIVIDER_CLASS}:hover::after,\n .${RESIZING_CLASS} .${DIVIDER_CLASS}::after {\n background: rgba(0, 242, 255, 0.65);\n }\n .${DIVIDER_CLASS}[data-direction=\"vertical\"]:hover::after,\n .${RESIZING_CLASS} .${DIVIDER_CLASS}[data-direction=\"vertical\"]::after {\n height: 2px;\n }\n .${DIVIDER_CLASS}[data-direction=\"horizontal\"]:hover::after,\n .${RESIZING_CLASS} .${DIVIDER_CLASS}[data-direction=\"horizontal\"]::after {\n width: 2px;\n }\n .${DIVIDER_CLASS}-handle {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.15s;\n pointer-events: none;\n color: rgba(0, 242, 255, 0.9);\n font-size: 10px;\n line-height: 1;\n }\n .${DIVIDER_CLASS}:hover .${DIVIDER_CLASS}-handle,\n .${RESIZING_CLASS} .${DIVIDER_CLASS}-handle {\n opacity: 1;\n }\n .${RESIZING_CLASS} {\n cursor: ${cursor} !important;\n }\n .${RESIZING_CLASS} * {\n cursor: ${cursor} !important;\n }\n .${RESIZING_CLASS} [data-pane-id] {\n position: relative !important;\n overflow: hidden !important;\n }\n `;\n\n void handleGlyph;\n}\n\nfunction createDividerElement(index: number, size: number, direction: StackDirection): HTMLDivElement {\n const divider = document.createElement(\"div\");\n divider.className = DIVIDER_CLASS;\n divider.dataset.dividerIndex = String(index);\n divider.dataset.direction = direction;\n divider.style.setProperty(\"--velo-divider-size\", `${size}px`);\n\n const handle = document.createElement(\"div\");\n handle.className = `${DIVIDER_CLASS}-handle`;\n handle.textContent = direction === \"horizontal\" ? \"⇔\" : \"⇕\";\n divider.appendChild(handle);\n\n return divider;\n}\n\nexport interface PaneResizeController {\n dividers: HTMLDivElement[];\n destroy: () => void;\n}\n\nfunction paneFlexStyle(ratio: number | string, direction: StackDirection): string {\n const minDim = direction === \"horizontal\" ? \"min-width:0;\" : \"min-height:0;\";\n if (typeof ratio === \"number\") {\n return `flex:${ratio} 1 0;${minDim}`;\n }\n return `flex:1 1 ${ratio};${minDim}`;\n}\n\nexport function resolveMinPaneHeightPx(\n availHeight: number,\n paneCount: number,\n minPaneRatio = STACKED_DEFAULT_MIN_PANE_RATIO,\n minPanePx = 0,\n): number {\n if (paneCount < 1 || availHeight <= 0) return 1;\n const byRatio = availHeight * minPaneRatio;\n const minH = Math.max(minPanePx, byRatio);\n return Math.min(minH, availHeight / paneCount);\n}\n\nexport function resolveMinPaneWidthPx(\n availWidth: number,\n paneCount: number,\n minPaneRatio = STACKED_DEFAULT_MIN_PANE_RATIO,\n minPanePx = 0,\n): number {\n return resolveMinPaneHeightPx(availWidth, paneCount, minPaneRatio, minPanePx);\n}\n\nexport function normalizePaneHeights(heightsPx: number[], targetTotal: number): number[] {\n const n = heightsPx.length;\n if (n === 0) return heightsPx;\n const total = Math.max(1, Math.round(targetTotal));\n const sum = heightsPx.reduce((s, h) => s + h, 0);\n if (sum <= 0) {\n const even = Math.floor(total / n);\n const out = heightsPx.map(() => even);\n out[n - 1] = total - even * (n - 1);\n return out;\n }\n\n const scaled = heightsPx.map((h) => (h / sum) * total);\n const out: number[] = [];\n let allocated = 0;\n for (let i = 0; i < n - 1; i++) {\n out.push(Math.max(1, Math.round(scaled[i])));\n allocated += out[i];\n }\n out.push(Math.max(1, total - allocated));\n return out;\n}\n\nexport const normalizePaneWidths = normalizePaneHeights;\n\nexport function attachPaneResize(\n container: HTMLDivElement,\n paneWrappers: HTMLDivElement[],\n paneIds: string[],\n ratios: number[],\n options: PaneResizeOptions = {},\n): PaneResizeController {\n const direction = options.direction ?? \"vertical\";\n const isHorizontal = direction === \"horizontal\";\n injectDividerStyles(direction);\n\n const minPaneRatio = options.minPaneRatio ?? STACKED_DEFAULT_MIN_PANE_RATIO;\n const minPanePx = options.minPanePx ?? 0;\n const dividerSize = options.dividerSize ?? 6;\n const paneCount = paneWrappers.length;\n\n const minPaneSize = (avail: number) =>\n isHorizontal\n ? resolveMinPaneWidthPx(avail, paneCount, minPaneRatio, minPanePx)\n : resolveMinPaneHeightPx(avail, paneCount, minPaneRatio, minPanePx);\n\n const dividers: HTMLDivElement[] = [];\n const cleanups: (() => void)[] = [];\n\n if (paneWrappers.length < 2) {\n return { dividers, destroy: () => {} };\n }\n\n const availableSize = (): number => {\n const dividerTotal = dividers.length * dividerSize;\n const main = isHorizontal ? container.clientWidth : container.clientHeight;\n return Math.max(1, main - dividerTotal);\n };\n\n const applyRatios = (\n leadingIdx: number,\n trailingIdx: number,\n delta: number,\n sizesPx: number[],\n ) => {\n const avail = availableSize();\n const minS = minPaneSize(avail);\n\n const othersSum = sizesPx.reduce(\n (s, h, idx) => (idx === leadingIdx || idx === trailingIdx ? s : s + h),\n 0,\n );\n const pairTotal = avail - othersSum;\n\n let leadingSize = sizesPx[leadingIdx] + delta;\n leadingSize = Math.max(minS, Math.min(pairTotal - minS, leadingSize));\n const trailingSize = pairTotal - leadingSize;\n\n sizesPx[leadingIdx] = leadingSize;\n sizesPx[trailingIdx] = trailingSize;\n\n const total = ratios.reduce((s, r) => s + r, 0);\n ratios[leadingIdx] = (leadingSize / avail) * total;\n ratios[trailingIdx] = (trailingSize / avail) * total;\n\n options.onDragMove?.(sizesPx, leadingIdx, trailingIdx);\n\n if (options.onResize) {\n const byId: Record<string, number> = {};\n for (let i = 0; i < paneIds.length; i++) {\n byId[paneIds[i]] = ratios[i];\n }\n options.onResize(byId);\n }\n };\n\n for (let i = 0; i < paneWrappers.length - 1; i++) {\n const divider = createDividerElement(i, dividerSize, direction);\n const leadingWrapper = paneWrappers[i];\n leadingWrapper.after(divider);\n dividers.push(divider);\n\n const onPointerDown = (e: PointerEvent) => {\n e.preventDefault();\n divider.setPointerCapture(e.pointerId);\n container.classList.add(RESIZING_CLASS);\n\n const sizesPx =\n options.onDragStart?.(i, i + 1) ??\n paneWrappers.map((w) =>\n isHorizontal ? w.getBoundingClientRect().width : w.getBoundingClientRect().height,\n );\n\n options.onDragMove?.(sizesPx, i, i + 1);\n\n let lastCoord = isHorizontal ? e.clientX : e.clientY;\n\n const onMove = (ev: PointerEvent) => {\n const coord = isHorizontal ? ev.clientX : ev.clientY;\n const d = coord - lastCoord;\n lastCoord = coord;\n if (d !== 0) applyRatios(i, i + 1, d, sizesPx);\n };\n\n const onUp = (ev: PointerEvent) => {\n divider.releasePointerCapture(ev.pointerId);\n container.classList.remove(RESIZING_CLASS);\n divider.removeEventListener(\"pointermove\", onMove);\n divider.removeEventListener(\"pointerup\", onUp);\n divider.removeEventListener(\"pointercancel\", onUp);\n options.onDragEnd?.(sizesPx);\n };\n\n divider.addEventListener(\"pointermove\", onMove);\n divider.addEventListener(\"pointerup\", onUp);\n divider.addEventListener(\"pointercancel\", onUp);\n };\n\n divider.addEventListener(\"pointerdown\", onPointerDown);\n cleanups.push(() => divider.removeEventListener(\"pointerdown\", onPointerDown));\n }\n\n return {\n dividers,\n destroy: () => {\n for (const fn of cleanups) fn();\n for (const d of dividers) d.remove();\n container.classList.remove(RESIZING_CLASS);\n },\n };\n}\n\nexport function applyPaneFlexRatios(\n paneWrappers: HTMLDivElement[],\n ratios: number[],\n direction: StackDirection = \"vertical\",\n): void {\n for (let i = 0; i < paneWrappers.length; i++) {\n paneWrappers[i].style.cssText = `${paneFlexStyle(ratios[i], direction)}position:relative;overflow:hidden;`;\n }\n}\n\nexport function initialPaneRatio(height: number | string): number {\n return typeof height === \"number\" ? height : 1;\n}\n\nexport { paneFlexStyle };\n","import type { Chart } from \"../chart/types\";\n\n/** Adaptive Y tick count from pane height (~1 tick per 36px, capped by base). */\nexport function tickCountForPaneHeight(heightPx: number, base = 6): number {\n if (!Number.isFinite(heightPx) || heightPx <= 0) return base;\n const adaptive = Math.floor(heightPx / 36);\n return Math.max(2, Math.min(base, adaptive));\n}\n\n/** Adaptive X tick count from pane width. */\nexport function tickCountForPaneWidth(widthPx: number, base = 8): number {\n if (!Number.isFinite(widthPx) || widthPx <= 0) return base;\n const adaptive = Math.floor(widthPx / 72);\n return Math.max(2, Math.min(base, adaptive));\n}\n\nexport interface PaneAxisMeta {\n chart: Chart;\n wrapper: HTMLDivElement;\n baseYTickCount: number;\n baseXTickCount: number;\n showXAxis: boolean;\n}\n\nexport function readBaseYTickCount(yAxis?: { tickCount?: number } | { tickCount?: number }[]): number {\n if (!yAxis) return 6;\n const axes = Array.isArray(yAxis) ? yAxis : [yAxis];\n return axes[0]?.tickCount ?? 6;\n}\n\nexport function adaptPaneAxes(meta: PaneAxisMeta): void {\n const h = meta.wrapper.clientHeight;\n const w = meta.wrapper.clientWidth;\n const yTicks = tickCountForPaneHeight(h, meta.baseYTickCount);\n\n meta.chart.updateYAxis(\"default\", { tickCount: yTicks });\n\n if (meta.showXAxis) {\n const xTicks = tickCountForPaneWidth(w, meta.baseXTickCount);\n meta.chart.updateXAxis({ tickCount: xTicks });\n }\n}\n\nexport function adaptAllPaneAxes(metas: PaneAxisMeta[]): void {\n for (const m of metas) adaptPaneAxes(m);\n}\n","import { createChart } from \"../Chart\";\nimport type { Chart } from \"../chart/types\";\nimport { MARGINS } from \"../chart/types\";\nimport { createChartGroup } from \"../sync\";\nimport type { SyncOptions } from \"../sync\";\nimport type { AxisOptions, SeriesOptions } from \"../../types\";\nimport { mergeLayoutOptions } from \"../layout\";\nimport { buildIndicatorSeries } from \"../indicator/buildIndicatorSeries\";\nimport type { IndicatorSeriesOptions } from \"../indicator/types\";\nimport type {\n StackedChart,\n StackedChartOptions,\n StackedPaneConfig,\n StackedSyncOptions,\n StackSnapshotOptions,\n StackDirection,\n} from \"./types\";\nimport {\n STACKED_MAX_PANES,\n STACKED_COMPACT_MARGIN,\n STACKED_FULL_X_MARGIN,\n} from \"./types\";\nimport { exportStackImage } from \"./stackExport\";\nimport { getInitQueueStatus } from \"../ChartInitQueue\";\nimport {\n addIndicatorToChart,\n buildIndicatorPaneFromPreset,\n type AddIndicatorOptions,\n type IndicatorPresetName,\n} from \"../indicator/addIndicator\";\nimport { extractPriceSeries, resolveSourceSeries } from \"../indicator/indicatorPresets\";\nimport {\n attachPaneResize,\n applyPaneFlexRatios,\n initialPaneRatio,\n normalizePaneHeights,\n type PaneResizeController,\n} from \"./paneResize\";\nimport {\n adaptAllPaneAxes,\n readBaseYTickCount,\n type PaneAxisMeta,\n} from \"./paneAxis\";\n\nfunction countYAxes(yAxis?: AxisOptions | AxisOptions[]): { left: number; right: number } {\n const axes = yAxis ? (Array.isArray(yAxis) ? yAxis : [yAxis]) : [{}];\n let left = 0;\n let right = 0;\n for (const a of axes) {\n if (a.position === \"right\") right++;\n else left++;\n }\n return { left: Math.max(1, left), right };\n}\n\nfunction computeAlignedLeftMargin(panes: StackedPaneConfig[], baseLeft: number): number {\n let maxExtra = 0;\n for (const pane of panes) {\n const { left } = countYAxes(pane.chart?.yAxis);\n maxExtra = Math.max(maxExtra, (left - 1) * 65);\n }\n return baseLeft + maxExtra;\n}\n\nfunction computeAlignedRightMargin(panes: StackedPaneConfig[], baseRight: number): number {\n let maxExtra = 0;\n for (const pane of panes) {\n const { right } = countYAxes(pane.chart?.yAxis);\n maxExtra = Math.max(maxExtra, right * 65);\n }\n return baseRight + maxExtra;\n}\n\nfunction paneFlexStyle(ratio: number | string, direction: StackDirection): string {\n const minDim = direction === \"horizontal\" ? \"min-width:0;\" : \"min-height:0;\";\n if (typeof ratio === \"number\") {\n return `flex:${ratio} 1 0;${minDim}`;\n }\n return `flex:1 1 ${ratio};${minDim}`;\n}\n\nfunction expandPaneSeries(series?: SeriesOptions[]): SeriesOptions[] {\n if (!series?.length) return [];\n const out: SeriesOptions[] = [];\n for (const s of series) {\n if (s.type === \"indicator\") {\n out.push(...buildIndicatorSeries(s as IndicatorSeriesOptions));\n } else {\n out.push(s);\n }\n }\n return out;\n}\n\nfunction buildPaneChartOptions(\n pane: StackedPaneConfig,\n chartContainer: HTMLDivElement,\n stack: StackedChartOptions,\n index: number,\n total: number,\n alignedMargins: { left: number; right: number; top: number; bottom: number },\n showXAxis: boolean,\n showYAxis: boolean,\n direction: StackDirection,\n): Parameters<typeof createChart>[0] {\n const isFirst = index === 0;\n const isLast = index === total - 1;\n const isHorizontal = direction === \"horizontal\";\n const sharedBottom = !isHorizontal && stack.sharedXAxis !== \"none\";\n const compactX = sharedBottom && !showXAxis;\n const sharedLeft = isHorizontal && (stack.sharedYAxis ?? \"left\") !== \"none\";\n const compactY = sharedLeft && !showYAxis;\n const paneGap = stack.gap ?? 0;\n const compactMargin = paneGap > 0 ? STACKED_COMPACT_MARGIN : { top: 0, bottom: 0, left: 0 };\n\n const margins = isHorizontal\n ? {\n top: alignedMargins.top,\n right: isLast ? alignedMargins.right : compactMargin.left ?? 0,\n left: compactY ? (compactMargin.left ?? 4) : alignedMargins.left,\n bottom: alignedMargins.bottom,\n }\n : {\n top: isFirst ? alignedMargins.top : compactMargin.top,\n right: alignedMargins.right,\n left: alignedMargins.left,\n bottom: compactX\n ? compactMargin.bottom\n : isLast\n ? (stack.layout?.margins?.bottom ?? STACKED_FULL_X_MARGIN.bottom)\n : alignedMargins.bottom,\n };\n\n const baseX = pane.chart?.xAxis ?? {};\n const xAxis = {\n ...baseX,\n showLine: showXAxis ? baseX.showLine ?? true : false,\n showTicks: showXAxis ? baseX.showTicks ?? true : false,\n showLabels: showXAxis ? baseX.showLabels ?? true : false,\n };\n\n const baseY = pane.chart?.yAxis ?? {};\n const yAxisRaw = Array.isArray(baseY) ? baseY : [baseY];\n const yAxis = yAxisRaw.map((axis) => ({\n ...axis,\n showLine: showYAxis ? axis.showLine ?? true : false,\n showTicks: showYAxis ? axis.showTicks ?? true : false,\n showLabels: showYAxis ? axis.showLabels ?? true : false,\n }));\n const yAxisOption = Array.isArray(pane.chart?.yAxis) ? yAxis : yAxis[0];\n\n const isInteractive = pane.interactive ?? true;\n if (!isInteractive) {\n chartContainer.style.pointerEvents = \"none\";\n }\n\n return {\n ...pane.chart,\n id: pane.id,\n container: chartContainer,\n showLegend: pane.chart?.showLegend ?? stack.showLegend ?? false,\n theme: pane.chart?.theme ?? stack.theme,\n devicePixelRatio: stack.devicePixelRatio ?? pane.chart?.devicePixelRatio,\n loading: pane.chart?.loading ?? false,\n xAxis,\n yAxis: yAxisOption,\n layout: mergeLayoutOptions({\n ...stack.layout,\n ...pane.chart?.layout,\n margins: { ...margins, ...stack.layout?.margins, ...pane.chart?.layout?.margins },\n }),\n };\n}\n\nfunction wrapperStyle(ratio: number, gap: number, index: number, direction: StackDirection): string {\n const gapStyle =\n gap > 0 && index > 0\n ? direction === \"horizontal\"\n ? `margin-left:${gap}px;`\n : `margin-top:${gap}px;`\n : \"\";\n return `${paneFlexStyle(ratio, direction)}position:relative;overflow:hidden;${gapStyle}`;\n}\n\nfunction resolveStackSyncOptions(\n sync: StackedChartOptions[\"sync\"],\n masterPaneId: string,\n direction: StackDirection,\n): SyncOptions {\n if (sync === false) {\n return {\n axis: \"none\",\n syncCursor: false,\n syncZoom: false,\n syncPan: false,\n bidirectional: true,\n masterId: undefined,\n };\n }\n\n const defaultAxis: SyncOptions[\"axis\"] = direction === \"horizontal\" ? \"y\" : \"x\";\n\n return {\n axis: defaultAxis,\n bidirectional: true,\n masterId: masterPaneId,\n syncCursor: true,\n syncZoom: true,\n syncPan: true,\n ...(typeof sync === \"object\" ? sync : {}),\n };\n}\n\nexport function createStackedChart(options: StackedChartOptions): StackedChart {\n const { container, panes } = options;\n if (!container) throw new Error(\"[StackedChart] container is required\");\n if (panes.length < 1 || panes.length > STACKED_MAX_PANES) {\n throw new Error(`[StackedChart] panes must be 1–${STACKED_MAX_PANES}`);\n }\n\n const masterPaneId = options.masterPaneId ?? panes[0].id;\n const direction: StackDirection = options.direction ?? \"vertical\";\n const isHorizontal = direction === \"horizontal\";\n const sharedXAxis = options.sharedXAxis ?? \"bottom\";\n const sharedYAxis = options.sharedYAxis ?? \"left\";\n const gap = options.gap ?? 0;\n const resizableOpt = options.resizable;\n const resizable = !!resizableOpt;\n const resizeDividerSize =\n typeof resizableOpt === \"object\" ? (resizableOpt.dividerSize ?? 6) : 6;\n\n const baseLayout = mergeLayoutOptions(options.layout);\n const baseLeft = baseLayout.margins?.left ?? MARGINS.left;\n const baseRight = baseLayout.margins?.right ?? MARGINS.right;\n const baseTop = baseLayout.margins?.top ?? MARGINS.top;\n const alignedLeft = computeAlignedLeftMargin(panes, baseLeft);\n const alignedRight = computeAlignedRightMargin(panes, baseRight);\n\n container.replaceChildren();\n container.style.display = \"flex\";\n container.style.flexDirection = isHorizontal ? \"row\" : \"column\";\n container.style.width = \"100%\";\n const existingHeight = container.offsetHeight || parseInt(getComputedStyle(container).height, 10);\n const existingWidth = container.offsetWidth || parseInt(getComputedStyle(container).width, 10);\n if (isHorizontal) {\n if (existingWidth > 0) {\n container.style.width = `${existingWidth}px`;\n container.style.minWidth = `${existingWidth}px`;\n } else if (!container.style.width) {\n container.style.minWidth = \"480px\";\n }\n container.style.height = existingHeight > 0 ? `${existingHeight}px` : \"320px\";\n container.style.minHeight = container.style.height;\n } else {\n if (existingHeight > 0) {\n container.style.height = `${existingHeight}px`;\n container.style.minHeight = `${existingHeight}px`;\n } else if (!container.style.height) {\n container.style.minHeight = \"320px\";\n }\n }\n container.style.overflow = \"hidden\";\n container.style.position = \"relative\";\n\n const paneIds = panes.map((p) => p.id);\n const paneRatios = panes.map((p) => initialPaneRatio(p.height));\n const paneCharts = new Map<string, Chart>();\n const paneWrappers: HTMLDivElement[] = [];\n const paneAxisMetas: PaneAxisMeta[] = [];\n let paneResizeCtrl: PaneResizeController | null = null;\n let isPaneDragging = false;\n let resizeRaf = 0;\n let dragLayoutRaf = 0;\n let pendingDragLayout: {\n sizes: number[];\n leadingIdx: number;\n trailingIdx: number;\n } | null = null;\n\n const commitPaneLayout = (affected?: number[]) => {\n const indices =\n affected ??\n Array.from({ length: paneWrappers.length }, (_, i) => i);\n\n for (const i of indices) {\n const chart = paneCharts.get(paneIds[i]);\n if (chart) {\n chart.resize();\n }\n }\n adaptAllPaneAxes(\n indices.map((i) => paneAxisMetas[i]).filter(Boolean),\n );\n };\n\n const scheduleStackResize = () => {\n if (resizeRaf) return;\n resizeRaf = requestAnimationFrame(() => {\n resizeRaf = 0;\n if (isPaneDragging) return;\n commitPaneLayout();\n });\n };\n\n const resizeObserver = new ResizeObserver(() => {\n if (isPaneDragging) return;\n scheduleStackResize();\n });\n resizeObserver.observe(container);\n\n const applyFlexCss = () => {\n for (let i = 0; i < paneWrappers.length; i++) {\n paneWrappers[i].style.cssText = wrapperStyle(paneRatios[i], gap, i, direction);\n }\n };\n\n const stackAvailSize = () => {\n const dividerTotal = (paneWrappers.length - 1) * resizeDividerSize;\n if (isHorizontal) {\n return Math.max(1, container.clientWidth - dividerTotal);\n }\n return Math.max(1, container.clientHeight - dividerTotal);\n };\n\n const restorePaneChartDivs = () => {\n for (const wrapper of paneWrappers) {\n const chartDiv = wrapper.firstElementChild as HTMLDivElement | null;\n if (chartDiv) {\n chartDiv.style.cssText = \"position:absolute;inset:0;width:100%;height:100%;\";\n }\n }\n };\n\n const initDragSizes = (): number[] => {\n const avail = stackAvailSize();\n const measured = paneWrappers.map((w) =>\n isHorizontal ? w.getBoundingClientRect().width : w.getBoundingClientRect().height,\n );\n const sum = measured.reduce((s, h) => s + h, 0);\n return sum > 0 ? measured.map((h) => h * (avail / sum)) : measured;\n };\n\n const applyDragPaneSizes = (sizesPx: number[]) => {\n for (let i = 0; i < paneWrappers.length; i++) {\n const size = Math.max(1, Math.round(sizesPx[i]));\n const gapStyle =\n gap > 0 && i > 0\n ? isHorizontal\n ? `margin-left:${gap}px;`\n : `margin-top:${gap}px;`\n : \"\";\n const dim = isHorizontal ? \"width\" : \"height\";\n paneWrappers[i].style.cssText = `${dim}:${size}px;flex:0 0 auto;min-height:0;min-width:0;position:relative;overflow:hidden;${gapStyle}`;\n }\n };\n\n const flushDragLayout = () => {\n dragLayoutRaf = 0;\n if (!isPaneDragging || !pendingDragLayout) return;\n\n const { sizes, leadingIdx, trailingIdx } = pendingDragLayout;\n applyDragPaneSizes(sizes);\n\n for (const i of [leadingIdx, trailingIdx]) {\n const chart = paneCharts.get(paneIds[i]);\n if (chart) {\n chart.resize();\n adaptAllPaneAxes([paneAxisMetas[i]]);\n }\n }\n };\n\n const scheduleDragLayout = (\n sizesPx: number[],\n leadingIdx: number,\n trailingIdx: number,\n ) => {\n pendingDragLayout = { sizes: sizesPx, leadingIdx, trailingIdx };\n if (dragLayoutRaf) return;\n dragLayoutRaf = requestAnimationFrame(flushDragLayout);\n };\n\n const syncRatiosFromSizes = (sizesPx: number[]) => {\n const total = sizesPx.reduce((s, h) => s + h, 0);\n if (total <= 0) return;\n const totalR = paneRatios.reduce((s, r) => s + r, 0);\n for (let i = 0; i < paneRatios.length; i++) {\n paneRatios[i] = (sizesPx[i] / total) * totalR;\n }\n };\n\n const setAllChartsResizeSuspended = (suspended: boolean) => {\n for (const chart of paneCharts.values()) {\n chart.setResizeSuspended?.(suspended);\n }\n };\n\n const setInactiveChartsResizeSuspended = (\n topIdx: number,\n bottomIdx: number,\n ) => {\n for (let i = 0; i < paneIds.length; i++) {\n if (i === topIdx || i === bottomIdx) continue;\n paneCharts.get(paneIds[i])?.setResizeSuspended?.(true);\n }\n paneCharts.get(paneIds[topIdx])?.setResizeSuspended?.(false);\n paneCharts.get(paneIds[bottomIdx])?.setResizeSuspended?.(false);\n };\n\n const alignedBottom = isHorizontal\n ? (options.layout?.margins?.bottom ?? STACKED_FULL_X_MARGIN.bottom)\n : MARGINS.bottom;\n\n for (let i = 0; i < panes.length; i++) {\n const pane = panes[i];\n const isFirst = i === 0;\n const isLast = i === panes.length - 1;\n\n const showXAxis = isHorizontal\n ? (pane.showXAxis ?? true)\n : (pane.showXAxis ?? (sharedXAxis === \"bottom\" ? isLast : true));\n\n const showYAxis = isHorizontal\n ? (pane.showYAxis ?? (sharedYAxis === \"left\" ? isFirst : true))\n : (pane.showYAxis ?? true);\n\n const wrapper = document.createElement(\"div\");\n wrapper.dataset.paneId = pane.id;\n wrapper.style.cssText = wrapperStyle(paneRatios[i], gap, i, direction);\n\n const chartDiv = document.createElement(\"div\");\n chartDiv.style.cssText = \"position:absolute;inset:0;width:100%;height:100%;\";\n\n wrapper.appendChild(chartDiv);\n container.appendChild(wrapper);\n paneWrappers.push(wrapper);\n\n const chart = createChart(\n buildPaneChartOptions(\n pane,\n chartDiv,\n options,\n i,\n panes.length,\n {\n left: isHorizontal && !showYAxis ? MARGINS.left : alignedLeft,\n right: alignedRight,\n top: baseTop,\n bottom: alignedBottom,\n },\n showXAxis,\n showYAxis,\n direction,\n ),\n );\n\n const seriesList = expandPaneSeries(pane.series);\n if (seriesList.length) {\n for (const s of seriesList) chart.addSeries(s);\n }\n\n if (pane.yRange && pane.yRange !== \"auto\") {\n chart.zoom({ y: pane.yRange, animate: false });\n }\n\n paneCharts.set(pane.id, chart);\n\n paneAxisMetas.push({\n chart,\n wrapper,\n baseYTickCount: readBaseYTickCount(pane.chart?.yAxis),\n baseXTickCount: pane.chart?.xAxis?.tickCount ?? 8,\n showXAxis,\n });\n }\n\n if (resizable && panes.length > 1) {\n const resizeOpts =\n typeof resizableOpt === \"object\"\n ? {\n minPaneRatio: resizableOpt.minPaneRatio,\n minPanePx: resizableOpt.minPanePx,\n dividerSize: resizableOpt.dividerSize,\n }\n : {};\n paneResizeCtrl = attachPaneResize(\n container,\n paneWrappers,\n paneIds,\n paneRatios,\n {\n direction,\n ...resizeOpts,\n onDragStart: (leadingIdx, trailingIdx) => {\n isPaneDragging = true;\n setAllChartsResizeSuspended(true);\n setInactiveChartsResizeSuspended(leadingIdx, trailingIdx);\n return initDragSizes();\n },\n onDragMove: (sizes, leadingIdx, trailingIdx) => {\n scheduleDragLayout(sizes, leadingIdx, trailingIdx);\n },\n onDragEnd: (finalSizes) => {\n if (dragLayoutRaf) {\n cancelAnimationFrame(dragLayoutRaf);\n dragLayoutRaf = 0;\n }\n pendingDragLayout = null;\n isPaneDragging = false;\n const normalized = normalizePaneHeights(finalSizes, stackAvailSize());\n syncRatiosFromSizes(normalized);\n restorePaneChartDivs();\n applyFlexCss();\n setAllChartsResizeSuspended(false);\n commitPaneLayout();\n },\n },\n );\n }\n\n const master = paneCharts.get(masterPaneId);\n if (!master) {\n throw new Error(`[StackedChart] masterPaneId \"${masterPaneId}\" not found in panes`);\n }\n\n const group = createChartGroup(\n Array.from(paneCharts.values()),\n resolveStackSyncOptions(options.sync, masterPaneId, direction),\n );\n\n const getBackgroundColor = (): string => {\n const theme = master.theme ?? master.baseTheme;\n return theme?.backgroundColor ?? \"#ffffff\";\n };\n\n const waitForStackReady = (): Promise<void> => {\n const maxWait = 8000;\n const started = Date.now();\n\n const waitForInitQueue = (): Promise<void> =>\n new Promise((resolve) => {\n const poll = () => {\n const q = getInitQueueStatus();\n if ((q.pending === 0 && !q.isProcessing) || Date.now() - started > maxWait) {\n resolve();\n return;\n }\n setTimeout(poll, 50);\n };\n poll();\n });\n\n return waitForInitQueue().then(() => {\n return new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n commitPaneLayout();\n resolve();\n });\n });\n });\n };\n\n const runStackExport = async (opts: StackSnapshotOptions = {}): Promise<string> => {\n await waitForStackReady();\n for (const c of paneCharts.values()) c.render();\n await new Promise((r) => requestAnimationFrame(r));\n\n const dataUrl = await exportStackImage(\n container,\n paneWrappers,\n Array.from(paneCharts.values()),\n paneResizeCtrl?.dividers ?? [],\n getBackgroundColor(),\n opts,\n );\n\n if (opts.download) {\n const ext = opts.format === \"jpeg\" ? \"jpg\" : opts.format ?? \"png\";\n const link = document.createElement(\"a\");\n link.download = `${opts.fileName ?? \"velo-plot-stack\"}.${ext}`;\n link.href = dataUrl;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n return dataUrl;\n };\n\n const mountPane = (pane: StackedPaneConfig): Chart => {\n if (paneCharts.size >= STACKED_MAX_PANES) {\n throw new Error(`[StackedChart] Cannot exceed ${STACKED_MAX_PANES} panes`);\n }\n if (paneCharts.has(pane.id)) {\n throw new Error(`[StackedChart] Pane \"${pane.id}\" already exists`);\n }\n\n if (!isHorizontal && sharedXAxis === \"bottom\" && paneIds.length > 0) {\n const prevId = paneIds[paneIds.length - 1];\n paneCharts.get(prevId)?.updateXAxis({\n showLabels: false,\n showTicks: false,\n showLine: false,\n });\n }\n\n const newRatio = initialPaneRatio(pane.height ?? 0.25);\n const total = paneRatios.reduce((a, b) => a + b, 0);\n const scale = total > 0 ? (1 - newRatio) / total : 1;\n for (let j = 0; j < paneRatios.length; j++) paneRatios[j] *= scale;\n\n const index = paneIds.length;\n paneIds.push(pane.id);\n paneRatios.push(newRatio);\n\n const wrapper = document.createElement(\"div\");\n wrapper.dataset.paneId = pane.id;\n wrapper.style.cssText = wrapperStyle(paneRatios[index], gap, index, direction);\n\n const chartDiv = document.createElement(\"div\");\n chartDiv.style.cssText = \"position:absolute;inset:0;width:100%;height:100%;\";\n wrapper.appendChild(chartDiv);\n container.appendChild(wrapper);\n paneWrappers.push(wrapper);\n\n const isLast = true;\n const showXAxis = isHorizontal\n ? (pane.showXAxis ?? true)\n : (pane.showXAxis ?? (sharedXAxis === \"bottom\" ? isLast : true));\n const showYAxis = isHorizontal\n ? (pane.showYAxis ?? (sharedYAxis === \"left\" ? index === 0 : true))\n : (pane.showYAxis ?? true);\n\n const chart = createChart(\n buildPaneChartOptions(\n pane,\n chartDiv,\n options,\n index,\n paneIds.length,\n {\n left: isHorizontal && !showYAxis ? MARGINS.left : alignedLeft,\n right: alignedRight,\n top: baseTop,\n bottom: alignedBottom,\n },\n showXAxis,\n showYAxis,\n direction,\n ),\n );\n\n const seriesList = expandPaneSeries(pane.series);\n for (const s of seriesList) chart.addSeries(s);\n if (pane.yRange && pane.yRange !== \"auto\") {\n chart.zoom({ y: pane.yRange, animate: false });\n }\n\n paneCharts.set(pane.id, chart);\n paneAxisMetas.push({\n chart,\n wrapper,\n baseYTickCount: readBaseYTickCount(pane.chart?.yAxis),\n baseXTickCount: pane.chart?.xAxis?.tickCount ?? 8,\n showXAxis,\n });\n\n group.add(chart);\n applyFlexCss();\n commitPaneLayout();\n return chart;\n };\n\n const stack: StackedChart = {\n container,\n getPane(id: string) {\n return paneCharts.get(id);\n },\n getPanes() {\n return Array.from(paneCharts.values());\n },\n getMaster() {\n return master;\n },\n getGroup() {\n return group;\n },\n fitAll(opts) {\n group.fitAll(opts);\n },\n resetAll() {\n group.resetAll();\n },\n resize() {\n commitPaneLayout();\n },\n getPaneRatios() {\n const out: Record<string, number> = {};\n for (let i = 0; i < paneIds.length; i++) {\n out[paneIds[i]] = paneRatios[i];\n }\n return out;\n },\n setPaneRatios(ratios: Record<string, number>) {\n for (let i = 0; i < paneIds.length; i++) {\n const id = paneIds[i];\n if (ratios[id] !== undefined) paneRatios[i] = ratios[id];\n }\n applyPaneFlexRatios(paneWrappers, paneRatios, direction);\n commitPaneLayout();\n },\n setSyncAxis(axis) {\n group.syncAxis(axis);\n },\n getSyncAxis() {\n return group.getOptions().axis ?? \"x\";\n },\n setSyncOptions(syncOpts: Partial<StackedSyncOptions>) {\n group.updateOptions(syncOpts);\n },\n whenReady() {\n return waitForStackReady();\n },\n exportImage(opts) {\n return runStackExport(opts);\n },\n snapshot(opts) {\n return runStackExport(opts);\n },\n addPane(pane: StackedPaneConfig): Chart {\n return mountPane(pane);\n },\n async addIndicator(preset: IndicatorPresetName, opts: AddIndicatorOptions = {}) {\n const priceChart = paneCharts.get(masterPaneId) ?? master;\n if (opts.pane !== \"new\") {\n const overlay = await addIndicatorToChart(priceChart, preset, opts);\n return { ...overlay, chart: priceChart };\n }\n\n const source = resolveSourceSeries(priceChart, opts.sourceSeriesId);\n const { x, prices } = extractPriceSeries(source);\n const paneConfig = await buildIndicatorPaneFromPreset(preset, x, prices, {\n id: opts.id ?? preset,\n label: opts.label ?? preset.toUpperCase(),\n height: opts.paneHeight ?? 0.25,\n showXAxis: opts.showXAxis,\n period: opts.period,\n fastPeriod: opts.fastPeriod,\n slowPeriod: opts.slowPeriod,\n signalPeriod: opts.signalPeriod,\n stdDev: opts.stdDev,\n });\n\n const chart = mountPane(paneConfig);\n return {\n id: paneConfig.id,\n preset,\n placement: \"oscillator\" as const,\n seriesIds: paneConfig.series?.map((s) => s.id) ?? [],\n paneId: paneConfig.id,\n chart,\n };\n },\n destroy() {\n if (resizeRaf) cancelAnimationFrame(resizeRaf);\n if (dragLayoutRaf) cancelAnimationFrame(dragLayoutRaf);\n resizeObserver.disconnect();\n paneResizeCtrl?.destroy();\n group.destroy();\n for (const c of paneCharts.values()) c.destroy();\n paneCharts.clear();\n container.replaceChildren();\n },\n };\n\n return stack;\n}\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","useSciPlot","containerRef","options","chart","setChart","useState","isReady","setIsReady","error","setError","bounds","setBounds","optionsRef","useRef","useEffect","container","chartInstance","createChart","err","addSeries","useCallback","seriesOptions","updateSeries","id","data","removeSeries","zoom","zoomOptions","resetZoom","SciPlot","forwardRef","series","zoomProp","onZoomChange","cursor","width","height","className","style","debug","chartOptions","ref","previousSeriesRef","useImperativeHandle","currentSeriesMap","s","previousSeriesMap","_","seriesData","prevSeries","event","containerStyle","useMemo","jsx","jsxs","STACKED_MAX_PANES","STACKED_DEFAULT_MIN_PANE_RATIO","STACKED_COMPACT_MARGIN","STACKED_FULL_X_MARGIN","stackResolutionScale","res","loadImage","src","resolve","reject","img","relativeRect","el","containerRect","r","exportStackImage","paneWrappers","paneCharts","dividers","backgroundColor","format","quality","resolution","includeBackground","includeDividers","transparent","scale","exportDpr","_a","originalDprs","c","outW","outH","canvas","ctx","imageType","i","rect","dataUrl","divider","mime","DIVIDER_CLASS","RESIZING_CLASS","injectDividerStyles","direction","createDividerElement","index","size","handle","paneFlexStyle","ratio","minDim","resolveMinPaneHeightPx","availHeight","paneCount","minPaneRatio","minPanePx","byRatio","minH","resolveMinPaneWidthPx","availWidth","normalizePaneHeights","heightsPx","targetTotal","n","total","sum","h","even","out","scaled","allocated","attachPaneResize","paneIds","ratios","isHorizontal","dividerSize","minPaneSize","avail","cleanups","availableSize","dividerTotal","main","applyRatios","leadingIdx","trailingIdx","delta","sizesPx","minS","othersSum","idx","pairTotal","leadingSize","trailingSize","byId","onPointerDown","e","w","_b","lastCoord","onMove","ev","coord","d","onUp","fn","applyPaneFlexRatios","initialPaneRatio","tickCountForPaneHeight","heightPx","base","adaptive","tickCountForPaneWidth","widthPx","readBaseYTickCount","yAxis","adaptPaneAxes","meta","yTicks","xTicks","adaptAllPaneAxes","metas","m","countYAxes","axes","left","right","a","computeAlignedLeftMargin","panes","baseLeft","maxExtra","pane","computeAlignedRightMargin","baseRight","expandPaneSeries","buildIndicatorSeries","buildPaneChartOptions","chartContainer","stack","alignedMargins","showXAxis","showYAxis","isFirst","isLast","compactX","compactY","compactMargin","margins","baseX","_c","xAxis","baseY","_d","axis","yAxisOption","_e","_f","_g","_h","_i","mergeLayoutOptions","_j","_k","_m","_l","wrapperStyle","gap","gapStyle","resolveStackSyncOptions","sync","masterPaneId","createStackedChart","sharedXAxis","sharedYAxis","resizableOpt","resizable","resizeDividerSize","baseLayout","MARGINS","baseTop","alignedLeft","alignedRight","existingHeight","existingWidth","p","paneRatios","paneAxisMetas","paneResizeCtrl","isPaneDragging","resizeRaf","dragLayoutRaf","pendingDragLayout","commitPaneLayout","affected","indices","scheduleStackResize","resizeObserver","applyFlexCss","stackAvailSize","restorePaneChartDivs","wrapper","chartDiv","initDragSizes","measured","applyDragPaneSizes","dim","flushDragLayout","sizes","scheduleDragLayout","syncRatiosFromSizes","totalR","setAllChartsResizeSuspended","suspended","setInactiveChartsResizeSuspended","topIdx","bottomIdx","alignedBottom","seriesList","resizeOpts","finalSizes","normalized","master","group","createChartGroup","getBackgroundColor","theme","waitForStackReady","started","poll","q","getInitQueueStatus","runStackExport","opts","ext","link","mountPane","prevId","newRatio","b","j","syncOpts","preset","priceChart","addIndicatorToChart","source","resolveSourceSeries","x","prices","extractPriceSeries","paneConfig","buildIndicatorPaneFromPreset"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SeriesStyle } from './seriesAdapter';
|
|
2
|
+
import { NativeSeriesRenderData } from '../../renderer/native/types';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Bounds interface matching the original
|
|
@@ -42,6 +43,11 @@ export interface GpuRenderOptions {
|
|
|
42
43
|
height: number;
|
|
43
44
|
};
|
|
44
45
|
}
|
|
46
|
+
export interface GpuNativeRenderOptions extends GpuRenderOptions {
|
|
47
|
+
invertX?: boolean;
|
|
48
|
+
plotAreaBackground?: [number, number, number, number];
|
|
49
|
+
dpr?: number;
|
|
50
|
+
}
|
|
45
51
|
/**
|
|
46
52
|
* Backend preference
|
|
47
53
|
*/
|
|
@@ -84,6 +90,21 @@ export declare class GpuRenderer {
|
|
|
84
90
|
* Set device pixel ratio
|
|
85
91
|
*/
|
|
86
92
|
setDPR(dpr: number): void;
|
|
93
|
+
/**
|
|
94
|
+
* Check if vertex data exists for a buffer id
|
|
95
|
+
*/
|
|
96
|
+
hasBuffer(id: string): boolean;
|
|
97
|
+
hasColormap(id: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Render from NativeWebGLRenderer-compatible series descriptors (chart integration path).
|
|
100
|
+
*/
|
|
101
|
+
renderNativeSeries(series: NativeSeriesRenderData[], options: GpuNativeRenderOptions): void;
|
|
102
|
+
private appendBoxplotDraws;
|
|
103
|
+
private appendWaterfallDraws;
|
|
104
|
+
private pushDraw;
|
|
105
|
+
private seriesColor;
|
|
106
|
+
private colorFromHex;
|
|
107
|
+
private mapNativeDrawKind;
|
|
87
108
|
/**
|
|
88
109
|
* Create or update a buffer
|
|
89
110
|
*/
|
|
@@ -49,7 +49,8 @@ export declare class WebGPUBackend implements GpuBackend {
|
|
|
49
49
|
* Render a single draw call
|
|
50
50
|
*/
|
|
51
51
|
private renderDrawCall;
|
|
52
|
-
|
|
52
|
+
/** Triangle list with line-pipeline uniforms (xy vertices, uniform color). */
|
|
53
|
+
private renderSolidTriangles;
|
|
53
54
|
private renderLine;
|
|
54
55
|
private renderPoints;
|
|
55
56
|
private renderBand;
|