@mmflow/charts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/eventBus.ts","../src/core/DataStore.ts","../src/core/RendererGL.ts","../src/core/Constants.ts","../src/core/Scene.ts","../src/core/Viewport.ts","../src/core/Pane.ts","../src/core/GlyphAtlas.ts","../src/shaders/common.ts","../src/core/TextBatch.ts","../src/core/PerfReporter.ts","../src/core/Theme.ts","../src/core/uiColors.ts","../src/core/format.ts","../src/core/ChartTypes.ts","../src/core/IndicatorCatalog.ts","../src/core/IndicatorLibrary.ts","../src/core/Drawings.ts","../src/layers/BackgroundLayer.ts","../src/layers/CandleLayer.ts","../src/layers/CrosshairLayer.ts","../src/layers/DrawingsLayer.ts","../src/layers/ExtremaAnnotationLayer.ts","../src/layers/HorizontalLineLayer.ts","../src/layers/IndicatorLayer.ts","../src/layers/MarkerLayer.ts","../src/layers/OiHistoryLayer.ts","../src/layers/OrderBookHeatmapLayer.ts","../src/layers/PaneLegendLayer.ts","../src/layers/PriceAxisLayer.ts","../src/layers/TimeAxisLayer.ts","../src/layers/VolumeFootprintLayer.ts","../src/layers/VolumeLayer.ts","../src/layers/VolumeProfileLayer.ts","../src/api/dataFeed.ts","../src/api/indicator.ts","../src/api/theme.ts","../src/api/studies.ts","../src/api/Chart.ts"],"names":["i","QUAD_CORNERS","ex","ey","pad2","BODY_WIDTH_FRACTION","hexToRgba","api"],"mappings":"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","file":"index.js","sourcesContent":["export type EngineEvent =\n | { type: \"viewport:changed\" }\n | { type: \"data:updated\"; series: string }\n | { type: \"crosshair:hover\"; timeIdx: number | null; px: number; py: number }\n | { type: \"crosshair:leave\" }\n | { type: \"theme:changed\" };\n\ntype Listener = (e: EngineEvent) => void;\n\nexport class EventBus {\n private readonly listeners = new Set<Listener>();\n\n on(fn: Listener): () => void {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n }\n\n emit(e: EngineEvent): void {\n // Snapshot so listeners can subscribe/unsubscribe during dispatch\n // without corrupting iteration. Isolate per-listener exceptions so\n // one broken subscriber can't prevent later ones — particularly\n // Scene's repaint trigger — from receiving the event.\n for (const fn of Array.from(this.listeners)) {\n try {\n fn(e);\n } catch (err) {\n console.error(\"[EventBus] listener threw:\", err);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { EventBus } from \"./eventBus\";\n\nexport interface OhlcvBuffer {\n // Parallel typed arrays let layers iterate by index without allocations.\n // `length` is the count of valid points, not the underlying capacity.\n // OHLCV uses Float64 because Float32 only has ~7 significant digits —\n // BTC at $67,234.51 vs $67,234.52 would quantize to the same float\n // (ULP ≈ 0.008 near 65536), making candles render flat / mis-coloured.\n time: Float64Array;\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n volume: Float64Array;\n length: number;\n capacity: number;\n}\n\nexport interface OhlcvColumns {\n time: ArrayLike<number>;\n open: ArrayLike<number>;\n high: ArrayLike<number>;\n low: ArrayLike<number>;\n close: ArrayLike<number>;\n volume: ArrayLike<number>;\n /** Valid row count. Defaults to the shortest supplied column length. */\n length?: number;\n}\n\nconst INITIAL_CAPACITY = 4096;\n\nconst makeBuffer = (capacity: number): OhlcvBuffer => ({\n time: new Float64Array(capacity),\n open: new Float64Array(capacity),\n high: new Float64Array(capacity),\n low: new Float64Array(capacity),\n close: new Float64Array(capacity),\n volume: new Float64Array(capacity),\n length: 0,\n capacity,\n});\n\nconst grow = (buf: OhlcvBuffer, minCapacity: number): OhlcvBuffer => {\n if (buf.capacity >= minCapacity) return buf;\n let cap = buf.capacity;\n while (cap < minCapacity) cap *= 2;\n const next = makeBuffer(cap);\n next.time.set(buf.time.subarray(0, buf.length));\n next.open.set(buf.open.subarray(0, buf.length));\n next.high.set(buf.high.subarray(0, buf.length));\n next.low.set(buf.low.subarray(0, buf.length));\n next.close.set(buf.close.subarray(0, buf.length));\n next.volume.set(buf.volume.subarray(0, buf.length));\n next.length = buf.length;\n return next;\n};\n\nconst isOhlcvColumns = (value: unknown): value is OhlcvColumns => {\n const v = value as Partial<OhlcvColumns> | null;\n return !!v && !!v.time && !!v.open && !!v.high && !!v.low && !!v.close && !!v.volume;\n};\n\nconst columnsCapacity = (cols: OhlcvColumns): number =>\n Math.min(\n cols.time.length,\n cols.open.length,\n cols.high.length,\n cols.low.length,\n cols.close.length,\n cols.volume.length,\n );\n\nconst copyColumn = (src: ArrayLike<number>, length: number): Float64Array => {\n if (src instanceof Float64Array && src.length >= length) return src;\n const out = new Float64Array(length);\n for (let i = 0; i < length; i++) out[i] = Number(src[i]);\n return out;\n};\n\nconst columnsToBuffer = (cols: OhlcvColumns): OhlcvBuffer => {\n const capacity = columnsCapacity(cols);\n const length =\n typeof cols.length === \"number\" && isFinite(cols.length)\n ? Math.max(0, Math.min(capacity, Math.floor(cols.length)))\n : capacity;\n return {\n time: copyColumn(cols.time, capacity),\n open: copyColumn(cols.open, capacity),\n high: copyColumn(cols.high, capacity),\n low: copyColumn(cols.low, capacity),\n close: copyColumn(cols.close, capacity),\n volume: copyColumn(cols.volume, capacity),\n length,\n capacity,\n };\n};\n\nexport class DataStore {\n private candles_: OhlcvBuffer = makeBuffer(INITIAL_CAPACITY);\n // `ready` gates the live-tail path. While false (between a coin/interval\n // switch and the historical fetch landing), applyTrade is a no-op so\n // new-coin trades can't pollute the old-coin buffer and trades from\n // before the snapshot lands can't be clobbered by setCandles.\n private ready_ = false;\n\n constructor(private readonly bus: EventBus) {}\n\n get candles(): OhlcvBuffer {\n return this.candles_;\n }\n\n get ready(): boolean {\n return this.ready_;\n }\n\n setCandles(rows: ReadonlyArray<{\n t: number;\n o: number;\n h: number;\n l: number;\n c: number;\n v: number;\n }> | OhlcvColumns): void {\n if (isOhlcvColumns(rows)) {\n this.setCandleColumns(rows);\n return;\n }\n this.candles_ = grow(this.candles_, rows.length);\n const b = this.candles_;\n // Drop rows whose timestamp isn't finite — a NaN at the buffer tail\n // would defeat applyTrade's monotonic guard (NaN comparisons are\n // always false), allowing later trades to inline-append past the\n // NaN and corrupt firstIndexAtOrAfter's binary search. Cheap\n // defence at the snapshot boundary.\n let n = 0;\n for (let i = 0; i < rows.length; i++) {\n const r = rows[i];\n if (!isFinite(r.t)) continue;\n b.time[n] = r.t;\n b.open[n] = r.o;\n b.high[n] = r.h;\n b.low[n] = r.l;\n b.close[n] = r.c;\n b.volume[n] = r.v;\n n++;\n }\n b.length = n;\n // ready_ semantic is \"snapshot has landed AND has data\" — an empty\n // result (newly listed coin, no candles in the window) shouldn't\n // open the live-tail gate, because applyTrade would then write a\n // single off-grid candle against a fallback viewport range.\n this.ready_ = n > 0;\n this.bus.emit({ type: \"data:updated\", series: \"candles\" });\n }\n\n setCandleColumns(columns: OhlcvColumns): void {\n this.candles_ = columnsToBuffer(columns);\n this.ready_ = this.candles_.length > 0;\n this.bus.emit({ type: \"data:updated\", series: \"candles\" });\n }\n\n // Live-tail incremental update. Folds a single trade into the candle\n // bucket aligned to `bucketStart` — extends the latest bar's high/low,\n // updates close, accumulates volume. Appends a new bar when the trade\n // crosses the bucket boundary. Caller computes bucketStart via\n // `floor(trade.time / intervalMs) * intervalMs`.\n // Returns true iff the call actually mutated the buffer. Caller can\n // skip the batched 'data:updated' emit when every trade in a frame\n // was rejected (e.g., reconnect replays predating the snapshot's\n // tail) — saves a wasted full-scene markAllDirty.\n applyTrade(bucketStart: number, price: number, size: number): boolean {\n // bucketStart from `floor(NaN / ms) * ms` is NaN; both equality and\n // ordering comparisons with NaN are false, so without this guard\n // applyTrade would inline-append a NaN-time row that poisons\n // firstIndexAtOrAfter's binary search.\n if (!isFinite(bucketStart)) return false;\n // price > 0 guard catches HL halt/settlement glitches that could\n // otherwise sink b.low to 0 permanently. size > 0 catches zero-fills.\n if (!isFinite(price) || price <= 0 || !isFinite(size) || size <= 0) return false;\n // Drop trades arriving before the historical snapshot has landed —\n // otherwise new-coin trades pollute the previous coin's buffer and\n // pre-snapshot trades get clobbered when setCandles writes the\n // historical window.\n if (!this.ready_) return false;\n const b = this.candles_;\n if (b.length > 0 && b.time[b.length - 1] === bucketStart) {\n const i = b.length - 1;\n if (price > b.high[i]) b.high[i] = price;\n if (price < b.low[i]) b.low[i] = price;\n b.close[i] = price;\n b.volume[i] += size;\n // Caller in ChartEngine batches per WS frame and re-emits once at\n // the end. We skip the per-trade emit to avoid 50-100 markAllDirty\n // cycles per HL batch during volatility.\n return true;\n }\n // Refuse to append a bar that's older than the latest known bar —\n // protects the buffer's monotonic-time invariant that\n // firstIndexAtOrAfter (binary search) and priceExtent rely on.\n // This guards against (a) out-of-order WS replays, (b) coin/interval\n // switch races where applyTrade fires before clear() lands, and (c)\n // weekly/monthly bucket-alignment drift in the caller.\n if (b.length > 0 && bucketStart < b.time[b.length - 1]) return false;\n // Inline-append so the caller's batched 'data:updated' emit fires\n // at most once per WS frame — a separate helper that emitted\n // internally would double-fire on every bucket-crossing trade.\n const grown = grow(b, b.length + 1);\n const i = grown.length;\n grown.time[i] = bucketStart;\n grown.open[i] = price;\n grown.high[i] = price;\n grown.low[i] = price;\n grown.close[i] = price;\n grown.volume[i] = size;\n grown.length = i + 1;\n this.candles_ = grown;\n return true;\n }\n\n clear(): void {\n this.candles_.length = 0;\n this.ready_ = false;\n this.bus.emit({ type: \"data:updated\", series: \"candles\" });\n }\n\n // Returns [minLow, maxHigh] across candles in [tStart..tEnd], or null\n // if no candles fall in range. Used by Viewport auto-fit so the price\n // axis frames the visible data.\n priceExtent(tStart: number, tEnd: number): [number, number] | null {\n const b = this.candles_;\n if (b.length === 0) return null;\n let lo = Number.POSITIVE_INFINITY;\n let hi = Number.NEGATIVE_INFINITY;\n let touched = false;\n for (let i = 0; i < b.length; i++) {\n const t = b.time[i];\n if (t < tStart || t > tEnd) continue;\n touched = true;\n if (b.low[i] < lo) lo = b.low[i];\n if (b.high[i] > hi) hi = b.high[i];\n }\n if (!touched || !isFinite(lo) || !isFinite(hi) || hi <= lo) return null;\n return [lo, hi];\n }\n\n // Index of the candle whose bucket CONTAINS time `t` (the bar the\n // cursor is \"inside\"), clamped to the ends, or -1 if there are no\n // candles. This is the canonical hover→bar resolution shared by the\n // OHLC legend and the crosshair magnet so the vertical line, the time\n // label, and the O/H/L/C readout always agree on which bar is hovered.\n // (A nearest-CENTRE rule would disagree with the legend in a bar's\n // far half — line on bar N+1 while the legend reads bar N.)\n barIndexContaining(t: number): number {\n const b = this.candles_;\n if (b.length === 0) return -1;\n let i = this.firstIndexAtOrAfter(t);\n // Past the last bar — clamp to the last.\n if (i >= b.length) return b.length - 1;\n // firstIndexAtOrAfter gives the first bar with time >= t; the bar\n // whose bucket contains t is the one before it unless t landed\n // exactly on a bar's open time.\n if (i > 0 && b.time[i] > t) i -= 1;\n return i;\n }\n\n // Open time of the candle whose bucket contains `t`, or null when\n // there are no candles. Thin wrapper over barIndexContaining for the\n // crosshair magnet, which snaps in time space.\n barTimeContaining(t: number): number | null {\n const i = this.barIndexContaining(t);\n return i < 0 ? null : this.candles_.time[i];\n }\n\n // Binary search for the index of the first candle with time >= t. Used\n // by layers to cull off-screen candles when iterating the visible\n // window during paint.\n firstIndexAtOrAfter(t: number): number {\n const b = this.candles_;\n let lo = 0;\n let hi = b.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (b.time[mid] < t) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n // Replace the current candle window by delegating the actual transport\n // to an injected fetcher, then folding the returned rows in via\n // setCandles. Caller passes an AbortSignal so coin/interval switches\n // cancel in-flight requests cleanly. Returns true on success, false on\n // abort or error.\n //\n // The fetcher is injected (rather than hardcoding a `fetch(...)` against\n // a specific venue endpoint) so this package stays venue-agnostic —\n // candle transport now flows through DataFeed.fetchCandles (see the\n // @mmflow/charts `api/` DataFeed contract). The default throws so a\n // host that forgets to wire a feed fails loudly instead of silently\n // hitting a phantom endpoint.\n async requestRange(\n coin: string,\n interval: string,\n startTime: number,\n endTime: number,\n signal?: AbortSignal,\n fetcher: RangeFetcher = defaultRangeFetcher,\n ): Promise<boolean> {\n try {\n const raw = await fetcher({ coin, interval, startTime, endTime, signal });\n if (signal?.aborted) return false;\n this.setCandles(\n raw.map((r) => ({\n t: r.t,\n o: typeof r.o === \"string\" ? parseFloat(r.o) : r.o,\n h: typeof r.h === \"string\" ? parseFloat(r.h) : r.h,\n l: typeof r.l === \"string\" ? parseFloat(r.l) : r.l,\n c: typeof r.c === \"string\" ? parseFloat(r.c) : r.c,\n v: typeof r.v === \"string\" ? parseFloat(r.v) : r.v,\n })),\n );\n return true;\n } catch (err) {\n if ((err as { name?: string })?.name === \"AbortError\") return false;\n console.error(\"[DataStore] requestRange failed:\", err);\n return false;\n }\n }\n}\n\n// A row as returned by a venue's candle transport — string-or-number\n// OHLCV (some venues serialize prices as strings). requestRange coerces\n// to number before writing the typed-array buffer.\nexport interface RawCandleRow {\n t: number;\n o: string | number;\n h: string | number;\n l: string | number;\n c: string | number;\n v: string | number;\n}\n\nexport interface RangeFetchRequest {\n coin: string;\n interval: string;\n startTime: number;\n endTime: number;\n signal?: AbortSignal;\n}\n\n// Pluggable candle transport for DataStore.requestRange. Hosts inject a\n// concrete implementation (the mmflow app forwards to its HL `/info`\n// route); the engine itself ships no venue coupling.\nexport type RangeFetcher = (\n req: RangeFetchRequest,\n) => Promise<ReadonlyArray<RawCandleRow>>;\n\nconst defaultRangeFetcher: RangeFetcher = () => {\n throw new Error(\n \"DataStore.requestRange: no candle fetcher configured. Pass a RangeFetcher \" +\n \"(see the @mmflow/charts DataFeed api) or call setCandles() directly.\",\n );\n};\n","import createREGL from \"regl\";\nimport type REGL from \"regl\";\n\nexport interface RendererGLOptions {\n canvas: HTMLCanvasElement;\n onContextLost?: () => void;\n onContextRestored?: () => void;\n}\n\nexport class RendererGL {\n readonly regl: REGL.Regl;\n private readonly canvas: HTMLCanvasElement;\n private readonly handleLost: (e: Event) => void;\n private readonly handleRestored: () => void;\n private disposed = false;\n\n constructor(opts: RendererGLOptions) {\n this.canvas = opts.canvas;\n // WebGL2 + alpha for theme background; antialias=false because we paint\n // sharp axis lines and pixel-aligned candles ourselves.\n this.regl = createREGL({\n canvas: opts.canvas,\n attributes: {\n alpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: true,\n powerPreference: \"high-performance\",\n },\n // Shader-level GL extensions don't auto-activate from the\n // `#extension ... : enable` preprocessor directive — regl\n // (and the underlying gl.getExtension call) must be told\n // explicitly which ones to load. ANGLE_instanced_arrays\n // backs the divisor:1 attributes used by every instanced\n // layer (candles, volume bars, footprint cells, markers).\n // OES_standard_derivatives backs the fwidth() call in\n // MARKER_FRAG. Listed as optionalExtensions so a driver\n // missing one falls back gracefully (instanced layers\n // wouldn't render; markers degrade to hard edges) rather\n // than failing the whole regl init.\n optionalExtensions: [\"ANGLE_instanced_arrays\", \"OES_standard_derivatives\"],\n });\n\n this.handleLost = (e: Event) => {\n e.preventDefault();\n opts.onContextLost?.();\n };\n this.handleRestored = () => {\n opts.onContextRestored?.();\n };\n this.canvas.addEventListener(\"webglcontextlost\", this.handleLost, false);\n this.canvas.addEventListener(\n \"webglcontextrestored\",\n this.handleRestored,\n false,\n );\n }\n\n resize(cssW: number, cssH: number, dpr: number): void {\n if (this.disposed) return;\n const w = Math.max(1, Math.round(cssW * dpr));\n const h = Math.max(1, Math.round(cssH * dpr));\n if (this.canvas.width !== w) this.canvas.width = w;\n if (this.canvas.height !== h) this.canvas.height = h;\n this.canvas.style.width = `${cssW}px`;\n this.canvas.style.height = `${cssH}px`;\n this.regl.poll();\n }\n\n clear(color: [number, number, number, number]): void {\n this.regl.clear({ color });\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.canvas.removeEventListener(\n \"webglcontextlost\",\n this.handleLost,\n false,\n );\n this.canvas.removeEventListener(\n \"webglcontextrestored\",\n this.handleRestored,\n false,\n );\n this.regl.destroy();\n }\n}\n","// Shared chart layout + typography constants.\n//\n// Plot-rect gutters (CSS px): the reserved margin around the candle\n// plot. `right` is the price-axis width, `bottom` is the time-axis\n// height, `top` / `left` are breathing room. These were previously\n// duplicated three times — Viewport (full padding), Pane (horizontal\n// padding) and Scene (global top/bottom) each hardcoded the same\n// numbers, so changing the axis-gutter width meant editing all three\n// and hoping they stayed in agreement. This is the single source; each\n// consumer derives the subset it needs.\nexport const PLOT_GUTTER = {\n top: 8,\n right: 92,\n bottom: 32,\n left: 8,\n} as const;\n\n// Typography hierarchy: axis tick labels render at this fraction of the\n// glyph atlas's baked size, so they sit visually below the prominent\n// on-plot readouts (crosshair price/time, OHLC legend) which stay at\n// the full baked size. The atlas is baked once at its base size (× DPR),\n// so this only ever DOWN-scales — crisp under the atlas's linear filter,\n// never the blur of upscaling. ~9px against the 11px base.\nexport const AXIS_LABEL_SCALE = 0.85;\n","import type { Layer, RenderContext } from \"./Layer\";\nimport type { Viewport } from \"./Viewport\";\nimport type { ChartTheme } from \"./Theme\";\nimport type { RendererGL } from \"./RendererGL\";\nimport type { EventBus } from \"./eventBus\";\nimport type { GlyphAtlas } from \"./GlyphAtlas\";\nimport type { Pane } from \"./Pane\";\nimport type { PerfReporter } from \"./PerfReporter\";\nimport { PLOT_GUTTER } from \"./Constants\";\n\n// Scene orchestrates one or more vertically stacked Panes. Each pane\n// has its own price scale and y-region; the time range is fanned out\n// across every pane so a single pan/zoom interaction moves them all\n// together. Paints happen pane-by-pane with a GL scissor restricting\n// each pane's draws to its own slice of the canvas — so a CandleLayer\n// in the main pane can't leak pixels into the volume pane below.\n//\n// `globalPadding` is the chart-wide top/bottom gutter shared across\n// every pane (no left/right because panes always span the full width).\nexport interface ScenePadding {\n top: number;\n bottom: number;\n}\n\nconst DEFAULT_GLOBAL_PADDING: ScenePadding = {\n top: PLOT_GUTTER.top,\n bottom: PLOT_GUTTER.bottom,\n};\n\nexport class Scene {\n private readonly panes: Pane[] = [];\n // Global layers paint AFTER every pane, with no GL scissor — they\n // can draw anywhere on the canvas. Used for the crosshair (its\n // vertical line should span every pane, and its time label sits in\n // the bottom gutter outside any single pane's slice).\n private readonly globalLayers: Layer[] = [];\n private raf: number | null = null;\n private viewportDirty = true;\n private detachBus: (() => void) | null = null;\n private running = false;\n // How many frames have thrown. The loop's catch logs the first few\n // (the diagnostic ones) and then stays quiet, so a persistent fault\n // surfaces in the console without spamming it 60×/second.\n private frameErrors = 0;\n private cssWidth = 0;\n private cssHeight = 0;\n private dpr = 1;\n // Dev-only paint-time sampler. Set via setPerfReporter when the\n // host wants to flip on the `?perf=1` overlay; null in normal\n // production renders so Pane.paint's reporter branch short-\n // circuits to a single `!== undefined` check per layer per frame.\n private perfReporter: PerfReporter | null = null;\n globalPadding: ScenePadding = { ...DEFAULT_GLOBAL_PADDING };\n\n constructor(\n private readonly renderer: RendererGL,\n private readonly theme: () => ChartTheme,\n private readonly bus: EventBus,\n private readonly glyphAtlas: GlyphAtlas,\n ) {\n this.detachBus = bus.on((e) => {\n if (e.type === \"viewport:changed\") this.viewportDirty = true;\n if (e.type === \"data:updated\") this.markAllDirty();\n if (e.type === \"theme:changed\") this.markAllDirty();\n if (e.type === \"crosshair:hover\" || e.type === \"crosshair:leave\") {\n // Crosshair-only events don't dirty other layers; the\n // CrosshairLayer subscribes directly and self-dirties.\n }\n });\n }\n\n addPane(pane: Pane): void {\n this.panes.push(pane);\n // Apply current layout immediately so the pane's viewport has a\n // valid plot rect before its first frame.\n if (this.cssWidth > 0 && this.cssHeight > 0) {\n pane.layout(this.cssWidth, this.cssHeight, this.dpr, this.globalPadding);\n }\n pane.markAllDirty();\n this.viewportDirty = true;\n }\n\n // Register a layer that paints AFTER every pane with no GL scissor —\n // it can render anywhere on the canvas. Used by the crosshair so\n // its vertical line spans all panes and its time label can sit in\n // the canvas bottom gutter outside any single pane's slice.\n addGlobalLayer(layer: Layer): void {\n this.globalLayers.push(layer);\n layer.dirty = true;\n this.viewportDirty = true;\n }\n\n removePane(id: string): void {\n const i = this.panes.findIndex((p) => p.id === id);\n if (i >= 0) {\n const [removed] = this.panes.splice(i, 1);\n removed.dispose();\n this.viewportDirty = true;\n }\n }\n\n getPane(id: string): Pane | undefined {\n return this.panes.find((p) => p.id === id);\n }\n\n // Primary pane = first added. Used by interactions that don't have\n // a natural target pane (e.g., wheel zoom on the time axis), and by\n // global helpers that need a representative viewport.\n // The y-top-most VISIBLE pane. Hidden panes are skipped so\n // global-layer references (e.g. a future global header / top-edge\n // overlay) target a real on-canvas slice. Hosts that need the\n // first-by-position pane regardless of visibility can iterate\n // `panes` directly.\n primary(): Pane | undefined {\n for (const pane of this.panes) {\n if (pane.visible) return pane;\n }\n return undefined;\n }\n\n // The y-bottom-most VISIBLE pane — used as the reference viewport\n // for global layers (the time axis labels sit at its plot.y +\n // plot.h + 6). Skipping hidden panes is load-bearing: when the\n // user hides the volume sub-pane, the time axis needs to track\n // the new bottom pane (oi → rsi → main, whichever is last visible)\n // so labels stay anchored just under the last data row instead of\n // floating at a stale \"where volume used to be\" position.\n bottom(): Pane | undefined {\n for (let i = this.panes.length - 1; i >= 0; i--) {\n if (this.panes[i].visible) return this.panes[i];\n }\n return undefined;\n }\n\n setSize(cssWidth: number, cssHeight: number, dpr: number): void {\n this.cssWidth = cssWidth;\n this.cssHeight = cssHeight;\n this.dpr = dpr;\n for (const pane of this.panes) {\n pane.layout(cssWidth, cssHeight, dpr, this.globalPadding);\n }\n }\n\n // Time interactions fan out across every pane so they pan/zoom in\n // lockstep. Price interactions only affect the pane under the\n // cursor (caller picks the pane).\n panTimePixels(dxCss: number): void {\n for (const pane of this.panes) {\n // Pan only the time axis on shared events. We borrow Viewport's\n // panPixels but supply dy=0 so each pane's price scale stays put.\n pane.viewport.panPixels(dxCss, 0);\n }\n }\n\n zoomTimeAt(cssX: number, factor: number): void {\n for (const pane of this.panes) {\n pane.viewport.zoomTimeAt(cssX, factor);\n }\n }\n\n setTimeRange(t0: number, t1: number): void {\n for (const pane of this.panes) {\n pane.viewport.setTimeRange(t0, t1);\n }\n }\n\n // Return the pane whose plotCss covers cssY. Used by pointer handlers\n // to attribute price-axis interactions (vertical pan, shift+wheel\n // zoom) to the right pane.\n paneAt(cssY: number): Pane | undefined {\n for (const pane of this.panes) {\n // Hidden panes don't intercept hit-tests — a click that would\n // have landed on the hidden pane's old slice goes to whatever\n // visible pane now occupies that y-range (typically the main\n // pane after its post-toggle bounds expansion).\n if (!pane.visible) continue;\n const plot = pane.viewport.plotCss;\n if (cssY >= plot.y && cssY <= plot.y + plot.h) return pane;\n }\n return undefined;\n }\n\n markAllDirty(): void {\n for (const pane of this.panes) pane.markAllDirty();\n for (const l of this.globalLayers) l.dirty = true;\n }\n\n /**\n * Re-run the per-pane layout pass using the Scene's current size +\n * DPR. The host calls this after mutating any pane's `bounds`\n * (e.g. when redistributing space across remaining visible panes\n * after a sub-pane toggle) so the viewport padding picks up the\n * new slice. Doesn't call `markAllDirty()` itself — the host can\n * batch a single dirty pass after multiple bound mutations.\n *\n * No-op when the Scene hasn't been sized yet (pre-first-frame);\n * the next `setSize` call will pick up the new bounds naturally.\n */\n relayout(): void {\n if (this.cssWidth <= 0 || this.cssHeight <= 0) return;\n for (const pane of this.panes) {\n pane.layout(this.cssWidth, this.cssHeight, this.dpr, this.globalPadding);\n }\n this.viewportDirty = true;\n }\n\n /**\n * Attach a dev-only paint-time sampler. Pass `null` to detach.\n * The reporter is threaded through the RenderContext built for\n * each pane + global layer, where Pane.paint and Scene.paint\n * wrap individual layer paints with `performance.now()` bookends\n * when present. Cost when null: a single `?? undefined` per\n * frame in the buildCtx call.\n */\n setPerfReporter(reporter: PerfReporter | null): void {\n this.perfReporter = reporter;\n }\n\n notifyContextLost(): void {\n for (const pane of this.panes) pane.notifyContextLost();\n for (const l of this.globalLayers) {\n try {\n l.onContextLost?.();\n } catch (err) {\n console.error(`[Scene] global layer ${l.id} onContextLost threw:`, err);\n }\n l.dirty = true;\n }\n this.viewportDirty = true;\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n const loop = () => {\n if (!this.running) return;\n // A render loop MUST survive a bad frame. Pane layers, global\n // layers, and bus subscribers each isolate their own throws, but\n // an exception in the non-layer parts of frame() (a regl scope,\n // the scissor/viewport math, a glyph-atlas op) would otherwise\n // skip the requestAnimationFrame below and permanently kill the\n // loop — the chart paints one frame, then goes static and dead\n // to all input (live ticks and pan/zoom/hover set dirty bits no\n // frame ever consumes). Reschedule unconditionally; log the\n // first few faults so the underlying throw stays diagnosable.\n try {\n this.frame();\n } catch (err) {\n if (this.frameErrors++ < 3) {\n console.error(\"[Scene] render frame threw; loop continues:\", err);\n }\n this.markAllDirty();\n } finally {\n if (this.running) this.raf = requestAnimationFrame(loop);\n }\n };\n this.raf = requestAnimationFrame(loop);\n }\n\n stop(): void {\n this.running = false;\n if (this.raf != null) cancelAnimationFrame(this.raf);\n this.raf = null;\n }\n\n private frame(): void {\n const anyGlobalDirty = this.globalLayers.some((l) => l.dirty);\n const needsRepaint =\n this.viewportDirty ||\n anyGlobalDirty ||\n this.panes.some((p) => p.hasDirtyLayer);\n if (!needsRepaint) return;\n\n const theme = this.theme();\n const regl = this.renderer.regl;\n const glyphAtlas = this.glyphAtlas;\n const fbHeight = this.cssHeight * this.dpr;\n const fbWidth = this.cssWidth * this.dpr;\n const plotHeightCss = Math.max(\n 0,\n this.cssHeight - this.globalPadding.top - this.globalPadding.bottom,\n );\n\n // Clear inside an explicit no-scissor scope so a future outer\n // regl scope with scissor:enable=true can't make the clear\n // partial. Today regl leaves scissor disabled between frames,\n // but the assumption isn't load-bearing — keep it explicit.\n regl({ scissor: { enable: false } })(() => {\n this.renderer.clear(theme.background);\n });\n\n for (const pane of this.panes) {\n // Hidden panes paint nothing AND claim no scissor region.\n // The host (ChartEngine) recomputes the remaining panes'\n // bounds before calling relayout() so the freed slice is\n // re-distributed — without that contract the hidden pane\n // leaves a blank stripe, so the gate here is paint-only and\n // intentionally doesn't try to merge anything itself.\n if (!pane.visible) {\n // Mark every layer's dirty bit clear so a re-show paints a\n // single fresh frame rather than replaying queued dirties.\n for (const l of pane.layers) l.dirty = false;\n continue;\n }\n // Each pane gets a vertical slice of the canvas — its\n // [yStartFraction, yEndFraction] of the plot area, plus the\n // global top/bottom gutters at the very top/bottom panes so\n // axis labels can paint outside the strict plot rect. We\n // scissor to that slice so a pane's layers (candles, volume\n // bars, axis text) can't leak pixels into a neighbouring pane.\n const isFirstPane = pane === this.panes[0];\n const isLastPane = pane === this.panes[this.panes.length - 1];\n let yStartCss =\n this.globalPadding.top + plotHeightCss * pane.bounds.yStartFraction;\n let yEndCss =\n this.globalPadding.top + plotHeightCss * pane.bounds.yEndFraction;\n // Edge panes claim the global gutters so PriceAxis (right side\n // of any pane), TimeAxis (bottom of last pane), and crosshair\n // labels can paint there.\n if (isFirstPane) yStartCss = 0;\n if (isLastPane) yEndCss = this.cssHeight;\n\n const yStartPx = Math.round(yStartCss * this.dpr);\n const yEndPx = Math.round(yEndCss * this.dpr);\n // GL scissor uses bottom-origin coordinates; convert.\n const boxY = Math.max(0, fbHeight - yEndPx);\n const boxH = Math.max(0, yEndPx - yStartPx);\n\n regl({\n scissor: {\n enable: true,\n box: { x: 0, y: boxY, width: fbWidth, height: boxH },\n },\n })(() => {\n pane.paint((viewport: Viewport): RenderContext => ({\n regl,\n viewport,\n theme,\n glyphAtlas,\n perfReporter: this.perfReporter ?? undefined,\n }));\n });\n }\n\n // Global layers paint after every pane, scissor explicitly\n // disabled so they can draw anywhere on the canvas — used by\n // the crosshair for spans across panes and labels in the bottom\n // gutter. Use the bottom pane's viewport for time math (it owns\n // the time-axis gutter) so layers reading viewport.height get a\n // sensible reference.\n if (this.globalLayers.length > 0) {\n const ref = this.bottom() ?? this.primary();\n if (ref) {\n const reporter = this.perfReporter ?? undefined;\n const ctx: RenderContext = {\n regl,\n viewport: ref.viewport,\n theme,\n glyphAtlas,\n perfReporter: reporter,\n };\n regl({ scissor: { enable: false } })(() => {\n for (const layer of this.globalLayers) {\n // visible === false skips paint; dirty still clears so a\n // toggle back doesn't replay queued dirties. Mirrors the\n // Pane.paint gate so global layers (crosshair) honour the\n // same on/off contract.\n if (layer.visible === false) {\n layer.dirty = false;\n continue;\n }\n const start = reporter ? performance.now() : 0;\n layer.dirty = false;\n try {\n layer.paint(ctx);\n } catch (err) {\n console.error(`[Scene] global layer ${layer.id} paint threw:`, err);\n }\n if (reporter) {\n reporter.record(layer.id, performance.now() - start);\n }\n }\n });\n }\n }\n\n this.viewportDirty = false;\n }\n\n dispose(): void {\n this.stop();\n for (const p of this.panes) p.dispose();\n this.panes.length = 0;\n for (const l of this.globalLayers) l.dispose?.();\n this.globalLayers.length = 0;\n this.detachBus?.();\n this.detachBus = null;\n }\n}\n","import { EventBus } from \"./eventBus\";\nimport { PLOT_GUTTER } from \"./Constants\";\n\nexport interface Padding {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nconst DEFAULT_PADDING: Padding = { ...PLOT_GUTTER };\n\nexport class Viewport {\n width = 0;\n height = 0;\n dpr = 1;\n padding: Padding = { ...DEFAULT_PADDING };\n\n // Defaults must produce a non-zero span — timeToX/priceToY divide by\n // (t1-t0)/(p1-p0) and any pre-init transform with a zero span would\n // return NaN and poison vertex buffers.\n private t0 = 0;\n private t1 = 1;\n private p0 = 0;\n private p1 = 1;\n\n // Minimum representable time span in ms. Stops rapid pinch-zoom from\n // collapsing the range to a denormal and dividing by ~0 in coord math.\n static readonly MIN_TIME_SPAN_MS = 100;\n static readonly MIN_PRICE_SPAN_FRACTION = 1e-9;\n\n // priceRange auto-fits to the visible data unless the user has manually\n // zoomed/panned the price axis (then we hold their range until reset).\n priceAutoFit = true;\n\n constructor(private readonly bus: EventBus) {}\n\n setSize(cssWidth: number, cssHeight: number, dpr: number): void {\n this.width = Math.max(1, Math.round(cssWidth * dpr));\n this.height = Math.max(1, Math.round(cssHeight * dpr));\n this.dpr = dpr;\n this.bus.emit({ type: \"viewport:changed\" });\n }\n\n get plot(): { x: number; y: number; w: number; h: number } {\n const pad = this.padding;\n const dpr = this.dpr;\n return {\n x: pad.left * dpr,\n y: pad.top * dpr,\n w: Math.max(1, this.width - (pad.left + pad.right) * dpr),\n h: Math.max(1, this.height - (pad.top + pad.bottom) * dpr),\n };\n }\n\n setTimeRange(t0: number, t1: number): void {\n if (t1 <= t0) return;\n this.t0 = t0;\n this.t1 = t1;\n this.bus.emit({ type: \"viewport:changed\" });\n }\n\n // `userInitiated` distinguishes a programmatic auto-fit (which preserves\n // the autofit flag) from a user pan/zoom (which sticks the range). Without\n // this split, the first init setPriceRange would permanently disable\n // auto-fit before any data ever loaded.\n setPriceRange(p0: number, p1: number, userInitiated = false): void {\n if (p1 <= p0) return;\n this.p0 = p0;\n this.p1 = p1;\n if (userInitiated) this.priceAutoFit = false;\n this.bus.emit({ type: \"viewport:changed\" });\n }\n\n get timeRange(): [number, number] {\n return [this.t0, this.t1];\n }\n\n get priceRange(): [number, number] {\n return [this.p0, this.p1];\n }\n\n timeToX(t: number): number {\n const { x, w } = this.plot;\n const span = this.t1 - this.t0;\n if (span <= 0) return x;\n return x + ((t - this.t0) / span) * w;\n }\n\n xToTime(x: number): number {\n const { x: x0, w } = this.plot;\n if (w <= 0) return this.t0;\n return this.t0 + ((x - x0) / w) * (this.t1 - this.t0);\n }\n\n priceToY(p: number): number {\n const { y, h } = this.plot;\n const span = this.p1 - this.p0;\n if (span <= 0) return y + h;\n return y + h - ((p - this.p0) / span) * h;\n }\n\n yToPrice(y: number): number {\n const { y: y0, h } = this.plot;\n if (h <= 0) return this.p0;\n return this.p1 - ((y - y0) / h) * (this.p1 - this.p0);\n }\n\n // For shaders: convert data coordinates directly to clip space [-1, +1].\n // (1,1) is top-right of the canvas; GL's framebuffer origin is bottom-left\n // so y inverts.\n timeToClipX(t: number): number {\n return (this.timeToX(t) / this.width) * 2 - 1;\n }\n\n priceToClipY(p: number): number {\n return 1 - (this.priceToY(p) / this.height) * 2;\n }\n\n // CSS-pixel → clip helpers for layers that lay out in CSS pixels (axes,\n // glyph atlas text). DPR is folded in via setSize, so width/height are\n // already in device pixels.\n pxXToClipX(cssX: number): number {\n return ((cssX * this.dpr) / this.width) * 2 - 1;\n }\n\n pxYToClipY(cssY: number): number {\n return 1 - ((cssY * this.dpr) / this.height) * 2;\n }\n\n pxWidthToClip(cssW: number): number {\n return (cssW * this.dpr * 2) / this.width;\n }\n\n pxHeightToClip(cssH: number): number {\n return (cssH * this.dpr * 2) / this.height;\n }\n\n // Plot-area boundaries in CSS pixels — convenient for axis layers\n // that work in CSS-pixel space.\n get plotCss(): { x: number; y: number; w: number; h: number } {\n return {\n x: this.padding.left,\n y: this.padding.top,\n w: Math.max(0, this.width / this.dpr - this.padding.left - this.padding.right),\n h: Math.max(0, this.height / this.dpr - this.padding.top - this.padding.bottom),\n };\n }\n\n panPixels(dxCss: number, dyCss: number): void {\n const dx = dxCss * this.dpr;\n const dy = dyCss * this.dpr;\n const { w, h } = this.plot;\n const dt = (-dx / w) * (this.t1 - this.t0);\n this.t0 += dt;\n this.t1 += dt;\n if (!this.priceAutoFit) {\n const dp = (dy / h) * (this.p1 - this.p0);\n this.p0 += dp;\n this.p1 += dp;\n }\n this.bus.emit({ type: \"viewport:changed\" });\n }\n\n // Zoom centered at a CSS-pixel x in [0..cssWidth]. factor > 1 zooms in.\n zoomTimeAt(cssX: number, factor: number): void {\n const cx = cssX * this.dpr;\n const ratio = Math.max(0, Math.min(1, (cx - this.plot.x) / this.plot.w));\n const span = this.t1 - this.t0;\n // Clamp the resulting span — rapid trackpad pinch can stack factor>20\n // per event and collapse span to 0 within a dozen frames, after which\n // every coord transform divides by ~0 and emits NaN.\n const next = Math.max(Viewport.MIN_TIME_SPAN_MS, span / factor);\n const center = this.t0 + span * ratio;\n this.t0 = center - next * ratio;\n this.t1 = this.t0 + next;\n this.bus.emit({ type: \"viewport:changed\" });\n }\n\n zoomPriceAt(cssY: number, factor: number): void {\n this.priceAutoFit = false;\n const cy = cssY * this.dpr;\n const ratio = Math.max(0, Math.min(1, (cy - this.plot.y) / this.plot.h));\n const span = this.p1 - this.p0;\n const minSpan = Math.max(\n Viewport.MIN_PRICE_SPAN_FRACTION * Math.max(Math.abs(this.p0), Math.abs(this.p1), 1),\n Number.MIN_VALUE,\n );\n const next = Math.max(minSpan, span / factor);\n const centerY = this.p1 - span * ratio;\n this.p1 = centerY + next * ratio;\n this.p0 = this.p1 - next;\n this.bus.emit({ type: \"viewport:changed\" });\n }\n\n resetPriceAutoFit(): void {\n this.priceAutoFit = true;\n this.bus.emit({ type: \"viewport:changed\" });\n }\n}\n","import type { Layer, RenderContext } from \"./Layer\";\nimport { Viewport } from \"./Viewport\";\nimport type { EventBus } from \"./eventBus\";\nimport { PLOT_GUTTER } from \"./Constants\";\n\nexport interface PaneBounds {\n // Position within the plot area (excluding global padding).\n // 0 = top of plot, 1 = bottom of plot.\n yStartFraction: number;\n yEndFraction: number;\n}\n\n// Per-pane padding inside the pane's y region. Top/bottom are usually\n// 0 — the pane fills its allotted slice. Sub-panes that need a thin\n// separator above them can set top to a few pixels.\nexport interface PanePadding {\n top: number;\n bottom: number;\n}\n\nconst DEFAULT_PANE_PADDING: PanePadding = { top: 0, bottom: 0 };\n\n// Horizontal padding is the same across every pane — left edge of plot\n// and right-axis gutter width. Sourced from the shared PLOT_GUTTER so\n// the axis-gutter width can't drift from Viewport / Scene.\nconst HORIZONTAL_PADDING = { left: PLOT_GUTTER.left, right: PLOT_GUTTER.right };\n\n// A vertically stacked region of the chart with its own y-scale\n// (price for the main pane, volume for the volume sub-pane, an\n// indicator value for RSI/MACD/CVD panes). All panes share the global\n// time range — Scene fans pan/zoom across them.\n//\n// Each pane owns a Viewport configured via `padding` so that\n// `viewport.plotCss` covers exactly the pane's slice of the canvas;\n// layers within the pane paint against that viewport with no extra\n// transform.\nexport class Pane {\n readonly id: string;\n readonly viewport: Viewport;\n readonly layers: Layer[] = [];\n bounds: PaneBounds;\n paddingInternal: PanePadding;\n // Whether the pane accepts user-driven price interactions\n // (vertical drag pan, shift+wheel zoom). Sub-panes whose layers\n // pin themselves to the pane's plot rect — volume bars, RSI/MACD\n // value ranges — set this false so a stray drag doesn't mutate\n // viewport state with no visible effect.\n priceInteractive = true;\n /**\n * Whether the pane participates in painting. Defaults true.\n *\n * When set to `false`, `Scene.paint` skips the pane entirely —\n * no scissor region is allocated, none of its layers run paint,\n * and the slice it would have occupied is unavailable to layers\n * in other panes (the host re-distributes bounds across the\n * remaining visible panes via Scene.relayout).\n *\n * Unlike `Layer.visible`, this is NOT consulted by paint loops\n * inside the pane itself — Scene gates entry. Toggling this\n * field requires the host to also recompute bounds + call\n * `Scene.relayout()` so the remaining panes claim the freed\n * space, otherwise the hidden pane leaves a blank stripe.\n */\n visible = true;\n\n constructor(\n id: string,\n bus: EventBus,\n bounds: PaneBounds,\n paddingInternal: PanePadding = DEFAULT_PANE_PADDING,\n ) {\n this.id = id;\n this.viewport = new Viewport(bus);\n this.bounds = bounds;\n this.paddingInternal = paddingInternal;\n }\n\n addLayer(layer: Layer): void {\n this.layers.push(layer);\n layer.dirty = true;\n }\n\n removeLayer(id: string): void {\n const i = this.layers.findIndex((l) => l.id === id);\n if (i >= 0) {\n const [removed] = this.layers.splice(i, 1);\n removed.dispose?.();\n }\n }\n\n // Apply the pane's bounds to its Viewport's padding so the resulting\n // plotCss occupies the right slice of the canvas. `globalPadding`\n // is the chart-wide top/bottom gutter shared across all panes.\n layout(\n cssWidth: number,\n cssHeight: number,\n dpr: number,\n globalPadding: { top: number; bottom: number },\n ): void {\n const plotTop = globalPadding.top;\n const plotBottom = cssHeight - globalPadding.bottom;\n const plotHeight = Math.max(0, plotBottom - plotTop);\n const yStart = plotTop + plotHeight * this.bounds.yStartFraction;\n const yEnd = plotTop + plotHeight * this.bounds.yEndFraction;\n // Mutate the existing padding object in place rather than\n // replacing it — any future code that caches a reference to\n // `viewport.padding` won't see stale values across layout calls.\n const pad = this.viewport.padding;\n pad.left = HORIZONTAL_PADDING.left;\n pad.right = HORIZONTAL_PADDING.right;\n pad.top = yStart + this.paddingInternal.top;\n pad.bottom = cssHeight - yEnd + this.paddingInternal.bottom;\n this.viewport.setSize(cssWidth, cssHeight, dpr);\n }\n\n markAllDirty(): void {\n for (const l of this.layers) l.dirty = true;\n }\n\n notifyContextLost(): void {\n for (const l of this.layers) {\n try {\n l.onContextLost?.();\n } catch (err) {\n console.error(\n `[Pane:${this.id}] layer ${l.id} onContextLost threw:`,\n err,\n );\n }\n l.dirty = true;\n }\n }\n\n paint(buildCtx: (viewport: Viewport) => RenderContext): void {\n const ctx = buildCtx(this.viewport);\n const reporter = ctx.perfReporter;\n for (const layer of this.layers) {\n // visible === false skips paint entirely; undefined (the\n // legacy/default) treats the layer as on. dirty still clears\n // so a toggle back to visible doesn't replay queued dirties.\n if (layer.visible === false) {\n layer.dirty = false;\n continue;\n }\n const start = reporter ? performance.now() : 0;\n layer.dirty = false;\n try {\n layer.paint(ctx);\n } catch (err) {\n console.error(`[Pane:${this.id}] layer ${layer.id} paint threw:`, err);\n }\n if (reporter) {\n reporter.record(layer.id, performance.now() - start);\n }\n }\n }\n\n get hasDirtyLayer(): boolean {\n return this.layers.some((l) => l.dirty);\n }\n\n dispose(): void {\n for (const l of this.layers) l.dispose?.();\n this.layers.length = 0;\n }\n}\n","import type REGL from \"regl\";\n\nexport interface GlyphInfo {\n // Atlas UV coords (0..1).\n u0: number;\n v0: number;\n u1: number;\n v1: number;\n // CSS pixel dimensions of the rasterized glyph cell.\n width: number;\n height: number;\n // Horizontal advance (≈ width for monospace fonts).\n advance: number;\n}\n\n// Glyph atlas: rasterizes a fixed character set into a single RGBA\n// canvas, uploads it as a regl texture, exposes per-glyph UV + metrics.\n//\n// Text is rendered in WHITE; the glyph fragment shader multiplies\n// texture.a by a uColor uniform so the same atlas serves any color\n// (axis text, hover labels, etc.) without per-glyph tinting.\n//\n// Sized in CSS pixels — caller is responsible for converting to clip\n// space via the Viewport before drawing.\n\nconst DEFAULT_CHARS = \"0123456789.,-+:KMm/€$%kbB ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\nconst FONT_STACK =\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace';\n\nexport interface GlyphAtlasOptions {\n fontSize: number;\n fontFamily?: string;\n lineHeight?: number;\n chars?: string;\n}\n\nexport class GlyphAtlas {\n readonly fontSize: number;\n readonly fontFamily: string;\n readonly lineHeight: number;\n readonly chars: string;\n private readonly glyphs = new Map<string, GlyphInfo>();\n texture: REGL.Texture2D | null = null;\n // Atlas dimensions in CSS pixels (also the canvas-backed pixel\n // dimensions because we rasterize at DPR=1 — the shader handles\n // sub-pixel placement, and the atlas just needs to be readable\n // at the chosen fontSize).\n atlasWidth = 0;\n atlasHeight = 0;\n private builtAtPixelRatio = 1;\n\n constructor(opts: GlyphAtlasOptions) {\n this.fontSize = opts.fontSize;\n this.fontFamily = opts.fontFamily ?? FONT_STACK;\n this.lineHeight = opts.lineHeight ?? Math.ceil(opts.fontSize * 1.3);\n this.chars = opts.chars ?? DEFAULT_CHARS;\n }\n\n glyph(ch: string): GlyphInfo | undefined {\n return this.glyphs.get(ch);\n }\n\n // Build (or rebuild) the atlas against a given regl context. Idempotent\n // — safe to call after onContextLost when the GL texture is gone but\n // this.glyphs / dimensions remain authoritative for layout math.\n build(regl: REGL.Regl, pixelRatio = 1): void {\n this.builtAtPixelRatio = pixelRatio;\n\n // Rasterize at the device pixel ratio so labels stay crisp on\n // HiDPI screens, then map back to CSS-pixel metrics for layout.\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"GlyphAtlas: failed to acquire 2D context\");\n }\n\n const pad = 2;\n const cellHeight = this.lineHeight;\n\n // First pass — measure every glyph (font must be set before measureText).\n ctx.font = `${this.fontSize}px ${this.fontFamily}`;\n ctx.textBaseline = \"top\";\n const widths: number[] = [];\n const advances: number[] = [];\n let totalWidth = 0;\n for (const ch of this.chars) {\n const m = ctx.measureText(ch);\n // measureText.width can be 0 for some glyphs (e.g. zero-width); we\n // still need a non-zero cell so the UV math doesn't degenerate.\n const advance = Math.max(1, Math.ceil(m.width)) + 1;\n const w = advance + pad * 2;\n widths.push(w);\n advances.push(advance);\n totalWidth += w;\n }\n\n this.atlasWidth = totalWidth;\n this.atlasHeight = cellHeight;\n canvas.width = totalWidth * pixelRatio;\n canvas.height = cellHeight * pixelRatio;\n // Resizing a canvas resets context state.\n ctx.scale(pixelRatio, pixelRatio);\n ctx.font = `${this.fontSize}px ${this.fontFamily}`;\n ctx.textBaseline = \"top\";\n ctx.fillStyle = \"#ffffff\";\n\n let x = 0;\n this.glyphs.clear();\n for (let i = 0; i < this.chars.length; i++) {\n const ch = this.chars[i];\n const w = widths[i];\n ctx.fillText(ch, x + pad, pad);\n this.glyphs.set(ch, {\n u0: x / totalWidth,\n v0: 0,\n u1: (x + w) / totalWidth,\n v1: 1,\n width: w,\n height: cellHeight,\n // Advance by the glyph's measured width, not the padded atlas cell.\n // The transparent cell padding is only for texture sampling; using\n // it as layout advance made axis labels look artificially spaced out.\n advance: advances[i],\n });\n x += w;\n }\n\n this.destroyTexture();\n this.texture = regl.texture({\n data: canvas,\n // The glyph quad maps its TOP edge (aCorner.y = 1) to UV.v = v1 = 1.\n // The atlas canvas is rasterized top-down (each glyph's top sits at\n // row 0), so it must be uploaded flipped — flipY puts the canvas's\n // top row at v = 1 — otherwise screen-top samples the glyph's bottom\n // and every label renders upside-down. (flipY:false was the inverted-\n // text bug visible on axis ticks, the time axis, and pane legends.)\n flipY: true,\n mag: \"linear\",\n min: \"linear\",\n wrap: \"clamp\",\n });\n }\n\n // Measure the width of a string in CSS pixels (sum of glyph advances).\n // Missing characters contribute zero — callers should fall back to a\n // safe placeholder if they expect mixed-script text.\n measure(s: string): number {\n let w = 0;\n for (const ch of s) {\n const g = this.glyphs.get(ch);\n if (g) w += g.advance;\n }\n return w;\n }\n\n get pixelRatio(): number {\n return this.builtAtPixelRatio;\n }\n\n dispose(): void {\n this.destroyTexture();\n this.glyphs.clear();\n }\n\n private destroyTexture(): void {\n const texture = this.texture;\n this.texture = null;\n if (!texture) return;\n try {\n texture.destroy();\n } catch (err) {\n if (\n !(err instanceof Error) ||\n !err.message.includes(\"must not double destroy\")\n ) {\n throw err;\n }\n }\n }\n}\n","// Shader sources. WebGL1 GLSL ES 1.00 — regl auto-detects\n// ANGLE_instanced_arrays for instanced rendering; we don't depend on\n// WebGL2-only features in P0/P1.\n\n// ─── solid lines ─────────────────────────────────────────────────────\n// Grid, wicks, axis ticks, anything axis-aligned. Anti-alias concerns\n// only show up on angled lines.\n\nexport const SOLID_LINES_VERT = `\nprecision mediump float;\nattribute vec2 aClipPos;\nvoid main() {\n gl_Position = vec4(aClipPos, 0.0, 1.0);\n}\n`;\n\nexport const SOLID_LINES_FRAG = `\nprecision mediump float;\nuniform vec4 uColor;\nvoid main() {\n gl_FragColor = uColor;\n}\n`;\n\n// ─── candle bodies ───────────────────────────────────────────────────\n// Per-instance: a single body rectangle in clip space.\n// aXCenter center x in clip (-1..1)\n// aHalfWidth half body width in clip\n// aOpenY open price in clip Y\n// aCloseY close price in clip Y\n// aIsUp 1.0 for up candle, 0.0 for down (varying-as-float)\n\nexport const CANDLE_BODY_VERT = `\nprecision mediump float;\nattribute vec2 aCorner;\nattribute float aXCenter;\nattribute float aHalfWidth;\nattribute float aOpenY;\nattribute float aCloseY;\nattribute float aIsUp;\nvarying float vIsUp;\nvoid main() {\n float bottomY = min(aOpenY, aCloseY);\n float topY = max(aOpenY, aCloseY);\n float x = aXCenter + (aCorner.x * 2.0 - 1.0) * aHalfWidth;\n float y = bottomY + aCorner.y * (topY - bottomY);\n gl_Position = vec4(x, y, 0.0, 1.0);\n vIsUp = aIsUp;\n}\n`;\n\nexport const CANDLE_BODY_FRAG = `\nprecision mediump float;\nuniform vec4 uUpColor;\nuniform vec4 uDownColor;\nvarying float vIsUp;\nvoid main() {\n gl_FragColor = mix(uDownColor, uUpColor, vIsUp);\n}\n`;\n\n// ─── candle wicks ────────────────────────────────────────────────────\n// Per-vertex (two per wick): position + isUp. Drawn as gl.LINES so two\n// vertices share their per-instance color via aIsUp duplicated on both.\n\nexport const CANDLE_WICK_VERT = `\nprecision mediump float;\nattribute vec2 aClipPos;\nattribute float aIsUp;\nvarying float vIsUp;\nvoid main() {\n gl_Position = vec4(aClipPos, 0.0, 1.0);\n vIsUp = aIsUp;\n}\n`;\n\nexport const CANDLE_WICK_FRAG = `\nprecision mediump float;\nuniform vec4 uUpColor;\nuniform vec4 uDownColor;\nvarying float vIsUp;\nvoid main() {\n gl_FragColor = mix(uDownColor, uUpColor, vIsUp);\n}\n`;\n\n// ─── glyph atlas ─────────────────────────────────────────────────────\n// Instanced textured quad. Atlas is a single RGBA texture rendered in\n// white; the fragment shader multiplies texture.a by the uColor uniform\n// so a single atlas can render in any color (axis text, hover labels,\n// etc.).\n//\n// Per-instance:\n// aInstanceRect = (xClip, yClip, wClip, hClip)\n// aInstanceUV = (u0, v0, u1, v1)\n\nexport const GLYPH_VERT = `\nprecision mediump float;\nattribute vec2 aCorner;\nattribute vec4 aInstanceRect;\nattribute vec4 aInstanceUV;\nattribute vec4 aInstanceColor;\nvarying vec2 vUV;\nvarying vec4 vColor;\nvoid main() {\n vec2 pos = aInstanceRect.xy + aCorner * aInstanceRect.zw;\n vUV = mix(aInstanceUV.xy, aInstanceUV.zw, aCorner);\n vColor = aInstanceColor;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nexport const GLYPH_FRAG = `\nprecision mediump float;\nuniform sampler2D uAtlas;\nvarying vec2 vUV;\nvarying vec4 vColor;\nvoid main() {\n float a = texture2D(uAtlas, vUV).a;\n gl_FragColor = vec4(vColor.rgb, vColor.a * a);\n}\n`;\n\n// ─── order book heatmap ──────────────────────────────────────────────\n// Single textured quad over the plot rect. The texture is an\n// RGBA8 grid (priceBuckets × snapshotsBuckets) where the R channel\n// encodes log-normalized USD depth at that (price, time) cell.\n// Fragment shader looks up the value and maps it through a\n// purple→cyan→yellow colormap.\n//\n// Per-vertex aUV is a unit-quad attribute (0..1) and the layer\n// passes ranges for the quad's clip-space corners via uniforms so\n// the same shader works at any pane/viewport size.\n\n// ─── volume footprint ────────────────────────────────────────────────\n// Per-candle footprint cells: instanced quads with a signed intensity\n// attribute. Positive intensity = buy-dominant (up color); negative =\n// sell-dominant (down color). |intensity| modulates alpha so weaker\n// cells fade. The candle-body shader's mix() between up and down\n// would render mid-intensity buy cells as washed-out yellow/orange,\n// hence a dedicated shader here.\n\nexport const FOOTPRINT_VERT = `\nprecision mediump float;\nattribute vec2 aCorner;\nattribute float aXCenter;\nattribute float aHalfWidth;\nattribute float aBottomY;\nattribute float aTopY;\nattribute float aIntensity;\nvarying float vIntensity;\nvoid main() {\n float x = aXCenter + (aCorner.x * 2.0 - 1.0) * aHalfWidth;\n float y = mix(aBottomY, aTopY, aCorner.y);\n gl_Position = vec4(x, y, 0.0, 1.0);\n vIntensity = aIntensity;\n}\n`;\n\nexport const FOOTPRINT_FRAG = `\nprecision mediump float;\nuniform vec4 uUpColor;\nuniform vec4 uDownColor;\nuniform float uAlpha;\nvarying float vIntensity;\nvoid main() {\n vec4 color = vIntensity >= 0.0 ? uUpColor : uDownColor;\n float a = abs(vIntensity) * uAlpha;\n gl_FragColor = vec4(color.rgb, a);\n}\n`;\n\n// ─── triangle markers ────────────────────────────────────────────────\n// Instanced quad masked to a triangle via the fragment shader. Per-\n// instance position + size, layer-uniform color + sideSign (1 = up,\n// -1 = down). Used for whale prints, liquidation events, and any\n// future per-event overlay where direction matters. Antialiased via\n// fwidth, which requires OES_standard_derivatives — RendererGL\n// requests it via optionalExtensions at createREGL time. The\n// `#extension` directive below only sets a shader-level enable bit;\n// the actual GL-level activation has to happen at context creation.\n// Drivers missing the extension degrade to a hard edge (fwidth\n// returns 0, the AA smoothstep collapses to a step).\n\nexport const MARKER_VERT = `\nprecision mediump float;\nattribute vec2 aCorner;\nattribute float aXCenter;\nattribute float aYCenter;\nattribute float aHalfWidth;\nattribute float aHalfHeight;\nvarying vec2 vLocalUV;\nvoid main() {\n vec2 local = aCorner * 2.0 - 1.0;\n float x = aXCenter + local.x * aHalfWidth;\n float y = aYCenter + local.y * aHalfHeight;\n vLocalUV = local;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}\n`;\n\nexport const MARKER_FRAG = `\n#extension GL_OES_standard_derivatives : enable\nprecision mediump float;\nuniform vec4 uColor;\nuniform float uSideSign;\nvarying vec2 vLocalUV;\nvoid main() {\n // Up-triangle interior: y <= 1 - 2*|x| with vertices at\n // (0, +1), (-1, -1), (1, -1). Flip y by uSideSign to get a\n // down-triangle for sell markers without a second shader.\n float yTest = vLocalUV.y * uSideSign;\n float dist = yTest - (1.0 - 2.0 * abs(vLocalUV.x));\n // fwidth-based AA — softens edges to ~1 device pixel of\n // gradient. Falls back to hard edge if the derivatives ext\n // isn't available (fwidth returns 0 → smoothstep is a step).\n float aa = fwidth(dist) + 1e-6;\n float alpha = 1.0 - smoothstep(-aa, aa, dist);\n if (alpha < 0.01) discard;\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n`;\n\nexport const HEATMAP_VERT = `\nprecision mediump float;\nattribute vec2 aCorner;\nuniform vec4 uClipRect; // xMin, yMin, xMax, yMax\nvarying vec2 vUV;\nvoid main() {\n vec2 pos = mix(uClipRect.xy, uClipRect.zw, aCorner);\n vUV = aCorner;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nexport const HEATMAP_FRAG = `\nprecision mediump float;\nuniform sampler2D uDepth;\nuniform float uAlpha;\nuniform vec2 uColUVRange; // (uMin, uMax) — texel-center bounds for populated cols\nvarying vec2 vUV;\n\nvec3 colormap(float t) {\n // Purple → cyan → yellow. Matches kiyotaka's heatmap palette.\n vec3 purple = vec3(0.20, 0.05, 0.40);\n vec3 cyan = vec3(0.00, 0.55, 0.75);\n vec3 yellow = vec3(1.00, 0.90, 0.20);\n if (t < 0.5) {\n return mix(purple, cyan, t * 2.0);\n }\n return mix(cyan, yellow, (t - 0.5) * 2.0);\n}\n\nvoid main() {\n // Snapshots fill the leftmost columns of the texture (0..N-1 out\n // of MAX_SNAPSHOTS). uColUVRange = (0.5/MAX, (N-0.5)/MAX) maps\n // vUV.x=0 to the CENTER of col 0 and vUV.x=1 to the CENTER of\n // col N-1, so linear filtering never blends the newest column\n // with the zero tail beyond it.\n float u = mix(uColUVRange.x, uColUVRange.y, vUV.x);\n vec2 sampleUV = vec2(u, vUV.y);\n float t = texture2D(uDepth, sampleUV).r;\n if (t < 0.02) discard;\n vec3 color = colormap(t);\n // uAlpha sets the layer's overall opacity so candles painted on\n // top stay legible. Cell intensity scales the alpha further so\n // low-depth cells are subtle.\n gl_FragColor = vec4(color, t * uAlpha);\n}\n`;\n","import type REGL from \"regl\";\nimport type { Viewport } from \"./Viewport\";\nimport type { GlyphAtlas } from \"./GlyphAtlas\";\nimport { GLYPH_FRAG, GLYPH_VERT } from \"../shaders/common\";\n\nconst QUAD_CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n\ntype GlyphProps = {\n instances: number;\n atlas: REGL.Texture2D;\n};\n\ntype GlyphCmd = REGL.DrawCommand<REGL.DefaultContext, GlyphProps>;\n\nexport type Anchor = \"left\" | \"center\" | \"right\";\n\n// Per-batch glyph queue. Each label call appends one rect / UV / color\n// per character into the instance buffers, then flush() uploads and\n// draws everything in a single regl command.\n//\n// Built per-layer; share an atlas via the RenderContext. Disposing a\n// layer also disposes its TextBatch.\nexport class TextBatch {\n private cmd: GlyphCmd | null = null;\n private cornerBuf: REGL.Buffer | null = null;\n private rectBuf: REGL.Buffer | null = null;\n private uvBuf: REGL.Buffer | null = null;\n private colorBuf: REGL.Buffer | null = null;\n\n private rect = new Float32Array(0);\n private uv = new Float32Array(0);\n private color = new Float32Array(0);\n private count = 0;\n\n constructor(private readonly atlas: GlyphAtlas) {}\n\n reset(): void {\n this.count = 0;\n }\n\n addLabel(\n s: string,\n cssX: number,\n cssY: number,\n color: [number, number, number, number],\n viewport: Viewport,\n anchor: Anchor = \"left\",\n scale = 1,\n ): void {\n // `scale` shrinks (or grows) the label relative to the atlas's baked\n // size — every metric (measure for anchoring, per-glyph cell + the\n // advance step) multiplies by it. scale === 1 leaves the geometry\n // byte-identical to an unscaled label, so existing callers are\n // unaffected; the axis layers pass < 1 for the type hierarchy.\n const widthPx = this.atlas.measure(s) * scale;\n let x = cssX;\n if (anchor === \"center\") x -= widthPx / 2;\n else if (anchor === \"right\") x -= widthPx;\n\n for (const ch of s) {\n const g = this.atlas.glyph(ch);\n if (!g) continue;\n this.ensureCapacity(this.count + 1);\n const gw = g.width * scale;\n const gh = g.height * scale;\n const xClip = viewport.pxXToClipX(x);\n const yClip = viewport.pxYToClipY(cssY + gh);\n const wClip = viewport.pxWidthToClip(gw);\n const hClip = viewport.pxHeightToClip(gh);\n const ri = this.count * 4;\n this.rect[ri] = xClip;\n this.rect[ri + 1] = yClip;\n this.rect[ri + 2] = wClip;\n this.rect[ri + 3] = hClip;\n this.uv[ri] = g.u0;\n this.uv[ri + 1] = g.v0;\n this.uv[ri + 2] = g.u1;\n this.uv[ri + 3] = g.v1;\n this.color[ri] = color[0];\n this.color[ri + 1] = color[1];\n this.color[ri + 2] = color[2];\n this.color[ri + 3] = color[3];\n this.count++;\n x += g.advance * scale;\n }\n }\n\n flush(regl: REGL.Regl): void {\n if (this.count === 0) return;\n if (!this.cmd) this.compile(regl);\n if (!this.atlas.texture) return;\n this.rectBuf!.subdata(this.rect.subarray(0, this.count * 4));\n this.uvBuf!.subdata(this.uv.subarray(0, this.count * 4));\n this.colorBuf!.subdata(this.color.subarray(0, this.count * 4));\n this.cmd!({ instances: this.count, atlas: this.atlas.texture });\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.cornerBuf = null;\n this.rectBuf = null;\n this.uvBuf = null;\n this.colorBuf = null;\n this.rect = new Float32Array(0);\n this.uv = new Float32Array(0);\n this.color = new Float32Array(0);\n this.count = 0;\n }\n\n dispose(): void {\n this.cornerBuf?.destroy();\n this.rectBuf?.destroy();\n this.uvBuf?.destroy();\n this.colorBuf?.destroy();\n this.cornerBuf = null;\n this.rectBuf = null;\n this.uvBuf = null;\n this.colorBuf = null;\n this.cmd = null;\n }\n\n private ensureCapacity(n: number): void {\n if (n * 4 <= this.rect.length) return;\n let cap = Math.max(this.rect.length / 4, 32);\n while (cap < n) cap *= 2;\n this.rect = new Float32Array(cap * 4);\n this.uv = new Float32Array(cap * 4);\n this.color = new Float32Array(cap * 4);\n this.rectBuf?.destroy();\n this.uvBuf?.destroy();\n this.colorBuf?.destroy();\n this.rectBuf = null;\n this.uvBuf = null;\n this.colorBuf = null;\n // Force compile() to rebuild on the next flush so attribute buffers\n // match the new capacity.\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n if (!this.cornerBuf) {\n this.cornerBuf = regl.buffer({\n type: \"float\",\n usage: \"static\",\n data: QUAD_CORNERS,\n });\n }\n const cap = Math.max(this.rect.length / 4, 32);\n this.rectBuf = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n length: cap * 4 * 4,\n });\n this.uvBuf = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n length: cap * 4 * 4,\n });\n this.colorBuf = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n length: cap * 4 * 4,\n });\n this.cmd = regl({\n vert: GLYPH_VERT,\n frag: GLYPH_FRAG,\n attributes: {\n aCorner: { buffer: this.cornerBuf, divisor: 0 },\n aInstanceRect: { buffer: this.rectBuf, divisor: 1 },\n aInstanceUV: { buffer: this.uvBuf, divisor: 1 },\n aInstanceColor: { buffer: this.colorBuf, divisor: 1 },\n },\n uniforms: {\n uAtlas: regl.prop<GlyphProps, \"atlas\">(\"atlas\"),\n },\n count: 4,\n instances: regl.prop<GlyphProps, \"instances\">(\"instances\"),\n primitive: \"triangle strip\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as GlyphCmd;\n }\n}\n","// Per-layer paint-time sampler for the dev-only `?perf=1` overlay.\n//\n// Each frame Pane.paint and Scene.paint wrap individual layer\n// `.paint(ctx)` calls with performance.now() bookends when a\n// PerfReporter is present on the RenderContext. The reporter\n// keeps a per-layer ring buffer of recent samples and exposes\n// p50/p95 + sample count for the overlay component to render.\n//\n// Sampling overhead is one `performance.now()` per layer per\n// frame plus a ring-buffer write — negligible vs. the GL draw\n// cost. When the reporter is absent (the normal production\n// case) the bookends become two `undefined` checks.\n\nconst DEFAULT_WINDOW = 120; // ≈ 2 seconds at 60fps\n\nexport interface LayerStats {\n /** Median paint time in milliseconds. */\n p50: number;\n /** 95th-percentile paint time in milliseconds. */\n p95: number;\n /** Number of samples held in the ring buffer. */\n count: number;\n}\n\nclass RingBuffer {\n private readonly data: Float32Array;\n private head = 0;\n private filled = 0;\n\n constructor(private readonly capacity: number) {\n this.data = new Float32Array(capacity);\n }\n\n push(value: number): void {\n this.data[this.head] = value;\n this.head = (this.head + 1) % this.capacity;\n if (this.filled < this.capacity) this.filled++;\n }\n\n /**\n * Returns a sorted copy of the held samples. Allocations only\n * happen when the overlay component polls (every ~500ms), so\n * the per-frame writer path stays allocation-free.\n */\n toSortedArray(): Float32Array {\n const out = this.data.slice(0, this.filled);\n out.sort();\n return out;\n }\n\n get size(): number {\n return this.filled;\n }\n}\n\nexport class PerfReporter {\n private readonly samples = new Map<string, RingBuffer>();\n\n constructor(private readonly windowSize: number = DEFAULT_WINDOW) {}\n\n /**\n * Record one paint-time sample for a layer. Called from\n * Pane.paint / Scene.paint inside the per-layer try block;\n * no-op if the layer is hidden because paint never ran.\n */\n record(layerId: string, paintMs: number): void {\n let buf = this.samples.get(layerId);\n if (!buf) {\n buf = new RingBuffer(this.windowSize);\n this.samples.set(layerId, buf);\n }\n buf.push(paintMs);\n }\n\n /**\n * Snapshot of the current per-layer stats. The returned Map's\n * iteration order is the insertion order — typically matches\n * the layer paint order (BackgroundLayer → CandleLayer → …)\n * which is what the overlay wants to display.\n */\n getAllStats(): Map<string, LayerStats> {\n const out = new Map<string, LayerStats>();\n // Array.from for downlevel iteration — the project's tsconfig\n // targets es5 default + bundler resolution; using `for...of` on\n // a Map raises TS2802 without es2015 lib. Negligible overhead\n // since this only runs every ~500ms from the overlay poll.\n for (const [id, buf] of Array.from(this.samples)) {\n if (buf.size === 0) continue;\n const sorted = buf.toSortedArray();\n // Nearest-floor rank: picks index ⌊len * percentile⌋. Biases\n // slightly high vs. nearest-rank (⌈p · n⌉ - 1) by 0.5-1 sample\n // at len=120 — acceptable for a dev sanity tool; would NOT\n // pass for a production SLO calc.\n const p50Idx = Math.max(0, Math.floor(sorted.length * 0.5));\n const p95Idx = Math.max(0, Math.floor(sorted.length * 0.95));\n out.set(id, {\n p50: sorted[p50Idx],\n p95: sorted[p95Idx],\n count: buf.size,\n });\n }\n return out;\n }\n\n /**\n * Clear all samples — handy if the dev overlay is being\n * re-armed mid-session and the user wants a fresh baseline.\n */\n reset(): void {\n this.samples.clear();\n }\n}\n","export interface ChartTheme {\n background: [number, number, number, number];\n text: [number, number, number, number];\n textDim: [number, number, number, number];\n grid: [number, number, number, number];\n gridVert: [number, number, number, number];\n border: [number, number, number, number];\n candleUp: [number, number, number, number];\n candleDown: [number, number, number, number];\n volUp: [number, number, number, number];\n volDown: [number, number, number, number];\n crosshair: [number, number, number, number];\n // Filled \"pill\" behind the crosshair's price (right gutter) and time\n // (bottom gutter) readouts, plus the brighter text that sits on it, so\n // the live cursor values read as a solid chip over gridlines/candles\n // instead of dim text floating on the chart.\n crosshairLabelBg: [number, number, number, number];\n crosshairLabelText: [number, number, number, number];\n fontFamily: string;\n}\n\nexport type RGBA = [number, number, number, number];\nexport type RGB = [number, number, number];\n\nconst hexToRgba = (hex: string, a = 1): RGBA => {\n const n = parseInt(hex.slice(1), 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255, a];\n};\n\nexport type CandleColorThemeKey =\n | \"mmflow\"\n | \"percept\"\n | \"classic\"\n | \"sourgum\"\n | \"carbon\";\n\nexport interface CandleColorThemeOption {\n key: CandleColorThemeKey;\n label: string;\n upHex: string;\n downHex: string;\n}\n\nexport const DEFAULT_CANDLE_COLOR_THEME: CandleColorThemeKey = \"percept\";\n\nexport const CANDLE_COLOR_THEMES: CandleColorThemeOption[] = [\n {\n key: \"mmflow\",\n label: \"MM Flow\",\n upHex: \"#1fe05c\",\n downHex: \"#ff3b5c\",\n },\n {\n key: \"percept\",\n label: \"Percept\",\n upHex: \"#e8e8ec\",\n downHex: \"#e57c58\",\n },\n {\n key: \"classic\",\n label: \"Classic\",\n upHex: \"#34c7bd\",\n downHex: \"#f35d5d\",\n },\n {\n key: \"sourgum\",\n label: \"Sourgum\",\n upHex: \"#ffbf1a\",\n downHex: \"#ff7a18\",\n },\n {\n key: \"carbon\",\n label: \"Carbon\",\n upHex: \"#f0f2f5\",\n downHex: \"#55595f\",\n },\n];\n\nexport const isCandleColorThemeKey = (\n value: string | null | undefined,\n): value is CandleColorThemeKey =>\n CANDLE_COLOR_THEMES.some((theme) => theme.key === value);\n\nconst candleThemeByKey = (\n key: CandleColorThemeKey = DEFAULT_CANDLE_COLOR_THEME,\n): CandleColorThemeOption =>\n CANDLE_COLOR_THEMES.find((theme) => theme.key === key) ??\n CANDLE_COLOR_THEMES[0];\n\nexport const darkTheme = (\n candleColorTheme: CandleColorThemeKey = DEFAULT_CANDLE_COLOR_THEME,\n): ChartTheme => {\n const candle = candleThemeByKey(candleColorTheme);\n return {\n background: hexToRgba(\"#111112\", 1),\n text: [0.72, 0.73, 0.76, 1],\n textDim: [0.72, 0.73, 0.76, 0.34],\n grid: [0.72, 0.73, 0.76, 0.04],\n gridVert: [0.72, 0.73, 0.76, 0.018],\n border: [0.18, 0.18, 0.2, 0.85],\n candleUp: hexToRgba(candle.upHex, 1),\n candleDown: hexToRgba(candle.downHex, 1),\n volUp: hexToRgba(candle.upHex, 0.34),\n volDown: hexToRgba(candle.downHex, 0.38),\n crosshair: [0.54, 0.56, 0.61, 0.35],\n // Near-opaque slate chip (the existing border hue, raised to read as a\n // solid tag) with bright neutral text on top.\n crosshairLabelBg: [0.18, 0.18, 0.2, 0.97],\n crosshairLabelText: [0.92, 0.94, 0.97, 1],\n fontFamily:\n \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n };\n};\n\nconst rgba = (r: number, g: number, b: number, a: number): RGBA => [r, g, b, a];\n\n// ─── Semantic chart palette ──────────────────────────────────────\n// Single source of truth for every indicator / marker / volume-\n// profile color the engine renders AND for the IndicatorPicker swatch\n// dots. Previously these values were duplicated as hardcoded const\n// tuples in ChartEngine.tsx and as `swatch` literals in\n// IndicatorCatalog.ts, so editing a color meant editing two files and\n// hoping they stayed in sync. Now ChartEngine reads CHART_COLORS for\n// its GL layer colors and IndicatorCatalog derives its swatches via\n// swatchOf(), so the picker dot always matches what's drawn.\n//\n// RGBA, channels 0..1. The alpha is the rendered alpha; swatchOf()\n// drops it. Domain adapters that own multi-color palettes (key levels,\n// GEX walls, liquidation clusters) keep those colors in their own\n// files — the entries here for those keys are the representative\n// swatch dots the picker shows, not the per-level render colors.\nexport const CHART_COLORS = {\n // Indicator overlays / oscillator\n sma: rgba(1.0, 0.65, 0.27, 0.85), // orange\n ema: rgba(0.34, 0.76, 0.95, 0.85), // sky blue\n vwap: rgba(0.98, 0.82, 0.32, 0.9), // liquid gold\n rsi: rgba(0.78, 0.45, 0.95, 0.9), // magenta\n rsiThreshold: rgba(0.54, 0.56, 0.61, 0.25), // muted 30/70 guides\n // Open interest reads as its own positioning signal — a soft\n // cyan-blue distinct from EMA's sky blue when both are visible.\n openInterest: rgba(0.4, 0.85, 0.9, 0.9),\n // Event markers\n whaleBuy: rgba(0.117, 0.78, 0.42, 0.85), // teal up-triangle\n whaleSell: rgba(0.94, 0.26, 0.43, 0.85), // pink down-triangle\n liqLong: rgba(1.0, 0.45, 0.05, 0.7), // deep orange (forced sell)\n liqShort: rgba(0.55, 0.95, 0.2, 0.7), // chartreuse (forced buy)\n // Volume-profile reference lines\n vpPoc: rgba(0.0, 0.88, 1.0, 0.55), // point of control\n vpValueArea: rgba(0.54, 0.56, 0.61, 0.35), // VAH / VAL\n // Representative swatch dots for multi-color / gradient features\n // whose actual render colors live in their layer or adapter.\n volumeBars: rgba(0.5, 0.55, 0.65, 1),\n volumeProfile: rgba(0.4, 0.42, 0.5, 1),\n footprint: rgba(0.6, 0.4, 0.9, 1),\n obh: rgba(0.95, 0.75, 0.0, 1),\n keyLevels: rgba(0.85, 0.85, 0.85, 1),\n liqLevels: rgba(0.9, 0.4, 0.6, 1),\n gex: rgba(0.96, 0.62, 0.04, 1),\n};\n\nexport type ChartColorKey = keyof typeof CHART_COLORS;\n\n// RGB swatch (display dot) for a palette entry — drops alpha and\n// returns a fresh array so a caller can't mutate the shared palette.\nexport const swatchOf = (key: ChartColorKey): RGB => {\n const [r, g, b] = CHART_COLORS[key];\n return [r, g, b];\n};\n","// Chrome (DOM-overlay) CSS colors — the design-system counterpart to\n// CHART_COLORS in core/Theme.ts (which holds GL float colors). Single\n// source for the chart's React chrome (tool palette, perf overlay, OHLC\n// legend, the engine's status/error overlays) so the same surface /\n// border / text values aren't re-typed as inline rgba() literals in\n// every file.\n//\n// Values mirror the app's trade-* Tailwind tokens, kept here as CSS\n// strings because these components style via inline `style={{}}` rather\n// than className. Drawing-tool accent colors are intentionally NOT here\n// — they live in ui/drawingToolConfig.ts, their own domain source.\n\n// Base RGB triples (no alpha) for building rgba() strings on demand.\nexport const RGB = {\n surface: \"15,17,23\", // trade.bg (#0f1117)\n line: \"35,39,51\", // trade.line (#232733)\n dim: \"138,143,156\", // trade.dim (#8a8f9c)\n value: \"205,210,220\", // primary readout text (#cdd2dc)\n black: \"0,0,0\", // overlay shadow base\n up: \"30,199,122\", // candleUp green (#1ec77a) — triple form of UI.up,\n // for building the active/selected accent tints (alpha 0.08–0.7).\n} as const;\n\n// Build an rgba() string from a base \"r,g,b\" triple. Output format\n// matches the inline literals it replaces (no spaces) so the migration\n// is render-identical.\nexport const alpha = (rgb: string, a: number): string => `rgba(${rgb},${a})`;\n\n// Ready-made chrome colors shared across the engine's overlays.\nexport const UI = {\n /** Translucent panel background — floating palettes / triggers. */\n overlayBg: alpha(RGB.surface, 0.8),\n /** Slightly more opaque panel background — perf / info overlays. */\n panelBg: alpha(RGB.surface, 0.85),\n /** Solid drawer surface — one step lighter than the chart bg so a\n * portalled menu (the indicator picker) reads as raised. */\n drawerBg: \"#13161f\",\n /** Hairline border on floating chrome. */\n border: alpha(RGB.line, 0.9),\n /** Primary readout text (legend values, perf \"good\" rows). */\n value: \"#cdd2dc\",\n /** Up / down — match darkTheme candleUp / candleDown. */\n up: \"#1ec77a\",\n down: \"#f6465d\",\n /** Status accents — perf overlay warn / danger thresholds. */\n warn: \"#f5d94d\",\n danger: \"#ffa699\",\n} as const;\n","// Shared price formatting helpers — kept in core/ so the crosshair and\n// the price-axis labels stay in lockstep. The two layers used to diverge,\n// which produced subtle \"is the tooltip reading the same number as the\n// tick?\" cognitive splits (and worse, toPrecision emitted scientific\n// notation containing characters the glyph atlas doesn't carry).\n\n// \"Nice\" tick step for an arbitrary range. Picks 1 / 2 / 2.5 / 5 ×\n// 10^n so trading axes can land on 25 / 250 / 2500 bands instead of\n// jumping straight from 20 to 50.\nexport function niceStep(rough: number): number {\n if (!isFinite(rough) || rough <= 0) return 1;\n const exp = Math.floor(Math.log10(rough));\n const base = Math.pow(10, exp);\n const f = rough / base;\n if (f < 1.5) return 1 * base;\n if (f < 2.25) return 2 * base;\n if (f < 3.5) return 2.5 * base;\n if (f < 7) return 5 * base;\n return 10 * base;\n}\n\n// Format a tick-axis price with precision driven by the tick step so the\n// value rounds the same way as neighboring axis labels. Never returns\n// exponential notation — `toPrecision` would emit \"1.234e-7\" for\n// sub-cent coins and the GlyphAtlas has no lowercase 'e', so labels\n// would silently render as \"1.234-7\".\n//\n// Non-finite placeholder uses ASCII \"--\" because the GlyphAtlas default\n// character set has no U+2014 em-dash — a \"—\" placeholder would itself\n// render as an invisible label.\nexport function formatPrice(p: number, step: number): string {\n if (!isFinite(p)) return \"--\";\n const abs = Math.abs(p);\n if (abs >= 1_000_000) return `${(p / 1_000_000).toFixed(2)}M`;\n if (abs >= 10_000) return p.toFixed(2);\n if (abs >= 100) return p.toFixed(step < 1 ? 2 : 0);\n if (abs >= 1) return p.toFixed(step < 0.1 ? 3 : 2);\n // Sub-dollar (memes / small caps) — match step precision, capped so\n // we never emit a label wider than the right-axis gutter.\n const decimals = Math.max(2, -Math.floor(Math.log10(Math.max(step, 1e-12))));\n return p.toFixed(Math.min(decimals, 8));\n}\n\n// Per-pixel hover precision — always shows cents in the $1–$1M band so\n// the crosshair gives more resolution than the surrounding tick labels.\n// Axis ticks fall back to integers above $10k via formatPrice; the\n// hover should not.\nexport function formatHoverPrice(p: number, step: number): string {\n if (!isFinite(p)) return \"--\";\n const abs = Math.abs(p);\n if (abs >= 1_000_000) return `${(p / 1_000_000).toFixed(2)}M`;\n if (abs >= 1) return p.toFixed(2);\n const decimals = Math.max(2, -Math.floor(Math.log10(Math.max(step, 1e-12))));\n return p.toFixed(Math.min(decimals, 8));\n}\n\n// Compact volume readout for the legend (the per-bar volume can span\n// fractional coins to billions). Collapses to B / M / K with two\n// significant decimals; sub-1 amounts keep four so a thin bar still\n// shows something. Pure formatting, no scale assumptions about the\n// asset. \"--\" for the non-finite guard the other formatters use.\n//\n// Bands are picked on the raw magnitude before rounding, so a value\n// just under a threshold stays in the lower band and may round to its\n// ceiling (999_999 → \"1000.00K\", not \"1.00M\") — intended; the jump to\n// the next suffix happens exactly at the threshold.\nexport function formatVolume(v: number): string {\n if (!isFinite(v)) return \"--\";\n const a = Math.abs(v);\n if (a >= 1_000_000_000) return `${(v / 1_000_000_000).toFixed(2)}B`;\n if (a >= 1_000_000) return `${(v / 1_000_000).toFixed(2)}M`;\n if (a >= 1_000) return `${(v / 1_000).toFixed(2)}K`;\n if (a === 0) return \"0\";\n if (a >= 1) return v.toFixed(2);\n return v.toFixed(4);\n}\n\n// Value text for a sub-pane on-chart legend (RSI / OI): the formatted\n// number, or \"\" when non-finite so the pane legend hides during warm-up /\n// before first paint / coin-switch rather than showing a \"--\" stub — the\n// same NaN-hides-it contract as the OHLC overlay rows. The static label\n// (e.g. \"RSI 14\") is owned by the layer and drawn in the line colour; this\n// is just the dynamic value, drawn bright beside it. `format` shapes the\n// number (RSI → 2dp, OI → formatVolume); a finite 0 is kept (RSI ≈ 0).\nexport function paneLegendValue(\n value: number,\n format: (v: number) => string,\n): string {\n return Number.isFinite(value) ? format(value) : \"\";\n}\n\n// Step appropriate for a single-price label given the current visible\n// price band. Used by the crosshair (which doesn't iterate ticks but\n// still needs to choose precision the same way as the axis).\nexport function stepForRange(p0: number, p1: number, targetTicks = 6): number {\n return niceStep(Math.max(1e-12, (p1 - p0) / Math.max(1, targetTicks)));\n}\n","export type ChartTypeFamily = \"Candle\" | \"Bars\" | \"Line\" | \"Area\" | \"Pro\";\n\nexport type ChartTypeKey =\n | \"candle\"\n | \"hollow-candle\"\n | \"heikin-ashi\"\n | \"bars\"\n | \"volume-bars\"\n | \"columns\"\n | \"high-low\"\n | \"line\"\n | \"line-markers\"\n | \"step-line\"\n | \"hlc-area\"\n | \"area\"\n | \"baseline\"\n | \"volume-footprint\"\n | \"tpo\";\n\nexport type ChartTypeAvailability = \"available\" | \"partial\" | \"source_required\";\n\nexport interface ChartTypeOption {\n key: ChartTypeKey;\n family: ChartTypeFamily;\n label: string;\n short: string;\n availability: ChartTypeAvailability;\n}\n\nexport const CHART_TYPE_FAMILIES: readonly ChartTypeFamily[] = [\n \"Candle\",\n \"Bars\",\n \"Line\",\n \"Area\",\n \"Pro\",\n] as const;\n\nexport const CHART_TYPE_OPTIONS: readonly ChartTypeOption[] = [\n {\n key: \"candle\",\n family: \"Candle\",\n label: \"Candle\",\n short: \"C\",\n availability: \"available\",\n },\n {\n key: \"hollow-candle\",\n family: \"Candle\",\n label: \"Hollow Candle\",\n short: \"HC\",\n availability: \"available\",\n },\n {\n key: \"heikin-ashi\",\n family: \"Candle\",\n label: \"Heikin Ashi\",\n short: \"HA\",\n availability: \"available\",\n },\n {\n key: \"bars\",\n family: \"Bars\",\n label: \"Bars\",\n short: \"B\",\n availability: \"available\",\n },\n {\n key: \"volume-bars\",\n family: \"Bars\",\n label: \"Volume Bars\",\n short: \"VB\",\n availability: \"available\",\n },\n {\n key: \"columns\",\n family: \"Bars\",\n label: \"Columns\",\n short: \"COL\",\n availability: \"available\",\n },\n {\n key: \"high-low\",\n family: \"Bars\",\n label: \"High-Low\",\n short: \"HL\",\n availability: \"available\",\n },\n {\n key: \"line\",\n family: \"Line\",\n label: \"Line\",\n short: \"L\",\n availability: \"available\",\n },\n {\n key: \"line-markers\",\n family: \"Line\",\n label: \"Line With Markers\",\n short: \"LM\",\n availability: \"available\",\n },\n {\n key: \"step-line\",\n family: \"Line\",\n label: \"Step Line\",\n short: \"SL\",\n availability: \"available\",\n },\n {\n key: \"hlc-area\",\n family: \"Area\",\n label: \"HLC Area\",\n short: \"HLC\",\n availability: \"available\",\n },\n {\n key: \"area\",\n family: \"Area\",\n label: \"Area\",\n short: \"A\",\n availability: \"available\",\n },\n {\n key: \"baseline\",\n family: \"Area\",\n label: \"Baseline\",\n short: \"BL\",\n availability: \"available\",\n },\n {\n key: \"volume-footprint\",\n family: \"Pro\",\n label: \"Volume Footprint\",\n short: \"VF\",\n availability: \"partial\",\n },\n {\n key: \"tpo\",\n family: \"Pro\",\n label: \"Time Price Opportunity\",\n short: \"TPO\",\n availability: \"source_required\",\n },\n] as const;\n\nexport const DEFAULT_CHART_TYPE: ChartTypeKey = \"candle\";\n\nexport const CHART_TYPE_BY_KEY: Record<ChartTypeKey, ChartTypeOption> =\n CHART_TYPE_OPTIONS.reduce(\n (acc, option) => {\n acc[option.key] = option;\n return acc;\n },\n {} as Record<ChartTypeKey, ChartTypeOption>,\n );\n\nexport function isChartTypeKey(value: string): value is ChartTypeKey {\n return Object.prototype.hasOwnProperty.call(CHART_TYPE_BY_KEY, value);\n}\n\nexport function isChartTypeSelectable(option: ChartTypeOption): boolean {\n return option.availability !== \"source_required\";\n}\n\nexport function chartTypeAvailabilityLabel(\n availability: ChartTypeAvailability,\n): \"Live\" | \"Partial\" | \"Source\" {\n if (availability === \"partial\") return \"Partial\";\n if (availability === \"source_required\") return \"Source\";\n return \"Live\";\n}\n","import { swatchOf } from \"./Theme\";\n\n// Single source of truth for the toggleable indicators that the\n// /trade/v2 IndicatorPicker exposes. Every entry maps to one or more\n// chart layers gated via the Layer.visible flag; ChartEngine reads\n// the picker's selection and applies the resulting visibility per\n// layer in a single useEffect.\n//\n// Scope of this catalogue:\n// - Main-pane overlays AND three sub-pane toggles (RSI, Open\n// Interest, Volume Bars). Toggling a sub-pane key flips\n// Pane.visible and triggers a bounds-redistribution pass in\n// ChartEngine so the freed slice goes to the main candle pane.\n// The Volume Bars toggle became possible after TimeAxisLayer\n// moved from volumePane to Scene.globalLayers — the time axis\n// now tracks whichever sub-pane is bottom-most visible (or the\n// main pane if all sub-panes are hidden).\n// - Indicators that group naturally (whale buy + whale sell;\n// liq-long + liq-short markers) get ONE key here that maps to\n// both layer ids in CHART_LAYERS_BY_INDICATOR below. The user\n// mental model is \"Whales on/off\", not \"Whale buys on /\n// whale sells on\" — splitting them would surprise users for no\n// practical benefit.\n//\n// Adding a new toggleable indicator:\n// 1) Add a string literal to `IndicatorKey`.\n// 2) Add an entry to `INDICATOR_CATALOG`.\n// 3) Map it to layer ids in `CHART_LAYERS_BY_INDICATOR` (engine\n// side reads this).\n// DEFAULT_VISIBLE_INDICATORS is intentionally conservative, but the\n// workbench is now order-flow first: OBH is part of the primary chart\n// read, not a secondary dashboard widget.\n\n/**\n * Every toggleable indicator key understood by the picker. The\n * literal-union shape (rather than an enum) lets `Record<IndicatorKey,\n * X>` types in callers fail at compile time if a new key is added\n * without an entry — the same exhaustiveness pattern used for\n * DrawingTool / DrawnShape kind.\n */\nexport type IndicatorKey =\n | \"sma20\"\n | \"ema50\"\n | \"vwap\"\n | \"rsi\"\n | \"openInterest\"\n | \"obh\"\n | \"volumeBars\"\n | \"volumeProfile\"\n | \"vpLines\"\n | \"footprint\"\n | \"keyLevels\"\n | \"liqLevels\"\n | \"gex\"\n | \"liqEvents\"\n | \"whales\";\n\n/**\n * Categories shown in the picker. Order is the display order; the\n * picker renders one section per category in this order.\n *\n * Categories mirror the kiyotaka grouping in the P8 plan brief:\n * Overlays (price-line indicators), Volume (anything reading volume\n * across price levels), Order Flow (positioning / tape signals),\n * Key Levels (static reference levels).\n */\nexport type IndicatorCategory =\n | \"Overlays\"\n | \"Oscillators\"\n | \"Volume\"\n | \"Order Flow\"\n | \"Funding & OI\"\n | \"Key Levels\";\n\nexport const INDICATOR_CATEGORIES: readonly IndicatorCategory[] = [\n \"Overlays\",\n \"Oscillators\",\n \"Volume\",\n \"Order Flow\",\n \"Funding & OI\",\n \"Key Levels\",\n] as const;\n\nexport interface IndicatorEntry {\n key: IndicatorKey;\n /** Display label shown in the picker. */\n label: string;\n /** Short blurb shown as a hover tooltip on the picker row. */\n description: string;\n category: IndicatorCategory;\n /** Display-only swatch RGB (0–1). Picker renders a tiny colored dot. */\n swatch: [number, number, number];\n}\n\n// The catalogue order is the order rows appear within each category\n// section in the picker. Inside Overlays, indicators sort by line\n// drawing \"weight\" (faster MA first); inside Key Levels, by\n// importance for trading decisions (Open Levels first — they're the\n// most checked daily reference; GEX last since it's dealer-flow\n// context, not price-action).\nexport const INDICATOR_CATALOG: readonly IndicatorEntry[] = [\n {\n key: \"sma20\",\n label: \"SMA (20)\",\n description: \"Simple moving average over the last 20 candles.\",\n category: \"Overlays\",\n swatch: swatchOf(\"sma\"),\n },\n {\n key: \"ema50\",\n label: \"EMA (50)\",\n description: \"Exponential moving average over the last 50 candles.\",\n category: \"Overlays\",\n swatch: swatchOf(\"ema\"),\n },\n {\n key: \"vwap\",\n label: \"VWAP\",\n description: \"Volume-weighted average price from visible session data.\",\n category: \"Overlays\",\n swatch: swatchOf(\"vwap\"),\n },\n {\n key: \"rsi\",\n label: \"RSI (14)\",\n description:\n \"Relative strength index in its own sub-pane; hides the pane when off.\",\n category: \"Oscillators\",\n swatch: swatchOf(\"rsi\"),\n },\n {\n key: \"openInterest\",\n label: \"Open Interest\",\n description:\n \"Aggregated perp open-interest history in its own sub-pane; hides the pane when off.\",\n category: \"Funding & OI\",\n swatch: swatchOf(\"openInterest\"),\n },\n {\n key: \"volumeBars\",\n label: \"Volume Bars\",\n description:\n \"Per-candle aggregate volume in its own sub-pane at the bottom of the chart.\",\n category: \"Volume\",\n swatch: swatchOf(\"volumeBars\"),\n },\n {\n key: \"volumeProfile\",\n label: \"Volume Profile\",\n description:\n \"Visible-range volume profile histogram on the right edge.\",\n category: \"Volume\",\n swatch: swatchOf(\"volumeProfile\"),\n },\n {\n key: \"vpLines\",\n label: \"POC / VAH / VAL\",\n description:\n \"Point-of-control plus value-area high/low from the volume profile.\",\n category: \"Volume\",\n swatch: swatchOf(\"vpPoc\"),\n },\n {\n key: \"footprint\",\n label: \"Volume Footprint\",\n description:\n \"Per-candle buy/sell USD breakdown overlaid on each candle body.\",\n category: \"Volume\",\n swatch: swatchOf(\"footprint\"),\n },\n {\n key: \"obh\",\n label: \"Order Book Heatmap\",\n description:\n \"Time-stacked depth of book; brighter cells are heavier resting size.\",\n category: \"Order Flow\",\n swatch: swatchOf(\"obh\"),\n },\n {\n key: \"whales\",\n label: \"Whale Trades\",\n description: \"Up/down triangles at large taker prints (≥$250k).\",\n category: \"Order Flow\",\n swatch: swatchOf(\"whaleBuy\"),\n },\n {\n key: \"liqEvents\",\n label: \"Liquidation Events\",\n description:\n \"Forced-exit prints at liquidated positions (long → sell, short → buy).\",\n category: \"Order Flow\",\n swatch: swatchOf(\"liqLong\"),\n },\n {\n key: \"keyLevels\",\n label: \"Open Levels\",\n description:\n \"Prior-day/week/month highs+lows and the weekly value area.\",\n category: \"Key Levels\",\n swatch: swatchOf(\"keyLevels\"),\n },\n {\n key: \"liqLevels\",\n label: \"Liquidation Clusters\",\n description:\n \"Price bands with dense liquidatable positioning; strength-weighted alpha.\",\n category: \"Key Levels\",\n swatch: swatchOf(\"liqLevels\"),\n },\n {\n key: \"gex\",\n label: \"GEX Levels\",\n description:\n \"γ-flip, call wall, put wall — dealer-regime levels from option flow.\",\n category: \"Key Levels\",\n swatch: swatchOf(\"gex\"),\n },\n] as const;\n\n// O(1) lookup by key. Useful where callers know the key statically\n// (e.g. the picker rendering its rows under a category section).\nexport const INDICATOR_BY_KEY: Record<IndicatorKey, IndicatorEntry> =\n INDICATOR_CATALOG.reduce(\n (acc, entry) => {\n acc[entry.key] = entry;\n return acc;\n },\n {} as Record<IndicatorKey, IndicatorEntry>,\n );\n\n/**\n * Default-on set. Keep the first paint chart-native: candles, volume,\n * VWAP, visible-range volume profile, and the order-book heatmap.\n * Heavier footprint/OI/liquidation overlays remain explicit opt-ins.\n */\nexport const DEFAULT_VISIBLE_INDICATORS: ReadonlySet<IndicatorKey> = new Set<\n IndicatorKey\n>([\"volumeBars\", \"obh\", \"vwap\", \"volumeProfile\", \"vpLines\"]);\n\n/**\n * Map every IndicatorKey to the list of chart-layer ids it gates.\n * Most are 1:1; the side-grouped ones (whales = buy+sell, liqEvents\n * = long+short marker layers) are 1:N. Kept as a separate map (not\n * embedded in INDICATOR_CATALOG) so the engine-side wiring concern\n * stays out of the picker UI concerns — the picker doesn't need to\n * know how many GL layers a checkbox controls.\n *\n * Layer ids match the `id` passed to each `new XxxLayer({id, ...})`\n * in ChartEngine — when adding a new indicator, the engine-side\n * lookup is by id, so the id strings here MUST match.\n */\nexport const CHART_LAYERS_BY_INDICATOR: Record<IndicatorKey, readonly string[]> = {\n sma20: [\"sma-20\"],\n ema50: [\"ema-50\"],\n vwap: [\"vwap\"],\n // Sub-pane keys gate the WHOLE pane via CHART_PANES_BY_INDICATOR\n // below — their layer ids aren't toggled individually since the\n // whole pane being hidden makes layer-by-layer gating redundant.\n // An empty list here means \"this key doesn't gate any main-pane\n // layer\"; the engine's visibility effect still walks both maps.\n rsi: [],\n openInterest: [],\n volumeBars: [],\n obh: [\"obh\"],\n volumeProfile: [\"volume-profile\"],\n vpLines: [\"vp-lines\"],\n footprint: [\"footprint\"],\n keyLevels: [\"key-levels\"],\n liqLevels: [\"liq-levels\"],\n gex: [\"gex\"],\n // Side-grouped layers — one user-visible toggle controls both.\n liqEvents: [\"liq-longs\", \"liq-shorts\"],\n whales: [\"whale-buys\", \"whale-sells\"],\n};\n\n/**\n * Map every IndicatorKey to the list of sub-pane ids it gates.\n * Most catalog keys are main-pane layers and have an empty list\n * here; only sub-pane toggles (rsi → \"rsi\" pane, openInterest →\n * \"oi\" pane) populate this map.\n *\n * Why a separate map from CHART_LAYERS_BY_INDICATOR: layers and\n * panes are different rendering units. A layer hidden via\n * Layer.visible just stops painting; a pane hidden via Pane.visible\n * also needs its allocated slice redistributed via Scene.relayout —\n * the engine treats these branches differently so the maps stay\n * structurally separate too.\n */\nexport const CHART_PANES_BY_INDICATOR: Record<IndicatorKey, readonly string[]> = {\n sma20: [],\n ema50: [],\n vwap: [],\n rsi: [\"rsi\"],\n openInterest: [\"oi\"],\n volumeBars: [\"volume\"],\n obh: [],\n volumeProfile: [],\n vpLines: [],\n footprint: [],\n keyLevels: [],\n liqLevels: [],\n gex: [],\n liqEvents: [],\n whales: [],\n};\n","import type { IndicatorKey } from \"./IndicatorCatalog\";\n\nexport type IndicatorLibraryGroup =\n | \"Aggregate Flow\"\n | \"Profiles\"\n | \"Order Flow\"\n | \"Exchange Data\"\n | \"Options & Macro\"\n | \"Sector\"\n | \"Technical\";\n\nexport type IndicatorAvailability = \"available\" | \"partial\" | \"source_required\";\n\nexport interface IndicatorLibraryEntry {\n id: string;\n title: string;\n short: string;\n description: string;\n group: IndicatorLibraryGroup;\n key?: IndicatorKey;\n availability?: IndicatorAvailability;\n source?: string;\n}\n\nexport const INDICATOR_LIBRARY_GROUPS: readonly IndicatorLibraryGroup[] = [\n \"Aggregate Flow\",\n \"Profiles\",\n \"Order Flow\",\n \"Exchange Data\",\n \"Options & Macro\",\n \"Sector\",\n \"Technical\",\n] as const;\n\nexport const INDICATOR_LIBRARY: readonly IndicatorLibraryEntry[] = [\n {\n id: \"acvd\",\n title: \"Agg. Cumulative Volume Delta\",\n short: \"ACVD\",\n description:\n \"Net market buy minus sell volume across exchanges for directional flow strength.\",\n group: \"Aggregate Flow\",\n availability: \"partial\",\n source: \"HL live trades\",\n },\n {\n id: \"afr\",\n title: \"Agg. Funding Rate\",\n short: \"AFR\",\n description:\n \"Average funding across major perpetual futures exchanges for sentiment bias.\",\n group: \"Aggregate Flow\",\n availability: \"partial\",\n source: \"HL + CEX snapshots\",\n },\n {\n id: \"al\",\n title: \"Agg. Liquidations\",\n short: \"AL\",\n description: \"Forced position closures aggregated across venues.\",\n group: \"Aggregate Flow\",\n key: \"liqEvents\",\n availability: \"available\",\n },\n {\n id: \"aoi\",\n title: \"Agg. Open Interest\",\n short: \"AOI\",\n description: \"Open perpetual futures positioning across available venues.\",\n group: \"Aggregate Flow\",\n key: \"openInterest\",\n availability: \"available\",\n },\n {\n id: \"aobh\",\n title: \"Agg. Order Book Heatmap\",\n short: \"AOBH\",\n description: \"Aggregated liquidity heatmap by exchange order books.\",\n group: \"Aggregate Flow\",\n key: \"obh\",\n availability: \"available\",\n },\n {\n id: \"asvp\",\n title: \"Agg. Session Volume Profile\",\n short: \"ASVP\",\n description: \"Session profile view of traded volume across venues.\",\n group: \"Profiles\",\n },\n {\n id: \"tpo\",\n title: \"TPO\",\n short: \"TPO\",\n description:\n \"Time distribution at each price level within sessions for value areas.\",\n group: \"Profiles\",\n },\n {\n id: \"atpo\",\n title: \"Agg. TPO\",\n short: \"ATPO\",\n description:\n \"Aggregated time-price opportunity across venues and sessions.\",\n group: \"Profiles\",\n },\n {\n id: \"avrv\",\n title: \"Agg. VRVP\",\n short: \"AVRV\",\n description: \"Visible range volume profile aggregated across venues.\",\n group: \"Profiles\",\n key: \"volumeProfile\",\n availability: \"available\",\n },\n {\n id: \"av\",\n title: \"Agg. Volume\",\n short: \"AV\",\n description: \"Aggregate per-candle traded volume.\",\n group: \"Aggregate Flow\",\n key: \"volumeBars\",\n availability: \"available\",\n },\n {\n id: \"avf\",\n title: \"Agg. Volume Footprint\",\n short: \"AVF\",\n description:\n \"Aggregate buy and sell pressure at each price level inside candles.\",\n group: \"Order Flow\",\n key: \"footprint\",\n availability: \"available\",\n },\n {\n id: \"bfib\",\n title: \"Binance Futures Insurance Balance\",\n short: \"BFIB\",\n description: \"Binance futures insurance fund balance.\",\n group: \"Exchange Data\",\n },\n {\n id: \"bmbr\",\n title: \"Binance Margin Borrow Rate\",\n short: \"BMBR\",\n description: \"Interest rates for Binance margin borrowing.\",\n group: \"Exchange Data\",\n },\n {\n id: \"bmls\",\n title: \"Binance Margin Long Short Ratio\",\n short: \"BMLS\",\n description: \"Long to short positioning ratio in Binance margin.\",\n group: \"Exchange Data\",\n },\n {\n id: \"pr\",\n title: \"Put/Call Ratio\",\n short: \"PR\",\n description: \"Put option open interest divided by call option open interest.\",\n group: \"Options & Macro\",\n },\n {\n id: \"btb\",\n title: \"Binance Treasury Balance\",\n short: \"BTB\",\n description: \"Assets held by Binance for operational and strategic uses.\",\n group: \"Exchange Data\",\n },\n {\n id: \"bls\",\n title: \"Bitfinex Long & Short Positions\",\n short: \"BL&S\",\n description: \"Aggregated Bitfinex user long and short positioning.\",\n group: \"Exchange Data\",\n },\n {\n id: \"cftc\",\n title: \"CFTC COT Net Position\",\n short: \"CFTC\",\n description: \"Commitments of Traders net long or short positioning.\",\n group: \"Options & Macro\",\n },\n {\n id: \"cmeo\",\n title: \"CME Open Interest\",\n short: \"CMEO\",\n description: \"Open interest for crypto futures traded on CME.\",\n group: \"Options & Macro\",\n },\n {\n id: \"cp\",\n title: \"Coinbase Premium\",\n short: \"CP\",\n description: \"Coinbase minus Binance price premium for US demand.\",\n group: \"Exchange Data\",\n },\n {\n id: \"crbs\",\n title: \"Cumulative Returns by Session\",\n short: \"CRBS\",\n description: \"Cumulative returns split by trading session.\",\n group: \"Profiles\",\n },\n {\n id: \"cvd\",\n title: \"CVD\",\n short: \"CVD\",\n description: \"Buying volume minus selling volume over time.\",\n group: \"Order Flow\",\n availability: \"partial\",\n source: \"HL live trades\",\n },\n {\n id: \"etff\",\n title: \"ETF Flows\",\n short: \"ETFF\",\n description: \"Net capital inflow or outflow for crypto ETFs.\",\n group: \"Options & Macro\",\n },\n {\n id: \"etfh\",\n title: \"ETF Holdings\",\n short: \"ETFH\",\n description: \"Asset balances held by major crypto ETFs.\",\n group: \"Options & Macro\",\n },\n {\n id: \"etfp\",\n title: \"ETF Premium Rate\",\n short: \"ETFP\",\n description: \"ETF market price compared with net asset value.\",\n group: \"Options & Macro\",\n },\n {\n id: \"ep\",\n title: \"Ethena Positions\",\n short: \"EP\",\n description: \"Collateral held inside the Ethena protocol.\",\n group: \"Options & Macro\",\n },\n {\n id: \"fr\",\n title: \"Funding Rate\",\n short: \"FR\",\n description:\n \"Periodic payments between perp longs and shorts to anchor futures prices.\",\n group: \"Exchange Data\",\n availability: \"partial\",\n source: \"HL funding\",\n },\n {\n id: \"hlh\",\n title: \"Hyperliquid Liquidation Heatmap\",\n short: \"HLH\",\n description: \"Liquidation clusters and levels for Hyperliquid markets.\",\n group: \"Order Flow\",\n key: \"liqLevels\",\n availability: \"available\",\n },\n {\n id: \"ml\",\n title: \"Margin Liquidations\",\n short: \"ML\",\n description: \"Collateral lost when leveraged positions are closed.\",\n group: \"Order Flow\",\n key: \"liqEvents\",\n availability: \"available\",\n },\n {\n id: \"iv\",\n title: \"Implied Volatility\",\n short: \"IV\",\n description: \"Forward volatility estimate from options pricing.\",\n group: \"Options & Macro\",\n },\n {\n id: \"kp\",\n title: \"Kimchi Premium\",\n short: \"KP\",\n description: \"Upbit premium or discount versus Binance.\",\n group: \"Exchange Data\",\n },\n {\n id: \"l\",\n title: \"Liquidations\",\n short: \"L\",\n description: \"Volume of forced position closures.\",\n group: \"Order Flow\",\n key: \"liqEvents\",\n availability: \"available\",\n },\n {\n id: \"lsr\",\n title: \"Long Short Ratio (Futures)\",\n short: \"LSR\",\n description: \"Ratio of futures long positions to short positions.\",\n group: \"Exchange Data\",\n },\n {\n id: \"mr\",\n title: \"Margin Rates\",\n short: \"MR\",\n description: \"Unified margin rates across major venues.\",\n group: \"Exchange Data\",\n },\n {\n id: \"mnav\",\n title: \"mNAV\",\n short: \"M\",\n description: \"Company market value compared with crypto holdings.\",\n group: \"Options & Macro\",\n },\n {\n id: \"oi\",\n title: \"Open Interest\",\n short: \"OI\",\n description: \"Outstanding unsettled derivative contracts.\",\n group: \"Exchange Data\",\n key: \"openInterest\",\n availability: \"available\",\n },\n {\n id: \"obd\",\n title: \"Order Book Depth\",\n short: \"OBD\",\n description: \"Difference between buy and sell order book volumes.\",\n group: \"Order Flow\",\n availability: \"partial\",\n source: \"HL L2\",\n },\n {\n id: \"obh\",\n title: \"Order Book Heatmap\",\n short: \"OBH\",\n description: \"Bid and ask liquidity concentrations over price and time.\",\n group: \"Order Flow\",\n key: \"obh\",\n availability: \"available\",\n },\n {\n id: \"obp\",\n title: \"Order Book Profile\",\n short: \"OBP\",\n description: \"Live order book profile by price level.\",\n group: \"Order Flow\",\n availability: \"partial\",\n source: \"HL L2\",\n },\n {\n id: \"sfr\",\n title: \"Sector Funding Rate\",\n short: \"SFR\",\n description: \"Weighted funding rate across assets in a sector.\",\n group: \"Sector\",\n },\n {\n id: \"sl\",\n title: \"Sector Liquidations\",\n short: \"SL\",\n description: \"Aggregate sector liquidations and stress points.\",\n group: \"Sector\",\n },\n {\n id: \"soi\",\n title: \"Sector Open Interest\",\n short: \"SOI\",\n description: \"Open positioning deployed across a sector.\",\n group: \"Sector\",\n },\n {\n id: \"sp-eq\",\n title: \"Sector Performance [equal-weighted]\",\n short: \"SP\",\n description: \"Equal-weight average performance across sector assets.\",\n group: \"Sector\",\n },\n {\n id: \"sp-mcap\",\n title: \"Sector Performance [mcap-weighted]\",\n short: \"SP\",\n description: \"Market-cap weighted sector performance.\",\n group: \"Sector\",\n },\n {\n id: \"sv\",\n title: \"Sector Volume\",\n short: \"SV\",\n description: \"Total sector trading volume.\",\n group: \"Sector\",\n },\n {\n id: \"svp\",\n title: \"Session Volume Profile\",\n short: \"SVP\",\n description: \"Traded volume at each price level within a session.\",\n group: \"Profiles\",\n },\n {\n id: \"skew\",\n title: \"Skew\",\n short: \"S\",\n description: \"Difference in implied volatility between calls and puts.\",\n group: \"Options & Macro\",\n },\n {\n id: \"volume-script\",\n title: \"Volume (Script)\",\n short: \"V\",\n description: \"Default per-candle volume script.\",\n group: \"Technical\",\n key: \"volumeBars\",\n availability: \"available\",\n },\n {\n id: \"rsi\",\n title: \"Relative Strength Index (RSI)\",\n short: \"RSI\",\n description: \"Momentum oscillator for overbought and oversold conditions.\",\n group: \"Technical\",\n key: \"rsi\",\n availability: \"available\",\n },\n {\n id: \"ema\",\n title: \"Exponential Moving Average (EMA)\",\n short: \"EMA\",\n description: \"Moving average with more weight on recent candles.\",\n group: \"Technical\",\n key: \"ema50\",\n availability: \"available\",\n },\n {\n id: \"sma\",\n title: \"Simple Moving Average (SMA)\",\n short: \"SMA\",\n description: \"Moving average over the last 20 candles.\",\n group: \"Technical\",\n key: \"sma20\",\n availability: \"available\",\n },\n {\n id: \"bb\",\n title: \"Bollinger Bands\",\n short: \"BB\",\n description: \"Volatility bands around a moving average.\",\n group: \"Technical\",\n },\n {\n id: \"macd\",\n title: \"Moving Average Convergence Divergence\",\n short: \"MACD\",\n description: \"Trend and momentum oscillator from moving averages.\",\n group: \"Technical\",\n },\n {\n id: \"ic\",\n title: \"Ichimoku Cloud\",\n short: \"IC\",\n description: \"Trend, support, resistance, and momentum system.\",\n group: \"Technical\",\n },\n {\n id: \"so\",\n title: \"Stochastic Oscillator\",\n short: \"SO\",\n description: \"Current price position relative to its recent range.\",\n group: \"Technical\",\n },\n {\n id: \"cci\",\n title: \"Commodity Channel Index (CCI)\",\n short: \"CCI\",\n description: \"Cyclical price reversal detector from mean deviation.\",\n group: \"Technical\",\n },\n {\n id: \"mfi\",\n title: \"Money Flow Index (MFI)\",\n short: \"MFI\",\n description: \"Volume-weighted momentum oscillator.\",\n group: \"Technical\",\n },\n {\n id: \"obv\",\n title: \"On-Balance Volume (OBV)\",\n short: \"OBV\",\n description: \"Cumulative volume flow for price direction pressure.\",\n group: \"Technical\",\n },\n {\n id: \"adl\",\n title: \"Accumulation Distribution Line (ADL)\",\n short: \"ADL\",\n description: \"Buying and selling pressure from price and volume.\",\n group: \"Technical\",\n },\n {\n id: \"adx\",\n title: \"Average Directional Index (ADX)\",\n short: \"ADX\",\n description: \"Strength of trend regardless of direction.\",\n group: \"Technical\",\n },\n {\n id: \"psar\",\n title: \"Parabolic SAR\",\n short: \"PSAR\",\n description: \"Trailing stop and reverse trend-following system.\",\n group: \"Technical\",\n },\n {\n id: \"vrvp\",\n title: \"VRVP\",\n short: \"VRVP\",\n description: \"Visible range volume profile with high-interest zones.\",\n group: \"Profiles\",\n key: \"volumeProfile\",\n availability: \"available\",\n },\n {\n id: \"vd\",\n title: \"Volume Delta\",\n short: \"VD\",\n description: \"Buy volume minus sell volume per period.\",\n group: \"Order Flow\",\n availability: \"partial\",\n source: \"HL live trades\",\n },\n {\n id: \"vf\",\n title: \"Volume Footprint\",\n short: \"VF\",\n description: \"Traded volume at each price level within a candle.\",\n group: \"Order Flow\",\n key: \"footprint\",\n availability: \"available\",\n },\n {\n id: \"vr\",\n title: \"Volume Ratio\",\n short: \"VR\",\n description: \"Buy volume to sell volume ratio.\",\n group: \"Order Flow\",\n availability: \"partial\",\n source: \"HL live trades\",\n },\n {\n id: \"vwap\",\n title: \"VWAP\",\n short: \"VWAP\",\n description: \"Volume weighted average price.\",\n group: \"Technical\",\n key: \"vwap\",\n availability: \"available\",\n },\n] as const;\n\nexport function indicatorAvailability(\n entry: IndicatorLibraryEntry,\n): IndicatorAvailability {\n return entry.availability ?? (entry.key ? \"available\" : \"source_required\");\n}\n\nexport function indicatorAvailabilityLabel(\n entry: IndicatorLibraryEntry,\n): \"LIVE\" | \"PARTIAL\" | \"SOURCE\" {\n const availability = indicatorAvailability(entry);\n if (availability === \"partial\") return \"PARTIAL\";\n if (availability === \"source_required\") return \"SOURCE\";\n return \"LIVE\";\n}\n\nexport function indicatorCanToggle(entry: IndicatorLibraryEntry): boolean {\n return (\n entry.key != null && indicatorAvailability(entry) !== \"source_required\"\n );\n}\n","// Type definitions and localStorage persistence for user-drawn\n// chart annotations. Per-coin storage so a BTC trendline doesn't\n// follow the user across to ETH.\n//\n// Slices shipped: hline, trend, rect, fib, vline, channel — the\n// full P7 drawing-tool set. Every shape carries a `kind`\n// discriminator and a clip-space-projectable anchor set;\n// persistence/load/save stay shape-agnostic via the union. A future\n// shape kind extends `DrawnShape` the same way.\n\nexport interface DrawnHLine {\n id: string;\n kind: \"hline\";\n /** Price in instrument units. */\n price: number;\n /** Color RGBA in 0..1, premultiplied-safe (alpha applied at blend). */\n color: [number, number, number, number];\n}\n\n/**\n * Vertical line — single time anchor, spans the full main pane\n * height. Typical use: marking news events, daily/weekly opens,\n * earnings releases, anything where the chart needs a \"this\n * moment\" reference. Single-click commit (mirrors hline; no\n * preview phase).\n */\nexport interface DrawnVLine {\n id: string;\n kind: \"vline\";\n /** Time in ms since epoch. */\n t: number;\n color: [number, number, number, number];\n}\n\n/**\n * Trend line — segment between two (time, price) anchors. Anchored in\n * data space (not pixel space) so the segment follows the data when\n * the user pans or zooms. `t1`/`t2` are ms-since-epoch; `price1`/\n * `price2` are in instrument units.\n */\nexport interface DrawnTrend {\n id: string;\n kind: \"trend\";\n t1: number;\n price1: number;\n t2: number;\n price2: number;\n color: [number, number, number, number];\n}\n\n/**\n * Rectangle outline between two (time, price) anchors — same anchor\n * shape as DrawnTrend, but the renderer emits four edge segments to\n * form a box. Outline-only (no fill) keeps the candles underneath\n * legible. Hit-test treats any of the four edges as the click\n * target; the interior is non-interactive.\n */\nexport interface DrawnRect {\n id: string;\n kind: \"rect\";\n t1: number;\n price1: number;\n t2: number;\n price2: number;\n color: [number, number, number, number];\n}\n\n/**\n * Fibonacci retracement — same two (time, price) anchors as trend/\n * rect, renders as N horizontal levels at the standard retracement\n * ratios between price1 and price2. Lines span x(t1)→x(t2) so the\n * fib stays local to the user's selected range (matches the\n * TradingView default; differs from \"full-width hlines\" which\n * would lose the local-range signal). Hit-test treats any of the\n * levels as the click target — deleting the fib removes the whole\n * set, not a single level.\n */\nexport interface DrawnFib {\n id: string;\n kind: \"fib\";\n t1: number;\n price1: number;\n t2: number;\n price2: number;\n color: [number, number, number, number];\n}\n\n/**\n * Parallel channel — a base trend segment (t1,price1)→(t2,price2)\n * plus a second line parallel to it, offset vertically in price by\n * `priceOffset`. The parallel line runs\n * (t1, price1+priceOffset)→(t2, price2+priceOffset), so both lines\n * share the base slope (price2-price1)/(t2-t1) in data space and\n * stay parallel through any pan/zoom.\n *\n * The offset is stored as a single vertical price delta rather than\n * a third (t,price) anchor: the parallel constraint makes the shift\n * one degree of freedom (a vertical price gap), so the third click's\n * time coordinate is redundant for rendering. Storing the delta\n * keeps the shape compact and the render math a straight reuse of\n * the trend-line projection. A future \"drag the parallel handle\"\n * edit slice recomputes `priceOffset` from the dragged point the\n * same way the commit does.\n *\n * Three-click authoring (two for the base line, one for the offset)\n * is the only multi-anchor-phase tool in the set; see the\n * ChartEngine pending-draw state machine.\n */\nexport interface DrawnChannel {\n id: string;\n kind: \"channel\";\n t1: number;\n price1: number;\n t2: number;\n price2: number;\n /** Vertical price offset of the parallel line from the base line. */\n priceOffset: number;\n color: [number, number, number, number];\n}\n\nexport type DrawnShape =\n | DrawnHLine\n | DrawnTrend\n | DrawnRect\n | DrawnFib\n | DrawnVLine\n | DrawnChannel;\n\n/**\n * Standard fibonacci retracement ratios. 0.0 is the price1 anchor\n * end; 1.0 is the price2 anchor end. The 0.618 \"golden ratio\" and\n * 0.5 midpoint are the most-traded levels; 0.236 / 0.382 / 0.786\n * are common secondary levels.\n *\n * Exported so a future fib label / hover-info slice can reuse the\n * exact set the layer renders without redeclaring.\n */\nexport const FIB_RATIOS: readonly number[] = [\n 0, 0.236, 0.382, 0.5, 0.618, 0.786, 1,\n];\n\n// Per-kind default colors for newly drawn shapes. Each entry is\n// chosen to clear ~0.35+ RGB-Euclidean from every adapter-driven\n// color rendered on the same pane (EMA, SMA, OI, RSI, candle\n// up/down, whale markers, liq levels, GEX, key levels) so user\n// drawings stay self-identifying regardless of which adapters are\n// active.\n//\n// - hline → amber: distinct from RSI thresholds, key levels, GEX\n// - trend → deep purple: the earlier cyan was indistinguishable\n// from EMA+OI; a follow-up violet was ~0.19 RGB-Euclidean from\n// RSI magenta. Deep purple [0.5, 0.2, 0.9] cleared the spectrum.\n// - rect → peach: the prior salmon [1.0, 0.55, 0.55] was ~0.32\n// from candle-down + whale-sell pink — closest neighbour in the\n// palette. Peach pushes that distance to ~0.41 while keeping the\n// warm \"region marker\" intent.\n// - fib → turquoise: ~0.37+ from EMA sky-blue (closest neighbour),\n// ~0.40 from OI cyan-blue. The cyan/blue band is already dense;\n// pushing further (into pure green) would collide with whale-buy\n// + candle-up teal. The fib's distinctness comes mostly from its\n// multi-level structure (7 horizontal lines at retracement\n// ratios); the hue just needs to stay out of the trend/rect/\n// hline neighbourhood.\n// - vline → cool gray with low alpha. VLines mark events (news,\n// daily opens) rather than carrying signal of their own — a\n// muted neutral lets them act as time-of-day boundaries without\n// competing visually with the saturated drawing palette.\n// Translucent (α=0.6) reads as \"subtle marker\" against the\n// candles underneath. The cool gray sits at ~0.36 RGB-Euclidean\n// from OI cyan-blue (the closest adapter-driven neighbour given\n// the blue-leaning hue); rect peach lands at ~0.38, comparable.\n// Future palette shifts should be careful not to narrow either\n// gap further — α=0.6 buys some perceptual headroom but the\n// source-RGB floor is the safety net.\n// - channel → deep azure. The blue/cyan band is the densest in the\n// palette (EMA sky-blue, OI cyan, VP-POC cyan, fib turquoise),\n// but those all sit high in green; pushing azure down in green\n// and red [0.1, 0.4, 0.95] clears the closest of them (EMA\n// sky-blue) at ~0.43 RGB-Euclidean. The other near neighbour is\n// trend deep-purple at ~0.45 — a channel's base line looks like\n// a lone trend line, so that gap matters; azure-vs-violet reads\n// cleanly. Structure also disambiguates: a channel is two\n// parallel lines, never one. Avoided pure mid-green (collides\n// with candle-up + whale-buy teal) and dark crimson (too low\n// contrast on the #0f1117 background).\n//\n// Exported via the DEFAULT_COLOR_BY_KIND map so the preview branch\n// in ChartEngine looks up by kind rather than chaining ternaries\n// that grow per tool.\nexport const DEFAULT_HLINE_COLOR: [number, number, number, number] = [\n 0.95, 0.85, 0.3, 0.85,\n];\nexport const DEFAULT_TREND_COLOR: [number, number, number, number] = [\n 0.5, 0.2, 0.9, 0.9,\n];\nexport const DEFAULT_RECT_COLOR: [number, number, number, number] = [\n 1.0, 0.65, 0.6, 0.85,\n];\nexport const DEFAULT_FIB_COLOR: [number, number, number, number] = [\n 0.0, 0.85, 0.85, 0.85,\n];\nexport const DEFAULT_VLINE_COLOR: [number, number, number, number] = [\n 0.75, 0.78, 0.85, 0.6,\n];\nexport const DEFAULT_CHANNEL_COLOR: [number, number, number, number] = [\n 0.1, 0.4, 0.95, 0.9,\n];\nexport const DEFAULT_COLOR_BY_KIND: Record<\n DrawnShape[\"kind\"],\n [number, number, number, number]\n> = {\n hline: DEFAULT_HLINE_COLOR,\n trend: DEFAULT_TREND_COLOR,\n rect: DEFAULT_RECT_COLOR,\n fib: DEFAULT_FIB_COLOR,\n vline: DEFAULT_VLINE_COLOR,\n channel: DEFAULT_CHANNEL_COLOR,\n};\n\n// Sentinel id for the in-progress preview shape on DrawingsLayer.\n// Never persisted (preview lives only on the layer) — exported as\n// a constant so future telemetry/snapshot code can filter on it\n// rather than relying on a magic string.\nexport const PREVIEW_SHAPE_ID = \"__preview__\";\n\n// Storage key follows the singleton-prefs convention in\n// frontend/lib/trade/prefs.ts — `mmflow.chart.drawings.<COIN>` so\n// each coin's set is isolated and a future cleanup pass can sweep\n// stale keys per-coin.\nconst STORAGE_PREFIX = \"mmflow.chart.drawings.\";\n\nfunction storageKey(coin: string): string {\n return `${STORAGE_PREFIX}${coin.toUpperCase()}`;\n}\n\n/**\n * Generate a stable shape id. Uses crypto.randomUUID when present,\n * falls back to a Math.random base36 token for old browsers / SSR.\n * IDs are opaque — code never parses them.\n */\nexport function makeShapeId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof (crypto as Crypto & { randomUUID?: () => string }).randomUUID ===\n \"function\"\n ) {\n return crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n// Shared color validator: rejects non-array, wrong-length, non-finite,\n// and clamps each channel to [0, 1] so a malformed payload (or a\n// future write that ships color in 0..255 by mistake) doesn't render\n// as washed-out white once GL clamps the uniform.\nfunction parseColor(\n raw: unknown,\n): [number, number, number, number] | null {\n if (!Array.isArray(raw) || raw.length !== 4) return null;\n if (\n !raw.every(\n (c): c is number => typeof c === \"number\" && Number.isFinite(c),\n )\n ) {\n return null;\n }\n return [\n Math.max(0, Math.min(1, raw[0])),\n Math.max(0, Math.min(1, raw[1])),\n Math.max(0, Math.min(1, raw[2])),\n Math.max(0, Math.min(1, raw[3])),\n ];\n}\n\n// Shared validator for the two-anchor shape family (trend, rect,\n// fib, and the future channel kind). Each shape gates a structural\n// id + (t1,t2,price1,price2) check + parseColor. Returning a single\n// anchor record keeps the load branch flat: the discriminated\n// union's intersection is `never`, so the structural cast goes\n// through `unknown` rather than a Partial<X & Y> that collapses.\nfunction parsePairAnchors(item: unknown): {\n id: string;\n t1: number;\n t2: number;\n price1: number;\n price2: number;\n color: [number, number, number, number];\n} | null {\n if (!item || typeof item !== \"object\") return null;\n const r = item as {\n id?: unknown;\n t1?: unknown;\n t2?: unknown;\n price1?: unknown;\n price2?: unknown;\n color?: unknown;\n };\n if (typeof r.id !== \"string\" || r.id.length === 0) return null;\n if (typeof r.t1 !== \"number\" || !Number.isFinite(r.t1)) return null;\n if (typeof r.t2 !== \"number\" || !Number.isFinite(r.t2)) return null;\n if (typeof r.price1 !== \"number\" || !Number.isFinite(r.price1)) return null;\n if (typeof r.price2 !== \"number\" || !Number.isFinite(r.price2)) return null;\n const color = parseColor(r.color);\n if (!color) return null;\n return {\n id: r.id,\n t1: r.t1,\n t2: r.t2,\n price1: r.price1,\n price2: r.price2,\n color,\n };\n}\n\n/**\n * Load drawings for a coin. Returns [] if storage is unavailable,\n * the entry is missing, or the payload fails the shape guard. Bad\n * payloads are NOT auto-cleared — a transient parse failure during\n * a multi-tab race shouldn't nuke the user's work.\n *\n * Multi-tab note: load is called on coin change and on mount. Two\n * tabs editing the same coin will diverge until one of them\n * triggers a reload; cross-tab sync via `storage` events is an\n * explicit non-goal for the first slice (most users edit one chart\n * at a time and multi-tab divergence is acceptable for v1).\n */\nexport function loadDrawings(coin: string): DrawnShape[] {\n if (typeof window === \"undefined\") return [];\n try {\n const raw = window.localStorage.getItem(storageKey(coin));\n if (!raw) return [];\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const out: DrawnShape[] = [];\n for (const item of parsed) {\n if (!item || typeof item !== \"object\") continue;\n const it = item as { kind?: unknown };\n if (it.kind === \"hline\") {\n const h = item as Partial<DrawnHLine>;\n if (typeof h.id !== \"string\" || h.id.length === 0) continue;\n if (typeof h.price !== \"number\" || !Number.isFinite(h.price)) continue;\n const color = parseColor(h.color);\n if (!color) continue;\n out.push({ id: h.id, kind: \"hline\", price: h.price, color });\n } else if (it.kind === \"vline\") {\n const v = item as Partial<DrawnVLine>;\n if (typeof v.id !== \"string\" || v.id.length === 0) continue;\n if (typeof v.t !== \"number\" || !Number.isFinite(v.t)) continue;\n const color = parseColor(v.color);\n if (!color) continue;\n out.push({ id: v.id, kind: \"vline\", t: v.t, color });\n } else if (\n it.kind === \"trend\" ||\n it.kind === \"rect\" ||\n it.kind === \"fib\"\n ) {\n // All three share the two-anchor shape (t1/price1, t2/price2).\n // parsePairAnchors returns the validated record or null; the\n // kind discriminator is set here at the push site.\n const a = parsePairAnchors(item);\n if (!a) continue;\n out.push({ ...a, kind: it.kind });\n } else if (it.kind === \"channel\") {\n // Channel adds a vertical price offset on top of the shared\n // two-anchor base line. Validate the base anchors via the\n // shared guard, then the extra `priceOffset` field. A missing\n // or non-finite offset drops the shape rather than defaulting\n // to 0 (which would silently collapse the channel to a single\n // line and mislead the user about what was restored).\n const a = parsePairAnchors(item);\n if (!a) continue;\n const c = item as { priceOffset?: unknown };\n if (\n typeof c.priceOffset !== \"number\" ||\n !Number.isFinite(c.priceOffset)\n ) {\n continue;\n }\n out.push({ ...a, kind: \"channel\", priceOffset: c.priceOffset });\n }\n // Unknown kinds silently skipped — keeps forward-compat with\n // future shape kinds that an older bundle might encounter.\n }\n return out;\n } catch {\n // Quota exceeded, JSON parse error, or browser blocking\n // localStorage in private mode. Silently fall through to []; the\n // user's session continues without persistence.\n return [];\n }\n}\n\n/**\n * Save drawings for a coin. No-op if storage is unavailable.\n * Empty array deletes the storage entry so we don't accumulate\n * keys for coins the user briefly browsed but never drew on.\n */\nexport function saveDrawings(coin: string, shapes: DrawnShape[]): void {\n if (typeof window === \"undefined\") return;\n try {\n const key = storageKey(coin);\n if (shapes.length === 0) {\n window.localStorage.removeItem(key);\n return;\n }\n window.localStorage.setItem(key, JSON.stringify(shapes));\n } catch {\n /* quota or private-mode block — drawings stay in-memory only */\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport { SOLID_LINES_FRAG, SOLID_LINES_VERT } from \"../shaders/common\";\n\ntype LineProps = {\n count: number;\n buffer: REGL.Buffer;\n color: [number, number, number, number];\n};\ntype LineCmd = (props: LineProps) => void;\n\nconst TICK_COUNT_X = 8;\nconst TICK_COUNT_Y = 6;\n\nexport class BackgroundLayer implements Layer {\n readonly id = \"background\";\n dirty = true;\n private cmd: LineCmd | null = null;\n private horizontalBuffer: REGL.Buffer | null = null;\n private verticalBuffer: REGL.Buffer | null = null;\n private disposed = false;\n // CPU-side scratch buffers; never reallocated per frame so grid\n // repaints stay GC-quiet during pan.\n private horizontalScratch = new Float32Array((TICK_COUNT_Y + 1) * 4);\n private verticalScratch = new Float32Array((TICK_COUNT_X + 1) * 4);\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport, theme } = ctx;\n if (!this.cmd) this.compile(regl);\n const horizontalBuffer = this.horizontalBuffer;\n const verticalBuffer = this.verticalBuffer;\n if (!horizontalBuffer || !verticalBuffer) return;\n\n const w = viewport.width;\n const h = viewport.height;\n if (w === 0 || h === 0) return;\n\n const { x: px, y: py, w: pw, h: ph } = viewport.plot;\n let i = 0;\n\n // Outer frame — left + right edges of the plot area in clip space.\n const leftClip = (px / w) * 2 - 1;\n const rightClip = ((px + pw) / w) * 2 - 1;\n const topClip = 1 - (py / h) * 2;\n const botClip = 1 - ((py + ph) / h) * 2;\n\n // Horizontal grid lines at evenly-spaced price ticks.\n for (let k = 0; k <= TICK_COUNT_Y; k++) {\n const y = 1 - ((py + (ph * k) / TICK_COUNT_Y) / h) * 2;\n this.horizontalScratch[i++] = leftClip;\n this.horizontalScratch[i++] = y;\n this.horizontalScratch[i++] = rightClip;\n this.horizontalScratch[i++] = y;\n }\n let j = 0;\n // Vertical grid lines.\n for (let k = 0; k <= TICK_COUNT_X; k++) {\n const x = ((px + (pw * k) / TICK_COUNT_X) / w) * 2 - 1;\n this.verticalScratch[j++] = x;\n this.verticalScratch[j++] = topClip;\n this.verticalScratch[j++] = x;\n this.verticalScratch[j++] = botClip;\n }\n\n horizontalBuffer.subdata(this.horizontalScratch);\n verticalBuffer.subdata(this.verticalScratch);\n this.cmd!({\n count: (TICK_COUNT_Y + 1) * 2,\n buffer: horizontalBuffer,\n color: theme.grid,\n });\n this.cmd!({\n count: (TICK_COUNT_X + 1) * 2,\n buffer: verticalBuffer,\n color: theme.gridVert,\n });\n }\n\n onContextLost(): void {\n // The GL objects are gone; null the JS handles so paint() recompiles\n // them against the restored context.\n this.horizontalBuffer = null;\n this.verticalBuffer = null;\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n this.horizontalBuffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n data: this.horizontalScratch,\n });\n this.verticalBuffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n data: this.verticalScratch,\n });\n this.cmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: regl.prop<LineProps, \"buffer\">(\"buffer\") },\n uniforms: { uColor: regl.prop<LineProps, \"color\">(\"color\") },\n count: regl.prop<LineProps, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { srcRGB: \"src alpha\", srcAlpha: 1, dstRGB: \"one minus src alpha\", dstAlpha: 1 },\n },\n }) as unknown as LineCmd;\n }\n\n dispose(): void {\n this.disposed = true;\n this.horizontalBuffer?.destroy();\n this.verticalBuffer?.destroy();\n this.horizontalBuffer = null;\n this.verticalBuffer = null;\n this.cmd = null;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport type { DataStore } from \"../core/DataStore\";\nimport type { ChartTypeKey } from \"../core/ChartTypes\";\nimport {\n CANDLE_BODY_FRAG,\n CANDLE_BODY_VERT,\n CANDLE_WICK_FRAG,\n CANDLE_WICK_VERT,\n SOLID_LINES_FRAG,\n SOLID_LINES_VERT,\n} from \"../shaders/common\";\n\ntype BodyProps = {\n instances: number;\n upColor: [number, number, number, number];\n downColor: [number, number, number, number];\n};\n\ntype WickProps = {\n count: number;\n upColor: [number, number, number, number];\n downColor: [number, number, number, number];\n};\n\ntype SolidProps = {\n count: number;\n color: [number, number, number, number];\n};\n\ntype BodyCmd = REGL.DrawCommand<REGL.DefaultContext, BodyProps>;\ntype WickCmd = REGL.DrawCommand<REGL.DefaultContext, WickProps>;\ntype SolidCmd = REGL.DrawCommand<REGL.DefaultContext, SolidProps>;\n\n// Unit quad shared by every instance — TRIANGLE_STRIP corners.\nconst QUAD_CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n\n// 50% of the candle slot is body width; the rest is gap so neighbouring\n// bodies don't touch. Matches the HL / lightweight-charts convention.\nconst BODY_WIDTH_FRACTION = 0.7;\nconst LIVE_CANDLE_ANIM_MS = 320;\n\ninterface LiveCandleAnim {\n time: number;\n startMs: number;\n fromO: number;\n fromH: number;\n fromL: number;\n fromC: number;\n toO: number;\n toH: number;\n toL: number;\n toC: number;\n}\n\nexport class CandleLayer implements Layer {\n readonly id = \"candles\";\n dirty = true;\n\n private bodyCmd: BodyCmd | null = null;\n private wickCmd: WickCmd | null = null;\n private lineCmd: SolidCmd | null = null;\n private fillCmd: SolidCmd | null = null;\n private cornerBuf: REGL.Buffer | null = null;\n\n // Per-instance body attribute buffers.\n private xCenterBuf: REGL.Buffer | null = null;\n private halfWidthBuf: REGL.Buffer | null = null;\n private openYBuf: REGL.Buffer | null = null;\n private closeYBuf: REGL.Buffer | null = null;\n private isUpBuf: REGL.Buffer | null = null;\n\n // Wick buffers: pairs of (clipX, clipY) vertices and a per-vertex\n // isUp attribute (both endpoints share the same value).\n private wickPosBuf: REGL.Buffer | null = null;\n private wickIsUpBuf: REGL.Buffer | null = null;\n private lineBuf: REGL.Buffer | null = null;\n private fillBuf: REGL.Buffer | null = null;\n\n // CPU-side scratch — reused across frames to avoid per-paint GC.\n private xCenter = new Float32Array(0);\n private halfWidth = new Float32Array(0);\n private openY = new Float32Array(0);\n private closeY = new Float32Array(0);\n private isUp = new Float32Array(0);\n private wickPos = new Float32Array(0);\n private wickIsUp = new Float32Array(0);\n private lineScratch = new Float32Array(0);\n private fillScratch = new Float32Array(0);\n private haOpen = new Float64Array(0);\n private haHigh = new Float64Array(0);\n private haLow = new Float64Array(0);\n private haClose = new Float64Array(0);\n\n private disposed = false;\n private liveAnim: LiveCandleAnim | null = null;\n private chartType: ChartTypeKey = \"candle\";\n\n constructor(private readonly store: DataStore) {}\n\n setChartType(next: ChartTypeKey): void {\n if (this.chartType === next) return;\n this.chartType = next;\n this.dirty = true;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport, theme } = ctx;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n const b = this.store.candles;\n if (b.length < 2) return;\n\n const [t0, t1] = viewport.timeRange;\n // Cull to visible window with a small overscan so half-visible\n // bodies on either edge still render.\n let i0 = this.store.firstIndexAtOrAfter(t0) - 1;\n let i1 = this.store.firstIndexAtOrAfter(t1) + 1;\n if (i0 < 0) i0 = 0;\n if (i1 > b.length) i1 = b.length;\n const n = i1 - i0;\n if (n <= 0) return;\n\n // Grow scratch + buffers BEFORE compile — compile() sizes the regl\n // buffers from the current scratch length, so capacity changes must\n // settle first.\n this.ensureCapacity(n);\n if (!this.bodyCmd) this.compile(regl);\n\n // Candle slot width (the time gap between consecutive bars). Use\n // the median gap so a single anomalous bar doesn't widen everyone.\n const intervalMs = this.estimateInterval(b.time, i0, i1);\n const halfSlotMs = intervalMs * 0.5;\n const halfBodyClipX =\n viewport.pxWidthToClip(0.5) > 0\n ? Math.max(\n // viewport's px helper assumes CSS pixels; use the direct\n // clip-width derived from data instead.\n (halfSlotMs / (viewport.timeRange[1] - viewport.timeRange[0])) *\n 2 *\n BODY_WIDTH_FRACTION,\n viewport.pxWidthToClip(0.5),\n )\n : 0;\n const renderType = this.effectiveType();\n if (renderType === \"heikin-ashi\") {\n this.computeHeikinAshi(b.length);\n }\n\n for (let k = 0; k < n; k++) {\n const idx = i0 + k;\n const t = b.time[idx];\n let o = renderType === \"heikin-ashi\" ? this.haOpen[idx] : b.open[idx];\n let c = renderType === \"heikin-ashi\" ? this.haClose[idx] : b.close[idx];\n let h = renderType === \"heikin-ashi\" ? this.haHigh[idx] : b.high[idx];\n let l = renderType === \"heikin-ashi\" ? this.haLow[idx] : b.low[idx];\n\n if (idx === b.length - 1) {\n const animated = this.liveCandle(t, o, h, l, c);\n o = animated.o;\n h = animated.h;\n l = animated.l;\n c = animated.c;\n }\n\n const xc = viewport.timeToClipX(t);\n const oY = viewport.priceToClipY(o);\n const cY = viewport.priceToClipY(c);\n const hY = viewport.priceToClipY(h);\n const lY = viewport.priceToClipY(l);\n const up = c >= o ? 1 : 0;\n\n this.xCenter[k] = xc;\n this.halfWidth[k] = halfBodyClipX;\n this.openY[k] = oY;\n this.closeY[k] = cY;\n this.isUp[k] = up;\n\n const w = k * 4;\n this.wickPos[w] = xc;\n this.wickPos[w + 1] = hY;\n this.wickPos[w + 2] = xc;\n this.wickPos[w + 3] = lY;\n const wi = k * 2;\n this.wickIsUp[wi] = up;\n this.wickIsUp[wi + 1] = up;\n }\n\n if (renderType === \"line\" || renderType === \"line-markers\") {\n this.paintCloseLine(ctx, n, false);\n if (renderType === \"line-markers\") {\n this.paintMarkers(ctx, n, theme.candleUp);\n }\n return;\n }\n if (renderType === \"step-line\") {\n this.paintCloseLine(ctx, n, true);\n return;\n }\n if (renderType === \"area\" || renderType === \"baseline\") {\n this.paintCloseArea(ctx, n, renderType);\n this.paintCloseLine(ctx, n, false);\n return;\n }\n if (renderType === \"hlc-area\") {\n this.paintHlcArea(ctx, n);\n this.paintCloseLine(ctx, n, false);\n return;\n }\n if (renderType === \"bars\" || renderType === \"high-low\") {\n this.paintOhlcBars(ctx, n, renderType === \"high-low\");\n return;\n }\n if (renderType === \"columns\" || renderType === \"volume-bars\") {\n this.paintColumns(ctx, n, i0, renderType);\n return;\n }\n\n this.paintCandleBodies(ctx, n, renderType === \"hollow-candle\");\n }\n\n onContextLost(): void {\n this.bodyCmd = null;\n this.wickCmd = null;\n this.lineCmd = null;\n this.fillCmd = null;\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.openYBuf = null;\n this.closeYBuf = null;\n this.isUpBuf = null;\n this.wickPosBuf = null;\n this.wickIsUpBuf = null;\n this.lineBuf = null;\n this.fillBuf = null;\n // Force re-grow on the next paint so .subdata calls hit live buffers.\n this.xCenter = new Float32Array(0);\n this.lineScratch = new Float32Array(0);\n this.fillScratch = new Float32Array(0);\n }\n\n dispose(): void {\n this.disposed = true;\n this.cornerBuf?.destroy();\n this.xCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.openYBuf?.destroy();\n this.closeYBuf?.destroy();\n this.isUpBuf?.destroy();\n this.wickPosBuf?.destroy();\n this.wickIsUpBuf?.destroy();\n this.lineBuf?.destroy();\n this.fillBuf?.destroy();\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.openYBuf = null;\n this.closeYBuf = null;\n this.isUpBuf = null;\n this.wickPosBuf = null;\n this.wickIsUpBuf = null;\n this.lineBuf = null;\n this.fillBuf = null;\n this.bodyCmd = null;\n this.wickCmd = null;\n this.lineCmd = null;\n this.fillCmd = null;\n }\n\n private effectiveType(): ChartTypeKey {\n if (this.chartType === \"volume-footprint\" || this.chartType === \"tpo\") {\n return \"candle\";\n }\n return this.chartType;\n }\n\n private paintCandleBodies(\n ctx: RenderContext,\n n: number,\n hollow: boolean,\n ): void {\n const { theme } = ctx;\n this.uploadBodies(n);\n this.wickPosBuf!.subdata(this.wickPos.subarray(0, n * 4));\n this.wickIsUpBuf!.subdata(this.wickIsUp.subarray(0, n * 2));\n this.wickCmd!({\n count: n * 2,\n upColor: theme.candleUp,\n downColor: theme.candleDown,\n });\n this.bodyCmd!({\n instances: n,\n upColor: hollow\n ? [theme.candleUp[0], theme.candleUp[1], theme.candleUp[2], 0.08]\n : theme.candleUp,\n downColor: theme.candleDown,\n });\n if (hollow) this.paintBodyOutlines(ctx, n);\n }\n\n private paintMarkers(\n ctx: RenderContext,\n n: number,\n color: [number, number, number, number],\n ): void {\n const halfW = ctx.viewport.pxWidthToClip(2);\n const halfH = ctx.viewport.pxHeightToClip(2);\n for (let i = 0; i < n; i++) {\n const y = this.closeY[i];\n this.halfWidth[i] = halfW;\n this.openY[i] = y - halfH;\n this.closeY[i] = y + halfH;\n this.isUp[i] = 1;\n }\n this.uploadBodies(n);\n this.bodyCmd!({\n instances: n,\n upColor: color,\n downColor: color,\n });\n }\n\n private paintCloseLine(\n ctx: RenderContext,\n n: number,\n stepped: boolean,\n ): void {\n const countFloats = stepped ? Math.max(0, n - 1) * 8 : Math.max(0, n - 1) * 4;\n if (countFloats <= 0) return;\n this.ensureLineCapacity(countFloats);\n if (!this.lineCmd) this.compile(ctx.regl);\n let writeIdx = 0;\n for (let i = 0; i < n - 1; i++) {\n const x0 = this.xCenter[i];\n const y0 = this.closeY[i];\n const x1 = this.xCenter[i + 1];\n const y1 = this.closeY[i + 1];\n if (stepped) {\n this.lineScratch[writeIdx++] = x0;\n this.lineScratch[writeIdx++] = y0;\n this.lineScratch[writeIdx++] = x1;\n this.lineScratch[writeIdx++] = y0;\n this.lineScratch[writeIdx++] = x1;\n this.lineScratch[writeIdx++] = y0;\n this.lineScratch[writeIdx++] = x1;\n this.lineScratch[writeIdx++] = y1;\n } else {\n this.lineScratch[writeIdx++] = x0;\n this.lineScratch[writeIdx++] = y0;\n this.lineScratch[writeIdx++] = x1;\n this.lineScratch[writeIdx++] = y1;\n }\n }\n this.lineBuf!.subdata(this.lineScratch.subarray(0, writeIdx));\n this.lineCmd!({\n count: writeIdx / 2,\n color: [ctx.theme.candleUp[0], ctx.theme.candleUp[1], ctx.theme.candleUp[2], 0.9],\n });\n }\n\n private paintCloseArea(\n ctx: RenderContext,\n n: number,\n mode: \"area\" | \"baseline\",\n ): void {\n if (n < 2) return;\n this.ensureFillCapacity(n * 4);\n if (!this.fillCmd) this.compile(ctx.regl);\n const plot = ctx.viewport.plotCss;\n const bottomY = ctx.viewport.pxYToClipY(plot.y + plot.h);\n const baselineY =\n mode === \"baseline\"\n ? this.closeY[0]\n : bottomY;\n let writeIdx = 0;\n for (let i = 0; i < n; i++) {\n this.fillScratch[writeIdx++] = this.xCenter[i];\n this.fillScratch[writeIdx++] = baselineY;\n this.fillScratch[writeIdx++] = this.xCenter[i];\n this.fillScratch[writeIdx++] = this.closeY[i];\n }\n const lastAbove = this.closeY[n - 1] >= baselineY;\n const src = lastAbove ? ctx.theme.candleUp : ctx.theme.candleDown;\n this.fillBuf!.subdata(this.fillScratch.subarray(0, writeIdx));\n this.fillCmd!({\n count: writeIdx / 2,\n color: [src[0], src[1], src[2], 0.16],\n });\n }\n\n private paintHlcArea(ctx: RenderContext, n: number): void {\n if (n < 2) return;\n this.ensureFillCapacity(n * 4);\n if (!this.fillCmd) this.compile(ctx.regl);\n let writeIdx = 0;\n for (let i = 0; i < n; i++) {\n const hi = this.wickPos[i * 4 + 1];\n const lo = this.wickPos[i * 4 + 3];\n this.fillScratch[writeIdx++] = this.xCenter[i];\n this.fillScratch[writeIdx++] = lo;\n this.fillScratch[writeIdx++] = this.xCenter[i];\n this.fillScratch[writeIdx++] = hi;\n }\n this.fillBuf!.subdata(this.fillScratch.subarray(0, writeIdx));\n this.fillCmd!({\n count: writeIdx / 2,\n color: [\n ctx.theme.candleUp[0],\n ctx.theme.candleUp[1],\n ctx.theme.candleUp[2],\n 0.12,\n ],\n });\n }\n\n private paintOhlcBars(\n ctx: RenderContext,\n n: number,\n highLowOnly: boolean,\n ): void {\n const floatsPerCandle = highLowOnly ? 4 : 12;\n this.ensureLineCapacity(n * floatsPerCandle);\n if (!this.lineCmd) this.compile(ctx.regl);\n const drawGroup = (up: boolean) => {\n let writeIdx = 0;\n for (let i = 0; i < n; i++) {\n if ((this.isUp[i] >= 0.5) !== up) continue;\n const x = this.xCenter[i];\n const hi = this.wickPos[i * 4 + 1];\n const lo = this.wickPos[i * 4 + 3];\n const hw = this.halfWidth[i] * 0.85;\n this.lineScratch[writeIdx++] = x;\n this.lineScratch[writeIdx++] = hi;\n this.lineScratch[writeIdx++] = x;\n this.lineScratch[writeIdx++] = lo;\n if (!highLowOnly) {\n this.lineScratch[writeIdx++] = x - hw;\n this.lineScratch[writeIdx++] = this.openY[i];\n this.lineScratch[writeIdx++] = x;\n this.lineScratch[writeIdx++] = this.openY[i];\n this.lineScratch[writeIdx++] = x;\n this.lineScratch[writeIdx++] = this.closeY[i];\n this.lineScratch[writeIdx++] = x + hw;\n this.lineScratch[writeIdx++] = this.closeY[i];\n }\n }\n if (writeIdx === 0) return;\n this.lineBuf!.subdata(this.lineScratch.subarray(0, writeIdx));\n this.lineCmd!({\n count: writeIdx / 2,\n color: up ? ctx.theme.candleUp : ctx.theme.candleDown,\n });\n };\n drawGroup(false);\n drawGroup(true);\n }\n\n private paintColumns(\n ctx: RenderContext,\n n: number,\n i0: number,\n mode: \"columns\" | \"volume-bars\",\n ): void {\n const b = this.store.candles;\n const plot = ctx.viewport.plotCss;\n const bottomY = ctx.viewport.pxYToClipY(plot.y + plot.h);\n const topY = ctx.viewport.pxYToClipY(plot.y);\n let maxV = 0;\n if (mode === \"volume-bars\") {\n for (let i = 0; i < n; i++) {\n const v = b.volume[i0 + i];\n if (isFinite(v) && v > maxV) maxV = v;\n }\n if (maxV <= 0) return;\n }\n for (let i = 0; i < n; i++) {\n const idx = i0 + i;\n if (mode === \"volume-bars\") {\n const v = b.volume[idx];\n const pct = isFinite(v) && v > 0 ? v / maxV : 0;\n this.openY[i] = bottomY;\n this.closeY[i] = bottomY + (topY - bottomY) * pct;\n this.isUp[i] = b.close[idx] >= b.open[idx] ? 1 : 0;\n } else {\n this.openY[i] = bottomY;\n this.isUp[i] = idx === 0 || b.close[idx] >= b.close[idx - 1] ? 1 : 0;\n }\n }\n this.uploadBodies(n);\n const upColor =\n mode === \"volume-bars\" ? ctx.theme.volUp : ctx.theme.candleUp;\n const downColor =\n mode === \"volume-bars\" ? ctx.theme.volDown : ctx.theme.candleDown;\n this.bodyCmd!({\n instances: n,\n upColor,\n downColor,\n });\n }\n\n private paintBodyOutlines(ctx: RenderContext, n: number): void {\n this.ensureLineCapacity(n * 16);\n if (!this.lineCmd) this.compile(ctx.regl);\n const drawGroup = (up: boolean) => {\n let writeIdx = 0;\n for (let i = 0; i < n; i++) {\n if ((this.isUp[i] >= 0.5) !== up) continue;\n const left = this.xCenter[i] - this.halfWidth[i];\n const right = this.xCenter[i] + this.halfWidth[i];\n const top = Math.max(this.openY[i], this.closeY[i]);\n const bottom = Math.min(this.openY[i], this.closeY[i]);\n this.lineScratch[writeIdx++] = left;\n this.lineScratch[writeIdx++] = top;\n this.lineScratch[writeIdx++] = right;\n this.lineScratch[writeIdx++] = top;\n this.lineScratch[writeIdx++] = right;\n this.lineScratch[writeIdx++] = top;\n this.lineScratch[writeIdx++] = right;\n this.lineScratch[writeIdx++] = bottom;\n this.lineScratch[writeIdx++] = right;\n this.lineScratch[writeIdx++] = bottom;\n this.lineScratch[writeIdx++] = left;\n this.lineScratch[writeIdx++] = bottom;\n this.lineScratch[writeIdx++] = left;\n this.lineScratch[writeIdx++] = bottom;\n this.lineScratch[writeIdx++] = left;\n this.lineScratch[writeIdx++] = top;\n }\n if (writeIdx === 0) return;\n this.lineBuf!.subdata(this.lineScratch.subarray(0, writeIdx));\n this.lineCmd!({\n count: writeIdx / 2,\n color: up ? ctx.theme.candleUp : ctx.theme.candleDown,\n });\n };\n drawGroup(false);\n drawGroup(true);\n }\n\n private uploadBodies(n: number): void {\n this.xCenterBuf!.subdata(this.xCenter.subarray(0, n));\n this.halfWidthBuf!.subdata(this.halfWidth.subarray(0, n));\n this.openYBuf!.subdata(this.openY.subarray(0, n));\n this.closeYBuf!.subdata(this.closeY.subarray(0, n));\n this.isUpBuf!.subdata(this.isUp.subarray(0, n));\n }\n\n private computeHeikinAshi(length: number): void {\n if (this.haOpen.length < length) {\n let cap = Math.max(this.haOpen.length, 64);\n while (cap < length) cap *= 2;\n this.haOpen = new Float64Array(cap);\n this.haHigh = new Float64Array(cap);\n this.haLow = new Float64Array(cap);\n this.haClose = new Float64Array(cap);\n }\n const b = this.store.candles;\n for (let i = 0; i < length; i++) {\n const close = (b.open[i] + b.high[i] + b.low[i] + b.close[i]) / 4;\n const open =\n i === 0\n ? (b.open[i] + b.close[i]) / 2\n : (this.haOpen[i - 1] + this.haClose[i - 1]) / 2;\n this.haOpen[i] = open;\n this.haClose[i] = close;\n this.haHigh[i] = Math.max(b.high[i], open, close);\n this.haLow[i] = Math.min(b.low[i], open, close);\n }\n }\n\n private estimateInterval(time: Float64Array, i0: number, i1: number): number {\n // Median of adjacent gaps within the visible window. O(n log n) on\n // visible bars only, ~hundreds at most. Falls back to the first gap\n // when the window is too short.\n if (i1 - i0 < 2) return 60_000;\n const gaps: number[] = [];\n for (let i = Math.max(i0, 1); i < i1; i++) {\n const g = time[i] - time[i - 1];\n if (g > 0) gaps.push(g);\n }\n if (gaps.length === 0) return 60_000;\n gaps.sort((a, b) => a - b);\n return gaps[Math.floor(gaps.length / 2)];\n }\n\n private liveCandle(\n time: number,\n open: number,\n high: number,\n low: number,\n close: number,\n ): { o: number; h: number; l: number; c: number } {\n const now =\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n const current = this.liveAnim;\n if (!current || current.time !== time) {\n this.liveAnim = {\n time,\n startMs: now,\n fromO: open,\n fromH: open,\n fromL: open,\n fromC: open,\n toO: open,\n toH: high,\n toL: low,\n toC: close,\n };\n } else if (\n current.toO !== open ||\n current.toH !== high ||\n current.toL !== low ||\n current.toC !== close\n ) {\n const from = this.sampleLiveCandle(current, now);\n this.liveAnim = {\n time,\n startMs: now,\n fromO: from.o,\n fromH: from.h,\n fromL: from.l,\n fromC: from.c,\n toO: open,\n toH: high,\n toL: low,\n toC: close,\n };\n }\n\n const anim = this.liveAnim;\n if (!anim) return { o: open, h: high, l: low, c: close };\n const sampled = this.sampleLiveCandle(anim, now);\n if (now - anim.startMs < LIVE_CANDLE_ANIM_MS) {\n this.dirty = true;\n }\n const h = Math.max(sampled.h, sampled.o, sampled.c);\n const l = Math.min(sampled.l, sampled.o, sampled.c);\n return { o: sampled.o, h, l, c: sampled.c };\n }\n\n private sampleLiveCandle(\n anim: LiveCandleAnim,\n now: number,\n ): { o: number; h: number; l: number; c: number } {\n const t = Math.min(1, Math.max(0, (now - anim.startMs) / LIVE_CANDLE_ANIM_MS));\n const e = 1 - Math.pow(1 - t, 3);\n const lerp = (a: number, b: number) => a + (b - a) * e;\n return {\n o: lerp(anim.fromO, anim.toO),\n h: lerp(anim.fromH, anim.toH),\n l: lerp(anim.fromL, anim.toL),\n c: lerp(anim.fromC, anim.toC),\n };\n }\n\n private ensureCapacity(n: number): void {\n if (n <= this.xCenter.length) return;\n let cap = Math.max(this.xCenter.length, 64);\n while (cap < n) cap *= 2;\n this.xCenter = new Float32Array(cap);\n this.halfWidth = new Float32Array(cap);\n this.openY = new Float32Array(cap);\n this.closeY = new Float32Array(cap);\n this.isUp = new Float32Array(cap);\n this.wickPos = new Float32Array(cap * 4);\n this.wickIsUp = new Float32Array(cap * 2);\n // Re-create regl buffers to match the new capacity. Also null the\n // compiled draw commands — they reference the old buffers; the next\n // paint will recompile against the fresh ones via the `!this.cmd`\n // guard.\n this.xCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.openYBuf?.destroy();\n this.closeYBuf?.destroy();\n this.isUpBuf?.destroy();\n this.wickPosBuf?.destroy();\n this.wickIsUpBuf?.destroy();\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.openYBuf = null;\n this.closeYBuf = null;\n this.isUpBuf = null;\n this.wickPosBuf = null;\n this.wickIsUpBuf = null;\n this.bodyCmd = null;\n this.wickCmd = null;\n }\n\n private ensureLineCapacity(n: number): void {\n if (n <= this.lineScratch.length) return;\n let cap = Math.max(this.lineScratch.length, 256);\n while (cap < n) cap *= 2;\n this.lineScratch = new Float32Array(cap);\n this.lineBuf?.destroy();\n this.lineBuf = null;\n this.lineCmd = null;\n }\n\n private ensureFillCapacity(n: number): void {\n if (n <= this.fillScratch.length) return;\n let cap = Math.max(this.fillScratch.length, 256);\n while (cap < n) cap *= 2;\n this.fillScratch = new Float32Array(cap);\n this.fillBuf?.destroy();\n this.fillBuf = null;\n this.fillCmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n this.cornerBuf = regl.buffer({\n type: \"float\",\n usage: \"static\",\n data: QUAD_CORNERS,\n });\n // Per-instance buffers will be lazily (re-)allocated on first paint\n // after capacity grow.\n const dynamic = (size: number) =>\n regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n length: size * 4, // bytes\n });\n const cap = Math.max(this.xCenter.length, 64);\n this.xCenterBuf = dynamic(cap);\n this.halfWidthBuf = dynamic(cap);\n this.openYBuf = dynamic(cap);\n this.closeYBuf = dynamic(cap);\n this.isUpBuf = dynamic(cap);\n this.wickPosBuf = dynamic(cap * 4);\n this.wickIsUpBuf = dynamic(cap * 2);\n this.lineBuf = dynamic(Math.max(this.lineScratch.length, 256));\n this.fillBuf = dynamic(Math.max(this.fillScratch.length, 256));\n\n this.bodyCmd = regl({\n vert: CANDLE_BODY_VERT,\n frag: CANDLE_BODY_FRAG,\n attributes: {\n aCorner: { buffer: this.cornerBuf, divisor: 0 },\n aXCenter: { buffer: this.xCenterBuf, divisor: 1 },\n aHalfWidth: { buffer: this.halfWidthBuf, divisor: 1 },\n aOpenY: { buffer: this.openYBuf, divisor: 1 },\n aCloseY: { buffer: this.closeYBuf, divisor: 1 },\n aIsUp: { buffer: this.isUpBuf, divisor: 1 },\n },\n uniforms: {\n uUpColor: regl.prop<BodyProps, \"upColor\">(\"upColor\"),\n uDownColor: regl.prop<BodyProps, \"downColor\">(\"downColor\"),\n },\n count: 4,\n instances: regl.prop<BodyProps, \"instances\">(\"instances\"),\n primitive: \"triangle strip\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as BodyCmd;\n\n this.wickCmd = regl({\n vert: CANDLE_WICK_VERT,\n frag: CANDLE_WICK_FRAG,\n attributes: {\n aClipPos: this.wickPosBuf,\n aIsUp: this.wickIsUpBuf,\n },\n uniforms: {\n uUpColor: regl.prop<WickProps, \"upColor\">(\"upColor\"),\n uDownColor: regl.prop<WickProps, \"downColor\">(\"downColor\"),\n },\n count: regl.prop<WickProps, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n lineWidth: 1,\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as WickCmd;\n\n this.lineCmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.lineBuf },\n uniforms: {\n uColor: regl.prop<SolidProps, \"color\">(\"color\"),\n },\n count: regl.prop<SolidProps, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n lineWidth: 1,\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as SolidCmd;\n\n this.fillCmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.fillBuf },\n uniforms: {\n uColor: regl.prop<SolidProps, \"color\">(\"color\"),\n },\n count: regl.prop<SolidProps, \"count\">(\"count\"),\n primitive: \"triangle strip\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as SolidCmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport type { EventBus } from \"../core/eventBus\";\nimport { TextBatch } from \"../core/TextBatch\";\nimport { formatHoverPrice, stepForRange } from \"../core/format\";\nimport { SOLID_LINES_FRAG, SOLID_LINES_VERT } from \"../shaders/common\";\n\ntype LineCmd = REGL.DrawCommand<\n REGL.DefaultContext,\n { count: number; color: [number, number, number, number] }\n>;\n\n// Optional magnet: maps a hovered time (ms) to the nearest candle's\n// time, or null when there's no bar to snap to. Injected by ChartEngine\n// (which owns the DataStore) so the layer stays data-source-agnostic.\n// Returning null — or no provider at all — disables snapping and the\n// crosshair tracks the raw cursor.\nexport type TimeSnap = (timeMs: number) => number | null;\n\nconst CROSSHAIR_SMOOTHING_FACTOR = 0.34;\nconst CROSSHAIR_SETTLE_EPSILON_PX = 0.08;\n\nexport interface SmoothCrosshairAxisResult {\n value: number;\n settled: boolean;\n}\n\nexport function smoothCrosshairAxis(\n current: number | null | undefined,\n target: number,\n factor = CROSSHAIR_SMOOTHING_FACTOR,\n epsilonPx = CROSSHAIR_SETTLE_EPSILON_PX,\n): SmoothCrosshairAxisResult {\n if (current == null || !Number.isFinite(current)) {\n return { value: target, settled: true };\n }\n if (!Number.isFinite(target)) {\n return { value: current, settled: true };\n }\n const delta = target - current;\n if (Math.abs(delta) <= epsilonPx) {\n return { value: target, settled: true };\n }\n const eased = current + delta * Math.min(1, Math.max(0, factor));\n return {\n value: eased,\n settled: Math.abs(target - eased) <= epsilonPx,\n };\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\nfunction formatTime(ms: number): string {\n const d = new Date(ms);\n return `${pad2(d.getUTCMonth() + 1)}/${pad2(d.getUTCDate())} ${pad2(\n d.getUTCHours(),\n )}:${pad2(d.getUTCMinutes())}`;\n}\n\nexport class CrosshairLayer implements Layer {\n readonly id = \"crosshair\";\n // dirty starts true to match Layer convention; Scene.addLayer would\n // overwrite a false anyway. The lazy-compile of GL resources is\n // actually delivered by paint()'s cssX==null early-return below, not\n // by this field.\n dirty = true;\n\n private cmd: LineCmd | null = null;\n private buffer: REGL.Buffer | null = null;\n // Filled pills behind the price + time readouts. Same solid-color\n // shader as the lines, drawn as triangles. 2 pills × 2 triangles × 3\n // verts × 2 coords = 24 floats; count = 12 verts.\n private fillCmd: LineCmd | null = null;\n private fillBuffer: REGL.Buffer | null = null;\n private fillScratch = new Float32Array(24);\n private batch: TextBatch | null = null;\n private scratch = new Float32Array(8); // two segments × 2 endpoints × 2 coords\n private detachBus: (() => void) | null = null;\n private disposed = false;\n\n // CSS pixel position of the latest crosshair hover. null = hide.\n private cssX: number | null = null;\n private cssY: number | null = null;\n // Rendered position eases toward cssX/cssY so the crosshair line and\n // price/time pills glide instead of snapping to every pointer sample.\n private drawCssX: number | null = null;\n private drawCssY: number | null = null;\n // Last observed device pixel ratio. Used to clear the stored hover\n // ONLY on a real DPR shift (window dragged to a different-DPR monitor),\n // not on every pan/zoom — viewport:changed fires for both and clearing\n // unconditionally would hide the crosshair during every drag.\n private lastDpr: number | null = null;\n\n // Magnet provider; null = no snapping (crosshair follows the raw\n // cursor x). Set via setSnap() after construction.\n private snap: TimeSnap | null = null;\n\n constructor(bus: EventBus, snap?: TimeSnap) {\n this.snap = snap ?? null;\n this.detachBus = bus.on((e) => {\n if (e.type === \"crosshair:hover\") {\n // Skip the dirty flip if the position hasn't actually moved —\n // browsers re-fire pointermove on a stationary cursor when the\n // page paints, and we don't want that to redraw the full scene.\n if (this.cssX === e.px && this.cssY === e.py) return;\n this.cssX = e.px;\n this.cssY = e.py;\n this.dirty = true;\n } else if (e.type === \"crosshair:leave\") {\n if (this.cssX != null || this.cssY != null) this.dirty = true;\n this.cssX = null;\n this.cssY = null;\n this.drawCssX = null;\n this.drawCssY = null;\n }\n // Intentionally no handling of viewport:changed here. yToPrice /\n // xToTime are correct after a pan/zoom (no stale mapping), and\n // clearing cssX/cssY on every viewport mutation would hide the\n // crosshair throughout the drag/zoom. The DPR-shift case is\n // handled in paint() instead, where the lastDpr cache catches\n // a real device-pixel-ratio change.\n });\n }\n\n // Set or replace the magnet provider. Pass null to disable snapping.\n // Flags dirty so a toggle takes effect on the next frame even if the\n // cursor is stationary.\n setSnap(snap: TimeSnap | null): void {\n this.snap = snap;\n this.dirty = true;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport, theme, glyphAtlas } = ctx;\n\n // DPR shift (window dragged to a different-DPR monitor) makes the\n // stored CSS-pixel hover × the new dpr produce a wrong device-px\n // location. Drop the hover and wait for the next pointermove rather\n // than render a wildly wrong price.\n if (this.lastDpr != null && this.lastDpr !== viewport.dpr) {\n this.cssX = null;\n this.cssY = null;\n this.drawCssX = null;\n this.drawCssY = null;\n }\n this.lastDpr = viewport.dpr;\n\n if (this.cssX == null || this.cssY == null) return;\n\n const smoothX = smoothCrosshairAxis(this.drawCssX, this.cssX);\n const smoothY = smoothCrosshairAxis(this.drawCssY, this.cssY);\n this.drawCssX = smoothX.value;\n this.drawCssY = smoothY.value;\n if (!smoothX.settled || !smoothY.settled) {\n this.dirty = true;\n }\n const cssX = this.drawCssX;\n const cssY = this.drawCssY;\n\n // Match PriceAxisLayer's price-range guard so the two stay in\n // lockstep on degenerate viewports (transient zoom corners).\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n if (!this.cmd) this.compile(regl);\n if (!this.batch) this.batch = new TextBatch(glyphAtlas);\n\n const plot = viewport.plotCss;\n // Only draw when the cursor is over the plot rect — don't streak\n // through the axis gutters.\n if (\n cssX < plot.x ||\n cssX > plot.x + plot.w ||\n cssY < plot.y ||\n cssY > plot.y + plot.h\n ) {\n return;\n }\n\n // Magnet: snap the vertical line + time label onto the hovered bar\n // (the candle whose bucket contains the cursor — the same bar the\n // OHLC legend reads, so line and legend never disagree). The\n // horizontal line + price label stay at the raw cursor Y so the user\n // can still read any price level. snapCssX falls back to the raw\n // cssX when there's no provider or no bar to snap to (off-data\n // regions, empty buffer). Snap in time space, then back to CSS px.\n let snapCssX = cssX;\n if (this.snap) {\n const hoveredTime = viewport.xToTime(cssX * viewport.dpr);\n const snappedTime = this.snap(hoveredTime);\n if (snappedTime != null && isFinite(snappedTime)) {\n // timeToX returns device px; divide by dpr for the CSS-px space\n // the rest of this method works in.\n const candidate = viewport.timeToX(snappedTime) / viewport.dpr;\n // Only adopt the snap if it stays inside the plot rect. The\n // nearest in-bucket bar can sit just off-screen when the cursor\n // hugs an edge (or data is sparse); snapping there would draw\n // the vertical line + time label into the price-axis gutter,\n // which the raw-cursor path is explicitly gated against above.\n // Falling back to the raw cssX keeps the crosshair in-bounds.\n if (candidate >= plot.x && candidate <= plot.x + plot.w) {\n snapCssX = candidate;\n }\n }\n }\n\n // Vertical line at snapCssX, full plot height.\n this.scratch[0] = viewport.pxXToClipX(snapCssX);\n this.scratch[1] = viewport.pxYToClipY(plot.y);\n this.scratch[2] = viewport.pxXToClipX(snapCssX);\n this.scratch[3] = viewport.pxYToClipY(plot.y + plot.h);\n // Horizontal line at cssY, full plot width.\n this.scratch[4] = viewport.pxXToClipX(plot.x);\n this.scratch[5] = viewport.pxYToClipY(cssY);\n this.scratch[6] = viewport.pxXToClipX(plot.x + plot.w);\n this.scratch[7] = viewport.pxYToClipY(cssY);\n\n this.buffer!.subdata(this.scratch);\n this.cmd!({ count: 4, color: theme.crosshair });\n\n if (glyphAtlas.texture) {\n this.batch.reset();\n // Glyph CELL height (≈ fontSize × 1.3), not fontSize — addLabel\n // lays each glyph out over this height, so the pill must be sized\n // from it or the text overruns the chip, and centring on it keeps\n // the price readout aligned with the horizontal line.\n const th = glyphAtlas.lineHeight;\n\n // Price readout — right gutter, vertically centred on the cursor\n // (matches the horizontal line + the raw cursor Y). addLabel takes\n // the text TOP as its y.\n const step = stepForRange(p0, p1);\n const price = viewport.yToPrice(cssY * viewport.dpr);\n const priceLabel = formatHoverPrice(price, step);\n const priceX = plot.x + plot.w + 6;\n const priceTop = cssY - th / 2;\n\n // Time readout — uses the snapped x so it matches the bar the\n // vertical line landed on. Anchored to the canvas bottom gutter\n // (where the TimeAxis labels live), not to this pane's plot bottom:\n // in a multi-pane layout the main pane's plot ends well above the\n // canvas bottom, so plot.y + plot.h would sandwich the label\n // between panes. cssHeight - 18 lands it alongside the time-axis\n // tick labels.\n const t = viewport.xToTime(snapCssX * viewport.dpr);\n const timeLabel = formatTime(t);\n const cssHeight = viewport.height / viewport.dpr;\n const timeTop = cssHeight - 18;\n\n // Pills first, so the glyphs draw on top. Both are sized from the\n // measured label width + a small padding; the price pill is left-\n // anchored at priceX, the time pill is centre-anchored at snapCssX.\n const padX = 5;\n const padY = 3;\n const pillH = th + padY * 2;\n this.pushRect(\n viewport,\n 0,\n priceX - padX,\n priceTop - padY,\n glyphAtlas.measure(priceLabel) + padX * 2,\n pillH,\n );\n const timeW = glyphAtlas.measure(timeLabel);\n this.pushRect(\n viewport,\n 12,\n snapCssX - timeW / 2 - padX,\n timeTop - padY,\n timeW + padX * 2,\n pillH,\n );\n this.fillBuffer!.subdata(this.fillScratch);\n this.fillCmd!({ count: 12, color: theme.crosshairLabelBg });\n\n this.batch.addLabel(\n priceLabel,\n priceX,\n priceTop,\n theme.crosshairLabelText,\n viewport,\n \"left\",\n );\n this.batch.addLabel(\n timeLabel,\n snapCssX,\n timeTop,\n theme.crosshairLabelText,\n viewport,\n \"center\",\n );\n this.batch.flush(regl);\n }\n }\n\n // Write one axis-aligned CSS-px rect as two triangles (12 floats) at\n // `off` in fillScratch, converting corners to clip space. Triangles:\n // (TL,TR,BL) and (TR,BR,BL).\n private pushRect(\n vp: RenderContext[\"viewport\"],\n off: number,\n left: number,\n top: number,\n w: number,\n h: number,\n ): void {\n const x0 = vp.pxXToClipX(left);\n const x1 = vp.pxXToClipX(left + w);\n const y0 = vp.pxYToClipY(top);\n const y1 = vp.pxYToClipY(top + h);\n const s = this.fillScratch;\n s[off] = x0;\n s[off + 1] = y0;\n s[off + 2] = x1;\n s[off + 3] = y0;\n s[off + 4] = x0;\n s[off + 5] = y1;\n s[off + 6] = x1;\n s[off + 7] = y0;\n s[off + 8] = x1;\n s[off + 9] = y1;\n s[off + 10] = x0;\n s[off + 11] = y1;\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.buffer = null;\n this.fillCmd = null;\n this.fillBuffer = null;\n this.batch?.onContextLost();\n this.batch = null;\n }\n\n dispose(): void {\n this.disposed = true;\n this.detachBus?.();\n this.detachBus = null;\n this.buffer?.destroy();\n this.fillBuffer?.destroy();\n this.batch?.dispose();\n this.cmd = null;\n this.buffer = null;\n this.fillCmd = null;\n this.fillBuffer = null;\n this.batch = null;\n }\n\n private compile(regl: REGL.Regl): void {\n const uniforms = {\n uColor: regl.prop<{ color: [number, number, number, number] }, \"color\">(\n \"color\",\n ),\n };\n const blend = {\n enable: true,\n func: {\n srcRGB: \"src alpha\",\n srcAlpha: 1,\n dstRGB: \"one minus src alpha\",\n dstAlpha: 1,\n },\n } as const;\n\n this.buffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n data: this.scratch,\n });\n this.cmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.buffer },\n uniforms,\n count: regl.prop<{ count: number }, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n lineWidth: 1,\n blend,\n }) as LineCmd;\n\n // Same solid-color shader, filled triangles, for the label pills.\n this.fillBuffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n data: this.fillScratch,\n });\n this.fillCmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.fillBuffer },\n uniforms,\n count: regl.prop<{ count: number }, \"count\">(\"count\"),\n primitive: \"triangles\",\n depth: { enable: false },\n blend,\n }) as LineCmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport type { Viewport } from \"../core/Viewport\";\nimport type {\n DrawnChannel,\n DrawnFib,\n DrawnHLine,\n DrawnRect,\n DrawnShape,\n DrawnTrend,\n DrawnVLine,\n} from \"../core/Drawings\";\nimport { FIB_RATIOS } from \"../core/Drawings\";\nimport { SOLID_LINES_FRAG, SOLID_LINES_VERT } from \"../shaders/common\";\n\n// Generic color-grouped cache entry. Each shape kind cached in its\n// own array via buildGroupsBy below; `items` is typed via the\n// caller's `Extract<DrawnShape, {kind: K}>` so the paint loop can\n// access kind-specific fields without runtime checks.\ntype ColorGroup<T extends DrawnShape> = {\n color: [number, number, number, number];\n items: T[];\n};\n\ntype Props = {\n count: number;\n color: [number, number, number, number];\n};\n\ntype LineCmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\n// Per-kind validity predicate. The mapped type over\n// DrawnShape[\"kind\"] forces an entry for every shape kind — adding a\n// kind to `DrawnShape` without a validator here is a compile error.\n// That's the exhaustiveness guard the per-field caches/paint loops\n// below can't give on their own (they stay manual so each paint loop\n// keeps its kind-specific geometry typed without runtime narrowing),\n// so this map is the single chokepoint a new kind has to pass\n// through. Each predicate receives the kind-narrowed shape.\nconst KIND_VALIDATORS: {\n [K in DrawnShape[\"kind\"]]: (s: Extract<DrawnShape, { kind: K }>) => boolean;\n} = {\n hline: (s) => Number.isFinite(s.price),\n vline: (s) => Number.isFinite(s.t),\n trend: hasFinitePairAnchors,\n rect: hasFinitePairAnchors,\n fib: hasFinitePairAnchors,\n channel: (s) =>\n hasFinitePairAnchors(s) && Number.isFinite(s.priceOffset),\n};\n\n// Renders user-drawn shapes. Separate layer from HorizontalLineLayer\n// (which renders API-driven reference lines like RSI thresholds, key\n// levels, GEX walls) so user shapes and reference lines have distinct\n// paint ordering — user shapes sit on top of every overlay so they\n// stay interactive. Handles the full P7 set: hline, trend, rect,\n// fib, vline, channel — each a per-kind group keyed off the\n// DrawnShape discriminator.\n//\n// Hit-testing is a CPU-side walk over the current shape array\n// (`hitTest`); GPU rasterisation is render-only. The pattern mirrors\n// the plan's \"shadow geometry\" callout — keep the JS shape array as\n// the source of truth and let GL be a paint pipeline.\n//\n// Preview: in-progress shapes (multi-phase tools — trend / rect /\n// fib are two-click, channel is three-click) push a transient shape\n// via `setPreview()`. The\n// layer paints the preview alongside committed shapes so the user\n// sees the line follow the cursor. The preview shape is NOT\n// hit-tested (it's not yet committed) and NOT persisted.\nexport class DrawingsLayer implements Layer {\n readonly id: string;\n dirty = true;\n\n private cmd: LineCmd | null = null;\n private buffer: REGL.Buffer | null = null;\n private scratch: Float32Array;\n private shapes: DrawnShape[] = [];\n // Cached per-color groups for each shape kind. Grouping doesn't\n // change as the viewport pans; only the per-paint clip-space\n // coordinates do. Cached on setShapes for amortised cost.\n private hlineGroups: Array<ColorGroup<DrawnHLine>> = [];\n private trendGroups: Array<ColorGroup<DrawnTrend>> = [];\n private rectGroups: Array<ColorGroup<DrawnRect>> = [];\n // Fib's 7 levels share the fib's single `color`. If a future\n // slice introduces per-level colors (common TradingView pattern:\n // 0.236 red, 0.382 orange, 0.5 yellow, 0.618 green, 0.786 blue),\n // the cache shape needs to split — either flatten levels into\n // separate cache entries keyed by (color, ratio) or carry a\n // per-level color sidecar. The single-hue v1 keeps the cache\n // contract identical to the other shape kinds.\n private fibGroups: Array<ColorGroup<DrawnFib>> = [];\n private vlineGroups: Array<ColorGroup<DrawnVLine>> = [];\n private channelGroups: Array<ColorGroup<DrawnChannel>> = [];\n // Transient in-progress shape from a multi-click tool (trend /\n // rect / fib first anchor placed, channel mid base or offset). Rendered alongside\n // committed shapes but excluded from hit-test.\n private preview: DrawnShape | null = null;\n private disposed = false;\n\n constructor(id: string) {\n this.id = id;\n // 4 floats per segment (2 vertices × 2 coords). Lazily resized\n // in setShapes if the new set is larger.\n this.scratch = new Float32Array(16);\n }\n\n setShapes(shapes: DrawnShape[]): void {\n this.shapes = shapes;\n // Validators come from the exhaustive KIND_VALIDATORS map so a new\n // shape kind can't be added without one. The per-field caches\n // remain explicit (the paint loops below need the kind-narrowed\n // item type), so a new kind still needs a cache field + paint loop\n // + hit-test branch wired by hand — the validator map is the\n // compile-enforced reminder that those exist.\n this.hlineGroups = DrawingsLayer.buildGroupsBy(\n shapes,\n \"hline\",\n KIND_VALIDATORS.hline,\n );\n this.trendGroups = DrawingsLayer.buildGroupsBy(\n shapes,\n \"trend\",\n KIND_VALIDATORS.trend,\n );\n this.rectGroups = DrawingsLayer.buildGroupsBy(\n shapes,\n \"rect\",\n KIND_VALIDATORS.rect,\n );\n this.fibGroups = DrawingsLayer.buildGroupsBy(\n shapes,\n \"fib\",\n KIND_VALIDATORS.fib,\n );\n this.vlineGroups = DrawingsLayer.buildGroupsBy(\n shapes,\n \"vline\",\n KIND_VALIDATORS.vline,\n );\n this.channelGroups = DrawingsLayer.buildGroupsBy(\n shapes,\n \"channel\",\n KIND_VALIDATORS.channel,\n );\n // Worst-case sizing per shape: fib = FIB_RATIOS.length segments\n // × 2 verts × 2 coords = 28 floats (with 7 standard ratios).\n // Rect = 16 floats, hline/trend = 4 floats. Sizing for the\n // upper bound keeps the scratch valid for any mix without per-\n // kind branching here; the actual emit loops below call\n // subdata per color group so the wasted space is at most ~24\n // floats per non-fib shape (negligible).\n //\n // +1 reserves room for the preview to share the buffer. Grow\n // geometrically so a sequence of one-shape-at-a-time commits\n // doesn't drop the compiled regl command on every add.\n const perShapeFloats = FIB_RATIOS.length * 4;\n const needed = Math.max(1, shapes.length + 1) * perShapeFloats;\n if (this.scratch.length < needed) {\n let cap = Math.max(this.scratch.length, 16);\n while (cap < needed) cap *= 2;\n this.scratch = new Float32Array(cap);\n this.buffer?.destroy();\n this.buffer = null;\n this.cmd = null;\n }\n this.dirty = true;\n }\n\n /**\n * Set or clear the in-progress shape from a multi-click drawing\n * tool. Pass `null` to clear (e.g. on commit or cancel). The\n * preview always renders on top of committed shapes since it's\n * fed last into the per-color emit loop.\n */\n setPreview(shape: DrawnShape | null): void {\n this.preview = shape;\n this.dirty = true;\n }\n\n clear(): void {\n this.shapes = [];\n this.hlineGroups = [];\n this.trendGroups = [];\n this.rectGroups = [];\n this.fibGroups = [];\n this.vlineGroups = [];\n this.channelGroups = [];\n this.preview = null;\n this.dirty = true;\n }\n\n /**\n * Generic per-color group builder. Filters by `kind`, applies the\n * caller's `validate` predicate (per-shape finiteness), and\n * groups by joined color string. Returned `items` are typed via\n * the `Extract<DrawnShape, {kind: K}>` discriminator so the\n * paint loops can read kind-specific fields without a runtime\n * narrowing check.\n *\n * Three near-identical builders (one per shape kind) collapsed\n * into this generic at the fib slice — the audit explicitly\n * called the fourth tool as the right moment to take the\n * refactor since the rule-of-three was met.\n */\n private static buildGroupsBy<K extends DrawnShape[\"kind\"]>(\n shapes: DrawnShape[],\n kind: K,\n validate: (s: Extract<DrawnShape, { kind: K }>) => boolean,\n ): Array<ColorGroup<Extract<DrawnShape, { kind: K }>>> {\n const byColor = new Map<\n string,\n Extract<DrawnShape, { kind: K }>[]\n >();\n for (const s of shapes) {\n if (s.kind !== kind) continue;\n // TS can't auto-narrow generic K via the union discriminator\n // even after a kind equality check on `s.kind`; the cast is\n // safe because the prior `continue` guards it.\n const typed = s as Extract<DrawnShape, { kind: K }>;\n if (!validate(typed)) continue;\n if (!s.color.every(Number.isFinite)) continue;\n const key = s.color.join(\",\");\n const list = byColor.get(key);\n if (list) list.push(typed);\n else byColor.set(key, [typed]);\n }\n return Array.from(byColor.values()).map((list) => ({\n color: list[0].color,\n items: list,\n }));\n }\n\n /**\n * Hit-test the user's committed shapes for right-click delete.\n * Walks the shape array newest-first so a hit on the topmost\n * shape wins. Preview shapes are not hit-tested.\n *\n * `thresholdPx` defaults to 6 — wider than the rendered 1-px line\n * so click targets stay forgiving on hi-DPR displays.\n */\n hitTest(\n viewport: Viewport,\n cssX: number,\n cssY: number,\n thresholdPx = 6,\n ): DrawnShape | null {\n if (this.shapes.length === 0) return null;\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return null;\n const plot = viewport.plotCss;\n if (plot.w <= 0 || plot.h <= 0) return null;\n const dpr = viewport.dpr;\n\n for (let i = this.shapes.length - 1; i >= 0; i--) {\n const s = this.shapes[i];\n if (s.kind === \"hline\") {\n if (!Number.isFinite(s.price)) continue;\n // priceToY returns device-pixel y within the pane's\n // canvas; divide by dpr for CSS-pixel comparison. Going\n // through clip space would round-trip via the full-canvas\n // height which isn't the same as plotCss.h when the pane\n // has padding.\n const lineCssY = viewport.priceToY(s.price) / dpr;\n if (Math.abs(lineCssY - cssY) <= thresholdPx) return s;\n } else if (s.kind === \"trend\") {\n if (!hasFinitePairAnchors(s)) continue;\n // Map both anchors to CSS pixels, then measure the\n // perpendicular distance from the cursor to the segment.\n // Identical-anchor degenerate (zero-length segment) falls\n // back to a point-distance which is still correct.\n const x1 = viewport.timeToX(s.t1) / dpr;\n const y1 = viewport.priceToY(s.price1) / dpr;\n const x2 = viewport.timeToX(s.t2) / dpr;\n const y2 = viewport.priceToY(s.price2) / dpr;\n const d = pointToSegmentDistance(cssX, cssY, x1, y1, x2, y2);\n if (d <= thresholdPx) return s;\n } else if (s.kind === \"rect\") {\n if (!hasFinitePairAnchors(s)) continue;\n // Hit if the cursor is within thresholdPx of any of the\n // four edges. Interior is non-interactive (outline-only\n // rects keep the candles legible underneath). Normalise\n // the corners so a rect dragged \"backwards\" still hit-\n // tests correctly.\n const x1 = viewport.timeToX(s.t1) / dpr;\n const y1 = viewport.priceToY(s.price1) / dpr;\n const x2 = viewport.timeToX(s.t2) / dpr;\n const y2 = viewport.priceToY(s.price2) / dpr;\n const xL = Math.min(x1, x2);\n const xR = Math.max(x1, x2);\n const yT = Math.min(y1, y2);\n const yB = Math.max(y1, y2);\n const dTop = pointToSegmentDistance(cssX, cssY, xL, yT, xR, yT);\n if (dTop <= thresholdPx) return s;\n const dBot = pointToSegmentDistance(cssX, cssY, xL, yB, xR, yB);\n if (dBot <= thresholdPx) return s;\n const dLeft = pointToSegmentDistance(cssX, cssY, xL, yT, xL, yB);\n if (dLeft <= thresholdPx) return s;\n const dRight = pointToSegmentDistance(cssX, cssY, xR, yT, xR, yB);\n if (dRight <= thresholdPx) return s;\n } else if (s.kind === \"vline\") {\n if (!Number.isFinite(s.t)) continue;\n // Vline spans the full pane height; hit if the cursor's x\n // is within thresholdPx of the rendered column. timeToX\n // returns device-pixel x; divide by dpr for CSS-pixel\n // comparison.\n const lineCssX = viewport.timeToX(s.t) / dpr;\n if (Math.abs(lineCssX - cssX) <= thresholdPx) return s;\n } else if (s.kind === \"fib\") {\n if (!hasFinitePairAnchors(s)) continue;\n // Hit if the cursor is within thresholdPx of ANY of the\n // FIB_RATIOS.length horizontal levels. Clicking any level\n // deletes the whole fib — per-level delete would surprise\n // users (the fib reads as one drawing, not seven).\n // x-bounds are normalised so a fib drawn right-to-left\n // still tests correctly.\n const x1 = viewport.timeToX(s.t1) / dpr;\n const x2 = viewport.timeToX(s.t2) / dpr;\n const xL = Math.min(x1, x2);\n const xR = Math.max(x1, x2);\n const priceSpan = s.price2 - s.price1;\n let hit = false;\n for (const r of FIB_RATIOS) {\n const ly = viewport.priceToY(s.price1 + r * priceSpan) / dpr;\n const d = pointToSegmentDistance(cssX, cssY, xL, ly, xR, ly);\n if (d <= thresholdPx) {\n hit = true;\n break;\n }\n }\n if (hit) return s;\n } else if (s.kind === \"channel\") {\n if (!hasFinitePairAnchors(s) || !Number.isFinite(s.priceOffset)) {\n continue;\n }\n // Hit if the cursor is within thresholdPx of EITHER the base\n // line or the parallel line. Interior is non-interactive\n // (outline-only, same as rect). Both segments share the x\n // anchors; only the y endpoints differ by the offset.\n const x1 = viewport.timeToX(s.t1) / dpr;\n const x2 = viewport.timeToX(s.t2) / dpr;\n const y1 = viewport.priceToY(s.price1) / dpr;\n const y2 = viewport.priceToY(s.price2) / dpr;\n const dBase = pointToSegmentDistance(cssX, cssY, x1, y1, x2, y2);\n if (dBase <= thresholdPx) return s;\n const y1o = viewport.priceToY(s.price1 + s.priceOffset) / dpr;\n const y2o = viewport.priceToY(s.price2 + s.priceOffset) / dpr;\n const dPar = pointToSegmentDistance(cssX, cssY, x1, y1o, x2, y2o);\n if (dPar <= thresholdPx) return s;\n }\n }\n return null;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n if (\n this.hlineGroups.length === 0 &&\n this.trendGroups.length === 0 &&\n this.rectGroups.length === 0 &&\n this.fibGroups.length === 0 &&\n this.vlineGroups.length === 0 &&\n this.channelGroups.length === 0 &&\n this.preview === null\n ) {\n return;\n }\n const { regl, viewport } = ctx;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n if (!this.cmd) this.compile(regl);\n\n const plot = viewport.plotCss;\n if (plot.w <= 0 || plot.h <= 0) return;\n\n const xLeftClip = viewport.pxXToClipX(plot.x);\n const xRightClip = viewport.pxXToClipX(plot.x + plot.w);\n\n // HLines first — they span the entire plot width.\n for (const group of this.hlineGroups) {\n let writeIdx = 0;\n for (const line of group.items) {\n const y = viewport.priceToClipY(line.price);\n this.scratch[writeIdx++] = xLeftClip;\n this.scratch[writeIdx++] = y;\n this.scratch[writeIdx++] = xRightClip;\n this.scratch[writeIdx++] = y;\n }\n if (writeIdx === 0) continue;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: group.color });\n }\n\n // Trend segments next — each is a single line between the two\n // anchors, mapped via time + price.\n for (const group of this.trendGroups) {\n let writeIdx = 0;\n for (const line of group.items) {\n const x1 = viewport.timeToClipX(line.t1);\n const y1 = viewport.priceToClipY(line.price1);\n const x2 = viewport.timeToClipX(line.t2);\n const y2 = viewport.priceToClipY(line.price2);\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2;\n }\n if (writeIdx === 0) continue;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: group.color });\n }\n\n // Rectangle outlines: emit 4 edge segments per rect (top, right,\n // bottom, left). The line shader has no concept of a \"polygon\"\n // primitive — gl.LINES with explicit edge pairs keeps the\n // shader contract identical across every shape kind.\n for (const group of this.rectGroups) {\n let writeIdx = 0;\n for (const rect of group.items) {\n const x1 = viewport.timeToClipX(rect.t1);\n const y1 = viewport.priceToClipY(rect.price1);\n const x2 = viewport.timeToClipX(rect.t2);\n const y2 = viewport.priceToClipY(rect.price2);\n // Top edge\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y1;\n // Right edge\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y1;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2;\n // Bottom edge\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2;\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y2;\n // Left edge\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y2;\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n }\n if (writeIdx === 0) continue;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: group.color });\n }\n\n // Fib retracement: FIB_RATIOS.length horizontal segments per\n // fib, spanning x(t1)→x(t2) at price = price1 + r*(price2 -\n // price1). Local segment span (not full plot width) keeps the\n // fib anchored to the user's selected range — same convention\n // TradingView uses.\n for (const group of this.fibGroups) {\n let writeIdx = 0;\n for (const fib of group.items) {\n const xA = viewport.timeToClipX(fib.t1);\n const xB = viewport.timeToClipX(fib.t2);\n const priceSpan = fib.price2 - fib.price1;\n for (const r of FIB_RATIOS) {\n const y = viewport.priceToClipY(fib.price1 + r * priceSpan);\n this.scratch[writeIdx++] = xA;\n this.scratch[writeIdx++] = y;\n this.scratch[writeIdx++] = xB;\n this.scratch[writeIdx++] = y;\n }\n }\n if (writeIdx === 0) continue;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: group.color });\n }\n\n // VLines: each is a vertical segment from the pane's plot top\n // to its plot bottom at x = timeToClipX(t). Spans the full\n // pane height so events read as \"this moment, across all\n // prices\" rather than tied to a specific level.\n if (this.vlineGroups.length > 0) {\n const yTopClip = viewport.pxYToClipY(plot.y);\n const yBottomClip = viewport.pxYToClipY(plot.y + plot.h);\n for (const group of this.vlineGroups) {\n let writeIdx = 0;\n for (const vline of group.items) {\n const x = viewport.timeToClipX(vline.t);\n this.scratch[writeIdx++] = x;\n this.scratch[writeIdx++] = yTopClip;\n this.scratch[writeIdx++] = x;\n this.scratch[writeIdx++] = yBottomClip;\n }\n if (writeIdx === 0) continue;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: group.color });\n }\n }\n\n // Parallel channels: two segments per channel — the base line\n // (price1→price2) and the parallel line shifted by priceOffset.\n // Both share the base slope so they stay parallel through any\n // pan/zoom. Outline-only (no fill) keeps the candles legible,\n // matching the rect convention.\n for (const group of this.channelGroups) {\n let writeIdx = 0;\n for (const ch of group.items) {\n const x1 = viewport.timeToClipX(ch.t1);\n const x2 = viewport.timeToClipX(ch.t2);\n const y1 = viewport.priceToClipY(ch.price1);\n const y2 = viewport.priceToClipY(ch.price2);\n const y1o = viewport.priceToClipY(ch.price1 + ch.priceOffset);\n const y2o = viewport.priceToClipY(ch.price2 + ch.priceOffset);\n // Base line\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2;\n // Parallel line\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1o;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2o;\n }\n if (writeIdx === 0) continue;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: group.color });\n }\n\n // Preview last so it paints on top of every committed shape.\n if (this.preview) {\n this.emitPreview(viewport, xLeftClip, xRightClip);\n }\n }\n\n private emitPreview(\n viewport: Viewport,\n xLeftClip: number,\n xRightClip: number,\n ): void {\n const p = this.preview;\n if (!p) return;\n if (!p.color.every(Number.isFinite)) return;\n let writeIdx = 0;\n if (p.kind === \"hline\") {\n if (!Number.isFinite(p.price)) return;\n const y = viewport.priceToClipY(p.price);\n this.scratch[writeIdx++] = xLeftClip;\n this.scratch[writeIdx++] = y;\n this.scratch[writeIdx++] = xRightClip;\n this.scratch[writeIdx++] = y;\n } else if (p.kind === \"trend\") {\n if (!hasFinitePairAnchors(p)) return;\n const x1 = viewport.timeToClipX(p.t1);\n const y1 = viewport.priceToClipY(p.price1);\n const x2 = viewport.timeToClipX(p.t2);\n const y2 = viewport.priceToClipY(p.price2);\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2;\n } else if (p.kind === \"rect\") {\n if (!hasFinitePairAnchors(p)) return;\n const x1 = viewport.timeToClipX(p.t1);\n const y1 = viewport.priceToClipY(p.price1);\n const x2 = viewport.timeToClipX(p.t2);\n const y2 = viewport.priceToClipY(p.price2);\n // Top\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y1;\n // Right\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y1;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2;\n // Bottom\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2;\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y2;\n // Left\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y2;\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n } else if (p.kind === \"fib\") {\n if (!hasFinitePairAnchors(p)) return;\n const xA = viewport.timeToClipX(p.t1);\n const xB = viewport.timeToClipX(p.t2);\n const priceSpan = p.price2 - p.price1;\n for (const r of FIB_RATIOS) {\n const y = viewport.priceToClipY(p.price1 + r * priceSpan);\n this.scratch[writeIdx++] = xA;\n this.scratch[writeIdx++] = y;\n this.scratch[writeIdx++] = xB;\n this.scratch[writeIdx++] = y;\n }\n } else if (p.kind === \"channel\") {\n // Same two-segment geometry as the committed channel paint. In\n // the first authoring phase priceOffset is 0 (base line only,\n // the two segments coincide → reads as a single trend line);\n // in the second phase the cursor drives priceOffset and both\n // lines separate.\n if (!hasFinitePairAnchors(p) || !Number.isFinite(p.priceOffset)) {\n return;\n }\n const x1 = viewport.timeToClipX(p.t1);\n const x2 = viewport.timeToClipX(p.t2);\n const y1 = viewport.priceToClipY(p.price1);\n const y2 = viewport.priceToClipY(p.price2);\n const y1o = viewport.priceToClipY(p.price1 + p.priceOffset);\n const y2o = viewport.priceToClipY(p.price2 + p.priceOffset);\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2;\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1o;\n this.scratch[writeIdx++] = x2;\n this.scratch[writeIdx++] = y2o;\n }\n if (writeIdx === 0) return;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: p.color });\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.buffer = null;\n // Force a re-paint on the next tick — without this, a context\n // restore that lands with no other dirty signal would skip\n // re-emitting any committed shape until the next external\n // update (coin change, drawing add/delete).\n this.dirty = true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.buffer?.destroy();\n this.buffer = null;\n this.cmd = null;\n this.shapes = [];\n this.hlineGroups = [];\n this.trendGroups = [];\n this.rectGroups = [];\n this.fibGroups = [];\n this.vlineGroups = [];\n this.channelGroups = [];\n this.preview = null;\n }\n\n private compile(regl: REGL.Regl): void {\n this.buffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n length: this.scratch.length * 4,\n });\n this.cmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.buffer },\n uniforms: {\n uColor: regl.prop<Props, \"color\">(\"color\"),\n },\n count: regl.prop<Props, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n lineWidth: 1,\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as LineCmd;\n }\n}\n\n// Shared finite-anchor guard for the two-anchor shape family\n// (trend, rect, fib, and channel — channel's base line uses the\n// same t1/price1 / t2/price2 anchors plus a priceOffset validated\n// separately). Centralised so the load-time guard, hit-test, and\n// emit paths can't disagree on which fields constitute a valid\n// shape.\nfunction hasFinitePairAnchors(s: {\n t1: number;\n t2: number;\n price1: number;\n price2: number;\n}): boolean {\n return (\n Number.isFinite(s.t1) &&\n Number.isFinite(s.t2) &&\n Number.isFinite(s.price1) &&\n Number.isFinite(s.price2)\n );\n}\n\n// Point-to-segment distance in 2D CSS-pixel space. Handles the\n// zero-length segment (identical endpoints) by falling back to a\n// point distance.\nfunction pointToSegmentDistance(\n px: number,\n py: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) {\n const ex = px - x1;\n const ey = py - y1;\n return Math.sqrt(ex * ex + ey * ey);\n }\n let t = ((px - x1) * dx + (py - y1) * dy) / lenSq;\n if (t < 0) t = 0;\n else if (t > 1) t = 1;\n const cx = x1 + t * dx;\n const cy = y1 + t * dy;\n const ex = px - cx;\n const ey = py - cy;\n return Math.sqrt(ex * ex + ey * ey);\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport type { DataStore } from \"../core/DataStore\";\nimport { TextBatch } from \"../core/TextBatch\";\nimport { SOLID_LINES_FRAG, SOLID_LINES_VERT } from \"../shaders/common\";\n\ntype DrawProps = {\n count: number;\n color: [number, number, number, number];\n};\n\ntype DrawCmd = REGL.DrawCommand<REGL.DefaultContext, DrawProps>;\n\ninterface ExtremaPoint {\n price: number;\n time: number;\n}\n\ninterface Callout {\n label: string;\n anchorX: number;\n centerY: number;\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nconst MAX_CALLOUTS = 2;\nconst LINE_FLOATS = MAX_CALLOUTS * 4;\nconst FILL_FLOATS = MAX_CALLOUTS * 12;\nconst LABEL_PAD_X = 6;\nconst LABEL_PAD_Y = 3;\nconst LINE_LEN = 42;\nconst EDGE_PAD = 8;\n\nfunction formatExtremaPrice(price: number): string {\n if (!isFinite(price)) return \"--\";\n const abs = Math.abs(price);\n if (abs >= 1_000_000) return `${(price / 1_000_000).toFixed(2)}M`;\n if (abs >= 1) return price.toFixed(2);\n return price.toFixed(6);\n}\n\nexport class ExtremaAnnotationLayer implements Layer {\n readonly id = \"extrema-annotations\";\n dirty = true;\n\n private lineCmd: DrawCmd | null = null;\n private fillCmd: DrawCmd | null = null;\n private lineBuffer: REGL.Buffer | null = null;\n private fillBuffer: REGL.Buffer | null = null;\n private batch: TextBatch | null = null;\n private lineScratch = new Float32Array(LINE_FLOATS);\n private fillScratch = new Float32Array(FILL_FLOATS);\n private disposed = false;\n\n constructor(private readonly store: DataStore) {}\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport, theme, glyphAtlas } = ctx;\n if (!glyphAtlas.texture) return;\n if (!this.batch) this.batch = new TextBatch(glyphAtlas);\n if (!this.lineCmd || !this.fillCmd) this.compile(regl);\n if (!this.lineBuffer || !this.fillBuffer) return;\n\n const b = this.store.candles;\n if (b.length < 2) return;\n const [t0, t1] = viewport.timeRange;\n let i0 = this.store.firstIndexAtOrAfter(t0) - 1;\n let i1 = this.store.firstIndexAtOrAfter(t1) + 1;\n if (i0 < 0) i0 = 0;\n if (i1 > b.length) i1 = b.length;\n if (i1 <= i0) return;\n\n let high: ExtremaPoint | null = null;\n let low: ExtremaPoint | null = null;\n for (let i = i0; i < i1; i++) {\n const t = b.time[i];\n const h = b.high[i];\n const l = b.low[i];\n if (!isFinite(t)) continue;\n if (isFinite(h) && (!high || h > high.price)) high = { price: h, time: t };\n if (isFinite(l) && (!low || l < low.price)) low = { price: l, time: t };\n }\n if (!high && !low) return;\n\n const plot = viewport.plotCss;\n if (plot.w <= 0 || plot.h <= 0) return;\n\n const callouts: Callout[] = [];\n if (high) {\n callouts.push(this.makeCallout(high, viewport, glyphAtlas, plot));\n }\n if (low && (!high || Math.abs(low.price - high.price) > 1e-9)) {\n const next = this.makeCallout(low, viewport, glyphAtlas, plot);\n const prev = callouts[0];\n if (!prev || Math.abs(prev.centerY - next.centerY) > 24) {\n callouts.push(next);\n }\n }\n if (callouts.length === 0) return;\n\n let lineOffset = 0;\n let fillOffset = 0;\n this.batch.reset();\n for (const c of callouts.slice(0, MAX_CALLOUTS)) {\n const lineEnd = c.anchorX <= c.left ? c.left : c.left + c.width;\n this.lineScratch[lineOffset++] = viewport.pxXToClipX(c.anchorX);\n this.lineScratch[lineOffset++] = viewport.pxYToClipY(c.centerY);\n this.lineScratch[lineOffset++] = viewport.pxXToClipX(lineEnd);\n this.lineScratch[lineOffset++] = viewport.pxYToClipY(c.centerY);\n this.pushRect(viewport, fillOffset, c.left, c.top, c.width, c.height);\n fillOffset += 12;\n this.batch.addLabel(\n c.label,\n c.left + LABEL_PAD_X,\n c.top + LABEL_PAD_Y,\n theme.crosshairLabelText,\n viewport,\n \"left\",\n );\n }\n\n this.lineBuffer.subdata(this.lineScratch.subarray(0, lineOffset));\n this.lineCmd!({\n count: lineOffset / 2,\n color: [0.92, 0.94, 0.97, 0.82],\n });\n this.fillBuffer.subdata(this.fillScratch.subarray(0, fillOffset));\n this.fillCmd!({\n count: fillOffset / 2,\n color: [0.05, 0.05, 0.06, 0.86],\n });\n this.batch.flush(regl);\n }\n\n onContextLost(): void {\n this.batch?.onContextLost();\n this.batch = null;\n this.lineCmd = null;\n this.fillCmd = null;\n this.lineBuffer = null;\n this.fillBuffer = null;\n }\n\n dispose(): void {\n this.disposed = true;\n this.batch?.dispose();\n this.lineBuffer?.destroy();\n this.fillBuffer?.destroy();\n this.batch = null;\n this.lineBuffer = null;\n this.fillBuffer = null;\n this.lineCmd = null;\n this.fillCmd = null;\n }\n\n private makeCallout(\n point: ExtremaPoint,\n viewport: RenderContext[\"viewport\"],\n glyphAtlas: RenderContext[\"glyphAtlas\"],\n plot: { x: number; y: number; w: number; h: number },\n ): Callout {\n const label = formatExtremaPrice(point.price);\n const width = glyphAtlas.measure(label) + LABEL_PAD_X * 2;\n const height = glyphAtlas.lineHeight + LABEL_PAD_Y * 2;\n const anchorX = viewport.timeToX(point.time) / viewport.dpr;\n const rawY = viewport.priceToY(point.price) / viewport.dpr;\n const centerY = Math.max(\n plot.y + height / 2 + EDGE_PAD,\n Math.min(plot.y + plot.h - height / 2 - EDGE_PAD, rawY),\n );\n const toRight = anchorX < plot.x + plot.w - width - LINE_LEN - EDGE_PAD;\n const rawLeft = toRight\n ? anchorX + LINE_LEN\n : anchorX - LINE_LEN - width;\n const left = Math.max(\n plot.x + EDGE_PAD,\n Math.min(plot.x + plot.w - width - EDGE_PAD, rawLeft),\n );\n\n return {\n label,\n anchorX,\n centerY,\n left,\n top: centerY - height / 2,\n width,\n height,\n };\n }\n\n private pushRect(\n vp: RenderContext[\"viewport\"],\n off: number,\n left: number,\n top: number,\n w: number,\n h: number,\n ): void {\n const x0 = vp.pxXToClipX(left);\n const x1 = vp.pxXToClipX(left + w);\n const y0 = vp.pxYToClipY(top);\n const y1 = vp.pxYToClipY(top + h);\n this.fillScratch[off + 0] = x0;\n this.fillScratch[off + 1] = y0;\n this.fillScratch[off + 2] = x1;\n this.fillScratch[off + 3] = y0;\n this.fillScratch[off + 4] = x0;\n this.fillScratch[off + 5] = y1;\n this.fillScratch[off + 6] = x1;\n this.fillScratch[off + 7] = y0;\n this.fillScratch[off + 8] = x1;\n this.fillScratch[off + 9] = y1;\n this.fillScratch[off + 10] = x0;\n this.fillScratch[off + 11] = y1;\n }\n\n private compile(regl: REGL.Regl): void {\n this.lineBuffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n data: this.lineScratch,\n });\n this.fillBuffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n data: this.fillScratch,\n });\n this.lineCmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.lineBuffer },\n uniforms: { uColor: regl.prop<DrawProps, \"color\">(\"color\") },\n count: regl.prop<DrawProps, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as DrawCmd;\n this.fillCmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.fillBuffer },\n uniforms: { uColor: regl.prop<DrawProps, \"color\">(\"color\") },\n count: regl.prop<DrawProps, \"count\">(\"count\"),\n primitive: \"triangles\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as DrawCmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport { SOLID_LINES_FRAG, SOLID_LINES_VERT } from \"../shaders/common\";\n\nexport interface HLineSpec {\n value: number;\n color: [number, number, number, number];\n}\n\ntype Props = {\n count: number;\n color: [number, number, number, number];\n};\n\ntype LineCmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\n// Renders horizontal reference lines at fixed price values within a\n// pane. Used for RSI overbought/oversold thresholds, key levels, etc.\n// One draw call per color (so multi-color setups get one call per\n// distinct color); the line shader is the same passthrough used by\n// the grid and crosshair.\nexport class HorizontalLineLayer implements Layer {\n readonly id: string;\n dirty = true;\n\n private cmd: LineCmd | null = null;\n private buffer: REGL.Buffer | null = null;\n private scratch: Float32Array;\n private disposed = false;\n // Per-color groups derived from the current line set. Recomputed\n // whenever setLines() replaces the lines so callers (e.g. the VP\n // POC/VAH/VAL set) can update on coin/interval changes without\n // recreating the layer.\n private groups: Array<{\n color: [number, number, number, number];\n lines: HLineSpec[];\n }>;\n private lines: HLineSpec[];\n\n constructor(id: string, lines: HLineSpec[]) {\n this.id = id;\n this.lines = lines;\n // 4 floats per line (2 vertices × 2 coords). Sized lazily on\n // setLines too if a caller swaps in a much larger set.\n this.scratch = new Float32Array(Math.max(1, lines.length) * 4);\n this.groups = HorizontalLineLayer.buildGroups(lines);\n }\n\n // Replace the line set. Used by callers that need to update\n // dynamic reference levels (POC/VAH/VAL from a coin-change\n // volume profile, ATR bands, etc.).\n setLines(lines: HLineSpec[]): void {\n this.lines = lines;\n this.groups = HorizontalLineLayer.buildGroups(lines);\n const neededFloats = Math.max(1, lines.length) * 4;\n if (this.scratch.length < neededFloats) {\n this.scratch = new Float32Array(neededFloats);\n // Buffer was sized for the old scratch; rebuild on next paint\n // so subdata's subarray doesn't overflow the GL buffer.\n this.buffer?.destroy();\n this.buffer = null;\n this.cmd = null;\n }\n this.dirty = true;\n }\n\n private static buildGroups(lines: HLineSpec[]): Array<{\n color: [number, number, number, number];\n lines: HLineSpec[];\n }> {\n const byColor = new Map<string, HLineSpec[]>();\n for (const line of lines) {\n // Guard against non-finite color components — Array#join\n // would stringify NaN/Infinity and the resulting key would\n // collide with no other group, but regl coerces a non-finite\n // uniform unpredictably.\n if (!line.color.every(Number.isFinite)) continue;\n const key = line.color.join(\",\");\n const list = byColor.get(key);\n if (list) list.push(line);\n else byColor.set(key, [line]);\n }\n return Array.from(byColor.values()).map((list) => ({\n color: list[0].color,\n lines: list,\n }));\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n if (this.groups.length === 0) return;\n const { regl, viewport } = ctx;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n // priceRange guard mirrors PriceAxisLayer / CrosshairLayer.\n // Without it, a transient degenerate span (pinch-to-zero,\n // pre-init race) would map every line to the same clip y and\n // collapse the reference lines on top of each other.\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n if (!this.cmd) this.compile(regl);\n\n const plot = viewport.plotCss;\n if (plot.w <= 0 || plot.h <= 0) return;\n\n const xLeftClip = viewport.pxXToClipX(plot.x);\n const xRightClip = viewport.pxXToClipX(plot.x + plot.w);\n\n for (const group of this.groups) {\n let writeIdx = 0;\n for (const line of group.lines) {\n if (!isFinite(line.value)) continue;\n const y = viewport.priceToClipY(line.value);\n this.scratch[writeIdx++] = xLeftClip;\n this.scratch[writeIdx++] = y;\n this.scratch[writeIdx++] = xRightClip;\n this.scratch[writeIdx++] = y;\n }\n if (writeIdx === 0) continue;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: group.color });\n }\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.buffer = null;\n }\n\n dispose(): void {\n this.disposed = true;\n this.buffer?.destroy();\n this.buffer = null;\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n this.buffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n length: this.scratch.length * 4,\n });\n this.cmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.buffer },\n uniforms: {\n uColor: regl.prop<Props, \"color\">(\"color\"),\n },\n count: regl.prop<Props, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n lineWidth: 1,\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as LineCmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport type { DataStore, OhlcvBuffer } from \"../core/DataStore\";\nimport { SOLID_LINES_FRAG, SOLID_LINES_VERT } from \"../shaders/common\";\n\nexport interface IndicatorOptions {\n id: string;\n // Produce a value series same length as candles.length, NaN for the\n // warm-up positions. Receives a number[] view over a typed-array\n // column from the OhlcvBuffer — IndicatorLayer caches and resyncs\n // this view across paints so the compute is allocation-free.\n compute: (closes: number[], b: OhlcvBuffer) => number[];\n color: [number, number, number, number];\n}\n\ntype Props = {\n count: number;\n color: [number, number, number, number];\n};\n\ntype LineCmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\n// Generic polyline indicator layer. Computes a value series over the\n// full data set (so warm-up history is honoured), then emits\n// gl.LINES pairs for every (i, i+1) within the visible window where\n// both values are finite. NaN gaps produce a real gap in the rendered\n// line rather than a \"skip\" connecting two distant points.\n//\n// Single 1-px line shader for now — kiyotaka's 2-px lines need a\n// miter-joined polyline shader (instanced quads with normal\n// expansion) which lands with the drawing-tools work.\nexport class IndicatorLayer implements Layer {\n readonly id: string;\n dirty = true;\n\n private cmd: LineCmd | null = null;\n private buffer: REGL.Buffer | null = null;\n private scratch = new Float32Array(0);\n private disposed = false;\n\n // Cached closes view — avoids allocating a fresh number[] each\n // frame to satisfy compute()'s number[] signature. Resized on\n // capacity change; the live-tail last value is refreshed every\n // paint since applyTrade can mutate it without changing length.\n private closes: number[] = [];\n private closesLength = 0;\n\n // Last series compute() produced, cached so the OHLC legend can read\n // the indicator's value at the hovered bar without recomputing (and\n // so the readout is exactly what was drawn). Set every full paint.\n private lastValues: number[] | null = null;\n\n constructor(\n private readonly store: DataStore,\n private readonly opts: IndicatorOptions,\n ) {\n this.id = opts.id;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport, theme } = ctx;\n void theme;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n const b = this.store.candles;\n if (b.length < 2) {\n // dataStore.clear() drops length to 0 without resetting our\n // cache. If we don't invalidate here, a coin switch that\n // happens to land the same number of candles (HISTORY_BARS=500\n // is the default for every coin) would later pass the\n // `closesLength === b.length` check and refresh only the LAST\n // entry — leaving indices 0..N-2 with the previous coin's\n // closes for up to one interval (until the next bucket\n // append). Force a full rebuild on the next paint.\n this.closesLength = 0;\n // No drawable data — drop the cached series so valueAt() (the\n // legend reader) can't hand back the previous coin's values.\n this.lastValues = null;\n return;\n }\n\n // Resync the cached closes view with the typed-array column.\n // We rebuild on (a) length mismatch or (b) when b.close[0]\n // differs from our cached this.closes[0]. The b.close[0] probe\n // catches the coin-switch race where clear() + setCandles()\n // both land between two paints, leaving lengths equal but the\n // entire data swapped — without the probe, indices 1..N-2\n // would retain the previous coin's values until the next\n // bucket append (up to one interval duration).\n const cacheStale =\n this.closesLength !== b.length ||\n this.closes[0] !== b.close[0];\n if (cacheStale) {\n this.closes.length = b.length;\n for (let i = 0; i < b.length; i++) this.closes[i] = b.close[i];\n this.closesLength = b.length;\n // closes now points at NEW data but lastValues still holds the\n // series computed from the OLD data. Invalidate it so a valueAt()\n // call between here and the compute() below (e.g. if a later guard\n // early-returns this paint) can't pass its freshness probe —\n // which compares against this.closes — and serve a stale value.\n this.lastValues = null;\n } else {\n // Same data, same length — refresh only the tail entry since\n // live-tail trades mutate b.close[length-1] in place.\n this.closes[b.length - 1] = b.close[b.length - 1];\n }\n\n // Same finite/span guard the price-axis and crosshair layers\n // use — prevents the indicator line from collapsing to the\n // pane bottom during a transient degenerate viewport span.\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n const values = this.opts.compute(this.closes, b);\n if (values.length !== b.length) {\n // Defensive: compute must return same length as input.\n return;\n }\n this.lastValues = values;\n\n const [t0, t1] = viewport.timeRange;\n let i0 = this.store.firstIndexAtOrAfter(t0) - 1;\n let i1 = this.store.firstIndexAtOrAfter(t1) + 1;\n if (i0 < 0) i0 = 0;\n if (i1 > b.length) i1 = b.length;\n if (i1 - i0 < 2) return;\n\n const maxPairs = i1 - i0 - 1;\n // 4 floats per pair (2 vertices × 2 coords). Pre-grow before the\n // emit loop so subdata's subarray doesn't outrun the buffer.\n this.ensureCapacity(maxPairs * 4);\n if (!this.cmd) this.compile(regl);\n\n let writeIdx = 0;\n for (let i = i0; i < i1 - 1; i++) {\n const v0 = values[i];\n const v1 = values[i + 1];\n if (!isFinite(v0) || !isFinite(v1)) continue;\n const x0 = viewport.timeToClipX(b.time[i]);\n const y0 = viewport.priceToClipY(v0);\n const x1 = viewport.timeToClipX(b.time[i + 1]);\n const y1 = viewport.priceToClipY(v1);\n this.scratch[writeIdx++] = x0;\n this.scratch[writeIdx++] = y0;\n this.scratch[writeIdx++] = x1;\n this.scratch[writeIdx++] = y1;\n }\n\n if (writeIdx === 0) return;\n this.buffer!.subdata(this.scratch.subarray(0, writeIdx));\n this.cmd!({ count: writeIdx / 2, color: this.opts.color });\n }\n\n // Value of the computed series at candle index `i`, or NaN when there\n // is none — warm-up positions, out-of-range, or before the first\n // paint. Used by the on-chart legend to show the live indicator value\n // at the hovered bar. Two freshness guards keep it from serving a\n // previous coin's values after a switch: (1) paint() nulls lastValues\n // the moment it rebuilds the closes cache for new data, covering the\n // window inside a paint that rebuilds the cache then early-returns;\n // (2) the length + close[0] probe here covers reads BEFORE that paint\n // runs, where the store already holds new candles but this.closes (and\n // lastValues) are still the old coin's. Either way: NaN, so the legend\n // skips the row for at most one frame rather than showing a stale value.\n valueAt(i: number): number {\n const v = this.lastValues;\n if (!v || i < 0 || i >= v.length) return NaN;\n const b = this.store.candles;\n if (b.length !== v.length || b.close[0] !== this.closes[0]) return NaN;\n return v[i];\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.buffer = null;\n }\n\n dispose(): void {\n this.disposed = true;\n this.buffer?.destroy();\n this.buffer = null;\n this.cmd = null;\n }\n\n private ensureCapacity(n: number): void {\n if (n <= this.scratch.length) return;\n let cap = Math.max(this.scratch.length, 256);\n while (cap < n) cap *= 2;\n this.scratch = new Float32Array(cap);\n this.buffer?.destroy();\n this.buffer = null;\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n const cap = Math.max(this.scratch.length, 256);\n this.buffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n length: cap * 4,\n });\n this.cmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.buffer },\n uniforms: {\n uColor: regl.prop<Props, \"color\">(\"color\"),\n },\n count: regl.prop<Props, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n lineWidth: 1,\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as LineCmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport { MARKER_FRAG, MARKER_VERT } from \"../shaders/common\";\n\nexport interface MarkerSpec {\n t: number;\n price: number;\n /** USD notional; drives marker size via log scale. */\n sizeUsd: number;\n}\n\ntype Props = {\n instances: number;\n color: [number, number, number, number];\n sideSign: number;\n};\n\ntype Cmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\nconst QUAD_CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n\n// Size envelope in CSS px. Below MIN the marker is unreadable; above\n// MAX it dominates the chart and occludes candles.\nconst MIN_PX = 4;\nconst MAX_PX = 18;\n// Default log-scale anchors cover HL's whale-print band ($250k → $25M)\n// with some headroom either side. Liquidation events span a wider band\n// ($10k → $10M) and pass overrides via the constructor.\nconst DEFAULT_LOG_MIN = Math.log10(250_000);\nconst DEFAULT_LOG_MAX = Math.log10(25_000_000);\n\n// Instanced triangle markers. One layer instance per side+color (so\n// whale buys and sells get two MarkerLayer instances), since the\n// triangle orientation comes from a uniform — keeps the shader tight\n// and means the layer never has to fan out across multiple draw\n// calls per paint.\n//\n// Position: aXCenter/aYCenter sit AT the price level, not offset\n// above/below it. Both up and down triangles render centered on\n// their (t, price) — readers distinguish side from the color and\n// the orientation simultaneously. Matches kiyotaka's render of\n// directional event markers; differs from the legacy\n// lightweight-charts impl which offset markers above/below the bar.\nexport class MarkerLayer implements Layer {\n readonly id: string;\n dirty = true;\n\n private markers: MarkerSpec[] = [];\n private cmd: Cmd | null = null;\n private cornerBuf: REGL.Buffer | null = null;\n private xCenterBuf: REGL.Buffer | null = null;\n private yCenterBuf: REGL.Buffer | null = null;\n private halfWidthBuf: REGL.Buffer | null = null;\n private halfHeightBuf: REGL.Buffer | null = null;\n\n private xCenter = new Float32Array(0);\n private yCenter = new Float32Array(0);\n private halfWidth = new Float32Array(0);\n private halfHeight = new Float32Array(0);\n\n private disposed = false;\n private readonly logMin: number;\n private readonly logMax: number;\n\n constructor(\n private readonly opts: {\n id: string;\n sideSign: 1 | -1;\n color: [number, number, number, number];\n /** Override the log10(USD) lower anchor for marker sizing. */\n logMinUsd?: number;\n /** Override the log10(USD) upper anchor for marker sizing. */\n logMaxUsd?: number;\n },\n ) {\n this.id = opts.id;\n // Validate the override pair — if a caller supplies an inverted or\n // non-finite range, fall back to the defaults so we don't divide by\n // zero in the per-marker size mapping.\n const overrideLo =\n opts.logMinUsd !== undefined && Number.isFinite(opts.logMinUsd)\n ? opts.logMinUsd\n : DEFAULT_LOG_MIN;\n const overrideHi =\n opts.logMaxUsd !== undefined && Number.isFinite(opts.logMaxUsd)\n ? opts.logMaxUsd\n : DEFAULT_LOG_MAX;\n if (overrideHi > overrideLo) {\n this.logMin = overrideLo;\n this.logMax = overrideHi;\n } else {\n this.logMin = DEFAULT_LOG_MIN;\n this.logMax = DEFAULT_LOG_MAX;\n }\n }\n\n setMarkers(markers: MarkerSpec[]): void {\n this.markers = markers;\n this.dirty = true;\n }\n\n clear(): void {\n this.markers = [];\n this.dirty = true;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n if (this.markers.length === 0) return;\n const { regl, viewport } = ctx;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n const n = this.markers.length;\n this.ensureCapacity(n);\n if (!this.cmd) this.compile(regl);\n\n let wrote = 0;\n for (let i = 0; i < n; i++) {\n const m = this.markers[i];\n if (!isFinite(m.t) || !isFinite(m.price) || m.price <= 0) continue;\n if (!isFinite(m.sizeUsd) || m.sizeUsd <= 0) continue;\n\n const xClip = viewport.timeToClipX(m.t);\n const yClip = viewport.priceToClipY(m.price);\n\n // Log-scale size mapping anchored at the layer's logMin/logMax\n // (defaults whales-tuned; liquidation layers widen the range).\n // Clamp outside the band so unusually large prints peg at MAX_PX\n // rather than over-shooting the size envelope.\n const logV = Math.log10(m.sizeUsd);\n const t = (logV - this.logMin) / (this.logMax - this.logMin);\n const px = MIN_PX + (MAX_PX - MIN_PX) * Math.max(0, Math.min(1, t));\n // Marker is roughly square in CSS px; convert to clip on\n // each axis since x and y clip spans differ when the\n // canvas is non-square.\n const halfWClip = viewport.pxWidthToClip(px) * 0.5;\n const halfHClip = viewport.pxHeightToClip(px) * 0.5;\n\n // Cull against the marker's actual extent, not just the\n // center. On narrow canvases (mobile, dashboard tiles)\n // halfWClip / halfHClip can exceed 0.1 clip units and a\n // marker centered past +/-1.0 may still be partially\n // visible — center-only cull would drop legitimate\n // edge-of-viewport markers.\n if (xClip + halfWClip < -1.0 || xClip - halfWClip > 1.0) continue;\n if (yClip + halfHClip < -1.0 || yClip - halfHClip > 1.0) continue;\n\n this.xCenter[wrote] = xClip;\n this.yCenter[wrote] = yClip;\n this.halfWidth[wrote] = halfWClip;\n this.halfHeight[wrote] = halfHClip;\n wrote++;\n }\n\n if (wrote === 0) return;\n\n this.xCenterBuf!.subdata(this.xCenter.subarray(0, wrote));\n this.yCenterBuf!.subdata(this.yCenter.subarray(0, wrote));\n this.halfWidthBuf!.subdata(this.halfWidth.subarray(0, wrote));\n this.halfHeightBuf!.subdata(this.halfHeight.subarray(0, wrote));\n\n this.cmd!({\n instances: wrote,\n color: this.opts.color,\n sideSign: this.opts.sideSign,\n });\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.yCenterBuf = null;\n this.halfWidthBuf = null;\n this.halfHeightBuf = null;\n this.xCenter = new Float32Array(0);\n this.yCenter = new Float32Array(0);\n this.halfWidth = new Float32Array(0);\n this.halfHeight = new Float32Array(0);\n }\n\n dispose(): void {\n this.disposed = true;\n this.cornerBuf?.destroy();\n this.xCenterBuf?.destroy();\n this.yCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.halfHeightBuf?.destroy();\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.yCenterBuf = null;\n this.halfWidthBuf = null;\n this.halfHeightBuf = null;\n this.cmd = null;\n this.markers = [];\n }\n\n private ensureCapacity(n: number): void {\n if (n <= this.xCenter.length) return;\n let cap = Math.max(this.xCenter.length, 128);\n while (cap < n) cap *= 2;\n this.xCenter = new Float32Array(cap);\n this.yCenter = new Float32Array(cap);\n this.halfWidth = new Float32Array(cap);\n this.halfHeight = new Float32Array(cap);\n this.xCenterBuf?.destroy();\n this.yCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.halfHeightBuf?.destroy();\n this.xCenterBuf = null;\n this.yCenterBuf = null;\n this.halfWidthBuf = null;\n this.halfHeightBuf = null;\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n // cornerBuf is static (the unit-quad corners never change),\n // so reuse it across capacity grows. ensureCapacity nulls\n // the cmd + dynamic buffers but leaves cornerBuf alive; only\n // onContextLost / dispose tear it down. Previously this\n // unconditionally reallocated and orphaned the prior buffer\n // every grow cycle.\n if (!this.cornerBuf) {\n this.cornerBuf = regl.buffer({\n type: \"float\",\n usage: \"static\",\n data: QUAD_CORNERS,\n });\n }\n const dynamic = (size: number) =>\n regl.buffer({ type: \"float\", usage: \"dynamic\", length: size * 4 });\n const cap = Math.max(this.xCenter.length, 128);\n this.xCenterBuf = dynamic(cap);\n this.yCenterBuf = dynamic(cap);\n this.halfWidthBuf = dynamic(cap);\n this.halfHeightBuf = dynamic(cap);\n\n this.cmd = regl({\n vert: MARKER_VERT,\n frag: MARKER_FRAG,\n attributes: {\n aCorner: { buffer: this.cornerBuf, divisor: 0 },\n aXCenter: { buffer: this.xCenterBuf, divisor: 1 },\n aYCenter: { buffer: this.yCenterBuf, divisor: 1 },\n aHalfWidth: { buffer: this.halfWidthBuf, divisor: 1 },\n aHalfHeight: { buffer: this.halfHeightBuf, divisor: 1 },\n },\n uniforms: {\n uColor: regl.prop<Props, \"color\">(\"color\"),\n uSideSign: regl.prop<Props, \"sideSign\">(\"sideSign\"),\n },\n count: 4,\n instances: regl.prop<Props, \"instances\">(\"instances\"),\n primitive: \"triangle strip\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as Cmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport { SOLID_LINES_FRAG, SOLID_LINES_VERT } from \"../shaders/common\";\n\n// Input contract for the OI sub-pane: sorted-ascending, finite-only,\n// positive-only (time, value) points. Owned here (the layer is the\n// consumer) so the engine carries no dependency on any app-side adapter;\n// hosts build these via their own normalisation (the mmflow app's\n// adapters/oiHistory re-exports this type and maps its API payload onto\n// it).\nexport interface OiHistoryPoint {\n t: number;\n v: number;\n}\n\ntype Props = {\n count: number;\n color: [number, number, number, number];\n};\n\ntype Cmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\n// Open-interest history polyline. Lives in its own sub-pane below\n// RSI. The pane's viewport.priceRange is fixed at [0, 1] (the pane\n// is priceInteractive=false) and this layer normalises USD/contract\n// OI values into the pane's plot rect on every paint, exactly the\n// same shape VolumeLayer uses — that decouples the OI subplot from\n// any vertical pan/zoom interaction and pins it to the pane's\n// allotted vertical slice.\n//\n// Visible-window normalisation (vs all-data normalisation) means the\n// line uses the full pane height even when the user zooms into a\n// narrow time window where OI barely moves. Matches the kiyotaka OI\n// subplot's behaviour and lets the user see micro-changes in OI\n// during a chop period.\n//\n// Single 1-px line, no fill, no shading — keeps the subplot reading\n// as a clean reference. Color is layer-uniform (not per-segment\n// rising/falling) since OI's overall trend matters more than the\n// per-tick direction.\nexport class OiHistoryLayer implements Layer {\n readonly id: string;\n dirty = true;\n\n private points: OiHistoryPoint[] = [];\n private cmd: Cmd | null = null;\n private buffer: REGL.Buffer | null = null;\n private scratch = new Float32Array(0);\n private disposed = false;\n\n constructor(\n private readonly opts: {\n id: string;\n color: [number, number, number, number];\n },\n ) {\n this.id = opts.id;\n }\n\n setPoints(points: OiHistoryPoint[]): void {\n this.points = points;\n this.dirty = true;\n }\n\n clear(): void {\n this.points = [];\n this.dirty = true;\n }\n\n // Open-interest value \"as of\" time `t` — the value of the most recent\n // sample at or before `t`. Returns NaN when there are no points or `t`\n // precedes the first sample (no reading exists yet at that time). Used\n // by the OI sub-pane's on-chart legend to read the OI at the hovered\n // bar (or the latest bar when the cursor is off-chart).\n //\n // As-of (last sample ≤ t), not interpolation: OI is a discrete ~10-min\n // measurement, so the honest readout is the last actual reading rather\n // than a synthetic mid-segment value. For `t` past the final sample —\n // the common live-edge case, since candles tick faster than HL's OI\n // cron — this returns the latest reading, i.e. the current OI.\n //\n // Unlike IndicatorLayer.valueAt (which reads a paint-built cache keyed\n // by candle index and needs freshness guards against a coin switch),\n // this reads `points` directly: it is the single source of truth, set\n // wholesale by setPoints() and dropped by clear() on a coin switch, so\n // a read can never serve a stale derived series — and it needs no paint\n // to have run first.\n //\n // Scan from the tail: the legend queries at/near the live edge, so the\n // answer is almost always the last sample (O(1)); worst case O(n) over\n // the same ≤432-point series paint() already scans linearly. `points`\n // is sorted ascending by t — the adapter guarantees it and paint()\n // relies on it too. A NaN `t` matches nothing and yields NaN.\n valueAt(t: number): number {\n const pts = this.points;\n const n = pts.length;\n if (n === 0 || t < pts[0].t) return NaN;\n for (let i = n - 1; i >= 0; i--) {\n if (pts[i].t <= t) return pts[i].v;\n }\n return NaN;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const n = this.points.length;\n if (n < 2) return;\n const { regl, viewport } = ctx;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n // Find the visible-window slice. Binary-search would be tighter\n // but the OI cadence is 10min → 432 points over 72h, so a linear\n // scan is well within budget and simpler to reason about. We\n // include one point on each side of the window so the polyline\n // continues into the right and left gutters rather than ending\n // mid-air at the visible edge.\n const [t0, t1] = viewport.timeRange;\n let i0 = 0;\n while (i0 < n - 1 && this.points[i0 + 1].t < t0) i0++;\n let i1 = n - 1;\n while (i1 > 0 && this.points[i1 - 1].t > t1) i1--;\n if (i1 - i0 < 1) return;\n\n // Visible-window min/max for normalisation. Walk only the slice\n // so wide-window pans don't drag the autoscale across hours of\n // off-screen movement.\n let minV = Infinity;\n let maxV = -Infinity;\n for (let i = i0; i <= i1; i++) {\n const v = this.points[i].v;\n if (v < minV) minV = v;\n if (v > maxV) maxV = v;\n }\n if (!isFinite(minV) || !isFinite(maxV)) return;\n // Degenerate: every visible point has the same OI. Pin to the\n // pane vertical centre so a single horizontal line still renders\n // instead of bailing — useful during weekends when HL's cron\n // sometimes flat-lines for a few buckets.\n let span = maxV - minV;\n if (span <= 0) {\n span = Math.max(Math.abs(minV), 1);\n minV -= span * 0.5;\n maxV = minV + span;\n }\n\n // Map directly against the pane's plot rect. Same approach as\n // VolumeLayer — keeps the subplot pinned to its vertical slice\n // even if a stray viewport mutation happens upstream.\n const plot = viewport.plotCss;\n // 6% inset top + bottom so the line never paints right against\n // the pane separator. Tunes the polyline to feel \"centred\" in\n // its slice without needing a per-pane padding bump.\n const insetCss = Math.max(2, plot.h * 0.06);\n const topY = viewport.pxYToClipY(plot.y + insetCss);\n const bottomY = viewport.pxYToClipY(plot.y + plot.h - insetCss);\n const heightClip = topY - bottomY;\n\n const numSegments = i1 - i0;\n // 4 floats per segment (2 vertices × 2 coords).\n this.ensureCapacity(numSegments * 4);\n if (!this.cmd) this.compile(regl);\n\n let wrote = 0;\n for (let i = i0; i < i1; i++) {\n const p0 = this.points[i];\n const p1 = this.points[i + 1];\n const x0 = viewport.timeToClipX(p0.t);\n const x1 = viewport.timeToClipX(p1.t);\n const y0 = bottomY + ((p0.v - minV) / span) * heightClip;\n const y1 = bottomY + ((p1.v - minV) / span) * heightClip;\n // Guard against the rare case where timeToClipX returned NaN\n // (degenerate time range) — would propagate to gl_Position\n // and produce undefined behaviour on the GPU.\n if (\n !isFinite(x0) ||\n !isFinite(x1) ||\n !isFinite(y0) ||\n !isFinite(y1)\n ) {\n continue;\n }\n this.scratch[wrote++] = x0;\n this.scratch[wrote++] = y0;\n this.scratch[wrote++] = x1;\n this.scratch[wrote++] = y1;\n }\n\n if (wrote === 0) return;\n this.buffer!.subdata(this.scratch.subarray(0, wrote));\n this.cmd!({ count: wrote / 2, color: this.opts.color });\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.buffer = null;\n this.scratch = new Float32Array(0);\n }\n\n dispose(): void {\n this.disposed = true;\n this.buffer?.destroy();\n this.buffer = null;\n this.cmd = null;\n this.points = [];\n }\n\n private ensureCapacity(n: number): void {\n if (n <= this.scratch.length) return;\n let cap = Math.max(this.scratch.length, 256);\n while (cap < n) cap *= 2;\n this.scratch = new Float32Array(cap);\n this.buffer?.destroy();\n this.buffer = null;\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n const cap = Math.max(this.scratch.length, 256);\n this.buffer = regl.buffer({\n type: \"float\",\n usage: \"dynamic\",\n length: cap * 4,\n });\n this.cmd = regl({\n vert: SOLID_LINES_VERT,\n frag: SOLID_LINES_FRAG,\n attributes: { aClipPos: this.buffer },\n uniforms: {\n uColor: regl.prop<Props, \"color\">(\"color\"),\n },\n count: regl.prop<Props, \"count\">(\"count\"),\n primitive: \"lines\",\n depth: { enable: false },\n lineWidth: 1,\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as Cmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport { HEATMAP_FRAG, HEATMAP_VERT } from \"../shaders/common\";\n\nexport interface OrderBookHeatmapLevel {\n px: number;\n sz: number;\n}\n\nexport interface OrderBookHeatmapSnapshot {\n time: number;\n bids: OrderBookHeatmapLevel[];\n asks: OrderBookHeatmapLevel[];\n}\n\nexport interface OrderBookHeatmapHover {\n time: number;\n price: number;\n bucketLow: number;\n bucketHigh: number;\n bidUsd: number;\n askUsd: number;\n totalUsd: number;\n side: \"bid\" | \"ask\" | \"both\";\n snapshotAgeMs: number;\n}\n\nexport interface OrderBookHeatmapSummary {\n snapshotCount: number;\n oldestTime: number;\n newestTime: number;\n newestBidUsd: number;\n newestAskUsd: number;\n newestTotalUsd: number;\n maxBucketUsd: number;\n visibleBucketCount: number;\n}\n\ntype Props = {\n clipRect: [number, number, number, number];\n alpha: number;\n colUVRange: [number, number];\n depth: REGL.Texture2D;\n};\n\ntype Cmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\nconst QUAD_CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n\n// Texture dimensions. PRICE_BUCKETS × MAX_SNAPSHOTS RGBA8 = 80 × 720 ×\n// 4 = ~230 KB. Fits in any GPU's L1.\nconst PRICE_BUCKETS = 80;\nconst MAX_SNAPSHOTS = 720;\n\n// Log-scale anchor — depth >= 10^LOG_MAX maps to full intensity.\n// log10(1) = 0 → 0, log10(100M USD) = 8 → 1. Most HL price levels live\n// between $1k and $10M, so most cells land in the 0.3..0.8 range.\nconst LOG_MAX = 8;\n\n// Order Book Heatmap. Accumulates L2 snapshots into a ring buffer, bins\n// each snapshot's levels into a fixed-resolution texture against the\n// current viewport's price range, and renders a single textured quad\n// over the plot rect. Designed to live UNDER the candle layer in the\n// main pane so candles overlay the heatmap.\n//\n// The texture rebuild is gated by a generation counter — paints that\n// don't change snapshots OR the viewport price range reuse the prior\n// upload. With ~30 trades/sec firing data:updated, this avoids\n// rebuilding the whole 80x720 grid on every WS frame.\nexport class OrderBookHeatmapLayer implements Layer {\n readonly id = \"obh\";\n dirty = true;\n\n private snapshots: OrderBookHeatmapSnapshot[] = [];\n private bins: Uint8Array;\n private texture: REGL.Texture2D | null = null;\n private cmd: Cmd | null = null;\n private cornerBuf: REGL.Buffer | null = null;\n private disposed = false;\n\n // Cache keys for the per-paint texture rebuild. We only re-bin when\n // snapshots have changed or the price-range it was binned against\n // has shifted.\n private lastSnapshotGen = -1;\n private snapshotGen = 0;\n private lastP0 = NaN;\n private lastP1 = NaN;\n\n constructor(\n private readonly opts: { alpha?: number } = {},\n ) {\n this.bins = new Uint8Array(PRICE_BUCKETS * MAX_SNAPSHOTS * 4);\n }\n\n // Caller (ChartEngine) pushes one snapshot per WS-driven cadence\n // (debounce to ~5s). Older snapshots fall off the left of the ring.\n // Rejects out-of-order or NaN-time pushes so a system-clock jump\n // (NTP correction, manual change, sleep/wake) doesn't corrupt\n // the texture's column ordering — paint() uses snapshots[0].time\n // and snapshots[last].time as the quad's clip-space bounds, so a\n // non-monotonic ring would either blank the heatmap (oldest >\n // newest trips the xRight <= xLeft guard) or scramble the time\n // axis until the buffer rolled over.\n addSnapshot(snap: OrderBookHeatmapSnapshot): void {\n if (!isFinite(snap.time)) return;\n const last = this.snapshots[this.snapshots.length - 1];\n if (last && snap.time <= last.time) return;\n this.snapshots.push(snap);\n if (this.snapshots.length > MAX_SNAPSHOTS) {\n this.snapshots.shift();\n }\n this.snapshotGen++;\n this.dirty = true;\n }\n\n clear(): void {\n this.snapshots = [];\n this.snapshotGen++;\n this.dirty = true;\n }\n\n hoverAt(\n time: number,\n price: number,\n priceRange: readonly [number, number],\n ): OrderBookHeatmapHover | null {\n if (this.snapshots.length === 0) return null;\n if (!Number.isFinite(time) || !Number.isFinite(price)) return null;\n const oldest = this.snapshots[0];\n const newest = this.snapshots[this.snapshots.length - 1];\n if (time < oldest.time || time > newest.time) return null;\n const [p0, p1] = priceRange;\n if (!Number.isFinite(p0) || !Number.isFinite(p1) || p1 <= p0) {\n return null;\n }\n\n const span = p1 - p0;\n const bucket = Math.floor(((price - p0) / span) * PRICE_BUCKETS);\n if (bucket < 0 || bucket >= PRICE_BUCKETS) return null;\n const bucketLow = p0 + (bucket / PRICE_BUCKETS) * span;\n const bucketHigh = p0 + ((bucket + 1) / PRICE_BUCKETS) * span;\n const snap = nearestSnapshot(this.snapshots, time);\n if (!snap) return null;\n\n const bidUsd = usdInBucket(snap.bids, bucketLow, bucketHigh);\n const askUsd = usdInBucket(snap.asks, bucketLow, bucketHigh);\n const totalUsd = bidUsd + askUsd;\n if (totalUsd <= 0) return null;\n\n const side =\n bidUsd > 0 && askUsd > 0 ? \"both\" : bidUsd > 0 ? \"bid\" : \"ask\";\n return {\n time: snap.time,\n price: (bucketLow + bucketHigh) / 2,\n bucketLow,\n bucketHigh,\n bidUsd,\n askUsd,\n totalUsd,\n side,\n snapshotAgeMs: time - snap.time,\n };\n }\n\n summary(\n priceRange: readonly [number, number],\n ): OrderBookHeatmapSummary | null {\n if (this.snapshots.length === 0) return null;\n const [p0, p1] = priceRange;\n if (!Number.isFinite(p0) || !Number.isFinite(p1) || p1 <= p0) {\n return null;\n }\n\n const span = p1 - p0;\n const buckets = new Float64Array(PRICE_BUCKETS);\n let maxBucketUsd = 0;\n let visibleBucketCount = 0;\n\n for (const snap of this.snapshots) {\n buckets.fill(0);\n accumulateBuckets(snap.bids, buckets, p0, span);\n accumulateBuckets(snap.asks, buckets, p0, span);\n for (let i = 0; i < buckets.length; i++) {\n const usd = buckets[i];\n if (usd <= 0) continue;\n visibleBucketCount++;\n if (usd > maxBucketUsd) maxBucketUsd = usd;\n }\n }\n\n const newest = this.snapshots[this.snapshots.length - 1];\n const newestBidUsd = visibleUsd(newest.bids, p0, p1);\n const newestAskUsd = visibleUsd(newest.asks, p0, p1);\n\n return {\n snapshotCount: this.snapshots.length,\n oldestTime: this.snapshots[0].time,\n newestTime: newest.time,\n newestBidUsd,\n newestAskUsd,\n newestTotalUsd: newestBidUsd + newestAskUsd,\n maxBucketUsd,\n visibleBucketCount,\n };\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport } = ctx;\n if (this.snapshots.length < 2) return;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n // Clip-rect math runs before the rebin so a degenerate visible\n // span (1-snapshot ring just after clear()) returns before\n // paying the 230 KB bin + texture upload.\n const oldest = this.snapshots[0].time;\n const newest = this.snapshots[this.snapshots.length - 1].time;\n const xLeftClip = viewport.timeToClipX(oldest);\n const xRightClip = viewport.timeToClipX(newest);\n if (xRightClip <= xLeftClip) return;\n\n if (!this.cmd) this.compile(regl);\n if (!this.texture) return;\n\n // Rebuild bins only if the snapshot ring or the price range has\n // changed. Idle live-tail data:updated events that don't touch\n // either skip straight to draw.\n if (\n this.lastSnapshotGen !== this.snapshotGen ||\n this.lastP0 !== p0 ||\n this.lastP1 !== p1\n ) {\n this.rebin(p0, p1);\n this.texture.subimage(this.bins);\n this.lastSnapshotGen = this.snapshotGen;\n this.lastP0 = p0;\n this.lastP1 = p1;\n }\n\n // Snapshots fill texture columns 0..N-1; colUVRange maps the\n // quad's UV.x=0..1 onto the centers of cols 0 and N-1 so\n // linear filtering never blends the rightmost populated cell\n // with the zero tail. Without this, the newest column rendered\n // at ~50% intensity along the right edge whenever N < 720.\n const n = this.snapshots.length;\n const colUVRange: [number, number] = [\n 0.5 / MAX_SNAPSHOTS,\n (n - 0.5) / MAX_SNAPSHOTS,\n ];\n const plot = viewport.plotCss;\n const yTopClip = viewport.pxYToClipY(plot.y);\n const yBotClip = viewport.pxYToClipY(plot.y + plot.h);\n\n this.cmd!({\n clipRect: [xLeftClip, yBotClip, xRightClip, yTopClip],\n alpha: this.opts.alpha ?? 0.55,\n colUVRange,\n depth: this.texture,\n });\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.texture = null;\n this.cornerBuf = null;\n // Force texture rebuild on the next paint.\n this.lastSnapshotGen = -1;\n this.lastP0 = NaN;\n this.lastP1 = NaN;\n }\n\n dispose(): void {\n this.disposed = true;\n this.texture?.destroy();\n this.cornerBuf?.destroy();\n this.texture = null;\n this.cornerBuf = null;\n this.cmd = null;\n this.snapshots = [];\n }\n\n // Bin every snapshot's bids/asks into the priceBuckets × snapshots\n // grid. The RGBA8 layout keeps the depth in the R channel; the\n // other channels are unused (kept zero) but reserved for future\n // per-cell flags (buy/sell side, mid-marker, etc.).\n private rebin(p0: number, p1: number): void {\n const buf = this.bins;\n // Wipe the full buffer — partial updates would need a tighter\n // bookkeeping; whole-buffer fill is O(230KB) per rebuild, which\n // runs only on viewport/snapshot changes.\n buf.fill(0);\n const span = p1 - p0;\n const snaps = this.snapshots;\n const n = snaps.length;\n // Snapshots align to the rightmost columns of the texture so the\n // ring buffer's \"newest\" is at column n-1. Older snapshots in\n // the ring map to lower indices.\n for (let s = 0; s < n; s++) {\n const snap = snaps[s];\n const col = s;\n // Combine bids and asks into one pass — they share the same\n // price axis and contribute to the same bins (this is a\n // total-depth visualization, not bid-vs-ask).\n this.binSide(snap.bids, col, p0, span, buf);\n this.binSide(snap.asks, col, p0, span, buf);\n }\n }\n\n private binSide(\n side: OrderBookHeatmapLevel[],\n col: number,\n p0: number,\n span: number,\n buf: Uint8Array,\n ): void {\n for (let i = 0; i < side.length; i++) {\n const { px, sz } = side[i];\n // px > 0 rejects HL halt/settlement sentinel rows; without\n // this, a px=0 with priceRange anchored at 0 (pre-fetch boot\n // window) lands at row 0 and writes a phantom depth cell on\n // the chart bottom.\n if (!isFinite(px) || px <= 0) continue;\n if (!isFinite(sz) || sz <= 0) continue;\n const t = (px - p0) / span;\n if (t < 0 || t >= 1) continue;\n const rowIdx = Math.floor(t * PRICE_BUCKETS);\n const usd = sz * px;\n // R channel holds log-normalized depth. Multiple levels in\n // the same bucket (common under tight zoom or when bid +\n // ask straddle a bucket boundary) accumulate via saturating\n // add — sum is correct semantics; the 255 cap is a graceful\n // upper bound rather than a wraparound.\n const logV = usd > 1 ? Math.log10(usd) / LOG_MAX : 0;\n const byteVal = Math.max(\n 0,\n Math.min(255, Math.round(Math.min(1, logV) * 255)),\n );\n // Texture layout: column-major in our access pattern (we touch\n // every row of a single column). Pack as row-major so the\n // standard subimage upload works without a transpose: index =\n // (rowIdx * MAX_SNAPSHOTS + col) * 4.\n const idx = (rowIdx * MAX_SNAPSHOTS + col) * 4;\n const sum = buf[idx] + byteVal;\n buf[idx] = sum > 255 ? 255 : sum;\n }\n }\n\n private compile(regl: REGL.Regl): void {\n this.cornerBuf = regl.buffer({\n type: \"float\",\n usage: \"static\",\n data: QUAD_CORNERS,\n });\n this.texture = regl.texture({\n width: MAX_SNAPSHOTS,\n height: PRICE_BUCKETS,\n format: \"rgba\",\n type: \"uint8\",\n mag: \"linear\",\n min: \"linear\",\n wrap: \"clamp\",\n data: this.bins,\n });\n this.cmd = regl({\n vert: HEATMAP_VERT,\n frag: HEATMAP_FRAG,\n attributes: {\n aCorner: { buffer: this.cornerBuf, divisor: 0 },\n },\n uniforms: {\n uClipRect: regl.prop<Props, \"clipRect\">(\"clipRect\"),\n uAlpha: regl.prop<Props, \"alpha\">(\"alpha\"),\n uColUVRange: regl.prop<Props, \"colUVRange\">(\"colUVRange\"),\n uDepth: regl.prop<Props, \"depth\">(\"depth\"),\n },\n count: 4,\n primitive: \"triangle strip\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as Cmd;\n }\n}\n\nfunction nearestSnapshot(\n snapshots: readonly OrderBookHeatmapSnapshot[],\n time: number,\n): OrderBookHeatmapSnapshot | null {\n if (snapshots.length === 0) return null;\n let lo = 0;\n let hi = snapshots.length - 1;\n while (lo < hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (snapshots[mid].time < time) lo = mid + 1;\n else hi = mid;\n }\n const right = snapshots[lo];\n const left = lo > 0 ? snapshots[lo - 1] : null;\n if (!left) return right;\n return Math.abs(left.time - time) <= Math.abs(right.time - time)\n ? left\n : right;\n}\n\nfunction usdInBucket(\n levels: readonly OrderBookHeatmapLevel[],\n low: number,\n high: number,\n): number {\n let usd = 0;\n for (const lvl of levels) {\n if (!Number.isFinite(lvl.px) || lvl.px <= 0) continue;\n if (!Number.isFinite(lvl.sz) || lvl.sz <= 0) continue;\n if (lvl.px < low || lvl.px >= high) continue;\n usd += lvl.px * lvl.sz;\n }\n return usd;\n}\n\nfunction accumulateBuckets(\n levels: readonly OrderBookHeatmapLevel[],\n buckets: Float64Array,\n p0: number,\n span: number,\n): void {\n for (const lvl of levels) {\n if (!Number.isFinite(lvl.px) || lvl.px <= 0) continue;\n if (!Number.isFinite(lvl.sz) || lvl.sz <= 0) continue;\n const t = (lvl.px - p0) / span;\n if (t < 0 || t >= 1) continue;\n buckets[Math.floor(t * PRICE_BUCKETS)] += lvl.px * lvl.sz;\n }\n}\n\nfunction visibleUsd(\n levels: readonly OrderBookHeatmapLevel[],\n low: number,\n high: number,\n): number {\n let usd = 0;\n for (const lvl of levels) {\n if (!Number.isFinite(lvl.px) || lvl.px <= 0) continue;\n if (!Number.isFinite(lvl.sz) || lvl.sz <= 0) continue;\n if (lvl.px < low || lvl.px >= high) continue;\n usd += lvl.px * lvl.sz;\n }\n return usd;\n}\n","import type { Layer, RenderContext } from \"../core/Layer\";\nimport { TextBatch } from \"../core/TextBatch\";\n\n// On-chart legend for a sub-pane (RSI / open-interest): the indicator's\n// static label in its line colour + the live value in bright readout text,\n// pinned to the pane's top-left — the in-canvas sibling of the main pane's\n// DOM OhlcLegend, and the same dim-label / bright-value split the OHLC\n// legend's overlay rows use. Rendered through the glyph atlas (not DOM) so\n// it lives inside the pane's GL scissor, tracks the plot rect with no extra\n// layout plumbing, and hides when the pane is hidden (a hidden pane paints\n// nothing).\n//\n// The label (e.g. \"RSI 14\") is fixed at construction; ChartEngine pushes\n// just the value string via setValue() from the same hovered-bar path that\n// feeds OhlcLegend, so every readout reads one bar. An empty value paints\n// nothing — label included — during warm-up / no data / coin switch.\nexport class PaneLegendLayer implements Layer {\n readonly id: string;\n dirty = true;\n\n private value = \"\";\n private batch: TextBatch | null = null;\n private disposed = false;\n\n constructor(\n private readonly opts: {\n id: string;\n label: string;\n labelColor: [number, number, number, number];\n },\n ) {\n this.id = opts.id;\n }\n\n // Set the value drawn beside the label; \"\" hides the whole legend. Marks\n // dirty so the next frame repaints — belt-and-braces, since the hover /\n // data events that drive setValue already trigger a full scene repaint.\n setValue(value: string): void {\n if (value === this.value) return;\n this.value = value;\n this.dirty = true;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed || this.value === \"\") return;\n const { regl, viewport, glyphAtlas, theme } = ctx;\n if (!this.batch) this.batch = new TextBatch(glyphAtlas);\n if (!glyphAtlas.texture) return;\n\n const plot = viewport.plotCss;\n if (plot.w <= 0 || plot.h <= 0) return;\n\n // Top-left of the plot rect, a few CSS px in — the same corner the main\n // OHLC legend occupies, so the stacked sub-pane readouts line up beneath\n // it. Label in the line colour, value in the bright readout colour the\n // crosshair pills use, a small gap between (positioned off the label's\n // measured width, exactly as TextBatch lays it out). Full atlas size: a\n // prominent readout, not recessed chrome like the axis ticks.\n const x = plot.x + 6;\n const y = plot.y + 4;\n this.batch.reset();\n this.batch.addLabel(\n this.opts.label,\n x,\n y,\n this.opts.labelColor,\n viewport,\n \"left\",\n );\n const valueX = x + glyphAtlas.measure(this.opts.label) + 5;\n this.batch.addLabel(\n this.value,\n valueX,\n y,\n theme.crosshairLabelText,\n viewport,\n \"left\",\n );\n this.batch.flush(regl);\n }\n\n onContextLost(): void {\n this.batch?.onContextLost();\n this.batch = null;\n }\n\n dispose(): void {\n this.disposed = true;\n this.batch?.dispose();\n this.batch = null;\n }\n}\n","import type { Layer, RenderContext } from \"../core/Layer\";\nimport { TextBatch } from \"../core/TextBatch\";\nimport { formatPrice, niceStep } from \"../core/format\";\nimport { AXIS_LABEL_SCALE } from \"../core/Constants\";\n\nexport class PriceAxisLayer implements Layer {\n readonly id = \"price-axis\";\n dirty = true;\n private batch: TextBatch | null = null;\n private disposed = false;\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport, theme, glyphAtlas } = ctx;\n if (!this.batch) this.batch = new TextBatch(glyphAtlas);\n if (!glyphAtlas.texture) return;\n\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n const plot = viewport.plotCss;\n if (plot.h <= 0) return;\n\n // Dense but readable exchange-style ladder. The prior 18px cadence\n // could round BTC to 10-point ticks and visually stack labels; this\n // keeps the useful in-between prices while leaving each row room.\n const targetTicks = Math.max(6, Math.floor(plot.h / 36));\n const step = niceStep((p1 - p0) / targetTicks);\n if (step <= 0) return;\n\n const first = Math.ceil(p0 / step) * step;\n const labelXCss = plot.x + plot.w + 10;\n\n this.batch.reset();\n // Ticks whose label center would overhang the pane's scissor\n // get their LABEL clamped inward rather than skipped. The pane's\n // GL scissor stops exactly at the plot edge for non-edge panes\n // (middle panes in a 3+ stack), so an overflowing label would be\n // partially clipped — but skipping it entirely loses the most\n // diagnostic ticks (e.g., RSI's 0 and 100 sit exactly at the\n // plot edges and would otherwise vanish). Clamping pushes the\n // label a few pixels toward the plot interior; the tick value\n // still reads correctly even if the position is nudged.\n // Tick labels sit a step below the prominent on-plot readouts in the\n // type hierarchy. Centre + clamp off the label's true rendered height\n // — addLabel lays each glyph out over lineHeight (≈ fontSize × 1.3),\n // scaled — so the smaller label sits ON its tick and clears the plot\n // edge. (The prior fontSize-based offset left it ~2px low.)\n const minYLabel = plot.y;\n for (let p = first; p <= p1 + step * 0.0001; p += step) {\n const yCss = plot.y + plot.h - ((p - p0) / (p1 - p0)) * plot.h;\n const tickIndex = Math.round(p / step);\n const isMajor = ((tickIndex % 3) + 3) % 3 === 0;\n const labelScale = isMajor ? 1 : Math.min(AXIS_LABEL_SCALE, 0.82);\n const labelH = glyphAtlas.lineHeight * labelScale;\n let yLabel = yCss - labelH / 2;\n const maxYLabel = plot.y + plot.h - labelH;\n if (yLabel < minYLabel) yLabel = minYLabel;\n if (yLabel > maxYLabel) yLabel = maxYLabel;\n const label = formatPrice(p, step);\n this.batch.addLabel(\n label,\n labelXCss,\n yLabel,\n isMajor ? theme.crosshairLabelText : theme.textDim,\n viewport,\n \"left\",\n labelScale,\n );\n }\n this.batch.flush(regl);\n }\n\n onContextLost(): void {\n this.batch?.onContextLost();\n this.batch = null;\n }\n\n dispose(): void {\n this.disposed = true;\n this.batch?.dispose();\n this.batch = null;\n }\n}\n","import type { Layer, RenderContext } from \"../core/Layer\";\nimport { TextBatch } from \"../core/TextBatch\";\nimport { AXIS_LABEL_SCALE } from \"../core/Constants\";\n\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\n\n// \"Nice\" time-tick intervals, ordered. Smallest >= rough is picked so\n// labels stay spaced out instead of crowding the bottom gutter.\nconst NICE_INTERVALS = [\n SECOND,\n 5 * SECOND,\n 15 * SECOND,\n 30 * SECOND,\n MINUTE,\n 5 * MINUTE,\n 15 * MINUTE,\n 30 * MINUTE,\n HOUR,\n 2 * HOUR,\n 4 * HOUR,\n 6 * HOUR,\n 12 * HOUR,\n DAY,\n 2 * DAY,\n 7 * DAY,\n];\n\nfunction pickInterval(rough: number): number {\n for (let i = 0; i < NICE_INTERVALS.length; i++) {\n if (NICE_INTERVALS[i] >= rough) return NICE_INTERVALS[i];\n }\n return NICE_INTERVALS[NICE_INTERVALS.length - 1];\n}\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nfunction formatTick(ms: number, intervalMs: number): string {\n const d = new Date(ms);\n // For sub-day intervals, show HH:MM. For day-and-up, show MM/DD.\n if (intervalMs < DAY) {\n return `${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}`;\n }\n return `${pad2(d.getUTCMonth() + 1)}/${pad2(d.getUTCDate())}`;\n}\n\nexport class TimeAxisLayer implements Layer {\n readonly id = \"time-axis\";\n dirty = true;\n private batch: TextBatch | null = null;\n private disposed = false;\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport, theme, glyphAtlas } = ctx;\n if (!this.batch) this.batch = new TextBatch(glyphAtlas);\n if (!glyphAtlas.texture) return;\n\n const [t0, t1] = viewport.timeRange;\n if (!isFinite(t0) || !isFinite(t1) || t1 <= t0) return;\n\n const plot = viewport.plotCss;\n if (plot.w <= 0) return;\n\n // Kiyotaka-style cadence: sparse enough to scan, dense enough to\n // anchor the volume bars. Overlap prevention below is the final\n // guard for narrow panes / long labels.\n const targetTicks = Math.max(2, Math.floor(plot.w / 120));\n const interval = pickInterval((t1 - t0) / targetTicks);\n const first = Math.ceil(t0 / interval) * interval;\n\n // Labels sit just below the plot area, vertically centered in the\n // axis gutter.\n const labelYCss = plot.y + plot.h + 10;\n\n this.batch.reset();\n let lastRight = Number.NEGATIVE_INFINITY;\n const minGap = 18;\n const labelScale = AXIS_LABEL_SCALE;\n for (let t = first; t <= t1; t += interval) {\n const xCss = plot.x + ((t - t0) / (t1 - t0)) * plot.w;\n if (xCss < plot.x - 20 || xCss > plot.x + plot.w + 20) continue;\n const label = formatTick(t, interval);\n const labelW = glyphAtlas.measure(label) * labelScale;\n const left = xCss - labelW / 2;\n const right = xCss + labelW / 2;\n if (left < lastRight + minGap) continue;\n lastRight = right;\n // Smaller than the on-plot readouts — same hierarchy as the price\n // axis. Centre-anchored on the tick x; the gutter offset above\n // already leaves room for the (now shorter) label.\n this.batch.addLabel(\n label,\n xCss,\n labelYCss,\n theme.text,\n viewport,\n \"center\",\n labelScale,\n );\n }\n this.batch.flush(regl);\n }\n\n onContextLost(): void {\n this.batch?.onContextLost();\n this.batch = null;\n }\n\n dispose(): void {\n this.disposed = true;\n this.batch?.dispose();\n this.batch = null;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport {\n FOOTPRINT_FRAG,\n FOOTPRINT_VERT,\n} from \"../shaders/common\";\n\n// Minimal subset of FootprintBar (lib/hl/footprint.ts) the layer\n// actually needs. Keeps the wire shape decoupled from internal\n// rendering math.\nexport interface FootprintLevel {\n price: number;\n buyVol: number;\n sellVol: number;\n}\n\nexport interface FootprintBar {\n t: number;\n open: number;\n high: number;\n low: number;\n close: number;\n levels: FootprintLevel[];\n}\n\ntype Props = {\n instances: number;\n upColor: [number, number, number, number];\n downColor: [number, number, number, number];\n alpha: number;\n};\n\ntype Cmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\nconst QUAD_CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\nconst BODY_WIDTH_FRACTION = 0.7;\n// Don't render footprint cells when the per-bar width drops below\n// this CSS-pixel budget — cells too narrow to be readable, and the\n// instance count would balloon without visual value. The candle\n// layer still draws bodies at any zoom; this layer just disengages.\nconst MIN_BAR_WIDTH_CSS = 8;\n\n// Per-candle volume footprint overlay. Each bar contributes one cell\n// per price level in its histogram; cells are colored by buy/sell\n// dominance and modulated by per-bar intensity (the level with the\n// strongest single-side volume reaches full opacity, others fade\n// proportionally). Reuses the candle-body shader since the geometry\n// is identical (instanced quads with up/down color mix).\n//\n// Drawn AFTER the candle bodies in the main pane so footprint cells\n// overlay the candles where active — matches kiyotaka's stacking\n// when the user has the footprint indicator enabled.\nexport class VolumeFootprintLayer implements Layer {\n readonly id = \"footprint\";\n dirty = true;\n\n private bars: FootprintBar[] = [];\n // Canonical bar interval in ms — supplied by the caller (the\n // candle endpoint's interval), not estimated from bar gaps. The\n // footprint endpoint omits buckets that had zero trades, so a\n // gap-based estimate over-counts on thinly-traded coins (a 1m\n // chart with 80% empty buckets would median to ~5m and inflate\n // the half-width / cull-bound math by 5×).\n private intervalMs = 60_000;\n private cmd: Cmd | null = null;\n private cornerBuf: REGL.Buffer | null = null;\n private xCenterBuf: REGL.Buffer | null = null;\n private halfWidthBuf: REGL.Buffer | null = null;\n private bottomYBuf: REGL.Buffer | null = null;\n private topYBuf: REGL.Buffer | null = null;\n private intensityBuf: REGL.Buffer | null = null;\n\n private xCenter = new Float32Array(0);\n private halfWidth = new Float32Array(0);\n private bottomY = new Float32Array(0);\n private topY = new Float32Array(0);\n private intensity = new Float32Array(0);\n\n private disposed = false;\n\n constructor(private readonly opts: { alpha?: number } = {}) {}\n\n // Caller (ChartEngine) replaces the entire bar set on coin /\n // interval changes. Bars are expected in time-ascending order;\n // intervalMs is the canonical bar duration (matches the candle\n // endpoint's interval) used for width / cull math.\n setBars(bars: FootprintBar[], intervalMs: number): void {\n this.bars = bars;\n if (Number.isFinite(intervalMs) && intervalMs > 0) {\n this.intervalMs = intervalMs;\n }\n this.dirty = true;\n }\n\n clear(): void {\n this.bars = [];\n this.dirty = true;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n if (this.bars.length === 0) return;\n const { regl, viewport, theme } = ctx;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n const [t0, t1] = viewport.timeRange;\n if (!isFinite(t0) || !isFinite(t1) || t1 <= t0) return;\n\n // Bar width in CSS px gates visibility — footprint cells are\n // illegible below ~8 CSS px wide. Uses the canonical\n // intervalMs supplied by the caller, NOT a median-of-gaps\n // estimate (sparse-trade coins emit bars only for non-empty\n // buckets, so a gap-based median inflates by the empty-bucket\n // ratio and de-syncs from the candle layer's interval).\n const plot = viewport.plotCss;\n const intervalMs = this.intervalMs;\n const visibleBars = (t1 - t0) / intervalMs;\n if (visibleBars <= 0) return;\n const barWidthCss = plot.w / visibleBars;\n if (barWidthCss < MIN_BAR_WIDTH_CSS) return;\n\n // Cull to visible bars with one-bar overscan on either side.\n let firstVisible = -1;\n let lastVisible = -1;\n for (let i = 0; i < this.bars.length; i++) {\n const bt = this.bars[i].t;\n if (bt + intervalMs < t0) continue;\n if (bt > t1) break;\n if (firstVisible === -1) firstVisible = i;\n lastVisible = i;\n }\n if (firstVisible === -1) return;\n\n // Count cells to size the instance buffers exactly.\n let cellCount = 0;\n for (let i = firstVisible; i <= lastVisible; i++) {\n cellCount += this.bars[i].levels.length;\n }\n if (cellCount === 0) return;\n\n this.ensureCapacity(cellCount);\n if (!this.cmd) this.compile(regl);\n\n const halfSlotMs = intervalMs * 0.5;\n const timeSpan = t1 - t0;\n const halfBodyClipX = Math.max(\n (halfSlotMs / timeSpan) * 2 * BODY_WIDTH_FRACTION,\n viewport.pxWidthToClip(0.5),\n );\n\n let wrote = 0;\n for (let i = firstVisible; i <= lastVisible; i++) {\n const bar = this.bars[i];\n const levels = bar.levels;\n if (levels.length === 0) continue;\n // Per-bar normalization: the level with the strongest single-\n // side volume reaches full opacity; weaker levels fade. Keeps\n // every bar legible regardless of volatility.\n let maxSideVol = 0;\n for (const lvl of levels) {\n const m = Math.max(lvl.buyVol, lvl.sellVol);\n if (m > maxSideVol) maxSideVol = m;\n }\n if (maxSideVol <= 0) continue;\n\n // Tick = adjacent-level spacing (levels are sorted ascending\n // by price). For single-level bars the fallback caps at 1/20\n // of the bar's price range so the cell doesn't visually\n // overlay the entire candle body — and floors at a tiny\n // epsilon so a single-trade flat bar (high === low) still\n // shows a thin marker.\n let tick: number;\n if (levels.length > 1) {\n tick = Math.max(1e-9, levels[1].price - levels[0].price);\n } else {\n const range = Math.max(0, bar.high - bar.low);\n tick = Math.max(1e-9, range > 0 ? range / 20 : 1e-9);\n }\n const halfTickClipY =\n Math.abs(viewport.priceToClipY(0) - viewport.priceToClipY(tick * 0.5));\n\n const xc = viewport.timeToClipX(bar.t);\n\n for (let j = 0; j < levels.length; j++) {\n const lvl = levels[j];\n if (!isFinite(lvl.price)) continue;\n const yCenter = viewport.priceToClipY(lvl.price);\n // Cull against the EXTENT (center ± halfTick) so cells\n // whose centers sit just outside clip space but whose\n // edges reach inside still render. Without the\n // half-tick widening, the topmost/bottommost levels in\n // a panned price viewport disappear entirely instead of\n // being partial-clipped by the GL scissor.\n if (\n yCenter + halfTickClipY < -1.0 ||\n yCenter - halfTickClipY > 1.0\n ) {\n continue;\n }\n\n const dominant = lvl.buyVol >= lvl.sellVol;\n // Intensity is the dominant side's share of the bar's\n // single-side max. Threshold filters truly noise-level\n // cells; lowered from 4% to 1% so the support/resistance\n // shoulders around a POC (commonly 1-3% intensity when\n // the POC is 100x larger than its neighbours) stay\n // visible — they're the signal footprint analysis is\n // built around.\n const intensity =\n Math.max(lvl.buyVol, lvl.sellVol) / maxSideVol;\n if (intensity < 0.01) continue;\n\n this.xCenter[wrote] = xc;\n this.halfWidth[wrote] = halfBodyClipX;\n this.bottomY[wrote] = yCenter - halfTickClipY;\n this.topY[wrote] = yCenter + halfTickClipY;\n // Signed intensity: positive → up color, negative → down.\n // Shader reads abs() for alpha modulation.\n this.intensity[wrote] = dominant ? intensity : -intensity;\n wrote++;\n }\n }\n\n if (wrote === 0) return;\n\n this.xCenterBuf!.subdata(this.xCenter.subarray(0, wrote));\n this.halfWidthBuf!.subdata(this.halfWidth.subarray(0, wrote));\n this.bottomYBuf!.subdata(this.bottomY.subarray(0, wrote));\n this.topYBuf!.subdata(this.topY.subarray(0, wrote));\n this.intensityBuf!.subdata(this.intensity.subarray(0, wrote));\n\n this.cmd!({\n instances: wrote,\n upColor: theme.candleUp,\n downColor: theme.candleDown,\n alpha: this.opts.alpha ?? 0.75,\n });\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.bottomYBuf = null;\n this.topYBuf = null;\n this.intensityBuf = null;\n this.xCenter = new Float32Array(0);\n }\n\n dispose(): void {\n this.disposed = true;\n this.cornerBuf?.destroy();\n this.xCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.bottomYBuf?.destroy();\n this.topYBuf?.destroy();\n this.intensityBuf?.destroy();\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.bottomYBuf = null;\n this.topYBuf = null;\n this.intensityBuf = null;\n this.cmd = null;\n this.bars = [];\n }\n\n private ensureCapacity(n: number): void {\n if (n <= this.xCenter.length) return;\n let cap = Math.max(this.xCenter.length, 256);\n while (cap < n) cap *= 2;\n this.xCenter = new Float32Array(cap);\n this.halfWidth = new Float32Array(cap);\n this.bottomY = new Float32Array(cap);\n this.topY = new Float32Array(cap);\n this.intensity = new Float32Array(cap);\n this.xCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.bottomYBuf?.destroy();\n this.topYBuf?.destroy();\n this.intensityBuf?.destroy();\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.bottomYBuf = null;\n this.topYBuf = null;\n this.intensityBuf = null;\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n this.cornerBuf = regl.buffer({\n type: \"float\",\n usage: \"static\",\n data: QUAD_CORNERS,\n });\n const dynamic = (size: number) =>\n regl.buffer({ type: \"float\", usage: \"dynamic\", length: size * 4 });\n const cap = Math.max(this.xCenter.length, 256);\n this.xCenterBuf = dynamic(cap);\n this.halfWidthBuf = dynamic(cap);\n this.bottomYBuf = dynamic(cap);\n this.topYBuf = dynamic(cap);\n this.intensityBuf = dynamic(cap);\n\n this.cmd = regl({\n vert: FOOTPRINT_VERT,\n frag: FOOTPRINT_FRAG,\n attributes: {\n aCorner: { buffer: this.cornerBuf, divisor: 0 },\n aXCenter: { buffer: this.xCenterBuf, divisor: 1 },\n aHalfWidth: { buffer: this.halfWidthBuf, divisor: 1 },\n aBottomY: { buffer: this.bottomYBuf, divisor: 1 },\n aTopY: { buffer: this.topYBuf, divisor: 1 },\n aIntensity: { buffer: this.intensityBuf, divisor: 1 },\n },\n uniforms: {\n uUpColor: regl.prop<Props, \"upColor\">(\"upColor\"),\n uDownColor: regl.prop<Props, \"downColor\">(\"downColor\"),\n uAlpha: regl.prop<Props, \"alpha\">(\"alpha\"),\n },\n count: 4,\n instances: regl.prop<Props, \"instances\">(\"instances\"),\n primitive: \"triangle strip\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as Cmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport type { DataStore } from \"../core/DataStore\";\nimport {\n CANDLE_BODY_FRAG,\n CANDLE_BODY_VERT,\n} from \"../shaders/common\";\n\ntype Props = {\n instances: number;\n upColor: [number, number, number, number];\n downColor: [number, number, number, number];\n};\n\ntype Cmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\nconst QUAD_CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\nconst BODY_WIDTH_FRACTION = 0.7;\nconst LIVE_VOLUME_ANIM_MS = 180;\n\ninterface LiveVolumeAnim {\n time: number;\n startMs: number;\n from: number;\n to: number;\n}\n\n// Volume bars rendered in the volume sub-pane. Each bar sits at a\n// candle's x-center, spans the median candle gap × 70% in width, and\n// extends from the pane's bottom up to a height proportional to the\n// candle's volume relative to the visible-window max. Reuses the\n// candle-body shader — same instanced-quad geometry, just sourced\n// from `volume[]` instead of OHLC.\n//\n// The pane's viewport priceRange is fixed at [0, 1]; this layer\n// normalizes volume into that range and lets the pane's plot rect\n// place the bars correctly inside its allotted vertical slice.\nexport class VolumeLayer implements Layer {\n readonly id = \"volume\";\n dirty = true;\n\n private cmd: Cmd | null = null;\n private cornerBuf: REGL.Buffer | null = null;\n private xCenterBuf: REGL.Buffer | null = null;\n private halfWidthBuf: REGL.Buffer | null = null;\n private openYBuf: REGL.Buffer | null = null;\n private closeYBuf: REGL.Buffer | null = null;\n private isUpBuf: REGL.Buffer | null = null;\n\n private xCenter = new Float32Array(0);\n private halfWidth = new Float32Array(0);\n private openY = new Float32Array(0);\n private closeY = new Float32Array(0);\n private isUp = new Float32Array(0);\n\n private disposed = false;\n private liveAnim: LiveVolumeAnim | null = null;\n\n constructor(private readonly store: DataStore) {}\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const { regl, viewport, theme } = ctx;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n const b = this.store.candles;\n if (b.length < 2) return;\n\n const [t0, t1] = viewport.timeRange;\n let i0 = this.store.firstIndexAtOrAfter(t0) - 1;\n let i1 = this.store.firstIndexAtOrAfter(t1) + 1;\n if (i0 < 0) i0 = 0;\n if (i1 > b.length) i1 = b.length;\n const n = i1 - i0;\n if (n <= 0) return;\n\n // Max finite positive volume in the visible window — normalizes\n // bar heights so the tallest bar reaches the top of the pane's\n // plot rect. NaN comparisons are always false so a NaN volume\n // would slip past `v > maxV` but still pollute the draw loop\n // below; we filter explicitly per candle.\n let maxV = 0;\n for (let k = 0; k < n; k++) {\n const v = b.volume[i0 + k];\n if (isFinite(v) && v > maxV) maxV = v;\n }\n if (maxV <= 0) return;\n\n this.ensureCapacity(n);\n if (!this.cmd) this.compile(regl);\n\n const intervalMs = this.estimateInterval(b.time, i0, i1);\n const halfSlotMs = intervalMs * 0.5;\n const timeSpan = viewport.timeRange[1] - viewport.timeRange[0];\n const halfBodyClipX = Math.max(\n (halfSlotMs / timeSpan) * 2 * BODY_WIDTH_FRACTION,\n viewport.pxWidthToClip(0.5),\n );\n\n // Map bar heights against the pane's PLOT RECT directly rather\n // than its priceRange. This pins the bars to the pane's allotted\n // vertical slice even if the viewport's price scale is mutated\n // by an interaction (shift-wheel zoom would otherwise shift the\n // bars vertically and add visual noise).\n const plot = viewport.plotCss;\n const bottomY = viewport.pxYToClipY(plot.y + plot.h);\n const topYAtFullScale = viewport.pxYToClipY(plot.y);\n const heightClip = topYAtFullScale - bottomY;\n\n let wrote = 0;\n for (let k = 0; k < n; k++) {\n const idx = i0 + k;\n const t = b.time[idx];\n const o = b.open[idx];\n const c = b.close[idx];\n let v = b.volume[idx];\n // Skip non-finite or zero/negative volumes — NaN would\n // propagate into closeY and produce a NaN gl_Position the\n // GPU treats as undefined.\n if (!isFinite(v) || v <= 0 || !isFinite(t) || !isFinite(o) || !isFinite(c)) {\n continue;\n }\n if (idx === b.length - 1) {\n v = this.liveVolume(t, v);\n }\n\n const xc = viewport.timeToClipX(t);\n const topY = bottomY + heightClip * (v / maxV);\n const up = c >= o ? 1 : 0;\n\n this.xCenter[wrote] = xc;\n this.halfWidth[wrote] = halfBodyClipX;\n this.openY[wrote] = bottomY;\n this.closeY[wrote] = topY;\n this.isUp[wrote] = up;\n wrote++;\n }\n\n if (wrote === 0) return;\n\n this.xCenterBuf!.subdata(this.xCenter.subarray(0, wrote));\n this.halfWidthBuf!.subdata(this.halfWidth.subarray(0, wrote));\n this.openYBuf!.subdata(this.openY.subarray(0, wrote));\n this.closeYBuf!.subdata(this.closeY.subarray(0, wrote));\n this.isUpBuf!.subdata(this.isUp.subarray(0, wrote));\n\n this.cmd!({\n instances: wrote,\n upColor: theme.volUp,\n downColor: theme.volDown,\n });\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.openYBuf = null;\n this.closeYBuf = null;\n this.isUpBuf = null;\n this.xCenter = new Float32Array(0);\n }\n\n dispose(): void {\n this.disposed = true;\n this.cornerBuf?.destroy();\n this.xCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.openYBuf?.destroy();\n this.closeYBuf?.destroy();\n this.isUpBuf?.destroy();\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.openYBuf = null;\n this.closeYBuf = null;\n this.isUpBuf = null;\n this.cmd = null;\n }\n\n private estimateInterval(time: Float64Array, i0: number, i1: number): number {\n if (i1 - i0 < 2) return 60_000;\n const gaps: number[] = [];\n for (let i = Math.max(i0, 1); i < i1; i++) {\n const g = time[i] - time[i - 1];\n if (g > 0) gaps.push(g);\n }\n if (gaps.length === 0) return 60_000;\n gaps.sort((a, b) => a - b);\n return gaps[Math.floor(gaps.length / 2)];\n }\n\n private liveVolume(time: number, volume: number): number {\n const now =\n typeof performance !== \"undefined\" ? performance.now() : Date.now();\n const current = this.liveAnim;\n if (!current || current.time !== time) {\n this.liveAnim = { time, startMs: now, from: 0, to: volume };\n } else if (current.to !== volume) {\n const from = this.sampleLiveVolume(current, now);\n this.liveAnim = { time, startMs: now, from, to: volume };\n }\n\n const anim = this.liveAnim;\n if (!anim) return volume;\n const sampled = this.sampleLiveVolume(anim, now);\n if (now - anim.startMs < LIVE_VOLUME_ANIM_MS) {\n this.dirty = true;\n }\n return sampled;\n }\n\n private sampleLiveVolume(anim: LiveVolumeAnim, now: number): number {\n const t = Math.min(1, Math.max(0, (now - anim.startMs) / LIVE_VOLUME_ANIM_MS));\n const e = 1 - Math.pow(1 - t, 3);\n return anim.from + (anim.to - anim.from) * e;\n }\n\n private ensureCapacity(n: number): void {\n if (n <= this.xCenter.length) return;\n let cap = Math.max(this.xCenter.length, 64);\n while (cap < n) cap *= 2;\n this.xCenter = new Float32Array(cap);\n this.halfWidth = new Float32Array(cap);\n this.openY = new Float32Array(cap);\n this.closeY = new Float32Array(cap);\n this.isUp = new Float32Array(cap);\n this.xCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.openYBuf?.destroy();\n this.closeYBuf?.destroy();\n this.isUpBuf?.destroy();\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.openYBuf = null;\n this.closeYBuf = null;\n this.isUpBuf = null;\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n this.cornerBuf = regl.buffer({\n type: \"float\",\n usage: \"static\",\n data: QUAD_CORNERS,\n });\n const dynamic = (size: number) =>\n regl.buffer({ type: \"float\", usage: \"dynamic\", length: size * 4 });\n const cap = Math.max(this.xCenter.length, 64);\n this.xCenterBuf = dynamic(cap);\n this.halfWidthBuf = dynamic(cap);\n this.openYBuf = dynamic(cap);\n this.closeYBuf = dynamic(cap);\n this.isUpBuf = dynamic(cap);\n\n this.cmd = regl({\n vert: CANDLE_BODY_VERT,\n frag: CANDLE_BODY_FRAG,\n attributes: {\n aCorner: { buffer: this.cornerBuf, divisor: 0 },\n aXCenter: { buffer: this.xCenterBuf, divisor: 1 },\n aHalfWidth: { buffer: this.halfWidthBuf, divisor: 1 },\n aOpenY: { buffer: this.openYBuf, divisor: 1 },\n aCloseY: { buffer: this.closeYBuf, divisor: 1 },\n aIsUp: { buffer: this.isUpBuf, divisor: 1 },\n },\n uniforms: {\n uUpColor: regl.prop<Props, \"upColor\">(\"upColor\"),\n uDownColor: regl.prop<Props, \"downColor\">(\"downColor\"),\n },\n count: 4,\n instances: regl.prop<Props, \"instances\">(\"instances\"),\n primitive: \"triangle strip\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as Cmd;\n }\n}\n","import type REGL from \"regl\";\nimport type { Layer, RenderContext } from \"../core/Layer\";\nimport {\n FOOTPRINT_FRAG,\n FOOTPRINT_VERT,\n} from \"../shaders/common\";\n\n// Subset of lib/hl/volumeProfile.ts's VolumeProfileResult that the\n// layer needs — keeps the wire shape decoupled from rendering.\nexport interface VolumeProfileBin {\n px: number;\n totalUsd: number;\n}\n\nexport interface VolumeProfileSnapshot {\n bins: VolumeProfileBin[];\n /** Bin width in price units — both edges of each bin sit ± binWidth/2. */\n binWidth: number;\n /** Inclusive value-area bounds. Bins in [val, vah] render at full\n * intensity; bins outside fade. */\n val: number;\n vah: number;\n}\n\ntype Props = {\n instances: number;\n upColor: [number, number, number, number];\n downColor: [number, number, number, number];\n alpha: number;\n};\n\ntype Cmd = REGL.DrawCommand<REGL.DefaultContext, Props>;\n\nconst QUAD_CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n\n// Visible Range Volume Profile (VRVP). Renders a horizontal histogram\n// at the right edge of the plot — each price-bin's bar length is\n// proportional to its share of the visible-window's total volume,\n// and value-area bins use the up color while outside-VA bins use a\n// muted down color. POC / VAH / VAL price lines are rendered as a\n// sibling HorizontalLineLayer (wired by ChartEngine).\n//\n// The profile is precomputed by the caller via lib/hl/volumeProfile\n// and pushed wholesale through setProfile() — no per-paint compute,\n// since the bins only change on coin/interval shifts.\nexport class VolumeProfileLayer implements Layer {\n readonly id = \"volume-profile\";\n dirty = true;\n\n private snapshot: VolumeProfileSnapshot | null = null;\n private cmd: Cmd | null = null;\n private cornerBuf: REGL.Buffer | null = null;\n private xCenterBuf: REGL.Buffer | null = null;\n private halfWidthBuf: REGL.Buffer | null = null;\n private bottomYBuf: REGL.Buffer | null = null;\n private topYBuf: REGL.Buffer | null = null;\n private intensityBuf: REGL.Buffer | null = null;\n\n private xCenter = new Float32Array(0);\n private halfWidth = new Float32Array(0);\n private bottomY = new Float32Array(0);\n private topY = new Float32Array(0);\n private intensity = new Float32Array(0);\n\n private disposed = false;\n\n // Fraction of the plot width the histogram occupies on the right.\n // Default 0.2 = ~20% of plot width — wide enough to read at\n // typical zoom, narrow enough that candles still dominate.\n private readonly widthFraction: number;\n\n constructor(opts: { alpha?: number; widthFraction?: number } = {}) {\n this.widthFraction = opts.widthFraction ?? 0.2;\n this.alpha = opts.alpha ?? 0.55;\n }\n\n private alpha: number;\n\n setProfile(snapshot: VolumeProfileSnapshot): void {\n this.snapshot = snapshot;\n this.dirty = true;\n }\n\n clear(): void {\n this.snapshot = null;\n this.dirty = true;\n }\n\n paint(ctx: RenderContext): void {\n if (this.disposed) return;\n const snap = this.snapshot;\n if (!snap || snap.bins.length === 0) return;\n\n const { regl, viewport, theme } = ctx;\n if (viewport.width === 0 || viewport.height === 0) return;\n\n const [p0, p1] = viewport.priceRange;\n if (!isFinite(p0) || !isFinite(p1) || p1 <= p0) return;\n\n const bins = snap.bins;\n const n = bins.length;\n // Grow scratch arrays + nullify buffers BEFORE compile so the\n // command is built against the resized buffers. Reversed order\n // would compile against the still-zero-length arrays at cap=128,\n // then ensureCapacity would destroy those buffers, leaving the\n // subsequent subdata() calls dereferencing null.\n this.ensureCapacity(n);\n if (!this.cmd) this.compile(regl);\n\n // Max volume drives the per-bin bar length normalization. Empty\n // profile (all bins zero) is a no-op since maxTotal stays 0 and\n // the intensity threshold below filters every bin.\n let maxTotal = 0;\n for (const b of bins) {\n if (b.totalUsd > maxTotal) maxTotal = b.totalUsd;\n }\n if (maxTotal <= 0) return;\n\n // Histogram occupies the rightmost `widthFraction` of the plot.\n // Bars extend leftward from the right edge; longer bar = more\n // volume. Bar rightmost x is plot.x + plot.w; leftmost x sits\n // at plot.x + plot.w - widthBudgetCss × (volume / maxTotal).\n const plot = viewport.plotCss;\n const widthBudgetCss = plot.w * this.widthFraction;\n const rightCss = plot.x + plot.w;\n const xRightClip = viewport.pxXToClipX(rightCss);\n\n // Half-bin price height in clip Y. Independent of the bin's\n // absolute price (priceToClipY is linear), so we compute once\n // from the price-zero baseline. Floor at half a device pixel\n // so bars don't sub-pixel-vanish on wide price viewports\n // (binWidth/range becomes sub-pixel when zoomed out across\n // hundreds of percent of price action).\n const halfBinClipY = Math.max(\n Math.abs(\n viewport.priceToClipY(0) - viewport.priceToClipY(snap.binWidth * 0.5),\n ),\n viewport.pxHeightToClip(0.5),\n );\n\n let wrote = 0;\n for (let i = 0; i < n; i++) {\n const bin = bins[i];\n if (!isFinite(bin.px) || !isFinite(bin.totalUsd)) continue;\n const yCenter = viewport.priceToClipY(bin.px);\n // Cull bars whose extent falls fully outside clip space.\n if (\n yCenter + halfBinClipY < -1.0 ||\n yCenter - halfBinClipY > 1.0\n ) {\n continue;\n }\n\n const intensityRaw = bin.totalUsd / maxTotal;\n if (intensityRaw < 0.01) continue;\n // bar length in CSS px → bar half-width in clip x\n const barWidthCss = widthBudgetCss * intensityRaw;\n if (barWidthCss <= 0) continue;\n const halfWidthClipX = viewport.pxWidthToClip(barWidthCss) * 0.5;\n // Center x = rightmost x − halfWidth (bar's right edge sits at\n // the plot's right edge regardless of length).\n const xCenterClip = xRightClip - halfWidthClipX;\n\n const inValueArea = bin.px >= snap.val && bin.px <= snap.vah;\n // FOOTPRINT_FRAG uses sign of intensity to pick up vs down\n // color, magnitude for alpha. In-VA bins → up color full\n // intensity; outside-VA bins → down color at 50% to mute\n // them visually.\n const signedIntensity = inValueArea\n ? intensityRaw\n : -intensityRaw * 0.5;\n\n this.xCenter[wrote] = xCenterClip;\n this.halfWidth[wrote] = halfWidthClipX;\n this.bottomY[wrote] = yCenter - halfBinClipY;\n this.topY[wrote] = yCenter + halfBinClipY;\n this.intensity[wrote] = signedIntensity;\n wrote++;\n }\n\n if (wrote === 0) return;\n\n this.xCenterBuf!.subdata(this.xCenter.subarray(0, wrote));\n this.halfWidthBuf!.subdata(this.halfWidth.subarray(0, wrote));\n this.bottomYBuf!.subdata(this.bottomY.subarray(0, wrote));\n this.topYBuf!.subdata(this.topY.subarray(0, wrote));\n this.intensityBuf!.subdata(this.intensity.subarray(0, wrote));\n\n // In-VA bins (positive intensity) use theme.text — the bright\n // neutral. Outside-VA bins (negative intensity) use textDim\n // so the value-area boundary reads as a real visual break,\n // not just alpha attenuation. Passing identical colors would\n // collapse the sign-based shader branch to a no-op.\n const va: [number, number, number, number] = [\n theme.text[0],\n theme.text[1],\n theme.text[2],\n 1,\n ];\n const outside: [number, number, number, number] = [\n theme.textDim[0],\n theme.textDim[1],\n theme.textDim[2],\n 1,\n ];\n this.cmd!({\n instances: wrote,\n upColor: va,\n downColor: outside,\n alpha: this.alpha,\n });\n }\n\n onContextLost(): void {\n this.cmd = null;\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.bottomYBuf = null;\n this.topYBuf = null;\n this.intensityBuf = null;\n // Reset ALL scratch arrays together — leaving any of them at\n // their prior length while xCenter is empty would let\n // ensureCapacity see inconsistent capacities on the next paint\n // (xCenter.length=0 forces growth, the others stay larger →\n // arithmetic against the wrong cap).\n this.xCenter = new Float32Array(0);\n this.halfWidth = new Float32Array(0);\n this.bottomY = new Float32Array(0);\n this.topY = new Float32Array(0);\n this.intensity = new Float32Array(0);\n }\n\n dispose(): void {\n this.disposed = true;\n this.cornerBuf?.destroy();\n this.xCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.bottomYBuf?.destroy();\n this.topYBuf?.destroy();\n this.intensityBuf?.destroy();\n this.cornerBuf = null;\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.bottomYBuf = null;\n this.topYBuf = null;\n this.intensityBuf = null;\n this.cmd = null;\n this.snapshot = null;\n }\n\n private ensureCapacity(n: number): void {\n if (n <= this.xCenter.length) return;\n let cap = Math.max(this.xCenter.length, 128);\n while (cap < n) cap *= 2;\n this.xCenter = new Float32Array(cap);\n this.halfWidth = new Float32Array(cap);\n this.bottomY = new Float32Array(cap);\n this.topY = new Float32Array(cap);\n this.intensity = new Float32Array(cap);\n this.xCenterBuf?.destroy();\n this.halfWidthBuf?.destroy();\n this.bottomYBuf?.destroy();\n this.topYBuf?.destroy();\n this.intensityBuf?.destroy();\n this.xCenterBuf = null;\n this.halfWidthBuf = null;\n this.bottomYBuf = null;\n this.topYBuf = null;\n this.intensityBuf = null;\n this.cmd = null;\n }\n\n private compile(regl: REGL.Regl): void {\n this.cornerBuf = regl.buffer({\n type: \"float\",\n usage: \"static\",\n data: QUAD_CORNERS,\n });\n const dynamic = (size: number) =>\n regl.buffer({ type: \"float\", usage: \"dynamic\", length: size * 4 });\n const cap = Math.max(this.xCenter.length, 128);\n this.xCenterBuf = dynamic(cap);\n this.halfWidthBuf = dynamic(cap);\n this.bottomYBuf = dynamic(cap);\n this.topYBuf = dynamic(cap);\n this.intensityBuf = dynamic(cap);\n\n this.cmd = regl({\n vert: FOOTPRINT_VERT,\n frag: FOOTPRINT_FRAG,\n attributes: {\n aCorner: { buffer: this.cornerBuf, divisor: 0 },\n aXCenter: { buffer: this.xCenterBuf, divisor: 1 },\n aHalfWidth: { buffer: this.halfWidthBuf, divisor: 1 },\n aBottomY: { buffer: this.bottomYBuf, divisor: 1 },\n aTopY: { buffer: this.topYBuf, divisor: 1 },\n aIntensity: { buffer: this.intensityBuf, divisor: 1 },\n },\n uniforms: {\n uUpColor: regl.prop<Props, \"upColor\">(\"upColor\"),\n uDownColor: regl.prop<Props, \"downColor\">(\"downColor\"),\n uAlpha: regl.prop<Props, \"alpha\">(\"alpha\"),\n },\n count: 4,\n instances: regl.prop<Props, \"instances\">(\"instances\"),\n primitive: \"triangle strip\",\n depth: { enable: false },\n blend: {\n enable: true,\n func: { src: \"src alpha\", dst: \"one minus src alpha\" },\n },\n }) as Cmd;\n }\n}\n","// Data transport contract for embedders. The engine core stays\n// venue-agnostic — a host supplies a DataFeed that knows how to fetch\n// candle history and stream live updates for whatever venue / backend it\n// targets. `createChart(...).setData(feed)` and DataStore's injected\n// RangeFetcher both consume this shape.\n\nimport type { FootprintBar } from \"../layers/VolumeFootprintLayer\";\nimport type { VolumeProfileSnapshot } from \"../layers/VolumeProfileLayer\";\nimport type { OrderBookHeatmapSnapshot } from \"../layers/OrderBookHeatmapLayer\";\nimport type { MarkerSpec } from \"../layers/MarkerLayer\";\nimport type { OhlcvColumns } from \"../core/DataStore\";\n\nexport interface Candle {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\nexport interface CandleRange {\n symbol: string;\n resolution: string;\n from: number;\n to: number;\n}\n\nexport interface FeedUpdate {\n symbol: string;\n price: number;\n size: number;\n time: number;\n side?: \"buy\" | \"sell\";\n}\n\nexport type Unsubscribe = () => void;\n\nexport interface DataFeed {\n fetchCandles(range: CandleRange): Promise<Candle[]>;\n fetchCandlesColumns?(range: CandleRange): Promise<OhlcvColumns>;\n subscribe(\n symbol: string,\n resolution: string,\n onUpdate: (u: FeedUpdate) => void,\n ): Unsubscribe;\n subscribeOrderBook?(\n symbol: string,\n onBook: (b: OrderBookHeatmapSnapshot) => void,\n ): Unsubscribe;\n fetchFootprint?(\n symbol: string,\n opts: { resolution: string; from: number; to: number; intervalMs: number },\n ): Promise<FootprintBar[]>;\n fetchVolumeProfile?(\n symbol: string,\n opts: { resolution: string; from: number; to: number; intervalMs: number },\n ): Promise<VolumeProfileSnapshot>;\n subscribeMarkers?(\n symbol: string,\n onMarkers: (m: MarkerSpec[] | { buys?: MarkerSpec[]; sells?: MarkerSpec[] }) => void,\n ): Unsubscribe;\n}\n\nconst isDev =\n typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\";\n\n// Identity wrapper that, in dev, asserts the required methods are present\n// and callable. Returns the impl unchanged so there's no runtime wrapping\n// cost in production. Surfaces \"you forgot fetchCandles/subscribe\" at feed\n// construction instead of as a cryptic crash on first data load.\nexport function createDataFeed(impl: DataFeed): DataFeed {\n if (isDev) {\n if (typeof impl?.fetchCandles !== \"function\") {\n throw new Error(\"createDataFeed: impl.fetchCandles must be a function\");\n }\n if (typeof impl?.subscribe !== \"function\") {\n throw new Error(\"createDataFeed: impl.subscribe must be a function\");\n }\n }\n return impl;\n}\n\n// Build one DataFeed that routes each capability to a different source:\n// candle history + live trades from `candles`, depth from `orderbook`,\n// per-bar footprint histograms from `footprint`. Any method whose backing\n// source is missing throws a clear error when called (rather than failing\n// the whole compose up-front) so a host that only needs candles can omit\n// the rest.\nexport function composeFeeds(parts: {\n candles?: DataFeed;\n orderbook?: DataFeed;\n footprint?: DataFeed;\n volumeProfile?: DataFeed;\n markers?: DataFeed;\n}): DataFeed {\n const need = <T extends keyof DataFeed>(\n source: DataFeed | undefined,\n role: string,\n method: T,\n ): NonNullable<DataFeed[T]> => {\n if (!source || typeof source[method] !== \"function\") {\n throw new Error(\n `composeFeeds: no \"${role}\" source provides ${String(method)}()`,\n );\n }\n return source[method] as NonNullable<DataFeed[T]>;\n };\n\n const out: DataFeed = {\n fetchCandles: (range) =>\n need(parts.candles, \"candles\", \"fetchCandles\").call(\n parts.candles,\n range,\n ),\n subscribe: (symbol, resolution, onUpdate) =>\n need(parts.candles, \"candles\", \"subscribe\").call(\n parts.candles,\n symbol,\n resolution,\n onUpdate,\n ),\n subscribeOrderBook: (symbol, onBook) =>\n need(parts.orderbook, \"orderbook\", \"subscribeOrderBook\").call(\n parts.orderbook,\n symbol,\n onBook,\n ),\n fetchFootprint: (symbol, opts) =>\n need(parts.footprint, \"footprint\", \"fetchFootprint\").call(\n parts.footprint,\n symbol,\n opts,\n ),\n fetchVolumeProfile: (symbol, opts) =>\n need(parts.volumeProfile, \"volumeProfile\", \"fetchVolumeProfile\").call(\n parts.volumeProfile,\n symbol,\n opts,\n ),\n subscribeMarkers: (symbol, onMarkers) =>\n need(parts.markers, \"markers\", \"subscribeMarkers\").call(\n parts.markers,\n symbol,\n onMarkers,\n ),\n };\n if (parts.candles?.fetchCandlesColumns) {\n out.fetchCandlesColumns = (range) =>\n need(parts.candles, \"candles\", \"fetchCandlesColumns\").call(\n parts.candles,\n range,\n );\n }\n return out;\n}\n","// Declarative indicator authoring for embedders. `defineIndicator` turns\n// a typed definition (params + a pure compute) into a factory that\n// produces ready-to-attach instances; `getControls` derives a UI control\n// list from an instance so a host can render a settings panel without\n// knowing the indicator's internals. Pure — no engine import needed.\n\nexport type ParamSpec =\n | {\n type: \"number\";\n label: string;\n default: number;\n min?: number;\n max?: number;\n step?: number;\n }\n | { type: \"int\"; label: string; default: number; min?: number; max?: number }\n | { type: \"bool\"; label: string; default: boolean }\n | { type: \"color\"; label: string; default: string }\n | {\n type: \"select\";\n label: string;\n default: string;\n options: { value: string; label: string }[];\n };\n\nexport type ParamValues<P extends Record<string, ParamSpec>> = {\n [K in keyof P]: P[K] extends { type: \"bool\" }\n ? boolean\n : P[K] extends { type: \"color\" | \"select\" }\n ? string\n : number;\n};\n\nexport interface PlotLine {\n id: string;\n data: number[];\n color?: string;\n lineWidth?: number;\n}\n\nexport interface IndicatorResult {\n lines: PlotLine[];\n histogram?: number[];\n bands?: [number, number][];\n}\n\nexport interface CandleView {\n readonly time: Float64Array | number[];\n readonly open: Float64Array | number[];\n readonly high: Float64Array | number[];\n readonly low: Float64Array | number[];\n readonly close: Float64Array | number[];\n readonly volume: Float64Array | number[];\n readonly length: number;\n}\n\nexport interface IndicatorDefinition<P extends Record<string, ParamSpec>> {\n name: string;\n overlay: boolean;\n params: P;\n compute(candles: CandleView, params: ParamValues<P>): IndicatorResult;\n}\n\nexport interface IndicatorInstance {\n name: string;\n overlay: boolean;\n params: Record<string, ParamSpec>;\n values: Record<string, unknown>;\n compute(candles: CandleView): IndicatorResult;\n}\n\nexport interface ControlDescriptor {\n key: string;\n kind: string;\n label: string;\n value: unknown;\n min?: number;\n max?: number;\n step?: number;\n options?: { value: string; label: string }[];\n}\n\n// Pull the default value out of each ParamSpec — the seed for an\n// instance's `values` before any override is applied.\nfunction defaultsOf<P extends Record<string, ParamSpec>>(\n params: P,\n): ParamValues<P> {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(params)) {\n out[key] = params[key].default;\n }\n return out as ParamValues<P>;\n}\n\n// Turn a definition into an instance factory. Each produced instance\n// resolves param defaults, merges the caller's overrides, and binds\n// `compute` so the host just calls `inst.compute(candleView)`.\nexport function defineIndicator<P extends Record<string, ParamSpec>>(\n def: IndicatorDefinition<P>,\n): (overrides?: Partial<ParamValues<P>>) => IndicatorInstance {\n return (overrides) => {\n const values = { ...defaultsOf(def.params), ...(overrides ?? {}) };\n return {\n name: def.name,\n overlay: def.overlay,\n params: def.params,\n values,\n compute: (candles: CandleView) =>\n def.compute(candles, values as ParamValues<P>),\n };\n };\n}\n\n// Derive a flat list of UI controls from an instance: one per param,\n// carrying the current value plus the spec's bounds / options so a host\n// can render the right widget (slider / number / toggle / color / select).\nexport function getControls(inst: IndicatorInstance): ControlDescriptor[] {\n return Object.keys(inst.params).map((key) => {\n const spec = inst.params[key];\n const base: ControlDescriptor = {\n key,\n kind: spec.type,\n label: spec.label,\n value: inst.values[key],\n };\n if (spec.type === \"number\") {\n base.min = spec.min;\n base.max = spec.max;\n base.step = spec.step;\n } else if (spec.type === \"int\") {\n base.min = spec.min;\n base.max = spec.max;\n base.step = 1;\n } else if (spec.type === \"select\") {\n base.options = spec.options;\n }\n return base;\n });\n}\n","// White-label theming for embedders. The engine renders against the\n// `ChartTheme` tuple format (RGBA channels 0..1) defined in core/Theme.ts;\n// this module lets a host describe a palette in plain hex tokens and\n// resolve it to that format, on top of a dark or light base. It's a strict\n// superset of the engine theme — every ChartTheme field is always\n// populated, tokens only override the subset a host cares about.\n\nimport { darkTheme, type ChartTheme, type RGBA } from \"../core/Theme\";\n\nexport interface ThemeTokens {\n background?: string;\n text?: string;\n grid?: string;\n border?: string;\n candleUp?: string;\n candleDown?: string;\n volumeUp?: string;\n volumeDown?: string;\n crosshair?: string;\n fontFamily?: string;\n palette?: Record<string, string>;\n}\n\n// hex (#rrggbb) → engine RGBA tuple. Mirrors the private helper in\n// core/Theme.ts so resolved themes quantize colors identically to the\n// built-in dark theme.\nfunction hexToRgba(hex: string, a = 1): RGBA {\n const n = parseInt(hex.replace(\"#\", \"\"), 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255, a];\n}\n\n// Re-apply a tuple's RGB while keeping the base's alpha — used so a token\n// override (which only carries hue) preserves the base theme's carefully\n// tuned transparency for grid lines / volume bars / crosshair.\nfunction withRgbOf(hex: string, base: RGBA): RGBA {\n const [r, g, b] = hexToRgba(hex);\n return [r, g, b, base[3]];\n}\n\n// The engine's dark theme is the canonical base. A light preset is derived\n// from it by inverting background/text and lifting grid contrast so lines\n// read on a pale surface; candle / volume / crosshair hues carry over.\nconst darkBase: ChartTheme = darkTheme();\n\nconst lightBase: ChartTheme = {\n ...darkBase,\n background: hexToRgba(\"#ffffff\", 1),\n text: [0.13, 0.14, 0.16, 1],\n textDim: [0.13, 0.14, 0.16, 0.45],\n grid: [0.13, 0.14, 0.16, 0.08],\n gridVert: [0.13, 0.14, 0.16, 0.05],\n border: [0.8, 0.81, 0.83, 0.9],\n crosshair: [0.2, 0.22, 0.26, 0.4],\n crosshairLabelBg: [0.2, 0.22, 0.26, 0.97],\n crosshairLabelText: [0.98, 0.98, 0.99, 1],\n};\n\nfunction baseTheme(base: \"dark\" | \"light\"): ChartTheme {\n // Clone so callers can't mutate the shared preset objects.\n return { ...(base === \"light\" ? lightBase : darkBase) };\n}\n\n// Resolve plain hex tokens into a full ChartTheme on top of a base preset.\n// Only the fields a token sets are overridden; everything else inherits\n// from the base. Tokens that map onto translucent base fields (grid,\n// volume, crosshair) keep the base alpha and only swap the hue.\nexport function resolveTheme(\n tokens: ThemeTokens,\n base: \"dark\" | \"light\" = \"dark\",\n): ChartTheme {\n const t = baseTheme(base);\n if (tokens.background) t.background = hexToRgba(tokens.background, 1);\n if (tokens.text) {\n t.text = hexToRgba(tokens.text, 1);\n t.textDim = withRgbOf(tokens.text, t.textDim);\n }\n if (tokens.grid) {\n t.grid = withRgbOf(tokens.grid, t.grid);\n t.gridVert = withRgbOf(tokens.grid, t.gridVert);\n }\n if (tokens.border) t.border = withRgbOf(tokens.border, t.border);\n if (tokens.candleUp) t.candleUp = hexToRgba(tokens.candleUp, 1);\n if (tokens.candleDown) t.candleDown = hexToRgba(tokens.candleDown, 1);\n if (tokens.volumeUp) t.volUp = withRgbOf(tokens.volumeUp, t.volUp);\n if (tokens.volumeDown) t.volDown = withRgbOf(tokens.volumeDown, t.volDown);\n if (tokens.crosshair) t.crosshair = withRgbOf(tokens.crosshair, t.crosshair);\n if (tokens.fontFamily) t.fontFamily = tokens.fontFamily;\n return t;\n}\n\n// Convenience alias matching the documented authoring verb. Same as\n// resolveTheme on the dark base.\nexport function defineTheme(tokens: ThemeTokens): ChartTheme {\n return resolveTheme(tokens, \"dark\");\n}\n\nexport const presets: { dark: ChartTheme; light: ChartTheme } = {\n dark: baseTheme(\"dark\"),\n light: baseTheme(\"light\"),\n};\n","// Built-in studies — ready-to-use indicators authored with defineIndicator\n// over the exact, tested math in @mmflow/indicators. Hand any to\n// chart.addIndicator(...) or <Chart indicators={[smaStudy({ period: 50 })]} />.\n// They double as worked examples of the custom-indicator API.\n\nimport { sma, ema, vwap, rsi, macd } from \"@mmflow/indicators\";\nimport { defineIndicator, type CandleView } from \"./indicator\";\n\nconst closesOf = (c: CandleView): number[] => Array.from(c.close);\n\nexport const smaStudy = defineIndicator({\n name: \"SMA\",\n overlay: true,\n params: {\n period: { type: \"int\", label: \"Period\", default: 20, min: 1, max: 400 },\n },\n compute: (c, { period }) => ({\n lines: [{ id: \"sma\", data: sma(closesOf(c), period), color: \"#ffa645\" }],\n }),\n});\n\nexport const emaStudy = defineIndicator({\n name: \"EMA\",\n overlay: true,\n params: {\n period: { type: \"int\", label: \"Period\", default: 21, min: 1, max: 400 },\n },\n compute: (c, { period }) => ({\n lines: [{ id: \"ema\", data: ema(closesOf(c), period), color: \"#57c2f2\" }],\n }),\n});\n\nexport const vwapStudy = defineIndicator({\n name: \"VWAP\",\n overlay: true,\n params: {},\n compute: (c) => {\n const rows = Array.from({ length: c.length }, (_, i) => ({\n h: c.high[i],\n l: c.low[i],\n c: c.close[i],\n v: c.volume[i],\n }));\n return { lines: [{ id: \"vwap\", data: vwap(rows), color: \"#fad152\" }] };\n },\n});\n\nexport const rsiStudy = defineIndicator({\n name: \"RSI\",\n overlay: false,\n params: {\n period: { type: \"int\", label: \"Period\", default: 14, min: 2, max: 100 },\n },\n compute: (c, { period }) => ({\n lines: [{ id: \"rsi\", data: rsi(closesOf(c), period), color: \"#c773f2\" }],\n }),\n});\n\nexport const macdStudy = defineIndicator({\n name: \"MACD\",\n overlay: false,\n params: {\n fast: { type: \"int\", label: \"Fast\", default: 12, min: 1, max: 200 },\n slow: { type: \"int\", label: \"Slow\", default: 26, min: 1, max: 400 },\n signal: { type: \"int\", label: \"Signal\", default: 9, min: 1, max: 200 },\n },\n compute: (c, { fast, slow, signal }) => {\n const m = macd(closesOf(c), fast, slow, signal);\n return {\n lines: [\n { id: \"macd\", data: m.macd, color: \"#34c7bd\" },\n { id: \"signal\", data: m.signal, color: \"#f0a500\" },\n ],\n histogram: m.histogram,\n };\n },\n});\n\n/** Registry of the built-in study factories, keyed by short name. */\nexport const builtinStudies = {\n sma: smaStudy,\n ema: emaStudy,\n vwap: vwapStudy,\n rsi: rsiStudy,\n macd: macdStudy,\n} as const;\n","// Thin imperative facade over the engine for generic embedders — NOT\n// mmflow-specific. Mirrors the construction order ChartEngine uses\n// (EventBus → DataStore → GlyphAtlas → RendererGL → Scene, then a main\n// Pane with Background + Candle layers) but exposes a small lightweight-\n// charts-style API instead of a React component.\n//\n// Candle, volume, indicators and the pro order-flow layers (footprint,\n// volume profile, order-book heatmap, markers) are exposed as small handles\n// embedders can feed with their own data.\n\nimport { EventBus } from \"../core/eventBus\";\nimport { DataStore, type OhlcvBuffer } from \"../core/DataStore\";\nimport { GlyphAtlas } from \"../core/GlyphAtlas\";\nimport { RendererGL } from \"../core/RendererGL\";\nimport { Scene } from \"../core/Scene\";\nimport { Pane } from \"../core/Pane\";\nimport { PerfReporter } from \"../core/PerfReporter\";\nimport type { Layer } from \"../core/Layer\";\nimport { BackgroundLayer } from \"../layers/BackgroundLayer\";\nimport { CandleLayer } from \"../layers/CandleLayer\";\nimport { VolumeLayer } from \"../layers/VolumeLayer\";\nimport { IndicatorLayer } from \"../layers/IndicatorLayer\";\nimport {\n darkTheme,\n type ChartTheme,\n type RGBA,\n} from \"../core/Theme\";\nimport {\n VolumeFootprintLayer,\n type FootprintBar,\n} from \"../layers/VolumeFootprintLayer\";\nimport {\n VolumeProfileLayer,\n type VolumeProfileSnapshot,\n} from \"../layers/VolumeProfileLayer\";\nimport {\n OrderBookHeatmapLayer,\n type OrderBookHeatmapSnapshot,\n} from \"../layers/OrderBookHeatmapLayer\";\nimport { MarkerLayer, type MarkerSpec } from \"../layers/MarkerLayer\";\nimport { resolveTheme, type ThemeTokens } from \"./theme\";\nimport type { CandleView, IndicatorInstance, PlotLine } from \"./indicator\";\nimport type { DataFeed, Unsubscribe } from \"./dataFeed\";\n\nexport interface ChartOptions {\n container: HTMLElement;\n theme?: ThemeTokens;\n autosize?: boolean;\n devicePixelRatio?: number;\n perf?: boolean;\n}\n\nexport interface IChartApi {\n addCandleSeries(): CandleLayer;\n addVolumeSeries(): VolumeLayer;\n addFootprintSeries(opts?: FootprintSeriesOptions): FootprintSeriesApi;\n addVolumeProfile(opts?: VolumeProfileOptions): VolumeProfileApi;\n addOrderBookHeatmap(opts?: OrderBookHeatmapOptions): OrderBookHeatmapApi;\n addMarkers(opts?: MarkerSeriesOptions): MarkerSeriesApi;\n addIndicator(inst: IndicatorInstance): {\n remove(): void;\n setParams(v: Record<string, unknown>): void;\n };\n addPane(opts?: PaneOptions): PaneApi;\n setData(feed: DataFeed, opts?: { symbol?: string; resolution?: string }): void;\n applyTheme(theme: ThemeTokens): void;\n resize(w: number, h: number): void;\n takeScreenshot(): HTMLCanvasElement;\n subscribeCrosshairMove(cb: (p: unknown) => void): Unsubscribe;\n on(ev: \"contextlost\" | \"contextrestored\", cb: () => void): Unsubscribe;\n dispose(): void;\n}\n\nexport interface FootprintSeriesOptions {\n bars?: FootprintBar[];\n intervalMs?: number;\n alpha?: number;\n}\n\nexport interface FootprintSeriesApi {\n layer: VolumeFootprintLayer;\n setBars(bars: FootprintBar[], intervalMs?: number): void;\n clear(): void;\n remove(): void;\n}\n\nexport interface VolumeProfileOptions {\n profile?: VolumeProfileSnapshot;\n alpha?: number;\n widthFraction?: number;\n}\n\nexport interface VolumeProfileApi {\n layer: VolumeProfileLayer;\n setProfile(profile: VolumeProfileSnapshot): void;\n clear(): void;\n remove(): void;\n}\n\nexport interface OrderBookHeatmapOptions {\n snapshots?: OrderBookHeatmapSnapshot[];\n alpha?: number;\n}\n\nexport interface OrderBookHeatmapApi {\n layer: OrderBookHeatmapLayer;\n addSnapshot(snapshot: OrderBookHeatmapSnapshot): void;\n setSnapshots(snapshots: OrderBookHeatmapSnapshot[]): void;\n clear(): void;\n remove(): void;\n}\n\nexport interface MarkerSeriesOptions {\n id?: string;\n markers?: MarkerSpec[];\n buys?: MarkerSpec[];\n sells?: MarkerSpec[];\n sideSign?: 1 | -1;\n color?: RGBA;\n buyColor?: RGBA;\n sellColor?: RGBA;\n logMinUsd?: number;\n logMaxUsd?: number;\n}\n\nexport interface MarkerSeriesApi {\n layers: MarkerLayer[];\n setMarkers(\n markers:\n | MarkerSpec[]\n | { buys?: MarkerSpec[]; sells?: MarkerSpec[] },\n ): void;\n clear(): void;\n remove(): void;\n}\n\nexport interface PaneOptions {\n id?: string;\n interactive?: boolean;\n padding?: { top?: number; bottom?: number };\n priceRange?: [number, number];\n}\n\nexport interface PaneApi {\n pane: Pane;\n remove(): void;\n}\n\n// Default sub-pane split when a volume pane is present: candles take the\n// top 80%, volume the bottom 20% — a reasonable generic default.\nconst VOLUME_PANE_TOP = 0.8;\n\nexport function createChart(options: ChartOptions): IChartApi {\n const { container } = options;\n const dpr = Math.max(\n 1,\n options.devicePixelRatio ??\n (typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1),\n );\n\n const canvas = document.createElement(\"canvas\");\n canvas.style.display = \"block\";\n canvas.style.width = \"100%\";\n canvas.style.height = \"100%\";\n container.appendChild(canvas);\n\n // Live theme, read by Scene every frame through the getter below so\n // applyTheme can swap it without re-wiring the scene.\n let theme: ChartTheme = options.theme\n ? resolveTheme(options.theme)\n : darkTheme();\n\n const bus = new EventBus();\n const dataStore = new DataStore(bus);\n const glyphAtlas = new GlyphAtlas({ fontSize: 11 });\n\n const contextLostCbs = new Set<() => void>();\n const contextRestoredCbs = new Set<() => void>();\n\n const renderer = new RendererGL({\n canvas,\n onContextLost: () => {\n scene?.notifyContextLost();\n for (const cb of Array.from(contextLostCbs)) cb();\n },\n onContextRestored: () => {\n scene?.notifyContextLost();\n try {\n glyphAtlas.build(renderer.regl, dpr);\n } catch {\n /* atlas rebuild best-effort; next paint retries */\n }\n for (const cb of Array.from(contextRestoredCbs)) cb();\n },\n });\n\n const rect = container.getBoundingClientRect();\n let cssWidth = Math.max(1, rect.width || container.clientWidth || 300);\n let cssHeight = Math.max(1, rect.height || container.clientHeight || 150);\n renderer.resize(cssWidth, cssHeight, dpr);\n try {\n glyphAtlas.build(renderer.regl, dpr);\n } catch {\n /* atlas build best-effort */\n }\n\n // Main (price) pane spans the full height until a volume sub-pane is\n // added, at which point it's reshaped to the top slice.\n const mainPane = new Pane(\"main\", bus, {\n yStartFraction: 0,\n yEndFraction: 1,\n });\n mainPane.addLayer(new BackgroundLayer());\n const candleLayer = new CandleLayer(dataStore);\n mainPane.addLayer(candleLayer);\n\n const scene = new Scene(renderer, () => theme, bus, glyphAtlas);\n scene.addPane(mainPane);\n scene.setSize(cssWidth, cssHeight, dpr);\n\n if (options.perf) {\n scene.setPerfReporter(new PerfReporter());\n }\n\n // ─── crosshair forwarding ──────────────────────────────────────────\n // The generic facade owns its own pointer→crosshair mapping so\n // subscribeCrosshairMove works without the host wiring DOM events. We\n // translate the pointer position through the main pane's viewport to\n // (time, price) and report null when the cursor leaves the plot.\n const crosshairCbs = new Set<(p: unknown) => void>();\n const onPointerMove = (ev: PointerEvent) => {\n if (crosshairCbs.size === 0) return;\n const r = canvas.getBoundingClientRect();\n const cssX = ev.clientX - r.left;\n const cssY = ev.clientY - r.top;\n const vp = mainPane.viewport;\n const plot = vp.plotCss;\n const inside =\n cssX >= plot.x &&\n cssX <= plot.x + plot.w &&\n cssY >= plot.y &&\n cssY <= plot.y + plot.h;\n const payload = inside\n ? {\n x: cssX,\n y: cssY,\n time: vp.xToTime(cssX * dpr),\n price: vp.yToPrice(cssY * dpr),\n }\n : null;\n for (const cb of Array.from(crosshairCbs)) cb(payload);\n };\n const onPointerLeave = () => {\n if (crosshairCbs.size === 0) return;\n for (const cb of Array.from(crosshairCbs)) cb(null);\n };\n canvas.addEventListener(\"pointermove\", onPointerMove);\n canvas.addEventListener(\"pointerleave\", onPointerLeave);\n\n // ─── optional autosize ─────────────────────────────────────────────\n let resizeObserver: ResizeObserver | null = null;\n if (options.autosize && typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const r2 = entry.contentRect;\n applyResize(r2.width, r2.height);\n }\n });\n resizeObserver.observe(container);\n }\n\n function applyResize(w: number, h: number): void {\n cssWidth = Math.max(1, w);\n cssHeight = Math.max(1, h);\n renderer.resize(cssWidth, cssHeight, dpr);\n scene.setSize(cssWidth, cssHeight, dpr);\n scene.markAllDirty();\n }\n\n // ─── series + feed state ───────────────────────────────────────────\n let volumeLayer: VolumeLayer | null = null;\n // Sub-panes stacked below the main (price) pane — the volume pane and any\n // non-overlay indicator panes. Heights are redistributed by restackPanes().\n const subPanes: Pane[] = [];\n let liveUnsub: Unsubscribe | null = null;\n const proUnsubs = new Map<string, Unsubscribe>();\n let currentFeed: DataFeed | null = null;\n let currentSymbol: string | null = null;\n let currentResolution: string | null = null;\n let currentFrom = 0;\n let currentTo = 0;\n let feedGeneration = 0;\n let resolutionMs = 60_000;\n\n let footprintLayer: VolumeFootprintLayer | null = null;\n let volumeProfileLayer: VolumeProfileLayer | null = null;\n let orderBookLayer: OrderBookHeatmapLayer | null = null;\n const markerApis = new Set<MarkerSeriesApi>();\n\n // Map a resolution string (\"1m\", \"5m\", \"1h\", \"1d\", …) to milliseconds.\n // Falls back to one minute for unrecognized inputs.\n const parseResolutionMs = (res: string): number => {\n const m = /^(\\d+)\\s*([smhdw])$/.exec(res.trim().toLowerCase());\n if (!m) return 60_000;\n const unit: Record<string, number> = {\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n w: 604_800_000,\n };\n const n = parseInt(m[1], 10);\n return n > 0 && unit[m[2]] ? n * unit[m[2]] : 60_000;\n };\n\n // Build a read-only CandleView over the DataStore's typed-array buffers\n // so indicator compute() can read OHLCV without copying.\n const candleViewOf = (b: OhlcvBuffer): CandleView => ({\n time: b.time,\n open: b.open,\n high: b.high,\n low: b.low,\n close: b.close,\n volume: b.volume,\n length: b.length,\n });\n\n // Redistribute pane heights: the main (price) pane takes the top, and the\n // stacked sub-panes (volume + non-overlay indicators) split the bottom so\n // they never overlap. Sub-panes are capped at 60% of the height combined.\n function restackPanes(): void {\n const n = subPanes.length;\n if (n === 0) {\n mainPane.bounds = { yStartFraction: 0, yEndFraction: 1 };\n } else {\n const subTotal = Math.min(0.6, n * (1 - VOLUME_PANE_TOP));\n const mainEnd = 1 - subTotal;\n mainPane.bounds = { yStartFraction: 0, yEndFraction: mainEnd };\n const slice = subTotal / n;\n subPanes.forEach((p, i) => {\n p.bounds = {\n yStartFraction: mainEnd + i * slice,\n yEndFraction: mainEnd + (i + 1) * slice,\n };\n });\n }\n scene.relayout();\n scene.markAllDirty();\n }\n\n // Append a volume sub-pane. Idempotent — a second call returns the layer.\n function ensureVolumePane(): VolumeLayer {\n if (volumeLayer) return volumeLayer;\n const volumePane = new Pane(\n \"volume\",\n bus,\n { yStartFraction: 0, yEndFraction: 1 },\n { top: 6, bottom: 0 },\n );\n volumePane.priceInteractive = false;\n volumeLayer = new VolumeLayer(dataStore);\n volumePane.addLayer(volumeLayer);\n scene.addPane(volumePane);\n subPanes.push(volumePane);\n restackPanes();\n return volumeLayer;\n }\n\n function addMainLayer(layer: Layer, beforeId?: string): void {\n mainPane.removeLayer(layer.id);\n const i = beforeId\n ? mainPane.layers.findIndex((candidate) => candidate.id === beforeId)\n : -1;\n if (i >= 0) mainPane.layers.splice(i, 0, layer);\n else mainPane.addLayer(layer);\n layer.dirty = true;\n scene.relayout();\n scene.markAllDirty();\n }\n\n function stopProSubscriptions(): void {\n for (const unsub of Array.from(proUnsubs.values())) {\n try {\n unsub();\n } catch {\n /* user feed cleanup best-effort */\n }\n }\n proUnsubs.clear();\n }\n\n function wireProFeeds(): void {\n stopProSubscriptions();\n const feed = currentFeed;\n if (!feed) return;\n const symbol = currentSymbol ?? \"\";\n const resolution = currentResolution ?? \"1m\";\n const from = currentFrom;\n const to = currentTo || Date.now();\n const intervalMs = resolutionMs;\n const generation = feedGeneration;\n\n if (footprintLayer && feed.fetchFootprint) {\n void feed\n .fetchFootprint(symbol, { resolution, from, to, intervalMs })\n .then((bars) => {\n if (generation !== feedGeneration || !footprintLayer) return;\n footprintLayer.setBars(bars, intervalMs);\n scene.markAllDirty();\n })\n .catch(() => {\n /* optional feed capability */\n });\n }\n\n if (volumeProfileLayer && feed.fetchVolumeProfile) {\n void feed\n .fetchVolumeProfile(symbol, { resolution, from, to, intervalMs })\n .then((profile) => {\n if (generation !== feedGeneration || !volumeProfileLayer) return;\n volumeProfileLayer.setProfile(profile);\n scene.markAllDirty();\n })\n .catch(() => {\n /* optional feed capability */\n });\n }\n\n if (orderBookLayer && feed.subscribeOrderBook) {\n const unsub = feed.subscribeOrderBook(symbol, (snapshot) => {\n orderBookLayer?.addSnapshot(snapshot);\n scene.markAllDirty();\n });\n proUnsubs.set(\"orderbook\", unsub);\n }\n\n if (markerApis.size > 0 && feed.subscribeMarkers) {\n const unsub = feed.subscribeMarkers(symbol, (markers) => {\n for (const api of Array.from(markerApis)) api.setMarkers(markers);\n });\n proUnsubs.set(\"markers\", unsub);\n }\n }\n\n // Frame the most recent ~150 bars and auto-fit the price band — mirrors\n // ChartEngine's post-load viewport fit so a freshly-fed chart looks the\n // same as the app's.\n function fitToData(): void {\n const b = dataStore.candles;\n if (b.length === 0) return;\n const showBars = Math.min(150, b.length);\n const t1 = b.time[b.length - 1] + resolutionMs;\n const t0 = b.time[Math.max(0, b.length - showBars)];\n scene.setTimeRange(t0, t1);\n const extent = dataStore.priceExtent(t0, t1);\n if (extent) {\n const pad = (extent[1] - extent[0]) * 0.06 || extent[1] * 0.001;\n mainPane.viewport.setPriceRange(extent[0] - pad, extent[1] + pad, false);\n }\n mainPane.viewport.resetPriceAutoFit();\n scene.markAllDirty();\n }\n\n scene.start();\n\n const api: IChartApi = {\n addCandleSeries() {\n // Candle layer is created at construction; expose a thin handle.\n return candleLayer;\n },\n\n addVolumeSeries() {\n return ensureVolumePane();\n },\n\n addFootprintSeries(opts: FootprintSeriesOptions = {}) {\n if (!footprintLayer) {\n footprintLayer = new VolumeFootprintLayer({ alpha: opts.alpha });\n addMainLayer(footprintLayer);\n }\n if (opts.bars) {\n footprintLayer.setBars(opts.bars, opts.intervalMs ?? resolutionMs);\n }\n const api: FootprintSeriesApi = {\n layer: footprintLayer,\n setBars(bars, intervalMs = resolutionMs) {\n footprintLayer?.setBars(bars, intervalMs);\n scene.markAllDirty();\n },\n clear() {\n footprintLayer?.clear();\n scene.markAllDirty();\n },\n remove() {\n if (!footprintLayer) return;\n mainPane.removeLayer(footprintLayer.id);\n footprintLayer = null;\n scene.relayout();\n scene.markAllDirty();\n wireProFeeds();\n },\n };\n wireProFeeds();\n return api;\n },\n\n addVolumeProfile(opts: VolumeProfileOptions = {}) {\n if (!volumeProfileLayer) {\n volumeProfileLayer = new VolumeProfileLayer({\n alpha: opts.alpha,\n widthFraction: opts.widthFraction,\n });\n addMainLayer(volumeProfileLayer, candleLayer.id);\n }\n if (opts.profile) volumeProfileLayer.setProfile(opts.profile);\n const api: VolumeProfileApi = {\n layer: volumeProfileLayer,\n setProfile(profile) {\n volumeProfileLayer?.setProfile(profile);\n scene.markAllDirty();\n },\n clear() {\n volumeProfileLayer?.clear();\n scene.markAllDirty();\n },\n remove() {\n if (!volumeProfileLayer) return;\n mainPane.removeLayer(volumeProfileLayer.id);\n volumeProfileLayer = null;\n scene.relayout();\n scene.markAllDirty();\n wireProFeeds();\n },\n };\n wireProFeeds();\n return api;\n },\n\n addOrderBookHeatmap(opts: OrderBookHeatmapOptions = {}) {\n if (!orderBookLayer) {\n orderBookLayer = new OrderBookHeatmapLayer({ alpha: opts.alpha });\n addMainLayer(orderBookLayer, volumeProfileLayer?.id ?? candleLayer.id);\n }\n if (opts.snapshots) {\n orderBookLayer.clear();\n for (const snap of opts.snapshots.slice().sort((a, b) => a.time - b.time)) {\n orderBookLayer.addSnapshot(snap);\n }\n }\n const api: OrderBookHeatmapApi = {\n layer: orderBookLayer,\n addSnapshot(snapshot) {\n orderBookLayer?.addSnapshot(snapshot);\n scene.markAllDirty();\n },\n setSnapshots(snapshots) {\n if (!orderBookLayer) return;\n orderBookLayer.clear();\n for (const snap of snapshots.slice().sort((a, b) => a.time - b.time)) {\n orderBookLayer.addSnapshot(snap);\n }\n scene.markAllDirty();\n },\n clear() {\n orderBookLayer?.clear();\n scene.markAllDirty();\n },\n remove() {\n if (!orderBookLayer) return;\n mainPane.removeLayer(orderBookLayer.id);\n orderBookLayer = null;\n scene.relayout();\n scene.markAllDirty();\n wireProFeeds();\n },\n };\n wireProFeeds();\n return api;\n },\n\n addMarkers(opts: MarkerSeriesOptions = {}) {\n const id = opts.id ?? `markers-${++markerSeq}`;\n const layers: MarkerLayer[] = [];\n const makeLayer = (\n layerId: string,\n sideSign: 1 | -1,\n color: RGBA,\n ) =>\n new MarkerLayer({\n id: layerId,\n sideSign,\n color,\n logMinUsd: opts.logMinUsd,\n logMaxUsd: opts.logMaxUsd,\n });\n\n if (opts.sideSign) {\n const layer = makeLayer(\n id,\n opts.sideSign,\n opts.color ?? DEFAULT_BUY_MARKER,\n );\n layers.push(layer);\n addMainLayer(layer);\n if (opts.markers) layer.setMarkers(opts.markers);\n } else {\n const buy = makeLayer(\n `${id}-buys`,\n 1,\n opts.buyColor ?? opts.color ?? DEFAULT_BUY_MARKER,\n );\n const sell = makeLayer(\n `${id}-sells`,\n -1,\n opts.sellColor ?? opts.color ?? DEFAULT_SELL_MARKER,\n );\n layers.push(buy, sell);\n addMainLayer(buy);\n addMainLayer(sell);\n if (opts.buys) buy.setMarkers(opts.buys);\n if (opts.sells) sell.setMarkers(opts.sells);\n }\n\n const api: MarkerSeriesApi = {\n layers,\n setMarkers(markers) {\n if (Array.isArray(markers)) {\n layers[0]?.setMarkers(markers);\n for (let i = 1; i < layers.length; i++) layers[i].clear();\n } else {\n layers[0]?.setMarkers(markers.buys ?? []);\n layers[1]?.setMarkers(markers.sells ?? []);\n }\n scene.markAllDirty();\n },\n clear() {\n for (const layer of layers) layer.clear();\n scene.markAllDirty();\n },\n remove() {\n for (const layer of layers) mainPane.removeLayer(layer.id);\n markerApis.delete(api);\n scene.relayout();\n scene.markAllDirty();\n wireProFeeds();\n },\n };\n markerApis.add(api);\n wireProFeeds();\n return api;\n },\n\n addPane(opts: PaneOptions = {}) {\n const pane = new Pane(\n opts.id ?? `pane-${++customPaneSeq}`,\n bus,\n { yStartFraction: 0, yEndFraction: 1 },\n {\n top: opts.padding?.top ?? 6,\n bottom: opts.padding?.bottom ?? 0,\n },\n );\n pane.priceInteractive = opts.interactive ?? true;\n if (opts.priceRange) pane.viewport.setPriceRange(opts.priceRange[0], opts.priceRange[1], false);\n scene.addPane(pane);\n subPanes.push(pane);\n restackPanes();\n return {\n pane,\n remove() {\n scene.removePane(pane.id);\n const i = subPanes.indexOf(pane);\n if (i >= 0) subPanes.splice(i, 1);\n restackPanes();\n },\n };\n },\n\n addIndicator(inst: IndicatorInstance) {\n // Recompute the instance over the live buffer each paint so the line\n // tracks setData / applyTrade updates. We take the FIRST plot line\n // the instance emits (one IndicatorLayer renders one polyline);\n // multi-line indicators can be split by the host into separate\n // instances in this phase.\n const compute = (_closes: number[], b: OhlcvBuffer): number[] => {\n const result = inst.compute(candleViewOf(b));\n const line: PlotLine | undefined = result.lines[0];\n if (!line) return new Array<number>(b.length).fill(NaN);\n // Pad / clamp to buffer length so the layer's index walk is safe.\n const out = new Array<number>(b.length);\n for (let i = 0; i < b.length; i++) {\n out[i] = i < line.data.length ? line.data[i] : NaN;\n }\n return out;\n };\n\n const firstLine = inst.compute(candleViewOf(dataStore.candles)).lines[0];\n const color = hexToRgbaOrDefault(firstLine?.color);\n const id = `indicator-${inst.name}-${indicatorSeq++}`;\n const layer = new IndicatorLayer(dataStore, { id, compute, color });\n\n // Overlay indicators paint in the main (price) pane; non-overlay\n // ones get their own sub-pane with an independent value scale.\n let host: Pane = mainPane;\n let ownPane: Pane | null = null;\n if (!inst.overlay) {\n ownPane = new Pane(\n id,\n bus,\n { yStartFraction: 0, yEndFraction: 1 },\n { top: 6, bottom: 0 },\n );\n ownPane.priceInteractive = false;\n scene.addPane(ownPane);\n subPanes.push(ownPane);\n host = ownPane;\n }\n host.addLayer(layer);\n if (ownPane) {\n restackPanes();\n } else {\n scene.relayout();\n scene.markAllDirty();\n }\n\n return {\n remove() {\n host.removeLayer(id);\n if (ownPane) {\n scene.removePane(ownPane.id);\n const i = subPanes.indexOf(ownPane);\n if (i >= 0) subPanes.splice(i, 1);\n restackPanes();\n } else {\n scene.relayout();\n scene.markAllDirty();\n }\n },\n setParams(v: Record<string, unknown>) {\n // Merge new values into the instance; next paint recomputes.\n Object.assign(inst.values, v);\n layer.dirty = true;\n scene.markAllDirty();\n },\n };\n },\n\n setData(feed: DataFeed, opts?: { symbol?: string; resolution?: string }) {\n // Tear any prior live subscription before swapping data.\n liveUnsub?.();\n liveUnsub = null;\n stopProSubscriptions();\n currentFeed = feed;\n feedGeneration++;\n // Symbol/resolution come from the caller (the framework bindings pass\n // them from props). They're forwarded to the feed's fetchCandles +\n // subscribe, and the resolution drives live-trade bucket sizing — so a\n // 5m chart buckets ticks into 5m bars, not 1m.\n if (opts?.symbol != null) currentSymbol = opts.symbol;\n if (opts?.resolution != null) currentResolution = opts.resolution;\n const symbol = currentSymbol ?? \"\";\n const resolution = currentResolution ?? \"1m\";\n currentResolution = resolution;\n resolutionMs = parseResolutionMs(resolution);\n const now = Date.now();\n // 500-bar window, same headroom default as the app.\n const from = now - resolutionMs * 500;\n currentFrom = from;\n currentTo = now;\n wireProFeeds();\n const range = { symbol, resolution, from, to: now };\n const generation = feedGeneration;\n const load = feed.fetchCandlesColumns\n ? feed.fetchCandlesColumns(range).then((columns) => {\n if (generation !== feedGeneration) return;\n dataStore.setCandleColumns(columns);\n })\n : feed.fetchCandles(range).then((candles) => {\n if (generation !== feedGeneration) return;\n dataStore.setCandles(\n candles.map((c) => ({\n t: c.time,\n o: c.open,\n h: c.high,\n l: c.low,\n c: c.close,\n v: c.volume,\n })),\n );\n });\n void load.then(() => {\n if (generation === feedGeneration) fitToData();\n });\n\n // Fold live trades into the tail bucket, coalescing the bus emit to\n // once per frame of updates the host delivers.\n liveUnsub = feed.subscribe(symbol, resolution, (u) => {\n if (!Number.isFinite(u.time)) return;\n if (!Number.isFinite(u.price) || u.price <= 0) return;\n if (!Number.isFinite(u.size) || u.size <= 0) return;\n const bucketStart = Math.floor(u.time / resolutionMs) * resolutionMs;\n if (dataStore.applyTrade(bucketStart, u.price, u.size)) {\n bus.emit({ type: \"data:updated\", series: \"candles\" });\n }\n });\n },\n\n applyTheme(next: ThemeTokens) {\n theme = resolveTheme(next);\n bus.emit({ type: \"theme:changed\" });\n scene.markAllDirty();\n },\n\n resize(w: number, h: number) {\n applyResize(w, h);\n },\n\n takeScreenshot() {\n // Force a synchronous paint so the backbuffer reflects current state,\n // then copy the GL canvas into a 2D canvas the caller can keep\n // (the live GL backbuffer may be cleared after the next frame).\n scene.markAllDirty();\n const out = document.createElement(\"canvas\");\n out.width = canvas.width;\n out.height = canvas.height;\n const ctx = out.getContext(\"2d\");\n if (ctx) ctx.drawImage(canvas, 0, 0);\n return out;\n },\n\n subscribeCrosshairMove(cb: (p: unknown) => void) {\n crosshairCbs.add(cb);\n return () => {\n crosshairCbs.delete(cb);\n };\n },\n\n on(ev: \"contextlost\" | \"contextrestored\", cb: () => void) {\n const set = ev === \"contextlost\" ? contextLostCbs : contextRestoredCbs;\n set.add(cb);\n return () => {\n set.delete(cb);\n };\n },\n\n dispose() {\n resizeObserver?.disconnect();\n resizeObserver = null;\n canvas.removeEventListener(\"pointermove\", onPointerMove);\n canvas.removeEventListener(\"pointerleave\", onPointerLeave);\n crosshairCbs.clear();\n contextLostCbs.clear();\n contextRestoredCbs.clear();\n liveUnsub?.();\n liveUnsub = null;\n stopProSubscriptions();\n markerApis.clear();\n scene.dispose();\n glyphAtlas.dispose();\n renderer.dispose();\n bus.clear();\n if (canvas.parentNode === container) container.removeChild(canvas);\n },\n };\n\n return api;\n}\n\nlet indicatorSeq = 0;\nlet markerSeq = 0;\nlet customPaneSeq = 0;\n\nconst DEFAULT_BUY_MARKER: RGBA = [0.2, 0.85, 0.63, 0.9];\nconst DEFAULT_SELL_MARKER: RGBA = [1, 0.32, 0.46, 0.9];\n\n// Parse a \"#rrggbb\" plot-line color into the engine's RGBA tuple; falls\n// back to a neutral sky-blue when absent/invalid so an indicator always\n// renders something visible.\nfunction hexToRgbaOrDefault(\n hex: string | undefined,\n): [number, number, number, number] {\n if (hex && /^#[0-9a-fA-F]{6}$/.test(hex)) {\n const n = parseInt(hex.slice(1), 16);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255, 0.9];\n }\n return [0.34, 0.76, 0.95, 0.9];\n}\n"]}