@alphacharts/core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -3
- package/dist/index.js +544 -414
- package/dist/index.js.map +1 -1
- package/dist/internal.js +7 -1
- package/dist/internal.js.map +1 -0
- package/dist/types/chart/primitives.d.ts +23 -0
- package/dist/types/chart/series.d.ts +11 -1
- package/dist/types/data/deque.d.ts +5 -1
- package/dist/types/data/lod.d.ts +7 -2
- package/dist/types/data/model.d.ts +34 -1
- package/dist/types/fault.d.ts +9 -0
- package/dist/types/index.d.ts +3 -3
- package/dist/types/internal.d.ts +3 -0
- package/dist/types/version.d.ts +1 -0
- package/dist/{window-uK2QNvv5.js → window-WvcPCDkK.js} +294 -155
- package/dist/window-WvcPCDkK.js.map +1 -0
- package/package.json +1 -1
- package/dist/window-uK2QNvv5.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["rgba","parseColor","LOD_COLOR","chooseLevel","LOD_O","COL_C","COL_L","COL_O","LOD_C","LOD_BASE","COL_COLOR","DataModel","InstanceWindow","GLContext","COL_V","GLSL_COMMON","HOLE_TEST","COL_H","cssColor","LOD_L","BUCKET_MS","TRANSITION","DAY_MS","TimeZone","id","b","t","off","a","guess","local","civilFromLocal","parts","y","mo","d","h","mi","p","days","rem","hour","minute","second","ms","z","era","doe","yoe","doy","mp","day","month","localFromCivil","year","ownLive","GL_ATTRS","PARK_MAX","PARK_MS","parked","releaseCanvas","gl","parkedCanvas","c","dropParked","canvas","createSurface","choice","GLSurface","events","opts","Canvas2DSurface","glctx","ox","oy","devH","devW","r","draw","timer","onLost","ctx","extra","parent","adopt","ctx2d","OwnLayers","bg","root","reused","renderer","series","overlay","cssW","dpr","cssH","CellLayers","dash","cell","chart","DashboardCanvases","container","onLayout","members","w","changed","LAYOUT_VERSION","checkCustomOptions","name","st","supplied","MIGRATIONS","migrate","raw","s","v","step","k","MemoryStore","key","state","LocalStorageStore","prefix","out","i","plain","o","checkPriceScaleOptions","DEFAULT_PRICE_SCALE","PriceScale","options","price","lo","hi","pad","mid","half","factor","dy","priceTicks","n","heightPx","targetGapPx","niceStep","minMove","ticks","start","end","roundTo","niceTicks","count","multiple","e","f","axisText","sc","fmt","scaleTicks","label","gapPx","logTicks","pxPerDecade","mantissas","every","lastY","m","FIXED","weightBetween","prev","weightLocal","tz","la","lb","minWeight","minUsefulWeight","minPeriod","msPerBar","spacing","fw","timeTicks","tl","cands","time","t0","t1","minW","finest","seen","add","boundary","x","boundaries","ok","c0","c1","monthStep","l0","l1","l","timeText","custom","calendar","kind","TimeFormatter","timeZone","timeFormat","locale","weight","withTime","PriceFormatter","DEFAULT_TIME_SCALE","TimeScale","at","anchorX","clamp","dx","right","barsWide","keep","maxOffset","minOffset","dirty","raf","requestRender","layers","frame","cancelRender","batch","failure","now","error","DRAG_SLOP","KINETIC_MIN","KINETIC_STOP","Interaction","surface","pane","ptr","dist","area","tap","unit","action","handled","dir","cursor","pointerType","first","last","dt","Emitter","set","type","fn","dashPattern","style","width","checkLine","crisp","PriceLine","next","host","view","SHAPES","POSITIONS","checkMarkers","ids","markers","hasBar","markerLowerBound","sorted","GAP","PAD","markerSize","barSpacing","mult","placeMarkers","curTime","above","below","inp","bar","size","textH","slot","isAbove","near","cy","top","tw","drawMarkers","placed","MAX_DECIMALS","decimalsOf","isIndianLocale","createFormatter","derivedMinMove","steps","nf","div","suffix","FS_FLAT","OFFSCREEN","WindowRenderer","prog","data","zeroBase","pairs","bindRecord","spacingDev","u","barWidths","ratio","spacingCss","level","wick","body","offset","color","Colors","css","CANDLE_VS","CandleRenderer","BAR_VS","BarRenderer","thick","HIST_VS","HistogramRenderer","base","LINE_VS","LINE_FS","LineRenderer","AREA_VS","AREA_FS","AreaRenderer","AreaFill","eachUnit","ohlc","O","H","L","C","COL","lv","levelOf","Y","snap","Base","Candles2D","bw","ww","bodyUp","bodyDown","wickUp","wickDown","left","up","op","yh","yl","yt","yb","Bars2D","down","Histogram2D","byColor","yv","y0","y1","linePath","path","started","valueOf","stroke","Line2D","Area2D","fill","g","registry","registerSeriesType","def","seriesType","lodRange","ohlcValue","SAMPLE","validateColors","DEFAULT_COMMON","Series","theme","col","cols","dec","scan","DARK","LIGHT","HIGH_CONTRAST","systemTheme","CHART_MESSAGES","defaultMessages","template","values","ALWAYS_OPEN","weekdays","regular","extended","holidays","NSE","US_EQUITY","Sessions","spec","back","min","wd","weekday","inAny","today","ws","parseResolution","MS","Resampler","res","len","anchor","week","idx","src","merge","replaced","DEFAULT_WATERMARK","checkWatermarkOptions","GLYPH_PATH","GLYPH_H","HEIGHT","INSET_X","INSET_Y","HALO","MIN_PANE_W","MIN_PANE_H","glyph","drawWatermark","paneW","paneH","th","DEFAULT_KEYMAP","SEPARATOR","AXIS_PAD","MIN_AXIS_W","resolveTheme","Chart","prim","line","watermark","timeChanged","stretch","side","failed","q","plugins","missing","ss","seriesIds","so","pn","created","pf","input","ps","scs","plugin","all","px","py","ev","consumed","pl","ti","tp","paneOf","scaleOf","sideScales","moved","layer","paneX","paneR","axisShown","source","scaleId","index","total","ha","sum","wasEmpty","font","pass","lw","rw","gap","avail","used","max","overrideRange","pmin","pmax","need","tk","j","settle","cur","on","one","runStart","x0","x1","gsc","bgPrims","ty","tt","sf","labels","countdownAt","contrastText","ch","cIndex","inData","cx","vx","hy","text","ct","lx","lh","ax","aw","cd","title","str","ya","msg","combo","keys","probe","sec","hh","mm","two","wrap","head","rows","cells","esc","low","high","Dashboard","SyncGroup","offs","other","ltl","leader","frac","barTime","connectDatafeed","pageSize","prefetch","ac","loading","noMoreData","ready","firstTime","lastTime","early","unsubscribe","offRange","fail","maxEarly","overflowReported","live","loadOlder","feed","span","loadFirst","createChart","LOD_H"],"sources":["../src/data/tz.ts","../src/render/surface.ts","../src/chart/layers.ts","../src/chart/layout.ts","../src/scale/price-scale.ts","../src/scale/ticks.ts","../src/scale/time-scale.ts","../src/chart/scheduler.ts","../src/interaction/input.ts","../src/chart/emitter.ts","../src/chart/primitives.ts","../src/chart/markers.ts","../src/scale/format.ts","../src/render/renderers.ts","../src/render/canvas2d.ts","../src/chart/series-types.ts","../src/chart/series.ts","../src/chart/theme.ts","../src/chart/messages.ts","../src/data/session.ts","../src/data/resample.ts","../src/chart/watermark.ts","../src/chart/chart.ts","../src/chart/dashboard.ts","../src/interaction/sync.ts","../src/feed/datafeed.ts","../src/index.ts"],"sourcesContent":["// Time-zone arithmetic without per-bar Intl calls.\n//\n// Intl.DateTimeFormat is the only portable source of IANA offsets, but one\n// formatToParts call costs microseconds, which is seconds over millions of\n// bars. Offsets change only at DST/legal transitions, so they are cached per\n// 6-hour bucket; a bucket whose two ends disagree contains a transition and\n// is resolved exactly per call.\n\nconst BUCKET_MS = 6 * 3_600_000;\nconst TRANSITION = Number.NaN;\n\nexport const DAY_MS = 86_400_000;\n\nexport interface CivilTime {\n year: number;\n month: number; // 1-12\n day: number; // 1-31\n hour: number;\n minute: number;\n second: number;\n ms: number;\n}\n\nexport class TimeZone {\n readonly id: string;\n private readonly fmt: Intl.DateTimeFormat | null;\n private readonly cache = new Map<number, number>();\n\n /** `id` is \"UTC\" or an IANA name; an unknown name throws RangeError. */\n constructor(id: string) {\n this.id = id;\n this.fmt =\n id === \"UTC\"\n ? null\n : new Intl.DateTimeFormat(\"en-US\", {\n timeZone: id,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n });\n }\n\n /** Offset (ms) to add to a UTC instant to get local wall-clock time. */\n offset(t: number): number {\n if (this.fmt === null) return 0;\n const b = Math.floor(t / BUCKET_MS);\n let off = this.cache.get(b);\n if (off === undefined) {\n const a = this.exactOffset(b * BUCKET_MS);\n const z = this.exactOffset((b + 1) * BUCKET_MS - 1);\n off = a === z ? a : TRANSITION;\n this.cache.set(b, off);\n }\n return Number.isNaN(off) ? this.exactOffset(t) : off;\n }\n\n /** UTC instant whose local wall-clock time is `local` (earlier instant on overlap). */\n fromLocal(local: number): number {\n const guess = local - this.offset(local);\n return local - this.offset(guess);\n }\n\n civil(t: number): CivilTime {\n return civilFromLocal(t + this.offset(t));\n }\n\n private exactOffset(t: number): number {\n const parts = this.fmt!.formatToParts(t);\n let y = 0, mo = 0, d = 0, h = 0, mi = 0, s = 0;\n for (const p of parts) {\n switch (p.type) {\n case \"year\": y = +p.value; break;\n case \"month\": mo = +p.value; break;\n case \"day\": d = +p.value; break;\n case \"hour\": h = +p.value; break;\n case \"minute\": mi = +p.value; break;\n case \"second\": s = +p.value; break;\n }\n }\n const wall = Date.UTC(y, mo - 1, d, h, mi, s);\n // formatToParts drops milliseconds; compare at whole-second resolution.\n return wall - (t - (((t % 1000) + 1000) % 1000));\n }\n}\n\n/** Civil fields of a local-time millisecond count (Hinnant's algorithm). */\nexport function civilFromLocal(local: number): CivilTime {\n const days = Math.floor(local / DAY_MS);\n let rem = local - days * DAY_MS;\n const hour = Math.floor(rem / 3_600_000);\n rem -= hour * 3_600_000;\n const minute = Math.floor(rem / 60_000);\n rem -= minute * 60_000;\n const second = Math.floor(rem / 1000);\n const ms = rem - second * 1000;\n\n const z = days + 719_468;\n const era = Math.floor(z / 146_097);\n const doe = z - era * 146_097;\n const yoe = Math.floor((doe - Math.floor(doe / 1460) + Math.floor(doe / 36_524) - Math.floor(doe / 146_096)) / 365);\n const doy = doe - (365 * yoe + Math.floor(yoe / 4) - Math.floor(yoe / 100));\n const mp = Math.floor((5 * doy + 2) / 153);\n const day = doy - Math.floor((153 * mp + 2) / 5) + 1;\n const month = mp < 10 ? mp + 3 : mp - 9;\n const year = yoe + era * 400 + (month <= 2 ? 1 : 0);\n return { year, month, day, hour, minute, second, ms };\n}\n\n/** Local-time milliseconds at 00:00 of a civil date. */\nexport function localFromCivil(year: number, month: number, day: number): number {\n return Date.UTC(year, month - 1, day);\n}\n","// Where a chart's series are drawn: a WebGL2 context, or Canvas2D when WebGL2\n// is unavailable or the page already holds OWN_LIMIT live contexts (browsers\n// evict the oldest past ~16). A surface may be shared by the charts of one\n// Dashboard; each chart draws into its own cell at (ox, oy).\n\nimport { GLContext } from \"./gl.js\";\n\nexport type SurfaceKind = \"webgl\" | \"canvas2d\";\nexport type SurfaceChoice = SurfaceKind | \"auto\";\n\nexport interface PaneRect {\n /** Device px within the chart, top-left origin. */\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Surface {\n readonly kind: SurfaceKind;\n readonly gl: WebGL2RenderingContext | null;\n readonly glctx: GLContext | null;\n readonly ctx2d: CanvasRenderingContext2D | null;\n /**\n * Start drawing a chart's cell of devW × devH at device offset (ox, oy):\n * clears only that cell. False when nothing can be drawn (context lost).\n */\n begin(ox: number, oy: number, devW: number, devH: number): boolean;\n /** Clip drawing to a pane (cell-relative device px), run `draw`, restore. */\n pane(rect: PaneRect, draw: () => void): void;\n end(): void;\n dispose(): void;\n}\n\nexport interface SurfaceEvents {\n /** GL objects are gone: drop every renderer made on this surface. */\n lost(): void;\n restored(): void;\n}\n\n/** Live own contexts before \"auto\" falls back to Canvas2D (use a Dashboard for many charts). */\nexport const OWN_LIMIT = 8;\nlet ownLive = 0;\n\nconst GL_ATTRS: WebGLContextAttributes = { antialias: false, premultipliedAlpha: true, alpha: true, preserveDrawingBuffer: false, powerPreference: \"high-performance\" };\n\n// ---- released contexts ---------------------------------------------------------------\n//\n// A removed chart's WebGL context is not gone until the browser collects its\n// canvas: WebKit (and Chrome, less strictly) count it against the page's\n// limit meanwhile and warn \"too many active WebGL contexts\" after ~8\n// create/remove cycles, even after loseContext(). So a disposed surface does\n// not lose its context: it parks the canvas with its context and compiled\n// programs, and the next chart in the page adopts it (parkedCanvas). A parked\n// context that nobody adopts within PARK_MS is released for real: lost, and\n// its canvas shrunk to 0 × 0 so the backing store is freed.\n\n/** Parked contexts kept at most; a further disposed surface is released at once. */\nconst PARK_MAX = OWN_LIMIT;\nconst PARK_MS = 10_000;\n\ninterface Parked {\n gl: WebGL2RenderingContext;\n glctx: GLContext;\n timer: ReturnType<typeof setTimeout>;\n onLost: () => void;\n}\nconst parked = new Map<HTMLCanvasElement, Parked>();\n\n/** Give a canvas back to the browser: lose its context, free its backing store. */\nfunction releaseCanvas(canvas: HTMLCanvasElement, gl: WebGL2RenderingContext): void {\n if (!gl.isContextLost()) gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n canvas.width = 0;\n canvas.height = 0;\n}\n\n/** A canvas whose WebGL2 context a disposed chart parked, detached from the DOM; undefined when none. */\nexport function parkedCanvas(): HTMLCanvasElement | undefined {\n for (const [c, p] of parked) {\n if (!p.gl.isContextLost()) return c;\n dropParked(c); // lost while parked (eviction, GPU reset): nothing to adopt\n }\n return undefined;\n}\n\n/** Forget a parked canvas and release it. */\nfunction dropParked(canvas: HTMLCanvasElement): void {\n const p = parked.get(canvas);\n if (!p) return;\n parked.delete(canvas);\n clearTimeout(p.timer);\n canvas.removeEventListener(\"webglcontextlost\", p.onLost);\n releaseCanvas(canvas, p.gl);\n}\n\n/**\n * `preserveDrawingBuffer`: keep the canvas's pixels between frames. A\n * Dashboard needs it: its charts share one canvas and each redraws only its\n * own cell, so without it the browser's per-frame buffer reset blanks every\n * cell that did not redraw in that frame.\n */\nexport function createSurface(choice: SurfaceChoice, canvas: HTMLCanvasElement, events: SurfaceEvents, opts: { preserveDrawingBuffer?: boolean } = {}): Surface {\n const p = parked.get(canvas);\n if (p) {\n parked.delete(canvas);\n clearTimeout(p.timer);\n canvas.removeEventListener(\"webglcontextlost\", p.onLost);\n if (!p.gl.isContextLost() && choice !== \"canvas2d\") return new GLSurface(canvas, p.gl, events, p.glctx);\n // A lost or unwanted parked context: never getContext on its canvas again (it would return the same one).\n releaseCanvas(canvas, p.gl);\n canvas = document.createElement(\"canvas\");\n }\n if (choice === \"webgl\" || (choice === \"auto\" && ownLive < OWN_LIMIT)) {\n const gl = canvas.getContext(\"webgl2\", opts.preserveDrawingBuffer ? { ...GL_ATTRS, preserveDrawingBuffer: true } : GL_ATTRS);\n if (gl) return new GLSurface(canvas, gl, events);\n if (choice === \"webgl\") throw new Error(\"alphacharts: WebGL2 is not available (renderer: \\\"webgl\\\" was requested)\");\n }\n return new Canvas2DSurface(canvas);\n}\n\n// ---- own context ------------------------------------------------------------------\n\nclass GLSurface implements Surface {\n readonly kind = \"webgl\" as const;\n glctx: GLContext | null;\n readonly ctx2d = null;\n private disposed = false;\n\n constructor(private readonly canvas: HTMLCanvasElement, readonly gl: WebGL2RenderingContext, private readonly events: SurfaceEvents, glctx?: GLContext) {\n ownLive++;\n this.glctx = glctx ?? new GLContext(gl);\n canvas.addEventListener(\"webglcontextlost\", this.onLost);\n canvas.addEventListener(\"webglcontextrestored\", this.onRestored);\n }\n\n private ox = 0;\n private oy = 0;\n\n begin(ox: number, oy: number, devW: number, devH: number): boolean {\n const gl = this.gl;\n if (!this.glctx || gl.isContextLost()) return false;\n this.ox = ox;\n this.oy = oy;\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(ox, this.canvas.height - oy - devH, devW, devH);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n return true;\n }\n\n pane(r: PaneRect, draw: () => void): void {\n const gl = this.gl;\n const y = this.canvas.height - this.oy - r.y - r.height;\n gl.viewport(this.ox + r.x, y, r.width, r.height);\n gl.scissor(this.ox + r.x, y, r.width, r.height);\n draw();\n }\n\n end(): void {\n this.gl.bindVertexArray(null);\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n ownLive--;\n this.canvas.removeEventListener(\"webglcontextlost\", this.onLost);\n this.canvas.removeEventListener(\"webglcontextrestored\", this.onRestored);\n const { canvas, gl } = this;\n // A lost context cannot be adopted; the browser has already dropped it.\n if (this.glctx && !gl.isContextLost() && parked.size < PARK_MAX) {\n gl.bindVertexArray(null);\n canvas.width = 1;\n canvas.height = 1;\n const timer = setTimeout(() => dropParked(canvas), PARK_MS);\n // Nobody listens for restoration while parked: let a lost context go.\n const onLost = () => dropParked(canvas);\n canvas.addEventListener(\"webglcontextlost\", onLost);\n parked.set(canvas, { gl, glctx: this.glctx, timer, onLost });\n } else {\n releaseCanvas(canvas, gl);\n }\n }\n\n private readonly onLost = (e: Event): void => {\n e.preventDefault();\n this.glctx?.lost();\n this.glctx = null;\n this.events.lost();\n };\n\n private readonly onRestored = (): void => {\n this.glctx = new GLContext(this.gl);\n this.events.restored();\n };\n}\n\n// ---- Canvas2D ------------------------------------------------------------------------\n\nclass Canvas2DSurface implements Surface {\n readonly kind = \"canvas2d\" as const;\n readonly gl = null;\n readonly glctx = null;\n readonly ctx2d: CanvasRenderingContext2D;\n\n constructor(canvas: HTMLCanvasElement) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"alphacharts: neither WebGL2 nor a 2D context is available\");\n this.ctx2d = ctx;\n }\n\n private ox = 0;\n private oy = 0;\n\n begin(ox: number, oy: number, devW: number, devH: number): boolean {\n const c = this.ctx2d;\n this.ox = ox;\n this.oy = oy;\n c.setTransform(1, 0, 0, 1, 0, 0);\n c.clearRect(ox, oy, devW, devH);\n return true;\n }\n\n pane(r: PaneRect, draw: () => void): void {\n const c = this.ctx2d;\n c.save();\n c.setTransform(1, 0, 0, 1, this.ox + r.x, this.oy + r.y);\n c.beginPath();\n c.rect(0, 0, r.width, r.height);\n c.clip();\n draw();\n c.restore();\n }\n\n end(): void {}\n\n dispose(): void {}\n}\n","// The canvases a chart draws on.\n//\n// A standalone chart owns three canvases (bg, series, overlay). A chart in a\n// Dashboard borrows the dashboard's three, which cover its whole container,\n// and draws inside its own cell: measured on this Mac, 16 charts with their\n// own canvases miss ~25% of 120 Hz frames from compositing 48 layers and 16\n// WebGL contexts; one set of canvases for the dashboard misses none. (A shared\n// context that copied each chart into its own canvas was measured too: the\n// GPU readback per chart made it 3× slower, so it was removed.)\n\nimport { createSurface, parkedCanvas, type Surface, type SurfaceChoice, type SurfaceEvents } from \"../render/surface.js\";\n\nexport interface Layers {\n readonly bg: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n readonly surface: Surface;\n /** The chart's device-px offset within the layer canvases. */\n readonly ox: number;\n readonly oy: number;\n /**\n * A chart drew its series layer. A dashboard redraws the cells that did not,\n * once, before the browser paints (see DashboardCanvases.noteGLDraw).\n */\n glDrawn?(chart: GLMember): void;\n /** Size the canvases (standalone) or re-measure the cell (dashboard). */\n fit(cssW: number, cssH: number, dpr: number): void;\n dispose(): void;\n}\n\nfunction canvas(parent: HTMLElement, extra = \"\"): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n c.style.cssText = `position:absolute;left:0;top:0;width:100%;height:100%;display:block;${extra}`;\n c.setAttribute(\"aria-hidden\", \"true\");\n parent.appendChild(c);\n return c;\n}\n\n/** A parked canvas (its WebGL context kept from a removed chart) in place of a new one. */\nfunction adopt(c: HTMLCanvasElement, parent: HTMLElement): HTMLCanvasElement {\n c.style.cssText = \"position:absolute;left:0;top:0;width:100%;height:100%;display:block;\";\n parent.appendChild(c);\n return c;\n}\n\nfunction ctx2d(c: HTMLCanvasElement): CanvasRenderingContext2D {\n const ctx = c.getContext(\"2d\");\n if (!ctx) throw new Error(\"alphacharts: no 2D canvas context available\");\n return ctx;\n}\n\nexport class OwnLayers implements Layers {\n readonly bg: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n readonly surface: Surface;\n readonly ox = 0;\n readonly oy = 0;\n private readonly canvases: HTMLCanvasElement[];\n\n constructor(root: HTMLElement, renderer: SurfaceChoice, events: SurfaceEvents) {\n const bg = canvas(root);\n const reused = renderer === \"canvas2d\" ? undefined : parkedCanvas();\n const series = reused ? adopt(reused, root) : canvas(root);\n const overlay = canvas(root);\n this.canvases = [bg, series, overlay];\n this.bg = ctx2d(bg);\n this.surface = createSurface(renderer, series, events);\n this.overlay = ctx2d(overlay);\n }\n\n fit(cssW: number, cssH: number, dpr: number): void {\n for (const c of this.canvases) {\n c.width = Math.max(1, Math.round(cssW * dpr));\n c.height = Math.max(1, Math.round(cssH * dpr));\n }\n }\n\n dispose(): void {\n this.surface.dispose();\n for (const c of this.canvases) {\n c.remove();\n // The surface keeps (parks) its canvas's GL context; the 2D ones are done.\n if (c !== this.canvases[1] || this.surface.kind !== \"webgl\") (c.width = 0), (c.height = 0);\n }\n }\n}\n\n/** A chart's view of its dashboard's canvases. */\n/** What a dashboard needs from its charts to keep the shared canvas whole. */\nexport interface GLMember {\n redrawGL(): void;\n}\n\nexport class CellLayers implements Layers {\n ox = 0;\n oy = 0;\n\n constructor(private readonly dash: DashboardCanvases, private readonly cell: HTMLElement) {}\n\n get bg(): CanvasRenderingContext2D {\n return this.dash.bg;\n }\n get overlay(): CanvasRenderingContext2D {\n return this.dash.overlay;\n }\n get surface(): Surface {\n return this.dash.surface;\n }\n\n glDrawn(chart: GLMember): void {\n this.dash.noteGLDraw(chart);\n }\n\n fit(_cssW: number, _cssH: number, dpr: number): void {\n const c = this.dash.container.getBoundingClientRect();\n const r = this.cell.getBoundingClientRect();\n const ox = Math.round((r.left - c.left) * dpr);\n const oy = Math.round((r.top - c.top) * dpr);\n if (ox !== this.ox || oy !== this.oy) {\n this.ox = ox;\n this.oy = oy;\n // The old cell area holds stale pixels: everyone redraws.\n this.dash.layoutChanged();\n }\n }\n\n dispose(): void {}\n}\n\n/** The three canvases a Dashboard shares among its charts. */\nexport class DashboardCanvases {\n readonly bg: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n readonly surface: Surface;\n private readonly canvases: HTMLCanvasElement[];\n\n private readonly drawn = new Set<GLMember>();\n private flushQueued = false;\n private flushing = false;\n\n constructor(\n readonly container: HTMLElement,\n renderer: SurfaceChoice,\n events: SurfaceEvents,\n private readonly onLayout: () => void,\n private readonly members: () => Iterable<GLMember>,\n ) {\n // Canvases paint over the cells but take no input: pointer events reach\n // each chart's own (transparent) root.\n const bg = canvas(container, \"pointer-events:none\");\n const series = canvas(container, \"pointer-events:none\");\n const overlay = canvas(container, \"pointer-events:none\");\n this.canvases = [bg, series, overlay];\n this.bg = ctx2d(bg);\n // The shared WebGL canvas does not keep its pixels between frames (keeping\n // them costs a full-canvas copy every frame: 25 vs 9 missed vsyncs on 16\n // charts, measured). Instead, a frame in which any cell draws redraws every\n // cell once: noteGLDraw.\n this.surface = createSurface(renderer, series, events);\n this.overlay = ctx2d(overlay);\n }\n\n /**\n * A cell drew its series. The browser clears an un-preserved WebGL buffer\n * after every frame that drew to it, so the other cells must draw in the same\n * frame: a microtask, queued by the first draw, runs after the frame's render\n * loop (or after a synchronous render) and before paint, and redraws each\n * cell that did not draw. Every cell draws at most once a frame.\n */\n noteGLDraw(chart: GLMember): void {\n this.drawn.add(chart);\n if (this.flushing || this.flushQueued) return;\n this.flushQueued = true;\n queueMicrotask(() => {\n this.flushQueued = false;\n this.flushing = true;\n try {\n for (const c of this.members()) if (!this.drawn.has(c)) c.redrawGL();\n } finally {\n this.flushing = false;\n this.drawn.clear();\n }\n });\n }\n\n /** Match the container; returns true when the size changed (canvases cleared). */\n resize(dpr: number): boolean {\n const r = this.container.getBoundingClientRect();\n const w = Math.max(1, Math.round(r.width * dpr)), h = Math.max(1, Math.round(r.height * dpr));\n let changed = false;\n for (const c of this.canvases) {\n if (c.width !== w || c.height !== h) {\n c.width = w;\n c.height = h;\n changed = true;\n }\n }\n return changed;\n }\n\n layoutChanged(): void {\n this.onLayout();\n }\n\n clear(): void {\n for (const ctx of [this.bg, this.overlay]) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n }\n\n dispose(): void {\n this.surface.dispose();\n for (const c of this.canvases) c.remove();\n }\n}\n","// Layout persistence: a chart's whole arrangement as versioned JSON, and the\n// storage adapters that keep it.\n//\n// Saved: options and theme, panes (stretch, every scale's options and, when\n// not autoscaling, its range), series (type, id, options), the view (bar\n// spacing, right offset) and each plugin's toJSON(). Not saved: bar data, which\n// belongs to the integrator's feed. A custom price formatter or `timeLabel` is\n// a function and cannot be saved; restoring one needs it passed back (formatters\n// by series id, `timeLabel` by name). The layout records that a `timeLabel` was\n// set (`customOptions`), and restoring without one is refused, never silently\n// drawn with the calendar labels instead.\n//\n// Restoring checks the version: older layouts are migrated step by step, a\n// newer one is refused rather than half-applied.\n\nexport const LAYOUT_VERSION = 1;\n\nexport interface SeriesState {\n id: string;\n type: string;\n options: Record<string, unknown>;\n}\n\nexport interface ScaleState {\n options: Record<string, unknown>;\n /** Display-unit range, saved when the scale is not autoscaling. */\n range?: { min: number; max: number };\n}\n\nexport interface PaneState {\n stretch: number;\n scales: Record<string, ScaleState>;\n}\n\nexport interface ChartState {\n version: typeof LAYOUT_VERSION;\n options: Record<string, unknown>;\n panes: PaneState[];\n series: SeriesState[];\n view: { spacing: number; rightOffset: number };\n plugins: Record<string, unknown>;\n /** Function-valued chart options that were set when saving; the caller re-supplies them on restore. Absent in older layouts. */\n customOptions?: CustomOption[];\n}\n\n/** Chart options that are functions, so not in the JSON. */\nexport type CustomOption = \"timeLabel\";\n\n/** Throws, before anything is changed, when the layout needs a function the caller did not supply. */\nexport function checkCustomOptions(st: ChartState, supplied: Partial<Record<CustomOption, unknown>>): void {\n for (const name of st.customOptions ?? []) {\n if (typeof supplied[name] !== \"function\") {\n throw new Error(`alphacharts: the layout was saved with a custom ${name}, which is a function and not in the JSON; pass it to restoreState({ ${name} })`);\n }\n }\n}\n\n/** Migrations from version n to n + 1, keyed by n. */\nconst MIGRATIONS: Record<number, (s: Record<string, unknown>) => Record<string, unknown>> = {};\n\nexport function migrate(raw: unknown): ChartState {\n if (typeof raw !== \"object\" || raw === null) throw new TypeError(\"layout: expected an object\");\n let s = raw as Record<string, unknown>;\n let v = s.version;\n if (typeof v !== \"number\" || !Number.isInteger(v) || v < 1) throw new TypeError(`layout: invalid version ${String(v)}`);\n if (v > LAYOUT_VERSION) throw new RangeError(`layout: version ${v} is newer than this library understands (${LAYOUT_VERSION})`);\n while (v < LAYOUT_VERSION) {\n const step = MIGRATIONS[v];\n if (!step) throw new Error(`layout: no migration from version ${v}`);\n s = step(s);\n v++;\n }\n for (const k of [\"options\", \"panes\", \"series\", \"view\", \"plugins\"]) {\n if (!(k in s)) throw new TypeError(`layout: missing \"${k}\"`);\n }\n return s as unknown as ChartState;\n}\n\n/** Where layouts are kept. Async so a server-backed store fits the same shape. */\nexport interface LayoutStore {\n load(key: string): Promise<unknown | undefined>;\n save(key: string, state: unknown): Promise<void>;\n remove(key: string): Promise<void>;\n keys(): Promise<string[]>;\n}\n\nexport class MemoryStore implements LayoutStore {\n private readonly map = new Map<string, string>();\n async load(key: string): Promise<unknown | undefined> {\n const v = this.map.get(key);\n return v === undefined ? undefined : JSON.parse(v);\n }\n async save(key: string, state: unknown): Promise<void> {\n this.map.set(key, JSON.stringify(state));\n }\n async remove(key: string): Promise<void> {\n this.map.delete(key);\n }\n async keys(): Promise<string[]> {\n return [...this.map.keys()];\n }\n}\n\n/** localStorage under a prefix. Quota and privacy-mode failures reject. */\nexport class LocalStorageStore implements LayoutStore {\n constructor(private readonly prefix = \"alphacharts:\") {}\n async load(key: string): Promise<unknown | undefined> {\n const v = localStorage.getItem(this.prefix + key);\n return v === null ? undefined : JSON.parse(v);\n }\n async save(key: string, state: unknown): Promise<void> {\n localStorage.setItem(this.prefix + key, JSON.stringify(state));\n }\n async remove(key: string): Promise<void> {\n localStorage.removeItem(this.prefix + key);\n }\n async keys(): Promise<string[]> {\n const out: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (k?.startsWith(this.prefix)) out.push(k.slice(this.prefix.length));\n }\n return out;\n }\n}\n\n/** Options with functions removed (custom formatters are re-supplied on restore). */\nexport function plain(o: object): Record<string, unknown> {\n return JSON.parse(JSON.stringify(o, (_k, v) => (typeof v === \"function\" ? undefined : v))) as Record<string, unknown>;\n}\n","// Vertical mapping between price and CSS pixels inside a pane.\n//\n// A scale works in display units: price (linear), log10(price) (log),\n// percent change from a base price (percent), or price indexed to 100 at the\n// base (indexed). The base is the first visible bar of the scale's main\n// series, as traders expect: scrolling re-bases.\n//\n// Renderers upload a coordinate per value: the price itself, or log10(price)\n// for a log scale. y is affine in that coordinate in every mode (inverted\n// included), so the GPU transform stays one multiply-add: y = A + B · coord.\n//\n// With autoScale on, the range follows the visible bars' high/low every frame\n// (an O(log n) LOD query per series). Dragging the axis or panning vertically\n// turns autoScale off until the axis is double-clicked.\n\nimport type { AxisTick } from \"./ticks.js\";\n\nexport type PriceScaleMode = \"linear\" | \"log\" | \"percent\" | \"indexed\";\n\nexport interface PriceScaleOptions {\n /** Fractions of the pane height kept empty above and below the data. */\n marginTop: number;\n marginBottom: number;\n autoScale: boolean;\n mode: PriceScaleMode;\n /** Higher values lower on screen. */\n invert: boolean;\n /** Where the axis is drawn; \"none\" for overlay scales such as volume. */\n position: \"right\" | \"left\" | \"none\";\n visible: boolean;\n /** Minimum width of the axis in CSS px (the axis is otherwise as wide as its labels need); left and right axes. */\n minWidth?: number;\n}\n\n/** Throws on an option value the axis cannot use. */\nexport function checkPriceScaleOptions(o: Partial<PriceScaleOptions>): void {\n if (o.minWidth !== undefined && !(typeof o.minWidth === \"number\" && Number.isFinite(o.minWidth) && o.minWidth >= 0)) {\n throw new RangeError(`alphacharts: price scale minWidth must be a non-negative number of CSS px, got ${o.minWidth}`);\n }\n}\n\nexport const DEFAULT_PRICE_SCALE: PriceScaleOptions = {\n marginTop: 0.1,\n marginBottom: 0.1,\n autoScale: true,\n mode: \"linear\",\n invert: false,\n position: \"right\",\n visible: true,\n};\n\nexport class PriceScale {\n /** Visible range in display units. */\n min = 0;\n max = 1;\n /** Pane height in CSS px. */\n height = 0;\n /** Base price for percent and indexed modes. */\n base = 1;\n /** True once the range has been set from data or restored: before that min/max are placeholders. */\n ranged = false;\n /** @internal Layout of this frame: axis ticks and the axis column (CSS px). */\n ticks: AxisTick[] = [];\n /** @internal */ axisX = 0;\n /** @internal */ axisW = 0;\n\n constructor(readonly id: string, public options: PriceScaleOptions) {}\n\n get mode(): PriceScaleMode {\n return this.options.mode;\n }\n\n /** Values uploaded to the GPU are log10(price) on a log scale. */\n get logCoords(): boolean {\n return this.options.mode === \"log\";\n }\n\n private get innerTop(): number {\n return this.height * this.options.marginTop;\n }\n private get innerHeight(): number {\n return Math.max(1, this.height * (1 - this.options.marginTop - this.options.marginBottom));\n }\n\n /** CSS px per display unit. */\n get pxPerUnit(): number {\n return this.innerHeight / (this.max - this.min);\n }\n\n /** Price → display units (NaN for a non-positive price on a log scale). */\n display(p: number): number {\n switch (this.options.mode) {\n case \"linear\": return p;\n case \"log\": return p > 0 ? Math.log10(p) : Number.NaN;\n case \"percent\": return (p / this.base - 1) * 100;\n case \"indexed\": return (p / this.base) * 100;\n }\n }\n\n /** Display units → price. */\n fromDisplay(v: number): number {\n switch (this.options.mode) {\n case \"linear\": return v;\n case \"log\": return 10 ** v;\n case \"percent\": return (v / 100 + 1) * this.base;\n case \"indexed\": return (v / 100) * this.base;\n }\n }\n\n /** The coordinate renderers upload for a price. */\n coord(p: number): number {\n return this.logCoords ? (p > 0 ? Math.log10(p) : Number.NaN) : p;\n }\n\n /** CSS y of display value v. */\n yOfDisplay(v: number): number {\n return this.options.invert ? this.innerTop + (v - this.min) * this.pxPerUnit : this.innerTop + (this.max - v) * this.pxPerUnit;\n }\n\n y(price: number): number {\n return this.yOfDisplay(this.display(price));\n }\n\n displayAt(y: number): number {\n return this.options.invert ? this.min + (y - this.innerTop) / this.pxPerUnit : this.max - (y - this.innerTop) / this.pxPerUnit;\n }\n\n price(y: number): number {\n return this.fromDisplay(this.displayAt(y));\n }\n\n /** dy/dcoord in CSS px: signed, affine in every mode (see the header). */\n get pxPerCoord(): number {\n const k = this.pxPerUnit * (this.options.invert ? 1 : -1);\n switch (this.options.mode) {\n case \"linear\":\n case \"log\": return k;\n case \"percent\":\n case \"indexed\": return (k * 100) / this.base;\n }\n }\n\n /** CSS y of an uploaded coordinate. */\n yOfCoord(c: number): number {\n return this.yOfDisplay(this.logCoords ? c : this.display(c));\n }\n\n /** Apply an autoscale result in prices; a flat or empty range still gets a usable span. */\n fit(lo: number, hi: number): void {\n if (!(lo <= hi)) return; // NaN: nothing visible, keep the last range\n let a = this.display(lo), b = this.display(hi);\n if (this.logCoords && !(a === a)) a = b - 1; // non-positive low on a log scale\n if (!(a <= b)) return;\n if (b === a) {\n const pad = a === 0 ? 1 : Math.abs(a) * 0.005;\n a -= pad;\n b += pad;\n }\n this.min = a;\n this.max = b;\n this.ranged = true;\n }\n\n /** Stretch around the centre; factor > 1 zooms in. Turns autoScale off. */\n scale(factor: number): void {\n const mid = (this.min + this.max) / 2;\n const half = (this.max - this.min) / 2 / factor;\n if (!(half > 0) || !Number.isFinite(half)) return;\n this.min = mid - half;\n this.max = mid + half;\n this.ranged = true;\n this.options = { ...this.options, autoScale: false };\n }\n\n /** Move by dy CSS px (content follows the pointer). Turns autoScale off. */\n pan(dy: number): void {\n const d = (dy / this.pxPerUnit) * (this.options.invert ? -1 : 1);\n this.min += d;\n this.max += d;\n this.ranged = true;\n this.options = { ...this.options, autoScale: false };\n }\n}\n","// Axis tick marks.\n//\n// Price: \"nice\" steps (1, 2, 2.5, 5 × 10^k), never finer than the series'\n// minimum price move.\n//\n// Time: every bar has a weight — the coarsest calendar boundary crossed since\n// the previous bar (year > month > day > 12h > … > 1s), in the chart's time\n// zone. Labels go to the heaviest bars first, skipping any that would crowd\n// an accepted one. Candidates are generated from calendar boundaries in the\n// visible span and mapped to bars by binary search, so the cost tracks the\n// label count, not the bar count (10M bars visible costs the same as 1k).\n\nimport { civilFromLocal, DAY_MS, localFromCivil, type TimeZone } from \"../data/tz.js\";\nimport type { Formatter } from \"./format.js\";\nimport type { PriceScale } from \"./price-scale.js\";\nimport type { Timeline } from \"../data/timeline.js\";\n\n// ---- price ---------------------------------------------------------------\n\n/** Tick prices from lo to hi, about `targetGapPx` apart. */\nexport function priceTicks(lo: number, hi: number, heightPx: number, targetGapPx: number, minMove: number): { step: number; ticks: number[] } {\n const n = Math.max(1, heightPx / targetGapPx);\n const step = niceStep((hi - lo) / n, minMove);\n const ticks: number[] = [];\n if (!(step > 0) || !Number.isFinite(lo) || !Number.isFinite(hi)) return { step, ticks };\n const start = Math.ceil(lo / step);\n const end = Math.floor(hi / step);\n for (let k = start; k <= end && ticks.length < 200; k++) ticks.push(roundTo(k * step, step));\n return { step, ticks };\n}\n\n/** About `count` nice tick values across [lo, hi], for scales that are not prices (no minimum move). */\nexport function niceTicks(lo: number, hi: number, count: number): { step: number; ticks: number[] } {\n return priceTicks(lo, hi, Math.max(1, count), 1, 0);\n}\n\n/**\n * Smallest 1/2/2.5/5 × 10^k step at or above `raw` that is a whole multiple of\n * `minMove`. The multiple rule keeps every tick on a price the series'\n * formatter shows exactly: a 2.5 step under a 0.01 minMove would put the\n * label \"100.03\" on a gridline at 100.025.\n */\nexport function niceStep(raw: number, minMove: number): number {\n if (!(raw > 0) || !Number.isFinite(raw)) return minMove > 0 ? minMove : 0;\n const multiple = (s: number) => !(minMove > 0) || (s >= minMove * (1 - 1e-9) && Math.abs(s / minMove - Math.round(s / minMove)) < 1e-6);\n for (let e = Math.floor(Math.log10(raw)); e < 400; e++) {\n const p = Math.pow(10, e);\n for (const f of [1, 2, 2.5, 5]) {\n const st = f * p;\n if (st >= raw * (1 - 1e-12) && multiple(st)) return st;\n }\n }\n return minMove;\n}\n\n/** Remove binary noise (0.30000000000000004) without changing the tick. */\nfunction roundTo(v: number, step: number): number {\n const d = Math.max(0, -Math.floor(Math.log10(step)) + 2);\n return +v.toFixed(Math.min(d, 15));\n}\n\nexport interface AxisTick {\n price: number;\n label: string;\n}\n\n/** Text for a price on a scale's axis, in the scale's mode. */\nexport function axisText(sc: PriceScale, fmt: Formatter | undefined, price: number): string {\n switch (sc.mode) {\n case \"percent\": return `${sc.display(price).toFixed(2)}%`;\n case \"indexed\": return sc.display(price).toFixed(2);\n default: return fmt ? fmt.format(price) : String(price);\n }\n}\n\n/** Ticks for a price scale about `gapPx` apart, in its mode. */\nexport function scaleTicks(sc: PriceScale, fmt: Formatter | undefined, gapPx: number): AxisTick[] {\n const h = sc.height;\n if (!(h > 0) || !(sc.max > sc.min)) return [];\n const label = (p: number) => ({ price: p, label: axisText(sc, fmt, p) });\n if (sc.mode === \"percent\" || sc.mode === \"indexed\") {\n return priceTicks(sc.min, sc.max, h, gapPx, 0.01).ticks.map((v) => label(sc.fromDisplay(v)));\n }\n if (sc.mode === \"log\" && sc.max - sc.min > 0.3) return logTicks(sc, gapPx).map(label);\n // Linear, or a log scale spanning less than a factor of 2: plain price steps.\n const a = sc.price(0), b = sc.price(h);\n return priceTicks(Math.min(a, b), Math.max(a, b), h, gapPx, fmt?.minMove ?? 0).ticks.map(label);\n}\n\n/** 1-2-5 (or every mantissa, or every n-th decade) prices, by available room. */\nfunction logTicks(sc: PriceScale, gapPx: number): number[] {\n const pxPerDecade = sc.pxPerUnit;\n const mantissas = pxPerDecade >= gapPx * 9 ? [1, 2, 3, 4, 5, 6, 7, 8, 9] : pxPerDecade >= gapPx * 3 ? [1, 2, 5] : [1];\n const every = Math.max(1, Math.ceil(gapPx / pxPerDecade));\n const out: number[] = [];\n let lastY = Number.POSITIVE_INFINITY;\n for (let e = Math.floor(sc.min); e <= Math.ceil(sc.max) && out.length < 200; e++) {\n if (mantissas.length === 1 && e % every !== 0) continue;\n for (const m of mantissas) {\n const v = m * 10 ** e;\n const d = Math.log10(v);\n if (d < sc.min || d > sc.max) continue;\n const y = sc.y(v);\n if (Math.abs(lastY - y) < gapPx) continue;\n out.push(+v.toPrecision(12));\n lastY = y;\n }\n }\n return out;\n}\n\n// ---- time ----------------------------------------------------------------\n\nexport const W_YEAR = 20;\nexport const W_MONTH = 19;\nexport const W_DAY = 18;\nconst FIXED: readonly [number, number][] = [\n [17, 12 * 3_600_000],\n [16, 6 * 3_600_000],\n [15, 3 * 3_600_000],\n [14, 3_600_000],\n [13, 30 * 60_000],\n [12, 15 * 60_000],\n [11, 5 * 60_000],\n [10, 60_000],\n [9, 30_000],\n [8, 15_000],\n [7, 5_000],\n [6, 1_000],\n];\n\n/** Weight of a bar at t whose predecessor is at prev (NaN for the first bar). */\nexport function weightBetween(tz: TimeZone, prev: number, t: number): number {\n if (prev !== prev) return W_YEAR;\n return weightLocal(prev + tz.offset(prev), t + tz.offset(t));\n}\n\n/**\n * Weight between two local-time instants. Calendar fields are computed only\n * when the local day changes (rare for intraday bars); within a day the\n * fixed periods are integer divisions, so a scan over thousands of bars\n * allocates nothing.\n */\nexport function weightLocal(la: number, lb: number, minWeight = 0): number {\n if (Math.floor(la / DAY_MS) !== Math.floor(lb / DAY_MS)) {\n const a = civilFromLocal(la);\n const b = civilFromLocal(lb);\n if (a.year !== b.year) return W_YEAR;\n if (a.month !== b.month) return W_MONTH;\n return W_DAY;\n }\n for (const [w, p] of FIXED) {\n if (w < minWeight) return 0;\n if (Math.floor(la / p) !== Math.floor(lb / p)) return w;\n }\n return 0;\n}\n\n/**\n * Lightest weight that can still win a label: a boundary that recurs more\n * often than every half label gap (in wall time per bar) never survives the\n * spacing check, so collecting it is wasted work.\n */\nfunction minUsefulWeight(msPerBar: number, spacing: number, gapPx: number): number {\n const minPeriod = (msPerBar * gapPx) / spacing / 2;\n let w = W_DAY;\n for (const [fw, p] of FIXED) if (p >= minPeriod) w = fw;\n return minPeriod > FIXED[0]![1] ? W_DAY : w;\n}\n\nexport interface TimeTick {\n index: number;\n weight: number;\n x: number;\n}\n\n/**\n * Labels for indices [lo, hi] at the given scale. `x(i)` maps an index to CSS\n * px; `gapPx` is the minimum distance between label centres.\n */\nexport function timeTicks(tl: Timeline, tz: TimeZone, lo: number, hi: number, x: (i: number) => number, spacing: number, gapPx: number): TimeTick[] {\n if (hi < lo || tl.length === 0) return [];\n const cands: TimeTick[] = [];\n const time = (i: number) => (i > tl.first ? tl.timeAt(i - 1) : Number.NaN);\n const t0 = tl.timeAt(lo);\n const t1 = tl.timeAt(hi);\n // Every bar that can win a label is the first bar after a calendar\n // boundary at least as long as the lightest useful weight, so candidates\n // come from those boundaries by binary search: cost follows the label\n // count, not the number of visible bars.\n const msPerBar = hi > lo ? (t1 - t0) / (hi - lo) : 0;\n const minW = msPerBar > 0 ? minUsefulWeight(msPerBar, spacing, gapPx) : 0;\n const finest = msPerBar > 0 ? (msPerBar * gapPx) / spacing / 2 : 1000;\n const seen = new Set<number>();\n const add = (boundary: number) => {\n const i = tl.lowerBound(boundary);\n if (i < lo || i > hi || seen.has(i)) return;\n seen.add(i);\n const w = weightBetween(tz, time(i), tl.timeAt(i));\n if (w > 0 && w >= minW) cands.push({ index: i, weight: w, x: x(i) });\n };\n add(t0);\n boundaries(tz, t0, t1, finest, add);\n // Heaviest first; among equals, left to right.\n cands.sort((a, b) => b.weight - a.weight || a.index - b.index);\n const out: TimeTick[] = [];\n for (const c of cands) {\n let ok = true;\n for (const o of out) {\n if (Math.abs(o.x - c.x) < gapPx) {\n ok = false;\n break;\n }\n }\n if (ok) out.push(c);\n if (out.length > 200) break;\n }\n out.sort((a, b) => a.index - b.index);\n return out;\n}\n\n/** Call `add` with calendar boundaries in [t0, t1] no finer than `finest` ms apart. */\nfunction boundaries(tz: TimeZone, t0: number, t1: number, finest: number, add: (t: number) => void): void {\n const c0 = tz.civil(t0);\n const c1 = tz.civil(t1);\n for (let y = c0.year + 1; y <= c1.year; y++) add(tz.fromLocal(localFromCivil(y, 1, 1)));\n if (finest >= 300 * DAY_MS) return;\n const monthStep = finest >= 90 * DAY_MS ? 3 : 1;\n for (let y = c0.year, m = c0.month; y < c1.year || (y === c1.year && m <= c1.month); ) {\n m += 1;\n if (m > 12) {\n m = 1;\n y += 1;\n }\n if ((m - 1) % monthStep === 0) add(tz.fromLocal(localFromCivil(y, m, 1)));\n }\n if (finest >= 25 * DAY_MS) return;\n let step = DAY_MS;\n for (const [, p] of FIXED) if (p >= finest) step = p;\n if (finest > DAY_MS) step = DAY_MS * Math.min(7, Math.ceil(finest / DAY_MS));\n const l0 = t0 + tz.offset(t0);\n const l1 = t1 + tz.offset(t1);\n let n = 0;\n for (let l = Math.ceil(l0 / step) * step; l <= l1 && n < 2000; l += step, n++) add(tz.fromLocal(l));\n}\n\n// ---- formatting ------------------------------------------------------------\n\n/**\n * Host-supplied text for the time axis and the crosshair's time label, for a\n * chart whose x axis is not a clock (an ordinal axis of Renko bricks, say).\n * `kind` says where the text goes: \"tick\" (axis) or \"crosshair\".\n */\nexport type TimeLabel = (time: number, kind: \"tick\" | \"crosshair\") => string;\n\n/** The host's label when it set one, else the calendar label. A host label that is not a string throws. */\nexport function timeText(custom: TimeLabel | undefined, kind: \"tick\" | \"crosshair\", time: number, calendar: () => string): string {\n if (!custom) return calendar();\n const s = custom(time, kind);\n if (typeof s !== \"string\") throw new TypeError(`alphacharts: timeLabel(${time}, \"${kind}\") returned ${typeof s}, not a string`);\n return s;\n}\n\nexport class TimeFormatter {\n private readonly year: Intl.DateTimeFormat;\n private readonly month: Intl.DateTimeFormat;\n private readonly day: Intl.DateTimeFormat;\n private readonly hm: Intl.DateTimeFormat;\n private readonly hms: Intl.DateTimeFormat;\n private readonly full: Intl.DateTimeFormat;\n private readonly fullDate: Intl.DateTimeFormat;\n\n /** The crosshair label's own format (the `timeFormat` option), when set. */\n private readonly custom: Intl.DateTimeFormat | undefined;\n\n constructor(locale: string | undefined, tz: TimeZone, timeFormat?: Intl.DateTimeFormatOptions) {\n const timeZone = tz.id;\n if (timeFormat && \"timeZone\" in timeFormat) throw new Error(\"alphacharts: timeFormat must not set timeZone; use the chart's timeZone option\");\n this.custom = timeFormat ? new Intl.DateTimeFormat(locale, { ...timeFormat, timeZone }) : undefined;\n this.year = new Intl.DateTimeFormat(locale, { timeZone, year: \"numeric\" });\n this.month = new Intl.DateTimeFormat(locale, { timeZone, month: \"short\" });\n this.day = new Intl.DateTimeFormat(locale, { timeZone, day: \"numeric\" });\n this.hm = new Intl.DateTimeFormat(locale, { timeZone, hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" });\n this.hms = new Intl.DateTimeFormat(locale, { timeZone, hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", hourCycle: \"h23\" });\n this.full = new Intl.DateTimeFormat(locale, {\n timeZone, weekday: \"short\", day: \"numeric\", month: \"short\", year: \"2-digit\", hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\",\n });\n this.fullDate = new Intl.DateTimeFormat(locale, { timeZone, weekday: \"short\", day: \"numeric\", month: \"short\", year: \"2-digit\" });\n }\n\n private readonly cache = new Map<number, string>();\n\n /** Axis label for a bar; cached, since the same labels repeat every frame. */\n tick(t: number, weight: number): string {\n const key = t * 32 + weight;\n let s = this.cache.get(key);\n if (s === undefined) {\n if (this.cache.size > 4096) this.cache.clear();\n s = this.tickUncached(t, weight);\n this.cache.set(key, s);\n }\n return s;\n }\n\n private tickUncached(t: number, weight: number): string {\n if (weight >= W_YEAR) return this.year.format(t);\n if (weight >= W_MONTH) return this.month.format(t);\n if (weight >= W_DAY) return this.day.format(t);\n if (weight >= 10) return this.hm.format(t);\n return this.hms.format(t);\n }\n\n crosshair(t: number, withTime: boolean): string {\n if (this.custom) return this.custom.format(t);\n return (withTime ? this.full : this.fullDate).format(t);\n }\n}\n\nexport class PriceFormatter {\n readonly decimals: number;\n constructor(readonly minMove: number) {\n if (!(minMove > 0)) throw new RangeError(`minMove must be positive, got ${minMove}`);\n // Decimals needed to show minMove exactly (0.25 → 2, 0.05 → 2, 1 → 0).\n let d = 0;\n while (d < 10 && Math.abs(Math.round(minMove * 10 ** d) - minMove * 10 ** d) > 1e-9 * 10 ** d) d++;\n this.decimals = d;\n }\n format(p: number): string {\n return p.toFixed(this.decimals);\n }\n}\n","// Horizontal mapping between timeline index and CSS pixels inside a pane.\n//\n// The view is two numbers: `spacing` (CSS px per bar) and `rightOffset` (bars\n// between the last bar and the right edge; negative when scrolled into\n// history). Anchoring on the last bar is what makes \"follow the live bar\" free:\n// appending a bar with rightOffset unchanged scrolls the view by one bar.\n\nexport interface TimeScaleOptions {\n /** Initial and reset bar spacing in CSS px. */\n barSpacing: number;\n maxBarSpacing: number;\n /** Bars of empty space right of the last bar at reset. */\n rightOffset: number;\n}\n\nexport const DEFAULT_TIME_SCALE: TimeScaleOptions = { barSpacing: 8, maxBarSpacing: 80, rightOffset: 4 };\n\nexport class TimeScale {\n spacing: number;\n rightOffset: number;\n /** Pane width in CSS px. */\n width = 0;\n /** Timeline bounds, kept in sync by the chart: [first, end). */\n first = 0;\n end = 0;\n\n constructor(readonly options: TimeScaleOptions) {\n this.spacing = options.barSpacing;\n this.rightOffset = options.rightOffset;\n }\n\n get last(): number {\n return this.end - 1;\n }\n\n /** Logical (fractional index) coordinate at the right edge. */\n get right(): number {\n return this.last + 0.5 + this.rightOffset;\n }\n get left(): number {\n return this.right - this.width / this.spacing;\n }\n\n /** CSS x of index i's centre. */\n x(i: number): number {\n return this.width - (this.right - i) * this.spacing;\n }\n\n /** Fractional index at CSS x. */\n logical(x: number): number {\n return this.right - (this.width - x) / this.spacing;\n }\n\n /** Nearest whole index at CSS x (may lie outside the data). */\n indexAt(x: number): number {\n return Math.round(this.logical(x));\n }\n\n /** First and last index intersecting the view, clamped to the data. Empty when hi < lo. */\n visible(out: { lo: number; hi: number } = { lo: 0, hi: -1 }): { lo: number; hi: number } {\n out.lo = Math.max(this.first, Math.floor(this.left + 0.5));\n out.hi = Math.min(this.last, Math.ceil(this.right - 0.5));\n return out;\n }\n\n /** True while the last bar is on screen; a new bar then scrolls the view. */\n get following(): boolean {\n return this.x(this.last) <= this.width + this.spacing * 0.5;\n }\n\n minSpacing(): number {\n const n = Math.max(1, this.end - this.first);\n // Let the whole history fit with room to spare, but never below what a\n // 1M-px-wide screen could need.\n return Math.max(1e-7, Math.min(0.5, (this.width / n) * 0.5));\n }\n\n zoom(anchorX: number, factor: number): void {\n const at = this.logical(anchorX);\n this.spacing = clamp(this.spacing * factor, this.minSpacing(), this.options.maxBarSpacing);\n this.setRight(at + (this.width - anchorX) / this.spacing);\n }\n\n /** Content follows a drag of dx CSS px. */\n pan(dx: number): void {\n this.setRight(this.right - dx / this.spacing);\n }\n\n scrollToLatest(): void {\n this.rightOffset = this.options.rightOffset;\n this.clamp();\n }\n\n scrollToStart(): void {\n this.setRight(this.first - 0.5 + this.width / this.spacing - this.options.rightOffset);\n }\n\n reset(): void {\n this.spacing = this.options.barSpacing;\n this.scrollToLatest();\n }\n\n fitAll(): void {\n const n = Math.max(1, this.end - this.first + this.options.rightOffset);\n this.spacing = clamp(this.width / n, this.minSpacing(), this.options.maxBarSpacing);\n this.rightOffset = this.options.rightOffset;\n this.clamp();\n }\n\n /** Show [lo, hi] (fractional indices) across the full width. */\n setRange(lo: number, hi: number): void {\n if (!(hi > lo)) return;\n this.spacing = clamp(this.width / (hi - lo), this.minSpacing(), this.options.maxBarSpacing);\n this.setRight(hi);\n }\n\n setRight(right: number): void {\n this.rightOffset = right - this.last - 0.5;\n this.clamp();\n }\n\n clamp(): void {\n if (this.width <= 0 || this.end <= this.first) return;\n this.spacing = clamp(this.spacing, this.minSpacing(), this.options.maxBarSpacing);\n const barsWide = this.width / this.spacing;\n // Keep at least ~2 bars (or the whole series, if smaller) on screen.\n const keep = Math.min(2, this.end - this.first);\n const maxOffset = barsWide - 0.5 - keep;\n const minOffset = this.first - this.last - 0.5 + keep;\n this.rightOffset = clamp(this.rightOffset, minOffset, Math.max(minOffset, maxOffset));\n }\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v;\n}\n","// One requestAnimationFrame loop for every chart on the page. Charts mark\n// layers dirty; the loop renders each dirty chart once per frame, so 100 Hz\n// ticks or a dashboard of synced charts never render more than once per\n// display refresh.\n\nexport const LAYER_BG = 1;\nexport const LAYER_GL = 2;\nexport const LAYER_OVERLAY = 4;\nexport const LAYER_ALL = LAYER_BG | LAYER_GL | LAYER_OVERLAY;\n\nexport interface Renderable {\n render(layers: number, now: number): void;\n}\n\nconst dirty = new Map<Renderable, number>();\nlet raf = 0;\n\nexport function requestRender(r: Renderable, layers: number): void {\n dirty.set(r, (dirty.get(r) ?? 0) | layers);\n if (raf === 0) raf = requestAnimationFrame(frame);\n}\n\nexport function cancelRender(r: Renderable): void {\n dirty.delete(r);\n}\n\nfunction frame(now: number): void {\n raf = 0;\n // Snapshot: a render may request the next frame (kinetic scroll).\n const batch = [...dirty];\n dirty.clear();\n // One chart's failure must not freeze the others: render every chart,\n // then surface the first error.\n let failure: { error: unknown } | null = null;\n for (const [r, layers] of batch) {\n try {\n r.render(layers, now);\n } catch (error) {\n failure ??= { error };\n }\n }\n if (failure) throw failure.error;\n}\n","// Pointer, wheel and keyboard input for one chart.\n//\n// Pointer Events cover mouse, pen and touch:\n// - drag in a pane pans time (and price when its scale is not autoscaling),\n// then coasts with kinetic decay;\n// - drag on a price axis scales price, on the time axis scales time;\n// - drag on a separator resizes panes;\n// - two touch pointers pinch-zoom around their midpoint.\n// The wheel zooms around the pointer (vertical wheel, or ctrl+wheel, which is\n// how macOS trackpads report a pinch) and pans on horizontal deltas.\n// Touch: long-press turns the drag into a crosshair that follows the finger;\n// two quick taps act as a double-click. Kinetic scrolling is off under\n// prefers-reduced-motion.\n// Keyboard: chart.options().keymap (TradingView-like defaults: ←/→ pan, ↑/↓\n// and +/− zoom, Home/End, Shift+←/→ step the crosshair one bar, announced to\n// screen readers, Esc hides it, Alt+R resets).\n\nimport type { Chart } from \"../chart/chart.js\";\nimport { LAYER_OVERLAY } from \"../chart/scheduler.js\";\n\ntype Drag =\n | { kind: \"pan\"; pane: number; x: number; y: number; moved: boolean }\n | { kind: \"priceAxis\"; pane: number; scaleId: string; y: number; moved: boolean }\n | { kind: \"timeAxis\"; x: number; moved: boolean }\n | { kind: \"separator\"; index: number; y: number; moved: boolean }\n /** A plugin consumed the pointer-down: it gets the move/up, the chart does nothing. */\n | { kind: \"plugin\"; moved: boolean }\n /** Touch long-press: the crosshair follows the finger instead of panning. */\n | { kind: \"crosshair\"; pane: number; moved: boolean };\n\nconst DRAG_SLOP = 3;\nconst KINETIC_MIN = 0.15; // px/ms to start coasting\nconst KINETIC_STOP = 0.02;\n\nexport class Interaction {\n private drag: Drag | null = null;\n private readonly pointers = new Map<number, { x: number; y: number; type: string }>();\n private pinch: { dist: number; mid: number } | null = null;\n private samples: { t: number; x: number }[] = [];\n private kinetic = 0;\n private rect: DOMRect | null = null;\n private longPress = 0;\n private lastTap = { t: 0, x: 0, y: 0 };\n\n constructor(private readonly chart: Chart, private readonly root: HTMLElement, private readonly surface: HTMLElement) {\n surface.addEventListener(\"pointerdown\", this.down);\n surface.addEventListener(\"pointermove\", this.move);\n surface.addEventListener(\"pointerup\", this.up);\n surface.addEventListener(\"pointercancel\", this.up);\n surface.addEventListener(\"pointerleave\", this.leave);\n surface.addEventListener(\"dblclick\", this.dbl);\n surface.addEventListener(\"wheel\", this.wheel, { passive: false });\n root.addEventListener(\"keydown\", this.key);\n }\n\n dispose(): void {\n this.stopKinetic();\n this.cancelLongPress();\n const s = this.surface;\n s.removeEventListener(\"pointerdown\", this.down);\n s.removeEventListener(\"pointermove\", this.move);\n s.removeEventListener(\"pointerup\", this.up);\n s.removeEventListener(\"pointercancel\", this.up);\n s.removeEventListener(\"pointerleave\", this.leave);\n s.removeEventListener(\"dblclick\", this.dbl);\n s.removeEventListener(\"wheel\", this.wheel);\n this.root.removeEventListener(\"keydown\", this.key);\n }\n\n private twoPointers(): [{ x: number; y: number }, { x: number; y: number }] {\n const [a, b] = this.pointers.values();\n return [a!, b!];\n }\n\n private local(e: { clientX: number; clientY: number }): { x: number; y: number } {\n const r = this.rect ?? this.root.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n }\n\n private readonly down = (e: PointerEvent): void => {\n this.stopKinetic();\n this.rect = this.root.getBoundingClientRect();\n const p = this.local(e);\n this.pointers.set(e.pointerId, { ...p, type: e.pointerType });\n this.surface.setPointerCapture(e.pointerId);\n this.root.focus({ preventScroll: true });\n if (this.pointers.size === 2) {\n const [a, b] = this.twoPointers();\n this.pinch = { dist: Math.hypot(a.x - b.x, a.y - b.y), mid: (a.x + b.x) / 2 };\n this.drag = null;\n return;\n }\n if (this.pointers.size > 2) return;\n const r = this.chart.region(p.x, p.y);\n if (r.kind === \"pane\" && this.chart.pluginPointer(\"down\", p.x, p.y, e)) {\n this.drag = { kind: \"plugin\", moved: false };\n return;\n }\n switch (r.kind) {\n case \"pane\":\n this.drag = { kind: \"pan\", pane: r.pane, x: p.x, y: p.y, moved: false };\n this.samples = [{ t: e.timeStamp, x: p.x }];\n if (e.pointerType === \"touch\") {\n const pane = r.pane;\n this.longPress = window.setTimeout(() => {\n this.longPress = 0;\n if (this.drag?.kind === \"pan\" && !this.drag.moved) this.drag = { kind: \"crosshair\", pane, moved: false };\n }, 450);\n }\n if (e.pointerType !== \"mouse\") this.chart.setCrosshair({ x: p.x, y: r.y, pane: r.pane }, \"pointer\");\n break;\n case \"priceAxis\":\n this.drag = { kind: \"priceAxis\", pane: r.pane, scaleId: r.scaleId, y: p.y, moved: false };\n break;\n case \"timeAxis\":\n this.drag = { kind: \"timeAxis\", x: p.x, moved: false };\n break;\n case \"separator\":\n this.drag = { kind: \"separator\", index: r.index, y: p.y, moved: false };\n break;\n case \"none\":\n this.drag = null;\n }\n };\n\n private readonly move = (e: PointerEvent): void => {\n const p = this.local(e);\n const ptr = this.pointers.get(e.pointerId);\n if (ptr) {\n ptr.x = p.x;\n ptr.y = p.y;\n }\n const opts = this.chart.interactionOptions;\n if (this.pinch && this.pointers.size === 2) {\n const [a, b] = this.twoPointers();\n const dist = Math.hypot(a.x - b.x, a.y - b.y);\n const mid = (a.x + b.x) / 2;\n const area = this.chart.paneArea;\n this.chart.viewChanged(() => {\n if (opts.pan) this.chart.time.pan(mid - this.pinch!.mid);\n if (opts.zoom && this.pinch!.dist > 0) this.chart.time.zoom(mid - area.x, dist / this.pinch!.dist);\n });\n this.pinch = { dist, mid };\n return;\n }\n const d = this.drag;\n if (!d) {\n this.chart.pluginPointer(\"move\", p.x, p.y, e);\n this.hover(p.x, p.y, e.pointerType);\n return;\n }\n switch (d.kind) {\n case \"crosshair\": {\n d.moved = true;\n const r = this.chart.region(p.x, p.y);\n if (r.kind === \"pane\") this.chart.setCrosshair({ x: p.x, y: r.y, pane: r.pane }, \"pointer\");\n break;\n }\n case \"plugin\":\n d.moved = true;\n this.chart.pluginPointer(\"move\", p.x, p.y, e);\n if (e.pointerType === \"mouse\") this.hover(p.x, p.y, e.pointerType);\n break;\n case \"pan\": {\n const dx = p.x - d.x, dy = p.y - d.y;\n if (!d.moved && Math.hypot(dx, dy) < DRAG_SLOP) return;\n d.moved = true;\n this.cancelLongPress();\n if (opts.pan) {\n this.chart.viewChanged(() => this.chart.time.pan(dx));\n this.chart.panPrice(d.pane, dy);\n }\n d.x = p.x;\n d.y = p.y;\n this.samples.push({ t: e.timeStamp, x: p.x });\n if (this.samples.length > 8) this.samples.shift();\n if (e.pointerType === \"mouse\") this.hover(p.x, p.y, e.pointerType);\n else this.chart.setCrosshair(null, \"pointer\");\n break;\n }\n case \"priceAxis\": {\n const dy = p.y - d.y;\n d.moved ||= Math.abs(dy) > 0;\n if (opts.zoom) this.chart.scalePrice(d.pane, d.scaleId, Math.exp(-dy * 0.005));\n d.y = p.y;\n break;\n }\n case \"timeAxis\": {\n const dx = p.x - d.x;\n d.moved ||= Math.abs(dx) > 0;\n const area = this.chart.paneArea;\n if (opts.zoom) this.chart.viewChanged(() => this.chart.time.zoom(area.width, Math.exp(dx * 0.005)));\n d.x = p.x;\n break;\n }\n case \"separator\": {\n const dy = p.y - d.y;\n d.moved ||= Math.abs(dy) > 0;\n this.chart.resizePanes(d.index, dy);\n d.y = p.y;\n break;\n }\n }\n };\n\n private readonly up = (e: PointerEvent): void => {\n this.pointers.delete(e.pointerId);\n if (this.surface.hasPointerCapture(e.pointerId)) this.surface.releasePointerCapture(e.pointerId);\n if (this.pointers.size < 2) this.pinch = null;\n const d = this.drag;\n this.drag = null;\n this.rect = null;\n this.cancelLongPress();\n if (!d || e.type === \"pointercancel\") return;\n if (d.kind === \"plugin\") {\n const p = this.local(e);\n this.chart.pluginPointer(\"up\", p.x, p.y, e);\n return;\n }\n if (d.kind === \"crosshair\") return;\n if (!d.moved) {\n const p = this.local(e);\n // Touch has no dblclick event: two taps within 300 ms and 24 px act as one.\n if (e.pointerType === \"touch\") {\n const tap = this.lastTap;\n if (e.timeStamp - tap.t < 300 && Math.hypot(p.x - tap.x, p.y - tap.y) < 24) {\n this.lastTap = { t: 0, x: 0, y: 0 };\n this.doubleAt(p.x, p.y, e);\n return;\n }\n this.lastTap = { t: e.timeStamp, x: p.x, y: p.y };\n }\n if (!this.chart.pluginPointer(\"click\", p.x, p.y, e)) this.chart.pointerEvent(\"click\");\n return;\n }\n if (d.kind === \"pan\" && this.chart.interactionOptions.kinetic && !this.chart.reducedMotion) this.startKinetic(e.timeStamp);\n };\n\n private readonly leave = (e: PointerEvent): void => {\n if (e.pointerType === \"mouse\" && !this.drag) {\n const p = this.local(e);\n this.chart.pluginPointer(\"leave\", p.x, p.y, e);\n this.chart.setCrosshair(null, \"pointer\");\n }\n };\n\n private readonly dbl = (e: MouseEvent): void => {\n const p = this.local(e);\n this.doubleAt(p.x, p.y, e);\n };\n\n private doubleAt(x: number, y: number, e: MouseEvent): void {\n const p = { x, y };\n const r = this.chart.region(p.x, p.y);\n if (r.kind === \"priceAxis\") this.chart.resetPriceScale(r.pane, r.scaleId);\n else if (r.kind === \"timeAxis\") this.chart.timeScale.reset();\n else if (r.kind === \"pane\" && !this.chart.pluginPointer(\"dblclick\", p.x, p.y, e)) this.chart.pointerEvent(\"dblclick\");\n }\n\n private cancelLongPress(): void {\n if (this.longPress) clearTimeout(this.longPress);\n this.longPress = 0;\n }\n\n private readonly wheel = (e: WheelEvent): void => {\n const opts = this.chart.interactionOptions;\n if (!opts.zoom && !opts.pan) return;\n e.preventDefault();\n this.stopKinetic();\n const unit = e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? this.root.clientHeight : 1;\n const dx = e.deltaX * unit, dy = e.deltaY * unit;\n const p = this.local(e);\n const area = this.chart.paneArea;\n this.chart.viewChanged(() => {\n if (e.ctrlKey || e.metaKey) {\n if (opts.zoom) this.chart.time.zoom(p.x - area.x, Math.exp(-dy * 0.01));\n } else if (Math.abs(dx) > Math.abs(dy)) {\n if (opts.pan) this.chart.time.pan(-dx);\n } else if (e.shiftKey) {\n if (opts.pan) this.chart.time.pan(-dy);\n } else if (opts.zoom) {\n this.chart.time.zoom(p.x - area.x, Math.exp(-dy * 0.002));\n }\n });\n this.hover(p.x, p.y, \"mouse\");\n };\n\n private readonly key = (e: KeyboardEvent): void => {\n if (this.chart.pluginKey(e)) {\n e.preventDefault();\n return;\n }\n if (!this.chart.interactionOptions.keyboard) return;\n const t = this.chart.time;\n const area = this.chart.paneArea;\n const action = this.chart.keyAction(e);\n const handled = action !== undefined;\n switch (action) {\n case \"panLeft\": this.chart.viewChanged(() => t.pan(area.width * 0.1)); break;\n case \"panRight\": this.chart.viewChanged(() => t.pan(-area.width * 0.1)); break;\n case \"zoomIn\": this.chart.viewChanged(() => t.zoom(area.width, 1.25)); break;\n case \"zoomOut\": this.chart.viewChanged(() => t.zoom(area.width, 0.8)); break;\n case \"scrollToStart\": this.chart.timeScale.scrollToStart(); break;\n case \"scrollToLatest\": this.chart.timeScale.scrollToLatest(); break;\n case \"crosshairLeft\": this.stepCrosshair(-1); break;\n case \"crosshairRight\": this.stepCrosshair(1); break;\n case \"hideCrosshair\": this.chart.setCrosshair(null, \"keyboard\"); break;\n case \"resetChart\": this.chart.resetChart(); break;\n case undefined: break;\n }\n if (handled) e.preventDefault();\n };\n\n /** Move the keyboard crosshair one bar, keeping it on screen. */\n private stepCrosshair(dir: -1 | 1): void {\n const c = this.chart, t = c.time, area = c.paneArea;\n if (t.end <= t.first) return;\n let i = c.crosshairIndex() ?? Math.min(t.last, Math.max(t.first, t.indexAt(area.width / 2)));\n i = Math.max(t.first, Math.min(t.last, i + (c.crosshair ? dir : 0)));\n let x = t.x(i);\n if (x < 0 || x > area.width) {\n c.viewChanged(() => t.pan(x < 0 ? -x + t.spacing : area.width - x - t.spacing));\n x = t.x(i);\n }\n c.setCrosshair({ x: area.x + x, y: c.crosshair?.y ?? 0, pane: c.crosshair?.pane ?? 0 }, \"keyboard\");\n }\n\n private hover(x: number, y: number, pointerType: string): void {\n const r = this.chart.region(x, y);\n let cursor = \"default\";\n switch (r.kind) {\n case \"pane\":\n cursor = this.chart.primitiveCursor(r.pane, r.x, r.y) ?? (this.drag ? \"grabbing\" : \"crosshair\");\n if (pointerType === \"mouse\" || pointerType === \"pen\") this.chart.setCrosshair({ x, y: r.y, pane: r.pane }, \"pointer\");\n break;\n case \"priceAxis\": cursor = \"ns-resize\"; this.chart.setCrosshair(null, \"pointer\"); break;\n case \"timeAxis\": cursor = \"ew-resize\"; this.chart.setCrosshair(null, \"pointer\"); break;\n case \"separator\": cursor = \"row-resize\"; break;\n case \"none\": this.chart.setCrosshair(null, \"pointer\");\n }\n if (this.surface.style.cursor !== cursor) this.surface.style.cursor = cursor;\n }\n\n private startKinetic(now: number): void {\n const s = this.samples;\n const first = s.find((x) => now - x.t < 100) ?? s[0];\n const last = s[s.length - 1];\n if (!first || !last || last.t === first.t) return;\n let v = (last.x - first.x) / (last.t - first.t);\n if (Math.abs(v) < KINETIC_MIN) return;\n let prev = performance.now();\n const step = (t: number) => {\n const dt = Math.min(64, t - prev);\n prev = t;\n this.chart.viewChanged(() => this.chart.time.pan(v * dt));\n v *= Math.pow(0.95, dt / 16);\n this.kinetic = Math.abs(v) > KINETIC_STOP ? requestAnimationFrame(step) : 0;\n };\n this.kinetic = requestAnimationFrame(step);\n this.chart.invalidate(LAYER_OVERLAY);\n }\n\n private stopKinetic(): void {\n if (this.kinetic) cancelAnimationFrame(this.kinetic);\n this.kinetic = 0;\n }\n}\n","export class Emitter<E extends { [K in keyof E]: unknown }> {\n private readonly map = new Map<keyof E, Set<(e: never) => void>>();\n\n on<K extends keyof E>(type: K, fn: (e: E[K]) => void): () => void {\n let set = this.map.get(type);\n if (!set) this.map.set(type, (set = new Set()));\n set.add(fn as (e: never) => void);\n return () => this.off(type, fn);\n }\n\n off<K extends keyof E>(type: K, fn: (e: E[K]) => void): void {\n this.map.get(type)?.delete(fn as (e: never) => void);\n }\n\n has(type: keyof E): boolean {\n return (this.map.get(type)?.size ?? 0) > 0;\n }\n\n emit<K extends keyof E>(type: K, e: E[K]): void {\n const set = this.map.get(type);\n if (!set) return;\n for (const fn of set) (fn as (e: E[K]) => void)(e);\n }\n\n clear(): void {\n this.map.clear();\n }\n}\n","// Pane primitives: the plugin seam for anything drawn over a pane that is not\n// a series — price lines here; drawings and study overlays (M3/M4) next.\n//\n// A primitive is attached to a series and draws with that series' price\n// scale. It draws on the overlay layer in CSS px with the origin at the\n// pane's top-left (the context is already transformed for DPR and clipped to\n// the pane), may add labels to the price axis, and may claim the pointer. It may\n// also draw behind the series (`drawBackground`, on the background layer).\n\nimport { parseColor } from \"../render/color.js\";\n\nexport interface PaneView {\n /** Pane size in CSS px. */\n readonly width: number;\n readonly height: number;\n readonly dpr: number;\n /** Visible timeline indices. */\n readonly lo: number;\n readonly hi: number;\n /** CSS x of a timeline index's centre. */\n x(index: number): number;\n /** CSS y of a price on the series' scale. */\n y(price: number): number;\n index(x: number): number;\n price(y: number): number;\n timeToIndex(time: number): number | undefined;\n indexToTime(index: number): number;\n /**\n * Pane CSS x of a time (UTC ms): fractional between bars, extrapolated past\n * the first and last bar by the recent bar interval (as the plugin API's\n * `timeToX`). NaN while the chart has no data.\n */\n timeToX(time: number): number;\n /** CSS px between the centres of adjacent bars. */\n readonly barSpacing: number;\n formatPrice(price: number): string;\n}\n\nexport interface AxisLabel {\n price: number;\n text: string;\n background: string;\n color: string;\n}\n\n/** Which canvas layer a primitive wants repainted. */\nexport type RenderLayer = \"background\" | \"overlay\" | \"all\";\n\nexport interface PrimitiveHost {\n /**\n * Ask for a redraw on the next frame: the overlay (default), the background\n * layer (what `drawBackground` paints; it is not repainted by ticks) or both.\n */\n requestRender(layer?: RenderLayer): void;\n}\n\n/** A primitive's hit: `id` is reported as `hovered` on crosshair events. */\nexport interface PrimitiveHit {\n id: string;\n /** CSS cursor to show; absent passes the cursor through. */\n cursor?: string;\n}\n\nexport interface PanePrimitive {\n attached?(host: PrimitiveHost): void;\n detached?(): void;\n /**\n * Drawn on the background layer after the grid and before the series, so it\n * sits behind the bars. Same coordinates and clip as `draw`. Repainted when\n * the view, scale or layout changes; call `host.requestRender(\"background\")`\n * when its own data changes.\n */\n drawBackground?(ctx: CanvasRenderingContext2D, view: PaneView): void;\n draw?(ctx: CanvasRenderingContext2D, view: PaneView): void;\n axisLabels?(view: PaneView): readonly AxisLabel[];\n /**\n * What is under pane point (x, y): a CSS cursor, a hit with an `id` (reported\n * as `hovered: { kind: \"primitive\", id }` on crosshair events, with an optional\n * cursor), or null to pass through. The id must not be empty.\n */\n hitTest?(x: number, y: number, view: PaneView): string | PrimitiveHit | null;\n}\n\n// ---- price line ---------------------------------------------------------------\n\nexport type LineDash = \"solid\" | \"dashed\" | \"dotted\" | \"large-dashed\" | \"sparse-dotted\";\n\nexport interface PriceLineOptions {\n price: number;\n color: string;\n /** CSS px: 1 or 2 (anything else throws). */\n lineWidth: number;\n lineStyle: LineDash;\n title: string;\n axisLabelVisible: boolean;\n /** Background of the axis label; default: `color`. */\n axisLabelColor?: string;\n /** Text colour of the axis label. */\n labelTextColor: string;\n}\n\nexport function dashPattern(style: LineDash, width: number): number[] {\n switch (style) {\n case \"solid\": return [];\n case \"dashed\": return [4 * width, 3 * width];\n case \"dotted\": return [width, 2 * width];\n case \"large-dashed\": return [8 * width, 5 * width];\n case \"sparse-dotted\": return [width, 6 * width];\n }\n}\n\nfunction checkLine(o: PriceLineOptions): void {\n if (o.lineWidth !== 1 && o.lineWidth !== 2) throw new RangeError(`alphacharts: price line lineWidth must be 1 or 2, got ${o.lineWidth}`);\n if (o.lineStyle !== \"solid\" && o.lineStyle !== \"dashed\" && o.lineStyle !== \"dotted\" && o.lineStyle !== \"large-dashed\" && o.lineStyle !== \"sparse-dotted\") {\n throw new RangeError(`alphacharts: unknown price line lineStyle \"${String(o.lineStyle)}\"`);\n }\n if (o.axisLabelColor !== undefined) parseColor(o.axisLabelColor);\n}\n\n/** Snap a CSS coordinate so a line of `width` CSS px covers whole device pixels. */\nexport function crisp(v: number, dpr: number, width = 1): number {\n const w = Math.max(1, Math.round(width * dpr));\n return (Math.round(v * dpr) + (w % 2 ? 0.5 : 0)) / dpr;\n}\n\nexport class PriceLine implements PanePrimitive {\n private host: PrimitiveHost | null = null;\n private opts: PriceLineOptions;\n\n constructor(options: Partial<PriceLineOptions> & { price: number }) {\n const opts: PriceLineOptions = { color: \"#9598a1\", lineWidth: 1, lineStyle: \"dashed\", title: \"\", axisLabelVisible: true, labelTextColor: \"#ffffff\", ...options };\n checkLine(opts);\n this.opts = opts;\n }\n\n options(): Readonly<PriceLineOptions> {\n return this.opts;\n }\n\n applyOptions(options: Partial<PriceLineOptions>): void {\n const next = { ...this.opts, ...options };\n checkLine(next);\n this.opts = next;\n this.host?.requestRender();\n }\n\n attached(host: PrimitiveHost): void {\n this.host = host;\n }\n\n detached(): void {\n this.host = null;\n }\n\n draw(ctx: CanvasRenderingContext2D, view: PaneView): void {\n const o = this.opts;\n const y = crisp(view.y(o.price), view.dpr, o.lineWidth);\n if (y < -o.lineWidth || y > view.height + o.lineWidth) return;\n ctx.strokeStyle = o.color;\n ctx.lineWidth = Math.max(1, Math.round(o.lineWidth * view.dpr)) / view.dpr;\n ctx.setLineDash(dashPattern(o.lineStyle, o.lineWidth));\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(view.width, y);\n ctx.stroke();\n ctx.setLineDash([]);\n if (o.title) {\n ctx.fillStyle = o.color;\n ctx.textBaseline = \"bottom\";\n ctx.textAlign = \"right\";\n ctx.fillText(o.title, view.width - 6, y - 2);\n }\n }\n\n axisLabels(view: PaneView): readonly AxisLabel[] {\n const o = this.opts;\n return o.axisLabelVisible ? [{ price: o.price, text: view.formatPrice(o.price), background: o.axisLabelColor ?? o.color, color: o.labelTextColor }] : [];\n }\n}\n","// Series markers: small shapes (with optional text) on bars, drawn on the\n// overlay above a bar's high or below its low. Several markers on one bar\n// stack outward, in the order given. Markers are positioned by time, so they\n// follow the bar through prepends and live updates; a marker whose bar is gone\n// after a later `setData` is skipped when drawing (not an error: the data owns\n// the bars, the markers are only annotations on them).\n\nimport { parseColor } from \"../render/color.js\";\n\nexport type MarkerShape = \"arrowUp\" | \"arrowDown\" | \"circle\";\nexport type MarkerPosition = \"aboveBar\" | \"belowBar\";\n\nexport interface SeriesMarker {\n /** UTC ms; must be the time of a bar of the series. */\n time: number;\n position: MarkerPosition;\n shape: MarkerShape;\n /** CSS colour of the shape and its text. */\n color: string;\n /** Drawn outside the shape (above it for \"aboveBar\", under it for \"belowBar\") in the theme font. */\n text?: string;\n /** Reported as `hovered: { kind: \"marker\", id }` on crosshair, click and dblclick events. Unique within the series. */\n id?: string;\n /** Multiplier of the default size (which follows the bar spacing); default 1. */\n size?: number;\n}\n\nconst SHAPES = [\"arrowUp\", \"arrowDown\", \"circle\"];\nconst POSITIONS = [\"aboveBar\", \"belowBar\"];\n\n/** What a marker is called in an error message. */\nconst name = (m: SeriesMarker, i: number) => `marker ${m.id !== undefined ? `\"${m.id}\"` : `#${i}`} (time ${m.time})`;\n\n/**\n * Check `markers` against the series' bars and return a copy sorted by time\n * (stable: the given order is the stacking order on one bar). `hasBar(time)`\n * says whether the series has a bar at that time.\n */\nexport function checkMarkers(markers: readonly SeriesMarker[], hasBar: (time: number) => boolean): SeriesMarker[] {\n const ids = new Set<string>();\n markers.forEach((m, i) => {\n if (!Number.isFinite(m.time)) throw new RangeError(`alphacharts: ${name(m, i)} has a non-finite time`);\n if (!POSITIONS.includes(m.position)) throw new RangeError(`alphacharts: ${name(m, i)} has unknown position \"${String(m.position)}\"`);\n if (!SHAPES.includes(m.shape)) throw new RangeError(`alphacharts: ${name(m, i)} has unknown shape \"${String(m.shape)}\"`);\n if (m.size !== undefined && !(m.size > 0 && Number.isFinite(m.size))) throw new RangeError(`alphacharts: ${name(m, i)} has size ${m.size}; it must be positive`);\n if (m.id !== undefined) {\n if (m.id === \"\") throw new RangeError(`alphacharts: ${name(m, i)} has an empty id`);\n if (ids.has(m.id)) throw new Error(`alphacharts: ${name(m, i)}: the id is used by another marker`);\n ids.add(m.id);\n }\n try {\n parseColor(m.color);\n } catch (e) {\n throw new Error(`alphacharts: ${name(m, i)} has a bad colour: ${(e as Error).message}`);\n }\n if (!hasBar(m.time)) throw new RangeError(`alphacharts: ${name(m, i)} is not on a bar of the series`);\n });\n return markers.map((m, i) => ({ m, i })).sort((a, b) => a.m.time - b.m.time || a.i - b.i).map((x) => ({ ...x.m }));\n}\n\n/** First index in `sorted` whose time is >= t. */\nexport function markerLowerBound(sorted: readonly SeriesMarker[], t: number): number {\n let lo = 0, hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sorted[mid]!.time < t) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** A marker placed on the pane: `box` is the shape plus its text, for drawing bounds and hit tests. */\nexport interface PlacedMarker {\n marker: SeriesMarker;\n /** Pane CSS px: centre of the shape. */\n cx: number;\n cy: number;\n /** Shape edge in CSS px. */\n size: number;\n box: { x: number; y: number; w: number; h: number };\n}\n\nconst GAP = 4;\nconst PAD = 2;\n\n/** Shape size in CSS px for a bar spacing and a marker's multiplier. */\nexport function markerSize(barSpacing: number, mult = 1): number {\n return Math.round(Math.min(20, Math.max(8, barSpacing * 0.8)) * mult);\n}\n\nexport interface PlaceInput {\n markers: readonly SeriesMarker[];\n /** Index range [from, to) into `markers` to place. Must cover whole bars. */\n from: number;\n to: number;\n barSpacing: number;\n fontSize: number;\n textWidth(s: string): number;\n /** For a marker: the bar's pane x, high y and low y, or undefined when the series has no bar there. */\n bar(m: SeriesMarker): { x: number; yHigh: number; yLow: number } | undefined;\n}\n\n/**\n * Place markers[from..to): above the bar's high or below its low with a small\n * gap, the next marker on the same side of the same bar further out.\n */\nexport function placeMarkers(inp: PlaceInput): PlacedMarker[] {\n const out: PlacedMarker[] = [];\n let curTime = Number.NaN;\n let above = 0, below = 0; // outward offset used so far on this bar\n for (let k = inp.from; k < inp.to; k++) {\n const m = inp.markers[k]!;\n if (m.time !== curTime) {\n curTime = m.time;\n above = below = 0;\n }\n const bar = inp.bar(m);\n if (!bar) continue;\n const size = markerSize(inp.barSpacing, m.size);\n const textH = m.text ? inp.fontSize + 2 : 0;\n const slot = size + textH + PAD;\n const isAbove = m.position === \"aboveBar\";\n const off = isAbove ? above : below;\n // Outward from the bar: the shape first, then its text further out.\n const near = isAbove ? bar.yHigh - GAP - off : bar.yLow + GAP + off;\n const cy = isAbove ? near - size / 2 : near + size / 2;\n const top = isAbove ? near - size - textH : near;\n const tw = m.text ? Math.max(size, inp.textWidth(m.text)) : size;\n out.push({ marker: m, cx: bar.x, cy, size, box: { x: bar.x - tw / 2, y: top, w: tw, h: size + textH } });\n if (isAbove) above += slot;\n else below += slot;\n }\n return out;\n}\n\n/** Draw placed markers on a pane context (CSS px). */\nexport function drawMarkers(ctx: CanvasRenderingContext2D, placed: readonly PlacedMarker[]): void {\n ctx.textAlign = \"center\";\n for (const p of placed) {\n const m = p.marker, r = p.size / 2;\n ctx.fillStyle = m.color;\n ctx.beginPath();\n switch (m.shape) {\n case \"circle\":\n ctx.arc(p.cx, p.cy, r, 0, Math.PI * 2);\n break;\n case \"arrowUp\":\n ctx.moveTo(p.cx, p.cy - r);\n ctx.lineTo(p.cx + r, p.cy + r * 0.2);\n ctx.lineTo(p.cx + r * 0.4, p.cy + r * 0.2);\n ctx.lineTo(p.cx + r * 0.4, p.cy + r);\n ctx.lineTo(p.cx - r * 0.4, p.cy + r);\n ctx.lineTo(p.cx - r * 0.4, p.cy + r * 0.2);\n ctx.lineTo(p.cx - r, p.cy + r * 0.2);\n break;\n case \"arrowDown\":\n ctx.moveTo(p.cx, p.cy + r);\n ctx.lineTo(p.cx + r, p.cy - r * 0.2);\n ctx.lineTo(p.cx + r * 0.4, p.cy - r * 0.2);\n ctx.lineTo(p.cx + r * 0.4, p.cy - r);\n ctx.lineTo(p.cx - r * 0.4, p.cy - r);\n ctx.lineTo(p.cx - r * 0.4, p.cy - r * 0.2);\n ctx.lineTo(p.cx - r, p.cy - r * 0.2);\n break;\n }\n ctx.closePath();\n ctx.fill();\n if (m.text) {\n const above = m.position === \"aboveBar\";\n ctx.textBaseline = above ? \"bottom\" : \"top\";\n ctx.fillText(m.text, p.cx, above ? p.cy - r - 1 : p.cy + r + 1);\n }\n }\n}\n","// Price formats: how a series' values become text on the axis, in labels and\n// in the screen-reader readout.\n//\n// A \"price\" format without a minMove takes it from the data: the most decimals\n// any sampled value needs (never fewer than the data has, so a readout is the\n// value that was passed in). It only ever grows as new bars arrive.\n\nimport { PriceFormatter } from \"./ticks.js\";\n\nexport type PriceFormat =\n | { type: \"price\"; minMove?: number }\n /** Abbreviated: K/M/B/T, or K/L/Cr for Indian locales. */\n | { type: \"volume\"; minMove?: number }\n /** Values are already percentages; shown with a % sign. */\n | { type: \"percent\"; minMove?: number }\n | { type: \"custom\"; minMove: number; format: (value: number) => string };\n\nexport interface Formatter {\n /** Smallest step between distinct values; axis ticks are multiples of it. */\n readonly minMove: number;\n format(value: number): string;\n}\n\nconst MAX_DECIMALS = 10;\n\n/** Decimals needed to write v exactly (within float noise), capped at 10. */\nexport function decimalsOf(v: number): number {\n const a = Math.abs(v);\n for (let d = 0; d < MAX_DECIMALS; d++) {\n const s = a * 10 ** d;\n if (Math.abs(s - Math.round(s)) <= 1e-9 * Math.max(1, s)) return d;\n }\n return MAX_DECIMALS;\n}\n\n/** True when the locale groups and abbreviates the Indian way (lakh, crore). */\nexport function isIndianLocale(locale: string | undefined): boolean {\n const l = (locale ?? (typeof navigator !== \"undefined\" ? navigator.language : \"en\")).toLowerCase();\n return l.endsWith(\"-in\") || l === \"hi\" || l.startsWith(\"hi-\");\n}\n\nexport function createFormatter(f: PriceFormat, derivedMinMove: number, locale: string | undefined): Formatter {\n switch (f.type) {\n case \"custom\":\n if (!(f.minMove > 0)) throw new RangeError(`custom priceFormat needs a positive minMove, got ${f.minMove}`);\n return { minMove: f.minMove, format: f.format };\n case \"price\": {\n const p = new PriceFormatter(f.minMove ?? derivedMinMove);\n return { minMove: p.minMove, format: (v) => p.format(v) };\n }\n case \"percent\": {\n const p = new PriceFormatter(f.minMove ?? Math.min(0.01, derivedMinMove));\n return { minMove: p.minMove, format: (v) => `${p.format(v)}%` };\n }\n case \"volume\": {\n const minMove = f.minMove ?? 1;\n const indian = isIndianLocale(locale);\n const steps: [number, string][] = indian\n ? [[1e7, \"Cr\"], [1e5, \"L\"], [1e3, \"K\"]]\n : [[1e12, \"T\"], [1e9, \"B\"], [1e6, \"M\"], [1e3, \"K\"]];\n const nf = new Intl.NumberFormat(locale, { maximumFractionDigits: 2 });\n const plain = new PriceFormatter(minMove);\n return {\n minMove,\n format: (v) => {\n const a = Math.abs(v);\n for (const [div, suffix] of steps) if (a >= div) return `${nf.format(v / div)}${suffix}`;\n return plain.format(v);\n },\n };\n }\n }\n}\n","// Built-in WebGL2 series renderers: candles, OHLC bars, histogram, line, area.\n//\n// All draw instanced quads straight from an InstanceWindow (no per-frame\n// geometry on the CPU). Bars are snapped to whole device pixels: body and\n// wick widths are integers with equal parity, so a wick sits exactly centred\n// on its body at every DPR; tops and bottoms are rounded and at least 1 px.\n// Lines and area edges are analytically anti-aliased in the fragment shader.\n\nimport type { DataChange, SeriesData } from \"../data/model.js\";\nimport type { PriceScale } from \"../scale/price-scale.js\";\nimport type { TimeScale } from \"../scale/time-scale.js\";\nimport { parseColor, rgba } from \"./color.js\";\nimport { GLContext, GLSL_COMMON, type Program } from \"./gl.js\";\nimport { chooseLevel, HOLE_TEST, InstanceWindow, RECORD_BYTES } from \"./window.js\";\n\n/** Everything a renderer needs for one pane in one frame. */\nexport interface DrawView {\n readonly gl: WebGL2RenderingContext;\n readonly ctx: GLContext;\n readonly data: SeriesData;\n readonly time: TimeScale;\n readonly price: PriceScale;\n readonly dpr: number;\n /** Pane size in device px. */\n readonly width: number;\n readonly height: number;\n /** Visible timeline indices. */\n readonly lo: number;\n readonly hi: number;\n}\n\n/** Plugin contract for a WebGL series renderer. */\nexport interface SeriesRenderer<O> {\n draw(view: DrawView, options: O): void;\n dataChanged(change: DataChange): void;\n /** Drop GL objects (context lost or series removed). */\n dispose(): void;\n}\n\n// ---- shared ---------------------------------------------------------------\n\nconst FS_FLAT = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 v_color;\nout vec4 o_color;\nvoid main() { o_color = vec4(v_color.rgb * v_color.a, v_color.a); }\n`;\n\nconst OFFSCREEN = \"gl_Position = vec4(2.0, 2.0, 2.0, 1.0); return;\";\n\nabstract class WindowRenderer<O> implements SeriesRenderer<O> {\n protected readonly win: InstanceWindow;\n protected readonly vao: WebGLVertexArrayObject;\n protected readonly prog: Program;\n protected level = 0;\n\n constructor(protected readonly gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData, zeroBase: boolean, prog: Program, pairs: boolean) {\n this.prog = prog;\n // Pair renderers join consecutive records, so they get holes removed.\n this.win = new InstanceWindow(gl, data, zeroBase, pairs);\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.win.buffer);\n // Record i: a_r = (x, o, h, l), a_c = c, a_color. Pair renderers also read\n // record i+1 as a_r1/a_c1 (instance i draws the step from i to i+1).\n bindRecord(gl, prog, \"a_r\", \"a_c\", \"a_color\", 0);\n if (pairs) bindRecord(gl, prog, \"a_r1\", \"a_c1\", \"a_color1\", RECORD_BYTES);\n gl.bindVertexArray(null);\n void ctx;\n }\n\n abstract draw(view: DrawView, options: O): void;\n\n dataChanged(c: DataChange): void {\n this.win.dataChanged(c);\n }\n\n dispose(): void {\n this.win.dispose();\n this.gl.deleteVertexArray(this.vao);\n }\n\n /** Upload as needed and set the shared uniforms. Returns the record count. */\n protected prepare(v: DrawView): number {\n const gl = this.gl;\n const spacingDev = v.time.spacing * v.dpr;\n this.level = chooseLevel(v.data, spacingDev);\n this.win.setLog(v.price.logCoords);\n this.win.ensure(this.level, v.lo, v.hi);\n gl.useProgram(this.prog.program);\n gl.bindVertexArray(this.vao);\n const u = this.prog.uniforms;\n gl.uniform2f(u.u_view!, v.width, v.height);\n gl.uniform2f(u.u_x!, spacingDev, v.time.x(this.win.base) * v.dpr);\n // y = u_y.y - p_rel · u_y.x, with p_rel the uploaded coordinate minus its base.\n gl.uniform2f(u.u_y!, -v.price.pxPerCoord * v.dpr, v.price.yOfCoord(this.win.priceBase) * v.dpr);\n return this.win.count;\n }\n\n protected widths(v: DrawView, ratio: number): [number, number] {\n return barWidths(v.time.spacing, v.dpr, this.level, ratio);\n }\n}\n\n/**\n * Integer device-px body and wick widths with equal parity, so a wick sits\n * exactly centred on its body. Shared by the WebGL and Canvas2D renderers.\n */\nexport function barWidths(spacingCss: number, dpr: number, level: number, ratio: number): [number, number] {\n const unit = spacingCss * dpr * (1 << level);\n const wick = Math.max(1, Math.floor(dpr));\n let body = Math.max(1, Math.floor(unit * ratio));\n if (body > wick && (body - wick) % 2 !== 0) body -= 1;\n return [body, Math.min(wick, body)];\n}\n\nfunction bindRecord(gl: WebGL2RenderingContext, p: Program, r: string, c: string, color: string, offset: number): void {\n const a = p.attribs;\n if (a[r]! >= 0) {\n gl.enableVertexAttribArray(a[r]!);\n gl.vertexAttribPointer(a[r]!, 4, gl.FLOAT, false, RECORD_BYTES, offset);\n gl.vertexAttribDivisor(a[r]!, 1);\n }\n if (a[c]! >= 0) {\n gl.enableVertexAttribArray(a[c]!);\n gl.vertexAttribPointer(a[c]!, 1, gl.FLOAT, false, RECORD_BYTES, offset + 16);\n gl.vertexAttribDivisor(a[c]!, 1);\n }\n if (a[color] !== undefined && a[color]! >= 0) {\n gl.enableVertexAttribArray(a[color]!);\n gl.vertexAttribIPointer(a[color]!, 1, gl.UNSIGNED_INT, RECORD_BYTES, offset + 20);\n gl.vertexAttribDivisor(a[color]!, 1);\n }\n}\n\n/** Parsed colour uniforms, re-parsed only when the option string changes. */\nclass Colors {\n private readonly keys: string[] = [];\n private readonly vals: Float32Array[] = [];\n get(slot: number, css: string): Float32Array {\n if (this.keys[slot] !== css) {\n this.keys[slot] = css;\n this.vals[slot] = rgba(parseColor(css));\n }\n return this.vals[slot]!;\n }\n}\n\n// ---- candles ----------------------------------------------------------------\n\nexport interface CandleStyle {\n upColor: string;\n downColor: string;\n wickUpColor: string;\n wickDownColor: string;\n}\n\nconst CANDLE_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in float a_c;\nuniform vec2 u_w;\nuniform vec4 u_up, u_down, u_wup, u_wdown;\nout vec4 v_color;\nvoid main() {\n if (a_r.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n bool wick = gl_VertexID < 6;\n vec2 cr = corner(gl_VertexID % 6);\n float o = a_r.y, h = a_r.z, l = a_r.w, c = a_c;\n float left = floor(xDev(a_r.x) - u_w.x * 0.5 + 0.5);\n float x0, x1, y0, y1;\n if (wick) {\n x0 = left + (u_w.x - u_w.y) * 0.5; x1 = x0 + u_w.y;\n // An inverted scale draws the high below the low: order the edges as drawn.\n float ya = floor(yDev(h) + 0.5), yb = floor(yDev(l) + 0.5);\n y0 = min(ya, yb); y1 = max(max(ya, yb), y0 + 1.0);\n } else {\n x0 = left; x1 = left + u_w.x;\n float ya = floor(yDev(max(o, c)) + 0.5), yb = floor(yDev(min(o, c)) + 0.5);\n y0 = min(ya, yb); y1 = max(max(ya, yb), y0 + 1.0);\n }\n gl_Position = vec4(toClip(vec2(mix(x0, x1, cr.x), mix(y0, y1, cr.y))), 0.0, 1.0);\n bool up = c >= o;\n v_color = wick ? (up ? u_wup : u_wdown) : (up ? u_up : u_down);\n}`;\n\nexport class CandleRenderer extends WindowRenderer<CandleStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, false, ctx.program(\"candles\", CANDLE_VS, FS_FLAT, [\"u_w\", \"u_up\", \"u_down\", \"u_wup\", \"u_wdown\"], [\"a_r\", \"a_c\"]), false);\n }\n draw(v: DrawView, o: CandleStyle): void {\n const n = this.prepare(v);\n if (n === 0) return;\n const gl = this.gl, u = this.prog.uniforms;\n const [body, wick] = this.widths(v, 0.8);\n gl.uniform2f(u.u_w!, body, wick);\n gl.uniform4fv(u.u_up!, this.colors.get(0, o.upColor));\n gl.uniform4fv(u.u_down!, this.colors.get(1, o.downColor));\n gl.uniform4fv(u.u_wup!, this.colors.get(2, o.wickUpColor));\n gl.uniform4fv(u.u_wdown!, this.colors.get(3, o.wickDownColor));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 12, n);\n }\n}\n\n// ---- OHLC bars ----------------------------------------------------------------\n\nexport interface BarStyle {\n upColor: string;\n downColor: string;\n}\n\nconst BAR_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in float a_c;\nuniform vec2 u_w;\nuniform vec4 u_up, u_down;\nout vec4 v_color;\nvoid main() {\n if (a_r.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n int seg = gl_VertexID / 6;\n vec2 cr = corner(gl_VertexID % 6);\n float o = a_r.y, h = a_r.z, l = a_r.w, c = a_c, t = u_w.y;\n float left = floor(xDev(a_r.x) - u_w.x * 0.5 + 0.5);\n float mid = left + (u_w.x - t) * 0.5;\n float x0, x1, y0, y1;\n if (seg == 0) {\n x0 = mid; x1 = mid + t;\n float ya = floor(yDev(h) + 0.5), yb = floor(yDev(l) + 0.5);\n y0 = min(ya, yb); y1 = max(max(ya, yb), y0 + 1.0);\n } else {\n float y = floor(yDev(seg == 1 ? o : c) - t * 0.5 + 0.5);\n y0 = y; y1 = y + t;\n if (seg == 1) { x0 = left; x1 = mid; } else { x0 = mid + t; x1 = left + u_w.x; }\n }\n gl_Position = vec4(toClip(vec2(mix(x0, x1, cr.x), mix(y0, y1, cr.y))), 0.0, 1.0);\n v_color = c >= o ? u_up : u_down;\n}`;\n\nexport class BarRenderer extends WindowRenderer<BarStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, false, ctx.program(\"bars\", BAR_VS, FS_FLAT, [\"u_w\", \"u_up\", \"u_down\"], [\"a_r\", \"a_c\"]), false);\n }\n draw(v: DrawView, o: BarStyle): void {\n const n = this.prepare(v);\n if (n === 0) return;\n const gl = this.gl, u = this.prog.uniforms;\n const [body, thick] = this.widths(v, 0.8);\n gl.uniform2f(u.u_w!, body, thick);\n gl.uniform4fv(u.u_up!, this.colors.get(0, o.upColor));\n gl.uniform4fv(u.u_down!, this.colors.get(1, o.downColor));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 18, n);\n }\n}\n\n// ---- histogram ----------------------------------------------------------------\n\nexport interface HistogramStyle {\n color: string;\n /** Value the bars grow from. */\n base: number;\n}\n\nconst HIST_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in uint a_color;\nuniform float u_w;\nuniform float u_base;\nuniform vec4 u_color;\nout vec4 v_color;\nvoid main() {\n if (a_r.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n vec2 cr = corner(gl_VertexID);\n float left = floor(xDev(a_r.x) - u_w * 0.5 + 0.5);\n // Zoomed out, a bucket spans bars on both sides of the base: draw the\n // extreme farthest from it (at level 0, high == low == value).\n float v = abs(a_r.z - u_base) >= abs(a_r.w - u_base) ? a_r.z : a_r.w;\n float yv = floor(yDev(v) + 0.5), yb = floor(yDev(u_base) + 0.5);\n float y0 = min(yv, yb), y1 = max(max(yv, yb), y0 + 1.0);\n gl_Position = vec4(toClip(vec2(mix(left, left + u_w, cr.x), mix(y0, y1, cr.y))), 0.0, 1.0);\n v_color = a_color != 0u ? unpack(a_color) : u_color;\n}`;\n\nexport class HistogramRenderer extends WindowRenderer<HistogramStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, true, ctx.program(\"histogram\", HIST_VS, FS_FLAT, [\"u_w\", \"u_base\", \"u_color\"], [\"a_r\", \"a_color\"]), false);\n }\n draw(v: DrawView, o: HistogramStyle): void {\n const n = this.prepare(v);\n if (n === 0) return;\n const gl = this.gl, u = this.prog.uniforms;\n gl.uniform1f(u.u_w!, this.widths(v, 0.8)[0]);\n // On a log scale a base at or below zero sits at the pane's lowest value.\n const base = v.price.logCoords && !(o.base > 0) ? v.price.min : v.price.coord(o.base);\n gl.uniform1f(u.u_base!, base - this.win.priceBase);\n gl.uniform4fv(u.u_color!, this.colors.get(0, o.color));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, n);\n }\n}\n\n// ---- line -------------------------------------------------------------------\n\nexport interface LineStyle {\n color: string;\n /** CSS px. */\n lineWidth: number;\n}\n\n// Instance i joins record i to record i+1 with an anti-aliased capsule. Above\n// level 0 a second capsule spans record i+1's low..high, so a zoomed-out line\n// draws the exact per-bucket envelope instead of a sampled path.\nconst LINE_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in float a_c;\nin vec4 a_r1;\nuniform float u_half;\nuniform int u_env;\nout vec2 v_pos;\nflat out vec2 v_a;\nflat out vec2 v_b;\nvoid main() {\n if (a_r.x < ${HOLE_TEST} || a_r1.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n bool env = gl_VertexID >= 6;\n if (env && u_env == 0) { ${OFFSCREEN} }\n vec2 a = env ? vec2(xDev(a_r1.x), yDev(a_r1.w)) : vec2(xDev(a_r.x), yDev(a_c));\n vec2 b = env ? vec2(xDev(a_r1.x), yDev(a_r1.z)) : vec2(xDev(a_r1.x), yDev(a_r1.y));\n vec2 d = b - a;\n float len = length(d);\n vec2 dir = len > 1e-4 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float r = u_half + 1.0;\n vec2 cr = corner(gl_VertexID % 6);\n vec2 p = mix(a - dir * r, b + dir * r, cr.x) + nrm * mix(-r, r, cr.y);\n v_pos = p; v_a = a; v_b = b;\n gl_Position = vec4(toClip(p), 0.0, 1.0);\n}`;\n\nconst LINE_FS = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 v_pos;\nflat in vec2 v_a;\nflat in vec2 v_b;\nuniform float u_half;\nuniform vec4 u_color;\nout vec4 o_color;\nvoid main() {\n vec2 pa = v_pos - v_a, ba = v_b - v_a;\n float t = clamp(dot(pa, ba) / max(dot(ba, ba), 1e-6), 0.0, 1.0);\n float dist = length(pa - ba * t);\n float cov = clamp(u_half + 0.5 - dist, 0.0, 1.0);\n if (cov <= 0.0) discard;\n float a = u_color.a * cov;\n o_color = vec4(u_color.rgb * a, a);\n}`;\n\nexport class LineRenderer extends WindowRenderer<LineStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, false, ctx.program(\"line\", LINE_VS, LINE_FS, [\"u_half\", \"u_env\", \"u_color\"], [\"a_r\", \"a_c\", \"a_r1\"]), true);\n }\n draw(v: DrawView, o: LineStyle): void {\n const n = this.prepare(v);\n if (n < 2) return;\n this.drawLine(v, o.color, o.lineWidth, n);\n }\n /** Draw with the program already prepared (shared with AreaRenderer). */\n drawLine(v: DrawView, color: string, width: number, n: number): void {\n const gl = this.gl, u = this.prog.uniforms;\n gl.uniform1f(u.u_half!, Math.max(0.5, (width * v.dpr) / 2));\n gl.uniform1i(u.u_env!, this.level > 0 ? 1 : 0);\n gl.uniform4fv(u.u_color!, this.colors.get(0, color));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 12, n - 1);\n }\n}\n\n// ---- area -------------------------------------------------------------------\n\nexport interface AreaStyle {\n lineColor: string;\n topColor: string;\n bottomColor: string;\n lineWidth: number;\n}\n\nconst AREA_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in vec4 a_r1;\nout float v_t;\nvoid main() {\n if (a_r.x < ${HOLE_TEST} || a_r1.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n vec2 cr = corner(gl_VertexID);\n float x = mix(xDev(a_r.x), xDev(a_r1.x), cr.x);\n float top = mix(yDev(a_r.z), yDev(a_r1.z), cr.x);\n float y = mix(top, u_view.y, cr.y);\n v_t = y / u_view.y;\n gl_Position = vec4(toClip(vec2(x, y)), 0.0, 1.0);\n}`;\n\nconst AREA_FS = /* glsl */ `#version 300 es\nprecision highp float;\nin float v_t;\nuniform vec4 u_top, u_bottom;\nout vec4 o_color;\nvoid main() {\n vec4 c = mix(u_top, u_bottom, clamp(v_t, 0.0, 1.0));\n o_color = vec4(c.rgb * c.a, c.a);\n}`;\n\nexport class AreaRenderer implements SeriesRenderer<AreaStyle> {\n private readonly fill: AreaFill;\n private readonly line: LineRenderer;\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n this.fill = new AreaFill(gl, ctx, data);\n this.line = new LineRenderer(gl, ctx, data);\n }\n draw(v: DrawView, o: AreaStyle): void {\n this.fill.draw(v, o);\n this.line.draw(v, { color: o.lineColor, lineWidth: o.lineWidth });\n }\n dataChanged(c: DataChange): void {\n this.fill.dataChanged(c);\n this.line.dataChanged(c);\n }\n dispose(): void {\n this.fill.dispose();\n this.line.dispose();\n }\n}\n\nclass AreaFill extends WindowRenderer<AreaStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, false, ctx.program(\"area\", AREA_VS, AREA_FS, [\"u_top\", \"u_bottom\"], [\"a_r\", \"a_r1\"]), true);\n }\n draw(v: DrawView, o: AreaStyle): void {\n const n = this.prepare(v);\n if (n < 2) return;\n const gl = this.gl, u = this.prog.uniforms;\n gl.uniform4fv(u.u_top!, this.colors.get(0, o.topColor));\n gl.uniform4fv(u.u_bottom!, this.colors.get(1, o.bottomColor));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, n - 1);\n }\n}\n","// Canvas2D series renderers: the fallback when WebGL2 is unavailable. Same\n// level-of-detail choice and the same integer pixel snapping as the WebGL\n// renderers (barWidths), so the two produce the same geometry; marks are\n// batched into one Path2D per colour.\n\nimport { LOD_C, LOD_COLOR, LOD_H, LOD_L, LOD_O } from \"../data/lod.js\";\nimport { COL_C, COL_COLOR, COL_H, COL_L, COL_O, COL_V, type DataChange, type SeriesData } from \"../data/model.js\";\nimport type { PriceScale } from \"../scale/price-scale.js\";\nimport type { TimeScale } from \"../scale/time-scale.js\";\nimport { cssColor } from \"./color.js\";\nimport { barWidths, type AreaStyle, type BarStyle, type CandleStyle, type HistogramStyle, type LineStyle } from \"./renderers.js\";\nimport { chooseLevel } from \"./window.js\";\n\nexport interface DrawView2D {\n /** Transformed so (0, 0) is the pane's top-left device pixel, clipped to it. */\n readonly ctx: CanvasRenderingContext2D;\n readonly data: SeriesData;\n readonly time: TimeScale;\n readonly price: PriceScale;\n readonly dpr: number;\n /** Pane size in device px. */\n readonly width: number;\n readonly height: number;\n readonly lo: number;\n readonly hi: number;\n}\n\nexport interface SeriesRenderer2D<O> {\n draw(view: DrawView2D, options: O): void;\n dataChanged(change: DataChange): void;\n dispose(): void;\n}\n\ntype UnitFn = (x: number, o: number, h: number, l: number, c: number, color: number) => void;\n\n/** Visit present units over [lo, hi] at `level`, x in device px. */\nfunction eachUnit(v: DrawView2D, level: number, fn: UnitFn): void {\n const d = v.data, dpr = v.dpr, t = v.time;\n if (level === 0) {\n const st = d.store;\n const ohlc = d.shape === \"ohlc\";\n const O = st.cols[ohlc ? COL_O : COL_V]!, H = st.cols[ohlc ? COL_H : COL_V]!, L = st.cols[ohlc ? COL_L : COL_V]!, C = st.cols[ohlc ? COL_C : COL_V]!;\n const COL = ohlc ? undefined : st.cols[COL_COLOR];\n const a = Math.max(v.lo - 1, st.first), b = Math.min(v.hi + 1, st.end - 1);\n for (let i = a; i <= b; i++) {\n const p = st.head + (i - st.first);\n const o = O[p]!;\n if (o !== o) continue;\n fn(t.x(i) * dpr, o, H[p]!, L[p]!, C[p]!, COL ? COL[p]! : 0);\n }\n return;\n }\n const lv = d.lod.level(level);\n if (!lv) return;\n const O = lv.cols[LOD_O]!, H = lv.cols[LOD_H]!, L = lv.cols[LOD_L]!, C = lv.cols[LOD_C]!, COL = lv.cols[LOD_COLOR];\n const half = ((1 << level) - 1) / 2;\n const a = Math.max((v.lo >> level) - 1, lv.first), b = Math.min((v.hi >> level) + 1, lv.end - 1);\n for (let k = a; k <= b; k++) {\n const p = lv.head + (k - lv.first);\n const o = O[p]!;\n if (o !== o) continue;\n fn(t.x((k << level) + half) * dpr, o, H[p]!, L[p]!, C[p]!, COL ? COL[p]! : 0);\n }\n}\n\nconst levelOf = (v: DrawView2D) => chooseLevel(v.data, v.time.spacing * v.dpr);\nconst Y = (v: DrawView2D, p: number) => v.price.y(p) * v.dpr;\nconst snap = (y: number) => Math.floor(y + 0.5);\n\nabstract class Base<O> implements SeriesRenderer2D<O> {\n abstract draw(view: DrawView2D, options: O): void;\n dataChanged(): void {}\n dispose(): void {}\n}\n\nexport class Candles2D extends Base<CandleStyle> {\n draw(v: DrawView2D, o: CandleStyle): void {\n const level = levelOf(v);\n const [bw, ww] = barWidths(v.time.spacing, v.dpr, level, 0.8);\n const bodyUp = new Path2D(), bodyDown = new Path2D(), wickUp = new Path2D(), wickDown = new Path2D();\n eachUnit(v, level, (x, op, h, l, c) => {\n const left = Math.floor(x - bw / 2 + 0.5);\n const up = c >= op;\n const yh = snap(Y(v, h)), yl = Math.max(snap(Y(v, l)), yh + 1);\n (up ? wickUp : wickDown).rect(left + (bw - ww) / 2, yh, ww, yl - yh);\n const yt = snap(Y(v, Math.max(op, c))), yb = Math.max(snap(Y(v, Math.min(op, c))), yt + 1);\n (up ? bodyUp : bodyDown).rect(left, yt, bw, yb - yt);\n });\n const ctx = v.ctx;\n ctx.fillStyle = o.wickUpColor;\n ctx.fill(wickUp);\n ctx.fillStyle = o.wickDownColor;\n ctx.fill(wickDown);\n ctx.fillStyle = o.upColor;\n ctx.fill(bodyUp);\n ctx.fillStyle = o.downColor;\n ctx.fill(bodyDown);\n }\n}\n\nexport class Bars2D extends Base<BarStyle> {\n draw(v: DrawView2D, o: BarStyle): void {\n const level = levelOf(v);\n const [bw, t] = barWidths(v.time.spacing, v.dpr, level, 0.8);\n const up = new Path2D(), down = new Path2D();\n eachUnit(v, level, (x, op, h, l, c) => {\n const p = c >= op ? up : down;\n const left = Math.floor(x - bw / 2 + 0.5);\n const mid = left + (bw - t) / 2;\n const yh = snap(Y(v, h)), yl = Math.max(snap(Y(v, l)), yh + 1);\n p.rect(mid, yh, t, yl - yh);\n p.rect(left, Math.floor(Y(v, op) - t / 2 + 0.5), mid - left, t);\n p.rect(mid + t, Math.floor(Y(v, c) - t / 2 + 0.5), left + bw - mid - t, t);\n });\n v.ctx.fillStyle = o.upColor;\n v.ctx.fill(up);\n v.ctx.fillStyle = o.downColor;\n v.ctx.fill(down);\n }\n}\n\nexport class Histogram2D extends Base<HistogramStyle> {\n draw(v: DrawView2D, o: HistogramStyle): void {\n const level = levelOf(v);\n const [bw] = barWidths(v.time.spacing, v.dpr, level, 0.8);\n const byColor = new Map<number, Path2D>();\n // On a log scale a base at or below zero sits at the pane's lowest value.\n const yb = snap((v.price.logCoords && !(o.base > 0) ? v.price.yOfDisplay(v.price.min) : v.price.y(o.base)) * v.dpr);\n eachUnit(v, level, (x, _o, h, l, _c, color) => {\n const val = Math.abs(h - o.base) >= Math.abs(l - o.base) ? h : l;\n const yv = snap(Y(v, val));\n const y0 = Math.min(yv, yb), y1 = Math.max(Math.max(yv, yb), y0 + 1);\n let p = byColor.get(color);\n if (!p) byColor.set(color, (p = new Path2D()));\n p.rect(Math.floor(x - bw / 2 + 0.5), y0, bw, y1 - y0);\n });\n for (const [color, p] of byColor) {\n v.ctx.fillStyle = color === 0 ? o.color : cssColor(color);\n v.ctx.fill(p);\n }\n }\n}\n\n/** Path through every present unit; zoomed out, each bucket's full low..high. */\nfunction linePath(v: DrawView2D, level: number, valueOf: \"c\" | \"h\"): { path: Path2D; first: number; last: number } {\n const path = new Path2D();\n let started = false, first = 0, last = 0;\n eachUnit(v, level, (x, o, h, l, c) => {\n if (level === 0 || valueOf === \"h\") {\n const y = Y(v, valueOf === \"h\" ? h : c);\n if (started) path.lineTo(x, y);\n else {\n path.moveTo(x, y);\n first = x;\n started = true;\n }\n } else {\n if (started) path.lineTo(x, Y(v, o));\n else {\n path.moveTo(x, Y(v, o));\n first = x;\n started = true;\n }\n path.lineTo(x, Y(v, h));\n path.lineTo(x, Y(v, l));\n path.lineTo(x, Y(v, c));\n }\n last = x;\n });\n return { path, first, last };\n}\n\nfunction stroke(v: DrawView2D, path: Path2D, color: string, width: number): void {\n const ctx = v.ctx;\n ctx.strokeStyle = color;\n ctx.lineWidth = Math.max(1, width * v.dpr);\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n}\n\nexport class Line2D extends Base<LineStyle> {\n draw(v: DrawView2D, o: LineStyle): void {\n stroke(v, linePath(v, levelOf(v), \"c\").path, o.color, o.lineWidth);\n }\n}\n\nexport class Area2D extends Base<AreaStyle> {\n draw(v: DrawView2D, o: AreaStyle): void {\n const level = levelOf(v);\n const fill = linePath(v, level, \"h\");\n const area = new Path2D(fill.path);\n area.lineTo(fill.last, v.height);\n area.lineTo(fill.first, v.height);\n area.closePath();\n const g = v.ctx.createLinearGradient(0, 0, 0, v.height);\n g.addColorStop(0, o.topColor);\n g.addColorStop(1, o.bottomColor);\n v.ctx.fillStyle = g;\n v.ctx.fill(area);\n stroke(v, linePath(v, level, \"c\").path, o.lineColor, o.lineWidth);\n }\n}\n","// Series type registry: the plugin seam for new series kinds.\n//\n// Built-in types register through the same call third parties use, so the\n// contract is exercised by every chart. A type names its data shape (OHLC or\n// single value), its default options (from the theme, so unset colours follow\n// a theme switch), a WebGL renderer, and how it reports autoscale and the\n// value shown on the price axis.\n\nimport type { SeriesData, SeriesShape } from \"../data/model.js\";\nimport { COL_C, COL_COLOR, COL_O, COL_V } from \"../data/model.js\";\nimport { cssColor } from \"../render/color.js\";\nimport { Area2D, Bars2D, Candles2D, Histogram2D, Line2D, type SeriesRenderer2D } from \"../render/canvas2d.js\";\nimport type { GLContext } from \"../render/gl.js\";\nimport {\n AreaRenderer, BarRenderer, CandleRenderer, HistogramRenderer, LineRenderer,\n type AreaStyle, type BarStyle, type CandleStyle, type HistogramStyle, type LineStyle, type SeriesRenderer,\n} from \"../render/renderers.js\";\nimport type { PriceFormat } from \"../scale/format.js\";\nimport type { Theme } from \"./theme.js\";\n\n/** Options every series has, whatever its type. */\nexport interface CommonSeriesOptions {\n /** Stable id within the chart (layouts, custom formatters); assigned when empty. */\n id: string;\n /** \"right\", \"left\", or any other id for an overlay scale with no axis. */\n priceScaleId: string;\n /** Index of the pane the series is drawn in; a new index adds a pane. */\n pane: number;\n /** How values are written. A price format without minMove takes it from the data. */\n priceFormat: PriceFormat;\n /**\n * This series formats its price axis. Otherwise the axis uses the first\n * non-volume series on the scale.\n */\n scaleFormat: boolean;\n visible: boolean;\n /** Label with the last value on the price axis. */\n lastValueVisible: boolean;\n /** Dashed line at the last value across the pane. */\n priceLineVisible: boolean;\n /** Tag next to the last-value label on the price axis side, inside the pane; only drawn when `lastValueVisible`. Empty shows nothing. */\n title: string;\n /**\n * Adjusts this series' contribution to its price scale's autoscale, after\n * the built-in min/max over the visible bars. `range` is null when the series\n * has nothing visible; return the range to use (null: contribute nothing).\n * Runs every frame: keep it cheap. A function is not saved by `saveState`,\n * so a restored layout has no override until it is set again.\n */\n autoscale?: (range: { low: number; high: number } | null) => { low: number; high: number } | null;\n}\n\n/** Built-in types. Plugins extend this interface by declaration merging. */\nexport interface SeriesOptionsMap {\n candles: CandleStyle;\n bars: BarStyle;\n line: LineStyle;\n area: AreaStyle;\n histogram: HistogramStyle;\n}\nexport type SeriesType = keyof SeriesOptionsMap;\n\n/** Data shape per type; plugins extend this alongside SeriesOptionsMap. */\nexport interface SeriesShapes {\n candles: \"ohlc\";\n bars: \"ohlc\";\n line: \"value\";\n area: \"value\";\n histogram: \"value\";\n}\nexport type SeriesOptions<T extends SeriesType> = CommonSeriesOptions & SeriesOptionsMap[T];\n\nexport interface LastValue {\n value: number;\n /** CSS colour of the axis label. */\n color: string;\n}\n\nexport interface SeriesTypeDef<O> {\n readonly shape: SeriesShape;\n defaults(theme: Theme): O & Partial<CommonSeriesOptions>;\n createRenderer(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData): SeriesRenderer<O>;\n /** Canvas2D renderer, used when WebGL2 is unavailable. A type without one cannot draw there. */\n createRenderer2D?(data: SeriesData): SeriesRenderer2D<O>;\n /** [low, high] over indices [lo, hi] into `out`; NaN when nothing is there. */\n autoscale(data: SeriesData, options: O, lo: number, hi: number, out: Float64Array): void;\n /** Value and colour for the axis label at index i. */\n valueAt(data: SeriesData, options: O, i: number): LastValue | undefined;\n}\n\nconst registry = new Map<string, SeriesTypeDef<unknown>>();\n\nexport function registerSeriesType<T extends SeriesType>(type: T, def: SeriesTypeDef<SeriesOptionsMap[T]>): void {\n const prev = registry.get(type);\n // Re-registering the same definition (HMR, a module loaded twice) is fine;\n // a different one under the same name is a conflict.\n if (prev === def) return;\n if (prev) throw new Error(`alphacharts: series type \"${type}\" is already registered with a different definition`);\n registry.set(type, def as SeriesTypeDef<unknown>);\n}\n\nexport function seriesType<T extends SeriesType>(type: T): SeriesTypeDef<SeriesOptionsMap[T]> {\n const def = registry.get(type);\n if (!def) throw new Error(`alphacharts: unknown series type \"${type}\"`);\n return def as SeriesTypeDef<SeriesOptionsMap[T]>;\n}\n\n// ---- built-ins --------------------------------------------------------------\n\nconst lodRange = (d: SeriesData, _o: unknown, lo: number, hi: number, out: Float64Array) => void d.lod.minMax(lo, hi, out);\n\nfunction ohlcValue(d: SeriesData, i: number, up: string, down: string): LastValue | undefined {\n if (!d.has(i)) return undefined;\n const c = d.get(i, COL_C);\n return { value: c, color: c >= d.get(i, COL_O) ? up : down };\n}\n\nregisterSeriesType(\"candles\", {\n shape: \"ohlc\",\n defaults: (t) => ({ upColor: t.up, downColor: t.down, wickUpColor: t.up, wickDownColor: t.down }),\n createRenderer: (gl, ctx, d) => new CandleRenderer(gl, ctx, d),\n createRenderer2D: () => new Candles2D(),\n autoscale: lodRange,\n valueAt: (d, o, i) => ohlcValue(d, i, o.upColor, o.downColor),\n});\n\nregisterSeriesType(\"bars\", {\n shape: \"ohlc\",\n defaults: (t) => ({ upColor: t.up, downColor: t.down }),\n createRenderer: (gl, ctx, d) => new BarRenderer(gl, ctx, d),\n createRenderer2D: () => new Bars2D(),\n autoscale: lodRange,\n valueAt: (d, o, i) => ohlcValue(d, i, o.upColor, o.downColor),\n});\n\nregisterSeriesType(\"line\", {\n shape: \"value\",\n defaults: (t) => ({ color: t.accent, lineWidth: 2 }),\n createRenderer: (gl, ctx, d) => new LineRenderer(gl, ctx, d),\n createRenderer2D: () => new Line2D(),\n autoscale: lodRange,\n valueAt: (d, o, i) => (d.has(i) ? { value: d.get(i, COL_V), color: o.color } : undefined),\n});\n\nregisterSeriesType(\"area\", {\n shape: \"value\",\n defaults: (t) => ({ lineColor: t.accent, topColor: \"rgba(41,98,255,0.28)\", bottomColor: \"rgba(41,98,255,0.02)\", lineWidth: 2 }),\n createRenderer: (gl, ctx, d) => new AreaRenderer(gl, ctx, d),\n createRenderer2D: () => new Area2D(),\n autoscale: lodRange,\n valueAt: (d, o, i) => (d.has(i) ? { value: d.get(i, COL_V), color: o.lineColor } : undefined),\n});\n\nregisterSeriesType(\"histogram\", {\n shape: \"value\",\n defaults: (t) => ({ color: t.accent, base: 0 }),\n createRenderer: (gl, ctx, d) => new HistogramRenderer(gl, ctx, d),\n createRenderer2D: () => new Histogram2D(),\n autoscale: (d, o, lo, hi, out) => {\n d.lod.minMax(lo, hi, out);\n if (out[0]! === out[0]!) {\n out[0] = Math.min(out[0]!, o.base);\n out[1] = Math.max(out[1]!, o.base);\n }\n },\n valueAt: (d, o, i) => {\n if (!d.has(i)) return undefined;\n const c = d.get(i, COL_COLOR);\n return { value: d.get(i, COL_V), color: c !== 0 ? cssColor(c) : o.color };\n },\n});\n","// Public handle for one series on a chart.\n\nimport type { ColumnarOhlc, ColumnarValue, OhlcBar, SeriesData, ValuePoint } from \"../data/model.js\";\nimport { COL_C, COL_H, COL_L, COL_O, COL_V } from \"../data/model.js\";\nimport type { SeriesRenderer2D } from \"../render/canvas2d.js\";\nimport type { SeriesRenderer } from \"../render/renderers.js\";\nimport { parseColor } from \"../render/color.js\";\nimport { createFormatter, decimalsOf, type Formatter } from \"../scale/format.js\";\nimport { checkMarkers, type SeriesMarker } from \"./markers.js\";\nimport type { PanePrimitive } from \"./primitives.js\";\nimport { seriesType, type CommonSeriesOptions, type SeriesOptions, type SeriesOptionsMap, type SeriesShapes, type SeriesType, type SeriesTypeDef } from \"./series-types.js\";\nimport type { Theme } from \"./theme.js\";\n\n/** Input accepted by a series, from the shape its type declares. */\nexport type SeriesInput<T extends SeriesType> = SeriesShapes[T] extends \"ohlc\" ? readonly OhlcBar[] | ColumnarOhlc : readonly ValuePoint[] | ColumnarValue;\nexport type SeriesBar<T extends SeriesType> = SeriesShapes[T] extends \"ohlc\" ? OhlcBar : ValuePoint;\n\n/** Rows sampled from each end when deriving decimals from the data. */\nconst SAMPLE = 2048;\n\n/** Parse every *Color option now, so a bad value throws at the call site. */\nfunction validateColors(options: object): void {\n const a = (options as { autoscale?: unknown }).autoscale;\n if (a !== undefined && typeof a !== \"function\") throw new TypeError(`alphacharts: series option autoscale must be a function, got ${typeof a}`);\n for (const [k, v] of Object.entries(options)) if (/color$/i.test(k) && v !== undefined) parseColor(v as string);\n}\n\nexport const DEFAULT_COMMON: CommonSeriesOptions = {\n id: \"\",\n priceScaleId: \"right\",\n pane: 0,\n priceFormat: { type: \"price\" },\n scaleFormat: false,\n visible: true,\n lastValueVisible: true,\n priceLineVisible: true,\n title: \"\",\n};\n\n/** The chart side of a series: what Series calls back into. */\nexport interface SeriesHost {\n setData(s: Series<SeriesType>, input: unknown): void;\n prepend(s: Series<SeriesType>, input: unknown): void;\n update(s: Series<SeriesType>, bar: unknown): void;\n optionsChanged(s: Series<SeriesType>, paneOrScaleMoved: boolean): void;\n markersChanged(s: Series<SeriesType>): void;\n /** Pane-relative y of a price on the series' scale; NaN when the scale has no range yet. */\n priceToY(s: Series<SeriesType>, price: number): number;\n yToPrice(s: Series<SeriesType>, y: number): number;\n attachPrimitive(s: Series<SeriesType>, p: PanePrimitive): void;\n detachPrimitive(s: Series<SeriesType>, p: PanePrimitive): void;\n timeAt(index: number): number;\n indexOf(time: number): number | undefined;\n readonly locale: string | undefined;\n}\n\nexport class Series<T extends SeriesType> {\n /** @internal */ renderer: SeriesRenderer<SeriesOptionsMap[T]> | null = null;\n /** @internal */ renderer2d: SeriesRenderer2D<SeriesOptionsMap[T]> | null = null;\n /** @internal */ readonly def: SeriesTypeDef<SeriesOptionsMap[T]>;\n /** @internal */ formatter: Formatter;\n /** Decimals seen in the data so far; only grows. */\n private dataDecimals = 0;\n private markerList: SeriesMarker[] = [];\n private user: Partial<SeriesOptions<T>>;\n private effective: SeriesOptions<T>;\n\n /** @internal */\n constructor(\n readonly type: T,\n /** Columnar bar store (read-only by contract): study packages read OHLC/value columns from it. */ readonly data: SeriesData,\n private readonly host: SeriesHost,\n options: Partial<SeriesOptions<T>>,\n theme: Theme,\n ) {\n this.def = seriesType(type);\n validateColors(options);\n this.user = { ...options };\n this.effective = this.resolve(theme);\n this.formatter = this.makeFormatter();\n }\n\n options(): Readonly<SeriesOptions<T>> {\n return this.effective;\n }\n\n applyOptions(options: Partial<SeriesOptions<T>>): void {\n validateColors(options);\n const prev = this.effective;\n this.user = { ...this.user, ...options };\n this.effective = this.resolveFrom(prev);\n if (this.effective.priceFormat !== prev.priceFormat) this.formatter = this.makeFormatter();\n this.host.optionsChanged(this as never, this.effective.pane !== prev.pane || this.effective.priceScaleId !== prev.priceScaleId);\n }\n\n /** Replace all data. Times are UTC ms, strictly increasing. */\n setData(data: SeriesInput<T>): void {\n this.host.setData(this as never, data);\n }\n\n /** Older history, all earlier than the first bar. */\n prepend(data: SeriesInput<T>): void {\n this.host.prepend(this as never, data);\n }\n\n /** Live bar: same time as the last bar replaces it, a later time appends. */\n update(bar: SeriesBar<T>): void {\n this.host.update(this as never, bar);\n }\n\n /** The bar at `time`, or undefined. Values are the exact inputs (Float64). */\n barAt(time: number): SeriesBar<T> | undefined {\n const i = this.host.indexOf(time);\n return i === undefined ? undefined : this.barAtIndex(i);\n }\n\n /** @internal */\n barAtIndex(i: number): SeriesBar<T> | undefined {\n const d = this.data;\n if (!d.has(i)) return undefined;\n const time = this.host.timeAt(i);\n if (d.shape === \"ohlc\") {\n return { time, open: d.get(i, COL_O), high: d.get(i, COL_H), low: d.get(i, COL_L), close: d.get(i, COL_C) } as SeriesBar<T>;\n }\n return { time, value: d.get(i, COL_V) } as SeriesBar<T>;\n }\n\n /** Index range of the series' bars on the chart's timeline. */\n range(): { first: number; last: number } | undefined {\n const first = this.data.firstIndex();\n const last = this.data.lastIndex();\n return first === undefined || last === undefined ? undefined : { first, last };\n }\n\n /**\n * Replace the series' markers (an empty array clears them). Every marker's\n * `time` must be the time of a bar of this series, else this throws naming\n * the marker and changes nothing; ids must be unique. Markers are not part of\n * `saveState`, like the bar data they annotate.\n */\n setMarkers(markers: readonly SeriesMarker[]): void {\n this.markerList = checkMarkers(markers, (t) => {\n const i = this.host.indexOf(t);\n return i !== undefined && this.data.has(i);\n });\n this.host.markersChanged(this as never);\n }\n\n /** The current markers, sorted by time. */\n markers(): readonly SeriesMarker[] {\n return this.markerList;\n }\n\n /**\n * CSS y within the pane of a price on this series' price scale, or NaN while\n * the scale has no range yet (no data, or before the chart's first frame).\n */\n priceToCoordinate(price: number): number {\n return this.host.priceToY(this as never, price);\n }\n\n /** Inverse of `priceToCoordinate`: the price at pane-relative CSS y; NaN while the scale has no range. */\n coordinateToPrice(y: number): number {\n return this.host.yToPrice(this as never, y);\n }\n\n formatPrice(p: number): string {\n return this.formatter.format(p);\n }\n\n attachPrimitive(p: PanePrimitive): void {\n this.host.attachPrimitive(this as never, p);\n }\n\n detachPrimitive(p: PanePrimitive): void {\n this.host.detachPrimitive(this as never, p);\n }\n\n /**\n * @internal Widen the derived precision to cover rows [lo, hi). Called by\n * the chart after every data change; samples the ends of large ranges.\n */\n observeData(lo: number, hi: number): void {\n const d = this.data;\n const col = d.shape === \"ohlc\" ? COL_C : COL_V;\n const cols = d.shape === \"ohlc\" ? [COL_O, COL_H, COL_L, COL_C] : [col];\n let dec = this.dataDecimals;\n const scan = (a: number, b: number) => {\n for (let i = a; i < b; i++) {\n if (!d.has(i)) continue;\n for (const c of cols) dec = Math.max(dec, decimalsOf(d.get(i, c)));\n }\n };\n if (hi - lo <= SAMPLE * 2) scan(lo, hi);\n else {\n scan(lo, lo + SAMPLE);\n scan(hi - SAMPLE, hi);\n }\n if (dec !== this.dataDecimals) {\n this.dataDecimals = dec;\n this.formatter = this.makeFormatter();\n }\n }\n\n private makeFormatter(): Formatter {\n return createFormatter(this.effective.priceFormat, 10 ** -this.dataDecimals, this.host.locale);\n }\n\n /** @internal Re-resolve defaults after a theme change. */\n themeChanged(theme: Theme): void {\n this.effective = this.resolve(theme);\n }\n\n private resolve(theme: Theme): SeriesOptions<T> {\n return { ...DEFAULT_COMMON, ...this.def.defaults(theme), ...this.user } as SeriesOptions<T>;\n }\n\n private resolveFrom(prev: SeriesOptions<T>): SeriesOptions<T> {\n return { ...prev, ...this.user } as SeriesOptions<T>;\n }\n}\n","// Theme tokens. Everything visual the chart draws comes from here or from\n// series options; nothing is branded. Switch live with chart.applyOptions({ theme }).\n\nexport interface Theme {\n background: string;\n text: string;\n /** Secondary text: axis labels. */\n textMuted: string;\n grid: string;\n border: string;\n crosshair: string;\n /** Background of crosshair/axis labels. */\n labelBackground: string;\n labelText: string;\n fontFamily: string;\n /** CSS px. */\n fontSize: number;\n up: string;\n down: string;\n accent: string;\n /** Shade behind bars outside regular trading hours. */\n extendedHours: string;\n}\n\nexport const DARK: Theme = {\n background: \"#0f1115\",\n text: \"#d1d4dc\",\n textMuted: \"#8b909a\",\n grid: \"#1c2028\",\n border: \"#2a2e39\",\n crosshair: \"#9598a1\",\n labelBackground: \"#363a45\",\n labelText: \"#e9eaee\",\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 11,\n up: \"#26a69a\",\n down: \"#ef5350\",\n accent: \"#2962ff\",\n extendedHours: \"rgba(41,98,255,0.06)\",\n};\n\nexport const LIGHT: Theme = {\n background: \"#ffffff\",\n text: \"#131722\",\n textMuted: \"#5d606b\",\n grid: \"#f0f3fa\",\n border: \"#e0e3eb\",\n crosshair: \"#9598a1\",\n labelBackground: \"#131722\",\n labelText: \"#ffffff\",\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 11,\n up: \"#089981\",\n down: \"#f23645\",\n accent: \"#2962ff\",\n extendedHours: \"rgba(41,98,255,0.05)\",\n};\n\n/** WCAG AAA contrast for text and marks; no translucent grid. */\nexport const HIGH_CONTRAST: Theme = {\n background: \"#000000\",\n text: \"#ffffff\",\n textMuted: \"#ffffff\",\n grid: \"#3a3a3a\",\n border: \"#ffffff\",\n crosshair: \"#ffffff\",\n labelBackground: \"#ffffff\",\n labelText: \"#000000\",\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 12,\n up: \"#00ff7f\",\n down: \"#ff4d4d\",\n accent: \"#4da3ff\",\n extendedHours: \"rgba(255,255,255,0.12)\",\n};\n\n/** Dark, light or high contrast, from the OS preferences right now. */\nexport function systemTheme(): Theme {\n if (typeof matchMedia === \"undefined\") return DARK;\n if (matchMedia(\"(prefers-contrast: more)\").matches) return HIGH_CONTRAST;\n return matchMedia(\"(prefers-color-scheme: light)\").matches ? LIGHT : DARK;\n}\n\n","// User-visible strings the chart itself produces (aria labels, the\n// screen-reader readout and table, the countdown's day suffix). They go\n// through one injectable function so a UI shell can translate them; the\n// English defaults here are what the chart says without one.\n//\n// `{name}` placeholders are filled by the chart. A custom function receives\n// the key and the raw values and returns the finished text; it should throw\n// on a key it does not know rather than return something wrong.\n\nexport const CHART_MESSAGES = {\n \"chart.ariaLabel\": \"Price chart\",\n \"chart.readout.ohlc\": \"{name} open {open} high {high} low {low} close {close}\",\n \"chart.readout.value\": \"{name} {value}\",\n \"chart.table.time\": \"Time\",\n \"chart.table.open\": \"Open\",\n \"chart.table.high\": \"High\",\n \"chart.table.low\": \"Low\",\n \"chart.table.close\": \"Close\",\n \"chart.table.value\": \"Value\",\n \"chart.table.caption\": \"{label}: {name}, visible bars, newest first\",\n \"chart.countdown.days\": \"{n}d\",\n} as const;\n\nexport type ChartMessageKey = keyof typeof CHART_MESSAGES;\nexport type ChartMessageValues = Readonly<Record<string, string | number>>;\nexport type ChartMessages = (key: ChartMessageKey, values?: ChartMessageValues) => string;\n\n/** English defaults: substitutes `{name}` placeholders, throws on an unknown key. */\nexport const defaultMessages: ChartMessages = (key, values = {}) => {\n const template = CHART_MESSAGES[key] as string | undefined;\n if (template === undefined) throw new Error(`alphacharts: unknown chart message key \"${key}\"`);\n return template.replace(/\\{(\\w+)\\}/g, (_, name: string) => {\n const v = values[name];\n if (v === undefined) throw new Error(`alphacharts: chart message \"${key}\" needs a value for \"${name}\"`);\n return String(v);\n });\n};\n","// Trading sessions and holidays, as data.\n//\n// A session calendar names, per weekday, the regular trading windows in the\n// exchange's time zone (minutes from local midnight, end exclusive; a window\n// may cross midnight), optional extended windows, and holiday dates. Crypto\n// is `ALWAYS_OPEN`. The chart uses it to shade bars outside regular hours and\n// the resampler uses it to align intraday buckets to the session open and to\n// make a daily bar out of one trading day.\n\nimport { DAY_MS, TimeZone } from \"./tz.js\";\n\n/** [start, end) in minutes from local midnight; end may exceed 1440 (crosses midnight). */\nexport type Window = readonly [number, number];\n\nexport interface SessionSpec {\n timeZone: string;\n /** Index 0 = Sunday … 6 = Saturday. Empty array: closed that weekday. */\n regular: readonly (readonly Window[])[];\n /** Pre/post-market windows; bars in them are \"extended\", not \"closed\". */\n extended?: readonly (readonly Window[])[];\n /** Local dates \"YYYY-MM-DD\" with no trading. */\n holidays?: readonly string[];\n}\n\nexport type SessionState = \"regular\" | \"extended\" | \"closed\";\n\nconst all = (w: Window[]) => [w, w, w, w, w, w, w] as const;\n\nexport const ALWAYS_OPEN: SessionSpec = { timeZone: \"UTC\", regular: all([[0, 1440]]) };\n\n/** Monday–Friday windows, weekends closed. */\nexport function weekdays(timeZone: string, regular: Window[], extended?: Window[], holidays?: string[]): SessionSpec {\n const days = (w: Window[]) => [[], w, w, w, w, w, []] as const;\n return { timeZone, regular: days(regular), ...(extended ? { extended: days(extended) } : {}), ...(holidays ? { holidays } : {}) };\n}\n\n/** NSE/BSE cash: 09:15–15:30 IST. Holidays are the integrator's to supply. */\nexport const NSE = (holidays: string[] = []) => weekdays(\"Asia/Kolkata\", [[555, 930]], [[540, 555]], holidays);\n/** NYSE/Nasdaq: 09:30–16:00 ET, pre 04:00–09:30, post 16:00–20:00. */\nexport const US_EQUITY = (holidays: string[] = []) => weekdays(\"America/New_York\", [[570, 960]], [[240, 570], [960, 1200]], holidays);\n\nexport class Sessions {\n readonly tz: TimeZone;\n private readonly holidays: Set<string>;\n\n constructor(readonly spec: SessionSpec) {\n if (spec.regular.length !== 7) throw new RangeError(\"sessions: regular needs 7 weekdays (Sunday first)\");\n if (spec.extended && spec.extended.length !== 7) throw new RangeError(\"sessions: extended needs 7 weekdays (Sunday first)\");\n for (const day of [...spec.regular, ...(spec.extended ?? [])]) {\n for (const [a, b] of day) {\n if (!(a >= 0 && b > a && b - a <= 1440)) throw new RangeError(`sessions: bad window [${a}, ${b})`);\n }\n }\n for (const h of spec.holidays ?? []) if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(h)) throw new RangeError(`sessions: holiday \"${h}\" is not YYYY-MM-DD`);\n this.tz = new TimeZone(spec.timeZone);\n this.holidays = new Set(spec.holidays ?? []);\n }\n\n /** Is t (UTC ms) in a regular window, an extended one, or neither? */\n state(t: number): SessionState {\n const local = t + this.tz.offset(t);\n // A window that crosses midnight belongs to the day it started on.\n for (const back of [0, 1]) {\n const day = Math.floor(local / DAY_MS) - back;\n if (this.isHolidayDay(day)) continue;\n const min = (local - day * DAY_MS) / 60_000;\n const wd = weekday(day);\n if (inAny(this.spec.regular[wd]!, min)) return \"regular\";\n if (this.spec.extended && inAny(this.spec.extended[wd]!, min)) return \"extended\";\n }\n return \"closed\";\n }\n\n /**\n * Start (UTC ms) of the regular session containing t, or of the next one\n * if t is outside every session. Used to align buckets and daily bars.\n */\n sessionStart(t: number): number {\n const local = t + this.tz.offset(t);\n const today = Math.floor(local / DAY_MS);\n for (let day = today - 1; day <= today + 14; day++) {\n if (this.isHolidayDay(day)) continue;\n for (const [a, b] of this.spec.regular[weekday(day)]!) {\n const s = this.tz.fromLocal(day * DAY_MS + a * 60_000);\n const e = this.tz.fromLocal(day * DAY_MS + b * 60_000);\n if (t < e && (t >= s || day >= today)) return s;\n }\n }\n throw new RangeError(\"sessions: no regular session within two weeks (is every weekday closed?)\");\n }\n\n /** The local trading date \"YYYY-MM-DD\" a time belongs to (by its session start). */\n tradingDate(t: number): string {\n const s = this.sessionStart(t);\n const c = this.tz.civil(s);\n return `${c.year}-${String(c.month).padStart(2, \"0\")}-${String(c.day).padStart(2, \"0\")}`;\n }\n\n private isHolidayDay(day: number): boolean {\n if (this.holidays.size === 0) return false;\n const c = this.tz.civil(this.tz.fromLocal(day * DAY_MS + 12 * 3_600_000));\n return this.holidays.has(`${c.year}-${String(c.month).padStart(2, \"0\")}-${String(c.day).padStart(2, \"0\")}`);\n }\n}\n\n/** 0 = Sunday for a count of days since 1970-01-01 (a Thursday). */\nfunction weekday(day: number): number {\n return (((day + 4) % 7) + 7) % 7;\n}\n\nfunction inAny(ws: readonly Window[], min: number): boolean {\n for (const [a, b] of ws) if (min >= a && min < b) return true;\n return false;\n}\n","// Custom timeframes: bars of any resolution built from a finer one.\n//\n// Buckets, in the chart's time zone:\n// s, m, h aligned to the session open when a calendar is given (a 75-minute\n// bar on NSE starts 09:15, 10:30, …), else to local midnight;\n// D one trading day (session) or one local calendar day; nD groups\n// n calendar days counted from the epoch;\n// W weeks starting Monday 00:00 local;\n// M calendar months; nM groups n months counted from year 0.\n// A bucket's time is its start. Incremental: push() folds live source bars\n// in, and a revised last source bar (a tick update) replaces its previous\n// contribution instead of being added twice.\n\nimport { DAY_MS, TimeZone } from \"./tz.js\";\nimport { Sessions, type SessionSpec } from \"./session.js\";\n\nexport type ResolutionUnit = \"s\" | \"m\" | \"h\" | \"D\" | \"W\" | \"M\";\nexport interface Resolution {\n unit: ResolutionUnit;\n n: number;\n}\n\n/** \"30s\", \"5m\", \"75m\", \"4h\", \"1D\", \"1W\", \"3M\" (also \"15\" = 15 minutes, \"D\" = 1D). */\nexport function parseResolution(s: string): Resolution {\n const m = /^(\\d+)?([smhDWM])?$/.exec(s.trim());\n if (!m || (!m[1] && !m[2])) throw new RangeError(`resolution \"${s}\": expected e.g. 30s, 5m, 4h, 1D, 1W, 3M`);\n const n = m[1] ? Number(m[1]) : 1;\n if (!(n >= 1) || !Number.isInteger(n)) throw new RangeError(`resolution \"${s}\": count must be a positive integer`);\n return { unit: (m[2] ?? \"m\") as ResolutionUnit, n };\n}\n\nexport interface ResampledBar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\nconst MS = { s: 1000, m: 60_000, h: 3_600_000 } as const;\n\nexport class Resampler {\n private readonly tz: TimeZone;\n private readonly sessions: Sessions | null;\n /** Aggregate of the bucket's source bars except the last one. */\n private base: ResampledBar | null = null;\n private last: { time: number; bar: ResampledBar } | null = null;\n private bucket = Number.NaN;\n\n constructor(readonly res: Resolution, opts: { timeZone?: string; sessions?: SessionSpec } = {}) {\n if (!(res.n >= 1) || !Number.isInteger(res.n)) throw new RangeError(`resolution count must be a positive integer, got ${res.n}`);\n this.sessions = opts.sessions ? new Sessions(opts.sessions) : null;\n this.tz = this.sessions ? this.sessions.tz : new TimeZone(opts.timeZone ?? \"UTC\");\n }\n\n /** Start (UTC ms) of the bucket containing t. */\n bucketStart(t: number): number {\n const { unit, n } = this.res;\n const tz = this.tz;\n if (unit === \"s\" || unit === \"m\" || unit === \"h\") {\n const len = MS[unit] * n;\n const anchor = this.sessions ? this.sessions.sessionStart(t) : tz.fromLocal(Math.floor((t + tz.offset(t)) / DAY_MS) * DAY_MS);\n return anchor + Math.floor((t - anchor) / len) * len;\n }\n const local = t + tz.offset(t);\n if (unit === \"D\") {\n if (this.sessions && n === 1) return this.sessions.sessionStart(t);\n const day = Math.floor(local / DAY_MS);\n return tz.fromLocal(Math.floor(day / n) * n * DAY_MS);\n }\n if (unit === \"W\") {\n // Day 4 (1970-01-05) is the first Monday; weeks count from it.\n const day = Math.floor(local / DAY_MS);\n const week = Math.floor((day - 4) / 7);\n return tz.fromLocal((4 + Math.floor(week / n) * n * 7) * DAY_MS);\n }\n const c = tz.civil(t);\n const idx = Math.floor((c.year * 12 + (c.month - 1)) / n) * n;\n return tz.fromLocal(Date.UTC(Math.floor(idx / 12), idx % 12, 1));\n }\n\n /**\n * Fold one source bar in. Returns the bucket's bar and whether it replaced\n * the previous result (same bucket) or starts a new one. Source times must\n * not go backwards; the same time again is a revision of the last bar.\n */\n push(src: { time: number; open: number; high: number; low: number; close: number; volume?: number }): { bar: ResampledBar; replaced: boolean } {\n const v: ResampledBar = { time: src.time, open: src.open, high: src.high, low: src.low, close: src.close, volume: src.volume ?? 0 };\n if (this.last && src.time < this.last.time) throw new RangeError(`resample: source time ${src.time} is before the previous ${this.last.time}`);\n const b = this.bucketStart(src.time);\n if (b !== this.bucket) {\n this.bucket = b;\n this.base = null;\n this.last = { time: src.time, bar: v };\n return { bar: { ...v, time: b }, replaced: false };\n }\n if (this.last && this.last.time === src.time) {\n this.last = { time: src.time, bar: v }; // revision\n } else {\n this.base = this.base ? merge(this.base, this.last!.bar) : this.last!.bar;\n this.last = { time: src.time, bar: v };\n }\n const agg = this.base ? merge(this.base, v) : v;\n return { bar: { ...agg, time: b }, replaced: true };\n }\n\n /** Resample a whole history. */\n static batch(\n res: Resolution,\n src: { time: ArrayLike<number>; open: ArrayLike<number>; high: ArrayLike<number>; low: ArrayLike<number>; close: ArrayLike<number>; volume?: ArrayLike<number> },\n opts: { timeZone?: string; sessions?: SessionSpec } = {},\n ): ResampledBar[] {\n const r = new Resampler(res, opts);\n const out: ResampledBar[] = [];\n for (let i = 0; i < src.time.length; i++) {\n const { bar, replaced } = r.push({ time: src.time[i]!, open: src.open[i]!, high: src.high[i]!, low: src.low[i]!, close: src.close[i]!, volume: src.volume ? src.volume[i]! : 0 });\n if (replaced) out[out.length - 1] = bar;\n else out.push(bar);\n }\n return out;\n }\n}\n\nfunction merge(a: ResampledBar, b: ResampledBar): ResampledBar {\n return { time: a.time, open: a.open, high: Math.max(a.high, b.high), low: Math.min(a.low, b.low), close: b.close, volume: a.volume + b.volume };\n}\n","// The brand α mark (configurable: `visible`, `opacity`) at the bottom-left of the main pane, above the time\n// axis. Drawn on the overlay layer inside the pane's clip, so a chart in a\n// Dashboard carries its own inside its cell. The glyph has a halo in the chart\n// background so it stays legible over candles and volume.\n\nimport type { Theme } from \"./theme.js\";\n\nexport interface WatermarkOptions {\n visible: boolean;\n /** 0 to 1. */\n opacity: number;\n}\n\nexport const DEFAULT_WATERMARK: WatermarkOptions = { visible: true, opacity: 1 };\n\nexport function checkWatermarkOptions(o: WatermarkOptions): void {\n if (typeof o.visible !== \"boolean\") throw new TypeError(`alphacharts: watermark.visible must be a boolean, got ${String(o.visible)}`);\n if (!(o.opacity >= 0 && o.opacity <= 1)) throw new RangeError(`alphacharts: watermark.opacity must be between 0 and 1, got ${String(o.opacity)}`);\n}\n\n// α from the brand's alphabench_logo.svg (y up, 1024 box); GLYPH_BOX is the\n// cropped viewBox the brand's inline logo uses.\nconst GLYPH_PATH =\n \"M4405 7778 c-217 -11 -387 -42 -589 -109 -702 -233 -1309 -862 -1563 -1619 -85 -253 -124 -451 -148 -755 -18 -227 -18 -329 0 -531 30 -337 82 -568 190 -849 144 -372 337 -670 614 -945 354 -351 734 -551 1231 -649 209 -41 591 -41 800 0 267 52 453 119 660 237 306 175 558 411 729 685 33 51 48 67 66 67 18 0 25 -8 35 -47 70 -268 197 -492 353 -624 102 -85 277 -168 452 -214 151 -40 248 -49 500 -49 254 0 342 9 450 47 l40 14 3 417 c1 288 -1 416 -8 416 -6 0 -23 -6 -38 -14 -15 -7 -70 -28 -122 -46 -80 -28 -113 -34 -213 -38 -212 -8 -343 32 -454 141 -86 83 -139 201 -174 382 -18 96 -19 169 -19 2012 l0 1913 -415 0 -415 0 0 -380 c0 -447 4 -436 -100 -288 -134 191 -398 428 -606 544 -27 15 -63 35 -80 44 -44 26 -208 95 -289 123 -280 97 -554 132 -890 115z m485 -789 c412 -60 800 -291 1064 -634 189 -244 314 -515 371 -800 38 -191 40 -223 40 -520 0 -297 -3 -332 -41 -520 -137 -681 -658 -1252 -1279 -1402 -243 -58 -527 -58 -770 0 -586 141 -1091 664 -1254 1297 -58 227 -74 368 -74 630 0 478 97 835 320 1179 243 375 598 635 1012 741 169 44 425 56 611 29z\";\nconst GLYPH_X = 200, GLYPH_Y = 240, GLYPH_H = 560;\n\nconst HEIGHT = 20;\nconst INSET_X = 12;\nconst INSET_Y = 10;\nconst HALO = 3.5;\n/** Below these the mark would crowd the series, so it is not drawn. */\nconst MIN_PANE_W = 160;\nconst MIN_PANE_H = 120;\n\nlet glyph: Path2D | undefined;\n\n/** Draws into a context whose origin is the pane's top-left, in CSS px. */\nexport function drawWatermark(ctx: CanvasRenderingContext2D, paneW: number, paneH: number, th: Theme, o: WatermarkOptions): void {\n if (!o.visible || o.opacity === 0 || paneW < MIN_PANE_W || paneH < MIN_PANE_H) return;\n glyph ??= new Path2D(GLYPH_PATH);\n const sc = HEIGHT / GLYPH_H;\n ctx.save();\n ctx.globalAlpha = o.opacity;\n ctx.translate(INSET_X, paneH - INSET_Y - HEIGHT);\n ctx.scale(sc, sc);\n ctx.translate(-GLYPH_X, -GLYPH_Y);\n ctx.translate(0, 1024);\n ctx.scale(0.1, -0.1);\n ctx.lineJoin = \"round\";\n ctx.lineWidth = HALO / (sc * 0.1);\n ctx.strokeStyle = th.background;\n ctx.stroke(glyph);\n ctx.fillStyle = th.text;\n ctx.fill(glyph);\n ctx.restore();\n}\n","// The chart: DOM, layout, autoscale and the three render layers.\n//\n// Layers, bottom to top, one canvas each covering the whole chart:\n// bg (2D) background, grid, axes, separators — redrawn on view change\n// gl (WebGL2) every series — redrawn on view or data change\n// overlay (2D) crosshair, price lines, last-value labels, primitives —\n// redrawn on pointer moves without touching the other two\n// Panes are rectangles inside those canvases (scissor + viewport for GL).\n// Every frame starts with layout(): sync the time scale to the timeline,\n// autoscale each price scale over the visible bars, measure the axes. If that\n// changed anything, the layers that depend on it are promoted to dirty.\n\nimport { COL_H, COL_L, COL_V, DataModel, type DataChange } from \"../data/model.js\";\nimport type { Timeline } from \"../data/timeline.js\";\nimport { TimeZone } from \"../data/tz.js\";\nimport { parseColor } from \"../render/color.js\";\nimport type { SurfaceChoice, SurfaceEvents, SurfaceKind } from \"../render/surface.js\";\nimport { OwnLayers, type Layers } from \"./layers.js\";\nimport type { ChartPlugin, PluginApi, PluginPaneView, PluginPointer } from \"./plugin.js\";\nimport { checkCustomOptions, LAYOUT_VERSION, migrate, plain, type ChartState, type SeriesState } from \"./layout.js\";\nimport type { DrawView } from \"../render/renderers.js\";\nimport { checkPriceScaleOptions, DEFAULT_PRICE_SCALE, PriceScale, type PriceScaleOptions } from \"../scale/price-scale.js\";\nimport type { Formatter } from \"../scale/format.js\";\nimport { axisText, scaleTicks, TimeFormatter, timeText, timeTicks, type TimeLabel, type TimeTick } from \"../scale/ticks.js\";\nimport { DEFAULT_TIME_SCALE, TimeScale, type TimeScaleOptions } from \"../scale/time-scale.js\";\nimport { Interaction } from \"../interaction/input.js\";\nimport { Emitter } from \"./emitter.js\";\nimport { crisp, PriceLine, type AxisLabel, type PanePrimitive, type PaneView, type PriceLineOptions, type RenderLayer } from \"./primitives.js\";\nimport { drawMarkers, markerLowerBound, placeMarkers, type PlacedMarker } from \"./markers.js\";\nimport { cancelRender, LAYER_ALL, LAYER_BG, LAYER_GL, LAYER_OVERLAY, requestRender, type Renderable } from \"./scheduler.js\";\nimport { Series } from \"./series.js\";\nimport { seriesType, type SeriesOptions, type SeriesType } from \"./series-types.js\";\nimport { DARK, HIGH_CONTRAST, LIGHT, systemTheme, type Theme } from \"./theme.js\";\nimport { defaultMessages, type ChartMessages } from \"./messages.js\";\nimport { Sessions, type SessionSpec } from \"../data/session.js\";\nimport { parseResolution, Resampler } from \"../data/resample.js\";\nimport { checkWatermarkOptions, DEFAULT_WATERMARK, drawWatermark, type WatermarkOptions } from \"./watermark.js\";\n\n// ---- options & events ---------------------------------------------------------\n\nexport interface CrosshairOptions {\n /**\n * \"magnet\" snaps the horizontal line to the main series' close; \"hidden\"\n * draws nothing but still reports crosshair events.\n */\n mode: \"magnet\" | \"normal\" | \"hidden\";\n visible: boolean;\n /** The crosshair's label on the price axis. False hides only that label; the line, the time label and events stay. */\n priceLabel: boolean;\n}\n\nexport interface GridOptions {\n /** Vertical lines at the time ticks. */\n vertLines: boolean;\n /** Horizontal lines at the price ticks. */\n horzLines: boolean;\n}\n\nexport interface InteractionOptions {\n pan: boolean;\n zoom: boolean;\n kinetic: boolean;\n keyboard: boolean;\n}\n\nexport interface ChartOptions {\n theme: Theme;\n /** \"UTC\" or an IANA zone; axis labels and day boundaries use it. */\n timeZone: string;\n locale: string | undefined;\n timeScale: TimeScaleOptions;\n crosshair: CrosshairOptions;\n /** Grid lines (theme colour); both on by default. */\n grid: GridOptions;\n /**\n * Format of the crosshair time label (and the screen-reader readout), e.g.\n * `{ day: \"2-digit\", month: \"short\", year: \"2-digit\", hour: \"2-digit\", minute: \"2-digit\" }`;\n * undefined keeps the default. The chart's `timeZone` and `locale` apply; the\n * options must not set `timeZone`. `timeLabel` takes precedence when set.\n */\n timeFormat: Intl.DateTimeFormatOptions | undefined;\n /** Show hours and minutes in the crosshair time label; \"auto\" decides from the bar interval. */\n timeVisible: boolean | \"auto\";\n /** Replaces the calendar text of the time axis and the crosshair time label (for an x axis that is not a clock). */\n timeLabel: TimeLabel | undefined;\n rightPriceScale: PriceScaleOptions;\n leftPriceScale: PriceScaleOptions;\n interaction: InteractionOptions;\n /** The brand mark at the bottom-left of the main pane; on by default, `{ visible: false }` hides it. */\n watermark: WatermarkOptions;\n /** Accessible name of the chart; default: the \"chart.ariaLabel\" message. */\n ariaLabel: string;\n /** Text for the chart's own user-visible strings (aria, readout, table, countdown); English by default. */\n messages: ChartMessages;\n /** Series surface: own WebGL2 context, Canvas2D, or auto. Fixed at creation. */\n renderer: SurfaceChoice;\n /** Trading hours: bars outside regular hours are shaded. */\n sessions: SessionSpec | null;\n /** Bar resolution (e.g. \"5m\", \"1D\"): enables the bar-close countdown. */\n resolution: string | null;\n /** Countdown to the current bar's close under the last-price label. */\n countdown: boolean;\n /** Key bindings; each action takes key strings like \"Shift+ArrowLeft\", \"Alt+R\". */\n keymap: Partial<Record<KeyAction, string[]>>;\n /** A visually hidden table of the visible bars for screen readers. */\n a11yTable: boolean;\n}\n\nexport type KeyAction =\n | \"panLeft\" | \"panRight\" | \"zoomIn\" | \"zoomOut\" | \"scrollToStart\" | \"scrollToLatest\"\n | \"crosshairLeft\" | \"crosshairRight\" | \"hideCrosshair\" | \"resetChart\";\n\nexport const DEFAULT_KEYMAP: Record<KeyAction, string[]> = {\n panLeft: [\"ArrowLeft\"],\n panRight: [\"ArrowRight\"],\n zoomIn: [\"ArrowUp\", \"+\", \"Shift++\", \"=\"],\n zoomOut: [\"ArrowDown\", \"-\", \"_\"],\n scrollToStart: [\"Home\"],\n scrollToLatest: [\"End\"],\n crosshairLeft: [\"Shift+ArrowLeft\"],\n crosshairRight: [\"Shift+ArrowRight\"],\n hideCrosshair: [\"Escape\"],\n resetChart: [\"Alt+R\", \"Alt+r\"],\n};\n\nexport type ChartOptionsInput = {\n [K in keyof ChartOptions]?: K extends \"theme\"\n ? Theme | \"dark\" | \"light\" | \"high-contrast\" | \"auto\" | Partial<Theme>\n : K extends \"sessions\" | \"resolution\" | \"messages\" | \"timeLabel\"\n ? ChartOptions[K]\n : ChartOptions[K] extends object | undefined\n ? Partial<ChartOptions[K]>\n : ChartOptions[K];\n};\n\n/** The object under the pointer: a series marker (by its id) or a primitive's hit (by its id). */\nexport interface HoveredObject {\n kind: \"marker\" | \"primitive\";\n id: string;\n}\n\nexport interface CrosshairEvent {\n /** Timeline index under the crosshair, if over data. */\n index?: number;\n time?: number;\n /** Pane-relative CSS px. */\n point?: { x: number; y: number };\n pane?: number;\n /** Marker or primitive item under the pointer; only for pointer-driven events. Markers win over primitives. */\n hovered?: HoveredObject;\n source: \"pointer\" | \"keyboard\" | \"sync\";\n}\n\nexport interface VisibleRangeEvent {\n /** Fractional timeline indices at the left and right edges. */\n from: number;\n to: number;\n /** What moved the view: input or the timeScale API (\"user\"), a SyncGroup, or new data. */\n source: \"user\" | \"sync\" | \"data\";\n}\n\nexport interface ChartEvents {\n crosshairMove: CrosshairEvent;\n click: CrosshairEvent;\n dblclick: CrosshairEvent;\n visibleRangeChange: VisibleRangeEvent;\n}\n\n// ---- internals ------------------------------------------------------------------\n\ninterface Pane {\n stretch: number;\n readonly scales: Map<string, PriceScale>;\n readonly series: Series<SeriesType>[];\n /** CSS px within the chart. */\n top: number;\n height: number;\n}\n\nexport type Region =\n | { kind: \"pane\"; pane: number; x: number; y: number }\n | { kind: \"priceAxis\"; pane: number; scaleId: string }\n | { kind: \"timeAxis\" }\n | { kind: \"separator\"; index: number }\n | { kind: \"none\" };\n\nconst SEPARATOR = 1;\nconst AXIS_PAD = 6;\nconst MIN_AXIS_W = 48;\n\nfunction resolveTheme(t: ChartOptionsInput[\"theme\"], base: Theme): Theme {\n if (t === undefined) return base;\n if (t === \"dark\") return DARK;\n if (t === \"light\") return LIGHT;\n if (t === \"high-contrast\") return HIGH_CONTRAST;\n if (t === \"auto\") return systemTheme();\n const theme = { ...base, ...t };\n // A colour the renderer cannot read fails here, at the call, not in a frame.\n for (const k of Object.keys(theme) as (keyof Theme)[]) {\n if (k !== \"fontFamily\" && k !== \"fontSize\") parseColor(theme[k] as string);\n }\n return theme;\n}\n\nexport class Chart implements Renderable {\n readonly element: HTMLDivElement;\n private readonly live: HTMLDivElement;\n private readonly layers: Layers;\n\n /** @internal */ readonly model = new DataModel();\n /** @internal */ readonly time: TimeScale;\n /** @internal */ readonly panes: Pane[] = [];\n private readonly events = new Emitter<ChartEvents>();\n private readonly primitives = new Map<Series<SeriesType>, Set<PanePrimitive>>();\n private readonly plugins = new Map<string, ChartPlugin>();\n /** What each plugin saved right after install: `restoreState` puts a plugin the layout does not mention back to it. */\n private readonly pluginInitial = new Map<string, unknown>();\n private cursorOverride: string | null = null;\n private lastPluginPane = 0;\n private intervalCache = -1;\n private seriesCounter = 0;\n private sessions: Sessions | null = null;\n private resampler: Resampler | null = null;\n private countdownTimer = 0;\n private autoTheme = false;\n private readonly mediaQueries: MediaQueryList[] = [];\n private table: HTMLTableElement | null = null;\n private tableTimer = 0;\n /** True when the caller set ariaLabel; otherwise it follows the \"chart.ariaLabel\" message. */\n private ariaLabelFixed: boolean;\n private opts: ChartOptions;\n private tz: TimeZone;\n private fmt: TimeFormatter;\n private readonly interaction: Interaction;\n private readonly resizeObs: ResizeObserver;\n private dprQuery: MediaQueryList | null = null;\n private removed = false;\n private readonly removeListeners: (() => void)[] = [];\n\n // Layout (CSS px).\n private cssW = 0;\n /** Device-px size of this chart's cell. */\n private devW = 1;\n private devH = 1;\n private cssH = 0;\n private dpr = 1;\n private leftW = 0;\n private rightW = 0;\n private timeH = 0;\n /** Time ticks for the current view, recomputed when the view changes. */\n private tticks: TimeTick[] = [];\n private tticksKey = \"\";\n private lastRange = { from: Number.NaN, to: Number.NaN };\n private viewSource: VisibleRangeEvent[\"source\"] = \"data\";\n private readonly minmax = new Float64Array(2);\n private readonly vis = { lo: 0, hi: -1 };\n /** Axis column widths per side, CSS px (index 0 is next to the panes). */\n private readonly axisCols: Record<\"left\" | \"right\", number[]> = { left: [], right: [] };\n private readonly widths = new Map<string, number>();\n private widthFont = \"\";\n\n /** @internal Crosshair in chart CSS px; `syncIndex` when driven by another chart. */\n crosshair: { x: number; y: number; pane: number } | null = null;\n private syncIndex: number | null = null;\n private crosshairSource: CrosshairEvent[\"source\"] = \"pointer\";\n private lastAnnounce = 0;\n\n /**\n * @param layers internal: a Dashboard passes its shared canvases; a\n * standalone chart creates its own.\n */\n constructor(container: HTMLElement, options: ChartOptionsInput = {}, layers?: (root: HTMLElement, events: SurfaceEvents) => Layers) {\n this.opts = {\n theme: resolveTheme(options.theme, DARK),\n timeZone: options.timeZone ?? \"UTC\",\n locale: options.locale,\n timeScale: { ...DEFAULT_TIME_SCALE, ...options.timeScale },\n crosshair: { mode: \"magnet\", visible: true, priceLabel: true, ...options.crosshair },\n grid: { vertLines: true, horzLines: true, ...options.grid },\n timeFormat: options.timeFormat,\n timeVisible: options.timeVisible ?? \"auto\",\n timeLabel: options.timeLabel,\n rightPriceScale: { ...DEFAULT_PRICE_SCALE, ...options.rightPriceScale, position: \"right\" },\n leftPriceScale: { ...DEFAULT_PRICE_SCALE, ...options.leftPriceScale, position: \"left\" },\n interaction: { pan: true, zoom: true, kinetic: true, keyboard: true, ...options.interaction },\n watermark: { ...DEFAULT_WATERMARK, ...options.watermark },\n messages: options.messages ?? defaultMessages,\n ariaLabel: options.ariaLabel ?? (options.messages ?? defaultMessages)(\"chart.ariaLabel\"),\n renderer: options.renderer ?? \"auto\",\n sessions: options.sessions ?? null,\n resolution: options.resolution ?? null,\n countdown: options.countdown ?? true,\n keymap: { ...DEFAULT_KEYMAP, ...options.keymap },\n a11yTable: options.a11yTable ?? true,\n };\n this.ariaLabelFixed = options.ariaLabel !== undefined;\n this.autoTheme = options.theme === \"auto\";\n this.sessions = this.opts.sessions ? new Sessions(this.opts.sessions) : null;\n this.resampler = this.opts.resolution ? new Resampler(parseResolution(this.opts.resolution), this.opts.sessions ? { sessions: this.opts.sessions } : { timeZone: this.opts.timeZone }) : null;\n checkPriceScaleOptions(this.opts.rightPriceScale);\n checkPriceScaleOptions(this.opts.leftPriceScale);\n checkWatermarkOptions(this.opts.watermark);\n this.tz =new TimeZone(this.opts.timeZone);\n this.fmt = new TimeFormatter(this.opts.locale, this.tz, this.opts.timeFormat);\n this.time = new TimeScale(this.opts.timeScale);\n\n const root = document.createElement(\"div\");\n root.style.cssText = \"position:relative;width:100%;height:100%;overflow:hidden;user-select:none;-webkit-user-select:none;touch-action:none;outline:none\";\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"application\");\n root.setAttribute(\"aria-roledescription\", \"chart\");\n root.setAttribute(\"aria-label\", this.opts.ariaLabel);\n this.live = document.createElement(\"div\");\n this.live.setAttribute(\"aria-live\", \"polite\");\n this.live.style.cssText = \"position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap\";\n root.appendChild(this.live);\n container.appendChild(root);\n this.element = root;\n\n const events: SurfaceEvents = {\n // GL objects are gone; renderers are rebuilt from the CPU stores on restore.\n lost: () => this.dropRenderers(),\n restored: () => this.invalidate(LAYER_ALL),\n };\n this.layers = layers ? layers(root, events) : new OwnLayers(root, this.opts.renderer, events);\n\n this.model.onChange(this.onData);\n this.interaction = new Interaction(this, root, root);\n this.resizeObs = new ResizeObserver(() => this.measure());\n this.resizeObs.observe(root);\n this.watchDpr();\n this.watchSystem();\n this.syncCountdown();\n this.measure();\n }\n\n // ---- public API ---------------------------------------------------------------\n\n addSeries<T extends SeriesType>(type: T, options: Partial<SeriesOptions<T>> = {}): Series<T> {\n const id = options.id || this.nextSeriesId();\n if (this.allSeries().some((x) => x.options().id === id)) throw new Error(`alphacharts: a series with id \"${id}\" already exists`);\n const data = this.model.add(seriesType(type).shape);\n const s = new Series<T>(type, data, this, { ...options, id }, this.opts.theme);\n this.placeSeries(s as unknown as Series<SeriesType>);\n this.invalidate(LAYER_ALL);\n return s;\n }\n\n /**\n * Run `fn` and defer the data work to its end: any number of\n * `series.setData` calls cost one timeline rebuild and one round of change\n * events. Inside `fn`, timeline lookups (`timeToIndex`, ...) and series whose\n * times are not yet on the timeline still show the state before the batch.\n * Returns what `fn` returns; nests.\n */\n batch<T>(fn: () => T): T {\n return this.model.batch(fn);\n }\n\n removeSeries<T extends SeriesType>(series: Series<T>): void {\n const s = series as unknown as Series<SeriesType>;\n for (const p of this.panes) {\n const i = p.series.indexOf(s);\n if (i >= 0) p.series.splice(i, 1);\n }\n for (const prim of this.primitives.get(s) ?? []) prim.detached?.();\n this.primitives.delete(s);\n s.renderer?.dispose();\n s.renderer = null;\n s.renderer2d?.dispose();\n s.renderer2d = null;\n this.model.remove(s.data);\n this.prunePanes();\n this.invalidate(LAYER_ALL);\n }\n\n /** A horizontal line at a price, drawn with the series' scale. */\n createPriceLine<T extends SeriesType>(s: Series<T>, options: Partial<PriceLineOptions> & { price: number }): PriceLine {\n const line = new PriceLine({ labelTextColor: this.opts.theme.labelText, ...options });\n this.attachPrimitive(s as unknown as Series<SeriesType>, line);\n return line;\n }\n\n removePriceLine<T extends SeriesType>(s: Series<T>, line: PriceLine): void {\n this.detachPrimitive(s as unknown as Series<SeriesType>, line);\n }\n\n options(): Readonly<ChartOptions> {\n return this.opts;\n }\n\n /** True after remove(). */\n get isRemoved(): boolean {\n return this.removed;\n }\n\n applyOptions(o: ChartOptionsInput): void {\n const prev = this.opts;\n // Build everything that can throw before committing any of it.\n const tz = o.timeZone !== undefined ? new TimeZone(o.timeZone) : this.tz;\n const theme = resolveTheme(o.theme, prev.theme);\n if (o.rightPriceScale) checkPriceScaleOptions(o.rightPriceScale);\n if (o.leftPriceScale) checkPriceScaleOptions(o.leftPriceScale);\n const watermark = { ...prev.watermark, ...o.watermark };\n checkWatermarkOptions(watermark);\n const timeChanged = o.timeZone !== undefined || o.locale !== undefined || \"timeFormat\" in o;\n const fmt = timeChanged ? new TimeFormatter(\"locale\" in o ? o.locale : prev.locale, tz, \"timeFormat\" in o ? o.timeFormat : prev.timeFormat) : this.fmt;\n this.opts = {\n ...prev,\n ...(o as Partial<ChartOptions>),\n theme,\n timeScale: { ...prev.timeScale, ...o.timeScale },\n crosshair: { ...prev.crosshair, ...o.crosshair },\n grid: { ...prev.grid, ...o.grid },\n rightPriceScale: { ...prev.rightPriceScale, ...o.rightPriceScale, position: \"right\" },\n leftPriceScale: { ...prev.leftPriceScale, ...o.leftPriceScale, position: \"left\" },\n interaction: { ...prev.interaction, ...o.interaction },\n watermark,\n };\n Object.assign(this.time.options, this.opts.timeScale);\n if (o.keymap) this.opts.keymap = { ...prev.keymap, ...o.keymap };\n if (o.theme !== undefined) this.autoTheme = o.theme === \"auto\";\n if (o.sessions !== undefined) this.sessions = o.sessions ? new Sessions(o.sessions) : null;\n if (o.resolution !== undefined || o.sessions !== undefined || o.timeZone !== undefined) {\n this.resampler = this.opts.resolution ? new Resampler(parseResolution(this.opts.resolution), this.opts.sessions ? { sessions: this.opts.sessions } : { timeZone: this.opts.timeZone }) : null;\n }\n this.syncCountdown();\n if (timeChanged) {\n this.tz = tz;\n this.fmt = fmt;\n this.tticksKey = \"\";\n }\n if (o.rightPriceScale && \"minWidth\" in o.rightPriceScale) this.axisCols.right = [];\n if (o.leftPriceScale && \"minWidth\" in o.leftPriceScale) this.axisCols.left = [];\n if (o.theme !== undefined) for (const p of this.panes) for (const s of p.series) s.themeChanged(this.opts.theme);\n for (const p of this.panes) {\n for (const [id, sc] of p.scales) {\n if (id === \"right\" && o.rightPriceScale) sc.options = { ...this.opts.rightPriceScale };\n if (id === \"left\" && o.leftPriceScale) sc.options = { ...this.opts.leftPriceScale };\n }\n }\n if (o.ariaLabel !== undefined) this.ariaLabelFixed = true;\n if (!this.ariaLabelFixed) this.opts.ariaLabel = this.opts.messages(\"chart.ariaLabel\");\n this.element.setAttribute(\"aria-label\", this.opts.ariaLabel);\n // Table text (headers, caption, time labels) depends on these.\n if (o.messages !== undefined || o.locale !== undefined || o.ariaLabel !== undefined || o.timeZone !== undefined) this.scheduleTable();\n this.invalidate(LAYER_ALL);\n }\n\n on<K extends keyof ChartEvents>(type: K, fn: (e: ChartEvents[K]) => void): () => void {\n return this.events.on(type, fn);\n }\n\n /** Options of a price scale in a pane (\"right\", \"left\" or an overlay id). */\n priceScale(id: string, pane = 0): { options(): Readonly<PriceScaleOptions>; applyOptions(o: Partial<PriceScaleOptions>): void } {\n const sc = this.panes[pane]?.scales.get(id);\n if (!sc) throw new RangeError(`no price scale \"${id}\" in pane ${pane}`);\n return {\n options: () => sc.options,\n applyOptions: (o) => {\n checkPriceScaleOptions(o);\n sc.options = { ...sc.options, ...o };\n if (\"minWidth\" in o) this.axisCols[sc.options.position === \"left\" ? \"left\" : \"right\"] = [];\n this.invalidate(LAYER_ALL);\n },\n };\n }\n\n /** Relative height of a pane (default 1; the first pane is usually 3). */\n setPaneStretch(pane: number, stretch: number): void {\n const p = this.panes[pane];\n if (!p) throw new RangeError(`no pane ${pane}`);\n if (!(stretch > 0)) throw new RangeError(`stretch must be positive, got ${stretch}`);\n p.stretch = stretch;\n this.invalidate(LAYER_ALL);\n }\n\n readonly timeScale = {\n scrollToLatest: () => this.viewChanged(() => this.time.scrollToLatest()),\n scrollToStart: () => this.viewChanged(() => this.time.scrollToStart()),\n fitContent: () => this.viewChanged(() => this.time.fitAll()),\n reset: () => this.viewChanged(() => this.time.reset()),\n /** Show fractional timeline indices [from, to]. */\n setVisibleLogicalRange: (r: { from: number; to: number }) => this.viewChanged(() => this.time.setRange(r.from, r.to)),\n getVisibleLogicalRange: (): { from: number; to: number } => ({ from: this.time.left, to: this.time.right }),\n /** Show [from, to] (UTC ms), snapped to the bars at or after each time. */\n setVisibleTimeRange: (r: { from: number; to: number }) => {\n const tl = this.model.timeline;\n this.viewChanged(() => this.time.setRange(tl.lowerBound(r.from) - 0.5, Math.min(tl.end - 1, tl.lowerBound(r.to)) + 0.5));\n },\n barSpacing: () => this.time.spacing,\n timeToIndex: (t: number) => this.model.timeline.indexOf(t),\n indexToTime: (i: number) => this.model.timeline.timeAt(i),\n };\n\n /** Pane-relative CSS x of a time, or undefined when no bar has that time. */\n timeToX(time: number): number | undefined {\n const i = this.model.timeline.indexOf(time);\n return i === undefined ? undefined : this.time.x(i);\n }\n\n /** CSS px of the pane area (the width the time scale draws in); 0 before the first layout. */\n paneWidth(): number {\n return Math.max(0, this.cssW - this.leftW - this.rightW);\n }\n\n /** CSS px taken by the price axes on one side (all their columns); 0 when there is no axis there. */\n priceAxisWidth(side: \"left\" | \"right\"): number {\n if (side !== \"left\" && side !== \"right\") throw new RangeError(`alphacharts: priceAxisWidth side must be \"left\" or \"right\", got \"${String(side)}\"`);\n return side === \"left\" ? this.leftW : this.rightW;\n }\n\n /** Release DOM, observers and the WebGL context. */\n remove(): void {\n if (this.removed) return;\n this.removed = true;\n for (const fn of this.removeListeners) fn();\n // Last installed first, so a plugin that builds on another is released before it. A plugin that throws does not stop the rest of the teardown.\n const failed: unknown[] = [];\n for (const [id, p] of [...this.plugins].reverse()) {\n try {\n p.uninstall?.();\n } catch (e) {\n failed.push(e);\n }\n this.plugins.delete(id);\n }\n this.pluginInitial.clear();\n cancelRender(this);\n this.interaction.dispose();\n this.resizeObs.disconnect();\n this.dprQuery?.removeEventListener(\"change\", this.onDpr);\n for (const q of this.mediaQueries) q.removeEventListener(\"change\", this.onSystem);\n clearInterval(this.countdownTimer);\n clearTimeout(this.tableTimer);\n for (const p of this.panes) for (const s of p.series) s.renderer?.dispose();\n this.layers.dispose();\n this.events.clear();\n this.element.remove();\n if (failed.length) throw failed.length === 1 ? failed[0] : new AggregateError(failed, \"alphacharts: plugins failed to uninstall\");\n }\n\n /** Every series on the chart, pane by pane. */\n series(): readonly Series<SeriesType>[] {\n return this.allSeries();\n }\n\n private allSeries(): Series<SeriesType>[] {\n return this.panes.flatMap((p) => p.series);\n }\n\n private nextSeriesId(): string {\n let id: string;\n do id = `s${++this.seriesCounter}`;\n while (this.allSeries().some((x) => x.options().id === id));\n return id;\n }\n\n // ---- layout ------------------------------------------------------------------\n\n /** The chart's arrangement as versioned JSON (no bar data). */\n saveState(): ChartState {\n const plugins: Record<string, unknown> = {};\n for (const [id, p] of this.plugins) if (p.toJSON) plugins[id] = p.toJSON();\n return {\n version: LAYOUT_VERSION,\n options: plain({ ...this.opts }),\n panes: this.panes.map((p) => ({\n stretch: p.stretch,\n scales: Object.fromEntries(\n [...p.scales].map(([id, sc]) => [id, sc.options.autoScale ? { options: plain(sc.options) } : { options: plain(sc.options), range: { min: sc.min, max: sc.max } }]),\n ),\n })),\n series: this.allSeries().map((x) => ({ id: x.options().id, type: x.type, options: plain(x.options()) })),\n view: { spacing: this.time.spacing, rightOffset: this.time.rightOffset },\n plugins,\n ...(this.opts.timeLabel ? { customOptions: [\"timeLabel\" as const] } : {}),\n };\n }\n\n /**\n * Replace every series, pane, scale, view and plugin state with a saved\n * layout. `data(series)` supplies each series' bars (or nothing, to fill it\n * later); `formatters` re-supplies custom price formatters by series id;\n * `timeLabel` re-supplies the custom time label function. A layout saved with\n * a custom price format or `timeLabel` is refused (nothing changed) when the\n * function is not passed.\n */\n restoreState(\n raw: unknown,\n opts: { data?: (s: SeriesState) => unknown; formatters?: Record<string, (v: number) => string>; timeLabel?: TimeLabel } = {},\n ): Series<SeriesType>[] {\n const st = migrate(raw);\n checkCustomOptions(st, { timeLabel: opts.timeLabel });\n const missing = Object.keys(st.plugins).filter((id) => !this.plugins.has(id));\n if (missing.length) throw new Error(`alphacharts: layout needs plugins that are not installed: ${missing.join(\", \")}`);\n for (const ss of st.series) {\n const pf = (ss.options.priceFormat ?? {}) as { type?: string };\n if (pf.type === \"custom\" && !opts.formatters?.[ss.id]) throw new Error(`alphacharts: series \"${ss.id}\" has a custom price format; pass its formatter to restoreState`);\n }\n // Every plugin takes its state or the layout is refused: nothing is replaced before this passes.\n const seriesIds = st.series.map((s) => s.id);\n for (const [id, state] of Object.entries(st.plugins)) this.plugins.get(id)!.validateState?.(state, { seriesIds });\n // Everything applyOptions can refuse is checked before the first series is removed.\n const so = st.options as { timeFormat?: Intl.DateTimeFormatOptions; rightPriceScale?: object; leftPriceScale?: object; timeZone?: string; locale?: string };\n new TimeFormatter(so.locale ?? this.opts.locale, new TimeZone(so.timeZone ?? this.opts.timeZone), so.timeFormat);\n checkPriceScaleOptions((so.rightPriceScale ?? {}) as Partial<PriceScaleOptions>);\n checkPriceScaleOptions((so.leftPriceScale ?? {}) as Partial<PriceScaleOptions>);\n checkWatermarkOptions({ ...this.opts.watermark, ...(st.options as { watermark?: Partial<WatermarkOptions> }).watermark });\n for (const pn of st.panes) for (const sc of Object.values(pn.scales)) checkPriceScaleOptions(sc.options as Partial<PriceScaleOptions>);\n for (const x of this.allSeries()) this.removeSeries(x);\n this.applyOptions({ ...(st.options as ChartOptionsInput), ...(opts.timeLabel ? { timeLabel: opts.timeLabel } : {}) });\n const created: Series<SeriesType>[] = [];\n for (const ss of st.series) {\n const o = { ...ss.options } as Record<string, unknown>;\n const pf = o.priceFormat as { type?: string; minMove?: number } | undefined;\n if (pf?.type === \"custom\") o.priceFormat = { ...pf, format: opts.formatters![ss.id]! };\n const x = this.addSeries(ss.type as SeriesType, o as never);\n const input = opts.data?.(ss);\n if (input !== undefined) x.setData(input as never);\n created.push(x as unknown as Series<SeriesType>);\n }\n st.panes.forEach((ps, i) => {\n const p = this.panes[i];\n if (!p) return;\n p.stretch = ps.stretch;\n for (const [id, scs] of Object.entries(ps.scales)) {\n const sc = p.scales.get(id);\n if (!sc) continue;\n sc.options = { ...sc.options, ...(scs.options as Partial<PriceScaleOptions>) };\n if (scs.range) {\n sc.min = scs.range.min;\n sc.max = scs.range.max;\n sc.ranged = true;\n }\n }\n });\n this.time.spacing = st.view.spacing;\n this.time.rightOffset = st.view.rightOffset;\n this.time.clamp();\n for (const [id, state] of Object.entries(st.plugins)) this.plugins.get(id)!.fromJSON?.(state);\n // A plugin the layout does not mention must not keep the content of the layout it replaces.\n for (const [id, p] of this.plugins) if (!(id in st.plugins) && p.fromJSON && this.pluginInitial.has(id)) p.fromJSON(this.pluginInitial.get(id));\n this.invalidate(LAYER_ALL);\n return created;\n }\n\n // ---- plugins -----------------------------------------------------------------\n\n /** Install a plugin; ids are unique per chart. */\n addPlugin(plugin: ChartPlugin): void {\n if (this.plugins.has(plugin.id)) throw new Error(`alphacharts: a plugin with id \"${plugin.id}\" is already installed`);\n this.plugins.set(plugin.id, plugin);\n plugin.install(this.pluginApi);\n if (plugin.toJSON && plugin.fromJSON) this.pluginInitial.set(plugin.id, plugin.toJSON());\n this.invalidate(LAYER_OVERLAY);\n }\n\n removePlugin(id: string): void {\n const p = this.plugins.get(id);\n if (!p) return;\n this.plugins.delete(id);\n this.pluginInitial.delete(id);\n p.uninstall?.();\n this.invalidate(LAYER_ALL);\n }\n\n plugin<P extends ChartPlugin = ChartPlugin>(id: string): P | undefined {\n return this.plugins.get(id) as P | undefined;\n }\n\n private readonly pluginApi: PluginApi = Object.defineProperty(\n {\n requestRender: (all?: boolean) => this.invalidate(all ? LAYER_ALL : LAYER_OVERLAY),\n paneView: (pane: number) => this.pluginView(pane),\n barTimeAtOrBefore: (t: number) => {\n const i = this.model.timeline.indexAtOrBefore(t);\n return i === undefined ? undefined : this.model.timeline.timeAt(i);\n },\n setCursor: (css: string | null) => {\n this.cursorOverride = css;\n },\n },\n \"paneCount\",\n { get: () => this.panes.length },\n ) as PluginApi;\n\n /** @internal Offer a pointer event to plugins; true when one consumed it. */\n pluginPointer(type: PluginPointer[\"type\"], x: number, y: number, e: PointerEvent | MouseEvent | null): boolean {\n if (this.plugins.size === 0) return false;\n const r = this.region(x, y);\n if (r.kind !== \"pane\" && type !== \"up\" && type !== \"leave\") return false;\n const pane = r.kind === \"pane\" ? r.pane : this.lastPluginPane;\n // An up/leave can follow a layout change that removed the pane it started\n // in, or its last series (a dashboard regrid, a symbol switch): with no\n // price scale there is no price under the pointer to report.\n if (!this.panes[pane]?.scales.size) return false;\n this.lastPluginPane = pane;\n const v = this.pluginView(pane);\n const px = x - this.leftW, py = y - (this.panes[pane]?.top ?? 0);\n const ev: PluginPointer = {\n type, pane, x: px, y: py, time: v.xToTime(px), price: v.yToPrice(py),\n pointerType: e && \"pointerType\" in e ? e.pointerType : \"mouse\",\n buttons: e?.buttons ?? 0, shiftKey: e?.shiftKey ?? false, altKey: e?.altKey ?? false, ctrlKey: e?.ctrlKey ?? false, metaKey: e?.metaKey ?? false,\n };\n let consumed = false;\n for (const pl of [...this.plugins.values()].reverse()) {\n if (pl.pointer?.(ev)) {\n consumed = true;\n break;\n }\n }\n return consumed;\n }\n\n /** @internal */\n pluginKey(e: KeyboardEvent): boolean {\n for (const pl of [...this.plugins.values()].reverse()) if (pl.key?.(e)) return true;\n return false;\n }\n\n /** Fractional timeline index of a time, extrapolated past either end. */\n timeToLogical(t: number): number {\n const tl = this.model.timeline;\n if (tl.length === 0) return Number.NaN;\n const first = tl.first, last = tl.end - 1;\n const t0 = tl.timeAt(first), t1 = tl.timeAt(last);\n if (t <= t0) return first - (t0 - t) / this.barInterval();\n if (t >= t1) return last + (t - t1) / this.barInterval();\n const i = tl.lowerBound(t);\n const ti = tl.timeAt(i);\n if (ti === t) return i;\n const tp = tl.timeAt(i - 1);\n return i - 1 + (t - tp) / (ti - tp);\n }\n\n /** Time at a fractional timeline index, extrapolated past either end. */\n logicalToTime(l: number): number {\n const tl = this.model.timeline;\n if (tl.length === 0) return Number.NaN;\n const first = tl.first, last = tl.end - 1;\n if (l <= first) return tl.timeAt(first) - (first - l) * this.barInterval();\n if (l >= last) return tl.timeAt(last) + (l - last) * this.barInterval();\n const i = Math.floor(l);\n const a = tl.timeAt(i), b = tl.timeAt(i + 1);\n return a + (l - i) * (b - a);\n }\n\n /** Median spacing of the last bars, for extrapolating beyond the data. */\n private barInterval(): number {\n if (this.intervalCache > 0) return this.intervalCache;\n const tl = this.model.timeline;\n const d: number[] = [];\n for (let i = tl.end - 1; i > tl.first && d.length < 15; i--) d.push(tl.timeAt(i) - tl.timeAt(i - 1));\n d.sort((a, b) => a - b);\n this.intervalCache = d.length ? d[d.length >> 1]! : 60_000;\n return this.intervalCache;\n }\n\n /**\n * A plugin's view of one pane. Plugins install before any series exists, so\n * the pane is looked up on every call, not captured: before it exists the\n * view has height 0 and anything that needs a price scale throws.\n */\n private pluginView(pane: number): PluginPaneView {\n const t = this.time;\n const paneOf = () => {\n const p = this.panes[pane];\n if (!p) throw new RangeError(`no pane ${pane} on this chart yet`);\n return p;\n };\n const scaleOf = (id?: string) => {\n const p = paneOf();\n const sc = id ? p.scales.get(id) : (sideScales(p, \"right\")[0] ?? sideScales(p, \"left\")[0] ?? p.scales.values().next().value);\n if (!sc) throw new RangeError(`no price scale ${id ?? \"\"} in pane ${pane}`);\n return sc;\n };\n const chart = this;\n return {\n pane,\n get width() {\n return t.width;\n },\n get height() {\n return chart.panes[pane]?.height ?? 0;\n },\n get dpr() {\n return chart.dpr;\n },\n timeToX: (time) => t.x(this.timeToLogical(time)),\n xToTime: (x) => this.logicalToTime(t.logical(x)),\n priceToY: (price, id) => scaleOf(id).y(price),\n yToPrice: (y, id) => scaleOf(id).price(y),\n formatPrice: (price, id) => {\n const sc = scaleOf(id);\n return axisText(sc, this.formatterFor(paneOf(), sc.id), price);\n },\n priceScaleMode: (id) => scaleOf(id).mode,\n };\n }\n\n // ---- SeriesHost ------------------------------------------------------------\n\n /** @internal */\n setData(s: Series<SeriesType>, input: unknown): void {\n this.model.setData(s.data, input as never);\n }\n /** @internal */\n prepend(s: Series<SeriesType>, input: unknown): void {\n this.model.prepend(s.data, input as never);\n }\n /** @internal */\n update(s: Series<SeriesType>, bar: unknown): void {\n this.model.update(s.data, bar as never);\n }\n /** @internal */\n optionsChanged(s: Series<SeriesType>, moved: boolean): void {\n if (moved) {\n for (const p of this.panes) {\n const i = p.series.indexOf(s);\n if (i >= 0) p.series.splice(i, 1);\n }\n this.placeSeries(s);\n this.prunePanes();\n }\n this.invalidate(LAYER_ALL);\n }\n /** @internal */\n attachPrimitive(s: Series<SeriesType>, p: PanePrimitive): void {\n let set = this.primitives.get(s);\n if (!set) this.primitives.set(s, (set = new Set()));\n set.add(p);\n p.attached?.({\n requestRender: (layer: RenderLayer = \"overlay\") => {\n if (layer !== \"overlay\" && layer !== \"background\" && layer !== \"all\") throw new RangeError(`alphacharts: requestRender layer must be \"background\", \"overlay\" or \"all\", got \"${String(layer)}\"`);\n this.invalidate(layer === \"all\" ? LAYER_BG | LAYER_OVERLAY : layer === \"background\" ? LAYER_BG : LAYER_OVERLAY);\n },\n });\n this.invalidate(LAYER_BG | LAYER_OVERLAY);\n }\n /** @internal */\n detachPrimitive(s: Series<SeriesType>, p: PanePrimitive): void {\n if (this.primitives.get(s)?.delete(p)) {\n p.detached?.();\n this.invalidate(LAYER_BG | LAYER_OVERLAY);\n }\n }\n /** @internal */\n markersChanged(): void {\n this.invalidate(LAYER_OVERLAY);\n }\n /** @internal */\n priceToY(s: Series<SeriesType>, price: number): number {\n const sc = this.rangedScale(s);\n return sc ? sc.y(price) : Number.NaN;\n }\n /** @internal */\n yToPrice(s: Series<SeriesType>, y: number): number {\n const sc = this.rangedScale(s);\n return sc ? sc.price(y) : Number.NaN;\n }\n private rangedScale(s: Series<SeriesType>): PriceScale | undefined {\n const p = this.panes.find((x) => x.series.includes(s));\n const sc = p?.scales.get(s.options().priceScaleId);\n return sc?.ranged ? sc : undefined;\n }\n /** @internal */\n timeAt(i: number): number {\n return this.model.timeline.timeAt(i);\n }\n /** @internal */\n get locale(): string | undefined {\n return this.opts.locale;\n }\n /** @internal */\n indexOf(t: number): number | undefined {\n return this.model.timeline.indexOf(t);\n }\n\n // ---- used by Interaction and SyncGroup ---------------------------------------------\n\n /** @internal */\n get timeline(): Timeline {\n return this.model.timeline;\n }\n\n /** @internal */\n get interactionOptions(): InteractionOptions {\n return this.opts.interaction;\n }\n\n /** @internal A dashboard redraws this cell's series when a neighbour drew (see DashboardCanvases.noteGLDraw). */\n redrawGL(): void {\n if (!this.removed && this.cssW > 0 && this.cssH > 0) this.drawGL();\n }\n\n /** @internal Called once when the chart is removed. */\n onRemove(fn: () => void): void {\n this.removeListeners.push(fn);\n }\n\n /** @internal The shared surface lost its context: drop GL objects. */\n surfaceLost(): void {\n this.dropRenderers();\n }\n\n /** Re-read size and cell position even if the size is unchanged (a host that moved the chart without resizing it). */\n remeasure(): void {\n this.cssW = -1;\n this.measure();\n }\n\n /** What is under chart CSS point (x, y): a pane, a price axis, the time axis, a pane separator or nothing. For hosts that build their own menus and hit tests. */\n region(x: number, y: number): Region {\n const paneX = this.leftW;\n const paneR = this.cssW - this.rightW;\n for (let i = 0; i < this.panes.length; i++) {\n const p = this.panes[i]!;\n if (i > 0 && Math.abs(y - (p.top - SEPARATOR / 2)) <= 4) return { kind: \"separator\", index: i };\n if (y >= p.top && y < p.top + p.height) {\n if (x < paneX || x >= paneR) {\n for (const [id, sc] of p.scales) if (axisShown(sc) && x >= sc.axisX && x < sc.axisX + sc.axisW) return { kind: \"priceAxis\", pane: i, scaleId: id };\n return { kind: \"none\" };\n }\n return { kind: \"pane\", pane: i, x: x - paneX, y: y - p.top };\n }\n }\n if (y >= this.cssH - this.timeH && x >= paneX && x < paneR) return { kind: \"timeAxis\" };\n return { kind: \"none\" };\n }\n\n /** True when a plugin asks for a cursor at the point: it owns the pointer there, so no `hovered`. */\n private pluginClaims(pane: number, x: number, y: number): boolean {\n // A pane removed since the crosshair was set has no plugin view to ask.\n if (!this.panes[pane]) return false;\n for (const pl of this.plugins.values()) if (pl.cursor?.(pane, x, y)) return true;\n return false;\n }\n\n /** @internal CSS cursor a primitive wants at a pane point, if any. */\n primitiveCursor(pane: number, x: number, y: number): string | null {\n if (this.cursorOverride) return this.cursorOverride;\n for (const pl of this.plugins.values()) {\n const c = pl.cursor?.(pane, x, y);\n if (c) return c;\n }\n return this.hit(pane, x, y).cursor;\n }\n\n /** @internal */\n viewChanged(fn: () => void, source: \"user\" | \"sync\" = \"user\"): void {\n fn();\n this.viewSource = source;\n this.invalidate(LAYER_ALL);\n }\n\n /** @internal Price-axis drag: factor > 1 zooms in. */\n scalePrice(pane: number, scaleId: string, factor: number): void {\n const sc = this.panes[pane]?.scales.get(scaleId);\n if (!sc) return;\n sc.scale(factor);\n this.invalidate(LAYER_ALL);\n }\n\n /** @internal Vertical pan of every scale in a pane that is not autoscaling. */\n panPrice(pane: number, dy: number): void {\n const p = this.panes[pane];\n if (!p) return;\n let moved = false;\n for (const sc of p.scales.values()) {\n if (sc.options.autoScale) continue;\n sc.pan(dy);\n moved = true;\n }\n if (moved) this.invalidate(LAYER_ALL);\n }\n\n /** Back to autoscale for one price scale of a pane (what a double-click on its axis does). */\n resetPriceScale(pane: number, scaleId: string): void {\n const sc = this.panes[pane]?.scales.get(scaleId);\n if (!sc) return;\n sc.options = { ...sc.options, autoScale: true };\n this.invalidate(LAYER_ALL);\n }\n\n /** @internal Drag a separator by dy CSS px. */\n resizePanes(index: number, dy: number): void {\n const a = this.panes[index - 1], b = this.panes[index];\n if (!a || !b) return;\n const total = a.height + b.height;\n const ha = Math.max(30, Math.min(total - 30, a.height + dy));\n const sum = a.stretch + b.stretch;\n a.stretch = (sum * ha) / total;\n b.stretch = sum - a.stretch;\n this.invalidate(LAYER_ALL);\n }\n\n /** @internal */\n setCrosshair(c: { x: number; y: number; pane: number } | null, source: CrosshairEvent[\"source\"]): void {\n this.crosshair = c;\n this.syncIndex = null;\n this.crosshairSource = source;\n this.invalidate(LAYER_OVERLAY);\n if (this.events.has(\"crosshairMove\")) this.events.emit(\"crosshairMove\", this.crosshairEvent(source));\n if (source === \"keyboard\") this.announce();\n }\n\n /** @internal Show a vertical crosshair at a timeline index (synced chart). */\n setSyncedCrosshair(index: number | null): void {\n this.crosshair = null;\n this.syncIndex = index;\n this.invalidate(LAYER_OVERLAY);\n }\n\n /** @internal */\n pointerEvent(type: \"click\" | \"dblclick\"): void {\n if (this.events.has(type)) this.events.emit(type, this.crosshairEvent(\"pointer\"));\n }\n\n /** @internal Index under the crosshair (pointer or keyboard), if any. */\n crosshairIndex(): number | undefined {\n if (!this.crosshair) return undefined;\n const i = this.time.indexAt(this.crosshair.x - this.leftW);\n return i >= this.time.first && i <= this.time.last ? i : undefined;\n }\n\n /** @internal Pane-area CSS geometry. */\n get paneArea(): { x: number; width: number } {\n return { x: this.leftW, width: this.cssW - this.leftW - this.rightW };\n }\n\n /** @internal */\n invalidate(layers: number): void {\n if (!this.removed) requestRender(this, layers);\n }\n\n // ---- data ----------------------------------------------------------------\n\n private readonly onData = (c: DataChange): void => {\n const t = this.time;\n const tl = this.model.timeline;\n const wasEmpty = t.end <= t.first;\n if (c.kind === \"update\" && c.appended && !wasEmpty) {\n // Decide with the old bounds: was the last bar on screen?\n if (!t.following) t.rightOffset -= 1;\n }\n t.first = tl.first;\n t.end = tl.end;\n if (wasEmpty && tl.length > 0) t.reset();\n for (const p of this.panes) {\n for (const s of p.series) {\n s.renderer?.dataChanged(c);\n s.renderer2d?.dataChanged(c);\n if (s.data === c.series) s.observeData(c.lo, c.hi);\n }\n }\n this.tticksKey = \"\";\n this.intervalCache = -1;\n for (const pl of this.plugins.values()) pl.dataChanged?.(c);\n if (c.kind !== \"update\") this.scheduleTable();\n this.invalidate(c.kind === \"update\" ? LAYER_GL | LAYER_OVERLAY : LAYER_ALL);\n };\n\n private placeSeries(s: Series<SeriesType>): void {\n const o = s.options();\n if (!Number.isInteger(o.pane) || o.pane < 0) throw new RangeError(`pane must be a non-negative integer, got ${o.pane}`);\n while (this.panes.length <= o.pane) {\n this.panes.push({ stretch: this.panes.length === 0 ? 3 : 1, scales: new Map(), series: [], top: 0, height: 0 });\n }\n const p = this.panes[o.pane]!;\n if (!p.scales.has(o.priceScaleId)) {\n const base = o.priceScaleId === \"left\" ? this.opts.leftPriceScale : o.priceScaleId === \"right\" ? this.opts.rightPriceScale : { ...DEFAULT_PRICE_SCALE, position: \"none\" as const };\n p.scales.set(o.priceScaleId, new PriceScale(o.priceScaleId, { ...base }));\n }\n p.series.push(s);\n }\n\n /** Drop trailing empty panes (an empty pane in the middle keeps its slot). */\n private prunePanes(): void {\n while (this.panes.length > 1 && this.panes[this.panes.length - 1]!.series.length === 0) this.panes.pop();\n for (const p of this.panes) {\n for (const id of [...p.scales.keys()]) if (!p.series.some((s) => s.options().priceScaleId === id)) p.scales.delete(id);\n }\n }\n\n // ---- frame ---------------------------------------------------------------\n\n render(layers: number): void {\n if (this.removed || this.cssW <= 0 || this.cssH <= 0) return;\n layers |= this.layout();\n if (layers & LAYER_BG) this.drawBg();\n if (layers & LAYER_GL) this.drawGL();\n if (layers & LAYER_OVERLAY) this.drawOverlay();\n }\n\n /** Returns layers that became dirty because the layout moved. */\n private layout(): number {\n let dirty = 0;\n const t = this.time;\n const font = this.opts.theme.fontSize;\n this.timeH = Math.round(font * 2.4);\n // Axis widths depend on labels, labels on the scale, the scale on the\n // pane width: two passes settle it (the second only when a width moved).\n for (let pass = 0; pass < 2; pass++) {\n const paneW = Math.max(1, this.cssW - this.leftW - this.rightW);\n if (t.width !== paneW) {\n t.width = paneW;\n t.clamp();\n dirty |= LAYER_ALL;\n }\n this.layoutPanes();\n t.visible(this.vis);\n let changed = false;\n for (const p of this.panes) changed = this.autoscale(p) || changed;\n if (changed) dirty |= LAYER_ALL;\n const [lw, rw] = this.axisWidths();\n if (lw === this.leftW && rw === this.rightW) break;\n this.leftW = lw;\n this.rightW = rw;\n dirty |= LAYER_ALL;\n }\n const key = `${this.vis.lo},${this.vis.hi},${t.spacing},${t.rightOffset},${t.width}`;\n if (key !== this.tticksKey) {\n this.tticksKey = key;\n const gap = this.measureText(\"00:00:00\") + 24;\n this.tticks = timeTicks(this.model.timeline, this.tz, this.vis.lo, this.vis.hi, (i) => t.x(i), t.spacing, gap);\n dirty |= LAYER_BG;\n }\n if (t.left !== this.lastRange.from || t.right !== this.lastRange.to) {\n this.lastRange = { from: t.left, to: t.right };\n dirty |= LAYER_ALL;\n if (this.events.has(\"visibleRangeChange\")) this.events.emit(\"visibleRangeChange\", { from: t.left, to: t.right, source: this.viewSource });\n for (const pl of this.plugins.values()) pl.viewChanged?.();\n this.scheduleTable();\n }\n this.viewSource = \"data\";\n return dirty;\n }\n\n private layoutPanes(): void {\n const n = this.panes.length;\n const avail = this.cssH - this.timeH - SEPARATOR * Math.max(0, n - 1);\n const total = this.panes.reduce((a, p) => a + p.stretch, 0) || 1;\n let y = 0, used = 0;\n for (let i = 0; i < n; i++) {\n const p = this.panes[i]!;\n const h = i === n - 1 ? avail - used : Math.round((avail * p.stretch) / total);\n p.top = y;\n p.height = Math.max(1, h);\n used += h;\n y += h + SEPARATOR;\n for (const sc of p.scales.values()) sc.height = p.height;\n }\n }\n\n /** Fit every autoscaling scale of a pane to its visible series. True when a range moved. */\n private autoscale(p: Pane): boolean {\n let moved = false;\n const { lo, hi } = this.vis;\n for (const [id, sc] of p.scales) {\n if (sc.mode === \"percent\" || sc.mode === \"indexed\") this.rebase(p, id, sc);\n if (!sc.options.autoScale) continue;\n let min = Number.POSITIVE_INFINITY, max = Number.NEGATIVE_INFINITY;\n for (const s of p.series) {\n const o = s.options();\n if (!o.visible || o.priceScaleId !== id) continue;\n let a = Number.NaN, b = Number.NaN;\n if (hi >= lo) {\n s.def.autoscale(s.data, o, lo, hi, this.minmax);\n a = this.minmax[0]!;\n b = this.minmax[1]!;\n } else if (!o.autoscale) continue;\n if (o.autoscale) [a, b] = overrideRange(o.id, o.autoscale, a, b);\n if (a < min) min = a;\n if (b > max) max = b;\n }\n if (min === Number.POSITIVE_INFINITY) continue;\n const pmin = sc.min, pmax = sc.max;\n sc.fit(min, max);\n if (sc.min !== pmin || sc.max !== pmax) moved = true;\n }\n return moved;\n }\n\n /** Percent/indexed base: the main series' first visible value. */\n private rebase(p: Pane, id: string, sc: PriceScale): void {\n const s = this.mainSeries(p, id);\n if (!s) return;\n const o = s.options();\n for (let i = Math.max(this.vis.lo, s.data.store.first); i <= this.vis.hi; i++) {\n const v = s.def.valueAt(s.data, o, i);\n if (v && v.value !== 0) {\n sc.base = v.value;\n return;\n }\n }\n }\n\n private axisWidths(): [number, number] {\n // Axes stand in columns per side: column j holds each pane's j-th shown\n // scale on that side, as wide as its widest member.\n const need: Record<\"left\" | \"right\", number[]> = { left: [], right: [] };\n const gap = this.opts.theme.fontSize * 3.2;\n for (const p of this.panes) {\n for (const side of [\"left\", \"right\"] as const) {\n sideScales(p, side).forEach((sc, j) => {\n const fmt = this.formatterFor(p, sc.id);\n sc.ticks = scaleTicks(sc, fmt, gap);\n let w = 0;\n for (const tk of sc.ticks) w = Math.max(w, this.measureText(tk.label));\n for (const s of p.series) {\n const o = s.options();\n if (o.priceScaleId !== sc.id || !o.lastValueVisible) continue;\n const last = s.data.lastIndex();\n const lv = last === undefined ? undefined : s.def.valueAt(s.data, o, last);\n if (lv) w = Math.max(w, this.measureText(axisText(sc, s.formatter, lv.value)));\n }\n need[side][j] = Math.max(need[side][j] ?? 0, MIN_AXIS_W, sc.options.minWidth ?? 0, Math.ceil(w + AXIS_PAD * 2 + 4));\n });\n }\n }\n // Hysteresis: grow at once, shrink only by a margin, so a ticking price\n // does not make the panes breathe.\n const settle = (cur: number | undefined, n: number) => (cur === undefined || n > cur || n < cur - 12 ? n : cur);\n for (const side of [\"left\", \"right\"] as const) {\n this.axisCols[side] = need[side].map((n, j) => settle(this.axisCols[side][j], n));\n }\n const left = this.axisCols.left.reduce((a, b) => a + b, 0);\n const right = this.axisCols.right.reduce((a, b) => a + b, 0);\n for (const p of this.panes) {\n let x = this.cssW - right;\n sideScales(p, \"right\").forEach((sc, j) => {\n sc.axisX = x;\n sc.axisW = this.axisCols.right[j]!;\n x += sc.axisW;\n });\n x = left;\n sideScales(p, \"left\").forEach((sc, j) => {\n sc.axisW = this.axisCols.left[j]!;\n x -= sc.axisW;\n sc.axisX = x;\n });\n }\n return [left, right];\n }\n\n /** The series that formats a scale's axis and sets its percent/indexed base. */\n private mainSeries(p: Pane, scaleId: string): Series<SeriesType> | undefined {\n const on = p.series.filter((x) => x.options().priceScaleId === scaleId && x.options().visible);\n return on.find((x) => x.options().scaleFormat) ?? on.find((x) => x.options().priceFormat.type !== \"volume\") ?? on[0];\n }\n\n private formatterFor(p: Pane, scaleId: string): Formatter | undefined {\n return this.mainSeries(p, scaleId)?.formatter;\n }\n\n // ---- bg layer ----------------------------------------------------------------\n\n private drawBg(): void {\n const ctx = this.layers.bg, th = this.opts.theme, d = this.dpr;\n const { ox, oy } = this.layers;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.beginPath();\n ctx.rect(ox, oy, this.devW, this.devH);\n ctx.clip();\n ctx.fillStyle = th.background;\n ctx.fillRect(ox, oy, this.devW, this.devH);\n ctx.setTransform(d, 0, 0, d, ox, oy);\n ctx.font = this.font();\n const paneX = this.leftW, paneW = this.time.width;\n const one = 1 / d;\n\n for (let i = 0; i < this.panes.length; i++) {\n const p = this.panes[i]!;\n // Outside regular hours: shaded runs of bars (skipped when bars are\n // sub-pixel, where a shade would only tint every column).\n if (this.sessions && this.time.spacing >= 0.5 && this.vis.hi >= this.vis.lo) {\n ctx.fillStyle = th.extendedHours;\n const tl = this.model.timeline, t = this.time, half = t.spacing / 2;\n let runStart = -1;\n for (let k = this.vis.lo; k <= this.vis.hi + 1; k++) {\n const off = k <= this.vis.hi && this.sessions.state(tl.timeAt(k)) !== \"regular\";\n if (off && runStart < 0) runStart = k;\n if (!off && runStart >= 0) {\n const x0 = Math.max(0, t.x(runStart) - half), x1 = Math.min(paneW, t.x(k - 1) + half);\n ctx.fillRect(paneX + x0, p.top, x1 - x0, p.height);\n runStart = -1;\n }\n }\n }\n // Grid.\n ctx.fillStyle = th.grid;\n if (this.opts.grid.vertLines) {\n for (const tk of this.tticks) {\n const x = paneX + crisp(tk.x, d) - one / 2;\n if (x >= paneX && x < paneX + paneW) ctx.fillRect(x, p.top, one, p.height);\n }\n }\n const gsc = sideScales(p, \"right\")[0] ?? sideScales(p, \"left\")[0];\n if (gsc && this.opts.grid.horzLines) for (const tk of gsc.ticks) ctx.fillRect(paneX, p.top + crisp(gsc.y(tk.price), d) - one / 2, paneW, one);\n // Primitives that draw behind the series, clipped to the pane.\n let bgPrims = false;\n for (const s of p.series) if (s.options().visible && (this.primitives.get(s)?.size ?? 0) > 0) bgPrims = true;\n if (bgPrims) {\n ctx.save();\n ctx.setTransform(d, 0, 0, d, ox + paneX * d, oy + p.top * d);\n ctx.beginPath();\n ctx.rect(0, 0, paneW, p.height);\n ctx.clip();\n for (const s of p.series) {\n const set = this.primitives.get(s);\n if (!set || !s.options().visible || !p.scales.has(s.options().priceScaleId)) continue;\n const view = this.paneView(p, s);\n for (const prim of set) {\n if (!prim.drawBackground) continue;\n ctx.save();\n prim.drawBackground(ctx, view);\n ctx.restore();\n }\n }\n ctx.restore();\n ctx.font = this.font();\n }\n // Separator above.\n if (i > 0) {\n ctx.fillStyle = th.border;\n ctx.fillRect(0, p.top - SEPARATOR, this.cssW, SEPARATOR);\n }\n // Price axes.\n for (const sc of p.scales.values()) {\n if (!axisShown(sc)) continue;\n const left = sc.options.position === \"left\";\n ctx.fillStyle = th.border;\n ctx.fillRect(left ? sc.axisX + sc.axisW - one : sc.axisX, p.top, one, p.height);\n ctx.fillStyle = th.textMuted;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = left ? \"right\" : \"left\";\n for (const tk of sc.ticks) {\n const y = p.top + sc.y(tk.price);\n if (y < p.top + 6 || y > p.top + p.height - 6) continue;\n ctx.fillText(tk.label, left ? sc.axisX + sc.axisW - AXIS_PAD : sc.axisX + AXIS_PAD, y);\n }\n }\n }\n // Time axis.\n const ty = this.cssH - this.timeH;\n ctx.fillStyle = th.border;\n ctx.fillRect(0, ty, this.cssW, one);\n ctx.fillStyle = th.textMuted;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n const tl = this.model.timeline;\n for (const tk of this.tticks) {\n const x = paneX + tk.x;\n if (x < paneX + 4 || x > paneX + paneW - 4) continue;\n ctx.fillStyle = tk.weight >= 18 ? th.text : th.textMuted;\n const tt = tl.timeAt(tk.index);\n ctx.fillText(timeText(this.opts.timeLabel, \"tick\", tt, () => this.fmt.tick(tt, tk.weight)), x, ty + this.timeH / 2);\n }\n ctx.restore();\n }\n\n // ---- gl layer ------------------------------------------------------------------\n\n private drawGL(): void {\n const sf = this.layers.surface;\n if (!sf.begin(this.layers.ox, this.layers.oy, this.devW, this.devH)) return;\n const d = this.dpr;\n const x0 = Math.round(this.leftW * d);\n const x1 = Math.round((this.leftW + this.time.width) * d);\n for (const p of this.panes) {\n const y0 = Math.round(p.top * d);\n const y1 = Math.round((p.top + p.height) * d);\n const w = x1 - x0, h = y1 - y0;\n if (w <= 0 || h <= 0) continue;\n sf.pane({ x: x0, y: y0, width: w, height: h }, () => {\n for (const s of p.series) {\n const o = s.options();\n const sc = p.scales.get(o.priceScaleId);\n if (!o.visible || !sc || s.data.store.length === 0) continue;\n if (sf.kind === \"canvas2d\") {\n s.renderer2d ??= this.make2D(s);\n s.renderer2d.draw({ ctx: sf.ctx2d!, data: s.data, time: this.time, price: sc, dpr: d, width: w, height: h, lo: this.vis.lo, hi: this.vis.hi }, o);\n } else {\n const gl = sf.gl!, ctx = sf.glctx!;\n s.renderer ??= s.def.createRenderer(gl, ctx, s.data);\n const view: DrawView = { gl, ctx, data: s.data, time: this.time, price: sc, dpr: d, width: w, height: h, lo: this.vis.lo, hi: this.vis.hi };\n s.renderer.draw(view, o);\n }\n }\n });\n }\n sf.end();\n this.layers.glDrawn?.(this);\n }\n\n private make2D(s: Series<SeriesType>): NonNullable<Series<SeriesType>[\"renderer2d\"]> {\n if (!s.def.createRenderer2D) throw new Error(`alphacharts: series type \"${s.type}\" has no Canvas2D renderer, and WebGL2 is unavailable`);\n return s.def.createRenderer2D(s.data);\n }\n\n private dropRenderers(): void {\n for (const p of this.panes) for (const s of p.series) s.renderer = null;\n }\n\n /** Which surface draws this chart's series. */\n get renderer(): SurfaceKind {\n return this.layers.surface.kind;\n }\n\n // ---- overlay layer --------------------------------------------------------------\n\n private drawOverlay(): void {\n const ctx = this.layers.overlay, th = this.opts.theme, d = this.dpr;\n const { ox, oy } = this.layers;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.beginPath();\n ctx.rect(ox, oy, this.devW, this.devH);\n ctx.clip();\n ctx.clearRect(ox, oy, this.devW, this.devH);\n ctx.font = this.font();\n const paneX = this.leftW, paneW = this.time.width;\n const labels: { pane: Pane; sc: PriceScale; l: AxisLabel }[] = [];\n let countdownAt: { pane: Pane; sc: PriceScale; l: AxisLabel } | undefined;\n\n for (const p of this.panes) {\n // Pane content: last-value lines, primitives. Clipped to the pane.\n ctx.save();\n ctx.setTransform(d, 0, 0, d, ox + paneX * d, oy + p.top * d);\n ctx.beginPath();\n ctx.rect(0, 0, paneW, p.height);\n ctx.clip();\n ctx.font = this.font();\n // First, so markers, primitives and plugin drawings stay above the halo.\n if (p === this.panes[0]) drawWatermark(ctx, paneW, p.height, th, this.opts.watermark);\n for (const s of p.series) {\n const o = s.options();\n const sc = p.scales.get(o.priceScaleId);\n if (!o.visible || !sc) continue;\n const last = s.data.lastIndex();\n const lv = last === undefined ? undefined : s.def.valueAt(s.data, o, last);\n if (lv) {\n if (o.priceLineVisible) {\n const y = crisp(sc.y(lv.value), d);\n ctx.strokeStyle = lv.color;\n ctx.lineWidth = 1 / d;\n ctx.setLineDash([1, 2]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(paneW, y);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n if (o.lastValueVisible && axisShown(sc)) {\n labels.push({ pane: p, sc, l: { price: lv.value, text: axisText(sc, s.formatter, lv.value), background: lv.color, color: contrastText(lv.color) } });\n if (o.title) this.drawTitleTag(ctx, o.title, sc, lv, p.height, paneW);\n if (!countdownAt && p === this.panes[0] && s === this.mainSeries(p, sc.id)) countdownAt = labels[labels.length - 1]!;\n }\n }\n if (s.markers().length > 0) drawMarkers(ctx, this.markerLayout(p, s, sc));\n const set = this.primitives.get(s);\n if (set && set.size > 0) {\n const view = this.paneView(p, s);\n for (const prim of set) {\n prim.draw?.(ctx, view);\n if (axisShown(sc) && prim.axisLabels) {\n for (const l of prim.axisLabels(view)) labels.push({ pane: p, sc, l });\n }\n }\n }\n }\n if (this.plugins.size > 0) {\n const view = this.pluginView(this.panes.indexOf(p));\n for (const pl of this.plugins.values()) pl.drawPane?.(ctx, view);\n }\n ctx.restore();\n }\n\n // Crosshair.\n const ch = this.crosshair;\n let cIndex: number | undefined;\n if (this.opts.crosshair.visible && this.opts.crosshair.mode !== \"hidden\" && (ch || this.syncIndex !== null)) {\n cIndex = ch ? this.time.indexAt(ch.x - paneX) : this.syncIndex!;\n const inData = cIndex >= this.time.first && cIndex <= this.time.last;\n const cx = paneX + (inData ? this.time.x(cIndex) : ch!.x - paneX);\n ctx.setTransform(d, 0, 0, d, ox, oy);\n ctx.strokeStyle = th.crosshair;\n ctx.lineWidth = 1 / d;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n const vx = crisp(cx, d);\n if (vx >= paneX && vx <= paneX + paneW) {\n ctx.moveTo(vx, 0);\n ctx.lineTo(vx, this.cssH - this.timeH);\n }\n let hy: number | undefined;\n const p = ch ? this.panes[ch.pane] : undefined;\n if (ch && p) {\n hy = p.top + this.crosshairY(p, ch.y, inData ? cIndex : undefined);\n const y = crisp(hy, d);\n ctx.moveTo(paneX, y);\n ctx.lineTo(paneX + paneW, y);\n }\n ctx.stroke();\n ctx.setLineDash([]);\n if (ch && p && hy !== undefined && this.opts.crosshair.priceLabel) {\n for (const sc of p.scales.values()) {\n if (!axisShown(sc)) continue;\n const price = sc.price(hy - p.top);\n const text = axisText(sc, this.formatterFor(p, sc.id), price);\n labels.push({ pane: p, sc, l: { price, text, background: th.labelBackground, color: th.labelText } });\n }\n }\n if (inData) {\n const ct = this.model.timeline.timeAt(cIndex);\n const text = timeText(this.opts.timeLabel, \"crosshair\", ct, () => this.fmt.crosshair(ct, this.timeVisible()));\n const w = this.measureText(text) + 16;\n const lx = Math.max(paneX, Math.min(paneX + paneW - w, cx - w / 2));\n ctx.fillStyle = th.labelBackground;\n ctx.fillRect(lx, this.cssH - this.timeH, w, this.timeH);\n ctx.fillStyle = th.labelText;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, lx + w / 2, this.cssH - this.timeH / 2);\n }\n }\n\n // Axis labels last, so they sit over the axis text.\n ctx.setTransform(d, 0, 0, d, ox, oy);\n const lh = Math.round(this.opts.theme.fontSize * 1.8);\n for (const { pane, sc, l } of labels) {\n const y = pane.top + sc.y(l.price);\n if (!(y >= pane.top && y <= pane.top + pane.height)) continue;\n const left = sc.options.position === \"left\";\n const ax = sc.axisX, aw = sc.axisW;\n const top = Math.max(pane.top, Math.min(pane.top + pane.height - lh, y - lh / 2));\n ctx.fillStyle = l.background;\n ctx.fillRect(ax, top, aw, lh);\n ctx.fillStyle = l.color;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = left ? \"right\" : \"left\";\n ctx.fillText(l.text, left ? ax + aw - AXIS_PAD : ax + AXIS_PAD, top + lh / 2);\n }\n // Countdown to the bar close, in a box under the main last-price label.\n const cd = countdownAt && this.opts.countdown ? this.countdownText() : null;\n if (countdownAt && cd) {\n const { pane, sc, l } = countdownAt;\n const y = pane.top + sc.y(l.price);\n const top = Math.max(pane.top, Math.min(pane.top + pane.height - lh, y - lh / 2)) + lh;\n if (top + lh <= pane.top + pane.height) {\n const left = sc.options.position === \"left\";\n ctx.fillStyle = l.background;\n ctx.fillRect(sc.axisX, top, sc.axisW, lh);\n ctx.fillStyle = l.color;\n ctx.textAlign = left ? \"right\" : \"left\";\n ctx.fillText(cd, left ? sc.axisX + sc.axisW - AXIS_PAD : sc.axisX + AXIS_PAD, top + lh / 2);\n }\n }\n ctx.restore();\n }\n\n /** The series title as a tag at the pane edge beside the axis, level with the last-value label. */\n private drawTitleTag(ctx: CanvasRenderingContext2D, title: string, sc: PriceScale, lv: { value: number; color: string }, paneH: number, paneW: number): void {\n const y = sc.y(lv.value);\n if (!(y >= 0 && y <= paneH)) return;\n const lh = Math.round(this.opts.theme.fontSize * 1.8);\n const w = Math.ceil(this.measureText(title)) + 10;\n const top = Math.max(0, Math.min(paneH - lh, y - lh / 2));\n const left = sc.options.position === \"left\";\n const x = left ? 0 : paneW - w;\n ctx.fillStyle = lv.color;\n ctx.fillRect(x, top, w, lh);\n ctx.fillStyle = contrastText(lv.color);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.fillText(title, x + 5, top + lh / 2);\n }\n\n /** Markers of a series placed in pane px: those on the visible bars (and one bar either side, for their width). */\n private markerLayout(p: Pane, s: Series<SeriesType>, sc: PriceScale): PlacedMarker[] {\n const ms = s.markers();\n const tl = this.model.timeline;\n if (ms.length === 0 || this.vis.hi < this.vis.lo || tl.length === 0) return [];\n const t = this.time, d = s.data, ohlc = d.shape === \"ohlc\";\n // vis is refreshed in layout(): after a setData it can lie outside the new timeline until the next frame.\n const a = Math.max(tl.first, this.vis.lo - 1), b = Math.min(tl.end - 1, this.vis.hi + 1);\n if (a > b) return [];\n const t0 = tl.timeAt(a), t1 = tl.timeAt(b);\n return placeMarkers({\n markers: ms,\n from: markerLowerBound(ms, t0),\n to: markerLowerBound(ms, t1 + 1),\n barSpacing: t.spacing,\n fontSize: this.opts.theme.fontSize,\n textWidth: (str) => this.measureText(str),\n bar: (m) => {\n const i = tl.indexOf(m.time);\n if (i === undefined || !d.has(i)) return undefined;\n const ya = sc.y(ohlc ? d.get(i, COL_H) : d.get(i, COL_V)), yb = sc.y(ohlc ? d.get(i, COL_L) : d.get(i, COL_V));\n if (!Number.isFinite(ya) || !Number.isFinite(yb)) return undefined;\n return { x: t.x(i), yHigh: Math.min(ya, yb), yLow: Math.max(ya, yb) };\n },\n });\n }\n\n /** The marker (with an id) or primitive item at pane point (x, y), and the cursor it asks for. */\n private hit(pane: number, x: number, y: number): { hovered?: HoveredObject; cursor: string | null } {\n const p = this.panes[pane];\n if (!p) return { cursor: null };\n for (let k = p.series.length - 1; k >= 0; k--) {\n const s = p.series[k]!;\n const sc = p.scales.get(s.options().priceScaleId);\n if (!sc || !s.options().visible || s.markers().length === 0) continue;\n const placed = this.markerLayout(p, s, sc);\n for (let j = placed.length - 1; j >= 0; j--) {\n const b = placed[j]!.box, id = placed[j]!.marker.id;\n if (id !== undefined && x >= b.x && x <= b.x + b.w && y >= b.y && y <= b.y + b.h) return { hovered: { kind: \"marker\", id }, cursor: \"pointer\" };\n }\n }\n for (const s of p.series) {\n const set = this.primitives.get(s);\n if (!set || !s.options().visible || !p.scales.has(s.options().priceScaleId)) continue;\n const view = this.paneView(p, s);\n for (const prim of set) {\n const r = prim.hitTest?.(x, y, view);\n if (!r) continue;\n if (typeof r === \"string\") return { cursor: r };\n if (typeof r.id !== \"string\" || r.id === \"\") throw new Error(\"alphacharts: a primitive's hitTest returned a hit without an id\");\n return { hovered: { kind: \"primitive\", id: r.id }, cursor: r.cursor ?? null };\n }\n }\n return { cursor: null };\n }\n\n /** Crosshair y in a pane: the pointer, or the main series' close in magnet mode. */\n private crosshairY(p: Pane, y: number, index: number | undefined): number {\n if (this.opts.crosshair.mode !== \"magnet\" || index === undefined || this.crosshairSource === \"sync\") return y;\n const s = p.series.find((x) => x.options().visible);\n if (!s) return y;\n const sc = p.scales.get(s.options().priceScaleId);\n const v = s.def.valueAt(s.data, s.options(), index);\n return sc && v ? sc.y(v.value) : y;\n }\n\n private crosshairEvent(source: CrosshairEvent[\"source\"]): CrosshairEvent {\n const ch = this.crosshair;\n if (!ch) return { source };\n const i = this.time.indexAt(ch.x - this.leftW);\n const ev: CrosshairEvent = { source, pane: ch.pane, point: { x: ch.x - this.leftW, y: ch.y } };\n if (source === \"pointer\" && !this.cursorOverride && !this.pluginClaims(ch.pane, ch.x - this.leftW, ch.y)) {\n const h = this.hit(ch.pane, ch.x - this.leftW, ch.y).hovered;\n if (h) ev.hovered = h;\n }\n if (i >= this.time.first && i <= this.time.last) {\n ev.index = i;\n ev.time = this.model.timeline.timeAt(i);\n }\n return ev;\n }\n\n /** Values under the crosshair for the screen-reader readout. */\n private announce(): void {\n const now = performance.now();\n if (now - this.lastAnnounce < 250) return;\n this.lastAnnounce = now;\n const i = this.crosshairIndex();\n if (i === undefined) return;\n const msg = this.opts.messages;\n const at = this.model.timeline.timeAt(i);\n const parts = [timeText(this.opts.timeLabel, \"crosshair\", at, () => this.fmt.crosshair(at, this.timeVisible()))];\n for (const p of this.panes) {\n for (const s of p.series) {\n const b = s.barAtIndex(i) as Record<string, number> | undefined;\n if (!b) continue;\n const name = s.options().title || s.type;\n parts.push(\n \"open\" in b\n ? msg(\"chart.readout.ohlc\", { name, open: s.formatPrice(b.open!), high: s.formatPrice(b.high!), low: s.formatPrice(b.low!), close: s.formatPrice(b.close!) })\n : msg(\"chart.readout.value\", { name, value: s.formatPrice(b.value!) }),\n );\n }\n }\n this.live.textContent = parts.join(\", \");\n }\n\n private paneView(p: Pane, s: Series<SeriesType>): PaneView {\n const sc = p.scales.get(s.options().priceScaleId)!;\n const t = this.time, tl = this.model.timeline;\n return {\n width: t.width,\n height: p.height,\n dpr: this.dpr,\n lo: this.vis.lo,\n hi: this.vis.hi,\n x: (i) => t.x(i),\n y: (v) => sc.y(v),\n index: (x) => t.indexAt(x),\n price: (y) => sc.price(y),\n timeToIndex: (time) => tl.indexOf(time),\n indexToTime: (i) => tl.timeAt(i),\n timeToX: (time) => t.x(this.timeToLogical(time)),\n barSpacing: t.spacing,\n formatPrice: (v) => s.formatPrice(v),\n };\n }\n\n private timeVisible(): boolean {\n const v = this.opts.timeVisible;\n if (v !== \"auto\") return v;\n const tl = this.model.timeline;\n if (tl.length < 2) return true;\n return tl.timeAt(tl.end - 1) - tl.timeAt(tl.end - 2) < 86_400_000;\n }\n\n private font(): string {\n return `${this.opts.theme.fontSize}px ${this.opts.theme.fontFamily}`;\n }\n\n /** CSS px width of `s` in the theme font. Cached: labels repeat every frame. */\n private measureText(s: string): number {\n const font = this.font();\n if (font !== this.widthFont) {\n this.widths.clear();\n this.widthFont = font;\n }\n let w = this.widths.get(s);\n if (w === undefined) {\n const ctx = this.layers.bg;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.font = font;\n w = ctx.measureText(s).width;\n ctx.restore();\n if (this.widths.size > 4096) this.widths.clear();\n this.widths.set(s, w);\n }\n return w;\n }\n\n // ---- system preferences, countdown, screen-reader table -----------------------\n\n /** Follow OS theme/contrast (theme \"auto\") and reduced-motion changes. */\n private watchSystem(): void {\n if (typeof matchMedia === \"undefined\") return;\n for (const q of [\"(prefers-color-scheme: light)\", \"(prefers-contrast: more)\"]) {\n const m = matchMedia(q);\n m.addEventListener(\"change\", this.onSystem);\n this.mediaQueries.push(m);\n }\n }\n\n private readonly onSystem = (): void => {\n if (!this.autoTheme) return;\n this.opts = { ...this.opts, theme: systemTheme() };\n for (const p of this.panes) for (const s of p.series) s.themeChanged(this.opts.theme);\n this.invalidate(LAYER_ALL);\n };\n\n /** @internal Kinetic scrolling is off when the user asks for reduced motion. */\n get reducedMotion(): boolean {\n return typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n }\n\n /** @internal The action bound to a key event, if any. */\n keyAction(e: KeyboardEvent): KeyAction | undefined {\n const parts: string[] = [];\n if (e.ctrlKey) parts.push(\"Ctrl\");\n if (e.altKey) parts.push(\"Alt\");\n if (e.shiftKey) parts.push(\"Shift\");\n if (e.metaKey) parts.push(\"Meta\");\n parts.push(e.key);\n const combo = parts.join(\"+\");\n for (const [action, keys] of Object.entries(this.opts.keymap) as [KeyAction, string[]][]) {\n if (keys.includes(combo) || (!e.ctrlKey && !e.altKey && !e.metaKey && keys.includes(e.key) && !combo.startsWith(\"Shift+Arrow\"))) return action;\n }\n return undefined;\n }\n\n /** Reset the view and every price scale to automatic. */\n resetChart(): void {\n for (const p of this.panes) for (const sc of p.scales.values()) sc.options = { ...sc.options, autoScale: true };\n this.viewChanged(() => this.time.reset());\n }\n\n private syncCountdown(): void {\n clearInterval(this.countdownTimer);\n this.countdownTimer = 0;\n if (this.opts.countdown && this.resampler) {\n this.countdownTimer = window.setInterval(() => this.invalidate(LAYER_OVERLAY), 1000);\n }\n }\n\n /** \"mm:ss\" (or \"h:mm:ss\", \"Nd\") to the close of the bar holding the last time; null when unknown. */\n private countdownText(): string | null {\n const r = this.resampler;\n const tl = this.model.timeline;\n if (!r || tl.length === 0) return null;\n const last = tl.timeAt(tl.end - 1);\n const start = r.bucketStart(last);\n // The next bucket starts at the first time past this one that maps elsewhere.\n let probe = start + 1000;\n const step = r.res.unit === \"s\" ? 1000 : r.res.unit === \"m\" ? 60_000 : r.res.unit === \"h\" ? 3_600_000 : 86_400_000;\n for (let i = 0; i < 400 && r.bucketStart(probe) === start; i++) probe += step * Math.max(1, Math.floor(r.res.n / 2));\n const next = r.bucketStart(probe);\n const left = Math.max(0, next - Date.now());\n if (!(next > start)) return null;\n const sec = Math.floor(left / 1000);\n if (sec >= 86_400) return this.opts.messages(\"chart.countdown.days\", { n: Math.floor(sec / 86_400) });\n const hh = Math.floor(sec / 3600), mm = Math.floor((sec % 3600) / 60), ss = sec % 60;\n const two = (n: number) => String(n).padStart(2, \"0\");\n return hh > 0 ? `${hh}:${two(mm)}:${two(ss)}` : `${two(mm)}:${two(ss)}`;\n }\n\n /** Rebuild the screen-reader table shortly after the view or data settles. */\n private scheduleTable(): void {\n if (!this.opts.a11yTable || this.tableTimer) return;\n this.tableTimer = window.setTimeout(() => {\n this.tableTimer = 0;\n this.buildTable();\n }, 400);\n }\n\n private buildTable(): void {\n const s = this.panes[0]?.series.find((x) => x.options().visible);\n if (!s) return;\n if (!this.table) {\n // A table sizes to its content and ignores overflow, so the visually\n // hidden box is a wrapper div: a bare 1,900 px table made the chart root\n // scrollable, and scroll-into-view then moved content under the pointer.\n const wrap = document.createElement(\"div\");\n wrap.style.cssText = \"position:absolute;left:0;top:0;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap\";\n this.table = document.createElement(\"table\");\n wrap.appendChild(this.table);\n this.element.appendChild(wrap);\n }\n const t = this.table;\n const ohlc = s.data.shape === \"ohlc\";\n const msg = this.opts.messages;\n const head = (ohlc ? [\"time\", \"open\", \"high\", \"low\", \"close\"] as const : [\"time\", \"value\"] as const).map((k) => msg(`chart.table.${k}`));\n const rows: string[] = [];\n // The newest 200 visible bars: enough to read around, bounded DOM.\n for (let i = this.vis.hi; i >= this.vis.lo && rows.length < 200; i--) {\n const b = s.barAtIndex(i) as Record<string, number> | undefined;\n if (!b) continue;\n const cells = ohlc ? [b.open!, b.high!, b.low!, b.close!].map((v) => s.formatPrice(v)) : [s.formatPrice(b.value!)];\n rows.push(`<tr><th scope=\"row\">${esc(this.fmt.crosshair(b.time!, this.timeVisible()))}</th>${cells.map((c) => `<td>${esc(c)}</td>`).join(\"\")}</tr>`);\n }\n t.innerHTML = `<caption>${esc(msg(\"chart.table.caption\", { label: this.opts.ariaLabel, name: s.options().title || s.type }))}</caption><thead><tr>${head.map((h) => `<th scope=\"col\">${esc(h)}</th>`).join(\"\")}</tr></thead><tbody>${rows.join(\"\")}</tbody>`;\n }\n\n // ---- size, DPR, context -------------------------------------------------------------\n\n private measure(): void {\n const r = this.element.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n if (r.width === this.cssW && r.height === this.cssH && dpr === this.dpr) return;\n this.cssW = r.width;\n this.cssH = r.height;\n this.dpr = dpr;\n this.devW = Math.max(1, Math.round(r.width * dpr));\n this.devH = Math.max(1, Math.round(r.height * dpr));\n this.layers.fit(r.width, r.height, dpr);\n this.tticksKey = \"\";\n // Render synchronously so a resize never shows a stretched frame.\n this.render(LAYER_ALL);\n }\n\n private watchDpr(): void {\n this.dprQuery?.removeEventListener(\"change\", this.onDpr);\n this.dprQuery = window.matchMedia(`(resolution: ${window.devicePixelRatio || 1}dppx)`);\n this.dprQuery.addEventListener(\"change\", this.onDpr);\n }\n\n private readonly onDpr = (): void => {\n this.watchDpr();\n this.measure();\n };\n\n}\n\nfunction esc(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({ \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\" })[c]!);\n}\n\n/** Apply a series' `autoscale` override to its built-in [low, high] (NaN when empty); NaN, NaN when it contributes nothing. */\nfunction overrideRange(id: string, fn: NonNullable<SeriesOptions<SeriesType>[\"autoscale\"]>, low: number, high: number): [number, number] {\n const r = fn(low === low && high === high ? { low, high } : null);\n if (r === null) return [Number.NaN, Number.NaN];\n if (typeof r !== \"object\" || !Number.isFinite(r.low) || !Number.isFinite(r.high) || r.low > r.high) {\n throw new RangeError(`alphacharts: series \"${id}\" autoscale must return null or { low, high } with finite low <= high, got ${JSON.stringify(r)}`);\n }\n return [r.low, r.high];\n}\n\n/** True when a scale draws an axis. */\nfunction axisShown(sc: PriceScale): boolean {\n return sc.options.position !== \"none\" && sc.options.visible;\n}\n\n/** A pane's shown scales on one side, in creation order (column order). */\nfunction sideScales(p: Pane, side: \"left\" | \"right\"): PriceScale[] {\n const out: PriceScale[] = [];\n for (const sc of p.scales.values()) if (sc.options.position === side && sc.options.visible) out.push(sc);\n return out;\n}\n\n/** Black or white, whichever reads better on `bg`. */\nfunction contrastText(bg: string): string {\n const c = parseColor(bg);\n const r = (c >>> 24) & 255, g = (c >>> 16) & 255, b = (c >>> 8) & 255;\n return 0.299 * r + 0.587 * g + 0.114 * b > 150 ? \"#000000\" : \"#ffffff\";\n}\n\n","// Many charts, one set of canvases.\n//\n// const dash = new Dashboard(gridElement);\n// const a = dash.addChart(cellA, { theme: \"dark\" });\n//\n// Cells are any elements inside the container (CSS grid, flex, absolute).\n// The dashboard's three canvases cover the container; each chart draws into\n// its cell's rectangle and takes pointer input on its own root, so charts\n// behave exactly like standalone ones. One WebGL context serves them all.\n\nimport type { SurfaceChoice } from \"../render/surface.js\";\nimport { Chart, type ChartOptionsInput } from \"./chart.js\";\nimport { CellLayers, DashboardCanvases } from \"./layers.js\";\nimport { LAYER_ALL } from \"./scheduler.js\";\n\nexport interface DashboardOptions {\n renderer: SurfaceChoice;\n}\n\nexport class Dashboard {\n private readonly canvases: DashboardCanvases;\n private readonly charts = new Set<Chart>();\n private readonly resizeObs: ResizeObserver;\n private removed = false;\n\n constructor(readonly container: HTMLElement, options: Partial<DashboardOptions> = {}) {\n if (getComputedStyle(container).position === \"static\") container.style.position = \"relative\";\n this.canvases = new DashboardCanvases(\n container,\n options.renderer ?? \"auto\",\n {\n lost: () => {\n for (const c of this.charts) c.surfaceLost();\n },\n restored: () => this.redrawAll(),\n },\n () => this.relayout(),\n () => this.charts,\n );\n this.resizeObs = new ResizeObserver(() => this.relayout());\n this.resizeObs.observe(container);\n this.canvases.resize(window.devicePixelRatio || 1);\n }\n\n /** A chart drawn into `cell`, which must be inside the container. */\n addChart(cell: HTMLElement, options: ChartOptionsInput = {}): Chart {\n if (this.removed) throw new Error(\"alphacharts: this dashboard was removed\");\n if (!this.container.contains(cell)) throw new Error(\"alphacharts: a dashboard cell must be inside the dashboard container\");\n const chart = new Chart(cell, options, () => new CellLayers(this.canvases, cell));\n this.charts.add(chart);\n chart.onRemove(() => {\n this.charts.delete(chart);\n this.relayout();\n });\n return chart;\n }\n\n get size(): number {\n return this.charts.size;\n }\n\n remove(): void {\n if (this.removed) return;\n this.removed = true;\n for (const c of [...this.charts]) c.remove();\n this.resizeObs.disconnect();\n this.canvases.dispose();\n }\n\n private relayout(): void {\n if (this.removed) return;\n this.canvases.resize(window.devicePixelRatio || 1);\n this.redrawAll();\n }\n\n private redrawAll(): void {\n // Cleared canvases or moved cells: every chart repaints its cell.\n this.canvases.clear();\n for (const c of this.charts) {\n c.remeasure();\n c.invalidate(LAYER_ALL);\n }\n }\n}\n","// Keeps a set of charts on the same time window and crosshair.\n//\n// Charts may show different instruments with different bar times, so the\n// window is matched by time, not index: the bar at the leader's right edge is\n// found in each follower's timeline by binary search, and bar spacing is\n// copied. Only views moved by the user propagate (\"sync\" and \"data\" moves do\n// not), so followers never echo back to the leader.\n\nimport type { Chart } from \"../chart/chart.js\";\n\nexport interface SyncOptions {\n time: boolean;\n crosshair: boolean;\n}\n\nexport class SyncGroup {\n private readonly members = new Map<Chart, (() => void)[]>();\n private readonly opts: SyncOptions;\n\n constructor(options: Partial<SyncOptions> = {}) {\n this.opts = { time: true, crosshair: true, ...options };\n }\n\n add(chart: Chart): void {\n if (this.members.has(chart)) return;\n const offs: (() => void)[] = [];\n if (this.opts.time) {\n offs.push(\n chart.on(\"visibleRangeChange\", (e) => {\n if (e.source === \"user\") this.followTime(chart, e.to);\n }),\n );\n }\n if (this.opts.crosshair) {\n offs.push(\n chart.on(\"crosshairMove\", (e) => {\n if (e.source === \"sync\") return;\n for (const other of this.members.keys()) {\n if (other.isRemoved) {\n this.remove(other);\n continue;\n }\n if (other === chart) continue;\n if (e.time === undefined) {\n other.setSyncedCrosshair(null);\n continue;\n }\n other.setSyncedCrosshair(other.timeline.indexAtOrBefore(e.time) ?? null);\n }\n }),\n );\n }\n this.members.set(chart, offs);\n }\n\n remove(chart: Chart): void {\n for (const off of this.members.get(chart) ?? []) off();\n this.members.delete(chart);\n }\n\n private followTime(leader: Chart, right: number): void {\n const ltl = leader.timeline;\n if (ltl.length === 0) return;\n const i = Math.max(ltl.first, Math.min(ltl.end - 1, Math.floor(right)));\n const t = ltl.timeAt(i);\n const frac = right - i;\n const spacing = leader.time.spacing;\n for (const other of this.members.keys()) {\n if (other.isRemoved) {\n this.remove(other);\n continue;\n }\n if (other === leader) continue;\n // The follower's bar containing t; before its first bar, its first bar.\n const tl = other.timeline;\n if (tl.length === 0) continue;\n const j = tl.indexAtOrBefore(t) ?? tl.first;\n other.viewChanged(() => {\n other.time.spacing = spacing;\n other.time.setRight(j + frac);\n }, \"sync\");\n }\n }\n}\n","// Datafeed contract and a loader that drives one series from it: initial\n// history, older pages as the user scrolls left, and live bars.\n//\n// The library ships no data; the consumer implements Datafeed over its own\n// backend. Every failure goes to `onError`: nothing is retried or dropped\n// silently, except live bars that arrived before the first history page and\n// are older than its last bar (the history already covers them). A failed\n// first page leaves the feed `failed` until the caller asks to retry().\n\nimport type { Chart } from \"../chart/chart.js\";\nimport type { Series } from \"../chart/series.js\";\nimport type { SeriesType } from \"../chart/series-types.js\";\nimport type { ColumnarOhlc, ColumnarValue, OhlcBar, ValuePoint } from \"../data/model.js\";\n\nexport interface BarsRequest {\n symbol: string;\n resolution: string;\n /** Return bars with time <= to (UTC ms), newest last. */\n to: number;\n /** How many bars, at most, ending at `to`. */\n countBack: number;\n}\n\nexport interface BarsResponse {\n bars: readonly OhlcBar[] | readonly ValuePoint[] | ColumnarOhlc | ColumnarValue;\n /** No bars exist before the ones returned. */\n noMoreData: boolean;\n}\n\n/** One trade (time and sales). Order-flow charts and trade-built bars use it. */\nexport interface Trade {\n /** UTC ms; equal times are allowed, order is arrival order. */\n time: number;\n price: number;\n size: number;\n /** Aggressor side when the venue reports it; \"unknown\" is never guessed. */\n side: \"buy\" | \"sell\" | \"unknown\";\n}\n\nexport interface TradesRequest {\n symbol: string;\n /** Trades with from <= time < to (UTC ms). */\n from: number;\n to: number;\n}\n\nexport interface Datafeed {\n getBars(request: BarsRequest, signal: AbortSignal): Promise<BarsResponse>;\n /** Live bars: the current bar repeatedly, then the next one. Returns an unsubscribe. */\n subscribeBars?(symbol: string, resolution: string, onBar: (bar: OhlcBar | ValuePoint) => void): () => void;\n /** Historical trades, for footprint, profiles and tick/volume bars. */\n getTrades?(request: TradesRequest, signal: AbortSignal): Promise<Trade[]>;\n /** Live trades. Returns an unsubscribe. */\n subscribeTrades?(symbol: string, onTrade: (trade: Trade) => void): () => void;\n}\n\nexport interface FeedOptions {\n symbol: string;\n resolution: string;\n /** Bars per request. */\n pageSize?: number;\n /** Load older history when the left edge is within this many bars of the first one. */\n prefetchBars?: number;\n /** Where the newest history ends; default now. */\n to?: number;\n onError: (error: unknown) => void;\n /** Live bars held while the first page loads; more is reported as an error and dropped. */\n maxEarlyBars?: number;\n}\n\nexport interface FeedController {\n readonly loading: boolean;\n readonly noMoreData: boolean;\n /** The first page failed and nothing is loaded; retry() asks again. */\n readonly failed: boolean;\n /** Request the first page again after a failure (no-op otherwise). */\n retry(): void;\n /** Stop requests and the live subscription. */\n dispose(): void;\n}\n\nconst barTime = (b: BarsResponse[\"bars\"]): { first: number; last: number } | undefined => {\n if (Array.isArray(b)) {\n const a = b as readonly { time: number }[];\n return a.length ? { first: a[0]!.time, last: a[a.length - 1]!.time } : undefined;\n }\n const t = (b as ColumnarOhlc | ColumnarValue).time;\n return t.length ? { first: t[0]!, last: t[t.length - 1]! } : undefined;\n};\n\nexport function connectDatafeed<T extends SeriesType>(chart: Chart, series: Series<T>, feed: Datafeed, options: FeedOptions): FeedController {\n const pageSize = options.pageSize ?? 2000;\n const prefetch = options.prefetchBars ?? 300;\n const ac = new AbortController();\n let loading = true;\n let noMoreData = false;\n let ready = false;\n let firstTime = Number.NaN;\n let lastTime = Number.NaN;\n const early: (OhlcBar | ValuePoint)[] = [];\n let unsubscribe: (() => void) | undefined;\n let offRange: (() => void) | undefined;\n\n const fail = (e: unknown) => {\n if (ac.signal.aborted) return;\n options.onError(e);\n };\n\n const maxEarly = options.maxEarlyBars ?? 10_000;\n let overflowReported = false;\n let failed = false;\n\n const live = (bar: OhlcBar | ValuePoint) => {\n if (ac.signal.aborted) return;\n if (!ready) {\n if (early.length < maxEarly) early.push(bar);\n else if (!overflowReported) {\n overflowReported = true;\n fail(new Error(`datafeed: more than ${maxEarly} live bars arrived before the first history page; later ones were dropped`));\n }\n return;\n }\n try {\n series.update(bar as never);\n lastTime = Math.max(lastTime, bar.time);\n } catch (e) {\n fail(e);\n }\n };\n\n const loadOlder = () => {\n if (loading || noMoreData || !ready || Number.isNaN(firstTime)) return;\n loading = true;\n feed\n .getBars({ symbol: options.symbol, resolution: options.resolution, to: firstTime - 1, countBack: pageSize }, ac.signal)\n .then((r) => {\n if (ac.signal.aborted) return;\n const span = barTime(r.bars);\n if (span) {\n series.prepend(r.bars as never);\n firstTime = span.first;\n }\n noMoreData = r.noMoreData || !span;\n })\n .catch(fail)\n .finally(() => {\n loading = false;\n });\n };\n\n if (feed.subscribeBars) unsubscribe = feed.subscribeBars(options.symbol, options.resolution, live);\n\n const loadFirst = () => {\n loading = true;\n failed = false;\n feed\n .getBars({ symbol: options.symbol, resolution: options.resolution, to: options.to ?? Date.now(), countBack: pageSize }, ac.signal)\n .then((r) => {\n if (ac.signal.aborted) return;\n series.setData(r.bars as never);\n const span = barTime(r.bars);\n firstTime = span?.first ?? Number.NaN;\n lastTime = span?.last ?? Number.NaN;\n noMoreData = r.noMoreData || !span;\n ready = true;\n for (const b of early) if (Number.isNaN(lastTime) || b.time >= lastTime) live(b);\n early.length = 0;\n offRange = chart.on(\"visibleRangeChange\", (e) => {\n const first = series.range()?.first;\n if (first !== undefined && e.from < first + prefetch) loadOlder();\n });\n })\n .catch((e) => {\n failed = !ready;\n fail(e);\n })\n .finally(() => {\n loading = false;\n });\n };\n loadFirst();\n\n return {\n get loading() {\n return loading;\n },\n get noMoreData() {\n return noMoreData;\n },\n get failed() {\n return failed;\n },\n retry() {\n if (failed && !loading && !ac.signal.aborted) loadFirst();\n },\n dispose() {\n ac.abort();\n unsubscribe?.();\n offRange?.();\n },\n };\n}\n","// @alphacharts/core public API.\n\nimport { Chart, type ChartOptionsInput } from \"./chart/chart.js\";\n\nexport { Chart } from \"./chart/chart.js\";\nexport { Dashboard } from \"./chart/dashboard.js\";\nexport { LAYOUT_VERSION, LocalStorageStore, MemoryStore, migrate } from \"./chart/layout.js\";\nexport type { ChartState, CustomOption, LayoutStore, PaneState, ScaleState, SeriesState } from \"./chart/layout.js\";\nexport type { DashboardOptions } from \"./chart/dashboard.js\";\nexport type { ChartEvents, ChartOptions, Region, ChartOptionsInput, CrosshairEvent, CrosshairOptions, GridOptions, HoveredObject, InteractionOptions, VisibleRangeEvent } from \"./chart/chart.js\";\nexport { Series } from \"./chart/series.js\";\nexport type { ChartPlugin, PluginApi, PluginPaneView, PluginPointer } from \"./chart/plugin.js\";\nexport type { SeriesBar, SeriesInput } from \"./chart/series.js\";\nexport { registerSeriesType } from \"./chart/series-types.js\";\nexport type { CommonSeriesOptions, LastValue, SeriesOptions, SeriesOptionsMap, SeriesType, SeriesTypeDef } from \"./chart/series-types.js\";\nexport { PriceLine, crisp, dashPattern } from \"./chart/primitives.js\";\nexport type { SeriesMarker, MarkerPosition, MarkerShape } from \"./chart/markers.js\";\nexport type { AxisLabel, LineDash, PanePrimitive, PaneView, PriceLineOptions, PrimitiveHit, PrimitiveHost, RenderLayer } from \"./chart/primitives.js\";\nexport { DARK, HIGH_CONTRAST, LIGHT, systemTheme } from \"./chart/theme.js\";\nexport { CHART_MESSAGES, defaultMessages } from \"./chart/messages.js\";\nexport type { ChartMessageKey, ChartMessages, ChartMessageValues } from \"./chart/messages.js\";\nexport { DEFAULT_KEYMAP } from \"./chart/chart.js\";\nexport { checkWatermarkOptions, DEFAULT_WATERMARK, drawWatermark } from \"./chart/watermark.js\";\nexport type { WatermarkOptions } from \"./chart/watermark.js\";\nexport type { KeyAction } from \"./chart/chart.js\";\nexport { ALWAYS_OPEN, NSE, Sessions, US_EQUITY, weekdays } from \"./data/session.js\";\nexport type { SessionSpec, SessionState, Window } from \"./data/session.js\";\nexport { parseResolution, Resampler } from \"./data/resample.js\";\nexport type { Resolution, ResolutionUnit, ResampledBar } from \"./data/resample.js\";\nexport type { Theme } from \"./chart/theme.js\";\nexport { SyncGroup } from \"./interaction/sync.js\";\nexport type { SyncOptions } from \"./interaction/sync.js\";\nexport { connectDatafeed } from \"./feed/datafeed.js\";\nexport type { BarsRequest, BarsResponse, Datafeed, FeedController, FeedOptions, Trade, TradesRequest } from \"./feed/datafeed.js\";\nexport type { ColumnarOhlc, ColumnarValue, OhlcBar, ValuePoint } from \"./data/model.js\";\nexport type { PriceScaleOptions } from \"./scale/price-scale.js\";\nexport type { TimeScaleOptions } from \"./scale/time-scale.js\";\nexport type { TimeLabel } from \"./scale/ticks.js\";\nexport type { DataChange, SeriesData, SeriesShape } from \"./data/model.js\";\nexport { COL_C, COL_COLOR, COL_H, COL_L, COL_O, COL_V } from \"./data/model.js\";\nexport { LOD_BASE, LOD_C, LOD_COLOR, LOD_H, LOD_L, LOD_O } from \"./data/lod.js\";\nexport { parseColor, rgba, cssColor } from \"./render/color.js\";\nexport { barWidths } from \"./render/renderers.js\";\nexport type { CandleStyle, BarStyle, LineStyle, AreaStyle, HistogramStyle } from \"./render/renderers.js\";\nexport type { DrawView2D, SeriesRenderer2D } from \"./render/canvas2d.js\";\nexport type { SeriesShapes } from \"./chart/series-types.js\";\nexport type { PriceFormat, Formatter } from \"./scale/format.js\";\n// Scale utilities the plot package (and hosts) build on: nice ticks, number formats, calendar time zones.\nexport { niceStep, niceTicks, PriceFormatter } from \"./scale/ticks.js\";\nexport { createFormatter, decimalsOf, isIndianLocale } from \"./scale/format.js\";\nexport { civilFromLocal, DAY_MS, localFromCivil, TimeZone } from \"./data/tz.js\";\nexport type { CivilTime } from \"./data/tz.js\";\nexport type { PriceScaleMode } from \"./scale/price-scale.js\";\nexport type { DrawView, SeriesRenderer } from \"./render/renderers.js\";\n\n/** One-liner: `const chart = createChart(el, { theme: \"light\" })`. */\nexport function createChart(container: HTMLElement, options?: ChartOptionsInput): Chart {\n return new Chart(container, options);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["parseColor","cssColor","emitFault","LOD_C","chooseLevel","LOD_L","COL_BAR_COLOR","COL_H","COL_L","LOD_BASE","DataModel","COL_C","COL_V","InstanceWindow","GLContext","COL_O","GLSL_COMMON","HOLE_TEST","COL_COLOR","LOD_COLOR","rgba","LOD_O","LOD_H","BUCKET_MS","TRANSITION","DAY_MS","TimeZone","id","b","t","off","a","guess","local","civilFromLocal","parts","y","mo","d","h","mi","p","days","rem","hour","minute","second","ms","z","era","doe","yoe","doy","mp","day","month","localFromCivil","year","ownLive","GL_ATTRS","PARK_MAX","PARK_MS","parked","releaseCanvas","gl","parkedCanvas","c","dropParked","canvas","createSurface","choice","GLSurface","events","opts","Canvas2DSurface","glctx","ox","oy","devH","devW","r","draw","timer","onLost","ctx","extra","parent","adopt","ctx2d","OwnLayers","bg","root","reused","renderer","series","overlay","cssW","dpr","cssH","CellLayers","dash","cell","chart","DashboardCanvases","container","onLayout","members","w","changed","LAYOUT_VERSION","checkCustomOptions","name","st","supplied","MIGRATIONS","migrate","raw","s","v","step","k","MemoryStore","key","state","LocalStorageStore","prefix","out","i","plain","o","checkPriceScaleOptions","DEFAULT_PRICE_SCALE","PriceScale","options","price","lo","hi","pad","mid","half","factor","dy","priceTicks","n","heightPx","targetGapPx","niceStep","minMove","ticks","start","end","roundTo","niceTicks","count","multiple","e","f","axisText","sc","fmt","scaleTicks","label","gapPx","logTicks","pxPerDecade","mantissas","every","lastY","m","FIXED","weightBetween","prev","weightLocal","tz","la","lb","minWeight","minUsefulWeight","minPeriod","msPerBar","spacing","fw","timeTicks","tl","cands","time","t0","t1","minW","finest","seen","add","boundary","x","boundaries","ok","c0","c1","monthStep","l0","l1","l","timeText","custom","calendar","kind","TimeFormatter","timeZone","timeFormat","locale","weight","withTime","PriceFormatter","DEFAULT_TIME_SCALE","TimeScale","at","anchorX","clamp","dx","right","barsWide","keep","maxOffset","minOffset","dirty","raf","requestRender","layers","frame","cancelRender","batch","failure","now","error","DRAG_SLOP","KINETIC_MIN","KINETIC_STOP","Interaction","surface","pane","ptr","dist","area","tap","unit","action","handled","dir","cursor","pointerType","first","last","dt","Emitter","set","type","fn","dashPattern","style","width","checkLine","crisp","PriceLine","next","host","view","BarShading","color","lowerBoundTime","cap","visible","times","colors","runStart","runEnd","runColor","flush","idx","SHAPES","POSITIONS","checkMarkers","ids","markers","hasBar","markerLowerBound","sorted","GAP","PAD","markerSize","barSpacing","mult","placeMarkers","curTime","above","below","inp","bar","size","textH","slot","isAbove","near","cy","top","tw","drawMarkers","placed","MAX_DECIMALS","decimalsOf","isIndianLocale","createFormatter","derivedMinMove","steps","nf","div","suffix","FS_FLAT","OFFSCREEN","WindowRenderer","prog","data","zeroBase","pairs","bindRecord","spacingDev","u","barWidths","ratio","spacingCss","level","wick","body","offset","Colors","css","CANDLE_VS","CandleRenderer","BAR_VS","BarRenderer","thick","HIST_VS","HistogramRenderer","base","LINE_VS","LINE_FS","LineRenderer","AREA_VS","AREA_FS","AreaRenderer","AreaFill","eachUnit","ohlc","O","H","L","C","COL","lv","levelOf","Y","snap","Base","Candles2D","bw","ww","bodyUp","bodyDown","wickUp","wickDown","own","left","up","op","yh","yl","yt","yb","Bars2D","down","Histogram2D","byColor","yv","y0","y1","linePath","path","started","valueOf","stroke","colouredLine","px","py","have","col","ys","Line2D","Area2D","fill","g","registry","registerSeriesType","def","seriesType","lodRange","ohlcValue","SAMPLE","validateColors","DEFAULT_COMMON","Series","theme","cols","dec","scan","DARK","LIGHT","HIGH_CONTRAST","systemTheme","CHART_MESSAGES","defaultMessages","template","values","ALWAYS_OPEN","weekdays","regular","extended","holidays","NSE","US_EQUITY","Sessions","spec","back","min","wd","weekday","inAny","today","ws","parseResolution","MS","Resampler","res","len","anchor","week","src","merge","replaced","DEFAULT_WATERMARK","checkWatermarkOptions","GLYPH_PATH","GLYPH_H","HEIGHT","INSET_X","INSET_Y","HALO","MIN_PANE_W","MIN_PANE_H","glyph","drawWatermark","paneW","paneH","th","DEFAULT_KEYMAP","SEPARATOR","AXIS_PAD","MIN_AXIS_W","resolveTheme","Chart","prim","line","watermark","timeChanged","stretch","side","failed","q","plugins","missing","ss","seriesIds","so","pn","created","pf","input","ps","scs","plugin","all","ev","consumed","pl","ti","tp","paneOf","scaleOf","sideScales","moved","layer","paneX","paneR","axisShown","source","scaleId","index","total","ha","sum","wasEmpty","font","pass","lw","rw","gap","avail","used","max","overrideRange","pmin","pmax","need","tk","j","settle","cur","on","one","x0","x1","gsc","bgPrims","ty","tt","sf","labels","countdownAt","contrastText","ch","cIndex","inData","cx","vx","hy","text","ct","lx","lh","ax","aw","cd","title","str","ya","msg","combo","keys","probe","sec","hh","mm","two","wrap","head","rows","cells","esc","low","high","Dashboard","SyncGroup","offs","other","ltl","leader","frac","barTime","connectDatafeed","pageSize","prefetch","ac","loading","noMoreData","ready","firstTime","lastTime","early","unsubscribe","offRange","fail","maxEarly","overflowReported","live","loadOlder","feed","span","loadFirst","createChart"],"sources":["../src/data/tz.ts","../src/render/surface.ts","../src/chart/layers.ts","../src/chart/layout.ts","../src/scale/price-scale.ts","../src/scale/ticks.ts","../src/scale/time-scale.ts","../src/chart/scheduler.ts","../src/interaction/input.ts","../src/chart/emitter.ts","../src/chart/primitives.ts","../src/chart/markers.ts","../src/scale/format.ts","../src/render/renderers.ts","../src/render/canvas2d.ts","../src/chart/series-types.ts","../src/chart/series.ts","../src/chart/theme.ts","../src/chart/messages.ts","../src/data/session.ts","../src/data/resample.ts","../src/chart/watermark.ts","../src/chart/chart.ts","../src/chart/dashboard.ts","../src/interaction/sync.ts","../src/feed/datafeed.ts","../src/index.ts"],"sourcesContent":["// Time-zone arithmetic without per-bar Intl calls.\n//\n// Intl.DateTimeFormat is the only portable source of IANA offsets, but one\n// formatToParts call costs microseconds, which is seconds over millions of\n// bars. Offsets change only at DST/legal transitions, so they are cached per\n// 6-hour bucket; a bucket whose two ends disagree contains a transition and\n// is resolved exactly per call.\n\nconst BUCKET_MS = 6 * 3_600_000;\nconst TRANSITION = Number.NaN;\n\nexport const DAY_MS = 86_400_000;\n\nexport interface CivilTime {\n year: number;\n month: number; // 1-12\n day: number; // 1-31\n hour: number;\n minute: number;\n second: number;\n ms: number;\n}\n\nexport class TimeZone {\n readonly id: string;\n private readonly fmt: Intl.DateTimeFormat | null;\n private readonly cache = new Map<number, number>();\n\n /** `id` is \"UTC\" or an IANA name; an unknown name throws RangeError. */\n constructor(id: string) {\n this.id = id;\n this.fmt =\n id === \"UTC\"\n ? null\n : new Intl.DateTimeFormat(\"en-US\", {\n timeZone: id,\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n });\n }\n\n /** Offset (ms) to add to a UTC instant to get local wall-clock time. */\n offset(t: number): number {\n if (this.fmt === null) return 0;\n const b = Math.floor(t / BUCKET_MS);\n let off = this.cache.get(b);\n if (off === undefined) {\n const a = this.exactOffset(b * BUCKET_MS);\n const z = this.exactOffset((b + 1) * BUCKET_MS - 1);\n off = a === z ? a : TRANSITION;\n this.cache.set(b, off);\n }\n return Number.isNaN(off) ? this.exactOffset(t) : off;\n }\n\n /** UTC instant whose local wall-clock time is `local` (earlier instant on overlap). */\n fromLocal(local: number): number {\n const guess = local - this.offset(local);\n return local - this.offset(guess);\n }\n\n civil(t: number): CivilTime {\n return civilFromLocal(t + this.offset(t));\n }\n\n private exactOffset(t: number): number {\n const parts = this.fmt!.formatToParts(t);\n let y = 0, mo = 0, d = 0, h = 0, mi = 0, s = 0;\n for (const p of parts) {\n switch (p.type) {\n case \"year\": y = +p.value; break;\n case \"month\": mo = +p.value; break;\n case \"day\": d = +p.value; break;\n case \"hour\": h = +p.value; break;\n case \"minute\": mi = +p.value; break;\n case \"second\": s = +p.value; break;\n }\n }\n const wall = Date.UTC(y, mo - 1, d, h, mi, s);\n // formatToParts drops milliseconds; compare at whole-second resolution.\n return wall - (t - (((t % 1000) + 1000) % 1000));\n }\n}\n\n/** Civil fields of a local-time millisecond count (Hinnant's algorithm). */\nexport function civilFromLocal(local: number): CivilTime {\n const days = Math.floor(local / DAY_MS);\n let rem = local - days * DAY_MS;\n const hour = Math.floor(rem / 3_600_000);\n rem -= hour * 3_600_000;\n const minute = Math.floor(rem / 60_000);\n rem -= minute * 60_000;\n const second = Math.floor(rem / 1000);\n const ms = rem - second * 1000;\n\n const z = days + 719_468;\n const era = Math.floor(z / 146_097);\n const doe = z - era * 146_097;\n const yoe = Math.floor((doe - Math.floor(doe / 1460) + Math.floor(doe / 36_524) - Math.floor(doe / 146_096)) / 365);\n const doy = doe - (365 * yoe + Math.floor(yoe / 4) - Math.floor(yoe / 100));\n const mp = Math.floor((5 * doy + 2) / 153);\n const day = doy - Math.floor((153 * mp + 2) / 5) + 1;\n const month = mp < 10 ? mp + 3 : mp - 9;\n const year = yoe + era * 400 + (month <= 2 ? 1 : 0);\n return { year, month, day, hour, minute, second, ms };\n}\n\n/** Local-time milliseconds at 00:00 of a civil date. */\nexport function localFromCivil(year: number, month: number, day: number): number {\n return Date.UTC(year, month - 1, day);\n}\n","// Where a chart's series are drawn: a WebGL2 context, or Canvas2D when WebGL2\n// is unavailable or the page already holds OWN_LIMIT live contexts (browsers\n// evict the oldest past ~16). A surface may be shared by the charts of one\n// Dashboard; each chart draws into its own cell at (ox, oy).\n\nimport { emitFault } from \"../fault.js\";\nimport { GLContext } from \"./gl.js\";\n\nexport type SurfaceKind = \"webgl\" | \"canvas2d\";\nexport type SurfaceChoice = SurfaceKind | \"auto\";\n\nexport interface PaneRect {\n /** Device px within the chart, top-left origin. */\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Surface {\n readonly kind: SurfaceKind;\n readonly gl: WebGL2RenderingContext | null;\n readonly glctx: GLContext | null;\n readonly ctx2d: CanvasRenderingContext2D | null;\n /**\n * Start drawing a chart's cell of devW × devH at device offset (ox, oy):\n * clears only that cell. False when nothing can be drawn (context lost).\n */\n begin(ox: number, oy: number, devW: number, devH: number): boolean;\n /** Clip drawing to a pane (cell-relative device px), run `draw`, restore. */\n pane(rect: PaneRect, draw: () => void): void;\n end(): void;\n dispose(): void;\n}\n\nexport interface SurfaceEvents {\n /** GL objects are gone: drop every renderer made on this surface. */\n lost(): void;\n restored(): void;\n}\n\n/** Live own contexts before \"auto\" falls back to Canvas2D (use a Dashboard for many charts). */\nexport const OWN_LIMIT = 8;\nlet ownLive = 0;\n\nconst GL_ATTRS: WebGLContextAttributes = { antialias: false, premultipliedAlpha: true, alpha: true, preserveDrawingBuffer: false, powerPreference: \"high-performance\" };\n\n// ---- released contexts ---------------------------------------------------------------\n//\n// A removed chart's WebGL context is not gone until the browser collects its\n// canvas: WebKit (and Chrome, less strictly) count it against the page's\n// limit meanwhile and warn \"too many active WebGL contexts\" after ~8\n// create/remove cycles, even after loseContext(). So a disposed surface does\n// not lose its context: it parks the canvas with its context and compiled\n// programs, and the next chart in the page adopts it (parkedCanvas). A parked\n// context that nobody adopts within PARK_MS is released for real: lost, and\n// its canvas shrunk to 0 × 0 so the backing store is freed.\n\n/** Parked contexts kept at most; a further disposed surface is released at once. */\nconst PARK_MAX = OWN_LIMIT;\nconst PARK_MS = 10_000;\n\ninterface Parked {\n gl: WebGL2RenderingContext;\n glctx: GLContext;\n timer: ReturnType<typeof setTimeout>;\n onLost: () => void;\n}\nconst parked = new Map<HTMLCanvasElement, Parked>();\n\n/** Give a canvas back to the browser: lose its context, free its backing store. */\nfunction releaseCanvas(canvas: HTMLCanvasElement, gl: WebGL2RenderingContext): void {\n if (!gl.isContextLost()) gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n canvas.width = 0;\n canvas.height = 0;\n}\n\n/** A canvas whose WebGL2 context a disposed chart parked, detached from the DOM; undefined when none. */\nexport function parkedCanvas(): HTMLCanvasElement | undefined {\n for (const [c, p] of parked) {\n if (!p.gl.isContextLost()) return c;\n dropParked(c); // lost while parked (eviction, GPU reset): nothing to adopt\n }\n return undefined;\n}\n\n/** Forget a parked canvas and release it. */\nfunction dropParked(canvas: HTMLCanvasElement): void {\n const p = parked.get(canvas);\n if (!p) return;\n parked.delete(canvas);\n clearTimeout(p.timer);\n canvas.removeEventListener(\"webglcontextlost\", p.onLost);\n releaseCanvas(canvas, p.gl);\n}\n\n/**\n * `preserveDrawingBuffer`: keep the canvas's pixels between frames. A\n * Dashboard needs it: its charts share one canvas and each redraws only its\n * own cell, so without it the browser's per-frame buffer reset blanks every\n * cell that did not redraw in that frame.\n */\nexport function createSurface(choice: SurfaceChoice, canvas: HTMLCanvasElement, events: SurfaceEvents, opts: { preserveDrawingBuffer?: boolean } = {}): Surface {\n const p = parked.get(canvas);\n if (p) {\n parked.delete(canvas);\n clearTimeout(p.timer);\n canvas.removeEventListener(\"webglcontextlost\", p.onLost);\n if (!p.gl.isContextLost() && choice !== \"canvas2d\") return new GLSurface(canvas, p.gl, events, p.glctx);\n // A lost or unwanted parked context: never getContext on its canvas again (it would return the same one).\n releaseCanvas(canvas, p.gl);\n canvas = document.createElement(\"canvas\");\n }\n if (choice === \"webgl\" || (choice === \"auto\" && ownLive < OWN_LIMIT)) {\n const gl = canvas.getContext(\"webgl2\", opts.preserveDrawingBuffer ? { ...GL_ATTRS, preserveDrawingBuffer: true } : GL_ATTRS);\n if (gl) return new GLSurface(canvas, gl, events);\n if (choice === \"webgl\") throw new Error(\"alphacharts: WebGL2 is not available (renderer: \\\"webgl\\\" was requested)\");\n }\n return new Canvas2DSurface(canvas);\n}\n\n// ---- own context ------------------------------------------------------------------\n\nclass GLSurface implements Surface {\n readonly kind = \"webgl\" as const;\n glctx: GLContext | null;\n readonly ctx2d = null;\n private disposed = false;\n\n constructor(private readonly canvas: HTMLCanvasElement, readonly gl: WebGL2RenderingContext, private readonly events: SurfaceEvents, glctx?: GLContext) {\n ownLive++;\n this.glctx = glctx ?? new GLContext(gl);\n canvas.addEventListener(\"webglcontextlost\", this.onLost);\n canvas.addEventListener(\"webglcontextrestored\", this.onRestored);\n }\n\n private ox = 0;\n private oy = 0;\n\n begin(ox: number, oy: number, devW: number, devH: number): boolean {\n const gl = this.gl;\n if (!this.glctx || gl.isContextLost()) return false;\n this.ox = ox;\n this.oy = oy;\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(ox, this.canvas.height - oy - devH, devW, devH);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n return true;\n }\n\n pane(r: PaneRect, draw: () => void): void {\n const gl = this.gl;\n const y = this.canvas.height - this.oy - r.y - r.height;\n gl.viewport(this.ox + r.x, y, r.width, r.height);\n gl.scissor(this.ox + r.x, y, r.width, r.height);\n draw();\n }\n\n end(): void {\n this.gl.bindVertexArray(null);\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n ownLive--;\n this.canvas.removeEventListener(\"webglcontextlost\", this.onLost);\n this.canvas.removeEventListener(\"webglcontextrestored\", this.onRestored);\n const { canvas, gl } = this;\n // A lost context cannot be adopted; the browser has already dropped it.\n if (this.glctx && !gl.isContextLost() && parked.size < PARK_MAX) {\n gl.bindVertexArray(null);\n canvas.width = 1;\n canvas.height = 1;\n const timer = setTimeout(() => dropParked(canvas), PARK_MS);\n // Nobody listens for restoration while parked: let a lost context go.\n const onLost = () => dropParked(canvas);\n canvas.addEventListener(\"webglcontextlost\", onLost);\n parked.set(canvas, { gl, glctx: this.glctx, timer, onLost });\n } else {\n releaseCanvas(canvas, gl);\n }\n }\n\n private readonly onLost = (e: Event): void => {\n e.preventDefault();\n this.glctx?.lost();\n this.glctx = null;\n emitFault({ source: \"context-lost\", error: undefined, renderer: \"webgl\" });\n this.events.lost();\n };\n\n private readonly onRestored = (): void => {\n this.glctx = new GLContext(this.gl);\n emitFault({ source: \"context-restored\", error: undefined, renderer: \"webgl\" });\n this.events.restored();\n };\n}\n\n// ---- Canvas2D ------------------------------------------------------------------------\n\nclass Canvas2DSurface implements Surface {\n readonly kind = \"canvas2d\" as const;\n readonly gl = null;\n readonly glctx = null;\n readonly ctx2d: CanvasRenderingContext2D;\n\n constructor(canvas: HTMLCanvasElement) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"alphacharts: neither WebGL2 nor a 2D context is available\");\n this.ctx2d = ctx;\n }\n\n private ox = 0;\n private oy = 0;\n\n begin(ox: number, oy: number, devW: number, devH: number): boolean {\n const c = this.ctx2d;\n this.ox = ox;\n this.oy = oy;\n c.setTransform(1, 0, 0, 1, 0, 0);\n c.clearRect(ox, oy, devW, devH);\n return true;\n }\n\n pane(r: PaneRect, draw: () => void): void {\n const c = this.ctx2d;\n c.save();\n c.setTransform(1, 0, 0, 1, this.ox + r.x, this.oy + r.y);\n c.beginPath();\n c.rect(0, 0, r.width, r.height);\n c.clip();\n draw();\n c.restore();\n }\n\n end(): void {}\n\n dispose(): void {}\n}\n","// The canvases a chart draws on.\n//\n// A standalone chart owns three canvases (bg, series, overlay). A chart in a\n// Dashboard borrows the dashboard's three, which cover its whole container,\n// and draws inside its own cell: measured on this Mac, 16 charts with their\n// own canvases miss ~25% of 120 Hz frames from compositing 48 layers and 16\n// WebGL contexts; one set of canvases for the dashboard misses none. (A shared\n// context that copied each chart into its own canvas was measured too: the\n// GPU readback per chart made it 3× slower, so it was removed.)\n\nimport { createSurface, parkedCanvas, type Surface, type SurfaceChoice, type SurfaceEvents } from \"../render/surface.js\";\n\nexport interface Layers {\n readonly bg: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n readonly surface: Surface;\n /** The chart's device-px offset within the layer canvases. */\n readonly ox: number;\n readonly oy: number;\n /**\n * A chart drew its series layer. A dashboard redraws the cells that did not,\n * once, before the browser paints (see DashboardCanvases.noteGLDraw).\n */\n glDrawn?(chart: GLMember): void;\n /** Size the canvases (standalone) or re-measure the cell (dashboard). */\n fit(cssW: number, cssH: number, dpr: number): void;\n dispose(): void;\n}\n\nfunction canvas(parent: HTMLElement, extra = \"\"): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n c.style.cssText = `position:absolute;left:0;top:0;width:100%;height:100%;display:block;${extra}`;\n c.setAttribute(\"aria-hidden\", \"true\");\n parent.appendChild(c);\n return c;\n}\n\n/** A parked canvas (its WebGL context kept from a removed chart) in place of a new one. */\nfunction adopt(c: HTMLCanvasElement, parent: HTMLElement): HTMLCanvasElement {\n c.style.cssText = \"position:absolute;left:0;top:0;width:100%;height:100%;display:block;\";\n parent.appendChild(c);\n return c;\n}\n\nfunction ctx2d(c: HTMLCanvasElement): CanvasRenderingContext2D {\n const ctx = c.getContext(\"2d\");\n if (!ctx) throw new Error(\"alphacharts: no 2D canvas context available\");\n return ctx;\n}\n\nexport class OwnLayers implements Layers {\n readonly bg: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n readonly surface: Surface;\n readonly ox = 0;\n readonly oy = 0;\n private readonly canvases: HTMLCanvasElement[];\n\n constructor(root: HTMLElement, renderer: SurfaceChoice, events: SurfaceEvents) {\n const bg = canvas(root);\n const reused = renderer === \"canvas2d\" ? undefined : parkedCanvas();\n const series = reused ? adopt(reused, root) : canvas(root);\n const overlay = canvas(root);\n this.canvases = [bg, series, overlay];\n this.bg = ctx2d(bg);\n this.surface = createSurface(renderer, series, events);\n this.overlay = ctx2d(overlay);\n }\n\n fit(cssW: number, cssH: number, dpr: number): void {\n for (const c of this.canvases) {\n c.width = Math.max(1, Math.round(cssW * dpr));\n c.height = Math.max(1, Math.round(cssH * dpr));\n }\n }\n\n dispose(): void {\n this.surface.dispose();\n for (const c of this.canvases) {\n c.remove();\n // The surface keeps (parks) its canvas's GL context; the 2D ones are done.\n if (c !== this.canvases[1] || this.surface.kind !== \"webgl\") (c.width = 0), (c.height = 0);\n }\n }\n}\n\n/** A chart's view of its dashboard's canvases. */\n/** What a dashboard needs from its charts to keep the shared canvas whole. */\nexport interface GLMember {\n redrawGL(): void;\n}\n\nexport class CellLayers implements Layers {\n ox = 0;\n oy = 0;\n\n constructor(private readonly dash: DashboardCanvases, private readonly cell: HTMLElement) {}\n\n get bg(): CanvasRenderingContext2D {\n return this.dash.bg;\n }\n get overlay(): CanvasRenderingContext2D {\n return this.dash.overlay;\n }\n get surface(): Surface {\n return this.dash.surface;\n }\n\n glDrawn(chart: GLMember): void {\n this.dash.noteGLDraw(chart);\n }\n\n fit(_cssW: number, _cssH: number, dpr: number): void {\n const c = this.dash.container.getBoundingClientRect();\n const r = this.cell.getBoundingClientRect();\n const ox = Math.round((r.left - c.left) * dpr);\n const oy = Math.round((r.top - c.top) * dpr);\n if (ox !== this.ox || oy !== this.oy) {\n this.ox = ox;\n this.oy = oy;\n // The old cell area holds stale pixels: everyone redraws.\n this.dash.layoutChanged();\n }\n }\n\n dispose(): void {}\n}\n\n/** The three canvases a Dashboard shares among its charts. */\nexport class DashboardCanvases {\n readonly bg: CanvasRenderingContext2D;\n readonly overlay: CanvasRenderingContext2D;\n readonly surface: Surface;\n private readonly canvases: HTMLCanvasElement[];\n\n private readonly drawn = new Set<GLMember>();\n private flushQueued = false;\n private flushing = false;\n\n constructor(\n readonly container: HTMLElement,\n renderer: SurfaceChoice,\n events: SurfaceEvents,\n private readonly onLayout: () => void,\n private readonly members: () => Iterable<GLMember>,\n ) {\n // Canvases paint over the cells but take no input: pointer events reach\n // each chart's own (transparent) root.\n const bg = canvas(container, \"pointer-events:none\");\n const series = canvas(container, \"pointer-events:none\");\n const overlay = canvas(container, \"pointer-events:none\");\n this.canvases = [bg, series, overlay];\n this.bg = ctx2d(bg);\n // The shared WebGL canvas does not keep its pixels between frames (keeping\n // them costs a full-canvas copy every frame: 25 vs 9 missed vsyncs on 16\n // charts, measured). Instead, a frame in which any cell draws redraws every\n // cell once: noteGLDraw.\n this.surface = createSurface(renderer, series, events);\n this.overlay = ctx2d(overlay);\n }\n\n /**\n * A cell drew its series. The browser clears an un-preserved WebGL buffer\n * after every frame that drew to it, so the other cells must draw in the same\n * frame: a microtask, queued by the first draw, runs after the frame's render\n * loop (or after a synchronous render) and before paint, and redraws each\n * cell that did not draw. Every cell draws at most once a frame.\n */\n noteGLDraw(chart: GLMember): void {\n this.drawn.add(chart);\n if (this.flushing || this.flushQueued) return;\n this.flushQueued = true;\n queueMicrotask(() => {\n this.flushQueued = false;\n this.flushing = true;\n try {\n for (const c of this.members()) if (!this.drawn.has(c)) c.redrawGL();\n } finally {\n this.flushing = false;\n this.drawn.clear();\n }\n });\n }\n\n /** Match the container; returns true when the size changed (canvases cleared). */\n resize(dpr: number): boolean {\n const r = this.container.getBoundingClientRect();\n const w = Math.max(1, Math.round(r.width * dpr)), h = Math.max(1, Math.round(r.height * dpr));\n let changed = false;\n for (const c of this.canvases) {\n if (c.width !== w || c.height !== h) {\n c.width = w;\n c.height = h;\n changed = true;\n }\n }\n return changed;\n }\n\n layoutChanged(): void {\n this.onLayout();\n }\n\n clear(): void {\n for (const ctx of [this.bg, this.overlay]) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n }\n }\n\n dispose(): void {\n this.surface.dispose();\n for (const c of this.canvases) c.remove();\n }\n}\n","// Layout persistence: a chart's whole arrangement as versioned JSON, and the\n// storage adapters that keep it.\n//\n// Saved: options and theme, panes (stretch, every scale's options and, when\n// not autoscaling, its range), series (type, id, options), the view (bar\n// spacing, right offset) and each plugin's toJSON(). Not saved: bar data, which\n// belongs to the integrator's feed. A custom price formatter or `timeLabel` is\n// a function and cannot be saved; restoring one needs it passed back (formatters\n// by series id, `timeLabel` by name). The layout records that a `timeLabel` was\n// set (`customOptions`), and restoring without one is refused, never silently\n// drawn with the calendar labels instead.\n//\n// Restoring checks the version: older layouts are migrated step by step, a\n// newer one is refused rather than half-applied.\n\nexport const LAYOUT_VERSION = 1;\n\nexport interface SeriesState {\n id: string;\n type: string;\n options: Record<string, unknown>;\n}\n\nexport interface ScaleState {\n options: Record<string, unknown>;\n /** Display-unit range, saved when the scale is not autoscaling. */\n range?: { min: number; max: number };\n}\n\nexport interface PaneState {\n stretch: number;\n scales: Record<string, ScaleState>;\n}\n\nexport interface ChartState {\n version: typeof LAYOUT_VERSION;\n options: Record<string, unknown>;\n panes: PaneState[];\n series: SeriesState[];\n view: { spacing: number; rightOffset: number };\n plugins: Record<string, unknown>;\n /** Function-valued chart options that were set when saving; the caller re-supplies them on restore. Absent in older layouts. */\n customOptions?: CustomOption[];\n}\n\n/** Chart options that are functions, so not in the JSON. */\nexport type CustomOption = \"timeLabel\";\n\n/** Throws, before anything is changed, when the layout needs a function the caller did not supply. */\nexport function checkCustomOptions(st: ChartState, supplied: Partial<Record<CustomOption, unknown>>): void {\n for (const name of st.customOptions ?? []) {\n if (typeof supplied[name] !== \"function\") {\n throw new Error(`alphacharts: the layout was saved with a custom ${name}, which is a function and not in the JSON; pass it to restoreState({ ${name} })`);\n }\n }\n}\n\n/** Migrations from version n to n + 1, keyed by n. */\nconst MIGRATIONS: Record<number, (s: Record<string, unknown>) => Record<string, unknown>> = {};\n\nexport function migrate(raw: unknown): ChartState {\n if (typeof raw !== \"object\" || raw === null) throw new TypeError(\"layout: expected an object\");\n let s = raw as Record<string, unknown>;\n let v = s.version;\n if (typeof v !== \"number\" || !Number.isInteger(v) || v < 1) throw new TypeError(`layout: invalid version ${String(v)}`);\n if (v > LAYOUT_VERSION) throw new RangeError(`layout: version ${v} is newer than this library understands (${LAYOUT_VERSION})`);\n while (v < LAYOUT_VERSION) {\n const step = MIGRATIONS[v];\n if (!step) throw new Error(`layout: no migration from version ${v}`);\n s = step(s);\n v++;\n }\n for (const k of [\"options\", \"panes\", \"series\", \"view\", \"plugins\"]) {\n if (!(k in s)) throw new TypeError(`layout: missing \"${k}\"`);\n }\n return s as unknown as ChartState;\n}\n\n/** Where layouts are kept. Async so a server-backed store fits the same shape. */\nexport interface LayoutStore {\n load(key: string): Promise<unknown | undefined>;\n save(key: string, state: unknown): Promise<void>;\n remove(key: string): Promise<void>;\n keys(): Promise<string[]>;\n}\n\nexport class MemoryStore implements LayoutStore {\n private readonly map = new Map<string, string>();\n async load(key: string): Promise<unknown | undefined> {\n const v = this.map.get(key);\n return v === undefined ? undefined : JSON.parse(v);\n }\n async save(key: string, state: unknown): Promise<void> {\n this.map.set(key, JSON.stringify(state));\n }\n async remove(key: string): Promise<void> {\n this.map.delete(key);\n }\n async keys(): Promise<string[]> {\n return [...this.map.keys()];\n }\n}\n\n/** localStorage under a prefix. Quota and privacy-mode failures reject. */\nexport class LocalStorageStore implements LayoutStore {\n constructor(private readonly prefix = \"alphacharts:\") {}\n async load(key: string): Promise<unknown | undefined> {\n const v = localStorage.getItem(this.prefix + key);\n return v === null ? undefined : JSON.parse(v);\n }\n async save(key: string, state: unknown): Promise<void> {\n localStorage.setItem(this.prefix + key, JSON.stringify(state));\n }\n async remove(key: string): Promise<void> {\n localStorage.removeItem(this.prefix + key);\n }\n async keys(): Promise<string[]> {\n const out: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (k?.startsWith(this.prefix)) out.push(k.slice(this.prefix.length));\n }\n return out;\n }\n}\n\n/** Options with functions removed (custom formatters are re-supplied on restore). */\nexport function plain(o: object): Record<string, unknown> {\n return JSON.parse(JSON.stringify(o, (_k, v) => (typeof v === \"function\" ? undefined : v))) as Record<string, unknown>;\n}\n","// Vertical mapping between price and CSS pixels inside a pane.\n//\n// A scale works in display units: price (linear), log10(price) (log),\n// percent change from a base price (percent), or price indexed to 100 at the\n// base (indexed). The base is the first visible bar of the scale's main\n// series, as traders expect: scrolling re-bases.\n//\n// Renderers upload a coordinate per value: the price itself, or log10(price)\n// for a log scale. y is affine in that coordinate in every mode (inverted\n// included), so the GPU transform stays one multiply-add: y = A + B · coord.\n//\n// With autoScale on, the range follows the visible bars' high/low every frame\n// (an O(log n) LOD query per series). Dragging the axis or panning vertically\n// turns autoScale off until the axis is double-clicked.\n\nimport type { AxisTick } from \"./ticks.js\";\n\nexport type PriceScaleMode = \"linear\" | \"log\" | \"percent\" | \"indexed\";\n\nexport interface PriceScaleOptions {\n /** Fractions of the pane height kept empty above and below the data. */\n marginTop: number;\n marginBottom: number;\n autoScale: boolean;\n mode: PriceScaleMode;\n /** Higher values lower on screen. */\n invert: boolean;\n /** Where the axis is drawn; \"none\" for overlay scales such as volume. */\n position: \"right\" | \"left\" | \"none\";\n visible: boolean;\n /** Minimum width of the axis in CSS px (the axis is otherwise as wide as its labels need); left and right axes. */\n minWidth?: number;\n}\n\n/** Throws on an option value the axis cannot use. */\nexport function checkPriceScaleOptions(o: Partial<PriceScaleOptions>): void {\n if (o.minWidth !== undefined && !(typeof o.minWidth === \"number\" && Number.isFinite(o.minWidth) && o.minWidth >= 0)) {\n throw new RangeError(`alphacharts: price scale minWidth must be a non-negative number of CSS px, got ${o.minWidth}`);\n }\n}\n\nexport const DEFAULT_PRICE_SCALE: PriceScaleOptions = {\n marginTop: 0.1,\n marginBottom: 0.1,\n autoScale: true,\n mode: \"linear\",\n invert: false,\n position: \"right\",\n visible: true,\n};\n\nexport class PriceScale {\n /** Visible range in display units. */\n min = 0;\n max = 1;\n /** Pane height in CSS px. */\n height = 0;\n /** Base price for percent and indexed modes. */\n base = 1;\n /** True once the range has been set from data or restored: before that min/max are placeholders. */\n ranged = false;\n /** @internal Layout of this frame: axis ticks and the axis column (CSS px). */\n ticks: AxisTick[] = [];\n /** @internal */ axisX = 0;\n /** @internal */ axisW = 0;\n\n constructor(readonly id: string, public options: PriceScaleOptions) {}\n\n get mode(): PriceScaleMode {\n return this.options.mode;\n }\n\n /** Values uploaded to the GPU are log10(price) on a log scale. */\n get logCoords(): boolean {\n return this.options.mode === \"log\";\n }\n\n private get innerTop(): number {\n return this.height * this.options.marginTop;\n }\n private get innerHeight(): number {\n return Math.max(1, this.height * (1 - this.options.marginTop - this.options.marginBottom));\n }\n\n /** CSS px per display unit. */\n get pxPerUnit(): number {\n return this.innerHeight / (this.max - this.min);\n }\n\n /** Price → display units (NaN for a non-positive price on a log scale). */\n display(p: number): number {\n switch (this.options.mode) {\n case \"linear\": return p;\n case \"log\": return p > 0 ? Math.log10(p) : Number.NaN;\n case \"percent\": return (p / this.base - 1) * 100;\n case \"indexed\": return (p / this.base) * 100;\n }\n }\n\n /** Display units → price. */\n fromDisplay(v: number): number {\n switch (this.options.mode) {\n case \"linear\": return v;\n case \"log\": return 10 ** v;\n case \"percent\": return (v / 100 + 1) * this.base;\n case \"indexed\": return (v / 100) * this.base;\n }\n }\n\n /** The coordinate renderers upload for a price. */\n coord(p: number): number {\n return this.logCoords ? (p > 0 ? Math.log10(p) : Number.NaN) : p;\n }\n\n /** CSS y of display value v. */\n yOfDisplay(v: number): number {\n return this.options.invert ? this.innerTop + (v - this.min) * this.pxPerUnit : this.innerTop + (this.max - v) * this.pxPerUnit;\n }\n\n y(price: number): number {\n return this.yOfDisplay(this.display(price));\n }\n\n displayAt(y: number): number {\n return this.options.invert ? this.min + (y - this.innerTop) / this.pxPerUnit : this.max - (y - this.innerTop) / this.pxPerUnit;\n }\n\n price(y: number): number {\n return this.fromDisplay(this.displayAt(y));\n }\n\n /** dy/dcoord in CSS px: signed, affine in every mode (see the header). */\n get pxPerCoord(): number {\n const k = this.pxPerUnit * (this.options.invert ? 1 : -1);\n switch (this.options.mode) {\n case \"linear\":\n case \"log\": return k;\n case \"percent\":\n case \"indexed\": return (k * 100) / this.base;\n }\n }\n\n /** CSS y of an uploaded coordinate. */\n yOfCoord(c: number): number {\n return this.yOfDisplay(this.logCoords ? c : this.display(c));\n }\n\n /** Apply an autoscale result in prices; a flat or empty range still gets a usable span. */\n fit(lo: number, hi: number): void {\n if (!(lo <= hi)) return; // NaN: nothing visible, keep the last range\n let a = this.display(lo), b = this.display(hi);\n if (this.logCoords && !(a === a)) a = b - 1; // non-positive low on a log scale\n if (!(a <= b)) return;\n if (b === a) {\n const pad = a === 0 ? 1 : Math.abs(a) * 0.005;\n a -= pad;\n b += pad;\n }\n this.min = a;\n this.max = b;\n this.ranged = true;\n }\n\n /** Stretch around the centre; factor > 1 zooms in. Turns autoScale off. */\n scale(factor: number): void {\n const mid = (this.min + this.max) / 2;\n const half = (this.max - this.min) / 2 / factor;\n if (!(half > 0) || !Number.isFinite(half)) return;\n this.min = mid - half;\n this.max = mid + half;\n this.ranged = true;\n this.options = { ...this.options, autoScale: false };\n }\n\n /** Move by dy CSS px (content follows the pointer). Turns autoScale off. */\n pan(dy: number): void {\n const d = (dy / this.pxPerUnit) * (this.options.invert ? -1 : 1);\n this.min += d;\n this.max += d;\n this.ranged = true;\n this.options = { ...this.options, autoScale: false };\n }\n}\n","// Axis tick marks.\n//\n// Price: \"nice\" steps (1, 2, 2.5, 5 × 10^k), never finer than the series'\n// minimum price move.\n//\n// Time: every bar has a weight — the coarsest calendar boundary crossed since\n// the previous bar (year > month > day > 12h > … > 1s), in the chart's time\n// zone. Labels go to the heaviest bars first, skipping any that would crowd\n// an accepted one. Candidates are generated from calendar boundaries in the\n// visible span and mapped to bars by binary search, so the cost tracks the\n// label count, not the bar count (10M bars visible costs the same as 1k).\n\nimport { civilFromLocal, DAY_MS, localFromCivil, type TimeZone } from \"../data/tz.js\";\nimport type { Formatter } from \"./format.js\";\nimport type { PriceScale } from \"./price-scale.js\";\nimport type { Timeline } from \"../data/timeline.js\";\n\n// ---- price ---------------------------------------------------------------\n\n/** Tick prices from lo to hi, about `targetGapPx` apart. */\nexport function priceTicks(lo: number, hi: number, heightPx: number, targetGapPx: number, minMove: number): { step: number; ticks: number[] } {\n const n = Math.max(1, heightPx / targetGapPx);\n const step = niceStep((hi - lo) / n, minMove);\n const ticks: number[] = [];\n if (!(step > 0) || !Number.isFinite(lo) || !Number.isFinite(hi)) return { step, ticks };\n const start = Math.ceil(lo / step);\n const end = Math.floor(hi / step);\n for (let k = start; k <= end && ticks.length < 200; k++) ticks.push(roundTo(k * step, step));\n return { step, ticks };\n}\n\n/** About `count` nice tick values across [lo, hi], for scales that are not prices (no minimum move). */\nexport function niceTicks(lo: number, hi: number, count: number): { step: number; ticks: number[] } {\n return priceTicks(lo, hi, Math.max(1, count), 1, 0);\n}\n\n/**\n * Smallest 1/2/2.5/5 × 10^k step at or above `raw` that is a whole multiple of\n * `minMove`. The multiple rule keeps every tick on a price the series'\n * formatter shows exactly: a 2.5 step under a 0.01 minMove would put the\n * label \"100.03\" on a gridline at 100.025.\n */\nexport function niceStep(raw: number, minMove: number): number {\n if (!(raw > 0) || !Number.isFinite(raw)) return minMove > 0 ? minMove : 0;\n const multiple = (s: number) => !(minMove > 0) || (s >= minMove * (1 - 1e-9) && Math.abs(s / minMove - Math.round(s / minMove)) < 1e-6);\n for (let e = Math.floor(Math.log10(raw)); e < 400; e++) {\n const p = Math.pow(10, e);\n for (const f of [1, 2, 2.5, 5]) {\n const st = f * p;\n if (st >= raw * (1 - 1e-12) && multiple(st)) return st;\n }\n }\n return minMove;\n}\n\n/** Remove binary noise (0.30000000000000004) without changing the tick. */\nfunction roundTo(v: number, step: number): number {\n const d = Math.max(0, -Math.floor(Math.log10(step)) + 2);\n return +v.toFixed(Math.min(d, 15));\n}\n\nexport interface AxisTick {\n price: number;\n label: string;\n}\n\n/** Text for a price on a scale's axis, in the scale's mode. */\nexport function axisText(sc: PriceScale, fmt: Formatter | undefined, price: number): string {\n switch (sc.mode) {\n case \"percent\": return `${sc.display(price).toFixed(2)}%`;\n case \"indexed\": return sc.display(price).toFixed(2);\n default: return fmt ? fmt.format(price) : String(price);\n }\n}\n\n/** Ticks for a price scale about `gapPx` apart, in its mode. */\nexport function scaleTicks(sc: PriceScale, fmt: Formatter | undefined, gapPx: number): AxisTick[] {\n const h = sc.height;\n if (!(h > 0) || !(sc.max > sc.min)) return [];\n const label = (p: number) => ({ price: p, label: axisText(sc, fmt, p) });\n if (sc.mode === \"percent\" || sc.mode === \"indexed\") {\n return priceTicks(sc.min, sc.max, h, gapPx, 0.01).ticks.map((v) => label(sc.fromDisplay(v)));\n }\n if (sc.mode === \"log\" && sc.max - sc.min > 0.3) return logTicks(sc, gapPx).map(label);\n // Linear, or a log scale spanning less than a factor of 2: plain price steps.\n const a = sc.price(0), b = sc.price(h);\n return priceTicks(Math.min(a, b), Math.max(a, b), h, gapPx, fmt?.minMove ?? 0).ticks.map(label);\n}\n\n/** 1-2-5 (or every mantissa, or every n-th decade) prices, by available room. */\nfunction logTicks(sc: PriceScale, gapPx: number): number[] {\n const pxPerDecade = sc.pxPerUnit;\n const mantissas = pxPerDecade >= gapPx * 9 ? [1, 2, 3, 4, 5, 6, 7, 8, 9] : pxPerDecade >= gapPx * 3 ? [1, 2, 5] : [1];\n const every = Math.max(1, Math.ceil(gapPx / pxPerDecade));\n const out: number[] = [];\n let lastY = Number.POSITIVE_INFINITY;\n for (let e = Math.floor(sc.min); e <= Math.ceil(sc.max) && out.length < 200; e++) {\n if (mantissas.length === 1 && e % every !== 0) continue;\n for (const m of mantissas) {\n const v = m * 10 ** e;\n const d = Math.log10(v);\n if (d < sc.min || d > sc.max) continue;\n const y = sc.y(v);\n if (Math.abs(lastY - y) < gapPx) continue;\n out.push(+v.toPrecision(12));\n lastY = y;\n }\n }\n return out;\n}\n\n// ---- time ----------------------------------------------------------------\n\nexport const W_YEAR = 20;\nexport const W_MONTH = 19;\nexport const W_DAY = 18;\nconst FIXED: readonly [number, number][] = [\n [17, 12 * 3_600_000],\n [16, 6 * 3_600_000],\n [15, 3 * 3_600_000],\n [14, 3_600_000],\n [13, 30 * 60_000],\n [12, 15 * 60_000],\n [11, 5 * 60_000],\n [10, 60_000],\n [9, 30_000],\n [8, 15_000],\n [7, 5_000],\n [6, 1_000],\n];\n\n/** Weight of a bar at t whose predecessor is at prev (NaN for the first bar). */\nexport function weightBetween(tz: TimeZone, prev: number, t: number): number {\n if (prev !== prev) return W_YEAR;\n return weightLocal(prev + tz.offset(prev), t + tz.offset(t));\n}\n\n/**\n * Weight between two local-time instants. Calendar fields are computed only\n * when the local day changes (rare for intraday bars); within a day the\n * fixed periods are integer divisions, so a scan over thousands of bars\n * allocates nothing.\n */\nexport function weightLocal(la: number, lb: number, minWeight = 0): number {\n if (Math.floor(la / DAY_MS) !== Math.floor(lb / DAY_MS)) {\n const a = civilFromLocal(la);\n const b = civilFromLocal(lb);\n if (a.year !== b.year) return W_YEAR;\n if (a.month !== b.month) return W_MONTH;\n return W_DAY;\n }\n for (const [w, p] of FIXED) {\n if (w < minWeight) return 0;\n if (Math.floor(la / p) !== Math.floor(lb / p)) return w;\n }\n return 0;\n}\n\n/**\n * Lightest weight that can still win a label: a boundary that recurs more\n * often than every half label gap (in wall time per bar) never survives the\n * spacing check, so collecting it is wasted work.\n */\nfunction minUsefulWeight(msPerBar: number, spacing: number, gapPx: number): number {\n const minPeriod = (msPerBar * gapPx) / spacing / 2;\n let w = W_DAY;\n for (const [fw, p] of FIXED) if (p >= minPeriod) w = fw;\n return minPeriod > FIXED[0]![1] ? W_DAY : w;\n}\n\nexport interface TimeTick {\n index: number;\n weight: number;\n x: number;\n}\n\n/**\n * Labels for indices [lo, hi] at the given scale. `x(i)` maps an index to CSS\n * px; `gapPx` is the minimum distance between label centres.\n */\nexport function timeTicks(tl: Timeline, tz: TimeZone, lo: number, hi: number, x: (i: number) => number, spacing: number, gapPx: number): TimeTick[] {\n if (hi < lo || tl.length === 0) return [];\n const cands: TimeTick[] = [];\n const time = (i: number) => (i > tl.first ? tl.timeAt(i - 1) : Number.NaN);\n const t0 = tl.timeAt(lo);\n const t1 = tl.timeAt(hi);\n // Every bar that can win a label is the first bar after a calendar\n // boundary at least as long as the lightest useful weight, so candidates\n // come from those boundaries by binary search: cost follows the label\n // count, not the number of visible bars.\n const msPerBar = hi > lo ? (t1 - t0) / (hi - lo) : 0;\n const minW = msPerBar > 0 ? minUsefulWeight(msPerBar, spacing, gapPx) : 0;\n const finest = msPerBar > 0 ? (msPerBar * gapPx) / spacing / 2 : 1000;\n const seen = new Set<number>();\n const add = (boundary: number) => {\n const i = tl.lowerBound(boundary);\n if (i < lo || i > hi || seen.has(i)) return;\n seen.add(i);\n const w = weightBetween(tz, time(i), tl.timeAt(i));\n if (w > 0 && w >= minW) cands.push({ index: i, weight: w, x: x(i) });\n };\n add(t0);\n boundaries(tz, t0, t1, finest, add);\n // Heaviest first; among equals, left to right.\n cands.sort((a, b) => b.weight - a.weight || a.index - b.index);\n const out: TimeTick[] = [];\n for (const c of cands) {\n let ok = true;\n for (const o of out) {\n if (Math.abs(o.x - c.x) < gapPx) {\n ok = false;\n break;\n }\n }\n if (ok) out.push(c);\n if (out.length > 200) break;\n }\n out.sort((a, b) => a.index - b.index);\n return out;\n}\n\n/** Call `add` with calendar boundaries in [t0, t1] no finer than `finest` ms apart. */\nfunction boundaries(tz: TimeZone, t0: number, t1: number, finest: number, add: (t: number) => void): void {\n const c0 = tz.civil(t0);\n const c1 = tz.civil(t1);\n for (let y = c0.year + 1; y <= c1.year; y++) add(tz.fromLocal(localFromCivil(y, 1, 1)));\n if (finest >= 300 * DAY_MS) return;\n const monthStep = finest >= 90 * DAY_MS ? 3 : 1;\n for (let y = c0.year, m = c0.month; y < c1.year || (y === c1.year && m <= c1.month); ) {\n m += 1;\n if (m > 12) {\n m = 1;\n y += 1;\n }\n if ((m - 1) % monthStep === 0) add(tz.fromLocal(localFromCivil(y, m, 1)));\n }\n if (finest >= 25 * DAY_MS) return;\n let step = DAY_MS;\n for (const [, p] of FIXED) if (p >= finest) step = p;\n if (finest > DAY_MS) step = DAY_MS * Math.min(7, Math.ceil(finest / DAY_MS));\n const l0 = t0 + tz.offset(t0);\n const l1 = t1 + tz.offset(t1);\n let n = 0;\n for (let l = Math.ceil(l0 / step) * step; l <= l1 && n < 2000; l += step, n++) add(tz.fromLocal(l));\n}\n\n// ---- formatting ------------------------------------------------------------\n\n/**\n * Host-supplied text for the time axis and the crosshair's time label, for a\n * chart whose x axis is not a clock (an ordinal axis of Renko bricks, say).\n * `kind` says where the text goes: \"tick\" (axis) or \"crosshair\".\n */\nexport type TimeLabel = (time: number, kind: \"tick\" | \"crosshair\") => string;\n\n/** The host's label when it set one, else the calendar label. A host label that is not a string throws. */\nexport function timeText(custom: TimeLabel | undefined, kind: \"tick\" | \"crosshair\", time: number, calendar: () => string): string {\n if (!custom) return calendar();\n const s = custom(time, kind);\n if (typeof s !== \"string\") throw new TypeError(`alphacharts: timeLabel(${time}, \"${kind}\") returned ${typeof s}, not a string`);\n return s;\n}\n\nexport class TimeFormatter {\n private readonly year: Intl.DateTimeFormat;\n private readonly month: Intl.DateTimeFormat;\n private readonly day: Intl.DateTimeFormat;\n private readonly hm: Intl.DateTimeFormat;\n private readonly hms: Intl.DateTimeFormat;\n private readonly full: Intl.DateTimeFormat;\n private readonly fullDate: Intl.DateTimeFormat;\n\n /** The crosshair label's own format (the `timeFormat` option), when set. */\n private readonly custom: Intl.DateTimeFormat | undefined;\n\n constructor(locale: string | undefined, tz: TimeZone, timeFormat?: Intl.DateTimeFormatOptions) {\n const timeZone = tz.id;\n if (timeFormat && \"timeZone\" in timeFormat) throw new Error(\"alphacharts: timeFormat must not set timeZone; use the chart's timeZone option\");\n this.custom = timeFormat ? new Intl.DateTimeFormat(locale, { ...timeFormat, timeZone }) : undefined;\n this.year = new Intl.DateTimeFormat(locale, { timeZone, year: \"numeric\" });\n this.month = new Intl.DateTimeFormat(locale, { timeZone, month: \"short\" });\n this.day = new Intl.DateTimeFormat(locale, { timeZone, day: \"numeric\" });\n this.hm = new Intl.DateTimeFormat(locale, { timeZone, hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" });\n this.hms = new Intl.DateTimeFormat(locale, { timeZone, hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", hourCycle: \"h23\" });\n this.full = new Intl.DateTimeFormat(locale, {\n timeZone, weekday: \"short\", day: \"numeric\", month: \"short\", year: \"2-digit\", hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\",\n });\n this.fullDate = new Intl.DateTimeFormat(locale, { timeZone, weekday: \"short\", day: \"numeric\", month: \"short\", year: \"2-digit\" });\n }\n\n private readonly cache = new Map<number, string>();\n\n /** Axis label for a bar; cached, since the same labels repeat every frame. */\n tick(t: number, weight: number): string {\n const key = t * 32 + weight;\n let s = this.cache.get(key);\n if (s === undefined) {\n if (this.cache.size > 4096) this.cache.clear();\n s = this.tickUncached(t, weight);\n this.cache.set(key, s);\n }\n return s;\n }\n\n private tickUncached(t: number, weight: number): string {\n if (weight >= W_YEAR) return this.year.format(t);\n if (weight >= W_MONTH) return this.month.format(t);\n if (weight >= W_DAY) return this.day.format(t);\n if (weight >= 10) return this.hm.format(t);\n return this.hms.format(t);\n }\n\n crosshair(t: number, withTime: boolean): string {\n if (this.custom) return this.custom.format(t);\n return (withTime ? this.full : this.fullDate).format(t);\n }\n}\n\nexport class PriceFormatter {\n readonly decimals: number;\n constructor(readonly minMove: number) {\n if (!(minMove > 0)) throw new RangeError(`minMove must be positive, got ${minMove}`);\n // Decimals needed to show minMove exactly (0.25 → 2, 0.05 → 2, 1 → 0).\n let d = 0;\n while (d < 10 && Math.abs(Math.round(minMove * 10 ** d) - minMove * 10 ** d) > 1e-9 * 10 ** d) d++;\n this.decimals = d;\n }\n format(p: number): string {\n return p.toFixed(this.decimals);\n }\n}\n","// Horizontal mapping between timeline index and CSS pixels inside a pane.\n//\n// The view is two numbers: `spacing` (CSS px per bar) and `rightOffset` (bars\n// between the last bar and the right edge; negative when scrolled into\n// history). Anchoring on the last bar is what makes \"follow the live bar\" free:\n// appending a bar with rightOffset unchanged scrolls the view by one bar.\n\nexport interface TimeScaleOptions {\n /** Initial and reset bar spacing in CSS px. */\n barSpacing: number;\n maxBarSpacing: number;\n /** Bars of empty space right of the last bar at reset. */\n rightOffset: number;\n}\n\nexport const DEFAULT_TIME_SCALE: TimeScaleOptions = { barSpacing: 8, maxBarSpacing: 80, rightOffset: 4 };\n\nexport class TimeScale {\n spacing: number;\n rightOffset: number;\n /** Pane width in CSS px. */\n width = 0;\n /** Timeline bounds, kept in sync by the chart: [first, end). */\n first = 0;\n end = 0;\n\n constructor(readonly options: TimeScaleOptions) {\n this.spacing = options.barSpacing;\n this.rightOffset = options.rightOffset;\n }\n\n get last(): number {\n return this.end - 1;\n }\n\n /** Logical (fractional index) coordinate at the right edge. */\n get right(): number {\n return this.last + 0.5 + this.rightOffset;\n }\n get left(): number {\n return this.right - this.width / this.spacing;\n }\n\n /** CSS x of index i's centre. */\n x(i: number): number {\n return this.width - (this.right - i) * this.spacing;\n }\n\n /** Fractional index at CSS x. */\n logical(x: number): number {\n return this.right - (this.width - x) / this.spacing;\n }\n\n /** Nearest whole index at CSS x (may lie outside the data). */\n indexAt(x: number): number {\n return Math.round(this.logical(x));\n }\n\n /** First and last index intersecting the view, clamped to the data. Empty when hi < lo. */\n visible(out: { lo: number; hi: number } = { lo: 0, hi: -1 }): { lo: number; hi: number } {\n out.lo = Math.max(this.first, Math.floor(this.left + 0.5));\n out.hi = Math.min(this.last, Math.ceil(this.right - 0.5));\n return out;\n }\n\n /** True while the last bar is on screen; a new bar then scrolls the view. */\n get following(): boolean {\n return this.x(this.last) <= this.width + this.spacing * 0.5;\n }\n\n minSpacing(): number {\n const n = Math.max(1, this.end - this.first);\n // Let the whole history fit with room to spare, but never below what a\n // 1M-px-wide screen could need.\n return Math.max(1e-7, Math.min(0.5, (this.width / n) * 0.5));\n }\n\n zoom(anchorX: number, factor: number): void {\n const at = this.logical(anchorX);\n this.spacing = clamp(this.spacing * factor, this.minSpacing(), this.options.maxBarSpacing);\n this.setRight(at + (this.width - anchorX) / this.spacing);\n }\n\n /** Content follows a drag of dx CSS px. */\n pan(dx: number): void {\n this.setRight(this.right - dx / this.spacing);\n }\n\n scrollToLatest(): void {\n this.rightOffset = this.options.rightOffset;\n this.clamp();\n }\n\n scrollToStart(): void {\n this.setRight(this.first - 0.5 + this.width / this.spacing - this.options.rightOffset);\n }\n\n reset(): void {\n this.spacing = this.options.barSpacing;\n this.scrollToLatest();\n }\n\n fitAll(): void {\n const n = Math.max(1, this.end - this.first + this.options.rightOffset);\n this.spacing = clamp(this.width / n, this.minSpacing(), this.options.maxBarSpacing);\n this.rightOffset = this.options.rightOffset;\n this.clamp();\n }\n\n /** Show [lo, hi] (fractional indices) across the full width. */\n setRange(lo: number, hi: number): void {\n if (!(hi > lo)) return;\n this.spacing = clamp(this.width / (hi - lo), this.minSpacing(), this.options.maxBarSpacing);\n this.setRight(hi);\n }\n\n setRight(right: number): void {\n this.rightOffset = right - this.last - 0.5;\n this.clamp();\n }\n\n clamp(): void {\n if (this.width <= 0 || this.end <= this.first) return;\n this.spacing = clamp(this.spacing, this.minSpacing(), this.options.maxBarSpacing);\n const barsWide = this.width / this.spacing;\n // Keep at least ~2 bars (or the whole series, if smaller) on screen.\n const keep = Math.min(2, this.end - this.first);\n const maxOffset = barsWide - 0.5 - keep;\n const minOffset = this.first - this.last - 0.5 + keep;\n this.rightOffset = clamp(this.rightOffset, minOffset, Math.max(minOffset, maxOffset));\n }\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v;\n}\n","// One requestAnimationFrame loop for every chart on the page. Charts mark\n// layers dirty; the loop renders each dirty chart once per frame, so 100 Hz\n// ticks or a dashboard of synced charts never render more than once per\n// display refresh.\n\nimport { emitFault } from \"../fault.js\";\n\nexport const LAYER_BG = 1;\nexport const LAYER_GL = 2;\nexport const LAYER_OVERLAY = 4;\nexport const LAYER_ALL = LAYER_BG | LAYER_GL | LAYER_OVERLAY;\n\nexport interface Renderable {\n render(layers: number, now: number): void;\n}\n\nconst dirty = new Map<Renderable, number>();\nlet raf = 0;\n\nexport function requestRender(r: Renderable, layers: number): void {\n dirty.set(r, (dirty.get(r) ?? 0) | layers);\n if (raf === 0) raf = requestAnimationFrame(frame);\n}\n\nexport function cancelRender(r: Renderable): void {\n dirty.delete(r);\n}\n\nfunction frame(now: number): void {\n raf = 0;\n // Snapshot: a render may request the next frame (kinetic scroll).\n const batch = [...dirty];\n dirty.clear();\n // One chart's failure must not freeze the others: render every chart,\n // then surface the first error.\n let failure: { error: unknown } | null = null;\n for (const [r, layers] of batch) {\n try {\n r.render(layers, now);\n } catch (error) {\n failure ??= { error };\n }\n }\n if (failure) {\n emitFault({ source: \"draw-loop\", error: failure.error });\n throw failure.error;\n }\n}\n","// Pointer, wheel and keyboard input for one chart.\n//\n// Pointer Events cover mouse, pen and touch:\n// - drag in a pane pans time (and price when its scale is not autoscaling),\n// then coasts with kinetic decay;\n// - drag on a price axis scales price, on the time axis scales time;\n// - drag on a separator resizes panes;\n// - two touch pointers pinch-zoom around their midpoint.\n// The wheel zooms around the pointer (vertical wheel, or ctrl+wheel, which is\n// how macOS trackpads report a pinch) and pans on horizontal deltas.\n// Touch: long-press turns the drag into a crosshair that follows the finger;\n// two quick taps act as a double-click. Kinetic scrolling is off under\n// prefers-reduced-motion.\n// Keyboard: chart.options().keymap (TradingView-like defaults: ←/→ pan, ↑/↓\n// and +/− zoom, Home/End, Shift+←/→ step the crosshair one bar, announced to\n// screen readers, Esc hides it, Alt+R resets).\n\nimport type { Chart } from \"../chart/chart.js\";\nimport { LAYER_OVERLAY } from \"../chart/scheduler.js\";\n\ntype Drag =\n | { kind: \"pan\"; pane: number; x: number; y: number; moved: boolean }\n | { kind: \"priceAxis\"; pane: number; scaleId: string; y: number; moved: boolean }\n | { kind: \"timeAxis\"; x: number; moved: boolean }\n | { kind: \"separator\"; index: number; y: number; moved: boolean }\n /** A plugin consumed the pointer-down: it gets the move/up, the chart does nothing. */\n | { kind: \"plugin\"; moved: boolean }\n /** Touch long-press: the crosshair follows the finger instead of panning. */\n | { kind: \"crosshair\"; pane: number; moved: boolean };\n\nconst DRAG_SLOP = 3;\nconst KINETIC_MIN = 0.15; // px/ms to start coasting\nconst KINETIC_STOP = 0.02;\n\nexport class Interaction {\n private drag: Drag | null = null;\n private readonly pointers = new Map<number, { x: number; y: number; type: string }>();\n private pinch: { dist: number; mid: number } | null = null;\n private samples: { t: number; x: number }[] = [];\n private kinetic = 0;\n private rect: DOMRect | null = null;\n private longPress = 0;\n private lastTap = { t: 0, x: 0, y: 0 };\n\n constructor(private readonly chart: Chart, private readonly root: HTMLElement, private readonly surface: HTMLElement) {\n surface.addEventListener(\"pointerdown\", this.down);\n surface.addEventListener(\"pointermove\", this.move);\n surface.addEventListener(\"pointerup\", this.up);\n surface.addEventListener(\"pointercancel\", this.up);\n surface.addEventListener(\"pointerleave\", this.leave);\n surface.addEventListener(\"dblclick\", this.dbl);\n surface.addEventListener(\"wheel\", this.wheel, { passive: false });\n root.addEventListener(\"keydown\", this.key);\n }\n\n dispose(): void {\n this.stopKinetic();\n this.cancelLongPress();\n const s = this.surface;\n s.removeEventListener(\"pointerdown\", this.down);\n s.removeEventListener(\"pointermove\", this.move);\n s.removeEventListener(\"pointerup\", this.up);\n s.removeEventListener(\"pointercancel\", this.up);\n s.removeEventListener(\"pointerleave\", this.leave);\n s.removeEventListener(\"dblclick\", this.dbl);\n s.removeEventListener(\"wheel\", this.wheel);\n this.root.removeEventListener(\"keydown\", this.key);\n }\n\n private twoPointers(): [{ x: number; y: number }, { x: number; y: number }] {\n const [a, b] = this.pointers.values();\n return [a!, b!];\n }\n\n private local(e: { clientX: number; clientY: number }): { x: number; y: number } {\n const r = this.rect ?? this.root.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n }\n\n private readonly down = (e: PointerEvent): void => {\n this.stopKinetic();\n this.rect = this.root.getBoundingClientRect();\n const p = this.local(e);\n this.pointers.set(e.pointerId, { ...p, type: e.pointerType });\n this.surface.setPointerCapture(e.pointerId);\n this.root.focus({ preventScroll: true });\n if (this.pointers.size === 2) {\n const [a, b] = this.twoPointers();\n this.pinch = { dist: Math.hypot(a.x - b.x, a.y - b.y), mid: (a.x + b.x) / 2 };\n this.drag = null;\n return;\n }\n if (this.pointers.size > 2) return;\n const r = this.chart.region(p.x, p.y);\n if (r.kind === \"pane\" && this.chart.pluginPointer(\"down\", p.x, p.y, e)) {\n this.drag = { kind: \"plugin\", moved: false };\n return;\n }\n switch (r.kind) {\n case \"pane\":\n this.drag = { kind: \"pan\", pane: r.pane, x: p.x, y: p.y, moved: false };\n this.samples = [{ t: e.timeStamp, x: p.x }];\n if (e.pointerType === \"touch\") {\n const pane = r.pane;\n this.longPress = window.setTimeout(() => {\n this.longPress = 0;\n if (this.drag?.kind === \"pan\" && !this.drag.moved) this.drag = { kind: \"crosshair\", pane, moved: false };\n }, 450);\n }\n if (e.pointerType !== \"mouse\") this.chart.setCrosshair({ x: p.x, y: r.y, pane: r.pane }, \"pointer\");\n break;\n case \"priceAxis\":\n this.drag = { kind: \"priceAxis\", pane: r.pane, scaleId: r.scaleId, y: p.y, moved: false };\n break;\n case \"timeAxis\":\n this.drag = { kind: \"timeAxis\", x: p.x, moved: false };\n break;\n case \"separator\":\n this.drag = { kind: \"separator\", index: r.index, y: p.y, moved: false };\n break;\n case \"none\":\n this.drag = null;\n }\n };\n\n private readonly move = (e: PointerEvent): void => {\n const p = this.local(e);\n const ptr = this.pointers.get(e.pointerId);\n if (ptr) {\n ptr.x = p.x;\n ptr.y = p.y;\n }\n const opts = this.chart.interactionOptions;\n if (this.pinch && this.pointers.size === 2) {\n const [a, b] = this.twoPointers();\n const dist = Math.hypot(a.x - b.x, a.y - b.y);\n const mid = (a.x + b.x) / 2;\n const area = this.chart.paneArea;\n this.chart.viewChanged(() => {\n if (opts.pan) this.chart.time.pan(mid - this.pinch!.mid);\n if (opts.zoom && this.pinch!.dist > 0) this.chart.time.zoom(mid - area.x, dist / this.pinch!.dist);\n });\n this.pinch = { dist, mid };\n return;\n }\n const d = this.drag;\n if (!d) {\n this.chart.pluginPointer(\"move\", p.x, p.y, e);\n this.hover(p.x, p.y, e.pointerType);\n return;\n }\n switch (d.kind) {\n case \"crosshair\": {\n d.moved = true;\n const r = this.chart.region(p.x, p.y);\n if (r.kind === \"pane\") this.chart.setCrosshair({ x: p.x, y: r.y, pane: r.pane }, \"pointer\");\n break;\n }\n case \"plugin\":\n d.moved = true;\n this.chart.pluginPointer(\"move\", p.x, p.y, e);\n if (e.pointerType === \"mouse\") this.hover(p.x, p.y, e.pointerType);\n break;\n case \"pan\": {\n const dx = p.x - d.x, dy = p.y - d.y;\n if (!d.moved && Math.hypot(dx, dy) < DRAG_SLOP) return;\n d.moved = true;\n this.cancelLongPress();\n if (opts.pan) {\n this.chart.viewChanged(() => this.chart.time.pan(dx));\n this.chart.panPrice(d.pane, dy);\n }\n d.x = p.x;\n d.y = p.y;\n this.samples.push({ t: e.timeStamp, x: p.x });\n if (this.samples.length > 8) this.samples.shift();\n if (e.pointerType === \"mouse\") this.hover(p.x, p.y, e.pointerType);\n else this.chart.setCrosshair(null, \"pointer\");\n break;\n }\n case \"priceAxis\": {\n const dy = p.y - d.y;\n d.moved ||= Math.abs(dy) > 0;\n if (opts.zoom) this.chart.scalePrice(d.pane, d.scaleId, Math.exp(-dy * 0.005));\n d.y = p.y;\n break;\n }\n case \"timeAxis\": {\n const dx = p.x - d.x;\n d.moved ||= Math.abs(dx) > 0;\n const area = this.chart.paneArea;\n if (opts.zoom) this.chart.viewChanged(() => this.chart.time.zoom(area.width, Math.exp(dx * 0.005)));\n d.x = p.x;\n break;\n }\n case \"separator\": {\n const dy = p.y - d.y;\n d.moved ||= Math.abs(dy) > 0;\n this.chart.resizePanes(d.index, dy);\n d.y = p.y;\n break;\n }\n }\n };\n\n private readonly up = (e: PointerEvent): void => {\n this.pointers.delete(e.pointerId);\n if (this.surface.hasPointerCapture(e.pointerId)) this.surface.releasePointerCapture(e.pointerId);\n if (this.pointers.size < 2) this.pinch = null;\n const d = this.drag;\n this.drag = null;\n this.rect = null;\n this.cancelLongPress();\n if (!d || e.type === \"pointercancel\") return;\n if (d.kind === \"plugin\") {\n const p = this.local(e);\n this.chart.pluginPointer(\"up\", p.x, p.y, e);\n return;\n }\n if (d.kind === \"crosshair\") return;\n if (!d.moved) {\n const p = this.local(e);\n // Touch has no dblclick event: two taps within 300 ms and 24 px act as one.\n if (e.pointerType === \"touch\") {\n const tap = this.lastTap;\n if (e.timeStamp - tap.t < 300 && Math.hypot(p.x - tap.x, p.y - tap.y) < 24) {\n this.lastTap = { t: 0, x: 0, y: 0 };\n this.doubleAt(p.x, p.y, e);\n return;\n }\n this.lastTap = { t: e.timeStamp, x: p.x, y: p.y };\n }\n if (!this.chart.pluginPointer(\"click\", p.x, p.y, e)) this.chart.pointerEvent(\"click\");\n return;\n }\n if (d.kind === \"pan\" && this.chart.interactionOptions.kinetic && !this.chart.reducedMotion) this.startKinetic(e.timeStamp);\n };\n\n private readonly leave = (e: PointerEvent): void => {\n if (e.pointerType === \"mouse\" && !this.drag) {\n const p = this.local(e);\n this.chart.pluginPointer(\"leave\", p.x, p.y, e);\n this.chart.setCrosshair(null, \"pointer\");\n }\n };\n\n private readonly dbl = (e: MouseEvent): void => {\n const p = this.local(e);\n this.doubleAt(p.x, p.y, e);\n };\n\n private doubleAt(x: number, y: number, e: MouseEvent): void {\n const p = { x, y };\n const r = this.chart.region(p.x, p.y);\n if (r.kind === \"priceAxis\") this.chart.resetPriceScale(r.pane, r.scaleId);\n else if (r.kind === \"timeAxis\") this.chart.timeScale.reset();\n else if (r.kind === \"pane\" && !this.chart.pluginPointer(\"dblclick\", p.x, p.y, e)) this.chart.pointerEvent(\"dblclick\");\n }\n\n private cancelLongPress(): void {\n if (this.longPress) clearTimeout(this.longPress);\n this.longPress = 0;\n }\n\n private readonly wheel = (e: WheelEvent): void => {\n const opts = this.chart.interactionOptions;\n if (!opts.zoom && !opts.pan) return;\n e.preventDefault();\n this.stopKinetic();\n const unit = e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? this.root.clientHeight : 1;\n const dx = e.deltaX * unit, dy = e.deltaY * unit;\n const p = this.local(e);\n const area = this.chart.paneArea;\n this.chart.viewChanged(() => {\n if (e.ctrlKey || e.metaKey) {\n if (opts.zoom) this.chart.time.zoom(p.x - area.x, Math.exp(-dy * 0.01));\n } else if (Math.abs(dx) > Math.abs(dy)) {\n if (opts.pan) this.chart.time.pan(-dx);\n } else if (e.shiftKey) {\n if (opts.pan) this.chart.time.pan(-dy);\n } else if (opts.zoom) {\n this.chart.time.zoom(p.x - area.x, Math.exp(-dy * 0.002));\n }\n });\n this.hover(p.x, p.y, \"mouse\");\n };\n\n private readonly key = (e: KeyboardEvent): void => {\n if (this.chart.pluginKey(e)) {\n e.preventDefault();\n return;\n }\n if (!this.chart.interactionOptions.keyboard) return;\n const t = this.chart.time;\n const area = this.chart.paneArea;\n const action = this.chart.keyAction(e);\n const handled = action !== undefined;\n switch (action) {\n case \"panLeft\": this.chart.viewChanged(() => t.pan(area.width * 0.1)); break;\n case \"panRight\": this.chart.viewChanged(() => t.pan(-area.width * 0.1)); break;\n case \"zoomIn\": this.chart.viewChanged(() => t.zoom(area.width, 1.25)); break;\n case \"zoomOut\": this.chart.viewChanged(() => t.zoom(area.width, 0.8)); break;\n case \"scrollToStart\": this.chart.timeScale.scrollToStart(); break;\n case \"scrollToLatest\": this.chart.timeScale.scrollToLatest(); break;\n case \"crosshairLeft\": this.stepCrosshair(-1); break;\n case \"crosshairRight\": this.stepCrosshair(1); break;\n case \"hideCrosshair\": this.chart.setCrosshair(null, \"keyboard\"); break;\n case \"resetChart\": this.chart.resetChart(); break;\n case undefined: break;\n }\n if (handled) e.preventDefault();\n };\n\n /** Move the keyboard crosshair one bar, keeping it on screen. */\n private stepCrosshair(dir: -1 | 1): void {\n const c = this.chart, t = c.time, area = c.paneArea;\n if (t.end <= t.first) return;\n let i = c.crosshairIndex() ?? Math.min(t.last, Math.max(t.first, t.indexAt(area.width / 2)));\n i = Math.max(t.first, Math.min(t.last, i + (c.crosshair ? dir : 0)));\n let x = t.x(i);\n if (x < 0 || x > area.width) {\n c.viewChanged(() => t.pan(x < 0 ? -x + t.spacing : area.width - x - t.spacing));\n x = t.x(i);\n }\n c.setCrosshair({ x: area.x + x, y: c.crosshair?.y ?? 0, pane: c.crosshair?.pane ?? 0 }, \"keyboard\");\n }\n\n private hover(x: number, y: number, pointerType: string): void {\n const r = this.chart.region(x, y);\n let cursor = \"default\";\n switch (r.kind) {\n case \"pane\":\n cursor = this.chart.primitiveCursor(r.pane, r.x, r.y) ?? (this.drag ? \"grabbing\" : \"crosshair\");\n if (pointerType === \"mouse\" || pointerType === \"pen\") this.chart.setCrosshair({ x, y: r.y, pane: r.pane }, \"pointer\");\n break;\n case \"priceAxis\": cursor = \"ns-resize\"; this.chart.setCrosshair(null, \"pointer\"); break;\n case \"timeAxis\": cursor = \"ew-resize\"; this.chart.setCrosshair(null, \"pointer\"); break;\n case \"separator\": cursor = \"row-resize\"; break;\n case \"none\": this.chart.setCrosshair(null, \"pointer\");\n }\n if (this.surface.style.cursor !== cursor) this.surface.style.cursor = cursor;\n }\n\n private startKinetic(now: number): void {\n const s = this.samples;\n const first = s.find((x) => now - x.t < 100) ?? s[0];\n const last = s[s.length - 1];\n if (!first || !last || last.t === first.t) return;\n let v = (last.x - first.x) / (last.t - first.t);\n if (Math.abs(v) < KINETIC_MIN) return;\n let prev = performance.now();\n const step = (t: number) => {\n const dt = Math.min(64, t - prev);\n prev = t;\n this.chart.viewChanged(() => this.chart.time.pan(v * dt));\n v *= Math.pow(0.95, dt / 16);\n this.kinetic = Math.abs(v) > KINETIC_STOP ? requestAnimationFrame(step) : 0;\n };\n this.kinetic = requestAnimationFrame(step);\n this.chart.invalidate(LAYER_OVERLAY);\n }\n\n private stopKinetic(): void {\n if (this.kinetic) cancelAnimationFrame(this.kinetic);\n this.kinetic = 0;\n }\n}\n","export class Emitter<E extends { [K in keyof E]: unknown }> {\n private readonly map = new Map<keyof E, Set<(e: never) => void>>();\n\n on<K extends keyof E>(type: K, fn: (e: E[K]) => void): () => void {\n let set = this.map.get(type);\n if (!set) this.map.set(type, (set = new Set()));\n set.add(fn as (e: never) => void);\n return () => this.off(type, fn);\n }\n\n off<K extends keyof E>(type: K, fn: (e: E[K]) => void): void {\n this.map.get(type)?.delete(fn as (e: never) => void);\n }\n\n has(type: keyof E): boolean {\n return (this.map.get(type)?.size ?? 0) > 0;\n }\n\n emit<K extends keyof E>(type: K, e: E[K]): void {\n const set = this.map.get(type);\n if (!set) return;\n for (const fn of set) (fn as (e: E[K]) => void)(e);\n }\n\n clear(): void {\n this.map.clear();\n }\n}\n","// Pane primitives: the plugin seam for anything drawn over a pane that is not\n// a series — price lines here; drawings and study overlays (M3/M4) next.\n//\n// A primitive is attached to a series and draws with that series' price\n// scale. It draws on the overlay layer in CSS px with the origin at the\n// pane's top-left (the context is already transformed for DPR and clipped to\n// the pane), may add labels to the price axis, and may claim the pointer. It may\n// also draw behind the series (`drawBackground`, on the background layer).\n\nimport { cssColor, parseColor } from \"../render/color.js\";\n\nexport interface PaneView {\n /** Pane size in CSS px. */\n readonly width: number;\n readonly height: number;\n readonly dpr: number;\n /** Visible timeline indices. */\n readonly lo: number;\n readonly hi: number;\n /** CSS x of a timeline index's centre. */\n x(index: number): number;\n /** CSS y of a price on the series' scale. */\n y(price: number): number;\n index(x: number): number;\n price(y: number): number;\n timeToIndex(time: number): number | undefined;\n indexToTime(index: number): number;\n /**\n * Pane CSS x of a time (UTC ms): fractional between bars, extrapolated past\n * the first and last bar by the recent bar interval (as the plugin API's\n * `timeToX`). NaN while the chart has no data.\n */\n timeToX(time: number): number;\n /** CSS px between the centres of adjacent bars. */\n readonly barSpacing: number;\n formatPrice(price: number): string;\n}\n\nexport interface AxisLabel {\n price: number;\n text: string;\n background: string;\n color: string;\n}\n\n/** Which canvas layer a primitive wants repainted. */\nexport type RenderLayer = \"background\" | \"overlay\" | \"all\";\n\nexport interface PrimitiveHost {\n /**\n * Ask for a redraw on the next frame: the overlay (default), the background\n * layer (what `drawBackground` paints; it is not repainted by ticks) or both.\n */\n requestRender(layer?: RenderLayer): void;\n}\n\n/** A primitive's hit: `id` is reported as `hovered` on crosshair events. */\nexport interface PrimitiveHit {\n id: string;\n /** CSS cursor to show; absent passes the cursor through. */\n cursor?: string;\n}\n\nexport interface PanePrimitive {\n attached?(host: PrimitiveHost): void;\n detached?(): void;\n /**\n * Drawn on the background layer after the grid and before the series, so it\n * sits behind the bars. Same coordinates and clip as `draw`. Repainted when\n * the view, scale or layout changes; call `host.requestRender(\"background\")`\n * when its own data changes.\n */\n drawBackground?(ctx: CanvasRenderingContext2D, view: PaneView): void;\n draw?(ctx: CanvasRenderingContext2D, view: PaneView): void;\n axisLabels?(view: PaneView): readonly AxisLabel[];\n /**\n * What is under pane point (x, y): a CSS cursor, a hit with an `id` (reported\n * as `hovered: { kind: \"primitive\", id }` on crosshair events, with an optional\n * cursor), or null to pass through. The id must not be empty.\n */\n hitTest?(x: number, y: number, view: PaneView): string | PrimitiveHit | null;\n}\n\n// ---- price line ---------------------------------------------------------------\n\nexport type LineDash = \"solid\" | \"dashed\" | \"dotted\" | \"large-dashed\" | \"sparse-dotted\";\n\nexport interface PriceLineOptions {\n price: number;\n color: string;\n /** CSS px: 1 or 2 (anything else throws). */\n lineWidth: number;\n lineStyle: LineDash;\n title: string;\n axisLabelVisible: boolean;\n /** Background of the axis label; default: `color`. */\n axisLabelColor?: string;\n /** Text colour of the axis label. */\n labelTextColor: string;\n}\n\nexport function dashPattern(style: LineDash, width: number): number[] {\n switch (style) {\n case \"solid\": return [];\n case \"dashed\": return [4 * width, 3 * width];\n case \"dotted\": return [width, 2 * width];\n case \"large-dashed\": return [8 * width, 5 * width];\n case \"sparse-dotted\": return [width, 6 * width];\n }\n}\n\nfunction checkLine(o: PriceLineOptions): void {\n if (o.lineWidth !== 1 && o.lineWidth !== 2) throw new RangeError(`alphacharts: price line lineWidth must be 1 or 2, got ${o.lineWidth}`);\n if (o.lineStyle !== \"solid\" && o.lineStyle !== \"dashed\" && o.lineStyle !== \"dotted\" && o.lineStyle !== \"large-dashed\" && o.lineStyle !== \"sparse-dotted\") {\n throw new RangeError(`alphacharts: unknown price line lineStyle \"${String(o.lineStyle)}\"`);\n }\n if (o.axisLabelColor !== undefined) parseColor(o.axisLabelColor);\n}\n\n/** Snap a CSS coordinate so a line of `width` CSS px covers whole device pixels. */\nexport function crisp(v: number, dpr: number, width = 1): number {\n const w = Math.max(1, Math.round(width * dpr));\n return (Math.round(v * dpr) + (w % 2 ? 0.5 : 0)) / dpr;\n}\n\nexport class PriceLine implements PanePrimitive {\n private host: PrimitiveHost | null = null;\n private opts: PriceLineOptions;\n\n constructor(options: Partial<PriceLineOptions> & { price: number }) {\n const opts: PriceLineOptions = { color: \"#9598a1\", lineWidth: 1, lineStyle: \"dashed\", title: \"\", axisLabelVisible: true, labelTextColor: \"#ffffff\", ...options };\n checkLine(opts);\n this.opts = opts;\n }\n\n options(): Readonly<PriceLineOptions> {\n return this.opts;\n }\n\n applyOptions(options: Partial<PriceLineOptions>): void {\n const next = { ...this.opts, ...options };\n checkLine(next);\n this.opts = next;\n this.host?.requestRender();\n }\n\n attached(host: PrimitiveHost): void {\n this.host = host;\n }\n\n detached(): void {\n this.host = null;\n }\n\n draw(ctx: CanvasRenderingContext2D, view: PaneView): void {\n const o = this.opts;\n const y = crisp(view.y(o.price), view.dpr, o.lineWidth);\n if (y < -o.lineWidth || y > view.height + o.lineWidth) return;\n ctx.strokeStyle = o.color;\n ctx.lineWidth = Math.max(1, Math.round(o.lineWidth * view.dpr)) / view.dpr;\n ctx.setLineDash(dashPattern(o.lineStyle, o.lineWidth));\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(view.width, y);\n ctx.stroke();\n ctx.setLineDash([]);\n if (o.title) {\n ctx.fillStyle = o.color;\n ctx.textBaseline = \"bottom\";\n ctx.textAlign = \"right\";\n ctx.fillText(o.title, view.width - 6, y - 2);\n }\n }\n\n axisLabels(view: PaneView): readonly AxisLabel[] {\n const o = this.opts;\n return o.axisLabelVisible ? [{ price: o.price, text: view.formatPrice(o.price), background: o.axisLabelColor ?? o.color, color: o.labelTextColor }] : [];\n }\n}\n\n// ---- bar shading ---------------------------------------------------------------\n\n/**\n * A background colour per bar, drawn behind the series of the pane it is attached to (`Series.attachPrimitive`).\n * It takes no part in autoscale (a primitive never does) and costs nothing while no bar is shaded. Colours are\n * keyed by bar time (UTC ms), so they stay with their bars when the timeline is re-indexed; a time with no bar on\n * the chart draws nothing. Runs of equal colour on neighbouring bars are painted as one rectangle.\n */\nexport class BarShading implements PanePrimitive {\n private host: PrimitiveHost | null = null;\n private times = new Float64Array(0);\n private colors = new Uint32Array(0);\n private n = 0;\n private shown = true;\n private any = false;\n\n /** Replace every shade: strictly increasing times, packed 0xRRGGBBAA colours (0 = no shade). */\n set(time: Float64Array, color: Uint32Array): void {\n if (time.length !== color.length) throw new RangeError(`BarShading.set: ${color.length} colours for ${time.length} times`);\n this.times = time.slice();\n this.colors = color.slice();\n this.n = time.length;\n this.any = this.colors.some((c) => c !== 0);\n this.host?.requestRender(\"background\");\n }\n\n /** Shade one bar: replaces the colour at `time` when the bar is known, else appends (a time later than the last). */\n setAt(time: number, color: number): void {\n const n = this.n;\n let i = n;\n if (n > 0 && time <= this.times[n - 1]!) {\n i = lowerBoundTime(this.times, n, time);\n if (this.times[i] !== time) throw new RangeError(`BarShading.setAt: time ${time} is neither the last bar nor a later one`);\n }\n if (i === n) {\n if (n === this.times.length) {\n const cap = Math.max(64, n * 2);\n const t = new Float64Array(cap), c = new Uint32Array(cap);\n t.set(this.times.subarray(0, n));\n c.set(this.colors.subarray(0, n));\n this.times = t;\n this.colors = c;\n }\n this.times[n] = time;\n this.n = n + 1;\n } else if (this.colors[i] === color) return;\n this.colors[i] = color;\n if (color !== 0) this.any = true;\n this.host?.requestRender(\"background\");\n }\n\n clear(): void {\n this.n = 0;\n this.any = false;\n this.host?.requestRender(\"background\");\n }\n\n setVisible(visible: boolean): void {\n if (visible === this.shown) return;\n this.shown = visible;\n this.host?.requestRender(\"background\");\n }\n\n attached(host: PrimitiveHost): void {\n this.host = host;\n }\n\n detached(): void {\n this.host = null;\n }\n\n drawBackground(ctx: CanvasRenderingContext2D, view: PaneView): void {\n if (!this.shown || !this.any || this.n === 0) return;\n const times = this.times, colors = this.colors, n = this.n;\n const half = view.barSpacing / 2;\n // first bar whose right edge is inside the pane (timeToX never throws, and grows with time)\n let a = 0, b = n;\n while (a < b) {\n const mid = (a + b) >>> 1;\n if (view.timeToX(times[mid]!) + half < 0) a = mid + 1;\n else b = mid;\n }\n let k = a;\n let runStart = -1, runEnd = -1, runColor = 0;\n const flush = () => {\n if (runColor === 0 || runStart < 0) return;\n ctx.fillStyle = cssColor(runColor);\n ctx.fillRect(runStart, 0, runEnd - runStart, view.height);\n };\n for (; k < n; k++) {\n if (view.timeToX(times[k]!) - half > view.width) break;\n const c = colors[k]!;\n const idx = view.timeToIndex(times[k]!);\n if (idx === undefined) continue;\n const x = view.x(idx);\n // contiguous with the open run when this bar starts where the run ends\n if (c === runColor && c !== 0 && Math.abs(x - half - runEnd) < 0.5) {\n runEnd = x + half;\n continue;\n }\n flush();\n runColor = c;\n runStart = x - half;\n runEnd = x + half;\n }\n flush();\n }\n}\n\nfunction lowerBoundTime(a: Float64Array, n: number, t: number): number {\n let lo = 0, hi = n;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (a[mid]! < t) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n","// Series markers: small shapes (with optional text) on bars, drawn on the\n// overlay above a bar's high or below its low. Several markers on one bar\n// stack outward, in the order given. Markers are positioned by time, so they\n// follow the bar through prepends and live updates; a marker whose bar is gone\n// after a later `setData` is skipped when drawing (not an error: the data owns\n// the bars, the markers are only annotations on them).\n\nimport { parseColor } from \"../render/color.js\";\n\nexport type MarkerShape = \"arrowUp\" | \"arrowDown\" | \"circle\";\nexport type MarkerPosition = \"aboveBar\" | \"belowBar\";\n\nexport interface SeriesMarker {\n /** UTC ms; must be the time of a bar of the series. */\n time: number;\n position: MarkerPosition;\n shape: MarkerShape;\n /** CSS colour of the shape and its text. */\n color: string;\n /** Drawn outside the shape (above it for \"aboveBar\", under it for \"belowBar\") in the theme font. */\n text?: string;\n /** Reported as `hovered: { kind: \"marker\", id }` on crosshair, click and dblclick events. Unique within the series. */\n id?: string;\n /** Multiplier of the default size (which follows the bar spacing); default 1. */\n size?: number;\n}\n\nconst SHAPES = [\"arrowUp\", \"arrowDown\", \"circle\"];\nconst POSITIONS = [\"aboveBar\", \"belowBar\"];\n\n/** What a marker is called in an error message. */\nconst name = (m: SeriesMarker, i: number) => `marker ${m.id !== undefined ? `\"${m.id}\"` : `#${i}`} (time ${m.time})`;\n\n/**\n * Check `markers` against the series' bars and return a copy sorted by time\n * (stable: the given order is the stacking order on one bar). `hasBar(time)`\n * says whether the series has a bar at that time.\n */\nexport function checkMarkers(markers: readonly SeriesMarker[], hasBar: (time: number) => boolean): SeriesMarker[] {\n const ids = new Set<string>();\n markers.forEach((m, i) => {\n if (!Number.isFinite(m.time)) throw new RangeError(`alphacharts: ${name(m, i)} has a non-finite time`);\n if (!POSITIONS.includes(m.position)) throw new RangeError(`alphacharts: ${name(m, i)} has unknown position \"${String(m.position)}\"`);\n if (!SHAPES.includes(m.shape)) throw new RangeError(`alphacharts: ${name(m, i)} has unknown shape \"${String(m.shape)}\"`);\n if (m.size !== undefined && !(m.size > 0 && Number.isFinite(m.size))) throw new RangeError(`alphacharts: ${name(m, i)} has size ${m.size}; it must be positive`);\n if (m.id !== undefined) {\n if (m.id === \"\") throw new RangeError(`alphacharts: ${name(m, i)} has an empty id`);\n if (ids.has(m.id)) throw new Error(`alphacharts: ${name(m, i)}: the id is used by another marker`);\n ids.add(m.id);\n }\n try {\n parseColor(m.color);\n } catch (e) {\n throw new Error(`alphacharts: ${name(m, i)} has a bad colour: ${(e as Error).message}`);\n }\n if (!hasBar(m.time)) throw new RangeError(`alphacharts: ${name(m, i)} is not on a bar of the series`);\n });\n return markers.map((m, i) => ({ m, i })).sort((a, b) => a.m.time - b.m.time || a.i - b.i).map((x) => ({ ...x.m }));\n}\n\n/** First index in `sorted` whose time is >= t. */\nexport function markerLowerBound(sorted: readonly SeriesMarker[], t: number): number {\n let lo = 0, hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (sorted[mid]!.time < t) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** A marker placed on the pane: `box` is the shape plus its text, for drawing bounds and hit tests. */\nexport interface PlacedMarker {\n marker: SeriesMarker;\n /** Pane CSS px: centre of the shape. */\n cx: number;\n cy: number;\n /** Shape edge in CSS px. */\n size: number;\n box: { x: number; y: number; w: number; h: number };\n}\n\nconst GAP = 4;\nconst PAD = 2;\n\n/** Shape size in CSS px for a bar spacing and a marker's multiplier. */\nexport function markerSize(barSpacing: number, mult = 1): number {\n return Math.round(Math.min(20, Math.max(8, barSpacing * 0.8)) * mult);\n}\n\nexport interface PlaceInput {\n markers: readonly SeriesMarker[];\n /** Index range [from, to) into `markers` to place. Must cover whole bars. */\n from: number;\n to: number;\n barSpacing: number;\n fontSize: number;\n textWidth(s: string): number;\n /** For a marker: the bar's pane x, high y and low y, or undefined when the series has no bar there. */\n bar(m: SeriesMarker): { x: number; yHigh: number; yLow: number } | undefined;\n}\n\n/**\n * Place markers[from..to): above the bar's high or below its low with a small\n * gap, the next marker on the same side of the same bar further out.\n */\nexport function placeMarkers(inp: PlaceInput): PlacedMarker[] {\n const out: PlacedMarker[] = [];\n let curTime = Number.NaN;\n let above = 0, below = 0; // outward offset used so far on this bar\n for (let k = inp.from; k < inp.to; k++) {\n const m = inp.markers[k]!;\n if (m.time !== curTime) {\n curTime = m.time;\n above = below = 0;\n }\n const bar = inp.bar(m);\n if (!bar) continue;\n const size = markerSize(inp.barSpacing, m.size);\n const textH = m.text ? inp.fontSize + 2 : 0;\n const slot = size + textH + PAD;\n const isAbove = m.position === \"aboveBar\";\n const off = isAbove ? above : below;\n // Outward from the bar: the shape first, then its text further out.\n const near = isAbove ? bar.yHigh - GAP - off : bar.yLow + GAP + off;\n const cy = isAbove ? near - size / 2 : near + size / 2;\n const top = isAbove ? near - size - textH : near;\n const tw = m.text ? Math.max(size, inp.textWidth(m.text)) : size;\n out.push({ marker: m, cx: bar.x, cy, size, box: { x: bar.x - tw / 2, y: top, w: tw, h: size + textH } });\n if (isAbove) above += slot;\n else below += slot;\n }\n return out;\n}\n\n/** Draw placed markers on a pane context (CSS px). */\nexport function drawMarkers(ctx: CanvasRenderingContext2D, placed: readonly PlacedMarker[]): void {\n ctx.textAlign = \"center\";\n for (const p of placed) {\n const m = p.marker, r = p.size / 2;\n ctx.fillStyle = m.color;\n ctx.beginPath();\n switch (m.shape) {\n case \"circle\":\n ctx.arc(p.cx, p.cy, r, 0, Math.PI * 2);\n break;\n case \"arrowUp\":\n ctx.moveTo(p.cx, p.cy - r);\n ctx.lineTo(p.cx + r, p.cy + r * 0.2);\n ctx.lineTo(p.cx + r * 0.4, p.cy + r * 0.2);\n ctx.lineTo(p.cx + r * 0.4, p.cy + r);\n ctx.lineTo(p.cx - r * 0.4, p.cy + r);\n ctx.lineTo(p.cx - r * 0.4, p.cy + r * 0.2);\n ctx.lineTo(p.cx - r, p.cy + r * 0.2);\n break;\n case \"arrowDown\":\n ctx.moveTo(p.cx, p.cy + r);\n ctx.lineTo(p.cx + r, p.cy - r * 0.2);\n ctx.lineTo(p.cx + r * 0.4, p.cy - r * 0.2);\n ctx.lineTo(p.cx + r * 0.4, p.cy - r);\n ctx.lineTo(p.cx - r * 0.4, p.cy - r);\n ctx.lineTo(p.cx - r * 0.4, p.cy - r * 0.2);\n ctx.lineTo(p.cx - r, p.cy - r * 0.2);\n break;\n }\n ctx.closePath();\n ctx.fill();\n if (m.text) {\n const above = m.position === \"aboveBar\";\n ctx.textBaseline = above ? \"bottom\" : \"top\";\n ctx.fillText(m.text, p.cx, above ? p.cy - r - 1 : p.cy + r + 1);\n }\n }\n}\n","// Price formats: how a series' values become text on the axis, in labels and\n// in the screen-reader readout.\n//\n// A \"price\" format without a minMove takes it from the data: the most decimals\n// any sampled value needs (never fewer than the data has, so a readout is the\n// value that was passed in). It only ever grows as new bars arrive.\n\nimport { PriceFormatter } from \"./ticks.js\";\n\nexport type PriceFormat =\n | { type: \"price\"; minMove?: number }\n /** Abbreviated: K/M/B/T, or K/L/Cr for Indian locales. */\n | { type: \"volume\"; minMove?: number }\n /** Values are already percentages; shown with a % sign. */\n | { type: \"percent\"; minMove?: number }\n | { type: \"custom\"; minMove: number; format: (value: number) => string };\n\nexport interface Formatter {\n /** Smallest step between distinct values; axis ticks are multiples of it. */\n readonly minMove: number;\n format(value: number): string;\n}\n\nconst MAX_DECIMALS = 10;\n\n/** Decimals needed to write v exactly (within float noise), capped at 10. */\nexport function decimalsOf(v: number): number {\n const a = Math.abs(v);\n for (let d = 0; d < MAX_DECIMALS; d++) {\n const s = a * 10 ** d;\n if (Math.abs(s - Math.round(s)) <= 1e-9 * Math.max(1, s)) return d;\n }\n return MAX_DECIMALS;\n}\n\n/** True when the locale groups and abbreviates the Indian way (lakh, crore). */\nexport function isIndianLocale(locale: string | undefined): boolean {\n const l = (locale ?? (typeof navigator !== \"undefined\" ? navigator.language : \"en\")).toLowerCase();\n return l.endsWith(\"-in\") || l === \"hi\" || l.startsWith(\"hi-\");\n}\n\nexport function createFormatter(f: PriceFormat, derivedMinMove: number, locale: string | undefined): Formatter {\n switch (f.type) {\n case \"custom\":\n if (!(f.minMove > 0)) throw new RangeError(`custom priceFormat needs a positive minMove, got ${f.minMove}`);\n return { minMove: f.minMove, format: f.format };\n case \"price\": {\n const p = new PriceFormatter(f.minMove ?? derivedMinMove);\n return { minMove: p.minMove, format: (v) => p.format(v) };\n }\n case \"percent\": {\n const p = new PriceFormatter(f.minMove ?? Math.min(0.01, derivedMinMove));\n return { minMove: p.minMove, format: (v) => `${p.format(v)}%` };\n }\n case \"volume\": {\n const minMove = f.minMove ?? 1;\n const indian = isIndianLocale(locale);\n const steps: [number, string][] = indian\n ? [[1e7, \"Cr\"], [1e5, \"L\"], [1e3, \"K\"]]\n : [[1e12, \"T\"], [1e9, \"B\"], [1e6, \"M\"], [1e3, \"K\"]];\n const nf = new Intl.NumberFormat(locale, { maximumFractionDigits: 2 });\n const plain = new PriceFormatter(minMove);\n return {\n minMove,\n format: (v) => {\n const a = Math.abs(v);\n for (const [div, suffix] of steps) if (a >= div) return `${nf.format(v / div)}${suffix}`;\n return plain.format(v);\n },\n };\n }\n }\n}\n","// Built-in WebGL2 series renderers: candles, OHLC bars, histogram, line, area.\n//\n// All draw instanced quads straight from an InstanceWindow (no per-frame\n// geometry on the CPU). Bars are snapped to whole device pixels: body and\n// wick widths are integers with equal parity, so a wick sits exactly centred\n// on its body at every DPR; tops and bottoms are rounded and at least 1 px.\n// Lines and area edges are analytically anti-aliased in the fragment shader.\n\nimport type { DataChange, SeriesData } from \"../data/model.js\";\nimport type { PriceScale } from \"../scale/price-scale.js\";\nimport type { TimeScale } from \"../scale/time-scale.js\";\nimport { parseColor, rgba } from \"./color.js\";\nimport { GLContext, GLSL_COMMON, type Program } from \"./gl.js\";\nimport { chooseLevel, HOLE_TEST, InstanceWindow, RECORD_BYTES } from \"./window.js\";\n\n/** Everything a renderer needs for one pane in one frame. */\nexport interface DrawView {\n readonly gl: WebGL2RenderingContext;\n readonly ctx: GLContext;\n readonly data: SeriesData;\n readonly time: TimeScale;\n readonly price: PriceScale;\n readonly dpr: number;\n /** Pane size in device px. */\n readonly width: number;\n readonly height: number;\n /** Visible timeline indices. */\n readonly lo: number;\n readonly hi: number;\n}\n\n/** Plugin contract for a WebGL series renderer. */\nexport interface SeriesRenderer<O> {\n draw(view: DrawView, options: O): void;\n dataChanged(change: DataChange): void;\n /** Drop GL objects (context lost or series removed). */\n dispose(): void;\n}\n\n// ---- shared ---------------------------------------------------------------\n\nconst FS_FLAT = /* glsl */ `#version 300 es\nprecision highp float;\nin vec4 v_color;\nout vec4 o_color;\nvoid main() { o_color = vec4(v_color.rgb * v_color.a, v_color.a); }\n`;\n\nconst OFFSCREEN = \"gl_Position = vec4(2.0, 2.0, 2.0, 1.0); return;\";\n\nabstract class WindowRenderer<O> implements SeriesRenderer<O> {\n protected readonly win: InstanceWindow;\n protected readonly vao: WebGLVertexArrayObject;\n protected readonly prog: Program;\n protected level = 0;\n\n constructor(protected readonly gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData, zeroBase: boolean, prog: Program, pairs: boolean) {\n this.prog = prog;\n // Pair renderers join consecutive records, so they get holes removed.\n this.win = new InstanceWindow(gl, data, zeroBase, pairs);\n this.vao = gl.createVertexArray();\n gl.bindVertexArray(this.vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.win.buffer);\n // Record i: a_r = (x, o, h, l), a_c = c, a_color. Pair renderers also read\n // record i+1 as a_r1/a_c1 (instance i draws the step from i to i+1).\n bindRecord(gl, prog, \"a_r\", \"a_c\", \"a_color\", 0);\n if (pairs) bindRecord(gl, prog, \"a_r1\", \"a_c1\", \"a_color1\", RECORD_BYTES);\n gl.bindVertexArray(null);\n void ctx;\n }\n\n abstract draw(view: DrawView, options: O): void;\n\n dataChanged(c: DataChange): void {\n this.win.dataChanged(c);\n }\n\n dispose(): void {\n this.win.dispose();\n this.gl.deleteVertexArray(this.vao);\n }\n\n /** Upload as needed and set the shared uniforms. Returns the record count. */\n protected prepare(v: DrawView): number {\n const gl = this.gl;\n const spacingDev = v.time.spacing * v.dpr;\n this.level = chooseLevel(v.data, spacingDev);\n this.win.setLog(v.price.logCoords);\n this.win.ensure(this.level, v.lo, v.hi);\n gl.useProgram(this.prog.program);\n gl.bindVertexArray(this.vao);\n const u = this.prog.uniforms;\n gl.uniform2f(u.u_view!, v.width, v.height);\n gl.uniform2f(u.u_x!, spacingDev, v.time.x(this.win.base) * v.dpr);\n // y = u_y.y - p_rel · u_y.x, with p_rel the uploaded coordinate minus its base.\n gl.uniform2f(u.u_y!, -v.price.pxPerCoord * v.dpr, v.price.yOfCoord(this.win.priceBase) * v.dpr);\n return this.win.count;\n }\n\n protected widths(v: DrawView, ratio: number): [number, number] {\n return barWidths(v.time.spacing, v.dpr, this.level, ratio);\n }\n}\n\n/**\n * Integer device-px body and wick widths with equal parity, so a wick sits\n * exactly centred on its body. Shared by the WebGL and Canvas2D renderers.\n */\nexport function barWidths(spacingCss: number, dpr: number, level: number, ratio: number): [number, number] {\n const unit = spacingCss * dpr * (1 << level);\n const wick = Math.max(1, Math.floor(dpr));\n let body = Math.max(1, Math.floor(unit * ratio));\n if (body > wick && (body - wick) % 2 !== 0) body -= 1;\n return [body, Math.min(wick, body)];\n}\n\nfunction bindRecord(gl: WebGL2RenderingContext, p: Program, r: string, c: string, color: string, offset: number): void {\n const a = p.attribs;\n if (a[r]! >= 0) {\n gl.enableVertexAttribArray(a[r]!);\n gl.vertexAttribPointer(a[r]!, 4, gl.FLOAT, false, RECORD_BYTES, offset);\n gl.vertexAttribDivisor(a[r]!, 1);\n }\n if (a[c]! >= 0) {\n gl.enableVertexAttribArray(a[c]!);\n gl.vertexAttribPointer(a[c]!, 1, gl.FLOAT, false, RECORD_BYTES, offset + 16);\n gl.vertexAttribDivisor(a[c]!, 1);\n }\n if (a[color] !== undefined && a[color]! >= 0) {\n gl.enableVertexAttribArray(a[color]!);\n gl.vertexAttribIPointer(a[color]!, 1, gl.UNSIGNED_INT, RECORD_BYTES, offset + 20);\n gl.vertexAttribDivisor(a[color]!, 1);\n }\n}\n\n/** Parsed colour uniforms, re-parsed only when the option string changes. */\nclass Colors {\n private readonly keys: string[] = [];\n private readonly vals: Float32Array[] = [];\n get(slot: number, css: string): Float32Array {\n if (this.keys[slot] !== css) {\n this.keys[slot] = css;\n this.vals[slot] = rgba(parseColor(css));\n }\n return this.vals[slot]!;\n }\n}\n\n// ---- candles ----------------------------------------------------------------\n\nexport interface CandleStyle {\n upColor: string;\n downColor: string;\n wickUpColor: string;\n wickDownColor: string;\n}\n\n// A bar with its own colour (a_color != 0, packed 0xRRGGBBAA) is drawn in it, body and wick; every other bar in the\n// up/down colours. The attribute is the record's existing colour slot: no extra buffer, one integer compare per vertex.\nconst CANDLE_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in float a_c; in uint a_color;\nuniform vec2 u_w;\nuniform vec4 u_up, u_down, u_wup, u_wdown;\nout vec4 v_color;\nvoid main() {\n if (a_r.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n bool wick = gl_VertexID < 6;\n vec2 cr = corner(gl_VertexID % 6);\n float o = a_r.y, h = a_r.z, l = a_r.w, c = a_c;\n float left = floor(xDev(a_r.x) - u_w.x * 0.5 + 0.5);\n float x0, x1, y0, y1;\n if (wick) {\n x0 = left + (u_w.x - u_w.y) * 0.5; x1 = x0 + u_w.y;\n // An inverted scale draws the high below the low: order the edges as drawn.\n float ya = floor(yDev(h) + 0.5), yb = floor(yDev(l) + 0.5);\n y0 = min(ya, yb); y1 = max(max(ya, yb), y0 + 1.0);\n } else {\n x0 = left; x1 = left + u_w.x;\n float ya = floor(yDev(max(o, c)) + 0.5), yb = floor(yDev(min(o, c)) + 0.5);\n y0 = min(ya, yb); y1 = max(max(ya, yb), y0 + 1.0);\n }\n gl_Position = vec4(toClip(vec2(mix(x0, x1, cr.x), mix(y0, y1, cr.y))), 0.0, 1.0);\n bool up = c >= o;\n v_color = a_color != 0u ? unpack(a_color) : wick ? (up ? u_wup : u_wdown) : (up ? u_up : u_down);\n}`;\n\nexport class CandleRenderer extends WindowRenderer<CandleStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, false, ctx.program(\"candles\", CANDLE_VS, FS_FLAT, [\"u_w\", \"u_up\", \"u_down\", \"u_wup\", \"u_wdown\"], [\"a_r\", \"a_c\", \"a_color\"]), false);\n }\n draw(v: DrawView, o: CandleStyle): void {\n const n = this.prepare(v);\n if (n === 0) return;\n const gl = this.gl, u = this.prog.uniforms;\n const [body, wick] = this.widths(v, 0.8);\n gl.uniform2f(u.u_w!, body, wick);\n gl.uniform4fv(u.u_up!, this.colors.get(0, o.upColor));\n gl.uniform4fv(u.u_down!, this.colors.get(1, o.downColor));\n gl.uniform4fv(u.u_wup!, this.colors.get(2, o.wickUpColor));\n gl.uniform4fv(u.u_wdown!, this.colors.get(3, o.wickDownColor));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 12, n);\n }\n}\n\n// ---- OHLC bars ----------------------------------------------------------------\n\nexport interface BarStyle {\n upColor: string;\n downColor: string;\n}\n\nconst BAR_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in float a_c; in uint a_color;\nuniform vec2 u_w;\nuniform vec4 u_up, u_down;\nout vec4 v_color;\nvoid main() {\n if (a_r.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n int seg = gl_VertexID / 6;\n vec2 cr = corner(gl_VertexID % 6);\n float o = a_r.y, h = a_r.z, l = a_r.w, c = a_c, t = u_w.y;\n float left = floor(xDev(a_r.x) - u_w.x * 0.5 + 0.5);\n float mid = left + (u_w.x - t) * 0.5;\n float x0, x1, y0, y1;\n if (seg == 0) {\n x0 = mid; x1 = mid + t;\n float ya = floor(yDev(h) + 0.5), yb = floor(yDev(l) + 0.5);\n y0 = min(ya, yb); y1 = max(max(ya, yb), y0 + 1.0);\n } else {\n float y = floor(yDev(seg == 1 ? o : c) - t * 0.5 + 0.5);\n y0 = y; y1 = y + t;\n if (seg == 1) { x0 = left; x1 = mid; } else { x0 = mid + t; x1 = left + u_w.x; }\n }\n gl_Position = vec4(toClip(vec2(mix(x0, x1, cr.x), mix(y0, y1, cr.y))), 0.0, 1.0);\n v_color = a_color != 0u ? unpack(a_color) : c >= o ? u_up : u_down;\n}`;\n\nexport class BarRenderer extends WindowRenderer<BarStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, false, ctx.program(\"bars\", BAR_VS, FS_FLAT, [\"u_w\", \"u_up\", \"u_down\"], [\"a_r\", \"a_c\", \"a_color\"]), false);\n }\n draw(v: DrawView, o: BarStyle): void {\n const n = this.prepare(v);\n if (n === 0) return;\n const gl = this.gl, u = this.prog.uniforms;\n const [body, thick] = this.widths(v, 0.8);\n gl.uniform2f(u.u_w!, body, thick);\n gl.uniform4fv(u.u_up!, this.colors.get(0, o.upColor));\n gl.uniform4fv(u.u_down!, this.colors.get(1, o.downColor));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 18, n);\n }\n}\n\n// ---- histogram ----------------------------------------------------------------\n\nexport interface HistogramStyle {\n color: string;\n /** Value the bars grow from. */\n base: number;\n}\n\nconst HIST_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in uint a_color;\nuniform float u_w;\nuniform float u_base;\nuniform vec4 u_color;\nout vec4 v_color;\nvoid main() {\n if (a_r.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n vec2 cr = corner(gl_VertexID);\n float left = floor(xDev(a_r.x) - u_w * 0.5 + 0.5);\n // Zoomed out, a bucket spans bars on both sides of the base: draw the\n // extreme farthest from it (at level 0, high == low == value).\n float v = abs(a_r.z - u_base) >= abs(a_r.w - u_base) ? a_r.z : a_r.w;\n float yv = floor(yDev(v) + 0.5), yb = floor(yDev(u_base) + 0.5);\n float y0 = min(yv, yb), y1 = max(max(yv, yb), y0 + 1.0);\n gl_Position = vec4(toClip(vec2(mix(left, left + u_w, cr.x), mix(y0, y1, cr.y))), 0.0, 1.0);\n v_color = a_color != 0u ? unpack(a_color) : u_color;\n}`;\n\nexport class HistogramRenderer extends WindowRenderer<HistogramStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, true, ctx.program(\"histogram\", HIST_VS, FS_FLAT, [\"u_w\", \"u_base\", \"u_color\"], [\"a_r\", \"a_color\"]), false);\n }\n draw(v: DrawView, o: HistogramStyle): void {\n const n = this.prepare(v);\n if (n === 0) return;\n const gl = this.gl, u = this.prog.uniforms;\n gl.uniform1f(u.u_w!, this.widths(v, 0.8)[0]);\n // On a log scale a base at or below zero sits at the pane's lowest value.\n const base = v.price.logCoords && !(o.base > 0) ? v.price.min : v.price.coord(o.base);\n gl.uniform1f(u.u_base!, base - this.win.priceBase);\n gl.uniform4fv(u.u_color!, this.colors.get(0, o.color));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, n);\n }\n}\n\n// ---- line -------------------------------------------------------------------\n\nexport interface LineStyle {\n color: string;\n /** CSS px. */\n lineWidth: number;\n}\n\n// Instance i joins record i to record i+1 with an anti-aliased capsule. Above\n// level 0 a second capsule spans record i+1's low..high, so a zoomed-out line\n// draws the exact per-bucket envelope instead of a sampled path. A segment takes\n// the colour of the point it arrives at (record i+1) when that point has one.\nconst LINE_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in float a_c;\nin vec4 a_r1; in uint a_color1;\nuniform float u_half;\nuniform int u_env;\nout vec2 v_pos;\nflat out vec2 v_a;\nflat out vec2 v_b;\nflat out vec4 v_seg;\nvoid main() {\n if (a_r.x < ${HOLE_TEST} || a_r1.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n bool env = gl_VertexID >= 6;\n if (env && u_env == 0) { ${OFFSCREEN} }\n vec2 a = env ? vec2(xDev(a_r1.x), yDev(a_r1.w)) : vec2(xDev(a_r.x), yDev(a_c));\n vec2 b = env ? vec2(xDev(a_r1.x), yDev(a_r1.z)) : vec2(xDev(a_r1.x), yDev(a_r1.y));\n vec2 d = b - a;\n float len = length(d);\n vec2 dir = len > 1e-4 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float r = u_half + 1.0;\n vec2 cr = corner(gl_VertexID % 6);\n vec2 p = mix(a - dir * r, b + dir * r, cr.x) + nrm * mix(-r, r, cr.y);\n v_pos = p; v_a = a; v_b = b;\n v_seg = a_color1 != 0u ? unpack(a_color1) : vec4(0.0, 0.0, 0.0, -1.0);\n gl_Position = vec4(toClip(p), 0.0, 1.0);\n}`;\n\nconst LINE_FS = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 v_pos;\nflat in vec2 v_a;\nflat in vec2 v_b;\nflat in vec4 v_seg;\nuniform float u_half;\nuniform vec4 u_color;\nout vec4 o_color;\nvoid main() {\n vec2 pa = v_pos - v_a, ba = v_b - v_a;\n float t = clamp(dot(pa, ba) / max(dot(ba, ba), 1e-6), 0.0, 1.0);\n float dist = length(pa - ba * t);\n float cov = clamp(u_half + 0.5 - dist, 0.0, 1.0);\n if (cov <= 0.0) discard;\n vec4 col = v_seg.a < 0.0 ? u_color : v_seg;\n float a = col.a * cov;\n o_color = vec4(col.rgb * a, a);\n}`;\n\nexport class LineRenderer extends WindowRenderer<LineStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, false, ctx.program(\"line\", LINE_VS, LINE_FS, [\"u_half\", \"u_env\", \"u_color\"], [\"a_r\", \"a_c\", \"a_r1\", \"a_color1\"]), true);\n }\n draw(v: DrawView, o: LineStyle): void {\n const n = this.prepare(v);\n if (n < 2) return;\n this.drawLine(v, o.color, o.lineWidth, n);\n }\n /** Draw with the program already prepared (shared with AreaRenderer). */\n drawLine(v: DrawView, color: string, width: number, n: number): void {\n const gl = this.gl, u = this.prog.uniforms;\n gl.uniform1f(u.u_half!, Math.max(0.5, (width * v.dpr) / 2));\n gl.uniform1i(u.u_env!, this.level > 0 ? 1 : 0);\n gl.uniform4fv(u.u_color!, this.colors.get(0, color));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 12, n - 1);\n }\n}\n\n// ---- area -------------------------------------------------------------------\n\nexport interface AreaStyle {\n lineColor: string;\n topColor: string;\n bottomColor: string;\n lineWidth: number;\n}\n\nconst AREA_VS = GLSL_COMMON + /* glsl */ `\nin vec4 a_r; in vec4 a_r1;\nout float v_t;\nvoid main() {\n if (a_r.x < ${HOLE_TEST} || a_r1.x < ${HOLE_TEST}) { ${OFFSCREEN} }\n vec2 cr = corner(gl_VertexID);\n float x = mix(xDev(a_r.x), xDev(a_r1.x), cr.x);\n float top = mix(yDev(a_r.z), yDev(a_r1.z), cr.x);\n float y = mix(top, u_view.y, cr.y);\n v_t = y / u_view.y;\n gl_Position = vec4(toClip(vec2(x, y)), 0.0, 1.0);\n}`;\n\nconst AREA_FS = /* glsl */ `#version 300 es\nprecision highp float;\nin float v_t;\nuniform vec4 u_top, u_bottom;\nout vec4 o_color;\nvoid main() {\n vec4 c = mix(u_top, u_bottom, clamp(v_t, 0.0, 1.0));\n o_color = vec4(c.rgb * c.a, c.a);\n}`;\n\nexport class AreaRenderer implements SeriesRenderer<AreaStyle> {\n private readonly fill: AreaFill;\n private readonly line: LineRenderer;\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n this.fill = new AreaFill(gl, ctx, data);\n this.line = new LineRenderer(gl, ctx, data);\n }\n draw(v: DrawView, o: AreaStyle): void {\n this.fill.draw(v, o);\n this.line.draw(v, { color: o.lineColor, lineWidth: o.lineWidth });\n }\n dataChanged(c: DataChange): void {\n this.fill.dataChanged(c);\n this.line.dataChanged(c);\n }\n dispose(): void {\n this.fill.dispose();\n this.line.dispose();\n }\n}\n\nclass AreaFill extends WindowRenderer<AreaStyle> {\n private readonly colors = new Colors();\n constructor(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData) {\n super(gl, ctx, data, false, ctx.program(\"area\", AREA_VS, AREA_FS, [\"u_top\", \"u_bottom\"], [\"a_r\", \"a_r1\"]), true);\n }\n draw(v: DrawView, o: AreaStyle): void {\n const n = this.prepare(v);\n if (n < 2) return;\n const gl = this.gl, u = this.prog.uniforms;\n gl.uniform4fv(u.u_top!, this.colors.get(0, o.topColor));\n gl.uniform4fv(u.u_bottom!, this.colors.get(1, o.bottomColor));\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, n - 1);\n }\n}\n","// Canvas2D series renderers: the fallback when WebGL2 is unavailable. Same\n// level-of-detail choice and the same integer pixel snapping as the WebGL\n// renderers (barWidths), so the two produce the same geometry; marks are\n// batched into one Path2D per colour.\n\nimport { LOD_C, LOD_COLOR, LOD_H, LOD_L, LOD_O } from \"../data/lod.js\";\nimport { COL_BAR_COLOR, COL_C, COL_COLOR, COL_H, COL_L, COL_O, COL_V, type DataChange, type SeriesData } from \"../data/model.js\";\nimport type { PriceScale } from \"../scale/price-scale.js\";\nimport type { TimeScale } from \"../scale/time-scale.js\";\nimport { cssColor } from \"./color.js\";\nimport { barWidths, type AreaStyle, type BarStyle, type CandleStyle, type HistogramStyle, type LineStyle } from \"./renderers.js\";\nimport { chooseLevel } from \"./window.js\";\n\nexport interface DrawView2D {\n /** Transformed so (0, 0) is the pane's top-left device pixel, clipped to it. */\n readonly ctx: CanvasRenderingContext2D;\n readonly data: SeriesData;\n readonly time: TimeScale;\n readonly price: PriceScale;\n readonly dpr: number;\n /** Pane size in device px. */\n readonly width: number;\n readonly height: number;\n readonly lo: number;\n readonly hi: number;\n}\n\nexport interface SeriesRenderer2D<O> {\n draw(view: DrawView2D, options: O): void;\n dataChanged(change: DataChange): void;\n dispose(): void;\n}\n\ntype UnitFn = (x: number, o: number, h: number, l: number, c: number, color: number) => void;\n\n/** Visit present units over [lo, hi] at `level`, x in device px. */\nfunction eachUnit(v: DrawView2D, level: number, fn: UnitFn): void {\n const d = v.data, dpr = v.dpr, t = v.time;\n if (level === 0) {\n const st = d.store;\n const ohlc = d.shape === \"ohlc\";\n const O = st.cols[ohlc ? COL_O : COL_V]!, H = st.cols[ohlc ? COL_H : COL_V]!, L = st.cols[ohlc ? COL_L : COL_V]!, C = st.cols[ohlc ? COL_C : COL_V]!;\n const COL = ohlc ? st.cols[COL_BAR_COLOR] : st.cols[COL_COLOR];\n const a = Math.max(v.lo - 1, st.first), b = Math.min(v.hi + 1, st.end - 1);\n for (let i = a; i <= b; i++) {\n const p = st.head + (i - st.first);\n const o = O[p]!;\n if (o !== o) continue;\n fn(t.x(i) * dpr, o, H[p]!, L[p]!, C[p]!, COL ? COL[p]! : 0);\n }\n return;\n }\n const lv = d.lod.level(level);\n if (!lv) return;\n const O = lv.cols[LOD_O]!, H = lv.cols[LOD_H]!, L = lv.cols[LOD_L]!, C = lv.cols[LOD_C]!, COL = lv.cols[LOD_COLOR];\n const half = ((1 << level) - 1) / 2;\n const a = Math.max((v.lo >> level) - 1, lv.first), b = Math.min((v.hi >> level) + 1, lv.end - 1);\n for (let k = a; k <= b; k++) {\n const p = lv.head + (k - lv.first);\n const o = O[p]!;\n if (o !== o) continue;\n fn(t.x((k << level) + half) * dpr, o, H[p]!, L[p]!, C[p]!, COL ? COL[p]! : 0);\n }\n}\n\nconst levelOf = (v: DrawView2D) => chooseLevel(v.data, v.time.spacing * v.dpr);\nconst Y = (v: DrawView2D, p: number) => v.price.y(p) * v.dpr;\nconst snap = (y: number) => Math.floor(y + 0.5);\n\nabstract class Base<O> implements SeriesRenderer2D<O> {\n abstract draw(view: DrawView2D, options: O): void;\n dataChanged(): void {}\n dispose(): void {}\n}\n\nexport class Candles2D extends Base<CandleStyle> {\n draw(v: DrawView2D, o: CandleStyle): void {\n const level = levelOf(v);\n const [bw, ww] = barWidths(v.time.spacing, v.dpr, level, 0.8);\n const bodyUp = new Path2D(), bodyDown = new Path2D(), wickUp = new Path2D(), wickDown = new Path2D();\n // bars with their own colour: one path per colour (body and wick alike), drawn after the plain ones\n let own: Map<number, Path2D> | undefined;\n eachUnit(v, level, (x, op, h, l, c, color) => {\n const left = Math.floor(x - bw / 2 + 0.5);\n const up = c >= op;\n const yh = snap(Y(v, h)), yl = Math.max(snap(Y(v, l)), yh + 1);\n const yt = snap(Y(v, Math.max(op, c))), yb = Math.max(snap(Y(v, Math.min(op, c))), yt + 1);\n if (color !== 0) {\n let p = (own ??= new Map()).get(color);\n if (!p) own.set(color, (p = new Path2D()));\n p.rect(left + (bw - ww) / 2, yh, ww, yl - yh);\n p.rect(left, yt, bw, yb - yt);\n return;\n }\n (up ? wickUp : wickDown).rect(left + (bw - ww) / 2, yh, ww, yl - yh);\n (up ? bodyUp : bodyDown).rect(left, yt, bw, yb - yt);\n });\n const ctx = v.ctx;\n ctx.fillStyle = o.wickUpColor;\n ctx.fill(wickUp);\n ctx.fillStyle = o.wickDownColor;\n ctx.fill(wickDown);\n ctx.fillStyle = o.upColor;\n ctx.fill(bodyUp);\n ctx.fillStyle = o.downColor;\n ctx.fill(bodyDown);\n if (own) for (const [color, p] of own) { ctx.fillStyle = cssColor(color); ctx.fill(p); }\n }\n}\n\nexport class Bars2D extends Base<BarStyle> {\n draw(v: DrawView2D, o: BarStyle): void {\n const level = levelOf(v);\n const [bw, t] = barWidths(v.time.spacing, v.dpr, level, 0.8);\n const up = new Path2D(), down = new Path2D();\n let own: Map<number, Path2D> | undefined;\n eachUnit(v, level, (x, op, h, l, c, color) => {\n let p = c >= op ? up : down;\n if (color !== 0) {\n p = (own ??= new Map()).get(color) ?? new Path2D();\n own.set(color, p);\n }\n const left = Math.floor(x - bw / 2 + 0.5);\n const mid = left + (bw - t) / 2;\n const yh = snap(Y(v, h)), yl = Math.max(snap(Y(v, l)), yh + 1);\n p.rect(mid, yh, t, yl - yh);\n p.rect(left, Math.floor(Y(v, op) - t / 2 + 0.5), mid - left, t);\n p.rect(mid + t, Math.floor(Y(v, c) - t / 2 + 0.5), left + bw - mid - t, t);\n });\n v.ctx.fillStyle = o.upColor;\n v.ctx.fill(up);\n v.ctx.fillStyle = o.downColor;\n v.ctx.fill(down);\n if (own) for (const [color, p] of own) { v.ctx.fillStyle = cssColor(color); v.ctx.fill(p); }\n }\n}\n\nexport class Histogram2D extends Base<HistogramStyle> {\n draw(v: DrawView2D, o: HistogramStyle): void {\n const level = levelOf(v);\n const [bw] = barWidths(v.time.spacing, v.dpr, level, 0.8);\n const byColor = new Map<number, Path2D>();\n // On a log scale a base at or below zero sits at the pane's lowest value.\n const yb = snap((v.price.logCoords && !(o.base > 0) ? v.price.yOfDisplay(v.price.min) : v.price.y(o.base)) * v.dpr);\n eachUnit(v, level, (x, _o, h, l, _c, color) => {\n const val = Math.abs(h - o.base) >= Math.abs(l - o.base) ? h : l;\n const yv = snap(Y(v, val));\n const y0 = Math.min(yv, yb), y1 = Math.max(Math.max(yv, yb), y0 + 1);\n let p = byColor.get(color);\n if (!p) byColor.set(color, (p = new Path2D()));\n p.rect(Math.floor(x - bw / 2 + 0.5), y0, bw, y1 - y0);\n });\n for (const [color, p] of byColor) {\n v.ctx.fillStyle = color === 0 ? o.color : cssColor(color);\n v.ctx.fill(p);\n }\n }\n}\n\n/** Path through every present unit; zoomed out, each bucket's full low..high. */\nfunction linePath(v: DrawView2D, level: number, valueOf: \"c\" | \"h\"): { path: Path2D; first: number; last: number } {\n const path = new Path2D();\n let started = false, first = 0, last = 0;\n eachUnit(v, level, (x, o, h, l, c) => {\n if (level === 0 || valueOf === \"h\") {\n const y = Y(v, valueOf === \"h\" ? h : c);\n if (started) path.lineTo(x, y);\n else {\n path.moveTo(x, y);\n first = x;\n started = true;\n }\n } else {\n if (started) path.lineTo(x, Y(v, o));\n else {\n path.moveTo(x, Y(v, o));\n first = x;\n started = true;\n }\n path.lineTo(x, Y(v, h));\n path.lineTo(x, Y(v, l));\n path.lineTo(x, Y(v, c));\n }\n last = x;\n });\n return { path, first, last };\n}\n\nfunction stroke(v: DrawView2D, path: Path2D, color: string, width: number): void {\n const ctx = v.ctx;\n ctx.strokeStyle = color;\n ctx.lineWidth = Math.max(1, width * v.dpr);\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.stroke(path);\n}\n\n/**\n * A line whose points carry their own colours: each segment, drawn from the previous unit to this one, takes this\n * unit's colour (0 = the series colour), one path per colour. Used only when the series may hold coloured points.\n */\nfunction colouredLine(v: DrawView2D, level: number, color: string, width: number): void {\n const byColor = new Map<number, Path2D>();\n let px = 0, py = 0, have = false;\n eachUnit(v, level, (x, o, h, l, c, col) => {\n let p = byColor.get(col);\n if (!p) byColor.set(col, (p = new Path2D()));\n // zoomed out a unit is a bucket: its envelope, in the order the plain path walks it\n const ys = level === 0 ? [Y(v, c)] : [Y(v, o), Y(v, h), Y(v, l), Y(v, c)];\n if (have) {\n p.moveTo(px, py);\n p.lineTo(x, ys[0]!);\n }\n if (level !== 0) for (let k = 1; k < ys.length; k++) { if (k === 1) p.moveTo(x, ys[0]!); p.lineTo(x, ys[k]!); }\n px = x;\n py = ys[ys.length - 1]!;\n have = true;\n });\n for (const [col, p] of byColor) stroke(v, p, col === 0 ? color : cssColor(col), width);\n}\n\nexport class Line2D extends Base<LineStyle> {\n draw(v: DrawView2D, o: LineStyle): void {\n const level = levelOf(v);\n if (v.data.pointColors) colouredLine(v, level, o.color, o.lineWidth);\n else stroke(v, linePath(v, level, \"c\").path, o.color, o.lineWidth);\n }\n}\n\nexport class Area2D extends Base<AreaStyle> {\n draw(v: DrawView2D, o: AreaStyle): void {\n const level = levelOf(v);\n const fill = linePath(v, level, \"h\");\n const area = new Path2D(fill.path);\n area.lineTo(fill.last, v.height);\n area.lineTo(fill.first, v.height);\n area.closePath();\n const g = v.ctx.createLinearGradient(0, 0, 0, v.height);\n g.addColorStop(0, o.topColor);\n g.addColorStop(1, o.bottomColor);\n v.ctx.fillStyle = g;\n v.ctx.fill(area);\n if (v.data.pointColors) colouredLine(v, level, o.lineColor, o.lineWidth);\n else stroke(v, linePath(v, level, \"c\").path, o.lineColor, o.lineWidth);\n }\n}\n","// Series type registry: the plugin seam for new series kinds.\n//\n// Built-in types register through the same call third parties use, so the\n// contract is exercised by every chart. A type names its data shape (OHLC or\n// single value), its default options (from the theme, so unset colours follow\n// a theme switch), a WebGL renderer, and how it reports autoscale and the\n// value shown on the price axis.\n\nimport type { SeriesData, SeriesShape } from \"../data/model.js\";\nimport { COL_C, COL_COLOR, COL_O, COL_V } from \"../data/model.js\";\nimport { cssColor } from \"../render/color.js\";\nimport { Area2D, Bars2D, Candles2D, Histogram2D, Line2D, type SeriesRenderer2D } from \"../render/canvas2d.js\";\nimport type { GLContext } from \"../render/gl.js\";\nimport {\n AreaRenderer, BarRenderer, CandleRenderer, HistogramRenderer, LineRenderer,\n type AreaStyle, type BarStyle, type CandleStyle, type HistogramStyle, type LineStyle, type SeriesRenderer,\n} from \"../render/renderers.js\";\nimport type { PriceFormat } from \"../scale/format.js\";\nimport type { Theme } from \"./theme.js\";\n\n/** Options every series has, whatever its type. */\nexport interface CommonSeriesOptions {\n /** Stable id within the chart (layouts, custom formatters); assigned when empty. */\n id: string;\n /** \"right\", \"left\", or any other id for an overlay scale with no axis. */\n priceScaleId: string;\n /** Index of the pane the series is drawn in; a new index adds a pane. */\n pane: number;\n /** How values are written. A price format without minMove takes it from the data. */\n priceFormat: PriceFormat;\n /**\n * This series formats its price axis. Otherwise the axis uses the first\n * non-volume series on the scale.\n */\n scaleFormat: boolean;\n visible: boolean;\n /** Label with the last value on the price axis. */\n lastValueVisible: boolean;\n /** Dashed line at the last value across the pane. */\n priceLineVisible: boolean;\n /** Tag next to the last-value label on the price axis side, inside the pane; only drawn when `lastValueVisible`. Empty shows nothing. */\n title: string;\n /**\n * Adjusts this series' contribution to its price scale's autoscale, after\n * the built-in min/max over the visible bars. `range` is null when the series\n * has nothing visible; return the range to use (null: contribute nothing).\n * Runs every frame: keep it cheap. A function is not saved by `saveState`,\n * so a restored layout has no override until it is set again.\n */\n autoscale?: (range: { low: number; high: number } | null) => { low: number; high: number } | null;\n}\n\n/** Built-in types. Plugins extend this interface by declaration merging. */\nexport interface SeriesOptionsMap {\n candles: CandleStyle;\n bars: BarStyle;\n line: LineStyle;\n area: AreaStyle;\n histogram: HistogramStyle;\n}\nexport type SeriesType = keyof SeriesOptionsMap;\n\n/** Data shape per type; plugins extend this alongside SeriesOptionsMap. */\nexport interface SeriesShapes {\n candles: \"ohlc\";\n bars: \"ohlc\";\n line: \"value\";\n area: \"value\";\n histogram: \"value\";\n}\nexport type SeriesOptions<T extends SeriesType> = CommonSeriesOptions & SeriesOptionsMap[T];\n\nexport interface LastValue {\n value: number;\n /** CSS colour of the axis label. */\n color: string;\n}\n\nexport interface SeriesTypeDef<O> {\n readonly shape: SeriesShape;\n defaults(theme: Theme): O & Partial<CommonSeriesOptions>;\n createRenderer(gl: WebGL2RenderingContext, ctx: GLContext, data: SeriesData): SeriesRenderer<O>;\n /** Canvas2D renderer, used when WebGL2 is unavailable. A type without one cannot draw there. */\n createRenderer2D?(data: SeriesData): SeriesRenderer2D<O>;\n /** [low, high] over indices [lo, hi] into `out`; NaN when nothing is there. */\n autoscale(data: SeriesData, options: O, lo: number, hi: number, out: Float64Array): void;\n /** Value and colour for the axis label at index i. */\n valueAt(data: SeriesData, options: O, i: number): LastValue | undefined;\n}\n\nconst registry = new Map<string, SeriesTypeDef<unknown>>();\n\nexport function registerSeriesType<T extends SeriesType>(type: T, def: SeriesTypeDef<SeriesOptionsMap[T]>): void {\n const prev = registry.get(type);\n // Re-registering the same definition (HMR, a module loaded twice) is fine;\n // a different one under the same name is a conflict.\n if (prev === def) return;\n if (prev) throw new Error(`alphacharts: series type \"${type}\" is already registered with a different definition`);\n registry.set(type, def as SeriesTypeDef<unknown>);\n}\n\nexport function seriesType<T extends SeriesType>(type: T): SeriesTypeDef<SeriesOptionsMap[T]> {\n const def = registry.get(type);\n if (!def) throw new Error(`alphacharts: unknown series type \"${type}\"`);\n return def as SeriesTypeDef<SeriesOptionsMap[T]>;\n}\n\n// ---- built-ins --------------------------------------------------------------\n\nconst lodRange = (d: SeriesData, _o: unknown, lo: number, hi: number, out: Float64Array) => void d.lod.minMax(lo, hi, out);\n\nfunction ohlcValue(d: SeriesData, i: number, up: string, down: string): LastValue | undefined {\n if (!d.has(i)) return undefined;\n const c = d.get(i, COL_C);\n return { value: c, color: c >= d.get(i, COL_O) ? up : down };\n}\n\nregisterSeriesType(\"candles\", {\n shape: \"ohlc\",\n defaults: (t) => ({ upColor: t.up, downColor: t.down, wickUpColor: t.up, wickDownColor: t.down }),\n createRenderer: (gl, ctx, d) => new CandleRenderer(gl, ctx, d),\n createRenderer2D: () => new Candles2D(),\n autoscale: lodRange,\n valueAt: (d, o, i) => ohlcValue(d, i, o.upColor, o.downColor),\n});\n\nregisterSeriesType(\"bars\", {\n shape: \"ohlc\",\n defaults: (t) => ({ upColor: t.up, downColor: t.down }),\n createRenderer: (gl, ctx, d) => new BarRenderer(gl, ctx, d),\n createRenderer2D: () => new Bars2D(),\n autoscale: lodRange,\n valueAt: (d, o, i) => ohlcValue(d, i, o.upColor, o.downColor),\n});\n\nregisterSeriesType(\"line\", {\n shape: \"value\",\n defaults: (t) => ({ color: t.accent, lineWidth: 2 }),\n createRenderer: (gl, ctx, d) => new LineRenderer(gl, ctx, d),\n createRenderer2D: () => new Line2D(),\n autoscale: lodRange,\n valueAt: (d, o, i) => (d.has(i) ? { value: d.get(i, COL_V), color: o.color } : undefined),\n});\n\nregisterSeriesType(\"area\", {\n shape: \"value\",\n defaults: (t) => ({ lineColor: t.accent, topColor: \"rgba(41,98,255,0.28)\", bottomColor: \"rgba(41,98,255,0.02)\", lineWidth: 2 }),\n createRenderer: (gl, ctx, d) => new AreaRenderer(gl, ctx, d),\n createRenderer2D: () => new Area2D(),\n autoscale: lodRange,\n valueAt: (d, o, i) => (d.has(i) ? { value: d.get(i, COL_V), color: o.lineColor } : undefined),\n});\n\nregisterSeriesType(\"histogram\", {\n shape: \"value\",\n defaults: (t) => ({ color: t.accent, base: 0 }),\n createRenderer: (gl, ctx, d) => new HistogramRenderer(gl, ctx, d),\n createRenderer2D: () => new Histogram2D(),\n autoscale: (d, o, lo, hi, out) => {\n d.lod.minMax(lo, hi, out);\n if (out[0]! === out[0]!) {\n out[0] = Math.min(out[0]!, o.base);\n out[1] = Math.max(out[1]!, o.base);\n }\n },\n valueAt: (d, o, i) => {\n if (!d.has(i)) return undefined;\n const c = d.get(i, COL_COLOR);\n return { value: d.get(i, COL_V), color: c !== 0 ? cssColor(c) : o.color };\n },\n});\n","// Public handle for one series on a chart.\n\nimport type { ColumnarColors, ColumnarOhlc, ColumnarValue, OhlcBar, SeriesData, ValuePoint } from \"../data/model.js\";\nimport { COL_C, COL_H, COL_L, COL_O, COL_V } from \"../data/model.js\";\nimport type { SeriesRenderer2D } from \"../render/canvas2d.js\";\nimport type { SeriesRenderer } from \"../render/renderers.js\";\nimport { parseColor } from \"../render/color.js\";\nimport { createFormatter, decimalsOf, type Formatter } from \"../scale/format.js\";\nimport { checkMarkers, type SeriesMarker } from \"./markers.js\";\nimport type { PanePrimitive } from \"./primitives.js\";\nimport { seriesType, type CommonSeriesOptions, type SeriesOptions, type SeriesOptionsMap, type SeriesShapes, type SeriesType, type SeriesTypeDef } from \"./series-types.js\";\nimport type { Theme } from \"./theme.js\";\n\n/** Input accepted by a series, from the shape its type declares. */\nexport type SeriesInput<T extends SeriesType> = SeriesShapes[T] extends \"ohlc\" ? readonly OhlcBar[] | ColumnarOhlc : readonly ValuePoint[] | ColumnarValue;\nexport type SeriesBar<T extends SeriesType> = SeriesShapes[T] extends \"ohlc\" ? OhlcBar : ValuePoint;\n\n/** Rows sampled from each end when deriving decimals from the data. */\nconst SAMPLE = 2048;\n\n/** Parse every *Color option now, so a bad value throws at the call site. */\nfunction validateColors(options: object): void {\n const a = (options as { autoscale?: unknown }).autoscale;\n if (a !== undefined && typeof a !== \"function\") throw new TypeError(`alphacharts: series option autoscale must be a function, got ${typeof a}`);\n for (const [k, v] of Object.entries(options)) if (/color$/i.test(k) && v !== undefined) parseColor(v as string);\n}\n\nexport const DEFAULT_COMMON: CommonSeriesOptions = {\n id: \"\",\n priceScaleId: \"right\",\n pane: 0,\n priceFormat: { type: \"price\" },\n scaleFormat: false,\n visible: true,\n lastValueVisible: true,\n priceLineVisible: true,\n title: \"\",\n};\n\n/** The chart side of a series: what Series calls back into. */\nexport interface SeriesHost {\n setData(s: Series<SeriesType>, input: unknown): void;\n prepend(s: Series<SeriesType>, input: unknown): void;\n update(s: Series<SeriesType>, bar: unknown): void;\n setColors(s: Series<SeriesType>, colors: ColumnarColors): void;\n clearColors(s: Series<SeriesType>): void;\n optionsChanged(s: Series<SeriesType>, paneOrScaleMoved: boolean): void;\n markersChanged(s: Series<SeriesType>): void;\n /** Pane-relative y of a price on the series' scale; NaN when the scale has no range yet. */\n priceToY(s: Series<SeriesType>, price: number): number;\n yToPrice(s: Series<SeriesType>, y: number): number;\n attachPrimitive(s: Series<SeriesType>, p: PanePrimitive): void;\n detachPrimitive(s: Series<SeriesType>, p: PanePrimitive): void;\n timeAt(index: number): number;\n indexOf(time: number): number | undefined;\n readonly locale: string | undefined;\n}\n\nexport class Series<T extends SeriesType> {\n /** @internal */ renderer: SeriesRenderer<SeriesOptionsMap[T]> | null = null;\n /** @internal */ renderer2d: SeriesRenderer2D<SeriesOptionsMap[T]> | null = null;\n /** @internal */ readonly def: SeriesTypeDef<SeriesOptionsMap[T]>;\n /** @internal */ formatter: Formatter;\n /** Decimals seen in the data so far; only grows. */\n private dataDecimals = 0;\n private markerList: SeriesMarker[] = [];\n private user: Partial<SeriesOptions<T>>;\n private effective: SeriesOptions<T>;\n\n /** @internal */\n constructor(\n readonly type: T,\n /** Columnar bar store (read-only by contract): study packages read OHLC/value columns from it. */ readonly data: SeriesData,\n private readonly host: SeriesHost,\n options: Partial<SeriesOptions<T>>,\n theme: Theme,\n ) {\n this.def = seriesType(type);\n validateColors(options);\n this.user = { ...options };\n this.effective = this.resolve(theme);\n this.formatter = this.makeFormatter();\n }\n\n options(): Readonly<SeriesOptions<T>> {\n return this.effective;\n }\n\n applyOptions(options: Partial<SeriesOptions<T>>): void {\n validateColors(options);\n const prev = this.effective;\n this.user = { ...this.user, ...options };\n this.effective = this.resolveFrom(prev);\n if (this.effective.priceFormat !== prev.priceFormat) this.formatter = this.makeFormatter();\n this.host.optionsChanged(this as never, this.effective.pane !== prev.pane || this.effective.priceScaleId !== prev.priceScaleId);\n }\n\n /** Replace all data. Times are UTC ms, strictly increasing. */\n setData(data: SeriesInput<T>): void {\n this.host.setData(this as never, data);\n }\n\n /** Older history, all earlier than the first bar. */\n prepend(data: SeriesInput<T>): void {\n this.host.prepend(this as never, data);\n }\n\n /** Live bar: same time as the last bar replaces it, a later time appends. */\n update(bar: SeriesBar<T>): void {\n this.host.update(this as never, bar);\n }\n\n /**\n * Colour individual bars of a candle or OHLC-bar series (`colors.color`: packed 0xRRGGBBAA, 0 = the series' own up/down\n * colours), by time; a time with no bar is ignored. Colours belong to (series, time): `update`, `prepend` and `setData`\n * keep the colours of the bars they keep. Writing the colour a bar already has changes and redraws nothing.\n */\n setBarColors(this: Series<\"candles\" | \"bars\">, colors: ColumnarColors): void {\n this.host.setColors(this as never, colors);\n }\n\n /** Remove every bar colour (the colour column too): the series draws in its up/down colours again. */\n clearBarColors(this: Series<\"candles\" | \"bars\">): void {\n this.host.clearColors(this as never);\n }\n\n /** The bar at `time`, or undefined. Values are the exact inputs (Float64). */\n barAt(time: number): SeriesBar<T> | undefined {\n const i = this.host.indexOf(time);\n return i === undefined ? undefined : this.barAtIndex(i);\n }\n\n /** @internal */\n barAtIndex(i: number): SeriesBar<T> | undefined {\n const d = this.data;\n if (!d.has(i)) return undefined;\n const time = this.host.timeAt(i);\n if (d.shape === \"ohlc\") {\n return { time, open: d.get(i, COL_O), high: d.get(i, COL_H), low: d.get(i, COL_L), close: d.get(i, COL_C) } as SeriesBar<T>;\n }\n return { time, value: d.get(i, COL_V) } as SeriesBar<T>;\n }\n\n /** Index range of the series' bars on the chart's timeline. */\n range(): { first: number; last: number } | undefined {\n const first = this.data.firstIndex();\n const last = this.data.lastIndex();\n return first === undefined || last === undefined ? undefined : { first, last };\n }\n\n /**\n * Replace the series' markers (an empty array clears them). Every marker's\n * `time` must be the time of a bar of this series, else this throws naming\n * the marker and changes nothing; ids must be unique. Markers are not part of\n * `saveState`, like the bar data they annotate.\n */\n setMarkers(markers: readonly SeriesMarker[]): void {\n this.markerList = checkMarkers(markers, (t) => {\n const i = this.host.indexOf(t);\n return i !== undefined && this.data.has(i);\n });\n this.host.markersChanged(this as never);\n }\n\n /** The current markers, sorted by time. */\n markers(): readonly SeriesMarker[] {\n return this.markerList;\n }\n\n /**\n * CSS y within the pane of a price on this series' price scale, or NaN while\n * the scale has no range yet (no data, or before the chart's first frame).\n */\n priceToCoordinate(price: number): number {\n return this.host.priceToY(this as never, price);\n }\n\n /** Inverse of `priceToCoordinate`: the price at pane-relative CSS y; NaN while the scale has no range. */\n coordinateToPrice(y: number): number {\n return this.host.yToPrice(this as never, y);\n }\n\n formatPrice(p: number): string {\n return this.formatter.format(p);\n }\n\n attachPrimitive(p: PanePrimitive): void {\n this.host.attachPrimitive(this as never, p);\n }\n\n detachPrimitive(p: PanePrimitive): void {\n this.host.detachPrimitive(this as never, p);\n }\n\n /**\n * @internal Widen the derived precision to cover rows [lo, hi). Called by\n * the chart after every data change; samples the ends of large ranges.\n */\n observeData(lo: number, hi: number): void {\n const d = this.data;\n const col = d.shape === \"ohlc\" ? COL_C : COL_V;\n const cols = d.shape === \"ohlc\" ? [COL_O, COL_H, COL_L, COL_C] : [col];\n let dec = this.dataDecimals;\n const scan = (a: number, b: number) => {\n for (let i = a; i < b; i++) {\n if (!d.has(i)) continue;\n for (const c of cols) dec = Math.max(dec, decimalsOf(d.get(i, c)));\n }\n };\n if (hi - lo <= SAMPLE * 2) scan(lo, hi);\n else {\n scan(lo, lo + SAMPLE);\n scan(hi - SAMPLE, hi);\n }\n if (dec !== this.dataDecimals) {\n this.dataDecimals = dec;\n this.formatter = this.makeFormatter();\n }\n }\n\n private makeFormatter(): Formatter {\n return createFormatter(this.effective.priceFormat, 10 ** -this.dataDecimals, this.host.locale);\n }\n\n /** @internal Re-resolve defaults after a theme change. */\n themeChanged(theme: Theme): void {\n this.effective = this.resolve(theme);\n }\n\n private resolve(theme: Theme): SeriesOptions<T> {\n return { ...DEFAULT_COMMON, ...this.def.defaults(theme), ...this.user } as SeriesOptions<T>;\n }\n\n private resolveFrom(prev: SeriesOptions<T>): SeriesOptions<T> {\n return { ...prev, ...this.user } as SeriesOptions<T>;\n }\n}\n","// Theme tokens. Everything visual the chart draws comes from here or from\n// series options; nothing is branded. Switch live with chart.applyOptions({ theme }).\n\nexport interface Theme {\n background: string;\n text: string;\n /** Secondary text: axis labels. */\n textMuted: string;\n grid: string;\n border: string;\n crosshair: string;\n /** Background of crosshair/axis labels. */\n labelBackground: string;\n labelText: string;\n fontFamily: string;\n /** CSS px. */\n fontSize: number;\n up: string;\n down: string;\n accent: string;\n /** Shade behind bars outside regular trading hours. */\n extendedHours: string;\n}\n\nexport const DARK: Theme = {\n background: \"#0f1115\",\n text: \"#d1d4dc\",\n textMuted: \"#8b909a\",\n grid: \"#1c2028\",\n border: \"#2a2e39\",\n crosshair: \"#9598a1\",\n labelBackground: \"#363a45\",\n labelText: \"#e9eaee\",\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 11,\n up: \"#26a69a\",\n down: \"#ef5350\",\n accent: \"#2962ff\",\n extendedHours: \"rgba(41,98,255,0.06)\",\n};\n\nexport const LIGHT: Theme = {\n background: \"#ffffff\",\n text: \"#131722\",\n textMuted: \"#5d606b\",\n grid: \"#f0f3fa\",\n border: \"#e0e3eb\",\n crosshair: \"#9598a1\",\n labelBackground: \"#131722\",\n labelText: \"#ffffff\",\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 11,\n up: \"#089981\",\n down: \"#f23645\",\n accent: \"#2962ff\",\n extendedHours: \"rgba(41,98,255,0.05)\",\n};\n\n/** WCAG AAA contrast for text and marks; no translucent grid. */\nexport const HIGH_CONTRAST: Theme = {\n background: \"#000000\",\n text: \"#ffffff\",\n textMuted: \"#ffffff\",\n grid: \"#3a3a3a\",\n border: \"#ffffff\",\n crosshair: \"#ffffff\",\n labelBackground: \"#ffffff\",\n labelText: \"#000000\",\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n fontSize: 12,\n up: \"#00ff7f\",\n down: \"#ff4d4d\",\n accent: \"#4da3ff\",\n extendedHours: \"rgba(255,255,255,0.12)\",\n};\n\n/** Dark, light or high contrast, from the OS preferences right now. */\nexport function systemTheme(): Theme {\n if (typeof matchMedia === \"undefined\") return DARK;\n if (matchMedia(\"(prefers-contrast: more)\").matches) return HIGH_CONTRAST;\n return matchMedia(\"(prefers-color-scheme: light)\").matches ? LIGHT : DARK;\n}\n\n","// User-visible strings the chart itself produces (aria labels, the\n// screen-reader readout and table, the countdown's day suffix). They go\n// through one injectable function so a UI shell can translate them; the\n// English defaults here are what the chart says without one.\n//\n// `{name}` placeholders are filled by the chart. A custom function receives\n// the key and the raw values and returns the finished text; it should throw\n// on a key it does not know rather than return something wrong.\n\nexport const CHART_MESSAGES = {\n \"chart.ariaLabel\": \"Price chart\",\n \"chart.readout.ohlc\": \"{name} open {open} high {high} low {low} close {close}\",\n \"chart.readout.value\": \"{name} {value}\",\n \"chart.table.time\": \"Time\",\n \"chart.table.open\": \"Open\",\n \"chart.table.high\": \"High\",\n \"chart.table.low\": \"Low\",\n \"chart.table.close\": \"Close\",\n \"chart.table.value\": \"Value\",\n \"chart.table.caption\": \"{label}: {name}, visible bars, newest first\",\n \"chart.countdown.days\": \"{n}d\",\n} as const;\n\nexport type ChartMessageKey = keyof typeof CHART_MESSAGES;\nexport type ChartMessageValues = Readonly<Record<string, string | number>>;\nexport type ChartMessages = (key: ChartMessageKey, values?: ChartMessageValues) => string;\n\n/** English defaults: substitutes `{name}` placeholders, throws on an unknown key. */\nexport const defaultMessages: ChartMessages = (key, values = {}) => {\n const template = CHART_MESSAGES[key] as string | undefined;\n if (template === undefined) throw new Error(`alphacharts: unknown chart message key \"${key}\"`);\n return template.replace(/\\{(\\w+)\\}/g, (_, name: string) => {\n const v = values[name];\n if (v === undefined) throw new Error(`alphacharts: chart message \"${key}\" needs a value for \"${name}\"`);\n return String(v);\n });\n};\n","// Trading sessions and holidays, as data.\n//\n// A session calendar names, per weekday, the regular trading windows in the\n// exchange's time zone (minutes from local midnight, end exclusive; a window\n// may cross midnight), optional extended windows, and holiday dates. Crypto\n// is `ALWAYS_OPEN`. The chart uses it to shade bars outside regular hours and\n// the resampler uses it to align intraday buckets to the session open and to\n// make a daily bar out of one trading day.\n\nimport { DAY_MS, TimeZone } from \"./tz.js\";\n\n/** [start, end) in minutes from local midnight; end may exceed 1440 (crosses midnight). */\nexport type Window = readonly [number, number];\n\nexport interface SessionSpec {\n timeZone: string;\n /** Index 0 = Sunday … 6 = Saturday. Empty array: closed that weekday. */\n regular: readonly (readonly Window[])[];\n /** Pre/post-market windows; bars in them are \"extended\", not \"closed\". */\n extended?: readonly (readonly Window[])[];\n /** Local dates \"YYYY-MM-DD\" with no trading. */\n holidays?: readonly string[];\n}\n\nexport type SessionState = \"regular\" | \"extended\" | \"closed\";\n\nconst all = (w: Window[]) => [w, w, w, w, w, w, w] as const;\n\nexport const ALWAYS_OPEN: SessionSpec = { timeZone: \"UTC\", regular: all([[0, 1440]]) };\n\n/** Monday–Friday windows, weekends closed. */\nexport function weekdays(timeZone: string, regular: Window[], extended?: Window[], holidays?: string[]): SessionSpec {\n const days = (w: Window[]) => [[], w, w, w, w, w, []] as const;\n return { timeZone, regular: days(regular), ...(extended ? { extended: days(extended) } : {}), ...(holidays ? { holidays } : {}) };\n}\n\n/** NSE/BSE cash: 09:15–15:30 IST. Holidays are the integrator's to supply. */\nexport const NSE = (holidays: string[] = []) => weekdays(\"Asia/Kolkata\", [[555, 930]], [[540, 555]], holidays);\n/** NYSE/Nasdaq: 09:30–16:00 ET, pre 04:00–09:30, post 16:00–20:00. */\nexport const US_EQUITY = (holidays: string[] = []) => weekdays(\"America/New_York\", [[570, 960]], [[240, 570], [960, 1200]], holidays);\n\nexport class Sessions {\n readonly tz: TimeZone;\n private readonly holidays: Set<string>;\n\n constructor(readonly spec: SessionSpec) {\n if (spec.regular.length !== 7) throw new RangeError(\"sessions: regular needs 7 weekdays (Sunday first)\");\n if (spec.extended && spec.extended.length !== 7) throw new RangeError(\"sessions: extended needs 7 weekdays (Sunday first)\");\n for (const day of [...spec.regular, ...(spec.extended ?? [])]) {\n for (const [a, b] of day) {\n if (!(a >= 0 && b > a && b - a <= 1440)) throw new RangeError(`sessions: bad window [${a}, ${b})`);\n }\n }\n for (const h of spec.holidays ?? []) if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(h)) throw new RangeError(`sessions: holiday \"${h}\" is not YYYY-MM-DD`);\n this.tz = new TimeZone(spec.timeZone);\n this.holidays = new Set(spec.holidays ?? []);\n }\n\n /** Is t (UTC ms) in a regular window, an extended one, or neither? */\n state(t: number): SessionState {\n const local = t + this.tz.offset(t);\n // A window that crosses midnight belongs to the day it started on.\n for (const back of [0, 1]) {\n const day = Math.floor(local / DAY_MS) - back;\n if (this.isHolidayDay(day)) continue;\n const min = (local - day * DAY_MS) / 60_000;\n const wd = weekday(day);\n if (inAny(this.spec.regular[wd]!, min)) return \"regular\";\n if (this.spec.extended && inAny(this.spec.extended[wd]!, min)) return \"extended\";\n }\n return \"closed\";\n }\n\n /**\n * Start (UTC ms) of the regular session containing t, or of the next one\n * if t is outside every session. Used to align buckets and daily bars.\n */\n sessionStart(t: number): number {\n const local = t + this.tz.offset(t);\n const today = Math.floor(local / DAY_MS);\n for (let day = today - 1; day <= today + 14; day++) {\n if (this.isHolidayDay(day)) continue;\n for (const [a, b] of this.spec.regular[weekday(day)]!) {\n const s = this.tz.fromLocal(day * DAY_MS + a * 60_000);\n const e = this.tz.fromLocal(day * DAY_MS + b * 60_000);\n if (t < e && (t >= s || day >= today)) return s;\n }\n }\n throw new RangeError(\"sessions: no regular session within two weeks (is every weekday closed?)\");\n }\n\n /** The local trading date \"YYYY-MM-DD\" a time belongs to (by its session start). */\n tradingDate(t: number): string {\n const s = this.sessionStart(t);\n const c = this.tz.civil(s);\n return `${c.year}-${String(c.month).padStart(2, \"0\")}-${String(c.day).padStart(2, \"0\")}`;\n }\n\n private isHolidayDay(day: number): boolean {\n if (this.holidays.size === 0) return false;\n const c = this.tz.civil(this.tz.fromLocal(day * DAY_MS + 12 * 3_600_000));\n return this.holidays.has(`${c.year}-${String(c.month).padStart(2, \"0\")}-${String(c.day).padStart(2, \"0\")}`);\n }\n}\n\n/** 0 = Sunday for a count of days since 1970-01-01 (a Thursday). */\nfunction weekday(day: number): number {\n return (((day + 4) % 7) + 7) % 7;\n}\n\nfunction inAny(ws: readonly Window[], min: number): boolean {\n for (const [a, b] of ws) if (min >= a && min < b) return true;\n return false;\n}\n","// Custom timeframes: bars of any resolution built from a finer one.\n//\n// Buckets, in the chart's time zone:\n// s, m, h aligned to the session open when a calendar is given (a 75-minute\n// bar on NSE starts 09:15, 10:30, …), else to local midnight;\n// D one trading day (session) or one local calendar day; nD groups\n// n calendar days counted from the epoch;\n// W weeks starting Monday 00:00 local;\n// M calendar months; nM groups n months counted from year 0.\n// A bucket's time is its start. Incremental: push() folds live source bars\n// in, and a revised last source bar (a tick update) replaces its previous\n// contribution instead of being added twice.\n\nimport { DAY_MS, TimeZone } from \"./tz.js\";\nimport { Sessions, type SessionSpec } from \"./session.js\";\n\nexport type ResolutionUnit = \"s\" | \"m\" | \"h\" | \"D\" | \"W\" | \"M\";\nexport interface Resolution {\n unit: ResolutionUnit;\n n: number;\n}\n\n/** \"30s\", \"5m\", \"75m\", \"4h\", \"1D\", \"1W\", \"3M\" (also \"15\" = 15 minutes, \"D\" = 1D). */\nexport function parseResolution(s: string): Resolution {\n const m = /^(\\d+)?([smhDWM])?$/.exec(s.trim());\n if (!m || (!m[1] && !m[2])) throw new RangeError(`resolution \"${s}\": expected e.g. 30s, 5m, 4h, 1D, 1W, 3M`);\n const n = m[1] ? Number(m[1]) : 1;\n if (!(n >= 1) || !Number.isInteger(n)) throw new RangeError(`resolution \"${s}\": count must be a positive integer`);\n return { unit: (m[2] ?? \"m\") as ResolutionUnit, n };\n}\n\nexport interface ResampledBar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\nconst MS = { s: 1000, m: 60_000, h: 3_600_000 } as const;\n\nexport class Resampler {\n private readonly tz: TimeZone;\n private readonly sessions: Sessions | null;\n /** Aggregate of the bucket's source bars except the last one. */\n private base: ResampledBar | null = null;\n private last: { time: number; bar: ResampledBar } | null = null;\n private bucket = Number.NaN;\n\n constructor(readonly res: Resolution, opts: { timeZone?: string; sessions?: SessionSpec } = {}) {\n if (!(res.n >= 1) || !Number.isInteger(res.n)) throw new RangeError(`resolution count must be a positive integer, got ${res.n}`);\n this.sessions = opts.sessions ? new Sessions(opts.sessions) : null;\n this.tz = this.sessions ? this.sessions.tz : new TimeZone(opts.timeZone ?? \"UTC\");\n }\n\n /** Start (UTC ms) of the bucket containing t. */\n bucketStart(t: number): number {\n const { unit, n } = this.res;\n const tz = this.tz;\n if (unit === \"s\" || unit === \"m\" || unit === \"h\") {\n const len = MS[unit] * n;\n const anchor = this.sessions ? this.sessions.sessionStart(t) : tz.fromLocal(Math.floor((t + tz.offset(t)) / DAY_MS) * DAY_MS);\n return anchor + Math.floor((t - anchor) / len) * len;\n }\n const local = t + tz.offset(t);\n if (unit === \"D\") {\n if (this.sessions && n === 1) return this.sessions.sessionStart(t);\n const day = Math.floor(local / DAY_MS);\n return tz.fromLocal(Math.floor(day / n) * n * DAY_MS);\n }\n if (unit === \"W\") {\n // Day 4 (1970-01-05) is the first Monday; weeks count from it.\n const day = Math.floor(local / DAY_MS);\n const week = Math.floor((day - 4) / 7);\n return tz.fromLocal((4 + Math.floor(week / n) * n * 7) * DAY_MS);\n }\n const c = tz.civil(t);\n const idx = Math.floor((c.year * 12 + (c.month - 1)) / n) * n;\n return tz.fromLocal(Date.UTC(Math.floor(idx / 12), idx % 12, 1));\n }\n\n /**\n * Fold one source bar in. Returns the bucket's bar and whether it replaced\n * the previous result (same bucket) or starts a new one. Source times must\n * not go backwards; the same time again is a revision of the last bar.\n */\n push(src: { time: number; open: number; high: number; low: number; close: number; volume?: number }): { bar: ResampledBar; replaced: boolean } {\n const v: ResampledBar = { time: src.time, open: src.open, high: src.high, low: src.low, close: src.close, volume: src.volume ?? 0 };\n if (this.last && src.time < this.last.time) throw new RangeError(`resample: source time ${src.time} is before the previous ${this.last.time}`);\n const b = this.bucketStart(src.time);\n if (b !== this.bucket) {\n this.bucket = b;\n this.base = null;\n this.last = { time: src.time, bar: v };\n return { bar: { ...v, time: b }, replaced: false };\n }\n if (this.last && this.last.time === src.time) {\n this.last = { time: src.time, bar: v }; // revision\n } else {\n this.base = this.base ? merge(this.base, this.last!.bar) : this.last!.bar;\n this.last = { time: src.time, bar: v };\n }\n const agg = this.base ? merge(this.base, v) : v;\n return { bar: { ...agg, time: b }, replaced: true };\n }\n\n /** Resample a whole history. */\n static batch(\n res: Resolution,\n src: { time: ArrayLike<number>; open: ArrayLike<number>; high: ArrayLike<number>; low: ArrayLike<number>; close: ArrayLike<number>; volume?: ArrayLike<number> },\n opts: { timeZone?: string; sessions?: SessionSpec } = {},\n ): ResampledBar[] {\n const r = new Resampler(res, opts);\n const out: ResampledBar[] = [];\n for (let i = 0; i < src.time.length; i++) {\n const { bar, replaced } = r.push({ time: src.time[i]!, open: src.open[i]!, high: src.high[i]!, low: src.low[i]!, close: src.close[i]!, volume: src.volume ? src.volume[i]! : 0 });\n if (replaced) out[out.length - 1] = bar;\n else out.push(bar);\n }\n return out;\n }\n}\n\nfunction merge(a: ResampledBar, b: ResampledBar): ResampledBar {\n return { time: a.time, open: a.open, high: Math.max(a.high, b.high), low: Math.min(a.low, b.low), close: b.close, volume: a.volume + b.volume };\n}\n","// The brand α mark (configurable: `visible`, `opacity`) at the bottom-left of the main pane, above the time\n// axis. Drawn on the overlay layer inside the pane's clip, so a chart in a\n// Dashboard carries its own inside its cell. The glyph has a halo in the chart\n// background so it stays legible over candles and volume.\n\nimport type { Theme } from \"./theme.js\";\n\nexport interface WatermarkOptions {\n visible: boolean;\n /** 0 to 1. */\n opacity: number;\n}\n\nexport const DEFAULT_WATERMARK: WatermarkOptions = { visible: true, opacity: 1 };\n\nexport function checkWatermarkOptions(o: WatermarkOptions): void {\n if (typeof o.visible !== \"boolean\") throw new TypeError(`alphacharts: watermark.visible must be a boolean, got ${String(o.visible)}`);\n if (!(o.opacity >= 0 && o.opacity <= 1)) throw new RangeError(`alphacharts: watermark.opacity must be between 0 and 1, got ${String(o.opacity)}`);\n}\n\n// α from the brand's alphabench_logo.svg (y up, 1024 box); GLYPH_BOX is the\n// cropped viewBox the brand's inline logo uses.\nconst GLYPH_PATH =\n \"M4405 7778 c-217 -11 -387 -42 -589 -109 -702 -233 -1309 -862 -1563 -1619 -85 -253 -124 -451 -148 -755 -18 -227 -18 -329 0 -531 30 -337 82 -568 190 -849 144 -372 337 -670 614 -945 354 -351 734 -551 1231 -649 209 -41 591 -41 800 0 267 52 453 119 660 237 306 175 558 411 729 685 33 51 48 67 66 67 18 0 25 -8 35 -47 70 -268 197 -492 353 -624 102 -85 277 -168 452 -214 151 -40 248 -49 500 -49 254 0 342 9 450 47 l40 14 3 417 c1 288 -1 416 -8 416 -6 0 -23 -6 -38 -14 -15 -7 -70 -28 -122 -46 -80 -28 -113 -34 -213 -38 -212 -8 -343 32 -454 141 -86 83 -139 201 -174 382 -18 96 -19 169 -19 2012 l0 1913 -415 0 -415 0 0 -380 c0 -447 4 -436 -100 -288 -134 191 -398 428 -606 544 -27 15 -63 35 -80 44 -44 26 -208 95 -289 123 -280 97 -554 132 -890 115z m485 -789 c412 -60 800 -291 1064 -634 189 -244 314 -515 371 -800 38 -191 40 -223 40 -520 0 -297 -3 -332 -41 -520 -137 -681 -658 -1252 -1279 -1402 -243 -58 -527 -58 -770 0 -586 141 -1091 664 -1254 1297 -58 227 -74 368 -74 630 0 478 97 835 320 1179 243 375 598 635 1012 741 169 44 425 56 611 29z\";\nconst GLYPH_X = 200, GLYPH_Y = 240, GLYPH_H = 560;\n\nconst HEIGHT = 20;\nconst INSET_X = 12;\nconst INSET_Y = 10;\nconst HALO = 3.5;\n/** Below these the mark would crowd the series, so it is not drawn. */\nconst MIN_PANE_W = 160;\nconst MIN_PANE_H = 120;\n\nlet glyph: Path2D | undefined;\n\n/** Draws into a context whose origin is the pane's top-left, in CSS px. */\nexport function drawWatermark(ctx: CanvasRenderingContext2D, paneW: number, paneH: number, th: Theme, o: WatermarkOptions): void {\n if (!o.visible || o.opacity === 0 || paneW < MIN_PANE_W || paneH < MIN_PANE_H) return;\n glyph ??= new Path2D(GLYPH_PATH);\n const sc = HEIGHT / GLYPH_H;\n ctx.save();\n ctx.globalAlpha = o.opacity;\n ctx.translate(INSET_X, paneH - INSET_Y - HEIGHT);\n ctx.scale(sc, sc);\n ctx.translate(-GLYPH_X, -GLYPH_Y);\n ctx.translate(0, 1024);\n ctx.scale(0.1, -0.1);\n ctx.lineJoin = \"round\";\n ctx.lineWidth = HALO / (sc * 0.1);\n ctx.strokeStyle = th.background;\n ctx.stroke(glyph);\n ctx.fillStyle = th.text;\n ctx.fill(glyph);\n ctx.restore();\n}\n","// The chart: DOM, layout, autoscale and the three render layers.\n//\n// Layers, bottom to top, one canvas each covering the whole chart:\n// bg (2D) background, grid, axes, separators — redrawn on view change\n// gl (WebGL2) every series — redrawn on view or data change\n// overlay (2D) crosshair, price lines, last-value labels, primitives —\n// redrawn on pointer moves without touching the other two\n// Panes are rectangles inside those canvases (scissor + viewport for GL).\n// Every frame starts with layout(): sync the time scale to the timeline,\n// autoscale each price scale over the visible bars, measure the axes. If that\n// changed anything, the layers that depend on it are promoted to dirty.\n\nimport { emitFault } from \"../fault.js\";\nimport { COL_H, COL_L, COL_V, DataModel, type ColumnarColors, type DataChange } from \"../data/model.js\";\nimport type { Timeline } from \"../data/timeline.js\";\nimport { TimeZone } from \"../data/tz.js\";\nimport { parseColor } from \"../render/color.js\";\nimport type { SurfaceChoice, SurfaceEvents, SurfaceKind } from \"../render/surface.js\";\nimport { OwnLayers, type Layers } from \"./layers.js\";\nimport type { ChartPlugin, PluginApi, PluginPaneView, PluginPointer } from \"./plugin.js\";\nimport { checkCustomOptions, LAYOUT_VERSION, migrate, plain, type ChartState, type SeriesState } from \"./layout.js\";\nimport type { DrawView } from \"../render/renderers.js\";\nimport { checkPriceScaleOptions, DEFAULT_PRICE_SCALE, PriceScale, type PriceScaleOptions } from \"../scale/price-scale.js\";\nimport type { Formatter } from \"../scale/format.js\";\nimport { axisText, scaleTicks, TimeFormatter, timeText, timeTicks, type TimeLabel, type TimeTick } from \"../scale/ticks.js\";\nimport { DEFAULT_TIME_SCALE, TimeScale, type TimeScaleOptions } from \"../scale/time-scale.js\";\nimport { Interaction } from \"../interaction/input.js\";\nimport { Emitter } from \"./emitter.js\";\nimport { crisp, PriceLine, type AxisLabel, type PanePrimitive, type PaneView, type PriceLineOptions, type RenderLayer } from \"./primitives.js\";\nimport { drawMarkers, markerLowerBound, placeMarkers, type PlacedMarker } from \"./markers.js\";\nimport { cancelRender, LAYER_ALL, LAYER_BG, LAYER_GL, LAYER_OVERLAY, requestRender, type Renderable } from \"./scheduler.js\";\nimport { Series } from \"./series.js\";\nimport { seriesType, type SeriesOptions, type SeriesType } from \"./series-types.js\";\nimport { DARK, HIGH_CONTRAST, LIGHT, systemTheme, type Theme } from \"./theme.js\";\nimport { defaultMessages, type ChartMessages } from \"./messages.js\";\nimport { Sessions, type SessionSpec } from \"../data/session.js\";\nimport { parseResolution, Resampler } from \"../data/resample.js\";\nimport { checkWatermarkOptions, DEFAULT_WATERMARK, drawWatermark, type WatermarkOptions } from \"./watermark.js\";\n\n// ---- options & events ---------------------------------------------------------\n\nexport interface CrosshairOptions {\n /**\n * \"magnet\" snaps the horizontal line to the main series' close; \"hidden\"\n * draws nothing but still reports crosshair events.\n */\n mode: \"magnet\" | \"normal\" | \"hidden\";\n visible: boolean;\n /** The crosshair's label on the price axis. False hides only that label; the line, the time label and events stay. */\n priceLabel: boolean;\n}\n\nexport interface GridOptions {\n /** Vertical lines at the time ticks. */\n vertLines: boolean;\n /** Horizontal lines at the price ticks. */\n horzLines: boolean;\n}\n\nexport interface InteractionOptions {\n pan: boolean;\n zoom: boolean;\n kinetic: boolean;\n keyboard: boolean;\n}\n\nexport interface ChartOptions {\n theme: Theme;\n /** \"UTC\" or an IANA zone; axis labels and day boundaries use it. */\n timeZone: string;\n locale: string | undefined;\n timeScale: TimeScaleOptions;\n crosshair: CrosshairOptions;\n /** Grid lines (theme colour); both on by default. */\n grid: GridOptions;\n /**\n * Format of the crosshair time label (and the screen-reader readout), e.g.\n * `{ day: \"2-digit\", month: \"short\", year: \"2-digit\", hour: \"2-digit\", minute: \"2-digit\" }`;\n * undefined keeps the default. The chart's `timeZone` and `locale` apply; the\n * options must not set `timeZone`. `timeLabel` takes precedence when set.\n */\n timeFormat: Intl.DateTimeFormatOptions | undefined;\n /** Show hours and minutes in the crosshair time label; \"auto\" decides from the bar interval. */\n timeVisible: boolean | \"auto\";\n /** Replaces the calendar text of the time axis and the crosshair time label (for an x axis that is not a clock). */\n timeLabel: TimeLabel | undefined;\n rightPriceScale: PriceScaleOptions;\n leftPriceScale: PriceScaleOptions;\n interaction: InteractionOptions;\n /** The brand mark at the bottom-left of the main pane; on by default, `{ visible: false }` hides it. */\n watermark: WatermarkOptions;\n /** Accessible name of the chart; default: the \"chart.ariaLabel\" message. */\n ariaLabel: string;\n /** Text for the chart's own user-visible strings (aria, readout, table, countdown); English by default. */\n messages: ChartMessages;\n /** Series surface: own WebGL2 context, Canvas2D, or auto. Fixed at creation. */\n renderer: SurfaceChoice;\n /** Trading hours: bars outside regular hours are shaded. */\n sessions: SessionSpec | null;\n /** Bar resolution (e.g. \"5m\", \"1D\"): enables the bar-close countdown. */\n resolution: string | null;\n /** Countdown to the current bar's close under the last-price label. */\n countdown: boolean;\n /** Key bindings; each action takes key strings like \"Shift+ArrowLeft\", \"Alt+R\". */\n keymap: Partial<Record<KeyAction, string[]>>;\n /** A visually hidden table of the visible bars for screen readers. */\n a11yTable: boolean;\n}\n\nexport type KeyAction =\n | \"panLeft\" | \"panRight\" | \"zoomIn\" | \"zoomOut\" | \"scrollToStart\" | \"scrollToLatest\"\n | \"crosshairLeft\" | \"crosshairRight\" | \"hideCrosshair\" | \"resetChart\";\n\nexport const DEFAULT_KEYMAP: Record<KeyAction, string[]> = {\n panLeft: [\"ArrowLeft\"],\n panRight: [\"ArrowRight\"],\n zoomIn: [\"ArrowUp\", \"+\", \"Shift++\", \"=\"],\n zoomOut: [\"ArrowDown\", \"-\", \"_\"],\n scrollToStart: [\"Home\"],\n scrollToLatest: [\"End\"],\n crosshairLeft: [\"Shift+ArrowLeft\"],\n crosshairRight: [\"Shift+ArrowRight\"],\n hideCrosshair: [\"Escape\"],\n resetChart: [\"Alt+R\", \"Alt+r\"],\n};\n\nexport type ChartOptionsInput = {\n [K in keyof ChartOptions]?: K extends \"theme\"\n ? Theme | \"dark\" | \"light\" | \"high-contrast\" | \"auto\" | Partial<Theme>\n : K extends \"sessions\" | \"resolution\" | \"messages\" | \"timeLabel\"\n ? ChartOptions[K]\n : ChartOptions[K] extends object | undefined\n ? Partial<ChartOptions[K]>\n : ChartOptions[K];\n};\n\n/** The object under the pointer: a series marker (by its id) or a primitive's hit (by its id). */\nexport interface HoveredObject {\n kind: \"marker\" | \"primitive\";\n id: string;\n}\n\nexport interface CrosshairEvent {\n /** Timeline index under the crosshair, if over data. */\n index?: number;\n time?: number;\n /** Pane-relative CSS px. */\n point?: { x: number; y: number };\n pane?: number;\n /** Marker or primitive item under the pointer; only for pointer-driven events. Markers win over primitives. */\n hovered?: HoveredObject;\n source: \"pointer\" | \"keyboard\" | \"sync\";\n}\n\nexport interface VisibleRangeEvent {\n /** Fractional timeline indices at the left and right edges. */\n from: number;\n to: number;\n /** What moved the view: input or the timeScale API (\"user\"), a SyncGroup, or new data. */\n source: \"user\" | \"sync\" | \"data\";\n}\n\nexport interface ChartEvents {\n crosshairMove: CrosshairEvent;\n click: CrosshairEvent;\n dblclick: CrosshairEvent;\n visibleRangeChange: VisibleRangeEvent;\n}\n\n// ---- internals ------------------------------------------------------------------\n\ninterface Pane {\n stretch: number;\n readonly scales: Map<string, PriceScale>;\n readonly series: Series<SeriesType>[];\n /** CSS px within the chart. */\n top: number;\n height: number;\n}\n\nexport type Region =\n | { kind: \"pane\"; pane: number; x: number; y: number }\n | { kind: \"priceAxis\"; pane: number; scaleId: string }\n | { kind: \"timeAxis\" }\n | { kind: \"separator\"; index: number }\n | { kind: \"none\" };\n\nconst SEPARATOR = 1;\nconst AXIS_PAD = 6;\nconst MIN_AXIS_W = 48;\n\nfunction resolveTheme(t: ChartOptionsInput[\"theme\"], base: Theme): Theme {\n if (t === undefined) return base;\n if (t === \"dark\") return DARK;\n if (t === \"light\") return LIGHT;\n if (t === \"high-contrast\") return HIGH_CONTRAST;\n if (t === \"auto\") return systemTheme();\n const theme = { ...base, ...t };\n // A colour the renderer cannot read fails here, at the call, not in a frame.\n for (const k of Object.keys(theme) as (keyof Theme)[]) {\n if (k !== \"fontFamily\" && k !== \"fontSize\") parseColor(theme[k] as string);\n }\n return theme;\n}\n\nexport class Chart implements Renderable {\n readonly element: HTMLDivElement;\n private readonly live: HTMLDivElement;\n private readonly layers: Layers;\n\n /** @internal */ readonly model = new DataModel();\n /** @internal */ readonly time: TimeScale;\n /** @internal */ readonly panes: Pane[] = [];\n private readonly events = new Emitter<ChartEvents>();\n private readonly primitives = new Map<Series<SeriesType>, Set<PanePrimitive>>();\n private readonly plugins = new Map<string, ChartPlugin>();\n /** What each plugin saved right after install: `restoreState` puts a plugin the layout does not mention back to it. */\n private readonly pluginInitial = new Map<string, unknown>();\n private cursorOverride: string | null = null;\n private lastPluginPane = 0;\n private intervalCache = -1;\n private seriesCounter = 0;\n private sessions: Sessions | null = null;\n private resampler: Resampler | null = null;\n private countdownTimer = 0;\n private autoTheme = false;\n private readonly mediaQueries: MediaQueryList[] = [];\n private table: HTMLTableElement | null = null;\n private tableTimer = 0;\n /** True when the caller set ariaLabel; otherwise it follows the \"chart.ariaLabel\" message. */\n private ariaLabelFixed: boolean;\n private opts: ChartOptions;\n private tz: TimeZone;\n private fmt: TimeFormatter;\n private readonly interaction: Interaction;\n private readonly resizeObs: ResizeObserver;\n private dprQuery: MediaQueryList | null = null;\n private removed = false;\n private readonly removeListeners: (() => void)[] = [];\n\n // Layout (CSS px).\n private cssW = 0;\n /** Device-px size of this chart's cell. */\n private devW = 1;\n private devH = 1;\n private cssH = 0;\n private dpr = 1;\n private leftW = 0;\n private rightW = 0;\n private timeH = 0;\n /** Time ticks for the current view, recomputed when the view changes. */\n private tticks: TimeTick[] = [];\n private tticksKey = \"\";\n private lastRange = { from: Number.NaN, to: Number.NaN };\n private viewSource: VisibleRangeEvent[\"source\"] = \"data\";\n private readonly minmax = new Float64Array(2);\n private readonly vis = { lo: 0, hi: -1 };\n /** Axis column widths per side, CSS px (index 0 is next to the panes). */\n private readonly axisCols: Record<\"left\" | \"right\", number[]> = { left: [], right: [] };\n private readonly widths = new Map<string, number>();\n private widthFont = \"\";\n\n /** @internal Crosshair in chart CSS px; `syncIndex` when driven by another chart. */\n crosshair: { x: number; y: number; pane: number } | null = null;\n private syncIndex: number | null = null;\n private crosshairSource: CrosshairEvent[\"source\"] = \"pointer\";\n private lastAnnounce = 0;\n\n /**\n * @param layers internal: a Dashboard passes its shared canvases; a\n * standalone chart creates its own.\n */\n constructor(container: HTMLElement, options: ChartOptionsInput = {}, layers?: (root: HTMLElement, events: SurfaceEvents) => Layers) {\n try {\n this.opts = {\n theme: resolveTheme(options.theme, DARK),\n timeZone: options.timeZone ?? \"UTC\",\n locale: options.locale,\n timeScale: { ...DEFAULT_TIME_SCALE, ...options.timeScale },\n crosshair: { mode: \"magnet\", visible: true, priceLabel: true, ...options.crosshair },\n grid: { vertLines: true, horzLines: true, ...options.grid },\n timeFormat: options.timeFormat,\n timeVisible: options.timeVisible ?? \"auto\",\n timeLabel: options.timeLabel,\n rightPriceScale: { ...DEFAULT_PRICE_SCALE, ...options.rightPriceScale, position: \"right\" },\n leftPriceScale: { ...DEFAULT_PRICE_SCALE, ...options.leftPriceScale, position: \"left\" },\n interaction: { pan: true, zoom: true, kinetic: true, keyboard: true, ...options.interaction },\n watermark: { ...DEFAULT_WATERMARK, ...options.watermark },\n messages: options.messages ?? defaultMessages,\n ariaLabel: options.ariaLabel ?? (options.messages ?? defaultMessages)(\"chart.ariaLabel\"),\n renderer: options.renderer ?? \"auto\",\n sessions: options.sessions ?? null,\n resolution: options.resolution ?? null,\n countdown: options.countdown ?? true,\n keymap: { ...DEFAULT_KEYMAP, ...options.keymap },\n a11yTable: options.a11yTable ?? true,\n };\n this.ariaLabelFixed = options.ariaLabel !== undefined;\n this.autoTheme = options.theme === \"auto\";\n this.sessions = this.opts.sessions ? new Sessions(this.opts.sessions) : null;\n this.resampler = this.opts.resolution ? new Resampler(parseResolution(this.opts.resolution), this.opts.sessions ? { sessions: this.opts.sessions } : { timeZone: this.opts.timeZone }) : null;\n checkPriceScaleOptions(this.opts.rightPriceScale);\n checkPriceScaleOptions(this.opts.leftPriceScale);\n checkWatermarkOptions(this.opts.watermark);\n this.tz =new TimeZone(this.opts.timeZone);\n this.fmt = new TimeFormatter(this.opts.locale, this.tz, this.opts.timeFormat);\n this.time = new TimeScale(this.opts.timeScale);\n\n const root = document.createElement(\"div\");\n root.style.cssText = \"position:relative;width:100%;height:100%;overflow:hidden;user-select:none;-webkit-user-select:none;touch-action:none;outline:none\";\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"application\");\n root.setAttribute(\"aria-roledescription\", \"chart\");\n root.setAttribute(\"aria-label\", this.opts.ariaLabel);\n this.live = document.createElement(\"div\");\n this.live.setAttribute(\"aria-live\", \"polite\");\n this.live.style.cssText = \"position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap\";\n root.appendChild(this.live);\n container.appendChild(root);\n this.element = root;\n\n const events: SurfaceEvents = {\n // GL objects are gone; renderers are rebuilt from the CPU stores on restore.\n lost: () => this.dropRenderers(),\n restored: () => this.invalidate(LAYER_ALL),\n };\n this.layers = layers ? layers(root, events) : new OwnLayers(root, this.opts.renderer, events);\n\n this.model.onChange(this.onData);\n this.interaction = new Interaction(this, root, root);\n this.resizeObs = new ResizeObserver(() => this.measure());\n this.resizeObs.observe(root);\n this.watchDpr();\n this.watchSystem();\n this.syncCountdown();\n this.measure();\n } catch (error) {\n emitFault({ source: \"ctor\", error });\n throw error;\n }\n }\n\n // ---- public API ---------------------------------------------------------------\n\n addSeries<T extends SeriesType>(type: T, options: Partial<SeriesOptions<T>> = {}): Series<T> {\n const id = options.id || this.nextSeriesId();\n if (this.allSeries().some((x) => x.options().id === id)) throw new Error(`alphacharts: a series with id \"${id}\" already exists`);\n const data = this.model.add(seriesType(type).shape);\n const s = new Series<T>(type, data, this, { ...options, id }, this.opts.theme);\n this.placeSeries(s as unknown as Series<SeriesType>);\n this.invalidate(LAYER_ALL);\n return s;\n }\n\n /**\n * Run `fn` and defer the data work to its end: any number of\n * `series.setData` calls cost one timeline rebuild and one round of change\n * events. Inside `fn`, timeline lookups (`timeToIndex`, ...) and series whose\n * times are not yet on the timeline still show the state before the batch.\n * Returns what `fn` returns; nests.\n */\n batch<T>(fn: () => T): T {\n return this.model.batch(fn);\n }\n\n removeSeries<T extends SeriesType>(series: Series<T>): void {\n const s = series as unknown as Series<SeriesType>;\n for (const p of this.panes) {\n const i = p.series.indexOf(s);\n if (i >= 0) p.series.splice(i, 1);\n }\n for (const prim of this.primitives.get(s) ?? []) prim.detached?.();\n this.primitives.delete(s);\n s.renderer?.dispose();\n s.renderer = null;\n s.renderer2d?.dispose();\n s.renderer2d = null;\n this.model.remove(s.data);\n this.prunePanes();\n this.invalidate(LAYER_ALL);\n }\n\n /** A horizontal line at a price, drawn with the series' scale. */\n createPriceLine<T extends SeriesType>(s: Series<T>, options: Partial<PriceLineOptions> & { price: number }): PriceLine {\n const line = new PriceLine({ labelTextColor: this.opts.theme.labelText, ...options });\n this.attachPrimitive(s as unknown as Series<SeriesType>, line);\n return line;\n }\n\n removePriceLine<T extends SeriesType>(s: Series<T>, line: PriceLine): void {\n this.detachPrimitive(s as unknown as Series<SeriesType>, line);\n }\n\n options(): Readonly<ChartOptions> {\n return this.opts;\n }\n\n /** True after remove(). */\n get isRemoved(): boolean {\n return this.removed;\n }\n\n applyOptions(o: ChartOptionsInput): void {\n const prev = this.opts;\n // Build everything that can throw before committing any of it.\n const tz = o.timeZone !== undefined ? new TimeZone(o.timeZone) : this.tz;\n const theme = resolveTheme(o.theme, prev.theme);\n if (o.rightPriceScale) checkPriceScaleOptions(o.rightPriceScale);\n if (o.leftPriceScale) checkPriceScaleOptions(o.leftPriceScale);\n const watermark = { ...prev.watermark, ...o.watermark };\n checkWatermarkOptions(watermark);\n const timeChanged = o.timeZone !== undefined || o.locale !== undefined || \"timeFormat\" in o;\n const fmt = timeChanged ? new TimeFormatter(\"locale\" in o ? o.locale : prev.locale, tz, \"timeFormat\" in o ? o.timeFormat : prev.timeFormat) : this.fmt;\n this.opts = {\n ...prev,\n ...(o as Partial<ChartOptions>),\n theme,\n timeScale: { ...prev.timeScale, ...o.timeScale },\n crosshair: { ...prev.crosshair, ...o.crosshair },\n grid: { ...prev.grid, ...o.grid },\n rightPriceScale: { ...prev.rightPriceScale, ...o.rightPriceScale, position: \"right\" },\n leftPriceScale: { ...prev.leftPriceScale, ...o.leftPriceScale, position: \"left\" },\n interaction: { ...prev.interaction, ...o.interaction },\n watermark,\n };\n Object.assign(this.time.options, this.opts.timeScale);\n if (o.keymap) this.opts.keymap = { ...prev.keymap, ...o.keymap };\n if (o.theme !== undefined) this.autoTheme = o.theme === \"auto\";\n if (o.sessions !== undefined) this.sessions = o.sessions ? new Sessions(o.sessions) : null;\n if (o.resolution !== undefined || o.sessions !== undefined || o.timeZone !== undefined) {\n this.resampler = this.opts.resolution ? new Resampler(parseResolution(this.opts.resolution), this.opts.sessions ? { sessions: this.opts.sessions } : { timeZone: this.opts.timeZone }) : null;\n }\n this.syncCountdown();\n if (timeChanged) {\n this.tz = tz;\n this.fmt = fmt;\n this.tticksKey = \"\";\n }\n if (o.rightPriceScale && \"minWidth\" in o.rightPriceScale) this.axisCols.right = [];\n if (o.leftPriceScale && \"minWidth\" in o.leftPriceScale) this.axisCols.left = [];\n if (o.theme !== undefined) for (const p of this.panes) for (const s of p.series) s.themeChanged(this.opts.theme);\n for (const p of this.panes) {\n for (const [id, sc] of p.scales) {\n if (id === \"right\" && o.rightPriceScale) sc.options = { ...this.opts.rightPriceScale };\n if (id === \"left\" && o.leftPriceScale) sc.options = { ...this.opts.leftPriceScale };\n }\n }\n if (o.ariaLabel !== undefined) this.ariaLabelFixed = true;\n if (!this.ariaLabelFixed) this.opts.ariaLabel = this.opts.messages(\"chart.ariaLabel\");\n this.element.setAttribute(\"aria-label\", this.opts.ariaLabel);\n // Table text (headers, caption, time labels) depends on these.\n if (o.messages !== undefined || o.locale !== undefined || o.ariaLabel !== undefined || o.timeZone !== undefined) this.scheduleTable();\n this.invalidate(LAYER_ALL);\n }\n\n on<K extends keyof ChartEvents>(type: K, fn: (e: ChartEvents[K]) => void): () => void {\n return this.events.on(type, fn);\n }\n\n /** Options of a price scale in a pane (\"right\", \"left\" or an overlay id). */\n priceScale(id: string, pane = 0): { options(): Readonly<PriceScaleOptions>; applyOptions(o: Partial<PriceScaleOptions>): void } {\n const sc = this.panes[pane]?.scales.get(id);\n if (!sc) throw new RangeError(`no price scale \"${id}\" in pane ${pane}`);\n return {\n options: () => sc.options,\n applyOptions: (o) => {\n checkPriceScaleOptions(o);\n sc.options = { ...sc.options, ...o };\n if (\"minWidth\" in o) this.axisCols[sc.options.position === \"left\" ? \"left\" : \"right\"] = [];\n this.invalidate(LAYER_ALL);\n },\n };\n }\n\n /** Relative height of a pane (default 1; the first pane is usually 3). */\n setPaneStretch(pane: number, stretch: number): void {\n const p = this.panes[pane];\n if (!p) throw new RangeError(`no pane ${pane}`);\n if (!(stretch > 0)) throw new RangeError(`stretch must be positive, got ${stretch}`);\n p.stretch = stretch;\n this.invalidate(LAYER_ALL);\n }\n\n readonly timeScale = {\n scrollToLatest: () => this.viewChanged(() => this.time.scrollToLatest()),\n scrollToStart: () => this.viewChanged(() => this.time.scrollToStart()),\n fitContent: () => this.viewChanged(() => this.time.fitAll()),\n reset: () => this.viewChanged(() => this.time.reset()),\n /** Show fractional timeline indices [from, to]. */\n setVisibleLogicalRange: (r: { from: number; to: number }) => this.viewChanged(() => this.time.setRange(r.from, r.to)),\n getVisibleLogicalRange: (): { from: number; to: number } => ({ from: this.time.left, to: this.time.right }),\n /** Show [from, to] (UTC ms), snapped to the bars at or after each time. */\n setVisibleTimeRange: (r: { from: number; to: number }) => {\n const tl = this.model.timeline;\n this.viewChanged(() => this.time.setRange(tl.lowerBound(r.from) - 0.5, Math.min(tl.end - 1, tl.lowerBound(r.to)) + 0.5));\n },\n barSpacing: () => this.time.spacing,\n timeToIndex: (t: number) => this.model.timeline.indexOf(t),\n indexToTime: (i: number) => this.model.timeline.timeAt(i),\n };\n\n /** Pane-relative CSS x of a time, or undefined when no bar has that time. */\n timeToX(time: number): number | undefined {\n const i = this.model.timeline.indexOf(time);\n return i === undefined ? undefined : this.time.x(i);\n }\n\n /** CSS px of the pane area (the width the time scale draws in); 0 before the first layout. */\n paneWidth(): number {\n return Math.max(0, this.cssW - this.leftW - this.rightW);\n }\n\n /** CSS px taken by the price axes on one side (all their columns); 0 when there is no axis there. */\n priceAxisWidth(side: \"left\" | \"right\"): number {\n if (side !== \"left\" && side !== \"right\") throw new RangeError(`alphacharts: priceAxisWidth side must be \"left\" or \"right\", got \"${String(side)}\"`);\n return side === \"left\" ? this.leftW : this.rightW;\n }\n\n /** Release DOM, observers and the WebGL context. */\n remove(): void {\n if (this.removed) return;\n this.removed = true;\n for (const fn of this.removeListeners) fn();\n // Last installed first, so a plugin that builds on another is released before it. A plugin that throws does not stop the rest of the teardown.\n const failed: unknown[] = [];\n for (const [id, p] of [...this.plugins].reverse()) {\n try {\n p.uninstall?.();\n } catch (e) {\n failed.push(e);\n }\n this.plugins.delete(id);\n }\n this.pluginInitial.clear();\n cancelRender(this);\n this.interaction.dispose();\n this.resizeObs.disconnect();\n this.dprQuery?.removeEventListener(\"change\", this.onDpr);\n for (const q of this.mediaQueries) q.removeEventListener(\"change\", this.onSystem);\n clearInterval(this.countdownTimer);\n clearTimeout(this.tableTimer);\n for (const p of this.panes) for (const s of p.series) s.renderer?.dispose();\n this.layers.dispose();\n this.events.clear();\n this.element.remove();\n if (failed.length) throw failed.length === 1 ? failed[0] : new AggregateError(failed, \"alphacharts: plugins failed to uninstall\");\n }\n\n /** Every series on the chart, pane by pane. */\n series(): readonly Series<SeriesType>[] {\n return this.allSeries();\n }\n\n private allSeries(): Series<SeriesType>[] {\n return this.panes.flatMap((p) => p.series);\n }\n\n private nextSeriesId(): string {\n let id: string;\n do id = `s${++this.seriesCounter}`;\n while (this.allSeries().some((x) => x.options().id === id));\n return id;\n }\n\n // ---- layout ------------------------------------------------------------------\n\n /** The chart's arrangement as versioned JSON (no bar data). */\n saveState(): ChartState {\n const plugins: Record<string, unknown> = {};\n for (const [id, p] of this.plugins) if (p.toJSON) plugins[id] = p.toJSON();\n return {\n version: LAYOUT_VERSION,\n options: plain({ ...this.opts }),\n panes: this.panes.map((p) => ({\n stretch: p.stretch,\n scales: Object.fromEntries(\n [...p.scales].map(([id, sc]) => [id, sc.options.autoScale ? { options: plain(sc.options) } : { options: plain(sc.options), range: { min: sc.min, max: sc.max } }]),\n ),\n })),\n series: this.allSeries().map((x) => ({ id: x.options().id, type: x.type, options: plain(x.options()) })),\n view: { spacing: this.time.spacing, rightOffset: this.time.rightOffset },\n plugins,\n ...(this.opts.timeLabel ? { customOptions: [\"timeLabel\" as const] } : {}),\n };\n }\n\n /**\n * Replace every series, pane, scale, view and plugin state with a saved\n * layout. `data(series)` supplies each series' bars (or nothing, to fill it\n * later); `formatters` re-supplies custom price formatters by series id;\n * `timeLabel` re-supplies the custom time label function. A layout saved with\n * a custom price format or `timeLabel` is refused (nothing changed) when the\n * function is not passed.\n */\n restoreState(\n raw: unknown,\n opts: { data?: (s: SeriesState) => unknown; formatters?: Record<string, (v: number) => string>; timeLabel?: TimeLabel } = {},\n ): Series<SeriesType>[] {\n const st = migrate(raw);\n checkCustomOptions(st, { timeLabel: opts.timeLabel });\n const missing = Object.keys(st.plugins).filter((id) => !this.plugins.has(id));\n if (missing.length) throw new Error(`alphacharts: layout needs plugins that are not installed: ${missing.join(\", \")}`);\n for (const ss of st.series) {\n const pf = (ss.options.priceFormat ?? {}) as { type?: string };\n if (pf.type === \"custom\" && !opts.formatters?.[ss.id]) throw new Error(`alphacharts: series \"${ss.id}\" has a custom price format; pass its formatter to restoreState`);\n }\n // Every plugin takes its state or the layout is refused: nothing is replaced before this passes.\n const seriesIds = st.series.map((s) => s.id);\n for (const [id, state] of Object.entries(st.plugins)) this.plugins.get(id)!.validateState?.(state, { seriesIds });\n // Everything applyOptions can refuse is checked before the first series is removed.\n const so = st.options as { timeFormat?: Intl.DateTimeFormatOptions; rightPriceScale?: object; leftPriceScale?: object; timeZone?: string; locale?: string };\n new TimeFormatter(so.locale ?? this.opts.locale, new TimeZone(so.timeZone ?? this.opts.timeZone), so.timeFormat);\n checkPriceScaleOptions((so.rightPriceScale ?? {}) as Partial<PriceScaleOptions>);\n checkPriceScaleOptions((so.leftPriceScale ?? {}) as Partial<PriceScaleOptions>);\n checkWatermarkOptions({ ...this.opts.watermark, ...(st.options as { watermark?: Partial<WatermarkOptions> }).watermark });\n for (const pn of st.panes) for (const sc of Object.values(pn.scales)) checkPriceScaleOptions(sc.options as Partial<PriceScaleOptions>);\n for (const x of this.allSeries()) this.removeSeries(x);\n this.applyOptions({ ...(st.options as ChartOptionsInput), ...(opts.timeLabel ? { timeLabel: opts.timeLabel } : {}) });\n const created: Series<SeriesType>[] = [];\n for (const ss of st.series) {\n const o = { ...ss.options } as Record<string, unknown>;\n const pf = o.priceFormat as { type?: string; minMove?: number } | undefined;\n if (pf?.type === \"custom\") o.priceFormat = { ...pf, format: opts.formatters![ss.id]! };\n const x = this.addSeries(ss.type as SeriesType, o as never);\n const input = opts.data?.(ss);\n if (input !== undefined) x.setData(input as never);\n created.push(x as unknown as Series<SeriesType>);\n }\n st.panes.forEach((ps, i) => {\n const p = this.panes[i];\n if (!p) return;\n p.stretch = ps.stretch;\n for (const [id, scs] of Object.entries(ps.scales)) {\n const sc = p.scales.get(id);\n if (!sc) continue;\n sc.options = { ...sc.options, ...(scs.options as Partial<PriceScaleOptions>) };\n if (scs.range) {\n sc.min = scs.range.min;\n sc.max = scs.range.max;\n sc.ranged = true;\n }\n }\n });\n this.time.spacing = st.view.spacing;\n this.time.rightOffset = st.view.rightOffset;\n this.time.clamp();\n for (const [id, state] of Object.entries(st.plugins)) this.plugins.get(id)!.fromJSON?.(state);\n // A plugin the layout does not mention must not keep the content of the layout it replaces.\n for (const [id, p] of this.plugins) if (!(id in st.plugins) && p.fromJSON && this.pluginInitial.has(id)) p.fromJSON(this.pluginInitial.get(id));\n this.invalidate(LAYER_ALL);\n return created;\n }\n\n // ---- plugins -----------------------------------------------------------------\n\n /** Install a plugin; ids are unique per chart. */\n addPlugin(plugin: ChartPlugin): void {\n if (this.plugins.has(plugin.id)) throw new Error(`alphacharts: a plugin with id \"${plugin.id}\" is already installed`);\n this.plugins.set(plugin.id, plugin);\n plugin.install(this.pluginApi);\n if (plugin.toJSON && plugin.fromJSON) this.pluginInitial.set(plugin.id, plugin.toJSON());\n this.invalidate(LAYER_OVERLAY);\n }\n\n removePlugin(id: string): void {\n const p = this.plugins.get(id);\n if (!p) return;\n this.plugins.delete(id);\n this.pluginInitial.delete(id);\n p.uninstall?.();\n this.invalidate(LAYER_ALL);\n }\n\n plugin<P extends ChartPlugin = ChartPlugin>(id: string): P | undefined {\n return this.plugins.get(id) as P | undefined;\n }\n\n private readonly pluginApi: PluginApi = Object.defineProperty(\n {\n requestRender: (all?: boolean) => this.invalidate(all ? LAYER_ALL : LAYER_OVERLAY),\n paneView: (pane: number) => this.pluginView(pane),\n barTimeAtOrBefore: (t: number) => {\n const i = this.model.timeline.indexAtOrBefore(t);\n return i === undefined ? undefined : this.model.timeline.timeAt(i);\n },\n setCursor: (css: string | null) => {\n this.cursorOverride = css;\n },\n },\n \"paneCount\",\n { get: () => this.panes.length },\n ) as PluginApi;\n\n /** @internal Offer a pointer event to plugins; true when one consumed it. */\n pluginPointer(type: PluginPointer[\"type\"], x: number, y: number, e: PointerEvent | MouseEvent | null): boolean {\n if (this.plugins.size === 0) return false;\n const r = this.region(x, y);\n if (r.kind !== \"pane\" && type !== \"up\" && type !== \"leave\") return false;\n const pane = r.kind === \"pane\" ? r.pane : this.lastPluginPane;\n // An up/leave can follow a layout change that removed the pane it started\n // in, or its last series (a dashboard regrid, a symbol switch): with no\n // price scale there is no price under the pointer to report.\n if (!this.panes[pane]?.scales.size) return false;\n this.lastPluginPane = pane;\n const v = this.pluginView(pane);\n const px = x - this.leftW, py = y - (this.panes[pane]?.top ?? 0);\n const ev: PluginPointer = {\n type, pane, x: px, y: py, time: v.xToTime(px), price: v.yToPrice(py),\n pointerType: e && \"pointerType\" in e ? e.pointerType : \"mouse\",\n buttons: e?.buttons ?? 0, shiftKey: e?.shiftKey ?? false, altKey: e?.altKey ?? false, ctrlKey: e?.ctrlKey ?? false, metaKey: e?.metaKey ?? false,\n };\n let consumed = false;\n for (const pl of [...this.plugins.values()].reverse()) {\n if (pl.pointer?.(ev)) {\n consumed = true;\n break;\n }\n }\n return consumed;\n }\n\n /** @internal */\n pluginKey(e: KeyboardEvent): boolean {\n for (const pl of [...this.plugins.values()].reverse()) if (pl.key?.(e)) return true;\n return false;\n }\n\n /** Fractional timeline index of a time, extrapolated past either end. */\n timeToLogical(t: number): number {\n const tl = this.model.timeline;\n if (tl.length === 0) return Number.NaN;\n const first = tl.first, last = tl.end - 1;\n const t0 = tl.timeAt(first), t1 = tl.timeAt(last);\n if (t <= t0) return first - (t0 - t) / this.barInterval();\n if (t >= t1) return last + (t - t1) / this.barInterval();\n const i = tl.lowerBound(t);\n const ti = tl.timeAt(i);\n if (ti === t) return i;\n const tp = tl.timeAt(i - 1);\n return i - 1 + (t - tp) / (ti - tp);\n }\n\n /** Time at a fractional timeline index, extrapolated past either end. */\n logicalToTime(l: number): number {\n const tl = this.model.timeline;\n if (tl.length === 0) return Number.NaN;\n const first = tl.first, last = tl.end - 1;\n if (l <= first) return tl.timeAt(first) - (first - l) * this.barInterval();\n if (l >= last) return tl.timeAt(last) + (l - last) * this.barInterval();\n const i = Math.floor(l);\n const a = tl.timeAt(i), b = tl.timeAt(i + 1);\n return a + (l - i) * (b - a);\n }\n\n /** Median spacing of the last bars, for extrapolating beyond the data. */\n private barInterval(): number {\n if (this.intervalCache > 0) return this.intervalCache;\n const tl = this.model.timeline;\n const d: number[] = [];\n for (let i = tl.end - 1; i > tl.first && d.length < 15; i--) d.push(tl.timeAt(i) - tl.timeAt(i - 1));\n d.sort((a, b) => a - b);\n this.intervalCache = d.length ? d[d.length >> 1]! : 60_000;\n return this.intervalCache;\n }\n\n /**\n * A plugin's view of one pane. Plugins install before any series exists, so\n * the pane is looked up on every call, not captured: before it exists the\n * view has height 0 and anything that needs a price scale throws.\n */\n private pluginView(pane: number): PluginPaneView {\n const t = this.time;\n const paneOf = () => {\n const p = this.panes[pane];\n if (!p) throw new RangeError(`no pane ${pane} on this chart yet`);\n return p;\n };\n const scaleOf = (id?: string) => {\n const p = paneOf();\n const sc = id ? p.scales.get(id) : (sideScales(p, \"right\")[0] ?? sideScales(p, \"left\")[0] ?? p.scales.values().next().value);\n if (!sc) throw new RangeError(`no price scale ${id ?? \"\"} in pane ${pane}`);\n return sc;\n };\n const chart = this;\n return {\n pane,\n get width() {\n return t.width;\n },\n get height() {\n return chart.panes[pane]?.height ?? 0;\n },\n get dpr() {\n return chart.dpr;\n },\n timeToX: (time) => t.x(this.timeToLogical(time)),\n xToTime: (x) => this.logicalToTime(t.logical(x)),\n priceToY: (price, id) => scaleOf(id).y(price),\n yToPrice: (y, id) => scaleOf(id).price(y),\n formatPrice: (price, id) => {\n const sc = scaleOf(id);\n return axisText(sc, this.formatterFor(paneOf(), sc.id), price);\n },\n priceScaleMode: (id) => scaleOf(id).mode,\n };\n }\n\n // ---- SeriesHost ------------------------------------------------------------\n\n /** @internal */\n setData(s: Series<SeriesType>, input: unknown): void {\n this.model.setData(s.data, input as never);\n }\n /** @internal */\n prepend(s: Series<SeriesType>, input: unknown): void {\n this.model.prepend(s.data, input as never);\n }\n /** @internal */\n update(s: Series<SeriesType>, bar: unknown): void {\n this.model.update(s.data, bar as never);\n }\n /** @internal */\n setColors(s: Series<SeriesType>, colors: ColumnarColors): void {\n this.model.setColors(s.data, colors);\n }\n /** @internal */\n clearColors(s: Series<SeriesType>): void {\n this.model.clearColors(s.data);\n }\n /** @internal */\n optionsChanged(s: Series<SeriesType>, moved: boolean): void {\n if (moved) {\n for (const p of this.panes) {\n const i = p.series.indexOf(s);\n if (i >= 0) p.series.splice(i, 1);\n }\n this.placeSeries(s);\n this.prunePanes();\n }\n this.invalidate(LAYER_ALL);\n }\n /** @internal */\n attachPrimitive(s: Series<SeriesType>, p: PanePrimitive): void {\n let set = this.primitives.get(s);\n if (!set) this.primitives.set(s, (set = new Set()));\n set.add(p);\n p.attached?.({\n requestRender: (layer: RenderLayer = \"overlay\") => {\n if (layer !== \"overlay\" && layer !== \"background\" && layer !== \"all\") throw new RangeError(`alphacharts: requestRender layer must be \"background\", \"overlay\" or \"all\", got \"${String(layer)}\"`);\n this.invalidate(layer === \"all\" ? LAYER_BG | LAYER_OVERLAY : layer === \"background\" ? LAYER_BG : LAYER_OVERLAY);\n },\n });\n this.invalidate(LAYER_BG | LAYER_OVERLAY);\n }\n /** @internal */\n detachPrimitive(s: Series<SeriesType>, p: PanePrimitive): void {\n if (this.primitives.get(s)?.delete(p)) {\n p.detached?.();\n this.invalidate(LAYER_BG | LAYER_OVERLAY);\n }\n }\n /** @internal */\n markersChanged(): void {\n this.invalidate(LAYER_OVERLAY);\n }\n /** @internal */\n priceToY(s: Series<SeriesType>, price: number): number {\n const sc = this.rangedScale(s);\n return sc ? sc.y(price) : Number.NaN;\n }\n /** @internal */\n yToPrice(s: Series<SeriesType>, y: number): number {\n const sc = this.rangedScale(s);\n return sc ? sc.price(y) : Number.NaN;\n }\n private rangedScale(s: Series<SeriesType>): PriceScale | undefined {\n const p = this.panes.find((x) => x.series.includes(s));\n const sc = p?.scales.get(s.options().priceScaleId);\n return sc?.ranged ? sc : undefined;\n }\n /** @internal */\n timeAt(i: number): number {\n return this.model.timeline.timeAt(i);\n }\n /** @internal */\n get locale(): string | undefined {\n return this.opts.locale;\n }\n /** @internal */\n indexOf(t: number): number | undefined {\n return this.model.timeline.indexOf(t);\n }\n\n // ---- used by Interaction and SyncGroup ---------------------------------------------\n\n /** @internal */\n get timeline(): Timeline {\n return this.model.timeline;\n }\n\n /** @internal */\n get interactionOptions(): InteractionOptions {\n return this.opts.interaction;\n }\n\n /** @internal A dashboard redraws this cell's series when a neighbour drew (see DashboardCanvases.noteGLDraw). */\n redrawGL(): void {\n if (!this.removed && this.cssW > 0 && this.cssH > 0) this.drawGL();\n }\n\n /** @internal Called once when the chart is removed. */\n onRemove(fn: () => void): void {\n this.removeListeners.push(fn);\n }\n\n /** @internal The shared surface lost its context: drop GL objects. */\n surfaceLost(): void {\n this.dropRenderers();\n }\n\n /** Re-read size and cell position even if the size is unchanged (a host that moved the chart without resizing it). */\n remeasure(): void {\n this.cssW = -1;\n this.measure();\n }\n\n /** What is under chart CSS point (x, y): a pane, a price axis, the time axis, a pane separator or nothing. For hosts that build their own menus and hit tests. */\n region(x: number, y: number): Region {\n const paneX = this.leftW;\n const paneR = this.cssW - this.rightW;\n for (let i = 0; i < this.panes.length; i++) {\n const p = this.panes[i]!;\n if (i > 0 && Math.abs(y - (p.top - SEPARATOR / 2)) <= 4) return { kind: \"separator\", index: i };\n if (y >= p.top && y < p.top + p.height) {\n if (x < paneX || x >= paneR) {\n for (const [id, sc] of p.scales) if (axisShown(sc) && x >= sc.axisX && x < sc.axisX + sc.axisW) return { kind: \"priceAxis\", pane: i, scaleId: id };\n return { kind: \"none\" };\n }\n return { kind: \"pane\", pane: i, x: x - paneX, y: y - p.top };\n }\n }\n if (y >= this.cssH - this.timeH && x >= paneX && x < paneR) return { kind: \"timeAxis\" };\n return { kind: \"none\" };\n }\n\n /** True when a plugin asks for a cursor at the point: it owns the pointer there, so no `hovered`. */\n private pluginClaims(pane: number, x: number, y: number): boolean {\n // A pane removed since the crosshair was set has no plugin view to ask.\n if (!this.panes[pane]) return false;\n for (const pl of this.plugins.values()) if (pl.cursor?.(pane, x, y)) return true;\n return false;\n }\n\n /** @internal CSS cursor a primitive wants at a pane point, if any. */\n primitiveCursor(pane: number, x: number, y: number): string | null {\n if (this.cursorOverride) return this.cursorOverride;\n for (const pl of this.plugins.values()) {\n const c = pl.cursor?.(pane, x, y);\n if (c) return c;\n }\n return this.hit(pane, x, y).cursor;\n }\n\n /** @internal */\n viewChanged(fn: () => void, source: \"user\" | \"sync\" = \"user\"): void {\n fn();\n this.viewSource = source;\n this.invalidate(LAYER_ALL);\n }\n\n /** @internal Price-axis drag: factor > 1 zooms in. */\n scalePrice(pane: number, scaleId: string, factor: number): void {\n const sc = this.panes[pane]?.scales.get(scaleId);\n if (!sc) return;\n sc.scale(factor);\n this.invalidate(LAYER_ALL);\n }\n\n /** @internal Vertical pan of every scale in a pane that is not autoscaling. */\n panPrice(pane: number, dy: number): void {\n const p = this.panes[pane];\n if (!p) return;\n let moved = false;\n for (const sc of p.scales.values()) {\n if (sc.options.autoScale) continue;\n sc.pan(dy);\n moved = true;\n }\n if (moved) this.invalidate(LAYER_ALL);\n }\n\n /** Back to autoscale for one price scale of a pane (what a double-click on its axis does). */\n resetPriceScale(pane: number, scaleId: string): void {\n const sc = this.panes[pane]?.scales.get(scaleId);\n if (!sc) return;\n sc.options = { ...sc.options, autoScale: true };\n this.invalidate(LAYER_ALL);\n }\n\n /** @internal Drag a separator by dy CSS px. */\n resizePanes(index: number, dy: number): void {\n const a = this.panes[index - 1], b = this.panes[index];\n if (!a || !b) return;\n const total = a.height + b.height;\n const ha = Math.max(30, Math.min(total - 30, a.height + dy));\n const sum = a.stretch + b.stretch;\n a.stretch = (sum * ha) / total;\n b.stretch = sum - a.stretch;\n this.invalidate(LAYER_ALL);\n }\n\n /** @internal */\n setCrosshair(c: { x: number; y: number; pane: number } | null, source: CrosshairEvent[\"source\"]): void {\n this.crosshair = c;\n this.syncIndex = null;\n this.crosshairSource = source;\n this.invalidate(LAYER_OVERLAY);\n if (this.events.has(\"crosshairMove\")) this.events.emit(\"crosshairMove\", this.crosshairEvent(source));\n if (source === \"keyboard\") this.announce();\n }\n\n /** @internal Show a vertical crosshair at a timeline index (synced chart). */\n setSyncedCrosshair(index: number | null): void {\n this.crosshair = null;\n this.syncIndex = index;\n this.invalidate(LAYER_OVERLAY);\n }\n\n /** @internal */\n pointerEvent(type: \"click\" | \"dblclick\"): void {\n if (this.events.has(type)) this.events.emit(type, this.crosshairEvent(\"pointer\"));\n }\n\n /** @internal Index under the crosshair (pointer or keyboard), if any. */\n crosshairIndex(): number | undefined {\n if (!this.crosshair) return undefined;\n const i = this.time.indexAt(this.crosshair.x - this.leftW);\n return i >= this.time.first && i <= this.time.last ? i : undefined;\n }\n\n /** @internal Pane-area CSS geometry. */\n get paneArea(): { x: number; width: number } {\n return { x: this.leftW, width: this.cssW - this.leftW - this.rightW };\n }\n\n /** @internal */\n invalidate(layers: number): void {\n if (!this.removed) requestRender(this, layers);\n }\n\n // ---- data ----------------------------------------------------------------\n\n private readonly onData = (c: DataChange): void => {\n if (c.kind === \"color\") {\n // bar colours only: renderers patch the records; no bar, price or time moved, so plugins (studies) have nothing to follow\n for (const p of this.panes) for (const s of p.series) { s.renderer?.dataChanged(c); s.renderer2d?.dataChanged(c); }\n this.invalidate(LAYER_GL);\n return;\n }\n const t = this.time;\n const tl = this.model.timeline;\n const wasEmpty = t.end <= t.first;\n if (c.kind === \"update\" && c.appended && !wasEmpty) {\n // Decide with the old bounds: was the last bar on screen?\n if (!t.following) t.rightOffset -= 1;\n }\n t.first = tl.first;\n t.end = tl.end;\n if (wasEmpty && tl.length > 0) t.reset();\n for (const p of this.panes) {\n for (const s of p.series) {\n s.renderer?.dataChanged(c);\n s.renderer2d?.dataChanged(c);\n if (s.data === c.series) s.observeData(c.lo, c.hi);\n }\n }\n this.tticksKey = \"\";\n this.intervalCache = -1;\n for (const pl of this.plugins.values()) pl.dataChanged?.(c);\n if (c.kind !== \"update\") this.scheduleTable();\n this.invalidate(c.kind === \"update\" ? LAYER_GL | LAYER_OVERLAY : LAYER_ALL);\n };\n\n private placeSeries(s: Series<SeriesType>): void {\n const o = s.options();\n if (!Number.isInteger(o.pane) || o.pane < 0) throw new RangeError(`pane must be a non-negative integer, got ${o.pane}`);\n while (this.panes.length <= o.pane) {\n this.panes.push({ stretch: this.panes.length === 0 ? 3 : 1, scales: new Map(), series: [], top: 0, height: 0 });\n }\n const p = this.panes[o.pane]!;\n if (!p.scales.has(o.priceScaleId)) {\n const base = o.priceScaleId === \"left\" ? this.opts.leftPriceScale : o.priceScaleId === \"right\" ? this.opts.rightPriceScale : { ...DEFAULT_PRICE_SCALE, position: \"none\" as const };\n p.scales.set(o.priceScaleId, new PriceScale(o.priceScaleId, { ...base }));\n }\n p.series.push(s);\n }\n\n /** Drop trailing empty panes (an empty pane in the middle keeps its slot). */\n private prunePanes(): void {\n while (this.panes.length > 1 && this.panes[this.panes.length - 1]!.series.length === 0) this.panes.pop();\n for (const p of this.panes) {\n for (const id of [...p.scales.keys()]) if (!p.series.some((s) => s.options().priceScaleId === id)) p.scales.delete(id);\n }\n }\n\n // ---- frame ---------------------------------------------------------------\n\n render(layers: number): void {\n if (this.removed || this.cssW <= 0 || this.cssH <= 0) return;\n layers |= this.layout();\n if (layers & LAYER_BG) this.drawBg();\n if (layers & LAYER_GL) this.drawGL();\n if (layers & LAYER_OVERLAY) this.drawOverlay();\n }\n\n /** Returns layers that became dirty because the layout moved. */\n private layout(): number {\n let dirty = 0;\n const t = this.time;\n const font = this.opts.theme.fontSize;\n this.timeH = Math.round(font * 2.4);\n // Axis widths depend on labels, labels on the scale, the scale on the\n // pane width: two passes settle it (the second only when a width moved).\n for (let pass = 0; pass < 2; pass++) {\n const paneW = Math.max(1, this.cssW - this.leftW - this.rightW);\n if (t.width !== paneW) {\n t.width = paneW;\n t.clamp();\n dirty |= LAYER_ALL;\n }\n this.layoutPanes();\n t.visible(this.vis);\n let changed = false;\n for (const p of this.panes) changed = this.autoscale(p) || changed;\n if (changed) dirty |= LAYER_ALL;\n const [lw, rw] = this.axisWidths();\n if (lw === this.leftW && rw === this.rightW) break;\n this.leftW = lw;\n this.rightW = rw;\n dirty |= LAYER_ALL;\n }\n const key = `${this.vis.lo},${this.vis.hi},${t.spacing},${t.rightOffset},${t.width}`;\n if (key !== this.tticksKey) {\n this.tticksKey = key;\n const gap = this.measureText(\"00:00:00\") + 24;\n this.tticks = timeTicks(this.model.timeline, this.tz, this.vis.lo, this.vis.hi, (i) => t.x(i), t.spacing, gap);\n dirty |= LAYER_BG;\n }\n if (t.left !== this.lastRange.from || t.right !== this.lastRange.to) {\n this.lastRange = { from: t.left, to: t.right };\n dirty |= LAYER_ALL;\n if (this.events.has(\"visibleRangeChange\")) this.events.emit(\"visibleRangeChange\", { from: t.left, to: t.right, source: this.viewSource });\n for (const pl of this.plugins.values()) pl.viewChanged?.();\n this.scheduleTable();\n }\n this.viewSource = \"data\";\n return dirty;\n }\n\n private layoutPanes(): void {\n const n = this.panes.length;\n const avail = this.cssH - this.timeH - SEPARATOR * Math.max(0, n - 1);\n const total = this.panes.reduce((a, p) => a + p.stretch, 0) || 1;\n let y = 0, used = 0;\n for (let i = 0; i < n; i++) {\n const p = this.panes[i]!;\n const h = i === n - 1 ? avail - used : Math.round((avail * p.stretch) / total);\n p.top = y;\n p.height = Math.max(1, h);\n used += h;\n y += h + SEPARATOR;\n for (const sc of p.scales.values()) sc.height = p.height;\n }\n }\n\n /** Fit every autoscaling scale of a pane to its visible series. True when a range moved. */\n private autoscale(p: Pane): boolean {\n let moved = false;\n const { lo, hi } = this.vis;\n for (const [id, sc] of p.scales) {\n if (sc.mode === \"percent\" || sc.mode === \"indexed\") this.rebase(p, id, sc);\n if (!sc.options.autoScale) continue;\n let min = Number.POSITIVE_INFINITY, max = Number.NEGATIVE_INFINITY;\n for (const s of p.series) {\n const o = s.options();\n if (!o.visible || o.priceScaleId !== id) continue;\n let a = Number.NaN, b = Number.NaN;\n if (hi >= lo) {\n s.def.autoscale(s.data, o, lo, hi, this.minmax);\n a = this.minmax[0]!;\n b = this.minmax[1]!;\n } else if (!o.autoscale) continue;\n if (o.autoscale) [a, b] = overrideRange(o.id, o.autoscale, a, b);\n if (a < min) min = a;\n if (b > max) max = b;\n }\n if (min === Number.POSITIVE_INFINITY) continue;\n const pmin = sc.min, pmax = sc.max;\n sc.fit(min, max);\n if (sc.min !== pmin || sc.max !== pmax) moved = true;\n }\n return moved;\n }\n\n /** Percent/indexed base: the main series' first visible value. */\n private rebase(p: Pane, id: string, sc: PriceScale): void {\n const s = this.mainSeries(p, id);\n if (!s) return;\n const o = s.options();\n for (let i = Math.max(this.vis.lo, s.data.store.first); i <= this.vis.hi; i++) {\n const v = s.def.valueAt(s.data, o, i);\n if (v && v.value !== 0) {\n sc.base = v.value;\n return;\n }\n }\n }\n\n private axisWidths(): [number, number] {\n // Axes stand in columns per side: column j holds each pane's j-th shown\n // scale on that side, as wide as its widest member.\n const need: Record<\"left\" | \"right\", number[]> = { left: [], right: [] };\n const gap = this.opts.theme.fontSize * 3.2;\n for (const p of this.panes) {\n for (const side of [\"left\", \"right\"] as const) {\n sideScales(p, side).forEach((sc, j) => {\n const fmt = this.formatterFor(p, sc.id);\n sc.ticks = scaleTicks(sc, fmt, gap);\n let w = 0;\n for (const tk of sc.ticks) w = Math.max(w, this.measureText(tk.label));\n for (const s of p.series) {\n const o = s.options();\n if (o.priceScaleId !== sc.id || !o.lastValueVisible) continue;\n const last = s.data.lastIndex();\n const lv = last === undefined ? undefined : s.def.valueAt(s.data, o, last);\n if (lv) w = Math.max(w, this.measureText(axisText(sc, s.formatter, lv.value)));\n }\n need[side][j] = Math.max(need[side][j] ?? 0, MIN_AXIS_W, sc.options.minWidth ?? 0, Math.ceil(w + AXIS_PAD * 2 + 4));\n });\n }\n }\n // Hysteresis: grow at once, shrink only by a margin, so a ticking price\n // does not make the panes breathe.\n const settle = (cur: number | undefined, n: number) => (cur === undefined || n > cur || n < cur - 12 ? n : cur);\n for (const side of [\"left\", \"right\"] as const) {\n this.axisCols[side] = need[side].map((n, j) => settle(this.axisCols[side][j], n));\n }\n const left = this.axisCols.left.reduce((a, b) => a + b, 0);\n const right = this.axisCols.right.reduce((a, b) => a + b, 0);\n for (const p of this.panes) {\n let x = this.cssW - right;\n sideScales(p, \"right\").forEach((sc, j) => {\n sc.axisX = x;\n sc.axisW = this.axisCols.right[j]!;\n x += sc.axisW;\n });\n x = left;\n sideScales(p, \"left\").forEach((sc, j) => {\n sc.axisW = this.axisCols.left[j]!;\n x -= sc.axisW;\n sc.axisX = x;\n });\n }\n return [left, right];\n }\n\n /** The series that formats a scale's axis and sets its percent/indexed base. */\n private mainSeries(p: Pane, scaleId: string): Series<SeriesType> | undefined {\n const on = p.series.filter((x) => x.options().priceScaleId === scaleId && x.options().visible);\n return on.find((x) => x.options().scaleFormat) ?? on.find((x) => x.options().priceFormat.type !== \"volume\") ?? on[0];\n }\n\n private formatterFor(p: Pane, scaleId: string): Formatter | undefined {\n return this.mainSeries(p, scaleId)?.formatter;\n }\n\n // ---- bg layer ----------------------------------------------------------------\n\n private drawBg(): void {\n const ctx = this.layers.bg, th = this.opts.theme, d = this.dpr;\n const { ox, oy } = this.layers;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.beginPath();\n ctx.rect(ox, oy, this.devW, this.devH);\n ctx.clip();\n ctx.fillStyle = th.background;\n ctx.fillRect(ox, oy, this.devW, this.devH);\n ctx.setTransform(d, 0, 0, d, ox, oy);\n ctx.font = this.font();\n const paneX = this.leftW, paneW = this.time.width;\n const one = 1 / d;\n\n for (let i = 0; i < this.panes.length; i++) {\n const p = this.panes[i]!;\n // Outside regular hours: shaded runs of bars (skipped when bars are\n // sub-pixel, where a shade would only tint every column).\n if (this.sessions && this.time.spacing >= 0.5 && this.vis.hi >= this.vis.lo) {\n ctx.fillStyle = th.extendedHours;\n const tl = this.model.timeline, t = this.time, half = t.spacing / 2;\n let runStart = -1;\n for (let k = this.vis.lo; k <= this.vis.hi + 1; k++) {\n const off = k <= this.vis.hi && this.sessions.state(tl.timeAt(k)) !== \"regular\";\n if (off && runStart < 0) runStart = k;\n if (!off && runStart >= 0) {\n const x0 = Math.max(0, t.x(runStart) - half), x1 = Math.min(paneW, t.x(k - 1) + half);\n ctx.fillRect(paneX + x0, p.top, x1 - x0, p.height);\n runStart = -1;\n }\n }\n }\n // Grid.\n ctx.fillStyle = th.grid;\n if (this.opts.grid.vertLines) {\n for (const tk of this.tticks) {\n const x = paneX + crisp(tk.x, d) - one / 2;\n if (x >= paneX && x < paneX + paneW) ctx.fillRect(x, p.top, one, p.height);\n }\n }\n const gsc = sideScales(p, \"right\")[0] ?? sideScales(p, \"left\")[0];\n if (gsc && this.opts.grid.horzLines) for (const tk of gsc.ticks) ctx.fillRect(paneX, p.top + crisp(gsc.y(tk.price), d) - one / 2, paneW, one);\n // Primitives that draw behind the series, clipped to the pane.\n let bgPrims = false;\n for (const s of p.series) if (s.options().visible && (this.primitives.get(s)?.size ?? 0) > 0) bgPrims = true;\n if (bgPrims) {\n ctx.save();\n ctx.setTransform(d, 0, 0, d, ox + paneX * d, oy + p.top * d);\n ctx.beginPath();\n ctx.rect(0, 0, paneW, p.height);\n ctx.clip();\n for (const s of p.series) {\n const set = this.primitives.get(s);\n if (!set || !s.options().visible || !p.scales.has(s.options().priceScaleId)) continue;\n const view = this.paneView(p, s);\n for (const prim of set) {\n if (!prim.drawBackground) continue;\n ctx.save();\n prim.drawBackground(ctx, view);\n ctx.restore();\n }\n }\n ctx.restore();\n ctx.font = this.font();\n }\n // Separator above.\n if (i > 0) {\n ctx.fillStyle = th.border;\n ctx.fillRect(0, p.top - SEPARATOR, this.cssW, SEPARATOR);\n }\n // Price axes.\n for (const sc of p.scales.values()) {\n if (!axisShown(sc)) continue;\n const left = sc.options.position === \"left\";\n ctx.fillStyle = th.border;\n ctx.fillRect(left ? sc.axisX + sc.axisW - one : sc.axisX, p.top, one, p.height);\n ctx.fillStyle = th.textMuted;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = left ? \"right\" : \"left\";\n for (const tk of sc.ticks) {\n const y = p.top + sc.y(tk.price);\n if (y < p.top + 6 || y > p.top + p.height - 6) continue;\n ctx.fillText(tk.label, left ? sc.axisX + sc.axisW - AXIS_PAD : sc.axisX + AXIS_PAD, y);\n }\n }\n }\n // Time axis.\n const ty = this.cssH - this.timeH;\n ctx.fillStyle = th.border;\n ctx.fillRect(0, ty, this.cssW, one);\n ctx.fillStyle = th.textMuted;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n const tl = this.model.timeline;\n for (const tk of this.tticks) {\n const x = paneX + tk.x;\n if (x < paneX + 4 || x > paneX + paneW - 4) continue;\n ctx.fillStyle = tk.weight >= 18 ? th.text : th.textMuted;\n const tt = tl.timeAt(tk.index);\n ctx.fillText(timeText(this.opts.timeLabel, \"tick\", tt, () => this.fmt.tick(tt, tk.weight)), x, ty + this.timeH / 2);\n }\n ctx.restore();\n }\n\n // ---- gl layer ------------------------------------------------------------------\n\n private drawGL(): void {\n const sf = this.layers.surface;\n if (!sf.begin(this.layers.ox, this.layers.oy, this.devW, this.devH)) return;\n const d = this.dpr;\n const x0 = Math.round(this.leftW * d);\n const x1 = Math.round((this.leftW + this.time.width) * d);\n for (const p of this.panes) {\n const y0 = Math.round(p.top * d);\n const y1 = Math.round((p.top + p.height) * d);\n const w = x1 - x0, h = y1 - y0;\n if (w <= 0 || h <= 0) continue;\n sf.pane({ x: x0, y: y0, width: w, height: h }, () => {\n for (const s of p.series) {\n const o = s.options();\n const sc = p.scales.get(o.priceScaleId);\n if (!o.visible || !sc || s.data.store.length === 0) continue;\n if (sf.kind === \"canvas2d\") {\n s.renderer2d ??= this.make2D(s);\n s.renderer2d.draw({ ctx: sf.ctx2d!, data: s.data, time: this.time, price: sc, dpr: d, width: w, height: h, lo: this.vis.lo, hi: this.vis.hi }, o);\n } else {\n const gl = sf.gl!, ctx = sf.glctx!;\n s.renderer ??= s.def.createRenderer(gl, ctx, s.data);\n const view: DrawView = { gl, ctx, data: s.data, time: this.time, price: sc, dpr: d, width: w, height: h, lo: this.vis.lo, hi: this.vis.hi };\n s.renderer.draw(view, o);\n }\n }\n });\n }\n sf.end();\n this.layers.glDrawn?.(this);\n }\n\n private make2D(s: Series<SeriesType>): NonNullable<Series<SeriesType>[\"renderer2d\"]> {\n if (!s.def.createRenderer2D) throw new Error(`alphacharts: series type \"${s.type}\" has no Canvas2D renderer, and WebGL2 is unavailable`);\n return s.def.createRenderer2D(s.data);\n }\n\n private dropRenderers(): void {\n for (const p of this.panes) for (const s of p.series) s.renderer = null;\n }\n\n /** Which surface draws this chart's series. */\n get renderer(): SurfaceKind {\n return this.layers.surface.kind;\n }\n\n // ---- overlay layer --------------------------------------------------------------\n\n private drawOverlay(): void {\n const ctx = this.layers.overlay, th = this.opts.theme, d = this.dpr;\n const { ox, oy } = this.layers;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.beginPath();\n ctx.rect(ox, oy, this.devW, this.devH);\n ctx.clip();\n ctx.clearRect(ox, oy, this.devW, this.devH);\n ctx.font = this.font();\n const paneX = this.leftW, paneW = this.time.width;\n const labels: { pane: Pane; sc: PriceScale; l: AxisLabel }[] = [];\n let countdownAt: { pane: Pane; sc: PriceScale; l: AxisLabel } | undefined;\n\n for (const p of this.panes) {\n // Pane content: last-value lines, primitives. Clipped to the pane.\n ctx.save();\n ctx.setTransform(d, 0, 0, d, ox + paneX * d, oy + p.top * d);\n ctx.beginPath();\n ctx.rect(0, 0, paneW, p.height);\n ctx.clip();\n ctx.font = this.font();\n // First, so markers, primitives and plugin drawings stay above the halo.\n if (p === this.panes[0]) drawWatermark(ctx, paneW, p.height, th, this.opts.watermark);\n for (const s of p.series) {\n const o = s.options();\n const sc = p.scales.get(o.priceScaleId);\n if (!o.visible || !sc) continue;\n const last = s.data.lastIndex();\n const lv = last === undefined ? undefined : s.def.valueAt(s.data, o, last);\n if (lv) {\n if (o.priceLineVisible) {\n const y = crisp(sc.y(lv.value), d);\n ctx.strokeStyle = lv.color;\n ctx.lineWidth = 1 / d;\n ctx.setLineDash([1, 2]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(paneW, y);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n if (o.lastValueVisible && axisShown(sc)) {\n labels.push({ pane: p, sc, l: { price: lv.value, text: axisText(sc, s.formatter, lv.value), background: lv.color, color: contrastText(lv.color) } });\n if (o.title) this.drawTitleTag(ctx, o.title, sc, lv, p.height, paneW);\n if (!countdownAt && p === this.panes[0] && s === this.mainSeries(p, sc.id)) countdownAt = labels[labels.length - 1]!;\n }\n }\n if (s.markers().length > 0) drawMarkers(ctx, this.markerLayout(p, s, sc));\n const set = this.primitives.get(s);\n if (set && set.size > 0) {\n const view = this.paneView(p, s);\n for (const prim of set) {\n prim.draw?.(ctx, view);\n if (axisShown(sc) && prim.axisLabels) {\n for (const l of prim.axisLabels(view)) labels.push({ pane: p, sc, l });\n }\n }\n }\n }\n if (this.plugins.size > 0) {\n const view = this.pluginView(this.panes.indexOf(p));\n for (const pl of this.plugins.values()) pl.drawPane?.(ctx, view);\n }\n ctx.restore();\n }\n\n // Crosshair.\n const ch = this.crosshair;\n let cIndex: number | undefined;\n if (this.opts.crosshair.visible && this.opts.crosshair.mode !== \"hidden\" && (ch || this.syncIndex !== null)) {\n cIndex = ch ? this.time.indexAt(ch.x - paneX) : this.syncIndex!;\n const inData = cIndex >= this.time.first && cIndex <= this.time.last;\n const cx = paneX + (inData ? this.time.x(cIndex) : ch!.x - paneX);\n ctx.setTransform(d, 0, 0, d, ox, oy);\n ctx.strokeStyle = th.crosshair;\n ctx.lineWidth = 1 / d;\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n const vx = crisp(cx, d);\n if (vx >= paneX && vx <= paneX + paneW) {\n ctx.moveTo(vx, 0);\n ctx.lineTo(vx, this.cssH - this.timeH);\n }\n let hy: number | undefined;\n const p = ch ? this.panes[ch.pane] : undefined;\n if (ch && p) {\n hy = p.top + this.crosshairY(p, ch.y, inData ? cIndex : undefined);\n const y = crisp(hy, d);\n ctx.moveTo(paneX, y);\n ctx.lineTo(paneX + paneW, y);\n }\n ctx.stroke();\n ctx.setLineDash([]);\n if (ch && p && hy !== undefined && this.opts.crosshair.priceLabel) {\n for (const sc of p.scales.values()) {\n if (!axisShown(sc)) continue;\n const price = sc.price(hy - p.top);\n const text = axisText(sc, this.formatterFor(p, sc.id), price);\n labels.push({ pane: p, sc, l: { price, text, background: th.labelBackground, color: th.labelText } });\n }\n }\n if (inData) {\n const ct = this.model.timeline.timeAt(cIndex);\n const text = timeText(this.opts.timeLabel, \"crosshair\", ct, () => this.fmt.crosshair(ct, this.timeVisible()));\n const w = this.measureText(text) + 16;\n const lx = Math.max(paneX, Math.min(paneX + paneW - w, cx - w / 2));\n ctx.fillStyle = th.labelBackground;\n ctx.fillRect(lx, this.cssH - this.timeH, w, this.timeH);\n ctx.fillStyle = th.labelText;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, lx + w / 2, this.cssH - this.timeH / 2);\n }\n }\n\n // Axis labels last, so they sit over the axis text.\n ctx.setTransform(d, 0, 0, d, ox, oy);\n const lh = Math.round(this.opts.theme.fontSize * 1.8);\n for (const { pane, sc, l } of labels) {\n const y = pane.top + sc.y(l.price);\n if (!(y >= pane.top && y <= pane.top + pane.height)) continue;\n const left = sc.options.position === \"left\";\n const ax = sc.axisX, aw = sc.axisW;\n const top = Math.max(pane.top, Math.min(pane.top + pane.height - lh, y - lh / 2));\n ctx.fillStyle = l.background;\n ctx.fillRect(ax, top, aw, lh);\n ctx.fillStyle = l.color;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = left ? \"right\" : \"left\";\n ctx.fillText(l.text, left ? ax + aw - AXIS_PAD : ax + AXIS_PAD, top + lh / 2);\n }\n // Countdown to the bar close, in a box under the main last-price label.\n const cd = countdownAt && this.opts.countdown ? this.countdownText() : null;\n if (countdownAt && cd) {\n const { pane, sc, l } = countdownAt;\n const y = pane.top + sc.y(l.price);\n const top = Math.max(pane.top, Math.min(pane.top + pane.height - lh, y - lh / 2)) + lh;\n if (top + lh <= pane.top + pane.height) {\n const left = sc.options.position === \"left\";\n ctx.fillStyle = l.background;\n ctx.fillRect(sc.axisX, top, sc.axisW, lh);\n ctx.fillStyle = l.color;\n ctx.textAlign = left ? \"right\" : \"left\";\n ctx.fillText(cd, left ? sc.axisX + sc.axisW - AXIS_PAD : sc.axisX + AXIS_PAD, top + lh / 2);\n }\n }\n ctx.restore();\n }\n\n /** The series title as a tag at the pane edge beside the axis, level with the last-value label. */\n private drawTitleTag(ctx: CanvasRenderingContext2D, title: string, sc: PriceScale, lv: { value: number; color: string }, paneH: number, paneW: number): void {\n const y = sc.y(lv.value);\n if (!(y >= 0 && y <= paneH)) return;\n const lh = Math.round(this.opts.theme.fontSize * 1.8);\n const w = Math.ceil(this.measureText(title)) + 10;\n const top = Math.max(0, Math.min(paneH - lh, y - lh / 2));\n const left = sc.options.position === \"left\";\n const x = left ? 0 : paneW - w;\n ctx.fillStyle = lv.color;\n ctx.fillRect(x, top, w, lh);\n ctx.fillStyle = contrastText(lv.color);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.fillText(title, x + 5, top + lh / 2);\n }\n\n /** Markers of a series placed in pane px: those on the visible bars (and one bar either side, for their width). */\n private markerLayout(p: Pane, s: Series<SeriesType>, sc: PriceScale): PlacedMarker[] {\n const ms = s.markers();\n const tl = this.model.timeline;\n if (ms.length === 0 || this.vis.hi < this.vis.lo || tl.length === 0) return [];\n const t = this.time, d = s.data, ohlc = d.shape === \"ohlc\";\n // vis is refreshed in layout(): after a setData it can lie outside the new timeline until the next frame.\n const a = Math.max(tl.first, this.vis.lo - 1), b = Math.min(tl.end - 1, this.vis.hi + 1);\n if (a > b) return [];\n const t0 = tl.timeAt(a), t1 = tl.timeAt(b);\n return placeMarkers({\n markers: ms,\n from: markerLowerBound(ms, t0),\n to: markerLowerBound(ms, t1 + 1),\n barSpacing: t.spacing,\n fontSize: this.opts.theme.fontSize,\n textWidth: (str) => this.measureText(str),\n bar: (m) => {\n const i = tl.indexOf(m.time);\n if (i === undefined || !d.has(i)) return undefined;\n const ya = sc.y(ohlc ? d.get(i, COL_H) : d.get(i, COL_V)), yb = sc.y(ohlc ? d.get(i, COL_L) : d.get(i, COL_V));\n if (!Number.isFinite(ya) || !Number.isFinite(yb)) return undefined;\n return { x: t.x(i), yHigh: Math.min(ya, yb), yLow: Math.max(ya, yb) };\n },\n });\n }\n\n /** The marker (with an id) or primitive item at pane point (x, y), and the cursor it asks for. */\n private hit(pane: number, x: number, y: number): { hovered?: HoveredObject; cursor: string | null } {\n const p = this.panes[pane];\n if (!p) return { cursor: null };\n for (let k = p.series.length - 1; k >= 0; k--) {\n const s = p.series[k]!;\n const sc = p.scales.get(s.options().priceScaleId);\n if (!sc || !s.options().visible || s.markers().length === 0) continue;\n const placed = this.markerLayout(p, s, sc);\n for (let j = placed.length - 1; j >= 0; j--) {\n const b = placed[j]!.box, id = placed[j]!.marker.id;\n if (id !== undefined && x >= b.x && x <= b.x + b.w && y >= b.y && y <= b.y + b.h) return { hovered: { kind: \"marker\", id }, cursor: \"pointer\" };\n }\n }\n for (const s of p.series) {\n const set = this.primitives.get(s);\n if (!set || !s.options().visible || !p.scales.has(s.options().priceScaleId)) continue;\n const view = this.paneView(p, s);\n for (const prim of set) {\n const r = prim.hitTest?.(x, y, view);\n if (!r) continue;\n if (typeof r === \"string\") return { cursor: r };\n if (typeof r.id !== \"string\" || r.id === \"\") throw new Error(\"alphacharts: a primitive's hitTest returned a hit without an id\");\n return { hovered: { kind: \"primitive\", id: r.id }, cursor: r.cursor ?? null };\n }\n }\n return { cursor: null };\n }\n\n /** Crosshair y in a pane: the pointer, or the main series' close in magnet mode. */\n private crosshairY(p: Pane, y: number, index: number | undefined): number {\n if (this.opts.crosshair.mode !== \"magnet\" || index === undefined || this.crosshairSource === \"sync\") return y;\n const s = p.series.find((x) => x.options().visible);\n if (!s) return y;\n const sc = p.scales.get(s.options().priceScaleId);\n const v = s.def.valueAt(s.data, s.options(), index);\n return sc && v ? sc.y(v.value) : y;\n }\n\n private crosshairEvent(source: CrosshairEvent[\"source\"]): CrosshairEvent {\n const ch = this.crosshair;\n if (!ch) return { source };\n const i = this.time.indexAt(ch.x - this.leftW);\n const ev: CrosshairEvent = { source, pane: ch.pane, point: { x: ch.x - this.leftW, y: ch.y } };\n if (source === \"pointer\" && !this.cursorOverride && !this.pluginClaims(ch.pane, ch.x - this.leftW, ch.y)) {\n const h = this.hit(ch.pane, ch.x - this.leftW, ch.y).hovered;\n if (h) ev.hovered = h;\n }\n if (i >= this.time.first && i <= this.time.last) {\n ev.index = i;\n ev.time = this.model.timeline.timeAt(i);\n }\n return ev;\n }\n\n /** Values under the crosshair for the screen-reader readout. */\n private announce(): void {\n const now = performance.now();\n if (now - this.lastAnnounce < 250) return;\n this.lastAnnounce = now;\n const i = this.crosshairIndex();\n if (i === undefined) return;\n const msg = this.opts.messages;\n const at = this.model.timeline.timeAt(i);\n const parts = [timeText(this.opts.timeLabel, \"crosshair\", at, () => this.fmt.crosshair(at, this.timeVisible()))];\n for (const p of this.panes) {\n for (const s of p.series) {\n const b = s.barAtIndex(i) as Record<string, number> | undefined;\n if (!b) continue;\n const name = s.options().title || s.type;\n parts.push(\n \"open\" in b\n ? msg(\"chart.readout.ohlc\", { name, open: s.formatPrice(b.open!), high: s.formatPrice(b.high!), low: s.formatPrice(b.low!), close: s.formatPrice(b.close!) })\n : msg(\"chart.readout.value\", { name, value: s.formatPrice(b.value!) }),\n );\n }\n }\n this.live.textContent = parts.join(\", \");\n }\n\n private paneView(p: Pane, s: Series<SeriesType>): PaneView {\n const sc = p.scales.get(s.options().priceScaleId)!;\n const t = this.time, tl = this.model.timeline;\n return {\n width: t.width,\n height: p.height,\n dpr: this.dpr,\n lo: this.vis.lo,\n hi: this.vis.hi,\n x: (i) => t.x(i),\n y: (v) => sc.y(v),\n index: (x) => t.indexAt(x),\n price: (y) => sc.price(y),\n timeToIndex: (time) => tl.indexOf(time),\n indexToTime: (i) => tl.timeAt(i),\n timeToX: (time) => t.x(this.timeToLogical(time)),\n barSpacing: t.spacing,\n formatPrice: (v) => s.formatPrice(v),\n };\n }\n\n private timeVisible(): boolean {\n const v = this.opts.timeVisible;\n if (v !== \"auto\") return v;\n const tl = this.model.timeline;\n if (tl.length < 2) return true;\n return tl.timeAt(tl.end - 1) - tl.timeAt(tl.end - 2) < 86_400_000;\n }\n\n private font(): string {\n return `${this.opts.theme.fontSize}px ${this.opts.theme.fontFamily}`;\n }\n\n /** CSS px width of `s` in the theme font. Cached: labels repeat every frame. */\n private measureText(s: string): number {\n const font = this.font();\n if (font !== this.widthFont) {\n this.widths.clear();\n this.widthFont = font;\n }\n let w = this.widths.get(s);\n if (w === undefined) {\n const ctx = this.layers.bg;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.font = font;\n w = ctx.measureText(s).width;\n ctx.restore();\n if (this.widths.size > 4096) this.widths.clear();\n this.widths.set(s, w);\n }\n return w;\n }\n\n // ---- system preferences, countdown, screen-reader table -----------------------\n\n /** Follow OS theme/contrast (theme \"auto\") and reduced-motion changes. */\n private watchSystem(): void {\n if (typeof matchMedia === \"undefined\") return;\n for (const q of [\"(prefers-color-scheme: light)\", \"(prefers-contrast: more)\"]) {\n const m = matchMedia(q);\n m.addEventListener(\"change\", this.onSystem);\n this.mediaQueries.push(m);\n }\n }\n\n private readonly onSystem = (): void => {\n if (!this.autoTheme) return;\n this.opts = { ...this.opts, theme: systemTheme() };\n for (const p of this.panes) for (const s of p.series) s.themeChanged(this.opts.theme);\n this.invalidate(LAYER_ALL);\n };\n\n /** @internal Kinetic scrolling is off when the user asks for reduced motion. */\n get reducedMotion(): boolean {\n return typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n }\n\n /** @internal The action bound to a key event, if any. */\n keyAction(e: KeyboardEvent): KeyAction | undefined {\n const parts: string[] = [];\n if (e.ctrlKey) parts.push(\"Ctrl\");\n if (e.altKey) parts.push(\"Alt\");\n if (e.shiftKey) parts.push(\"Shift\");\n if (e.metaKey) parts.push(\"Meta\");\n parts.push(e.key);\n const combo = parts.join(\"+\");\n for (const [action, keys] of Object.entries(this.opts.keymap) as [KeyAction, string[]][]) {\n if (keys.includes(combo) || (!e.ctrlKey && !e.altKey && !e.metaKey && keys.includes(e.key) && !combo.startsWith(\"Shift+Arrow\"))) return action;\n }\n return undefined;\n }\n\n /** Reset the view and every price scale to automatic. */\n resetChart(): void {\n for (const p of this.panes) for (const sc of p.scales.values()) sc.options = { ...sc.options, autoScale: true };\n this.viewChanged(() => this.time.reset());\n }\n\n private syncCountdown(): void {\n clearInterval(this.countdownTimer);\n this.countdownTimer = 0;\n if (this.opts.countdown && this.resampler) {\n this.countdownTimer = window.setInterval(() => this.invalidate(LAYER_OVERLAY), 1000);\n }\n }\n\n /** \"mm:ss\" (or \"h:mm:ss\", \"Nd\") to the close of the bar holding the last time; null when unknown. */\n private countdownText(): string | null {\n const r = this.resampler;\n const tl = this.model.timeline;\n if (!r || tl.length === 0) return null;\n const last = tl.timeAt(tl.end - 1);\n const start = r.bucketStart(last);\n // The next bucket starts at the first time past this one that maps elsewhere.\n let probe = start + 1000;\n const step = r.res.unit === \"s\" ? 1000 : r.res.unit === \"m\" ? 60_000 : r.res.unit === \"h\" ? 3_600_000 : 86_400_000;\n for (let i = 0; i < 400 && r.bucketStart(probe) === start; i++) probe += step * Math.max(1, Math.floor(r.res.n / 2));\n const next = r.bucketStart(probe);\n const left = Math.max(0, next - Date.now());\n if (!(next > start)) return null;\n const sec = Math.floor(left / 1000);\n if (sec >= 86_400) return this.opts.messages(\"chart.countdown.days\", { n: Math.floor(sec / 86_400) });\n const hh = Math.floor(sec / 3600), mm = Math.floor((sec % 3600) / 60), ss = sec % 60;\n const two = (n: number) => String(n).padStart(2, \"0\");\n return hh > 0 ? `${hh}:${two(mm)}:${two(ss)}` : `${two(mm)}:${two(ss)}`;\n }\n\n /** Rebuild the screen-reader table shortly after the view or data settles. */\n private scheduleTable(): void {\n if (!this.opts.a11yTable || this.tableTimer) return;\n this.tableTimer = window.setTimeout(() => {\n this.tableTimer = 0;\n this.buildTable();\n }, 400);\n }\n\n private buildTable(): void {\n const s = this.panes[0]?.series.find((x) => x.options().visible);\n if (!s) return;\n if (!this.table) {\n // A table sizes to its content and ignores overflow, so the visually\n // hidden box is a wrapper div: a bare 1,900 px table made the chart root\n // scrollable, and scroll-into-view then moved content under the pointer.\n const wrap = document.createElement(\"div\");\n wrap.style.cssText = \"position:absolute;left:0;top:0;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap\";\n this.table = document.createElement(\"table\");\n wrap.appendChild(this.table);\n this.element.appendChild(wrap);\n }\n const t = this.table;\n const ohlc = s.data.shape === \"ohlc\";\n const msg = this.opts.messages;\n const head = (ohlc ? [\"time\", \"open\", \"high\", \"low\", \"close\"] as const : [\"time\", \"value\"] as const).map((k) => msg(`chart.table.${k}`));\n const rows: string[] = [];\n // The newest 200 visible bars: enough to read around, bounded DOM.\n for (let i = this.vis.hi; i >= this.vis.lo && rows.length < 200; i--) {\n const b = s.barAtIndex(i) as Record<string, number> | undefined;\n if (!b) continue;\n const cells = ohlc ? [b.open!, b.high!, b.low!, b.close!].map((v) => s.formatPrice(v)) : [s.formatPrice(b.value!)];\n rows.push(`<tr><th scope=\"row\">${esc(this.fmt.crosshair(b.time!, this.timeVisible()))}</th>${cells.map((c) => `<td>${esc(c)}</td>`).join(\"\")}</tr>`);\n }\n t.innerHTML = `<caption>${esc(msg(\"chart.table.caption\", { label: this.opts.ariaLabel, name: s.options().title || s.type }))}</caption><thead><tr>${head.map((h) => `<th scope=\"col\">${esc(h)}</th>`).join(\"\")}</tr></thead><tbody>${rows.join(\"\")}</tbody>`;\n }\n\n // ---- size, DPR, context -------------------------------------------------------------\n\n private measure(): void {\n const r = this.element.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n if (r.width === this.cssW && r.height === this.cssH && dpr === this.dpr) return;\n this.cssW = r.width;\n this.cssH = r.height;\n this.dpr = dpr;\n this.devW = Math.max(1, Math.round(r.width * dpr));\n this.devH = Math.max(1, Math.round(r.height * dpr));\n this.layers.fit(r.width, r.height, dpr);\n this.tticksKey = \"\";\n // Render synchronously so a resize never shows a stretched frame.\n this.render(LAYER_ALL);\n }\n\n private watchDpr(): void {\n this.dprQuery?.removeEventListener(\"change\", this.onDpr);\n this.dprQuery = window.matchMedia(`(resolution: ${window.devicePixelRatio || 1}dppx)`);\n this.dprQuery.addEventListener(\"change\", this.onDpr);\n }\n\n private readonly onDpr = (): void => {\n this.watchDpr();\n this.measure();\n };\n\n}\n\nfunction esc(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ({ \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\" })[c]!);\n}\n\n/** Apply a series' `autoscale` override to its built-in [low, high] (NaN when empty); NaN, NaN when it contributes nothing. */\nfunction overrideRange(id: string, fn: NonNullable<SeriesOptions<SeriesType>[\"autoscale\"]>, low: number, high: number): [number, number] {\n const r = fn(low === low && high === high ? { low, high } : null);\n if (r === null) return [Number.NaN, Number.NaN];\n if (typeof r !== \"object\" || !Number.isFinite(r.low) || !Number.isFinite(r.high) || r.low > r.high) {\n throw new RangeError(`alphacharts: series \"${id}\" autoscale must return null or { low, high } with finite low <= high, got ${JSON.stringify(r)}`);\n }\n return [r.low, r.high];\n}\n\n/** True when a scale draws an axis. */\nfunction axisShown(sc: PriceScale): boolean {\n return sc.options.position !== \"none\" && sc.options.visible;\n}\n\n/** A pane's shown scales on one side, in creation order (column order). */\nfunction sideScales(p: Pane, side: \"left\" | \"right\"): PriceScale[] {\n const out: PriceScale[] = [];\n for (const sc of p.scales.values()) if (sc.options.position === side && sc.options.visible) out.push(sc);\n return out;\n}\n\n/** Black or white, whichever reads better on `bg`. */\nfunction contrastText(bg: string): string {\n const c = parseColor(bg);\n const r = (c >>> 24) & 255, g = (c >>> 16) & 255, b = (c >>> 8) & 255;\n return 0.299 * r + 0.587 * g + 0.114 * b > 150 ? \"#000000\" : \"#ffffff\";\n}\n\n","// Many charts, one set of canvases.\n//\n// const dash = new Dashboard(gridElement);\n// const a = dash.addChart(cellA, { theme: \"dark\" });\n//\n// Cells are any elements inside the container (CSS grid, flex, absolute).\n// The dashboard's three canvases cover the container; each chart draws into\n// its cell's rectangle and takes pointer input on its own root, so charts\n// behave exactly like standalone ones. One WebGL context serves them all.\n\nimport type { SurfaceChoice } from \"../render/surface.js\";\nimport { Chart, type ChartOptionsInput } from \"./chart.js\";\nimport { CellLayers, DashboardCanvases } from \"./layers.js\";\nimport { LAYER_ALL } from \"./scheduler.js\";\n\nexport interface DashboardOptions {\n renderer: SurfaceChoice;\n}\n\nexport class Dashboard {\n private readonly canvases: DashboardCanvases;\n private readonly charts = new Set<Chart>();\n private readonly resizeObs: ResizeObserver;\n private removed = false;\n\n constructor(readonly container: HTMLElement, options: Partial<DashboardOptions> = {}) {\n if (getComputedStyle(container).position === \"static\") container.style.position = \"relative\";\n this.canvases = new DashboardCanvases(\n container,\n options.renderer ?? \"auto\",\n {\n lost: () => {\n for (const c of this.charts) c.surfaceLost();\n },\n restored: () => this.redrawAll(),\n },\n () => this.relayout(),\n () => this.charts,\n );\n this.resizeObs = new ResizeObserver(() => this.relayout());\n this.resizeObs.observe(container);\n this.canvases.resize(window.devicePixelRatio || 1);\n }\n\n /** A chart drawn into `cell`, which must be inside the container. */\n addChart(cell: HTMLElement, options: ChartOptionsInput = {}): Chart {\n if (this.removed) throw new Error(\"alphacharts: this dashboard was removed\");\n if (!this.container.contains(cell)) throw new Error(\"alphacharts: a dashboard cell must be inside the dashboard container\");\n const chart = new Chart(cell, options, () => new CellLayers(this.canvases, cell));\n this.charts.add(chart);\n chart.onRemove(() => {\n this.charts.delete(chart);\n this.relayout();\n });\n return chart;\n }\n\n get size(): number {\n return this.charts.size;\n }\n\n remove(): void {\n if (this.removed) return;\n this.removed = true;\n for (const c of [...this.charts]) c.remove();\n this.resizeObs.disconnect();\n this.canvases.dispose();\n }\n\n private relayout(): void {\n if (this.removed) return;\n this.canvases.resize(window.devicePixelRatio || 1);\n this.redrawAll();\n }\n\n private redrawAll(): void {\n // Cleared canvases or moved cells: every chart repaints its cell.\n this.canvases.clear();\n for (const c of this.charts) {\n c.remeasure();\n c.invalidate(LAYER_ALL);\n }\n }\n}\n","// Keeps a set of charts on the same time window and crosshair.\n//\n// Charts may show different instruments with different bar times, so the\n// window is matched by time, not index: the bar at the leader's right edge is\n// found in each follower's timeline by binary search, and bar spacing is\n// copied. Only views moved by the user propagate (\"sync\" and \"data\" moves do\n// not), so followers never echo back to the leader.\n\nimport type { Chart } from \"../chart/chart.js\";\n\nexport interface SyncOptions {\n time: boolean;\n crosshair: boolean;\n}\n\nexport class SyncGroup {\n private readonly members = new Map<Chart, (() => void)[]>();\n private readonly opts: SyncOptions;\n\n constructor(options: Partial<SyncOptions> = {}) {\n this.opts = { time: true, crosshair: true, ...options };\n }\n\n add(chart: Chart): void {\n if (this.members.has(chart)) return;\n const offs: (() => void)[] = [];\n if (this.opts.time) {\n offs.push(\n chart.on(\"visibleRangeChange\", (e) => {\n if (e.source === \"user\") this.followTime(chart, e.to);\n }),\n );\n }\n if (this.opts.crosshair) {\n offs.push(\n chart.on(\"crosshairMove\", (e) => {\n if (e.source === \"sync\") return;\n for (const other of this.members.keys()) {\n if (other.isRemoved) {\n this.remove(other);\n continue;\n }\n if (other === chart) continue;\n if (e.time === undefined) {\n other.setSyncedCrosshair(null);\n continue;\n }\n other.setSyncedCrosshair(other.timeline.indexAtOrBefore(e.time) ?? null);\n }\n }),\n );\n }\n this.members.set(chart, offs);\n }\n\n remove(chart: Chart): void {\n for (const off of this.members.get(chart) ?? []) off();\n this.members.delete(chart);\n }\n\n private followTime(leader: Chart, right: number): void {\n const ltl = leader.timeline;\n if (ltl.length === 0) return;\n const i = Math.max(ltl.first, Math.min(ltl.end - 1, Math.floor(right)));\n const t = ltl.timeAt(i);\n const frac = right - i;\n const spacing = leader.time.spacing;\n for (const other of this.members.keys()) {\n if (other.isRemoved) {\n this.remove(other);\n continue;\n }\n if (other === leader) continue;\n // The follower's bar containing t; before its first bar, its first bar.\n const tl = other.timeline;\n if (tl.length === 0) continue;\n const j = tl.indexAtOrBefore(t) ?? tl.first;\n other.viewChanged(() => {\n other.time.spacing = spacing;\n other.time.setRight(j + frac);\n }, \"sync\");\n }\n }\n}\n","// Datafeed contract and a loader that drives one series from it: initial\n// history, older pages as the user scrolls left, and live bars.\n//\n// The library ships no data; the consumer implements Datafeed over its own\n// backend. Every failure goes to `onError`: nothing is retried or dropped\n// silently, except live bars that arrived before the first history page and\n// are older than its last bar (the history already covers them). A failed\n// first page leaves the feed `failed` until the caller asks to retry().\n\nimport type { Chart } from \"../chart/chart.js\";\nimport type { Series } from \"../chart/series.js\";\nimport type { SeriesType } from \"../chart/series-types.js\";\nimport type { ColumnarOhlc, ColumnarValue, OhlcBar, ValuePoint } from \"../data/model.js\";\n\nexport interface BarsRequest {\n symbol: string;\n resolution: string;\n /** Return bars with time <= to (UTC ms), newest last. */\n to: number;\n /** How many bars, at most, ending at `to`. */\n countBack: number;\n}\n\nexport interface BarsResponse {\n bars: readonly OhlcBar[] | readonly ValuePoint[] | ColumnarOhlc | ColumnarValue;\n /** No bars exist before the ones returned. */\n noMoreData: boolean;\n}\n\n/** One trade (time and sales). Order-flow charts and trade-built bars use it. */\nexport interface Trade {\n /** UTC ms; equal times are allowed, order is arrival order. */\n time: number;\n price: number;\n size: number;\n /** Aggressor side when the venue reports it; \"unknown\" is never guessed. */\n side: \"buy\" | \"sell\" | \"unknown\";\n}\n\nexport interface TradesRequest {\n symbol: string;\n /** Trades with from <= time < to (UTC ms). */\n from: number;\n to: number;\n}\n\nexport interface Datafeed {\n getBars(request: BarsRequest, signal: AbortSignal): Promise<BarsResponse>;\n /** Live bars: the current bar repeatedly, then the next one. Returns an unsubscribe. */\n subscribeBars?(symbol: string, resolution: string, onBar: (bar: OhlcBar | ValuePoint) => void): () => void;\n /** Historical trades, for footprint, profiles and tick/volume bars. */\n getTrades?(request: TradesRequest, signal: AbortSignal): Promise<Trade[]>;\n /** Live trades. Returns an unsubscribe. */\n subscribeTrades?(symbol: string, onTrade: (trade: Trade) => void): () => void;\n}\n\nexport interface FeedOptions {\n symbol: string;\n resolution: string;\n /** Bars per request. */\n pageSize?: number;\n /** Load older history when the left edge is within this many bars of the first one. */\n prefetchBars?: number;\n /** Where the newest history ends; default now. */\n to?: number;\n onError: (error: unknown) => void;\n /** Live bars held while the first page loads; more is reported as an error and dropped. */\n maxEarlyBars?: number;\n}\n\nexport interface FeedController {\n readonly loading: boolean;\n readonly noMoreData: boolean;\n /** The first page failed and nothing is loaded; retry() asks again. */\n readonly failed: boolean;\n /** Request the first page again after a failure (no-op otherwise). */\n retry(): void;\n /** Stop requests and the live subscription. */\n dispose(): void;\n}\n\nconst barTime = (b: BarsResponse[\"bars\"]): { first: number; last: number } | undefined => {\n if (Array.isArray(b)) {\n const a = b as readonly { time: number }[];\n return a.length ? { first: a[0]!.time, last: a[a.length - 1]!.time } : undefined;\n }\n const t = (b as ColumnarOhlc | ColumnarValue).time;\n return t.length ? { first: t[0]!, last: t[t.length - 1]! } : undefined;\n};\n\nexport function connectDatafeed<T extends SeriesType>(chart: Chart, series: Series<T>, feed: Datafeed, options: FeedOptions): FeedController {\n const pageSize = options.pageSize ?? 2000;\n const prefetch = options.prefetchBars ?? 300;\n const ac = new AbortController();\n let loading = true;\n let noMoreData = false;\n let ready = false;\n let firstTime = Number.NaN;\n let lastTime = Number.NaN;\n const early: (OhlcBar | ValuePoint)[] = [];\n let unsubscribe: (() => void) | undefined;\n let offRange: (() => void) | undefined;\n\n const fail = (e: unknown) => {\n if (ac.signal.aborted) return;\n options.onError(e);\n };\n\n const maxEarly = options.maxEarlyBars ?? 10_000;\n let overflowReported = false;\n let failed = false;\n\n const live = (bar: OhlcBar | ValuePoint) => {\n if (ac.signal.aborted) return;\n if (!ready) {\n if (early.length < maxEarly) early.push(bar);\n else if (!overflowReported) {\n overflowReported = true;\n fail(new Error(`datafeed: more than ${maxEarly} live bars arrived before the first history page; later ones were dropped`));\n }\n return;\n }\n try {\n series.update(bar as never);\n lastTime = Math.max(lastTime, bar.time);\n } catch (e) {\n fail(e);\n }\n };\n\n const loadOlder = () => {\n if (loading || noMoreData || !ready || Number.isNaN(firstTime)) return;\n loading = true;\n feed\n .getBars({ symbol: options.symbol, resolution: options.resolution, to: firstTime - 1, countBack: pageSize }, ac.signal)\n .then((r) => {\n if (ac.signal.aborted) return;\n const span = barTime(r.bars);\n if (span) {\n series.prepend(r.bars as never);\n firstTime = span.first;\n }\n noMoreData = r.noMoreData || !span;\n })\n .catch(fail)\n .finally(() => {\n loading = false;\n });\n };\n\n if (feed.subscribeBars) unsubscribe = feed.subscribeBars(options.symbol, options.resolution, live);\n\n const loadFirst = () => {\n loading = true;\n failed = false;\n feed\n .getBars({ symbol: options.symbol, resolution: options.resolution, to: options.to ?? Date.now(), countBack: pageSize }, ac.signal)\n .then((r) => {\n if (ac.signal.aborted) return;\n series.setData(r.bars as never);\n const span = barTime(r.bars);\n firstTime = span?.first ?? Number.NaN;\n lastTime = span?.last ?? Number.NaN;\n noMoreData = r.noMoreData || !span;\n ready = true;\n for (const b of early) if (Number.isNaN(lastTime) || b.time >= lastTime) live(b);\n early.length = 0;\n offRange = chart.on(\"visibleRangeChange\", (e) => {\n const first = series.range()?.first;\n if (first !== undefined && e.from < first + prefetch) loadOlder();\n });\n })\n .catch((e) => {\n failed = !ready;\n fail(e);\n })\n .finally(() => {\n loading = false;\n });\n };\n loadFirst();\n\n return {\n get loading() {\n return loading;\n },\n get noMoreData() {\n return noMoreData;\n },\n get failed() {\n return failed;\n },\n retry() {\n if (failed && !loading && !ac.signal.aborted) loadFirst();\n },\n dispose() {\n ac.abort();\n unsubscribe?.();\n offRange?.();\n },\n };\n}\n","// @alphacharts/core public API.\n\nimport { Chart, type ChartOptionsInput } from \"./chart/chart.js\";\n\nexport { Chart } from \"./chart/chart.js\";\nexport { Dashboard } from \"./chart/dashboard.js\";\nexport { LAYOUT_VERSION, LocalStorageStore, MemoryStore, migrate } from \"./chart/layout.js\";\nexport type { ChartState, CustomOption, LayoutStore, PaneState, ScaleState, SeriesState } from \"./chart/layout.js\";\nexport type { DashboardOptions } from \"./chart/dashboard.js\";\nexport type { ChartEvents, ChartOptions, Region, ChartOptionsInput, CrosshairEvent, CrosshairOptions, GridOptions, HoveredObject, InteractionOptions, VisibleRangeEvent } from \"./chart/chart.js\";\nexport { Series } from \"./chart/series.js\";\nexport type { ChartPlugin, PluginApi, PluginPaneView, PluginPointer } from \"./chart/plugin.js\";\nexport type { SeriesBar, SeriesInput } from \"./chart/series.js\";\nexport { registerSeriesType } from \"./chart/series-types.js\";\nexport type { CommonSeriesOptions, LastValue, SeriesOptions, SeriesOptionsMap, SeriesType, SeriesTypeDef } from \"./chart/series-types.js\";\nexport { BarShading, PriceLine, crisp, dashPattern } from \"./chart/primitives.js\";\nexport type { SeriesMarker, MarkerPosition, MarkerShape } from \"./chart/markers.js\";\nexport type { AxisLabel, LineDash, PanePrimitive, PaneView, PriceLineOptions, PrimitiveHit, PrimitiveHost, RenderLayer } from \"./chart/primitives.js\";\nexport { DARK, HIGH_CONTRAST, LIGHT, systemTheme } from \"./chart/theme.js\";\nexport { CHART_MESSAGES, defaultMessages } from \"./chart/messages.js\";\nexport type { ChartMessageKey, ChartMessages, ChartMessageValues } from \"./chart/messages.js\";\nexport { DEFAULT_KEYMAP } from \"./chart/chart.js\";\nexport { checkWatermarkOptions, DEFAULT_WATERMARK, drawWatermark } from \"./chart/watermark.js\";\nexport type { WatermarkOptions } from \"./chart/watermark.js\";\nexport type { KeyAction } from \"./chart/chart.js\";\nexport { ALWAYS_OPEN, NSE, Sessions, US_EQUITY, weekdays } from \"./data/session.js\";\nexport type { SessionSpec, SessionState, Window } from \"./data/session.js\";\nexport { parseResolution, Resampler } from \"./data/resample.js\";\nexport type { Resolution, ResolutionUnit, ResampledBar } from \"./data/resample.js\";\nexport type { Theme } from \"./chart/theme.js\";\nexport { SyncGroup } from \"./interaction/sync.js\";\nexport type { SyncOptions } from \"./interaction/sync.js\";\nexport { connectDatafeed } from \"./feed/datafeed.js\";\nexport type { BarsRequest, BarsResponse, Datafeed, FeedController, FeedOptions, Trade, TradesRequest } from \"./feed/datafeed.js\";\nexport type { ColumnarColors, ColumnarOhlc, ColumnarValue, OhlcBar, ValuePoint } from \"./data/model.js\";\nexport type { PriceScaleOptions } from \"./scale/price-scale.js\";\nexport type { TimeScaleOptions } from \"./scale/time-scale.js\";\nexport type { TimeLabel } from \"./scale/ticks.js\";\nexport type { DataChange, SeriesData, SeriesShape } from \"./data/model.js\";\nexport { COL_BAR_COLOR, COL_C, COL_COLOR, COL_H, COL_L, COL_O, COL_V } from \"./data/model.js\";\nexport { LOD_BASE, LOD_C, LOD_COLOR, LOD_H, LOD_L, LOD_O } from \"./data/lod.js\";\nexport { parseColor, rgba, cssColor } from \"./render/color.js\";\nexport { barWidths } from \"./render/renderers.js\";\nexport type { CandleStyle, BarStyle, LineStyle, AreaStyle, HistogramStyle } from \"./render/renderers.js\";\nexport type { DrawView2D, SeriesRenderer2D } from \"./render/canvas2d.js\";\nexport type { SeriesShapes } from \"./chart/series-types.js\";\nexport type { PriceFormat, Formatter } from \"./scale/format.js\";\n// Scale utilities the plot package (and hosts) build on: nice ticks, number formats, calendar time zones.\nexport { niceStep, niceTicks, PriceFormatter } from \"./scale/ticks.js\";\nexport { createFormatter, decimalsOf, isIndianLocale } from \"./scale/format.js\";\nexport { civilFromLocal, DAY_MS, localFromCivil, TimeZone } from \"./data/tz.js\";\nexport type { CivilTime } from \"./data/tz.js\";\nexport type { PriceScaleMode } from \"./scale/price-scale.js\";\nexport type { DrawView, SeriesRenderer } from \"./render/renderers.js\";\n\n/** One-liner: `const chart = createChart(el, { theme: \"light\" })`. */\nexport function createChart(container: HTMLElement, options?: ChartOptionsInput): Chart {\n return new Chart(container, options);\n}\n"],"mappings":"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"}
|